# Run a single natlab smoke test on every PR. The full natlab suite # is opt-in and lives in .github/workflows/natlab-test.yml. # See https://github.com/tailscale/tailscale/issues/13038 name: "natlab-basic" concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true on: push: branches: - "main" - "release-branch/*" pull_request: # all PRs on all branches merge_group: branches: - "main" jobs: EasyEasy: runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # Go caches, keyed the same as natlab-test.yml's. Only that workflow's # prepare job writes the build cache. A miss here just means a cold build. - name: Cache tsgo toolchain uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # zizmor: ignore[cache-poisoning] v5.0.4 with: path: ~/.cache/tsgo key: natlab-tsgo-${{ runner.os }}-${{ hashFiles('go.toolchain.rev') }} - name: Cache Go modules uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # zizmor: ignore[cache-poisoning] v5.0.4 with: path: ~/go/pkg/mod key: natlab-gomod-${{ runner.os }}-${{ hashFiles('go.mod', 'go.sum') }} - name: Restore Go build cache uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: ~/.cache/go-build key: natlab-gobuild-${{ runner.os }}-${{ hashFiles('go.sum') }}-${{ github.run_id }} restore-keys: | natlab-gobuild-${{ runner.os }}-${{ hashFiles('go.sum') }}- natlab-gobuild-${{ runner.os }}- - name: Enable KVM run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm - name: Install qemu run: | sudo rm -f /var/lib/man-db/auto-update sudo apt-get -y update sudo apt-get -y remove man-db sudo apt-get install -y qemu-system-x86 qemu-utils - name: Build VM image # The test always rebuilds this image itself (so the baked-in # binaries match the source under test), but we build it here # first so that rebuild is a build cache hit instead of a cold # build that eats the go test -timeout budget, and so a broken # image build fails earlier with a clearer error. The Makefile # uses ./tool/go, the same toolchain the test's rebuild uses; # a build with a different toolchain here would warm nothing. run: | make -C gokrazy natlab - name: Run natlab integration tests # With a warm build cache the test takes well under a minute. # The timeout matches natlab-test.yml and exceeds vmtest's own # 10 minute test context, so that a hung node fails through the # test's bounded waits, which dump the node's logs, rather than # through go test's timeout panic, which dumps nothing useful. run: | ./tool/go test -v -run=^TestEasyEasy$ -timeout=15m -count=1 ./tstest/natlab/vmtest --run-vm-tests