Fix frontend release gate for Coolify deploys
This commit is contained in:
@@ -18,15 +18,14 @@ jobs:
|
|||||||
build-upload-and-verify:
|
build-upload-and-verify:
|
||||||
runs-on: [self-hosted, Linux, X64, default]
|
runs-on: [self-hosted, Linux, X64, default]
|
||||||
env:
|
env:
|
||||||
RELEASE_BASE_URL: https://dev.truckwash.io
|
RELEASE_BASE_URL: https://api-v2.truckwash.io/master/frontend
|
||||||
PLAYWRIGHT_BASE_URL: https://dev.truckwash.io
|
PLAYWRIGHT_BASE_URL: https://api-v2.truckwash.io/master/frontend
|
||||||
PLAYWRIGHT_RELEASE_API_BASE_URL: https://api-v2.truckwash.io
|
PLAYWRIGHT_RELEASE_API_BASE_URL: https://api-v2.truckwash.io
|
||||||
PLAYWRIGHT_RELEASE_API_PING_PATHS: /ping,/master/api/ping,/canary/api/ping,/stable/api/ping
|
PLAYWRIGHT_RELEASE_API_PING_PATHS: /ping,/master/api/ping,/canary/api/ping,/stable/api/ping
|
||||||
RELEASE_BUILD_ID: ${{ github.run_id }}-${{ github.run_attempt }}
|
RELEASE_BUILD_ID: ${{ github.run_id }}-${{ github.run_attempt }}
|
||||||
RELEASE_EXPECTED_BUILD_ID: ${{ github.run_id }}-${{ github.run_attempt }}
|
|
||||||
RELEASE_EXPECTED_COMMIT: ${{ github.sha }}
|
RELEASE_EXPECTED_COMMIT: ${{ github.sha }}
|
||||||
RELEASE_WAIT_INITIAL_SECONDS: 30
|
RELEASE_WAIT_INITIAL_SECONDS: 45
|
||||||
RELEASE_WAIT_TIMEOUT_SECONDS: 300
|
RELEASE_WAIT_TIMEOUT_SECONDS: 600
|
||||||
RELEASE_POLL_INTERVAL_SECONDS: 10
|
RELEASE_POLL_INTERVAL_SECONDS: 10
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
@@ -72,26 +71,7 @@ jobs:
|
|||||||
path: dist
|
path: dist
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
|
|
||||||
- name: Install lftp
|
- name: Wait for Coolify release artifact
|
||||||
run: |
|
|
||||||
if ! command -v lftp >/dev/null 2>&1; then
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y lftp
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Upload hashed assets before release metadata
|
|
||||||
run: |
|
|
||||||
test -n "$RELEASE_DEPLOY_HOST" || (echo "RELEASE_DEPLOY_HOST is required" >&2; exit 1)
|
|
||||||
test -n "$RELEASE_DEPLOY_USER" || (echo "RELEASE_DEPLOY_USER is required" >&2; exit 1)
|
|
||||||
test -n "$RELEASE_DEPLOY_PASSWORD" || (echo "RELEASE_DEPLOY_PASSWORD is required" >&2; exit 1)
|
|
||||||
npm run release:upload:lftp
|
|
||||||
env:
|
|
||||||
RELEASE_DEPLOY_HOST: ${{ secrets.RELEASE_DEPLOY_HOST }}
|
|
||||||
RELEASE_DEPLOY_USER: ${{ secrets.RELEASE_DEPLOY_USER }}
|
|
||||||
RELEASE_DEPLOY_PASSWORD: ${{ secrets.RELEASE_DEPLOY_PASSWORD }}
|
|
||||||
RELEASE_DEPLOY_REMOTE_ROOT: ${{ secrets.RELEASE_DEPLOY_REMOTE_ROOT }}
|
|
||||||
|
|
||||||
- name: Wait for exact uploaded build
|
|
||||||
run: npm run release:verify-upload
|
run: npm run release:verify-upload
|
||||||
|
|
||||||
- name: Public live Playwright gate
|
- name: Public live Playwright gate
|
||||||
@@ -118,7 +98,7 @@ jobs:
|
|||||||
-X POST "$RELEASE_MANAGER_GATE_URL" \
|
-X POST "$RELEASE_MANAGER_GATE_URL" \
|
||||||
-H "Authorization: Bearer $RELEASE_MANAGER_GATE_TOKEN" \
|
-H "Authorization: Bearer $RELEASE_MANAGER_GATE_TOKEN" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
--data "{\"environment_url\":\"$RELEASE_BASE_URL\",\"channel_slug\":\"stable\",\"app\":\"frontend\",\"repository\":\"$RELEASE_REPOSITORY\",\"branch\":\"$RELEASE_BRANCH\",\"expected_commit\":\"$RELEASE_EXPECTED_COMMIT\",\"build_id\":\"$RELEASE_EXPECTED_BUILD_ID\",\"workflow_url\":\"$RELEASE_WORKFLOW_URL\",\"auto_sync\":true,\"wait_timeout_seconds\":300,\"poll_interval_seconds\":10,\"required_checks\":[\"static_artifact\",\"api_gateway\"]}"
|
--data "{\"environment_url\":\"$RELEASE_BASE_URL\",\"channel_slug\":\"stable\",\"app\":\"frontend\",\"repository\":\"$RELEASE_REPOSITORY\",\"branch\":\"$RELEASE_BRANCH\",\"expected_commit\":\"$RELEASE_EXPECTED_COMMIT\",\"workflow_url\":\"$RELEASE_WORKFLOW_URL\",\"auto_sync\":true,\"wait_timeout_seconds\":300,\"poll_interval_seconds\":10,\"required_checks\":[\"static_artifact\",\"api_gateway\"]}"
|
||||||
env:
|
env:
|
||||||
RELEASE_MANAGER_GATE_URL: ${{ secrets.RELEASE_MANAGER_GATE_URL || 'https://api.truckwash.io/release/gate/test-runs' }}
|
RELEASE_MANAGER_GATE_URL: ${{ secrets.RELEASE_MANAGER_GATE_URL || 'https://api.truckwash.io/release/gate/test-runs' }}
|
||||||
RELEASE_MANAGER_GATE_TOKEN: ${{ secrets.RELEASE_MANAGER_GATE_TOKEN }}
|
RELEASE_MANAGER_GATE_TOKEN: ${{ secrets.RELEASE_MANAGER_GATE_TOKEN }}
|
||||||
|
|||||||
@@ -8,6 +8,14 @@ COPY package*.json ./
|
|||||||
RUN npm ci --ignore-scripts
|
RUN npm ci --ignore-scripts
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
ARG SOURCE_COMMIT
|
||||||
|
ARG RELEASE_COMMIT_SHA
|
||||||
|
ARG COMMIT_SHA
|
||||||
|
ARG GITHUB_SHA
|
||||||
|
ENV SOURCE_COMMIT=$SOURCE_COMMIT
|
||||||
|
ENV RELEASE_COMMIT_SHA=$RELEASE_COMMIT_SHA
|
||||||
|
ENV COMMIT_SHA=$COMMIT_SHA
|
||||||
|
ENV GITHUB_SHA=$GITHUB_SHA
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
FROM nginx:1.27-alpine
|
FROM nginx:1.27-alpine
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ async function verifyShell(baseUrl, shellPath) {
|
|||||||
|
|
||||||
async function verifyRelease(baseUrl) {
|
async function verifyRelease(baseUrl) {
|
||||||
const expectedCommit = process.env.RELEASE_EXPECTED_COMMIT || process.env.GITHUB_SHA || "";
|
const expectedCommit = process.env.RELEASE_EXPECTED_COMMIT || process.env.GITHUB_SHA || "";
|
||||||
const expectedBuildId = process.env.RELEASE_EXPECTED_BUILD_ID || process.env.RELEASE_BUILD_ID || "";
|
const expectedBuildId = process.env.RELEASE_EXPECTED_BUILD_ID || "";
|
||||||
const manifest = await fetchJson(baseUrl, "release-manifest.json");
|
const manifest = await fetchJson(baseUrl, "release-manifest.json");
|
||||||
const releaseEntry = await fetchJson(baseUrl, "release-entry.json");
|
const releaseEntry = await fetchJson(baseUrl, "release-entry.json");
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ const PUBLIC_ASSET_ALIASES = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
function getGitCommit() {
|
function getGitCommit() {
|
||||||
|
const envCommit = firstReleaseCommitEnv()
|
||||||
|
if (envCommit) {
|
||||||
|
return envCommit.slice(0, 12)
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return execSync('git rev-parse --short HEAD').toString().trim()
|
return execSync('git rev-parse --short HEAD').toString().trim()
|
||||||
} catch {
|
} catch {
|
||||||
@@ -45,6 +50,11 @@ function getGitCommit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getGitCommitSha() {
|
function getGitCommitSha() {
|
||||||
|
const envCommit = firstReleaseCommitEnv()
|
||||||
|
if (envCommit) {
|
||||||
|
return envCommit
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return execSync('git rev-parse HEAD').toString().trim()
|
return execSync('git rev-parse HEAD').toString().trim()
|
||||||
} catch {
|
} catch {
|
||||||
@@ -52,6 +62,16 @@ function getGitCommitSha() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function firstReleaseCommitEnv() {
|
||||||
|
for (const key of ['RELEASE_COMMIT_SHA', 'SOURCE_COMMIT', 'COMMIT_SHA', 'GITHUB_SHA', 'VITE_COMMIT_HASH']) {
|
||||||
|
const value = String(process.env[key] || '').trim()
|
||||||
|
if (/^[0-9a-f]{7,40}$/i.test(value)) {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
function releaseBuildId(commitSha) {
|
function releaseBuildId(commitSha) {
|
||||||
const explicitBuildId = process.env.RELEASE_BUILD_ID || process.env.BUILD_ID
|
const explicitBuildId = process.env.RELEASE_BUILD_ID || process.env.BUILD_ID
|
||||||
if (explicitBuildId) {
|
if (explicitBuildId) {
|
||||||
|
|||||||
Reference in New Issue
Block a user