name: Go
on: pull_request

permissions:
  contents: read

jobs:
  meta:
    runs-on: ${{ vars.LINKERD2_RUNNER || 'ubuntu-24.04' }}
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: tj-actions/changed-files@db8d0bfea5a44e51abd5dc1454386c668ae901f9
        id: changed
        with:
          files: |
            .github/workflows/go.yml
            go.sum
            **/*.go
            **/*.golden
            **/charts/**
          files_ignore: |
            **/Chart.yaml
            **/README*
    outputs:
      changed: ${{ steps.changed.outputs.any_changed }}

  go-lint:
    needs: meta
    if: needs.meta.outputs.changed == 'true'
    timeout-minutes: 10
    runs-on: ${{ vars.LINKERD2_RUNNER || 'ubuntu-24.04' }}
    container: ghcr.io/linkerd/dev:v47-go
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - run: git config --global --add safe.directory "$PWD" # actions/runner#2033
      - run: just go-lint --verbose --timeout=10m

  go-format:
    needs: meta
    if: needs.meta.outputs.changed == 'true'
    timeout-minutes: 10
    runs-on: ${{ vars.LINKERD2_RUNNER || 'ubuntu-24.04' }}
    container: ghcr.io/linkerd/dev:v47-go
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - run: git config --global --add safe.directory "$PWD" # actions/runner#2033
      - run: just go-fmt

  go-test:
    needs: meta
    if: needs.meta.outputs.changed == 'true'
    timeout-minutes: 30
    runs-on: ${{ vars.LINKERD2_RUNNER || 'ubuntu-24.04' }}
    container: ghcr.io/linkerd/dev:v47-go
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - run: git config --global --add safe.directory "$PWD" # actions/runner#2033
      - run: just go-fetch
      - run: just go-test

  # There's currently one flakey test we want to retry in particular:
  # TestEndpointProfileTranslator/Handles_overflow
  go-test-retry:
    needs: go-test
    if: failure() && fromJSON(github.run_attempt) < 3
    runs-on: ${{ vars.LINKERD2_RUNNER || 'ubuntu-24.04' }}
    permissions:
      actions: write
    env:
      GH_REPO: ${{ github.repository }}
      GH_TOKEN: ${{ github.token }}
      GH_DEBUG: api
      REF: ${{ github.head_ref }}
    steps:
      - run: gh workflow run rerun.yml -F 'run_id=${{ github.run_id }}' --ref "$REF"

  go-ok:
    needs: [go-lint, go-format, go-test]
    if: always()
    runs-on: ${{ vars.LINKERD2_RUNNER || 'ubuntu-24.04' }}
    steps:
      - name: Results
        run: |
          echo 'go-lint: ${{ needs.go-lint.result }}'
          echo 'go-format: ${{ needs.go-format.result }}'
          echo 'go-test: ${{ needs.go-test.result }}'

      - name: Verify jobs
        # All jobs must succeed or be skipped.
        if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')
        run: exit 1
