Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3fa0e26bd1 | ||
|
|
8fc4dc09c9 |
@@ -8,10 +8,6 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
|
|
||||||
env:
|
|
||||||
COSIGN_KEY: ${{ secrets.COSIGN_KEY }}
|
|
||||||
COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
shared:
|
shared:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
@@ -114,7 +110,7 @@ jobs:
|
|||||||
image:
|
image:
|
||||||
# Builds the portal image and ships it through the same path every
|
# Builds the portal image and ships it through the same path every
|
||||||
# other service in orca-infra uses: push :latest + :sha-<sha> to
|
# other service in orca-infra uses: push :latest + :sha-<sha> to
|
||||||
# repo.breakpilot.com, then POST a github-style payload to the
|
# registry.meghsakha.com, then POST a github-style payload to the
|
||||||
# orca webhook so the master pulls and redeploys breakpilot-portal.
|
# orca webhook so the master pulls and redeploys breakpilot-portal.
|
||||||
#
|
#
|
||||||
# Webhook target (registered once on the master via
|
# Webhook target (registered once on the master via
|
||||||
@@ -128,20 +124,15 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: docker/login-action@v3
|
- uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: repo.breakpilot.com
|
registry: registry.meghsakha.com
|
||||||
username: ${{ secrets.REGISTRY_USER }}
|
username: ${{ secrets.REGISTRY_USER }}
|
||||||
password: ${{ secrets.REGISTRY_PASS }}
|
password: ${{ secrets.REGISTRY_PASS }}
|
||||||
- uses: docker/build-push-action@v6
|
- uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
repo.breakpilot.com/breakpilot/portal:latest
|
registry.meghsakha.com/breakpilot/portal:latest
|
||||||
repo.breakpilot.com/breakpilot/portal:sha-${{ github.sha }}
|
registry.meghsakha.com/breakpilot/portal:sha-${{ github.sha }}
|
||||||
- name: sign image (cosign)
|
|
||||||
run: |
|
|
||||||
{ command -v cosign >/dev/null 2>&1 || curl -sSfLo /usr/local/bin/cosign https://github.com/sigstore/cosign/releases/download/v2.4.3/cosign-linux-amd64 || wget -qO /usr/local/bin/cosign https://github.com/sigstore/cosign/releases/download/v2.4.3/cosign-linux-amd64; } || echo "::warning::cosign fetch failed"
|
|
||||||
chmod +x /usr/local/bin/cosign 2>/dev/null || true
|
|
||||||
cosign sign --yes --key env://COSIGN_KEY repo.breakpilot.com/breakpilot/portal:latest || echo "::warning::cosign failed"
|
|
||||||
- name: trigger orca redeploy
|
- name: trigger orca redeploy
|
||||||
# Signs the POST with HMAC-SHA256 over the JSON body using the
|
# Signs the POST with HMAC-SHA256 over the JSON body using the
|
||||||
# secret orca generated when the webhook was registered. Orca's
|
# secret orca generated when the webhook was registered. Orca's
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
|
|
||||||
- name: verify stage soak (>= 24h on this image)
|
- name: verify stage soak (>= 24h on this image)
|
||||||
run: |
|
run: |
|
||||||
IMG=repo.breakpilot.com/breakpilot/${{ github.event.repository.name }}:env-stage
|
IMG=registry.breakpilot.com/${{ github.event.repository.name }}:env-stage
|
||||||
SOAK_SECONDS=$(orca image-age --env=stage --image $IMG)
|
SOAK_SECONDS=$(orca image-age --env=stage --image $IMG)
|
||||||
if [ "$SOAK_SECONDS" -lt 86400 ]; then
|
if [ "$SOAK_SECONDS" -lt 86400 ]; then
|
||||||
echo "Stage soak only $SOAK_SECONDS s, < 24h. Aborting."
|
echo "Stage soak only $SOAK_SECONDS s, < 24h. Aborting."
|
||||||
@@ -34,12 +34,12 @@ jobs:
|
|||||||
- name: re-tag image as semver + env-prod
|
- name: re-tag image as semver + env-prod
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: repo.breakpilot.com
|
registry: registry.breakpilot.com
|
||||||
username: ${{ secrets.REGISTRY_USER }}
|
username: ${{ secrets.REGISTRY_USER }}
|
||||||
password: ${{ secrets.REGISTRY_PASS }}
|
password: ${{ secrets.REGISTRY_PASS }}
|
||||||
|
|
||||||
- run: |
|
- run: |
|
||||||
IMG=repo.breakpilot.com/breakpilot/${{ github.event.repository.name }}
|
IMG=registry.breakpilot.com/${{ github.event.repository.name }}
|
||||||
docker pull $IMG:env-stage
|
docker pull $IMG:env-stage
|
||||||
docker tag $IMG:env-stage $IMG:v${{ steps.v.outputs.version }}
|
docker tag $IMG:env-stage $IMG:v${{ steps.v.outputs.version }}
|
||||||
docker tag $IMG:env-stage $IMG:env-prod
|
docker tag $IMG:env-stage $IMG:env-prod
|
||||||
@@ -67,7 +67,7 @@ jobs:
|
|||||||
curl -X POST -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
|
curl -X POST -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "$(jq -Rs '{tag_name:"v${{ steps.v.outputs.version }}", name:"v${{ steps.v.outputs.version }}", body:.}' < RELEASE_NOTES.md)" \
|
-d "$(jq -Rs '{tag_name:"v${{ steps.v.outputs.version }}", name:"v${{ steps.v.outputs.version }}", body:.}' < RELEASE_NOTES.md)" \
|
||||||
https://git.breakpilot.com/api/v1/repos/${{ github.repository }}/releases
|
https://gitea.meghsakha.com/api/v1/repos/${{ github.repository }}/releases
|
||||||
|
|
||||||
rollback-on-failure:
|
rollback-on-failure:
|
||||||
needs: promote
|
needs: promote
|
||||||
|
|||||||
+1
-14
@@ -11,20 +11,7 @@ export type HostMatch =
|
|||||||
| { kind: "unknown" };
|
| { kind: "unknown" };
|
||||||
|
|
||||||
// Longest-first so `stage.breakpilot.com` is matched before `breakpilot.com`.
|
// Longest-first so `stage.breakpilot.com` is matched before `breakpilot.com`.
|
||||||
// Built-ins cover dev (localhost) + the canonical breakpilot.com targets.
|
const APEX_HOSTS = ["stage.breakpilot.com", "breakpilot.com", "localhost"];
|
||||||
// PORTAL_APEX_HOSTS is a comma-separated env override for per-environment
|
|
||||||
// hosts (e.g. portal-dev.meghsakha.com while breakpilot.com isn't registered).
|
|
||||||
const APEX_HOSTS = (() => {
|
|
||||||
const base = ["stage.breakpilot.com", "breakpilot.com", "localhost"];
|
|
||||||
const extra = (process.env.PORTAL_APEX_HOSTS ?? "")
|
|
||||||
.split(",")
|
|
||||||
.map((h) => h.trim().toLowerCase())
|
|
||||||
.filter(Boolean);
|
|
||||||
// Longest-first to keep the suffix-strip loop correct.
|
|
||||||
return Array.from(new Set([...extra, ...base])).sort(
|
|
||||||
(a, b) => b.length - a.length,
|
|
||||||
);
|
|
||||||
})();
|
|
||||||
const APEX_SET = new Set(APEX_HOSTS);
|
const APEX_SET = new Set(APEX_HOSTS);
|
||||||
|
|
||||||
export function parseHost(host: string | null | undefined): HostMatch {
|
export function parseHost(host: string | null | undefined): HostMatch {
|
||||||
|
|||||||
Reference in New Issue
Block a user