feat(pwa): implement PWA #31
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: build | |
on: | |
push: | |
branches: | |
- "main" | |
- "develop" | |
tags: | |
- "v*" | |
pull_request: | |
env: | |
REGISTRY: ghcr.io | |
REGISTRY_IMAGE: ghcr.io/${{ github.repository }} | |
GO_VERSION: "1.23" | |
NODE_VERSION: "20.17.0" | |
permissions: | |
contents: write | |
packages: write | |
jobs: | |
web: | |
name: Build web | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Set up Node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ env.NODE_VERSION }} | |
- name: Set up corepack | |
run: corepack enable | |
- name: Set up cache | |
uses: actions/setup-node@v4 | |
with: | |
cache: pnpm | |
- name: Fetch dependencies | |
run: pnpm install --frozen-lockfile | |
- name: Build web frontend | |
run: pnpm build | |
- name: Upload web production build | |
uses: actions/upload-artifact@v4 | |
with: | |
name: web-dist | |
path: dist | |
test: | |
name: Test | |
needs: [web] | |
runs-on: ubuntu-latest | |
services: | |
postgres: | |
image: postgres:15 | |
env: | |
POSTGRES_USER: dashbrr | |
POSTGRES_PASSWORD: dashbrr | |
POSTGRES_DB: dashbrr_test | |
ports: | |
- 5432:5432 | |
options: >- | |
--health-cmd pg_isready | |
--health-interval 10s | |
--health-timeout 5s | |
--health-retries 5 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Download web production build | |
uses: actions/download-artifact@v4 | |
with: | |
name: web-dist | |
path: dist | |
- name: Copy web assets | |
run: | | |
mkdir -p backend/web | |
cp -r dist backend/web/ | |
- name: Set up Go | |
uses: actions/setup-go@v5 | |
with: | |
go-version: ${{ env.GO_VERSION }} | |
cache: true | |
- name: Run tests | |
env: | |
DASHBRR__DB_HOST: localhost | |
DASHBRR__DB_PORT: 5432 | |
DASHBRR__DB_USER: dashbrr | |
DASHBRR__DB_PASSWORD: dashbrr | |
DASHBRR__DB_NAME: dashbrr_test | |
run: go test -v -tags=integration ./... | |
docker: | |
name: Build Docker images | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: true | |
matrix: | |
platform: | |
- linux/amd64 | |
- linux/arm64/v8 | |
- linux/arm/v7 | |
- linux/arm/v6 | |
needs: [web, test] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Download web production build | |
uses: actions/download-artifact@v4 | |
with: | |
name: web-dist | |
path: web/dist | |
- name: Login to GitHub Container Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ env.REGISTRY }} | |
username: ${{ github.repository_owner }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Extract metadata | |
id: meta | |
uses: docker/metadata-action@v5 | |
with: | |
images: ${{ env.REGISTRY_IMAGE }} | |
tags: | | |
type=semver,pattern={{version}},prefix=v | |
type=semver,pattern={{major}}.{{minor}},prefix=v | |
type=ref,event=branch | |
type=ref,event=pr | |
flavor: | | |
latest=auto | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Build and publish image | |
id: docker_build | |
uses: docker/build-push-action@v6 | |
with: | |
context: . | |
file: ./ci.Dockerfile | |
platforms: ${{ matrix.platform }} | |
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ (github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request') && 'true' || 'false' }} | |
labels: ${{ steps.meta.outputs.labels }} | |
build-args: | | |
BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} | |
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }} | |
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} | |
cache-from: type=gha | |
cache-to: type=gha,mode=max | |
provenance: false | |
- name: Export image digest | |
id: digest-prep | |
run: | | |
mkdir -p /tmp/digests | |
digest="${{ steps.docker_build.outputs.digest }}" | |
echo "manifest-hash=${digest#sha256:}" >> "$GITHUB_OUTPUT" | |
touch "/tmp/digests/${digest#sha256:}" | |
- name: Upload image digest | |
uses: actions/upload-artifact@v4 | |
with: | |
name: docker-digests-${{ steps.digest-prep.outputs.manifest-hash }} | |
path: /tmp/digests/* | |
if-no-files-found: error | |
retention-days: 1 | |
docker-merge: | |
name: Publish Docker multi-arch manifest | |
if: ${{ github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request' }} | |
runs-on: ubuntu-latest | |
needs: [docker, test] | |
steps: | |
- name: Download image digests | |
uses: actions/download-artifact@v4 | |
with: | |
path: /tmp/digests | |
pattern: docker-digests-* | |
merge-multiple: true | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Login to GitHub Container Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ env.REGISTRY }} | |
username: ${{ github.repository_owner }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Extract metadata | |
id: meta | |
uses: docker/metadata-action@v5 | |
with: | |
images: ${{ env.REGISTRY_IMAGE }} | |
tags: | | |
type=semver,pattern={{version}},prefix=v | |
type=semver,pattern={{major}}.{{minor}},prefix=v | |
type=ref,event=branch | |
type=ref,event=pr | |
flavor: | | |
latest=auto | |
- name: Create manifest list and push | |
working-directory: /tmp/digests | |
run: | | |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ | |
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) | |
- name: Inspect image | |
run: | | |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} |