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