# This workflow implements continuous delivery with automated testing and fully
# autonomous deploys to production on merge.
name: CD

# Translated: "Execute this workflow on pushes to main OR on pull requests
# opened against main"
#
# See this question and answer for what we're solving here:
# https://github.community/t5/GitHub-Actions/How-to-trigger-an-action-on-push-or-pull-request-but-not-both/m-p/36155#M2460
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
    - name: Setup
      uses: actions/setup-go@v2
      with:
        go-version: '1.17'

    - name: Checkout
      uses: actions/checkout@v2

    - name: Build
      run: make build

    - name: Build docker image
      run: make image

    - name: Test
      run: git show --stat && make testci

    - name: Code coverage
      uses: codecov/codecov-action@v1
      with:
        file: ./coverage.txt

  regression_test:
    name: Regression Tests
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go_version:
        - '1.14'
        - '1.15'
        - '1.16'

    steps:
    - name: Setup
      uses: actions/setup-go@v2
      with:
        go-version: ${{matrix.go_version}}

    - name: Checkout
      uses: actions/checkout@v2

    - name: Build
      run: make build

    - name: Test
      run: make test

  production_deploy:
    name: Production Deploy
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    needs: [test]
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Notify start
      id: deployment
      uses: bobheadxi/deployments@v0.6.1
      with:
        step: start
        token: ${{ secrets.GITHUB_TOKEN }}
        env: production

    - name: Deploy
      uses: superfly/flyctl-actions@1.1
      with:
        args: "deploy --strategy rolling"
      env:
        DOCKER_BUILDKIT: 1
        FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}

    - name: Notify finish
      uses: bobheadxi/deployments@v0.6.1
      with:
        step: finish
        deployment_id: ${{ steps.deployment.outputs.deployment_id }}
        token: ${{ secrets.GITHUB_TOKEN }}
        env: production
        status: ${{ job.status }}
        env_url: 'https://httpbingo.org'
