Skip to content

Introduce sample key management dashboard #85

Introduce sample key management dashboard

Introduce sample key management dashboard #85

Workflow file for this run

on:
push:
branches:
- master
env:
REGISTRY: ghcr.io
ENGINE_IMAGE_NAME: v3xlabs/edgeserver
ROUTER_IMAGE_NAME: v3xlabs/edgerouter
ENGINE_BINARY_NAME: edgeserver
ROUTER_BINARY_NAME: edgerouter
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
jobs:
build-web:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
# Setup Node & PNPM
- name: Setup PNPM
uses: pnpm/action-setup@v4
with:
run_install: false
standalone: true
package_json_file: web/package.json
version: 8
- name: Setup Node
uses: actions/setup-node@main
with:
node-version: 21
cache: pnpm
cache-dependency-path: "web"
- name: Install dependencies
working-directory: web
run: pnpm install
- name: Build web
working-directory: web
run: pnpm build
- name: Upload web artifacts
uses: actions/upload-artifact@v4
with:
name: www
path: web/dist
retention-days: 1
compression-level: 9
build-engine:
strategy:
matrix:
platform:
- arch: x86_64-unknown-linux-musl
docker: linux/amd64
- arch: aarch64-unknown-linux-musl
docker: linux/arm64
timeout-minutes: 20 # Prevent hanging builds
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
# Set up Rust with the specific target we need
- name: Install Rust
run: rustup toolchain install stable --profile minimal --no-self-update
# Speed up builds by caching dependencies
- name: Cache Rust
uses: Swatinem/rust-cache@v2
with:
workspaces: engine
key: ${{ matrix.platform.arch }}
# Install cross
- name: Install cross
run: cargo install cross
# Update version number in engine/Cargo.toml
# If tag is a release use that
# Otherwise use the version number in the engine/Cargo.toml and append it with -alpha
- name: Update version number
run: |
if [[ "${{ github.ref }}" =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+.*$ ]]; then
VERSION=${GITHUB_REF#refs/tags/v}
echo "Release tag detected, using version: $VERSION"
sed -i "0,/^version = .*/s//version = \"${VERSION}\"/" engine/Cargo.toml
else
echo "No release tag detected, using version from Cargo.toml"
# parse version from Cargo.toml using regex
version=$(grep -oP 'version = "([^"]+?)"' engine/Cargo.toml | head -n 1 | sed 's/^version = "\(.*\)"$/\1/')
echo "Current version: $version"
sed -i '0,/^version = .*/s//version = "'${version}'-alpha"/' engine/Cargo.toml
fi
# 🔨 Build our static binary
- name: Build Rust binary
working-directory: ./engine
env:
BINARY_NAME: ${{ env.ENGINE_BINARY_NAME }}
SQLX_OFFLINE: true
run: cross build --target ${{ matrix.platform.arch }} --release
# 📦 Save our binary for later
- name: Upload built binary as artifact
uses: actions/upload-artifact@v4
with:
name: engine-${{ matrix.platform.arch }}
path: engine/target/${{ matrix.platform.arch }}/release/${{ env.ENGINE_BINARY_NAME }}
retention-days: 1
compression-level: 9
docker-build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
needs: # Wait for other jobs to finish
- build-engine
- build-web
strategy:
matrix:
platform:
- arch: x86_64-unknown-linux-musl
docker: linux/amd64
- arch: aarch64-unknown-linux-musl
docker: linux/arm64
steps:
- name: Checkout
uses: actions/checkout@v4
# 📥 Grab our built binary
- name: Download built binary
uses: actions/download-artifact@v4
id: engine-binary
with:
name: engine-${{ matrix.platform.arch }}
path: artifacts
- name: Prepare artifacts
run: |
chmod 755 ./artifacts/edgeserver
ls -la ./artifacts
- name: Download web artifacts
uses: actions/download-artifact@v4
with:
name: www
path: artifacts/www
# Set up QEMU for multi-arch builds
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
# Set up Docker Buildx
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# Log into GitHub's container registry
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Extract metadata
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.ENGINE_IMAGE_NAME }}
- name: Ls artifacts
run: ls -la ./artifacts
# 🚀 Build and push multi-arch Docker image
- name: Build Docker digests
uses: docker/build-push-action@v6
id: build
with:
context: ./artifacts
file: ./engine/Dockerfile.scratch
platforms: ${{ matrix.platform.docker }}
labels: ${{ steps.meta.outputs.labels }}
annotations: ${{ steps.meta.outputs.annotations }}
outputs: type=image,name=${{ env.REGISTRY }}/${{ env.ENGINE_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
build-args: |
BINARY_PATH=./edgeserver
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ matrix.platform.arch }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
# 🐳 Final job: Merge multi-arch digests into a single artifact
docker-merge:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')
permissions:
contents: read
packages: write
attestations: write # For security attestations
id-token: write
needs: # Wait for other jobs to finish
- docker-build
steps:
- name: Checkout
uses: actions/checkout@v4
# 📥 Grab our digests
- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true
# Log into GitHub's container registry
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Set up Docker Buildx
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# Extract metadata
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.ENGINE_IMAGE_NAME }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=edge
type=sha
- 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 }}/${{ env.ENGINE_IMAGE_NAME }}@sha256:%s ' *)
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ env.ENGINE_IMAGE_NAME }}:${{ steps.meta.outputs.version }}