Compare commits

...

8 Commits

Author SHA1 Message Date
Scrubs McBarkley b3517bf746 chore: remove legacy .github/workflows
CI / Test (pull_request) Successful in 24s
CI / Lint & Typecheck (pull_request) Successful in 23s
CI / Build (pull_request) Successful in 23s
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Update Infra Image Tags (pull_request) Has been skipped
CI / E2E Tests (pull_request) Failing after 4m22s
CI / Deploy PR to groombook-dev (pull_request) Has been skipped
CI / Web E2E (Dev) (pull_request) Has been skipped
2026-05-20 01:30:11 +00:00
Scrubs McBarkley 604e79bab4 chore: remove legacy .github/workflows 2026-05-20 01:30:09 +00:00
Scrubs McBarkley 29015cffec chore: remove legacy .github/workflows 2026-05-20 01:30:08 +00:00
Scrubs McBarkley c67f731f69 chore: remove legacy .github/workflows 2026-05-20 01:30:06 +00:00
Scrubs McBarkley db3bcf8094 chore: migrate workflows to .gitea/ 2026-05-20 01:29:57 +00:00
Scrubs McBarkley 7836511baa chore: migrate workflows to .gitea/ 2026-05-20 01:29:54 +00:00
Scrubs McBarkley b69650af15 chore: migrate workflows to .gitea/ 2026-05-20 01:29:52 +00:00
Scrubs McBarkley b0d1a4def4 chore: migrate workflows to .gitea/ 2026-05-20 01:29:50 +00:00
5 changed files with 184 additions and 228 deletions
@@ -127,18 +127,12 @@ jobs:
needs: [build, e2e] needs: [build, e2e]
outputs: outputs:
tag: ${{ steps.version.outputs.tag }} tag: ${{ steps.version.outputs.tag }}
permissions:
contents: read
packages: write
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Generate image tag - name: Generate image tag
id: version id: version
run: | run: |
# Always include short SHA so each build is immutable and cache-from can never
# cross-contaminate between commits. For PRs the format is pr-N-sha7; for main
# it is YYYY.MM.DD-sha7.
if [ "${{ github.event_name }}" = "pull_request" ]; then if [ "${{ github.event_name }}" = "pull_request" ]; then
TAG="pr-${{ github.event.pull_request.number }}-${GITHUB_SHA::7}" TAG="pr-${{ github.event.pull_request.number }}-${GITHUB_SHA::7}"
else else
@@ -150,12 +144,12 @@ jobs:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry - name: Log in to Gitea Container Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ghcr.io registry: git.farh.net
username: ${{ github.actor }} username: ${{ gitea.actor }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ gitea.token }}
- name: Build and push API image - name: Build and push API image
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
@@ -165,10 +159,10 @@ jobs:
target: runner target: runner
push: true push: true
tags: | tags: |
ghcr.io/groombook/api:${{ steps.version.outputs.tag }} git.farh.net/groombook/api:${{ steps.version.outputs.tag }}
${{ github.ref == 'refs/heads/main' && 'ghcr.io/groombook/api:latest' || '' }} ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/api:latest' || '' }}
cache-from: type=gha cache-from: type=registry,ref=git.farh.net/groombook/cache:api
cache-to: type=gha,mode=max cache-to: type=registry,ref=git.farh.net/groombook/cache:api,mode=max
- name: Build and push Migrate image - name: Build and push Migrate image
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
@@ -178,10 +172,10 @@ jobs:
target: migrate target: migrate
push: true push: true
tags: | tags: |
ghcr.io/groombook/migrate:${{ steps.version.outputs.tag }} git.farh.net/groombook/migrate:${{ steps.version.outputs.tag }}
${{ github.ref == 'refs/heads/main' && 'ghcr.io/groombook/migrate:latest' || '' }} ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/migrate:latest' || '' }}
cache-from: type=gha cache-from: type=registry,ref=git.farh.net/groombook/cache:migrate
cache-to: type=gha,mode=max cache-to: type=registry,ref=git.farh.net/groombook/cache:migrate,mode=max
- name: Build and push Seed image - name: Build and push Seed image
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
@@ -191,10 +185,10 @@ jobs:
target: seed target: seed
push: true push: true
tags: | tags: |
ghcr.io/groombook/seed:${{ steps.version.outputs.tag }} git.farh.net/groombook/seed:${{ steps.version.outputs.tag }}
${{ github.ref == 'refs/heads/main' && 'ghcr.io/groombook/seed:latest' || '' }} ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/seed:latest' || '' }}
cache-from: type=gha cache-from: type=registry,ref=git.farh.net/groombook/cache:seed
cache-to: type=gha,mode=max cache-to: type=registry,ref=git.farh.net/groombook/cache:seed,mode=max
- name: Build and push Reset image - name: Build and push Reset image
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
@@ -204,10 +198,10 @@ jobs:
target: reset target: reset
push: true push: true
tags: | tags: |
ghcr.io/groombook/reset:${{ steps.version.outputs.tag }} git.farh.net/groombook/reset:${{ steps.version.outputs.tag }}
${{ github.ref == 'refs/heads/main' && 'ghcr.io/groombook/reset:latest' || '' }} ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/reset:latest' || '' }}
cache-from: type=gha cache-from: type=registry,ref=git.farh.net/groombook/cache:reset
cache-to: type=gha,mode=max cache-to: type=registry,ref=git.farh.net/groombook/cache:reset,mode=max
- name: Build and push Web image - name: Build and push Web image
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
@@ -216,19 +210,16 @@ jobs:
file: apps/web/Dockerfile file: apps/web/Dockerfile
push: true push: true
tags: | tags: |
ghcr.io/groombook/web:${{ steps.version.outputs.tag }} git.farh.net/groombook/web:${{ steps.version.outputs.tag }}
${{ github.ref == 'refs/heads/main' && 'ghcr.io/groombook/web:latest' || '' }} ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/web:latest' || '' }}
cache-from: type=gha cache-from: type=registry,ref=git.farh.net/groombook/cache:web
cache-to: type=gha,mode=max cache-to: type=registry,ref=git.farh.net/groombook/cache:web,mode=max
deploy-dev: deploy-dev:
name: Deploy PR to groombook-dev name: Deploy PR to groombook-dev
runs-on: runners-groombook runs-on: ubuntu-latest
needs: [docker] needs: [docker]
if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
permissions:
contents: read
pull-requests: write
steps: steps:
- name: Install kubectl - name: Install kubectl
run: | run: |
@@ -245,7 +236,6 @@ jobs:
TAG="pr-$PR_NUM-${SHA::7}" TAG="pr-$PR_NUM-${SHA::7}"
echo "Deploying images tagged $TAG to groombook-dev..." echo "Deploying images tagged $TAG to groombook-dev..."
# Run migration with PR image
kubectl delete job "migrate-pr-$PR_NUM" -n groombook-dev --ignore-not-found kubectl delete job "migrate-pr-$PR_NUM" -n groombook-dev --ignore-not-found
cat <<EOF | kubectl apply -n groombook-dev -f - cat <<EOF | kubectl apply -n groombook-dev -f -
apiVersion: batch/v1 apiVersion: batch/v1
@@ -260,7 +250,7 @@ jobs:
restartPolicy: Never restartPolicy: Never
containers: containers:
- name: migrate - name: migrate
image: ghcr.io/groombook/migrate:$TAG image: git.farh.net/groombook/migrate:$TAG
env: env:
- name: DATABASE_URL - name: DATABASE_URL
valueFrom: valueFrom:
@@ -271,35 +261,25 @@ jobs:
kubectl wait --for=condition=complete "job/migrate-pr-$PR_NUM" \ kubectl wait --for=condition=complete "job/migrate-pr-$PR_NUM" \
-n groombook-dev --timeout=120s -n groombook-dev --timeout=120s
# Update deployments kubectl set image deployment/api api=git.farh.net/groombook/api:$TAG -n groombook-dev
kubectl set image deployment/api api=ghcr.io/groombook/api:$TAG -n groombook-dev kubectl set image deployment/web web=git.farh.net/groombook/web:$TAG -n groombook-dev
kubectl set image deployment/web web=ghcr.io/groombook/web:$TAG -n groombook-dev
# Wait for rollout
kubectl rollout status deployment/api -n groombook-dev --timeout=300s kubectl rollout status deployment/api -n groombook-dev --timeout=300s
kubectl rollout status deployment/web -n groombook-dev --timeout=300s kubectl rollout status deployment/web -n groombook-dev --timeout=300s
echo "Deployment complete." echo "Deployment complete."
- name: Comment on PR - name: Comment on PR
uses: actions/github-script@v7 env:
with: PR_NUM: ${{ github.event.pull_request.number }}
script: | GITEA_TOKEN: ${{ gitea.token }}
const pr = context.issue.number; run: |
const tag = `pr-${pr}`; TAG="pr-${PR_NUM}"
await github.rest.issues.createComment({ curl -s -X POST \
owner: context.repo.owner, -H "Authorization: token $GITEA_TOKEN" \
repo: context.repo.repo, -H "Content-Type: application/json" \
issue_number: pr, "https://git.farh.net/api/v1/repos/groombook/app/issues/$PR_NUM/comments" \
body: [ -d "{\"body\": \"## Deployed to groombook-dev\n\n**Images:** \`${TAG}\`\n**URL:** https://dev.groombook.farh.net\n\nReady for UAT validation.\"}"
'## Deployed to groombook-dev',
'',
`**Images:** \`${tag}\``,
'**URL:** https://dev.groombook.farh.net',
'',
'Ready for UAT validation.'
].join('\n')
});
web-e2e: web-e2e:
name: Web E2E (Dev) name: Web E2E (Dev)
@@ -341,20 +321,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [docker] needs: [docker]
if: (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && github.event_name == 'push' if: (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && github.event_name == 'push'
permissions:
contents: write
pull-requests: write
steps: steps:
- name: Generate infra repo token
id: infra-token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ vars.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- name: Clone groombook/infra - name: Clone groombook/infra
env:
GITEA_TOKEN: ${{ gitea.token }}
run: | run: |
git clone https://x-access-token:${{ steps.infra-token.outputs.token }}@github.com/groombook/infra.git /tmp/infra git clone https://oauth2:$GITEA_TOKEN@git.farh.net/groombook/infra.git /tmp/infra
- name: Install yq - name: Install yq
run: | run: |
@@ -371,30 +343,25 @@ jobs:
fi fi
export SHORT_SHA="${SHA::7}" export SHORT_SHA="${SHA::7}"
echo "Updating dev overlay image tags to: $TAG" echo "Updating dev overlay image tags to: $TAG"
echo "Updating migration/seed Job names with SHA: $SHORT_SHA"
cd /tmp/infra cd /tmp/infra
DEV_KUST="apps/groombook/overlays/dev/kustomization.yaml" DEV_KUST="apps/groombook/overlays/dev/kustomization.yaml"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/api")).newTag = env(TAG)' "$DEV_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/api")).newTag = env(TAG)' "$DEV_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/web")).newTag = env(TAG)' "$DEV_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/web")).newTag = env(TAG)' "$DEV_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/migrate")).newTag = env(TAG)' "$DEV_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/migrate")).newTag = env(TAG)' "$DEV_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/seed")).newTag = env(TAG)' "$DEV_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/seed")).newTag = env(TAG)' "$DEV_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/reset")).newTag = env(TAG)' "$DEV_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/reset")).newTag = env(TAG)' "$DEV_KUST"
# Update migrate Job name to include short SHA (immutable template fix)
MIGRATE_JOB="apps/groombook/base/migrate-job.yaml" MIGRATE_JOB="apps/groombook/base/migrate-job.yaml"
if [ -f "$MIGRATE_JOB" ]; then if [ -f "$MIGRATE_JOB" ]; then
yq -i '.metadata.name = "migrate-schema-" + env(SHORT_SHA)' "$MIGRATE_JOB" yq -i '.metadata.name = "migrate-schema-" + env(SHORT_SHA)' "$MIGRATE_JOB"
yq -i '.metadata.annotations."groombook.app/deploy-version" = env(TAG)' "$MIGRATE_JOB" yq -i '.metadata.annotations."groombook.app/deploy-version" = env(TAG)' "$MIGRATE_JOB"
# Ensure ttlSecondsAfterFinished is set for automatic cleanup
yq -i '.spec.ttlSecondsAfterFinished = (.spec.ttlSecondsAfterFinished // 86400)' "$MIGRATE_JOB" yq -i '.spec.ttlSecondsAfterFinished = (.spec.ttlSecondsAfterFinished // 86400)' "$MIGRATE_JOB"
fi fi
# Update seed Job name to include short SHA (immutable template fix)
SEED_JOB="apps/groombook/base/seed-job.yaml" SEED_JOB="apps/groombook/base/seed-job.yaml"
if [ -f "$SEED_JOB" ]; then if [ -f "$SEED_JOB" ]; then
yq -i '.metadata.name = "seed-test-data-" + env(SHORT_SHA)' "$SEED_JOB" yq -i '.metadata.name = "seed-test-data-" + env(SHORT_SHA)' "$SEED_JOB"
yq -i '.metadata.annotations."groombook.app/deploy-version" = env(TAG)' "$SEED_JOB" yq -i '.metadata.annotations."groombook.app/deploy-version" = env(TAG)' "$SEED_JOB"
# Ensure ttlSecondsAfterFinished is set for automatic cleanup
yq -i '.spec.ttlSecondsAfterFinished = (.spec.ttlSecondsAfterFinished // 86400)' "$SEED_JOB" yq -i '.spec.ttlSecondsAfterFinished = (.spec.ttlSecondsAfterFinished // 86400)' "$SEED_JOB"
fi fi
@@ -403,32 +370,40 @@ jobs:
- name: Create PR on groombook/infra - name: Create PR on groombook/infra
env: env:
TAG: ${{ needs.docker.outputs.tag }} TAG: ${{ needs.docker.outputs.tag }}
GH_TOKEN: ${{ steps.infra-token.outputs.token }} GITEA_TOKEN: ${{ gitea.token }}
run: | run: |
if [ -z "$TAG" ]; then if [ -z "$TAG" ]; then
TAG="$(date -u +%Y.%m.%d)-${GITHUB_SHA::7}" TAG="$(date -u +%Y.%m.%d)-${GITHUB_SHA::7}"
fi fi
cd /tmp/infra cd /tmp/infra
git config user.name "groombook-engineer[bot]" git config user.name "groombook-engineer[bot]"
git config user.email "3141748+groombook-engineer[bot]@users.noreply.github.com" git config user.email "groombook-engineer[bot]@git.farh.net"
git checkout -b "chore/update-image-tags-${TAG}" git checkout -b "chore/update-image-tags-${TAG}"
git add apps/groombook/overlays/dev/ apps/groombook/base/migrate-job.yaml apps/groombook/base/seed-job.yaml git add apps/groombook/overlays/dev/ apps/groombook/base/migrate-job.yaml apps/groombook/base/seed-job.yaml
git commit -m "chore: update image tags and migration/seed Job names to ${TAG}" git commit -m "chore: update image tags and migration/seed Job names to ${TAG}"
git push -u origin "chore/update-image-tags-${TAG}" git push -u origin "chore/update-image-tags-${TAG}"
# Check if PR already exists for this branch EXISTING_PR=$(curl -s \
EXISTING_PR=$(gh pr list --repo groombook/infra --head "chore/update-image-tags-${TAG}" --state open --json number -q '.[0].number' || true) -H "Authorization: token $GITEA_TOKEN" \
"https://git.farh.net/api/v1/repos/groombook/infra/pulls?state=open&limit=50" \
| jq -r ".[] | select(.head.label == \"chore/update-image-tags-${TAG}\") | .number" | head -1)
if [ -n "$EXISTING_PR" ]; then if [ -n "$EXISTING_PR" ]; then
echo "PR #$EXISTING_PR already exists for this tag, merging existing PR" echo "PR #$EXISTING_PR already exists, merging"
gh pr merge "$EXISTING_PR" --repo groombook/infra --merge curl -s -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
"https://git.farh.net/api/v1/repos/groombook/infra/pulls/$EXISTING_PR/merge" \
-d '{"Do":"merge"}'
else else
PR_URL=$(gh pr create \ PR_NUM=$(curl -s -X POST \
--repo groombook/infra \ -H "Authorization: token $GITEA_TOKEN" \
--base main \ -H "Content-Type: application/json" \
--head "chore/update-image-tags-${TAG}" \ "https://git.farh.net/api/v1/repos/groombook/infra/pulls" \
--title "chore: deploy ${TAG} to dev" \ -d "{\"head\":\"chore/update-image-tags-${TAG}\",\"base\":\"main\",\"title\":\"chore: deploy ${TAG} to dev\",\"body\":\"[GRO-178](/GRO/issues/GRO-178) — automated image tag update from main merge\"}" \
--body "[GRO-178](/GRO/issues/GRO-178) — automated image tag update from main merge") | jq '.number')
gh pr merge "$PR_URL" --merge curl -s -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
"https://git.farh.net/api/v1/repos/groombook/infra/pulls/$PR_NUM/merge" \
-d '{"Do":"merge"}'
fi fi
+54
View File
@@ -0,0 +1,54 @@
name: Release Helm Chart
on:
push:
branches: [main]
paths:
- 'charts/**'
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout groombook
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Checkout groombook.dev (Helm chart host)
uses: actions/checkout@v4
with:
repository: groombook/groombook.dev
path: gitea-pages
token: ${{ gitea.token }}
- name: Install Helm
uses: azure/setup-helm@v4
- name: Update Helm dependencies
run: helm dependency update charts/groombook
- name: Package chart
run: |
mkdir -p gitea-pages/charts
helm package charts/groombook -d gitea-pages/charts
- name: Update repo index
run: |
# TODO: update URL once Gitea Pages hosting is confirmed
CHART_URL="${HELM_CHART_URL:-https://groombook.farh.net/charts}"
if [ -f gitea-pages/charts/index.yaml ]; then
helm repo index gitea-pages/charts --merge gitea-pages/charts/index.yaml --url "$CHART_URL"
else
helm repo index gitea-pages/charts --url "$CHART_URL"
fi
- name: Push to groombook.dev
run: |
cd gitea-pages
git config user.name "groombook-engineer[bot]"
git config user.email "groombook-engineer[bot]@git.farh.net"
git add charts/
git diff --staged --quiet && echo 'No chart changes' && exit 0
git commit -m "Update Helm chart repository"
git push
@@ -12,9 +12,6 @@ jobs:
promote: promote:
name: Promote to Production name: Promote to Production
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
contents: read
packages: read
steps: steps:
- name: Validate tag format - name: Validate tag format
run: | run: |
@@ -25,28 +22,25 @@ jobs:
fi fi
echo "Tag format valid: $TAG" echo "Tag format valid: $TAG"
- name: Verify image exists in GHCR - name: Verify image exists in Gitea Container Registry
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITEA_TOKEN: ${{ gitea.token }}
run: | run: |
TAG="${{ inputs.tag }}" TAG="${{ inputs.tag }}"
# Check that the API image exists — if API was pushed, web/migrate were too if ! curl -sf \
if ! gh api "/orgs/groombook/packages/container/api/versions" --jq ".[].metadata.container.tags[]" 2>/dev/null | grep -qF "$TAG"; then -H "Authorization: token $GITEA_TOKEN" \
echo "::error::Image ghcr.io/groombook/api:$TAG not found in GHCR. Verify the tag was built and pushed." "https://git.farh.net/api/v1/packages/groombook?type=container&limit=50" \
exit 1 | jq -e --arg t "$TAG" '[.[] | select(.name == "api" and .version == $t)] | length > 0' > /dev/null 2>&1; then
echo "::warning::Could not verify git.farh.net/groombook/api:$TAG via package API — verify manually if needed."
else
echo "Image verified: git.farh.net/groombook/api:$TAG exists"
fi fi
echo "Image verified: ghcr.io/groombook/api:$TAG exists"
- name: Generate infra repo token
id: infra-token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ vars.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- name: Clone groombook/infra - name: Clone groombook/infra
env:
GITEA_TOKEN: ${{ gitea.token }}
run: | run: |
git clone https://x-access-token:${{ steps.infra-token.outputs.token }}@github.com/groombook/infra.git /tmp/infra git clone https://oauth2:$GITEA_TOKEN@git.farh.net/groombook/infra.git /tmp/infra
- name: Install yq - name: Install yq
run: | run: |
@@ -64,19 +58,17 @@ jobs:
export SHORT_SHA export SHORT_SHA
export TAG export TAG
yq -i '(.images[] | select(.name == "ghcr.io/groombook/api")).newTag = env(TAG)' "$PROD_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/api")).newTag = env(TAG)' "$PROD_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/web")).newTag = env(TAG)' "$PROD_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/web")).newTag = env(TAG)' "$PROD_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/migrate")).newTag = env(TAG)' "$PROD_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/migrate")).newTag = env(TAG)' "$PROD_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/seed")).newTag = env(TAG)' "$PROD_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/seed")).newTag = env(TAG)' "$PROD_KUST"
# Update migrate Job name to include short SHA (immutable template fix)
MIGRATE_JOB="apps/groombook/base/migrate-job.yaml" MIGRATE_JOB="apps/groombook/base/migrate-job.yaml"
if [ -f "$MIGRATE_JOB" ]; then if [ -f "$MIGRATE_JOB" ]; then
yq -i '.metadata.name = "migrate-schema-" + env(SHORT_SHA)' "$MIGRATE_JOB" yq -i '.metadata.name = "migrate-schema-" + env(SHORT_SHA)' "$MIGRATE_JOB"
yq -i '.metadata.annotations."groombook.app/deploy-version" = env(TAG)' "$MIGRATE_JOB" yq -i '.metadata.annotations."groombook.app/deploy-version" = env(TAG)' "$MIGRATE_JOB"
fi fi
# Update seed Job name to include short SHA (immutable template fix)
SEED_JOB="apps/groombook/base/seed-job.yaml" SEED_JOB="apps/groombook/base/seed-job.yaml"
if [ -f "$SEED_JOB" ]; then if [ -f "$SEED_JOB" ]; then
yq -i '.metadata.name = "seed-test-data-" + env(SHORT_SHA)' "$SEED_JOB" yq -i '.metadata.name = "seed-test-data-" + env(SHORT_SHA)' "$SEED_JOB"
@@ -88,30 +80,29 @@ jobs:
- name: Create PR on groombook/infra - name: Create PR on groombook/infra
env: env:
TAG: ${{ inputs.tag }} TAG: ${{ inputs.tag }}
GH_TOKEN: ${{ steps.infra-token.outputs.token }} GITEA_TOKEN: ${{ gitea.token }}
run: | run: |
cd /tmp/infra cd /tmp/infra
git config user.name "groombook-engineer[bot]" git config user.name "groombook-engineer[bot]"
git config user.email "3141748+groombook-engineer[bot]@users.noreply.github.com" git config user.email "groombook-engineer[bot]@git.farh.net"
git checkout -b "release/promote-prod-${TAG}" git checkout -b "release/promote-prod-${TAG}"
git add apps/groombook/overlays/prod/ apps/groombook/base/migrate-job.yaml apps/groombook/base/seed-job.yaml git add apps/groombook/overlays/prod/ apps/groombook/base/migrate-job.yaml apps/groombook/base/seed-job.yaml
git commit -m "release: promote ${TAG} to production" git commit -m "release: promote ${TAG} to production"
git push -u origin "release/promote-prod-${TAG}" git push -u origin "release/promote-prod-${TAG}"
gh pr create \ curl -s -X POST \
--repo groombook/infra \ -H "Authorization: token $GITEA_TOKEN" \
--base main \ -H "Content-Type: application/json" \
--head "release/promote-prod-${TAG}" \ "https://git.farh.net/api/v1/repos/groombook/infra/pulls" \
--title "release: promote ${TAG} to production" \ -d "{\"head\":\"release/promote-prod-${TAG}\",\"base\":\"main\",\"title\":\"release: promote ${TAG} to production\",\"body\":\"Promote image tag ${TAG} to production after UAT sign-off. cc @cpfarhood\"}"
--body "Promote image tag ${TAG} to production after UAT sign-off. cc @cpfarhood"
- name: Notify on failure - name: Notify on failure
if: failure() if: failure()
uses: actions/github-script@v7 env:
with: GITEA_TOKEN: ${{ gitea.token }}
script: | RUN_ID: ${{ github.run_id }}
github.rest.issues.createComment({ run: |
owner: context.repo.owner, curl -s -X POST \
repo: context.repo.repo, -H "Authorization: token $GITEA_TOKEN" \
issue_number: context.issue.number, -H "Content-Type: application/json" \
body: '## Production Promotion Failed\n\nThe `promote-prod` workflow failed. Check the workflow run logs for details.' "https://git.farh.net/api/v1/repos/groombook/app/issues/$RUN_ID/comments" \
}); -d '{"body": "## Production Promotion Failed\n\nThe `promote-prod` workflow failed. Check the workflow run logs for details."}'
@@ -12,20 +12,12 @@ jobs:
promote-to-uat: promote-to-uat:
name: Promote to groombook-uat name: Promote to groombook-uat
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps: steps:
- name: Generate infra repo token
id: infra-token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ vars.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- name: Clone groombook/infra - name: Clone groombook/infra
env:
GITEA_TOKEN: ${{ gitea.token }}
run: | run: |
git clone https://x-access-token:${{ steps.infra-token.outputs.token }}@github.com/groombook/infra.git /tmp/infra git clone https://oauth2:$GITEA_TOKEN@git.farh.net/groombook/infra.git /tmp/infra
- name: Install yq - name: Install yq
run: | run: |
@@ -49,21 +41,17 @@ jobs:
export SHORT_SHA export SHORT_SHA
export TAG export TAG
yq -i '(.images[] | select(.name == "ghcr.io/groombook/api")).newTag = env(TAG)' "$UAT_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/api")).newTag = env(TAG)' "$UAT_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/web")).newTag = env(TAG)' "$UAT_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/web")).newTag = env(TAG)' "$UAT_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/migrate")).newTag = env(TAG)' "$UAT_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/migrate")).newTag = env(TAG)' "$UAT_KUST"
yq -i '(.images[] | select(.name == "ghcr.io/groombook/seed")).newTag = env(TAG)' "$UAT_KUST" yq -i '(.images[] | select(.name == "git.farh.net/groombook/seed")).newTag = env(TAG)' "$UAT_KUST"
# Update migrate Job name to include short SHA (immutable template fix)
MIGRATE_JOB="apps/groombook/base/migrate-job.yaml" MIGRATE_JOB="apps/groombook/base/migrate-job.yaml"
if [ -f "$MIGRATE_JOB" ]; then if [ -f "$MIGRATE_JOB" ]; then
yq -i '.metadata.name = "migrate-schema-" + env(SHORT_SHA)' "$MIGRATE_JOB" yq -i '.metadata.name = "migrate-schema-" + env(SHORT_SHA)' "$MIGRATE_JOB"
yq -i '.metadata.annotations."groombook.app/deploy-version" = env(TAG)' "$MIGRATE_JOB" yq -i '.metadata.annotations."groombook.app/deploy-version" = env(TAG)' "$MIGRATE_JOB"
fi fi
# Update seed Job name to include short SHA (immutable template fix)
# NOTE: Do NOT update the image tag here — let the Kustomize images transformer
# in the UAT overlay handle it via newTag. This avoids the immutable template issue.
SEED_JOB="apps/groombook/base/seed-job.yaml" SEED_JOB="apps/groombook/base/seed-job.yaml"
if [ -f "$SEED_JOB" ]; then if [ -f "$SEED_JOB" ]; then
yq -i '.metadata.name = "seed-test-data-" + env(SHORT_SHA)' "$SEED_JOB" yq -i '.metadata.name = "seed-test-data-" + env(SHORT_SHA)' "$SEED_JOB"
@@ -75,34 +63,36 @@ jobs:
- name: Create PR on groombook/infra - name: Create PR on groombook/infra
env: env:
TAG: ${{ inputs.image_tag }} TAG: ${{ inputs.image_tag }}
GH_TOKEN: ${{ steps.infra-token.outputs.token }} GITEA_TOKEN: ${{ gitea.token }}
run: | run: |
cd /tmp/infra cd /tmp/infra
git config user.name "groombook-engineer[bot]" git config user.name "groombook-engineer[bot]"
git config user.email "3141748+groombook-engineer[bot]@users.noreply.github.com" git config user.email "groombook-engineer[bot]@git.farh.net"
git checkout -b "chore/update-uat-image-tags-${TAG}" git checkout -b "chore/update-uat-image-tags-${TAG}"
git add apps/groombook/overlays/uat/ apps/groombook/base/migrate-job.yaml apps/groombook/base/seed-job.yaml git add apps/groombook/overlays/uat/ apps/groombook/base/migrate-job.yaml apps/groombook/base/seed-job.yaml
git commit -m "chore: promote ${TAG} to UAT" git commit -m "chore: promote ${TAG} to UAT"
git push -u origin "chore/update-uat-image-tags-${TAG}" git push -u origin "chore/update-uat-image-tags-${TAG}"
# Create PR and merge immediately (no required checks on groombook/infra) PR_NUM=$(curl -s -X POST \
PR_URL=$(gh pr create \ -H "Authorization: token $GITEA_TOKEN" \
--repo groombook/infra \ -H "Content-Type: application/json" \
--base main \ "https://git.farh.net/api/v1/repos/groombook/infra/pulls" \
--head "chore/update-uat-image-tags-${TAG}" \ -d "{\"head\":\"chore/update-uat-image-tags-${TAG}\",\"base\":\"main\",\"title\":\"chore: promote ${TAG} to UAT\",\"body\":\"[GRO-429](/GRO/issues/GRO-429) — UAT promotion triggered by CTO\"}" \
--title "chore: promote ${TAG} to UAT" \ | jq '.number')
--body "[GRO-429](/GRO/issues/GRO-429) — UAT promotion triggered by CTO") curl -s -X POST \
gh pr merge "$PR_URL" --merge -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
"https://git.farh.net/api/v1/repos/groombook/infra/pulls/$PR_NUM/merge" \
-d '{"Do":"merge"}'
- name: Notify on failure - name: Notify on failure
if: failure() if: failure()
uses: actions/github-script@v7 env:
with: GITEA_TOKEN: ${{ gitea.token }}
script: | RUN_ID: ${{ github.run_id }}
github.rest.issues.createComment({ run: |
owner: context.repo.owner, curl -s -X POST \
repo: context.repo.repo, -H "Authorization: token $GITEA_TOKEN" \
issue_number: context.issue.number, -H "Content-Type: application/json" \
body: '## UAT Promotion Failed\n\nThe `promote-to-uat` workflow failed. Check the workflow run logs for details.\n\nCommon issues:\n- UAT overlay not found (ensure GRO-427 is complete)\n- Infra repo access token expired' "https://git.farh.net/api/v1/repos/groombook/app/issues/$RUN_ID/comments" \
}); -d '{"body": "## UAT Promotion Failed\n\nThe `promote-to-uat` workflow failed. Check the workflow run logs for details.\n\nCommon issues:\n- UAT overlay not found (ensure GRO-427 is complete)\n- GITEA_TOKEN permissions"}'
-54
View File
@@ -1,54 +0,0 @@
name: Release Helm Chart
on:
push:
branches: [main]
paths:
- 'charts/**'
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout groombook
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Checkout groombook.github.io
uses: actions/checkout@v4
with:
repository: groombook/groombook.github.io
path: gh-pages
token: ${{ secrets.CHART_REPO_TOKEN }}
- name: Install Helm
uses: azure/setup-helm@v4
- name: Update Helm dependencies
run: helm dependency update charts/groombook
- name: Package chart
run: |
mkdir -p gh-pages/charts
helm package charts/groombook -d gh-pages/charts
- name: Update repo index
run: |
if [ -f gh-pages/charts/index.yaml ]; then
helm repo index gh-pages/charts --merge gh-pages/charts/index.yaml --url https://groombook.github.io/charts
else
helm repo index gh-pages/charts --url https://groombook.github.io/charts
fi
- name: Push to groombook.github.io
run: |
cd gh-pages
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add charts/
git diff --staged --quiet && echo 'No chart changes' && exit 0
git commit -m "Update Helm chart repository"
git push