From 2d9cdd2eb8709a38c623b19eff99f901ae7dde1a Mon Sep 17 00:00:00 2001 From: 3405691582 Date: Fri, 14 Nov 2025 17:54:19 +0000 Subject: [PATCH] Execute build and e2e tests on push, not pr. As configured, the same set of tests runs on pull request and on the merge queue. This is redundant, and flakes can cause large delays. Ideally, we should reduce the redundancy, either by pushing tests from pull request to merge, or vice versa. The consensus is on the former, to ensure that the code at HEAD is most likely to be passing tests. As I understand it, the `push` GitHub workflow event triggers on the merge queue, so the new pull request workflow triggers on the `pull_request` event. This workflow does not run any of the build or end-to-end checks, which can take a long time, only the static and unit checks. --- .github/workflows/pr.yaml | 177 +++++++++++++++++++++++++++++++ .github/workflows/presubmit.yaml | 2 +- 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/pr.yaml diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 00000000000..6ddc5abe124 --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,177 @@ +name: Pull request + +on: + pull_request: + +concurrency: + # limits the workflow to a single run per branch/PR + group: ${{ github.workflow }}-${{ github.ref }} + # previous runs are cancelled when a new run is started + cancel-in-progress: true + +jobs: + buildozer: + runs-on: ubuntu-22.04 + steps: + - name: Checkout repository + uses: actions/checkout@a81bbbf8298c0fa03ea29cdc473d45769f953675 # aka v2 + - name: Install go + uses: actions/setup-go@v3 + with: + go-version: '1.23.1' + - name: Install buildozer + run: go install github.com/bazelbuild/buildtools/buildozer@latest + - name: Validate formatting + working-directory: base/cvd + if: '!cancelled()' + run: | + if [[ $(buildozer '//...:__pkg__' format 2>&1) ]]; then + echo "Please format BUILD.bazel files with \"buildozer '//...:__pkg__' format\""; + exit 1; + fi + - name: Validate no cc_binary targets under //cuttlefish + if: '!cancelled()' + working-directory: base/cvd + run: | + if [[ $(buildozer print '//cuttlefish/...:%cc_binary') ]]; then + buildozer print '//cuttlefish/...:%cc_binary' + echo "Please use cf_cc_binary rather than cc_binary"; + exit 1; + fi + - name: Validate no cc_library targets under //cuttlefish + if: '!cancelled()' + working-directory: base/cvd + run: | + if [[ $(buildozer print '//cuttlefish/...:%cc_library') ]]; then + buildozer print '//cuttlefish/...:%cc_library' + echo "Please use cf_cc_library rather than cc_library"; + exit 1; + fi + - name: Validate no cc_test targets under //cuttlefish + if: '!cancelled()' + working-directory: base/cvd + run: | + if [[ $(buildozer print '//cuttlefish/...:%cc_test') ]]; then + buildozer print '//cuttlefish/...:%cc_test' + echo "Please use cf_cc_test rather than cc_test"; + exit 1; + fi; + - name: Validate no unused loads + if: '!cancelled()' + working-directory: base/cvd + run: | + if [[ $(buildozer -stdout=true '//...:__pkg__' 'fix unusedLoads') ]]; then + buildozer '//...:__pkg__' 'fix unusedLoads' + echo "Please remove unused 'load' statements with \"buildozer '//...:__pkg__' 'fix unusedLoads'\""; + exit 1; + fi + staticcheck: + runs-on: ubuntu-22.04 + strategy: + matrix: + dir: ["e2etests", "frontend/src/host_orchestrator", "frontend/src/libhoclient", "frontend/src/liboperator", "frontend/src/operator", "tools/baseimage"] + steps: + - name: Checkout repository + uses: actions/checkout@a81bbbf8298c0fa03ea29cdc473d45769f953675 # aka v2 + - name: Install dependencies + uses: actions/setup-go@v3 + with: + go-version: '1.24.2' + - run: go version + - name: Staticcheck + uses: dominikh/staticcheck-action@v1.3.1 + with: + version: "latest" + install-go: false + working-directory: ${{ matrix.dir }} + run-frontend-unit-tests: + runs-on: ubuntu-22.04 + container: + image: debian@sha256:9258a75a7e4323c9e5562b361effc84ee747920116d8adfc98a465a5cdc9150e # debian:bookworm-20250407 (amd64) + env: + GOPROJECTS: ('host_orchestrator' 'libhoclient' 'liboperator' 'operator') + steps: + - name: Checkout repository + uses: actions/checkout@a81bbbf8298c0fa03ea29cdc473d45769f953675 # aka v2 + - name: Setup apt + run: apt update -y && apt upgrade -y + - name: Install dependencies + run: apt install -y git golang + - name: Go version + run: go version + - name: Run gofmt check + shell: bash + run: | + projects=${{ env.GOPROJECTS }} + for item in "${projects[@]}"; do + pushd "frontend/src/${item}" + gofmt -d -e . && test -z "$(gofmt -l .)" + popd + done + - name: Run go tests + shell: bash + run: | + projects=${{ env.GOPROJECTS }} + for item in "${projects[@]}"; do + pushd "frontend/src/${item}" + go test ./... + popd + done + run-frontend-api-documentation-check: + runs-on: ubuntu-22.04 + container: + image: debian@sha256:9258a75a7e4323c9e5562b361effc84ee747920116d8adfc98a465a5cdc9150e # debian:bookworm-20250407 (amd64) + env: + GOPROJECTS: ('host_orchestrator') + steps: + - name: Setup apt + run: apt update -y && apt upgrade -y + - name: Install dependencies + run: apt install -y git golang + - name: Setup git + run: | + git --version + # Fixes fatal: detected dubious ownership in repository at '/__w/android-cuttlefish/android-cuttlefish' + git config --global --add safe.directory /__w/android-cuttlefish/android-cuttlefish + - name: Go version + run: go version + - name: Checkout repository + uses: actions/checkout@a81bbbf8298c0fa03ea29cdc473d45769f953675 # aka v2 + - name: Install swag + run: go install github.com/swaggo/swag/cmd/swag@v1.16.5 + - name: Run swag check + shell: bash + run: | + $(go env GOPATH)/bin/swag --version + projects=${{ env.GOPROJECTS }} + for item in "${projects[@]}"; do + pushd "frontend/src/${item}" + $(go env GOPATH)/bin/swag fmt + git diff --exit-code || ( echo "format error: see frontend/src/host_orchestrator/README.md" && false) + $(go env GOPATH)/bin/swag init + git diff --exit-code || ( echo "This change requires REST API documentation update: see frontend/src/host_orchestrator/README.md" && false) + popd + done + run-cvd-unit-tests: + runs-on: ubuntu-24.04 + steps: + - name: Free disk space + uses: jlumbroso/free-disk-space@v1.3.1 + with: + large-packages: false + swap-storage: false + tool-cache: true + - name: Checkout repository + uses: actions/checkout@a81bbbf8298c0fa03ea29cdc473d45769f953675 # aka v2 + - name: Mount Bazel cache + uses: ./.github/actions/mount-bazel-cache + with: + action-name: "run-cvd-unit-tests" + - name: Run cvd unit tests + uses: ./.github/actions/run-cvd-unit-tests + - name: Upload test logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: cvd-unit-tests-logs + path: base/cvd/bazel-out/k8-fastbuild/testlogs diff --git a/.github/workflows/presubmit.yaml b/.github/workflows/presubmit.yaml index 3e957efda7e..124b36b4d7b 100644 --- a/.github/workflows/presubmit.yaml +++ b/.github/workflows/presubmit.yaml @@ -1,7 +1,7 @@ name: Presubmit on: - pull_request: + workflow_dispatch: push: branches-ignore: - main # push events to main branch occur after PRs are merged, when the same checks were run