# SPDX-License-Identifier: AGPL-3.0-or-later name: build app-proxy on: workflow_dispatch: inputs: build-version: description: "Explicit Fluxer CalVer build version (YYYY.MDD.MICRO, UTC HHMMSS without leading zeroes) to use instead of automatic UTC clock allocation" type: string required: false default: "" permissions: actions: read contents: write packages: write concurrency: group: publish-fluxer-app-proxy cancel-in-progress: false env: GHCR_OWNER: ${{ github.repository_owner }} jobs: approve: name: approve build release permissions: {} runs-on: ubuntu-24.04 environment: builds timeout-minutes: 5 steps: - name: approved run: echo "Build release approved." meta: name: resolve metadata needs: approve runs-on: ubuntu-24.04 timeout-minutes: 5 permissions: contents: read outputs: build_version: ${{ steps.vars.outputs.build_version }} steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 env: GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 with: toolchain: "1.93.0" - name: set variables id: vars run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-app-proxy --step set_metadata --build-version "${{ inputs['build-version'] }}" build: name: build app-proxy (amd64) needs: meta runs-on: blacksmith-4vcpu-ubuntu-2404 timeout-minutes: 45 permissions: actions: read contents: read packages: write steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 env: GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 with: toolchain: "1.93.0" - name: prepare docker config run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-app-proxy --step prepare_docker_config - uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 - name: configure ghcr auth env: GHCR_USERNAME: ${{ github.actor }} GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-app-proxy --step configure_ghcr_auth - name: build and push image + extract assets env: BUILD_VERSION: ${{ needs.meta.outputs.build_version }} PUBLIC_ASSET_BASE_URL: https://fluxerstatic.com CACHE_FROM: type=gha,scope=fluxer-app-proxy CACHE_TO: type=gha,scope=fluxer-app-proxy,mode=max DOCKER_BUILD_SUMMARY: false DOCKER_BUILD_RECORD_UPLOAD: false run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-app-proxy --step build_and_extract - name: generate asset manifest run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-app-proxy --step generate_asset_manifest - name: upload assets to S3 static bucket env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} S3_ENDPOINT: https://ewr1.vultrobjects.com STATIC_BUCKET: fluxer-static run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-app-proxy --step upload_assets build-arm64: name: build app-proxy (arm64) needs: meta runs-on: blacksmith-4vcpu-ubuntu-2404-arm timeout-minutes: 60 permissions: actions: read contents: read packages: write steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 env: GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig - uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 - uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf with: context: . file: fluxer_app_proxy/Dockerfile push: true provenance: false platforms: linux/arm64 tags: ghcr.io/${{ env.GHCR_OWNER }}/fluxer-app-proxy:${{ needs.meta.outputs.build_version }}-arm64 build-args: | BUILD_VERSION=${{ needs.meta.outputs.build_version }} PUBLIC_ASSET_BASE_URL=https://fluxerstatic.com BUNDLE_LOCAL_ASSETS=false cache-from: type=gha,scope=fluxer-app-proxy-arm64 cache-to: type=gha,scope=fluxer-app-proxy-arm64,mode=max,ignore-error=true env: DOCKER_BUILD_SUMMARY: false DOCKER_BUILD_RECORD_UPLOAD: false merge: name: merge multi-arch manifest needs: [meta, build, build-arm64] runs-on: ubuntu-24.04 timeout-minutes: 10 permissions: contents: write packages: write steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 env: GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 with: toolchain: "1.93.0" - uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 - uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: fuse amd64 + arm64 into a multi-arch manifest env: IMAGE: ghcr.io/${{ env.GHCR_OWNER }}/fluxer-app-proxy VERSION: ${{ needs.meta.outputs.build_version }} run: | set -euo pipefail amd64_digest="$(docker buildx imagetools inspect "${IMAGE}:${VERSION}" --format '{{json .Manifest}}' | jq -r '.digest')" echo "amd64 digest: ${amd64_digest}" docker buildx imagetools create \ -t "${IMAGE}:${VERSION}" \ "${IMAGE}@${amd64_digest}" \ "${IMAGE}:${VERSION}-arm64" docker buildx imagetools inspect "${IMAGE}:${VERSION}" - name: Publish GitHub release env: GH_TOKEN: ${{ github.token }} SOURCE_SHA: ${{ github.sha }} VERSION: ${{ needs.meta.outputs.build_version }} RELEASE_BASELINE_SHA: ${{ vars.RELEASE_BASELINE_SHA }} run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- release publish --component fluxer-app-proxy --build-version "${VERSION}" --source-sha "${SOURCE_SHA}" --previous-sha "${RELEASE_BASELINE_SHA}" - name: Advance moving image tags env: IMAGE: ghcr.io/${{ env.GHCR_OWNER }}/fluxer-app-proxy VERSION: ${{ needs.meta.outputs.build_version }} run: >- docker buildx imagetools create -t "${IMAGE}:v1" -t "${IMAGE}:latest" "${IMAGE}:${VERSION}"