Skip to content

Commit c2414d5

Browse files
authored
chore: backport release freeze workflow to 2.27 (coder#20132)
Relates to coder/dogfood#189 Relates to coder/internal#1021 - Adds new script `scripts/should_deploy.sh` which implements the algorithm in the linked issue - Changes the `ci.yaml` workflow to run on release branches - Moves the deployment steps out of `ci.yaml` into a new workflow `deploy.yaml` for concurrency limiting purposes - Changes the behavior of image tag pushing slightly: - Versioned tags will no longer have a `main-` prefix - `main` branch will still push the `main` and `latest` tags - `release/x.y` branches will now push `release-x.y` tags - The deploy job will exit early if `should_deploy.sh` returns false - The deploy job will now retag whatever image it's about to deploy as `dogfood` (cherry picked from commit e5c8c9b)
1 parent ff69ed6 commit c2414d5

File tree

5 files changed

+280
-119
lines changed

5 files changed

+280
-119
lines changed

.github/workflows/ci.yaml

Lines changed: 37 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ on:
44
push:
55
branches:
66
- main
7+
- release/*
78

89
pull_request:
910
workflow_dispatch:
@@ -969,7 +970,7 @@ jobs:
969970
needs: changes
970971
# We always build the dylibs on Go changes to verify we're not merging unbuildable code,
971972
# but they need only be signed and uploaded on coder/coder main.
972-
if: needs.changes.outputs.go == 'true' || needs.changes.outputs.ci == 'true' || github.ref == 'refs/heads/main'
973+
if: needs.changes.outputs.go == 'true' || needs.changes.outputs.ci == 'true' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')
973974
runs-on: ${{ github.repository_owner == 'coder' && 'depot-macos-latest' || 'macos-latest' }}
974975
steps:
975976
# Harden Runner doesn't work on macOS
@@ -997,7 +998,7 @@ jobs:
997998
uses: ./.github/actions/setup-go
998999

9991000
- name: Install rcodesign
1000-
if: ${{ github.repository_owner == 'coder' && github.ref == 'refs/heads/main' }}
1001+
if: ${{ github.repository_owner == 'coder' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) }}
10011002
run: |
10021003
set -euo pipefail
10031004
wget -O /tmp/rcodesign.tar.gz https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-macos-universal.tar.gz
@@ -1008,7 +1009,7 @@ jobs:
10081009
rm /tmp/rcodesign.tar.gz
10091010
10101011
- name: Setup Apple Developer certificate and API key
1011-
if: ${{ github.repository_owner == 'coder' && github.ref == 'refs/heads/main' }}
1012+
if: ${{ github.repository_owner == 'coder' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) }}
10121013
run: |
10131014
set -euo pipefail
10141015
touch /tmp/{apple_cert.p12,apple_cert_password.txt,apple_apikey.p8}
@@ -1029,12 +1030,12 @@ jobs:
10291030
make gen/mark-fresh
10301031
make build/coder-dylib
10311032
env:
1032-
CODER_SIGN_DARWIN: ${{ github.ref == 'refs/heads/main' && '1' || '0' }}
1033+
CODER_SIGN_DARWIN: ${{ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && '1' || '0' }}
10331034
AC_CERTIFICATE_FILE: /tmp/apple_cert.p12
10341035
AC_CERTIFICATE_PASSWORD_FILE: /tmp/apple_cert_password.txt
10351036

10361037
- name: Upload build artifacts
1037-
if: ${{ github.repository_owner == 'coder' && github.ref == 'refs/heads/main' }}
1038+
if: ${{ github.repository_owner == 'coder' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) }}
10381039
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
10391040
with:
10401041
name: dylibs
@@ -1044,7 +1045,7 @@ jobs:
10441045
retention-days: 7
10451046

10461047
- name: Delete Apple Developer certificate and API key
1047-
if: ${{ github.repository_owner == 'coder' && github.ref == 'refs/heads/main' }}
1048+
if: ${{ github.repository_owner == 'coder' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) }}
10481049
run: rm -f /tmp/{apple_cert.p12,apple_cert_password.txt,apple_apikey.p8}
10491050

10501051
check-build:
@@ -1094,7 +1095,7 @@ jobs:
10941095
needs:
10951096
- changes
10961097
- build-dylib
1097-
if: github.ref == 'refs/heads/main' && needs.changes.outputs.docs-only == 'false' && !github.event.pull_request.head.repo.fork
1098+
if: (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && needs.changes.outputs.docs-only == 'false' && !github.event.pull_request.head.repo.fork
10981099
runs-on: ${{ github.repository_owner == 'coder' && 'depot-ubuntu-22.04-8' || 'ubuntu-22.04' }}
10991100
permissions:
11001101
# Necessary to push docker images to ghcr.io.
@@ -1247,40 +1248,45 @@ jobs:
12471248
id: build-docker
12481249
env:
12491250
CODER_IMAGE_BASE: ghcr.io/coder/coder-preview
1250-
CODER_IMAGE_TAG_PREFIX: main
12511251
DOCKER_CLI_EXPERIMENTAL: "enabled"
12521252
run: |
12531253
set -euxo pipefail
12541254
12551255
# build Docker images for each architecture
12561256
version="$(./scripts/version.sh)"
1257-
tag="main-${version//+/-}"
1257+
tag="${version//+/-}"
12581258
echo "tag=$tag" >> "$GITHUB_OUTPUT"
12591259
12601260
# build images for each architecture
12611261
# note: omitting the -j argument to avoid race conditions when pushing
12621262
make build/coder_"$version"_linux_{amd64,arm64,armv7}.tag
12631263
1264-
# only push if we are on main branch
1265-
if [ "${GITHUB_REF}" == "refs/heads/main" ]; then
1264+
# only push if we are on main branch or release branch
1265+
if [[ "${GITHUB_REF}" == "refs/heads/main" || "${GITHUB_REF}" == refs/heads/release/* ]]; then
12661266
# build and push multi-arch manifest, this depends on the other images
12671267
# being pushed so will automatically push them
12681268
# note: omitting the -j argument to avoid race conditions when pushing
12691269
make push/build/coder_"$version"_linux_{amd64,arm64,armv7}.tag
12701270
12711271
# Define specific tags
1272-
tags=("$tag" "main" "latest")
1272+
tags=("$tag")
1273+
if [ "${GITHUB_REF}" == "refs/heads/main" ]; then
1274+
tags+=("main" "latest")
1275+
elif [[ "${GITHUB_REF}" == refs/heads/release/* ]]; then
1276+
tags+=("release-${GITHUB_REF#refs/heads/release/}")
1277+
fi
12731278
12741279
# Create and push a multi-arch manifest for each tag
12751280
# we are adding `latest` tag and keeping `main` for backward
12761281
# compatibality
12771282
for t in "${tags[@]}"; do
1278-
# shellcheck disable=SC2046
1279-
./scripts/build_docker_multiarch.sh \
1280-
--push \
1281-
--target "ghcr.io/coder/coder-preview:$t" \
1282-
--version "$version" \
1283-
$(cat build/coder_"$version"_linux_{amd64,arm64,armv7}.tag)
1283+
echo "Pushing multi-arch manifest for tag: $t"
1284+
# shellcheck disable=SC2046
1285+
./scripts/build_docker_multiarch.sh \
1286+
--push \
1287+
--target "ghcr.io/coder/coder-preview:$t" \
1288+
--version "$version" \
1289+
$(cat build/coder_"$version"_linux_{amd64,arm64,armv7}.tag)
12841290
done
12851291
fi
12861292
@@ -1471,112 +1477,28 @@ jobs:
14711477
./build/*.deb
14721478
retention-days: 7
14731479

1480+
# Deploy is handled in deploy.yaml so we can apply concurrency limits.
14741481
deploy:
1475-
name: "deploy"
1476-
runs-on: ubuntu-latest
1477-
timeout-minutes: 30
14781482
needs:
14791483
- changes
14801484
- build
14811485
if: |
1482-
github.ref == 'refs/heads/main' && !github.event.pull_request.head.repo.fork
1486+
(github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/'))
14831487
&& needs.changes.outputs.docs-only == 'false'
1488+
&& !github.event.pull_request.head.repo.fork
1489+
uses: ./.github/workflows/deploy.yaml
1490+
with:
1491+
image: ${{ needs.build.outputs.IMAGE }}
14841492
permissions:
14851493
contents: read
14861494
id-token: write
1487-
steps:
1488-
- name: Harden Runner
1489-
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
1490-
with:
1491-
egress-policy: audit
1492-
1493-
- name: Checkout
1494-
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
1495-
with:
1496-
fetch-depth: 0
1497-
persist-credentials: false
1498-
1499-
- name: Authenticate to Google Cloud
1500-
uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0
1501-
with:
1502-
workload_identity_provider: ${{ vars.GCP_WORKLOAD_ID_PROVIDER }}
1503-
service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
1504-
1505-
- name: Set up Google Cloud SDK
1506-
uses: google-github-actions/setup-gcloud@aa5489c8933f4cc7a4f7d45035b3b1440c9c10db # v3.0.1
1507-
1508-
- name: Set up Flux CLI
1509-
uses: fluxcd/flux2/action@6bf37f6a560fd84982d67f853162e4b3c2235edb # v2.6.4
1510-
with:
1511-
# Keep this and the github action up to date with the version of flux installed in dogfood cluster
1512-
version: "2.5.1"
1513-
1514-
- name: Get Cluster Credentials
1515-
uses: google-github-actions/get-gke-credentials@3da1e46a907576cefaa90c484278bb5b259dd395 # v3.0.0
1516-
with:
1517-
cluster_name: dogfood-v2
1518-
location: us-central1-a
1519-
project_id: coder-dogfood-v2
1520-
1521-
- name: Reconcile Flux
1522-
run: |
1523-
set -euxo pipefail
1524-
flux --namespace flux-system reconcile source git flux-system
1525-
flux --namespace flux-system reconcile source git coder-main
1526-
flux --namespace flux-system reconcile kustomization flux-system
1527-
flux --namespace flux-system reconcile kustomization coder
1528-
flux --namespace flux-system reconcile source chart coder-coder
1529-
flux --namespace flux-system reconcile source chart coder-coder-provisioner
1530-
flux --namespace coder reconcile helmrelease coder
1531-
flux --namespace coder reconcile helmrelease coder-provisioner
1532-
1533-
# Just updating Flux is usually not enough. The Helm release may get
1534-
# redeployed, but unless something causes the Deployment to update the
1535-
# pods won't be recreated. It's important that the pods get recreated,
1536-
# since we use `imagePullPolicy: Always` to ensure we're running the
1537-
# latest image.
1538-
- name: Rollout Deployment
1539-
run: |
1540-
set -euxo pipefail
1541-
kubectl --namespace coder rollout restart deployment/coder
1542-
kubectl --namespace coder rollout status deployment/coder
1543-
kubectl --namespace coder rollout restart deployment/coder-provisioner
1544-
kubectl --namespace coder rollout status deployment/coder-provisioner
1545-
kubectl --namespace coder rollout restart deployment/coder-provisioner-tagged
1546-
kubectl --namespace coder rollout status deployment/coder-provisioner-tagged
1547-
1548-
deploy-wsproxies:
1549-
runs-on: ubuntu-latest
1550-
needs: build
1551-
if: github.ref == 'refs/heads/main' && !github.event.pull_request.head.repo.fork
1552-
steps:
1553-
- name: Harden Runner
1554-
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
1555-
with:
1556-
egress-policy: audit
1557-
1558-
- name: Checkout
1559-
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
1560-
with:
1561-
fetch-depth: 0
1562-
persist-credentials: false
1563-
1564-
- name: Setup flyctl
1565-
uses: superfly/flyctl-actions/setup-flyctl@fc53c09e1bc3be6f54706524e3b82c4f462f77be # v1.5
1566-
1567-
- name: Deploy workspace proxies
1568-
run: |
1569-
flyctl deploy --image "$IMAGE" --app paris-coder --config ./.github/fly-wsproxies/paris-coder.toml --env "CODER_PROXY_SESSION_TOKEN=$TOKEN_PARIS" --yes
1570-
flyctl deploy --image "$IMAGE" --app sydney-coder --config ./.github/fly-wsproxies/sydney-coder.toml --env "CODER_PROXY_SESSION_TOKEN=$TOKEN_SYDNEY" --yes
1571-
flyctl deploy --image "$IMAGE" --app sao-paulo-coder --config ./.github/fly-wsproxies/sao-paulo-coder.toml --env "CODER_PROXY_SESSION_TOKEN=$TOKEN_SAO_PAULO" --yes
1572-
flyctl deploy --image "$IMAGE" --app jnb-coder --config ./.github/fly-wsproxies/jnb-coder.toml --env "CODER_PROXY_SESSION_TOKEN=$TOKEN_JNB" --yes
1573-
env:
1574-
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
1575-
IMAGE: ${{ needs.build.outputs.IMAGE }}
1576-
TOKEN_PARIS: ${{ secrets.FLY_PARIS_CODER_PROXY_SESSION_TOKEN }}
1577-
TOKEN_SYDNEY: ${{ secrets.FLY_SYDNEY_CODER_PROXY_SESSION_TOKEN }}
1578-
TOKEN_SAO_PAULO: ${{ secrets.FLY_SAO_PAULO_CODER_PROXY_SESSION_TOKEN }}
1579-
TOKEN_JNB: ${{ secrets.FLY_JNB_CODER_PROXY_SESSION_TOKEN }}
1495+
packages: write # to retag image as dogfood
1496+
secrets:
1497+
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
1498+
FLY_PARIS_CODER_PROXY_SESSION_TOKEN: ${{ secrets.FLY_PARIS_CODER_PROXY_SESSION_TOKEN }}
1499+
FLY_SYDNEY_CODER_PROXY_SESSION_TOKEN: ${{ secrets.FLY_SYDNEY_CODER_PROXY_SESSION_TOKEN }}
1500+
FLY_SAO_PAULO_CODER_PROXY_SESSION_TOKEN: ${{ secrets.FLY_SAO_PAULO_CODER_PROXY_SESSION_TOKEN }}
1501+
FLY_JNB_CODER_PROXY_SESSION_TOKEN: ${{ secrets.FLY_JNB_CODER_PROXY_SESSION_TOKEN }}
15801502

15811503
# sqlc-vet runs a postgres docker container, runs Coder migrations, and then
15821504
# runs sqlc-vet to ensure all queries are valid. This catches any mistakes

0 commit comments

Comments
 (0)