CI #13
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
pull_request: | |
merge_group: | |
jobs: | |
test-backend: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Install Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.12" | |
- name: Install dependencies | |
run: | | |
sudo apt-get install libgraphviz-dev | |
python -m pip install --upgrade pip | |
pip install uv==0.4.4 | |
uv sync --frozen | |
# Update output format to enable automatic inline annotations. | |
- name: Lint Python code | |
run: uv run ruff check --output-format=github | |
- name: Check Python formatting | |
run: uv run ruff format --check | |
test-frontend: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Install NodeJS | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- name: Install dependencies | |
run: | | |
cd frontend | |
npm ci | |
- name: Build packages | |
run: | | |
cd frontend | |
npm run build | |
- name: Check lints and formatting | |
run: | | |
cd frontend | |
npm run check | |
build-docker: | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
packages: write | |
steps: | |
- name: Set up Docker | |
uses: docker/setup-buildx-action@v3 | |
- name: Login to Docker registry | |
uses: docker/login-action@v3 | |
continue-on-error: true | |
with: | |
registry: ghcr.io | |
username: ${{ github.repository_owner }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Build Docker image | |
uses: docker/build-push-action@v6 | |
with: | |
cache-from: type=registry,ref=ghcr.io/mrlvsb/kelvin-ci-cache | |
cache-to: type=registry,ref=ghcr.io/mrlvsb/kelvin-ci-cache,compression=zstd | |
tags: ghcr.io/mrlvsb/kelvin:latest,ghcr.io/mrlvsb/kelvin:${{ github.sha }} | |
outputs: type=docker,dest=${{ runner.temp }}/kelvin.tar | |
- name: Share built image | |
uses: actions/upload-artifact@v4 | |
with: | |
name: kelvin | |
path: ${{ runner.temp }}/kelvin.tar | |
retention-days: 1 | |
deploy: | |
runs-on: ubuntu-latest | |
permissions: | |
packages: write | |
needs: [test-backend, test-frontend, build-docker] | |
environment: production | |
if: ${{ github.event_name == 'merge_group' }} | |
steps: | |
- name: Set up Docker | |
uses: docker/setup-buildx-action@v3 | |
- name: Download built image | |
uses: actions/download-artifact@v4 | |
with: | |
name: kelvin | |
path: ${{ runner.temp }} | |
- name: Load image | |
run: | | |
docker load --input ${{ runner.temp }}/kelvin.tar | |
docker image ls -a | |
- name: Login to Docker registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.repository_owner }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Push Docker image | |
run: docker push --all-tags ghcr.io/mrlvsb/kelvin | |
# Summary job to enable easier handling of required status checks. | |
# On PRs, we need everything to be green, while deploy is skipped. | |
# On merge queue, we need everything to be green. | |
# ALL THE PREVIOUS JOBS NEED TO BE ADDED TO THE `needs` SECTION OF THIS JOB! | |
conclusion: | |
needs: [test-frontend, test-backend, build-docker, deploy] | |
# We need to ensure this job does *not* get skipped if its dependencies fail, | |
# because a skipped job is considered a success by GitHub. So we have to | |
# overwrite `if:`. We use `!cancelled()` to ensure the job does still not get run | |
# when the workflow is canceled manually. | |
if: ${{ !cancelled() }} | |
runs-on: ubuntu-latest | |
steps: | |
- name: Conclusion | |
run: | | |
# Print the dependent jobs to see them in the CI log | |
jq -C <<< '${{ toJson(needs) }}' | |
# Check if all jobs that we depend on (in the needs array) | |
# were either successful or skipped. | |
jq --exit-status 'all(.result == "success" or .result == "skipped")' <<< '${{ toJson(needs) }}' |