Skip to content

feat: dead letter topics #10460

feat: dead letter topics

feat: dead letter topics #10460

Workflow file for this run

on:
pull_request:
merge_group:
name: CI
concurrency:
group: ${{ github.ref }}-ci
cancel-in-progress: true
jobs:
test:
name: Test Go
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Build Language Plugins
run: just build-language-plugins
- name: Test
run: |
go-test-annotate
# go-test-annotate ${{ (github.event_name == 'pull_request' && github.event.action != 'enqueued' && !contains( github.event.pull_request.labels.*.name, 'run-all')) && '-short' || '' }}
test-readme:
name: Test README
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Build Language Plugins
run: just build-language-plugins
- name: Test README
run: just test-readme
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: golangci-lint
run: |
golangci-lint --version
golangci-lint run --new-from-rev="$(git merge-base origin/main HEAD)" --out-format github-actions ./...
- name: lint-commit-or-rollback
run: lint-commit-or-rollback ./backend/... 2>&1 | to-annotation
- name: go-check-sumtype
shell: bash
run: go-check-sumtype --include-shared-interfaces=true ./backend/... ./cmd/... ./internal/... 2>&1 | to-annotation
- name: actionlint
shell: bash
run: actionlint --oneline | to-annotation
# Too annoying to disable individual warnings
# - name: staticcheck
# run: staticcheck ./...
- name: lint-scripts
run: just lint-scripts
proto-breaking:
name: Proto Breaking Change Check
if: ${{ github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'skip-proto-breaking') }}
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Init Hermit
uses: cashapp/[email protected]
- name: Proto Breaking Change Check
shell: bash
run: |
set -o pipefail
buf breaking --against 'https://github.com/block/ftl.git#branch=main' | to-annotation || true
console:
name: Console
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Console pnpm install
run: just pnpm-install
- name: Console Lint
run: just lint-frontend
- name: Console Build
run: just build-frontend
- name: Console Test
run: just test-frontend
test-wasm:
name: Test sqlc-gen-ftl
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Init Hermit
uses: cashapp/[email protected]
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Test WASM
run: cd sqlc-gen-ftl && cargo test --features ci --test sqlc_gen_ftl_test -- --nocapture
- name: Check for uncommitted changes
run: |
if [[ -n $(git status -s) ]]; then
echo "Error: Building sqlc-gen-ftl resulted in uncommitted changes:"
git status -s
git --no-pager diff
exit 1
fi
extension:
name: VSCode Extension
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: VSCode extension pnpm install
run: just pnpm-install
- name: VSCode extension lint
working-directory: frontend/vscode
run: pnpm run lint
- name: VSCode extension pnpm build and package
run: just package-extension
plugin:
name: Intellij Plugin
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Install Java
run: java -version
- name: Build Intellij Plugin
run: just build-intellij-plugin
build-all:
name: Rebuild All
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Rebuild All
run: just build-all
- name: Check No SCM Changes
run: |
if [[ -n $(git status -s) ]]
then
echo "Running the build resulted in changes to git controlled files:"
git status -s
git --no-pager diff
exit 1
fi
docs:
name: Build Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: cashapp/[email protected]
- run: cd docs && zola build
arch-lint:
name: Lint Architecture
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: cashapp/[email protected]
- run: go-arch-lint check || true
docker-shard:
name: Shard Docker Builds
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: cashapp/[email protected]
- id: set-matrix
name: Shard Docker Builds
uses: ./.github/actions/shard-docker-builds
build-docker-images:
name: Build ${{ matrix.service }} Docker Image
needs: docker-shard
runs-on: ubuntu-latest
strategy:
matrix:
service: ${{ fromJson(needs.docker-shard.outputs.matrix) }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: cashapp/[email protected]
- name: Build Image and Save
uses: ./.github/actions/save-docker-image
with:
service: ${{ matrix.service }}
console-e2e:
name: Console e2e
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Restore playwright browser cache
id: cache-playwright
uses: actions/cache/restore@v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-playwright-
- name: Console pnpm install
run: just pnpm-install
- name: Build Language Plugins
run: just build-language-plugins
- name: Console e2e
run: just e2e-frontend
integration-shard:
name: Shard Integration Tests
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.extract-tests.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Init Hermit
uses: cashapp/[email protected]
- name: Extract test cases
id: extract-tests
run: |
set -euo pipefail
# shellcheck disable=SC2046
echo "matrix={\"test\":$(jq -c -n '$ARGS.positional' --args $(git grep -l '^//go:build integration' | xargs grep '^func Test' | awk '{print $2}' | cut -d'(' -f1 | paste -d '|' - - | sed 's/|*$//'))}" >> "$GITHUB_OUTPUT"
integration-run:
name: Integration Test
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
needs: integration-shard
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{fromJson(needs.integration-shard.outputs.matrix)}}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Download Go Modules
run: go mod download
- name: Build Language Plugins
run: just build-language-plugins
- name: Run ${{ matrix.test }}
run: |
set -euo pipefail
# shellcheck disable=SC2046
echo '${{ matrix.test }}' | tr '|' ' ' | xargs -n1 just integration-tests
infrastructure-shard:
name: Shard Infrastructure Tests
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.extract-tests.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Init Hermit
uses: cashapp/[email protected]
- name: Extract test cases
id: extract-tests
run: |
set -euo pipefail
# shellcheck disable=SC2046
echo "matrix={\"test\":$(jq -c -n '$ARGS.positional' --args $(git grep -l '^//go:build infrastructure' | xargs grep '^func Test' | awk '{print $2}' | cut -d'(' -f1))}" >> "$GITHUB_OUTPUT"
infrastructure-run:
name: Infrastructure Test
#if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
needs:
- infrastructure-shard
- build-docker-images
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{fromJson(needs.infrastructure-shard.outputs.matrix)}}
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
# this might remove tools that are actually needed,
# if set to "true" but frees about 6 GB
tool-cache: false
large-packages: false # this is slow
- name: Checkout code
uses: actions/checkout@v4
- name: Init Hermit
uses: cashapp/[email protected]
- name: Load Docker Images
uses: ./.github/actions/load-docker-images
- name: Start Cluster
run: just k8s setup-istio-cluster
- name: Tag and Push Docker Images
run: |
for image in $(just list-docker-images); do
docker tag "ftl0/ftl-${image}:latest" "localhost:5000/ftl-${image}:latest"
docker push "localhost:5000/ftl-${image}:latest"
done
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Download Go Modules
run: go mod download
- name: Start FTL
run: just k8s apply
- name: Build Language Plugins
run: just build-language-plugins
- name: Run ${{ matrix.test }}
run: |
set -euo pipefail
# shellcheck disable=SC2046
go test -v -race -tags infrastructure -run '^${{ matrix.test }}$' $(git grep -l '^//go:build infrastructure' | xargs grep -l '^func ${{ matrix.test }}' | xargs -I {} dirname ./{})
- name: Archive Report
uses: actions/upload-artifact@v4
if: always() # Always upload the report even on failure
with:
name: kube-report-${{ matrix.test }}
path: /tmp/ftl-kube-report/
- name: Teardown Cluster
working-directory: deployment
if: always() # Always cleanup the cluster even on failure
run: just teardown-cluster
- name: Delete Images
if: always() # We don't want to cache these images, delete them before the cache action
run: just k8s delete-all-images
integration-success:
name: Integration Success
needs: [integration-run]
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- name: Check integration tests result
run: |
if [[ "${{ needs.integration-run.result }}" == "failure" ]]; then
echo "Integration tests failed"
exit 1
else
echo "Integration tests passed"
fi
docker-success:
name: Docker Success
needs: [build-docker-images]
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- name: Check docker builds result
run: |
if [[ "${{ needs.build-docker-images.result }}" == "failure" ]]; then
echo "Docker builds failed"
exit 1
else
echo "Docker builds passed"
fi
infrastructure-success:
name: Infrastructure Success
needs: [infrastructure-run]
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- name: Check infrastructure tests result
run: |
if [[ "${{ needs.infrastructure-run.result }}" == "failure" ]]; then
echo "Infrastructure tests failed"
exit 1
else
echo "Infrastructure tests passed"
fi