cli-tests #6611
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: cli-tests | |
# Runs the Devbox CLI tests | |
concurrency: | |
group: ${{ github.ref }} | |
cancel-in-progress: true | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
merge_group: | |
branches: | |
- main | |
workflow_call: | |
inputs: | |
run-mac-tests: | |
type: boolean | |
workflow_dispatch: | |
inputs: | |
run-mac-tests: | |
type: boolean | |
description: Run tests on macOS | |
example-debug: | |
type: boolean | |
description: Run example tests with DEVBOX_DEBUG=1 to increase verbosity | |
schedule: | |
- cron: '30 8 * * *' # Run nightly at 8:30 UTC | |
permissions: | |
contents: read | |
pull-requests: read | |
defaults: | |
run: | |
# Explicitly setting the shell to bash runs commands with | |
# `bash --noprofile --norc -eo pipefail` instead of `bash -e`. | |
shell: bash | |
env: | |
HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
DEVBOX_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
HOMEBREW_NO_ANALYTICS: 1 | |
HOMEBREW_NO_AUTO_UPDATE: 1 | |
HOMEBREW_NO_EMOJI: 1 | |
HOMEBREW_NO_ENV_HINTS: 1 | |
HOMEBREW_NO_INSTALL_CLEANUP: 1 | |
DEVBOX_DEBUG: 1 | |
jobs: | |
build-devbox: | |
strategy: | |
matrix: | |
os: [ubuntu-latest, macos-13] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-go@v5 | |
with: | |
go-version-file: ./go.mod | |
- name: Build devbox | |
run: go build -o dist/devbox ./cmd/devbox | |
- name: Upload devbox artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: devbox-${{ runner.os }}-${{ runner.arch }} | |
path: ./dist/devbox | |
retention-days: 7 | |
typos: | |
name: Spell Check with Typos | |
if: github.ref != 'refs/heads/main' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: crate-ci/[email protected] | |
flake-test: | |
name: Test Flake Build | |
if: github.ref != 'refs/heads/main' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: DeterminateSystems/nix-installer-action@main | |
- run: nix build . | |
- run: ./result/bin/devbox version | |
golangci-lint: | |
strategy: | |
matrix: | |
os: [ubuntu-latest, macos-13] | |
runs-on: ${{ matrix.os }} | |
timeout-minutes: 10 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install devbox | |
uses: jetify-com/[email protected] | |
with: | |
enable-cache: true | |
- name: Mount golang cache | |
uses: actions/cache@v4 | |
with: | |
path: | | |
~/.cache/golangci-lint | |
~/.cache/go-build | |
~/go/pkg | |
key: go-${{ runner.os }}-${{ hashFiles('go.sum') }} | |
- run: devbox run lint | |
test: | |
needs: build-devbox | |
strategy: | |
matrix: | |
is-main: | |
- ${{ github.ref == 'refs/heads/main' && 'is-main' || 'not-main' }} | |
os: [ubuntu-latest, macos-13] | |
# This is an optimization that runs tests twice, with and without | |
# the devbox.json tests. We can require the other tests to complete before | |
# merging, while keeping the others as an additional non-required signal | |
run-project-tests: ["project-tests-only", "project-tests-off"] | |
# Run tests on: | |
# 1. the oldest supported nix version (which is 2.9.0? But determinate-systems installer has 2.12.0) | |
# 2. nix 2.19.2: version before nix profile changes | |
# 2. latest nix version (note, 2.20.1 introduced a new profile change) | |
nix-version: ["2.12.0", "2.19.2", "2.20.1"] | |
exclude: | |
# Only runs tests on macos if explicitly requested, or on a schedule | |
- os: "${{ (inputs.run-mac-tests || github.event.schedule != '') && 'dummy' || 'macos-13' }}" | |
runs-on: ${{ matrix.os }} | |
timeout-minutes: 60 | |
env: | |
# For devbox.json tests, we default to non-debug mode since the debug output is less useful than for unit testscripts. | |
# But we allow overriding via inputs.example-debug | |
DEVBOX_DEBUG: ${{ (matrix.run-project-tests == 'project-tests-off' || inputs.example-debug) && '1' || '0' }} | |
DEVBOX_GOLANG_TEST_TIMEOUT: "${{ (github.ref == 'refs/heads/main' || inputs.run-mac-tests) && '1h' || '30m' }}" | |
steps: | |
- name: Maximize build disk space | |
uses: easimon/maximize-build-space@v10 | |
if: matrix.os == 'ubuntu-latest' | |
with: | |
root-reserve-mb: 32768 | |
temp-reserve-mb: 10000 | |
remove-dotnet: true | |
remove-android: true | |
remove-haskell: true | |
remove-codeql: true | |
- uses: actions/checkout@v4 | |
- name: Mount golang cache | |
uses: actions/cache@v4 | |
with: | |
path: | | |
~/.cache/go-build | |
~/go/pkg | |
key: go-devbox-tests-${{ runner.os }}-${{ hashFiles('go.sum') }} | |
- name: Install additional shells (dash, zsh) | |
run: | | |
if [ "$RUNNER_OS" == "Linux" ]; then | |
sudo apt-get update | |
sudo apt-get install dash zsh | |
elif [ "$RUNNER_OS" == "macOS" ]; then | |
brew update | |
brew install dash zsh | |
fi | |
- name: Install devbox | |
uses: jetify-com/[email protected] | |
with: | |
enable-cache: true | |
- name: Run fast tests | |
if: matrix.run-project-tests == 'project-tests-off' | |
run: | | |
echo "::group::Nix version" | |
nix --version | |
echo "::endgroup::" | |
echo "::group::Contents of /etc/nix/nix.conf" | |
cat /etc/nix/nix.conf || true | |
echo "::endgroup::" | |
echo "::group::Resolved Nix config" | |
nix show-config --extra-experimental-features nix-command | |
echo "::endgroup::" | |
devbox run go test -v -timeout $DEVBOX_GOLANG_TEST_TIMEOUT ./... | |
- name: Run project (slow) tests | |
if: matrix.run-project-tests == 'project-tests-only' | |
run: devbox run test-projects-only | |
auto-nix-install: # ensure Devbox installs nix and works properly after installation. | |
needs: build-devbox | |
strategy: | |
matrix: | |
os: [ubuntu-latest, macos-13] | |
use-detsys: [true, false] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download devbox | |
uses: actions/download-artifact@v4 | |
with: | |
name: devbox-${{ runner.os }}-${{ runner.arch }} | |
- name: Add devbox to path | |
run: | | |
chmod +x ./devbox | |
sudo mv ./devbox /usr/local/bin/ | |
- name: Install nix and devbox packages | |
run: | | |
export NIX_INSTALLER_NO_CHANNEL_ADD=1 | |
export DEVBOX_FEATURE_DETSYS_INSTALLER=${{ matrix.use-detsys }} | |
# Setup github authentication to ensure Github's rate limits are not hit. | |
# If this works, we can consider refactoring this into a reusable github action helper. | |
mkdir -p ~/.config/nix | |
echo "access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}" > ~/.config/nix/nix.conf | |
devbox run echo "Installing packages..." | |
- name: Test removing package | |
run: devbox rm go | |
# Run a sanity test to make sure Devbox can install and remove packages with | |
# the last few Nix releases. | |
test-nix-versions: | |
needs: build-devbox | |
strategy: | |
matrix: | |
os: [ubuntu-latest, macos-13] | |
nix-version: [2.15.1, 2.16.1, 2.17.0, 2.18.0, 2.19.2, 2.24.7] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download devbox | |
uses: actions/download-artifact@v4 | |
with: | |
name: devbox-${{ runner.os }}-${{ runner.arch }} | |
- name: Add devbox to path | |
run: | | |
chmod +x ./devbox | |
sudo mv ./devbox /usr/local/bin/ | |
- name: Install Nix | |
uses: DeterminateSystems/nix-installer-action@v4 | |
with: | |
logger: pretty | |
extra-conf: experimental-features = ca-derivations fetch-closure | |
nix-package-url: https://releases.nixos.org/nix/nix-${{ matrix.nix-version }}/nix-${{ matrix.nix-version }}-${{ runner.arch == 'X64' && 'x86_64' || 'aarch64' }}-${{ runner.os == 'macOS' && 'darwin' || 'linux' }}.tar.xz | |
- name: Run devbox install, devbox run, devbox rm | |
run: | | |
echo "::group::Nix version" | |
nix --version | |
echo "::endgroup::" | |
echo "::group::Contents of /etc/nix/nix.conf" | |
cat /etc/nix/nix.conf || true | |
echo "::endgroup::" | |
echo "::group::Resolved Nix config" | |
nix show-config --extra-experimental-features nix-command | |
echo "::endgroup::" | |
devbox install | |
devbox run -- echo "Hello from devbox!" | |
devbox rm go |