Files
rmm-openwrt/.github/workflows/release-server.yml
T
2026-07-31 00:28:22 +03:00

165 lines
5.6 KiB
YAML

name: Release server
on:
push:
tags: ["server-v*"]
workflow_dispatch:
permissions:
contents: write
packages: write
id-token: write
attestations: write
concurrency:
group: server-release-${{ github.ref }}
cancel-in-progress: false
jobs:
server:
name: Test and build server image
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Validate immutable signed server release
if: startsWith(github.ref, 'refs/tags/server-v')
shell: bash
run: |
set -euo pipefail
git cat-file -p "$GITHUB_REF_NAME" | grep -q -- '-----BEGIN PGP SIGNATURE-----'
bash scripts/extract-release-notes.sh \
"$GITHUB_REF_NAME" \
CHANGELOG.md \
release-notes.md
- name: Test server and web application
run: |
go test ./server/...
go vet ./server/...
npm run check:web
- name: Resolve image version
id: version
shell: bash
run: |
set -euo pipefail
if [[ "$GITHUB_REF" == refs/tags/server-v* ]]; then
version="${GITHUB_REF_NAME#server-v}"
else
version="sha-${GITHUB_SHA::12}"
fi
echo "value=${version}" >> "$GITHUB_OUTPUT"
- uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
if: startsWith(github.ref, 'refs/tags/server-v')
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and optionally publish server image
id: server_image
uses: docker/build-push-action@v6
with:
context: .
file: Dockerfile
push: ${{ startsWith(github.ref, 'refs/tags/server-v') }}
tags: |
ghcr.io/benya9669/openwrt-rmm-server:${{ steps.version.outputs.value }}
ghcr.io/benya9669/openwrt-rmm-server:latest
labels: |
org.opencontainers.image.title=OpenWrt RMM Server
org.opencontainers.image.source=https://github.com/Benya9669/openwrt-rmm
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.version=${{ steps.version.outputs.value }}
org.opencontainers.image.licenses=AGPL-3.0-only
build-args: |
RMM_SERVER_VERSION=${{ steps.version.outputs.value }}
RMM_SOURCE_REVISION=${{ github.sha }}
RMM_STABLE_AGENT_VERSION=0.6.8
cache-from: type=gha,scope=rmm-server
cache-to: type=gha,mode=max,scope=rmm-server
provenance: mode=max
sbom: true
- name: Build and optionally publish tunnel image
id: tunnel_image
uses: docker/build-push-action@v6
with:
context: deploy/tunnel
file: deploy/tunnel/Dockerfile
push: ${{ startsWith(github.ref, 'refs/tags/server-v') }}
tags: |
ghcr.io/benya9669/openwrt-rmm-tunnel:${{ steps.version.outputs.value }}
ghcr.io/benya9669/openwrt-rmm-tunnel:latest
labels: |
org.opencontainers.image.title=OpenWrt RMM Tunnel
org.opencontainers.image.source=https://github.com/Benya9669/openwrt-rmm
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.version=${{ steps.version.outputs.value }}
org.opencontainers.image.licenses=AGPL-3.0-only
cache-from: type=gha,scope=rmm-tunnel
cache-to: type=gha,mode=max,scope=rmm-tunnel
provenance: mode=max
sbom: true
- uses: sigstore/cosign-installer@v3
if: startsWith(github.ref, 'refs/tags/server-v')
- name: Sign published images with GitHub OIDC
if: startsWith(github.ref, 'refs/tags/server-v')
shell: bash
run: |
set -euo pipefail
cosign sign --yes \
"ghcr.io/benya9669/openwrt-rmm-server@${{ steps.server_image.outputs.digest }}"
cosign sign --yes \
"ghcr.io/benya9669/openwrt-rmm-tunnel@${{ steps.tunnel_image.outputs.digest }}"
- name: Attest server image provenance
if: startsWith(github.ref, 'refs/tags/server-v')
uses: actions/attest-build-provenance@v2
with:
subject-name: ghcr.io/benya9669/openwrt-rmm-server
subject-digest: ${{ steps.server_image.outputs.digest }}
push-to-registry: true
- name: Attest tunnel image provenance
if: startsWith(github.ref, 'refs/tags/server-v')
uses: actions/attest-build-provenance@v2
with:
subject-name: ghcr.io/benya9669/openwrt-rmm-tunnel
subject-digest: ${{ steps.tunnel_image.outputs.digest }}
push-to-registry: true
- name: Create GitHub release
if: startsWith(github.ref, 'refs/tags/server-v')
env:
GH_TOKEN: ${{ github.token }}
shell: bash
run: |
set -euo pipefail
if gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
echo "release already exists; published server tags are immutable" >&2
exit 1
fi
gh release create "$GITHUB_REF_NAME" \
--repo "$GITHUB_REPOSITORY" \
--notes-file release-notes.md \
--title "OpenWrt RMM Server ${GITHUB_REF_NAME#server-v}"