name: tester

on:
  push:
    branches:
      - "main"
      - "release-**"
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
    branches:
      - "main"
      - "release-**"

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  changes:
    permissions:
      contents: read  # for dorny/paths-filter to fetch a list of changed files
      pull-requests: read  # for dorny/paths-filter to read pull requests
    outputs:
      should-run-tests: ${{ steps.changes.outputs.go == 'true' }}
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1
        with:
          egress-policy: audit

      - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
      - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
        id: changes
        with:
          filters: |
            go:
              - '**.go'
              - '**.txt' # golden file test output
              - 'go.*'
              - '**.tmpl'
              - '.github/workflows/test.yml'
  test:
    needs: [changes]
    if: needs.changes.outputs.should-run-tests == 'true'
    name: Tests
    runs-on: ubuntu-24.04
    container: ghcr.io/runatlantis/testing-env:latest@sha256:725981e9090c977f8055f5ec5ba7a63430a8f0337ab955978e6b8cc2cd0236c3
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1
        with:
          egress-policy: audit

      - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4

      # need to setup go toolchain explicitly
      - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5
        with:
          go-version-file: go.mod

      - run: make test-all
      - run: make check-fmt

      ###########################################################
      # Notifying #contributors about test failure on main branch
      ###########################################################
      - name: Slack failure notification
        if: ${{ github.ref == 'refs/heads/main' && failure() }}
        uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
        with:
          payload: |
            {
              "blocks": [
                {
                  "type": "section",
                  "text": {
                    "type": "mrkdwn",
                    "text": ":x: Failed GitHub Action:"
                  }
                },
                {
                  "type": "section",
                  "fields": [
                    {
                      "type": "mrkdwn",
                      "text": "*Workflow:*\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>"
                    },
                    {
                      "type": "mrkdwn",
                      "text": "*Job:*\n${{ github.job }}"
                    },
                    {
                      "type": "mrkdwn",
                      "text": "*Repo:*\n${{ github.repository }}"
                    }
                  ]
                }
              ]
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
          SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

  skip-test:
    needs: [changes]
    if: needs.changes.outputs.should-run-tests == 'false'
    name: Tests
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1
        with:
          egress-policy: audit

      - run: 'echo "No build required"'

  e2e-github:
    runs-on: ubuntu-latest
    # dont run e2e tests on forked PRs
    if: github.event.pull_request.head.repo.fork == false
    env:
      TERRAFORM_VERSION: 1.11.1
      ATLANTIS_GH_USER: ${{ secrets.ATLANTISBOT_GITHUB_USERNAME }}
      ATLANTIS_GH_TOKEN: ${{ secrets.ATLANTISBOT_GITHUB_TOKEN }}
      NGROK_AUTH_TOKEN: ${{ secrets.ATLANTISBOT_NGROK_AUTH_TOKEN }}
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1
        with:
          egress-policy: audit

      - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
      - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5
        with:
          go-version-file: go.mod

      # This version of TF will be downloaded before Atlantis is started.
      # We do this instead of setting --default-tf-version because setting
      # that flag starts the download asynchronously so we'd have a race
      # condition.
      - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3
        with:
          terraform_version: ${{ env.TERRAFORM_VERSION }}

      - name: Setup ngrok
        run: |
          wget -q -O ngrok.tar.gz https://bin.equinox.io/a/jVjTX7dAozH/ngrok-v3-3.22.1-linux-amd64.tar.gz
          tar -xzf ngrok.tar.gz
          chmod +x ngrok
          ./ngrok version
      - name: Setup gitconfig
        run: |
          git config --global user.email "maintainers@runatlantis.io"
          git config --global user.name "atlantisbot"

      - run: |
          make build-service
          ./scripts/e2e.sh
  e2e-gitlab:
    runs-on: ubuntu-latest
    # dont run e2e tests on forked PRs
    if: github.event.pull_request.head.repo.fork == false
    env:
      TERRAFORM_VERSION: 1.11.1
      ATLANTIS_GITLAB_USER: ${{ secrets.ATLANTISBOT_GITLAB_USERNAME }}
      ATLANTIS_GITLAB_TOKEN: ${{ secrets.ATLANTISBOT_GITLAB_TOKEN }}
      NGROK_AUTH_TOKEN: ${{ secrets.ATLANTISBOT_NGROK_AUTH_TOKEN }}
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1
        with:
          egress-policy: audit

      - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
      - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5
        with:
          go-version-file: go.mod

      # This version of TF will be downloaded before Atlantis is started.
      # We do this instead of setting --default-tf-version because setting
      # that flag starts the download asynchronously so we'd have a race
      # condition.
      - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3
        with:
          terraform_version: ${{ env.TERRAFORM_VERSION }}

      - name: Setup ngrok
        run: |
          wget -q -O ngrok.tar.gz https://bin.equinox.io/a/jVjTX7dAozH/ngrok-v3-3.22.1-linux-amd64.tar.gz
          tar -xzf ngrok.tar.gz
          chmod +x ngrok
          ./ngrok version
      - name: Setup gitconfig
        run: |
          git config --global user.email "maintainers@runatlantis.io"
          git config --global user.name "atlantisbot"

      - run: |
          make build-service
          ./scripts/e2e.sh
