diff --git a/.gitea/workflows/publish-images.yml b/.gitea/workflows/publish-images.yml new file mode 100644 index 0000000..f3c6be8 --- /dev/null +++ b/.gitea/workflows/publish-images.yml @@ -0,0 +1,137 @@ +--- +name: publish images + +on: + push: + branches: [main] + paths: + - '.gitea/workflows/publish-images.yml' + - 'config/**' + - 'container/**' + - 'scripts/**' + - 'src/**' + - 'pyproject.toml' + - 'README.md' + workflow_dispatch: + +jobs: + publish-images: + name: publish-images + runs-on: [self-hosted, pod] + timeout-minutes: 45 + permissions: + contents: read + env: + PUSH_REGISTRY: zot-push.ad.ddupan.top + PULL_REGISTRY: zot.ad.ddupan.top + CONTROLLER_REPOSITORY: panxiao81/gitea-dynamic-runner-controller + RUNNER_REPOSITORY: panxiao81/gitea-dynamic-runner-runner + SPIRE_AGENT_SOCKET: /run/spire/agent-sockets/spire-agent.sock + steps: + - uses: actions/checkout@v4 + + - name: Test source + shell: bash + run: | + set -euo pipefail + python3 -m pip install --break-system-packages -e '.[test]' + pytest -q + python3 -m compileall -q src tests + apt-get update + apt-get install --yes --no-install-recommends shellcheck + shellcheck scripts/* + + - name: Start Docker + shell: bash + run: | + set -euo pipefail + dockerd >/tmp/dockerd.log 2>&1 & + for _ in $(seq 1 60); do + if docker info >/dev/null 2>&1; then + exit 0 + fi + if ! kill -0 "$!" 2>/dev/null; then + cat /tmp/dockerd.log >&2 + exit 1 + fi + sleep 1 + done + cat /tmp/dockerd.log >&2 + exit 1 + + - name: Build and publish + shell: bash + run: | + set -euo pipefail + set +x + + : "${GITHUB_SHA:?GITHUB_SHA is required}" + image_tag="sha-${GITHUB_SHA}" + docker_config=$(mktemp -d) + jwt_file=$(mktemp) + cleanup() { + rm -rf -- "$docker_config" "$jwt_file" + docker buildx rm ci-builder >/dev/null 2>&1 || true + } + trap cleanup EXIT + export DOCKER_CONFIG="$docker_config" + + /opt/spire/bin/spire-agent api fetch jwt \ + -audience zot \ + -socketPath "$SPIRE_AGENT_SOCKET" \ + -output json >"$jwt_file" + # shellcheck disable=SC2016 + jq -er '.[0].svids[0].svid' "$jwt_file" | \ + docker login "$PUSH_REGISTRY" --username zot --password-stdin + + docker buildx create --name ci-builder --driver docker-container --use + + publish() { + local repository=$1 + local dockerfile=$2 + local metadata=$3 + docker buildx build \ + --builder ci-builder \ + --platform linux/amd64 \ + --file "$dockerfile" \ + --tag "${PUSH_REGISTRY}/${repository}:${image_tag}" \ + --tag "${PUSH_REGISTRY}/${repository}:main" \ + --provenance=mode=max \ + --sbom=true \ + --metadata-file "$metadata" \ + --push \ + . + } + + publish \ + "$CONTROLLER_REPOSITORY" \ + container/controller.Dockerfile \ + controller-metadata.json + publish \ + "$RUNNER_REPOSITORY" \ + container/runner.Dockerfile \ + runner-metadata.json + + controller_digest=$( + # shellcheck disable=SC2016 + jq -er '."containerimage.digest"' controller-metadata.json + ) + runner_digest=$( + # shellcheck disable=SC2016 + jq -er '."containerimage.digest"' runner-metadata.json + ) + controller_ref="${PULL_REGISTRY}/${CONTROLLER_REPOSITORY}@${controller_digest}" + runner_ref="${PULL_REGISTRY}/${RUNNER_REPOSITORY}@${runner_digest}" + + printf 'controller=%s\nrunner=%s\n' "$controller_ref" "$runner_ref" + if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then + { + printf '## Published images\n\n' + # shellcheck disable=SC2016 + printf -- '- Controller: `%s`\n' "$controller_ref" + # shellcheck disable=SC2016 + printf -- '- Runner: `%s`\n' "$runner_ref" + # shellcheck disable=SC2016 + printf -- '- Source: `%s`\n' "$GITHUB_SHA" + } >>"$GITHUB_STEP_SUMMARY" + fi diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml new file mode 100644 index 0000000..d025fdf --- /dev/null +++ b/.github/actionlint.yaml @@ -0,0 +1,5 @@ +--- +self-hosted-runner: + labels: + - pod + - vm diff --git a/scripts/gitea-microvm-guest-runner b/scripts/gitea-microvm-guest-runner index 041e33f..3e445c4 100755 --- a/scripts/gitea-microvm-guest-runner +++ b/scripts/gitea-microvm-guest-runner @@ -7,7 +7,7 @@ runner_name=${3:?runner name is required} runner_labels=${4:?runner labels are required} token_file=/run/gitea-runner-registration-token config_file=${GITEA_RUNNER_CONFIG_FILE:-/etc/gitea-runner/config-vm-bootstrap.yaml} -export HOME=${HOME:-/root} +export HOME="${HOME:-/root}" cleanup() { rm -f -- "$token_file"