feat: enhance build process and add readiness checks for components
Some checks failed
docker-images / resolve-build-targets (push) Successful in 6s
ui-regression / playwright-regression (push) Failing after 13m44s
docker-images / build-and-push (admin) (push) Successful in 1m13s
docker-images / build-and-push (backend) (push) Successful in 45m36s
docker-images / build-and-push (frontend) (push) Successful in 1m29s
docker-images / submit-indexnow (push) Successful in 18s
Some checks failed
docker-images / resolve-build-targets (push) Successful in 6s
ui-regression / playwright-regression (push) Failing after 13m44s
docker-images / build-and-push (admin) (push) Successful in 1m13s
docker-images / build-and-push (backend) (push) Successful in 45m36s
docker-images / build-and-push (frontend) (push) Successful in 1m29s
docker-images / submit-indexnow (push) Successful in 18s
This commit is contained in:
@@ -21,13 +21,16 @@ jobs:
|
||||
resolve-build-targets:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.targets.outputs.matrix }}
|
||||
count: ${{ steps.targets.outputs.count }}
|
||||
backend_changed: ${{ steps.targets.outputs.backend_changed }}
|
||||
admin_changed: ${{ steps.targets.outputs.admin_changed }}
|
||||
frontend_changed: ${{ steps.targets.outputs.frontend_changed }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Resolve build targets
|
||||
id: targets
|
||||
@@ -91,40 +94,32 @@ jobs:
|
||||
[ -n "${SELECTED[admin]:-}" ] && COMPONENTS+=(admin)
|
||||
|
||||
COMPONENTS_CSV="$(IFS=,; echo "${COMPONENTS[*]}")"
|
||||
export COMPONENTS_CSV
|
||||
BACKEND_CHANGED=false
|
||||
FRONTEND_CHANGED=false
|
||||
ADMIN_CHANGED=false
|
||||
COUNT=0
|
||||
|
||||
python <<'PY' >> "$GITHUB_OUTPUT"
|
||||
import json
|
||||
import os
|
||||
if [ -n "${SELECTED[backend]:-}" ]; then
|
||||
BACKEND_CHANGED=true
|
||||
COUNT=$((COUNT + 1))
|
||||
fi
|
||||
|
||||
mapping = {
|
||||
"backend": {
|
||||
"component": "backend",
|
||||
"dockerfile": "backend/Dockerfile",
|
||||
"context": "backend",
|
||||
"default_image_name": "termi-astro-backend",
|
||||
},
|
||||
"frontend": {
|
||||
"component": "frontend",
|
||||
"dockerfile": "frontend/Dockerfile",
|
||||
"context": "frontend",
|
||||
"default_image_name": "termi-astro-frontend",
|
||||
},
|
||||
"admin": {
|
||||
"component": "admin",
|
||||
"dockerfile": "admin/Dockerfile",
|
||||
"context": "admin",
|
||||
"default_image_name": "termi-astro-admin",
|
||||
},
|
||||
}
|
||||
if [ -n "${SELECTED[frontend]:-}" ]; then
|
||||
FRONTEND_CHANGED=true
|
||||
COUNT=$((COUNT + 1))
|
||||
fi
|
||||
|
||||
components = [item for item in os.environ.get("COMPONENTS_CSV", "").split(",") if item]
|
||||
matrix = {"include": [mapping[item] for item in components]}
|
||||
if [ -n "${SELECTED[admin]:-}" ]; then
|
||||
ADMIN_CHANGED=true
|
||||
COUNT=$((COUNT + 1))
|
||||
fi
|
||||
|
||||
print(f"matrix={json.dumps(matrix, separators=(',', ':'))}")
|
||||
print(f"count={len(components)}")
|
||||
print(f"frontend_changed={'true' if 'frontend' in components else 'false'}")
|
||||
PY
|
||||
{
|
||||
echo "count=${COUNT}"
|
||||
echo "backend_changed=${BACKEND_CHANGED}"
|
||||
echo "frontend_changed=${FRONTEND_CHANGED}"
|
||||
echo "admin_changed=${ADMIN_CHANGED}"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
echo "Selected components: ${COMPONENTS_CSV}"
|
||||
if [ -n "${CHANGED_FILES}" ]; then
|
||||
@@ -135,19 +130,71 @@ jobs:
|
||||
fi
|
||||
|
||||
build-and-push:
|
||||
name: build-and-push (${{ matrix.component }})
|
||||
needs: resolve-build-targets
|
||||
if: needs.resolve-build-targets.outputs.count != '0'
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
max-parallel: 1
|
||||
matrix: ${{ fromJson(needs.resolve-build-targets.outputs.matrix) }}
|
||||
matrix:
|
||||
include:
|
||||
- component: backend
|
||||
dockerfile: backend/Dockerfile
|
||||
context: backend
|
||||
default_image_name: termi-astro-backend
|
||||
- component: frontend
|
||||
dockerfile: frontend/Dockerfile
|
||||
context: frontend
|
||||
default_image_name: termi-astro-frontend
|
||||
- component: admin
|
||||
dockerfile: admin/Dockerfile
|
||||
context: admin
|
||||
default_image_name: termi-astro-admin
|
||||
|
||||
steps:
|
||||
- name: Decide whether to build current component
|
||||
id: should_build
|
||||
shell: bash
|
||||
env:
|
||||
COMPONENT: ${{ matrix.component }}
|
||||
BACKEND_CHANGED: ${{ needs.resolve-build-targets.outputs.backend_changed }}
|
||||
FRONTEND_CHANGED: ${{ needs.resolve-build-targets.outputs.frontend_changed }}
|
||||
ADMIN_CHANGED: ${{ needs.resolve-build-targets.outputs.admin_changed }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
SHOULD_BUILD=false
|
||||
|
||||
case "${COMPONENT}" in
|
||||
backend)
|
||||
SHOULD_BUILD="${BACKEND_CHANGED}"
|
||||
;;
|
||||
frontend)
|
||||
SHOULD_BUILD="${FRONTEND_CHANGED}"
|
||||
;;
|
||||
admin)
|
||||
SHOULD_BUILD="${ADMIN_CHANGED}"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "should_build=${SHOULD_BUILD}" >> "$GITHUB_OUTPUT"
|
||||
echo "component=${COMPONENT}"
|
||||
echo "should_build=${SHOULD_BUILD}"
|
||||
|
||||
- name: Skip unchanged component
|
||||
if: steps.should_build.outputs.should_build != 'true'
|
||||
shell: bash
|
||||
env:
|
||||
COMPONENT: ${{ matrix.component }}
|
||||
run: echo "No changes detected for ${COMPONENT}, skipping docker build."
|
||||
|
||||
- name: Checkout
|
||||
if: steps.should_build.outputs.should_build == 'true'
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Resolve image metadata
|
||||
if: steps.should_build.outputs.should_build == 'true'
|
||||
id: meta
|
||||
shell: bash
|
||||
env:
|
||||
@@ -217,6 +264,7 @@ jobs:
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Login registry
|
||||
if: steps.should_build.outputs.should_build == 'true'
|
||||
shell: bash
|
||||
env:
|
||||
REGISTRY_HOST: ${{ steps.meta.outputs.registry_host }}
|
||||
@@ -271,6 +319,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Setup docker buildx
|
||||
if: steps.should_build.outputs.should_build == 'true'
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
@@ -284,6 +333,7 @@ jobs:
|
||||
docker buildx inspect --bootstrap
|
||||
|
||||
- name: Login Docker Hub (optional)
|
||||
if: steps.should_build.outputs.should_build == 'true'
|
||||
shell: bash
|
||||
env:
|
||||
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
@@ -298,6 +348,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Build and push image
|
||||
if: steps.should_build.outputs.should_build == 'true'
|
||||
shell: bash
|
||||
env:
|
||||
COMPONENT: ${{ matrix.component }}
|
||||
@@ -345,6 +396,7 @@ jobs:
|
||||
"${CONTEXT_DIR}"
|
||||
|
||||
- name: Output image tags
|
||||
if: steps.should_build.outputs.should_build == 'true'
|
||||
shell: bash
|
||||
env:
|
||||
COMPONENT: ${{ matrix.component }}
|
||||
|
||||
Reference in New Issue
Block a user