Skip to content

Build

Build #20

Workflow file for this run

name: Build
on:
push:
branches:
- main
tags:
- "v*.*.*"
pull_request:
branches:
- main
schedule:
- cron: 0 1 * * 1
workflow_dispatch:
permissions:
contents: write
packages: write
pull-requests: read
jobs:
commitlint:
runs-on: ubuntu-latest
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # fetch-depth is required
- uses: wagoid/commitlint-github-action@v5
pre-commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # fetch-depth is required
- name: Set up Go without go.mod
uses: actions/setup-go@v5
if: ${{ hashFiles('go.mod') == '' }}
with:
check-latest: true
- name: Set up Go with go.mod
uses: actions/setup-go@v5
if: ${{ hashFiles('go.mod') != '' }}
with:
go-version-file: go.mod
- uses: actions/setup-python@v5
with:
python-version: 3.x
- name: Setup JS
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Install dependencies
run: |
go install ./... || true
npm ci || true
- uses: pre-commit/[email protected]
base:
runs-on: ubuntu-latest
needs:
- commitlint
- pre-commit
outputs:
docker_registry: ${{ steps.tags.outputs.docker_registry }}
matrix: ${{ steps.tags.outputs.matrix }}
tag: ${{ steps.tags.outputs.tag }}
steps:
- uses: actions/checkout@v4
- name: Setup JS
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Generate Docker tag
id: tags
run: |
echo "docker_registry=ghcr.io/${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT"
echo "matrix={\"img\": $(jq -ncR '[inputs]' <<< $(ls -d images/* | grep -v '/base'))}" >> "$GITHUB_OUTPUT"
echo "tag=$(date --iso-8601)" >> "$GITHUB_OUTPUT"
- name: Install Dev Container CLI
run: |
npm install -g @devcontainers/cli
devcontainer --version
- name: Build Dev Container
run: |
docker pull ${{ steps.tags.outputs.docker_registry }}/base:latest || true
devcontainer build \
--platform=linux/amd64 \
--image-name=${{ steps.tags.outputs.docker_registry }}/base:${{ steps.tags.outputs.tag }} \
--image-name=${{ steps.tags.outputs.docker_registry }}/base:latest \
--workspace-folder=images/base
if [ ${{ github.ref == 'refs/heads/main' }} = "true" ]; then
echo "Pushing images"
docker push ${{ steps.tags.outputs.docker_registry }}/base:${{ steps.tags.outputs.tag }}
docker push ${{ steps.tags.outputs.docker_registry }}/base:latest
else
echo "Saving base image"
docker save ${{ steps.tags.outputs.docker_registry }}/base:latest -o base.tar.gz
fi
- name: Archive Docker image
uses: actions/upload-artifact@v4
if: ${{ github.ref != 'refs/heads/main' }}
with:
name: docker-image
path: base.tar.gz
if-no-files-found: error
retention-days: 1
compression-level: 0
overwrite: true
images:
runs-on: ubuntu-latest
needs:
- base
strategy:
matrix: ${{ fromJSON(needs.base.outputs.matrix) }}
steps:
- uses: actions/checkout@v4
- name: Setup JS
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Generate Docker tag
id: tags
run: |
echo "name=$(echo ${{ matrix.img }} | sed 's/images\///' )" >> "$GITHUB_OUTPUT"
- name: Install Dev Container CLI
run: |
npm install -g @devcontainers/cli
devcontainer --version
- name: Import Docker image
uses: actions/download-artifact@v4
if: ${{ github.ref != 'refs/heads/main' }}
with:
name: docker-image
- name: Build Dev Container
run: |
if [ ${{ github.ref == 'refs/heads/main' }} = "true" ]; then
echo "Pulling image from registry"
docker pull ${{ needs.base.outputs.docker_registry }}/base
else
echo "Importing image from cache"
docker import base.tar.gz ${{ needs.base.outputs.docker_registry }}/base
fi
docker pull ${{ needs.base.outputs.docker_registry }}/${{ steps.tags.outputs.name }}:latest || true
devcontainer build \
--platform=linux/amd64 \
--image-name=${{ needs.base.outputs.docker_registry }}/${{ steps.tags.outputs.name }}:${{ needs.base.outputs.tag }} \
--image-name=${{ needs.base.outputs.docker_registry }}/${{ steps.tags.outputs.name }}:latest \
--workspace-folder=${{ matrix.img }}
if [ ${{ github.ref == 'refs/heads/main' }} = "true" ]; then
echo "Pushing images"
docker push ${{ needs.base.outputs.docker_registry }}/${{ steps.tags.outputs.name }}:${{ needs.base.outputs.tag }}
docker push ${{ needs.base.outputs.docker_registry }}/${{ steps.tags.outputs.name }}:latest
fi