Files
smartmate/.gitea/workflows/release-offline.yml

120 lines
3.9 KiB
YAML

name: offline-release
on:
workflow_dispatch:
inputs:
base_ref:
description: "Optional base ref for impact diff, defaults to HEAD^"
required: false
include_infra:
description: "Whether to pack infra bundle too"
required: false
default: "false"
jobs:
package-and-deploy:
runs-on: build-host
steps:
- name: Prepare local worktree
env:
SMARTFLOW_REPO_SLUG: ${{ gitea.repository }}
SMARTFLOW_REPO_SHA: ${{ gitea.sha }}
shell: bash
run: |
set -euo pipefail
repo_slug="${SMARTFLOW_REPO_SLUG,,}"
bare_repo="/srv/gitea/data/gitea/data/gitea-repositories/${repo_slug}.git"
worktree_root="/tmp/smartflow-actions"
worktree="${worktree_root}/${SMARTFLOW_REPO_SHA}"
if [[ ! -d "${bare_repo}" ]]; then
echo "gitea bare repo not found: ${bare_repo}" >&2
exit 65
fi
rm -rf "${worktree}"
mkdir -p "${worktree_root}"
git clone --no-checkout "${bare_repo}" "${worktree}"
git -C "${worktree}" checkout --force "${SMARTFLOW_REPO_SHA}"
git -C "${worktree}" clean -dffx
app_tag="$(git -C "${worktree}" rev-parse --short=12 HEAD)"
{
echo "APP_TAG=${app_tag}"
echo "SMARTFLOW_WORKTREE=${worktree}"
} >> "${GITHUB_ENV}"
- name: Resolve release base
shell: bash
run: |
set -euo pipefail
cd "${SMARTFLOW_WORKTREE}"
BASE_REF="${{ inputs.base_ref }}"
if [[ -z "${BASE_REF}" ]] && git rev-parse --verify --quiet HEAD^ >/dev/null; then
BASE_REF="$(git rev-parse HEAD^)"
fi
echo "BASE_REF=${BASE_REF}" >> "${GITHUB_ENV}"
- name: Build release plan
shell: bash
run: |
set -euo pipefail
cd "${SMARTFLOW_WORKTREE}"
./deploy/impact-rules.sh "${BASE_REF:-}" HEAD deploy/release-plan.env
cat deploy/release-plan.env
- name: Pack docker images
shell: bash
run: |
set -euo pipefail
cd "${SMARTFLOW_WORKTREE}"
source deploy/release-plan.env
args=(--app-tag "${APP_TAG}")
if [[ "${SMARTFLOW_BUILD_BACKEND}" != "1" ]]; then
args+=(--skip-backend)
fi
if [[ "${SMARTFLOW_BUILD_FRONTEND}" != "1" ]]; then
args+=(--skip-frontend)
fi
if [[ "${{ inputs.include_infra }}" == "true" ]]; then
args+=(--include-infra)
fi
./deploy/docker-pack.sh "${args[@]}"
- name: Stage release directory
shell: bash
run: |
set -euo pipefail
cd "${SMARTFLOW_WORKTREE}"
./deploy/stage-release.sh \
--release-dir ".release/${APP_TAG}" \
--plan-file "deploy/release-plan.env" \
--bundle-dir ".docker-bundles"
- name: Materialize release directory
shell: bash
run: |
set -euo pipefail
cd "${SMARTFLOW_WORKTREE}"
release_root="/srv/smartflow/releases/${APP_TAG}"
release_archive="/srv/smartflow/releases/${APP_TAG}.tgz"
mkdir -p /srv/smartflow/releases
rm -f "${release_archive}"
tar -C ".release/${APP_TAG}" -czf "${release_archive}" .
rm -rf "${release_root}"
mkdir -p "${release_root}"
tar -xzf "${release_archive}" -C "${release_root}"
rm -f "${release_archive}"
- name: Trigger deploy
shell: bash
run: |
set -euo pipefail
smartflow-release deploy "${APP_TAG}"
- name: Cleanup worktree
if: ${{ always() }}
shell: bash
run: |
set -euo pipefail
if [[ -n "${SMARTFLOW_WORKTREE:-}" && "${SMARTFLOW_WORKTREE}" == /tmp/smartflow-actions/* ]]; then
rm -rf "${SMARTFLOW_WORKTREE}"
fi