• Martin Atkins's avatar
    build: "Quick Checks" runs consistency checks concurrently with others · 42a618f7
    Martin Atkins authored
    Originally we had this running as part of the Unit Tests job because most
    of the checks are relatively fast. However, the addition of the protobuf
    generation check made that no longer be true because it needs to download
    and run protoc.
    
    With that extra overhead it now _is_ productive to spend the time booting
    and installing Go on third worker, as long as GitHub Actions continues
    to let us run all three of these jobs concurrently most of the time.
    42a618f7
checks.yml 4.37 KiB
# This workflow is a collection of "quick checks" that should be reasonable
# to run for any new commit to this repository in principle.
#
# The main purpose of this workflow is to represent checks that we want to
# run prior to reviewing and merging a pull request. We should therefore aim
# for these checks to complete in no more than a few minutes in the common
# case.
#
# The build.yml workflow includes some additional checks we run only for
# already-merged changes to release branches and tags, as a compromise to
# keep the PR feedback relatively fast. The intent is that checks.yml should
# catch most problems but that build.yml might occasionally by the one to catch
# more esoteric situations, such as architecture-specific or OS-specific
# misbehavior.

name: Quick Checks

on:
  push:

# This workflow runs for not-yet-reviewed external contributions and so it
# intentionally has no write access and only limited read access to the
# repository.
permissions:
  contents: read

jobs:
  unit-tests:
    name: "Unit Tests"
    runs-on: ubuntu-latest

    steps:
      - name: "Fetch source code"
        uses: actions/checkout@v2

      - name: Determine Go version
        id: go
        uses: ./.github/actions/go-version

      - name: Install Go toolchain
        uses: actions/setup-go@v2
        with:
          go-version: ${{ steps.go.outputs.version }}

      # NOTE: This cache is shared so the following step must always be
      # identical across the unit-tests, e2e-tests, and consistency-checks
      # jobs, or else weird things could happen.
      - name: Cache Go modules
        uses: actions/cache@v3
        with:
          path: "~/go/pkg"
          key: go-mod-${{ hashFiles('go.sum') }}
          restore-keys: |
            go-mod-

      - name: "Unit tests"
        run: |
          go test ./...

  e2e-tests:
    # This is an intentionally-limited form of our E2E test run which only
    # covers Terraform running on Linux. The build.yml workflow runs these
    # tests across various other platforms in order to catch the rare exception
    # that might leak through this.
    name: "End-to-end Tests"
    runs-on: ubuntu-latest

    steps:
      - name: "Fetch source code"
        uses: actions/checkout@v2

      - name: Determine Go version
        id: go
        uses: ./.github/actions/go-version

      - name: Install Go toolchain
        uses: actions/setup-go@v2
        with:
          go-version: ${{ steps.go.outputs.version }}

      # NOTE: This cache is shared so the following step must always be
      # identical across the unit-tests, e2e-tests, and consistency-checks
      # jobs, or else weird things could happen.
      - name: Cache Go modules
        uses: actions/cache@v3
        with:
          path: "~/go/pkg"
          key: go-mod-${{ hashFiles('go.sum') }}
          restore-keys: |
            go-mod-

      - name: "End-to-end tests"
        run: |
          TF_ACC=1 go test -v ./internal/command/e2etest

  consistency-checks:
    name: "Code Consistency Checks"
    runs-on: ubuntu-latest

    steps:
      - name: "Fetch source code"
        uses: actions/checkout@v2

      - name: Determine Go version
        id: go
        uses: ./.github/actions/go-version

      - name: Install Go toolchain
        uses: actions/setup-go@v2
        with:
          go-version: ${{ steps.go.outputs.version }}

      # NOTE: This cache is shared so the following step must always be
      # identical across the unit-tests, e2e-tests, and consistency-checks
      # jobs, or else weird things could happen.
      - name: Cache Go modules
        uses: actions/cache@v3
        with:
          path: "~/go/pkg"
          key: go-mod-${{ hashFiles('go.sum') }}
          restore-keys: |
            go-mod-

      - name: "go.mod and go.sum consistency check"
        run: |
          go mod tidy
          if [[ -n "$(git status --porcelain)" ]]; then
            echo >&2 "ERROR: go.mod/go.sum are not up-to-date. Run 'go mod tidy' and then commit the updated files."
            exit 1
          fi

      - name: "Code consistency checks"
        run: |
          make fmtcheck generate staticcheck exhaustive protobuf
          if [[ -n "$(git status --porcelain)" ]]; then
            echo >&2 "ERROR: Generated files are inconsistent. Run 'make generate' and 'make protobuf' locally and then commit the updated files."
            git >&2 status --porcelain
            exit 1
          fi