Files
firezone/.github/workflows/ci.yml
Jamil 391150f0e1 chore(ci): Fix new issues in cd.yml (#4085)
Fixes some issues encountered after the merge of #4049 

- Fix performance tests to only run using base_ref and head_ref to avoid
dependence on `main`
- Fixes some typos
- Prevents a catch-22 condition where breaking compatibility meant we
wouldn't be able to deploy production
2024-03-12 02:06:19 +00:00

227 lines
7.4 KiB
YAML

name: Continuous Integration
on:
pull_request:
merge_group:
types: [checks_requested]
workflow_call:
inputs:
profile:
required: false
default: 'debug'
type: string
# Cancel old workflow runs if new code is pushed
concurrency:
group: "ci-${{ github.workflow }}-${{ github.ref }}"
cancel-in-progress: true
jobs:
kotlin:
uses: ./.github/workflows/_kotlin.yml
secrets: inherit
swift:
uses: ./.github/workflows/_swift.yml
secrets: inherit
tauri:
uses: ./.github/workflows/_tauri.yml
secrets: inherit
elixir:
uses: ./.github/workflows/_elixir.yml
rust:
uses: ./.github/workflows/_rust.yml
secrets: inherit
static-analysis:
uses: ./.github/workflows/_static-analysis.yml
terraform:
uses: ./.github/workflows/_terraform.yml
secrets: inherit
codeql:
uses: ./.github/workflows/_codeql.yml
secrets: inherit
build-artifacts:
uses: ./.github/workflows/_build_artifacts.yml
secrets: inherit
with:
profile: ${{ inputs.profile || 'debug' }}
integration-tests:
uses: ./.github/workflows/_integration_tests.yml
needs: build-artifacts
secrets: inherit
snownet-tests:
needs: build-artifacts
if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }}
name: snownet-tests-${{ matrix.name }}
runs-on: ubuntu-22.04
permissions:
contents: read
id-token: write
pull-requests: write
env:
RELAY_IMAGE: 'us-east1-docker.pkg.dev/firezone-staging/firezone/relay'
RELAY_TAG: ${{ github.sha }}
SNOWNET_IMAGE: 'us-east1-docker.pkg.dev/firezone-staging/firezone/snownet-tests'
SNOWNET_TAG: ${{ github.sha }}
strategy:
fail-fast: false
matrix:
name:
- lan
- wan-hp
- wan-relay
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/gcp-docker-login
id: login
with:
project: firezone-staging
- name: Run docker-compose.${{ matrix.name }}.yml test
run: |
sudo sysctl -w vm.overcommit_memory=1
timeout 600 docker compose -f rust/snownet-tests/docker-compose.${{ matrix.name }}.yml up --exit-code-from dialer --abort-on-container-exit
compatibility-tests:
# Don't run compatibility tests when called from cd.yml on `main` because
# it'll be red if there was a breaking change we're tring to publish,
# and the publish workflow checks for main to be green.
if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }}
uses: ./.github/workflows/_integration_tests.yml
needs: build-artifacts
secrets: inherit
with:
gateway_image: "ghcr.io/firezone/gateway"
gateway_tag: "latest"
# FIXME: Uncomment this after the next release -- the
# client will be published then.
# client_tag: "latest"
perf-tests:
# Only the debug images have perf tooling
if: ${{ github.event_name == 'pull_request' }}
name: perf-tests-${{ matrix.test_name }}
needs: build-artifacts
runs-on: ubuntu-22.04
permissions:
contents: read
id-token: write
pull-requests: write
env:
API_TAG: ${{ matrix.sha }}
WEB_TAG: ${{ matrix.sha }}
GATEWAY_TAG: ${{ matrix.sha }}
CLIENT_TAG: ${{ matrix.sha }}
RELAY_TAG: ${{ matrix.sha }}
ELIXIR_TAG: ${{ matrix.sha }}
strategy:
fail-fast: false
matrix:
sha:
- ${{ github.sha }}
- ${{ github.event.pull_request.base.sha }}
test_name:
- direct-tcp-client2server
- direct-tcp-server2client
- direct-udp-client2server
- direct-udp-server2client
- relayed-tcp-client2server
- relayed-tcp-server2client
- relayed-udp-client2server
- relayed-udp-server2client
steps:
- uses: actions/checkout@v4
with:
ref: ${{ matrix.sha }}
- uses: ./.github/actions/gcp-docker-login
id: login
with:
project: firezone-staging
- name: Seed database
run:
docker compose run elixir /bin/sh -c 'cd apps/domain && mix ecto.seed'
- name: Start docker compose in the background
run: |
# We need to increase the log level to make sure that they don't hold off storm of packets
# generated by UDP tests. Wire is especially chatty.
sed -i 's/^\(\s*\)RUST_LOG:.*$/\1RUST_LOG: wire=error,info/' docker-compose.yml
cat docker-compose.yml | grep RUST_LOG
# Start services in the same order each time for the tests
docker compose up -d iperf3
docker compose up -d api web
docker compose up -d relay
docker compose up -d gateway
docker compose up -d client
- name: 'Performance test: ${{ matrix.test_name }}'
timeout-minutes: 5
env:
TEST_NAME: ${{ matrix.test_name }}
run: ./scripts/tests/perf/${{ matrix.test_name }}.sh
- name: 'Save performance test results: ${{ matrix.test_name }}'
uses: actions/upload-artifact@v4
with:
overwrite: true
name: ${{ matrix.test_name }}-${{ matrix.sha }}-iperf3results
path: ./${{ matrix.test_name }}.json
- name: Show Client logs
if: "!cancelled()"
run: docker compose logs client
- name: Show Client UDP stats
if: "!cancelled()"
run: docker compose exec client cat /proc/net/udp
- name: Show Relay logs
if: "!cancelled()"
run: docker compose logs relay
- name: Show Gateway logs
if: "!cancelled()"
run: docker compose logs gateway
- name: Show Gateway UDP stats
if: "!cancelled()"
run: docker compose exec gateway cat /proc/net/udp
- name: Show API logs
if: "!cancelled()"
run: docker compose logs api
- name: Show iperf3 logs
if: "!cancelled()"
run: docker compose logs iperf3
compare-results:
if: github.event_name == 'pull_request'
needs: perf-tests
runs-on: ubuntu-22.04
permissions:
contents: read
id-token: write
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Download base ref performance test results
uses: actions/download-artifact@v4
with:
pattern: '*-${{ github.event.pull_request.base.sha }}-iperf3results'
merge-multiple: true
path: ./${{ github.event.pull_request.base.sha }}
- name: Download head ref performance test results
uses: actions/download-artifact@v4
with:
pattern: '*-${{ github.sha }}-iperf3results'
merge-multiple: true
path: ./${{ github.sha }}
- name: Update PR with results
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { script } = require('./scripts/tests/perf/results.js');
script(github, context, '${{ github.event.pull_request.base.sha }}', '${{ github.sha }}', [
'direct-tcp-client2server',
'direct-tcp-server2client',
'direct-udp-client2server',
'direct-udp-server2client',
'relayed-tcp-client2server',
'relayed-tcp-server2client',
'relayed-udp-client2server',
'relayed-udp-server2client'
]);