name: Production Readiness on: push: branches: [main] pull_request: branches: [main] concurrency: group: erpnext-${{ github.ref }} cancel-in-progress: true jobs: readiness: name: Coolify compose readiness runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Production readiness scan run: | chmod +x scripts/ci/*.sh bash scripts/ci/ci-readiness.sh . - name: Validate docker-compose (Coolify rules) run: bash scripts/ci/validate-docker-compose.sh . compose-smoke: name: Render and validate stack runs-on: ubuntu-latest needs: readiness steps: - uses: actions/checkout@v4 - name: Render Coolify-safe compose (strip Coolify-only keys) run: | mkdir -p dist sed '/exclude_from_hc:/d' docker-compose.yml > dist/docker-compose.coolify.yml docker compose -f dist/docker-compose.coolify.yml config -q echo "compose config OK" - name: Verify upstream ERPNext image is pullable run: | VERSION="$(grep -E '^ERPNEXT_VERSION=' example.env | cut -d= -f2)" docker pull "frappe/erpnext:${VERSION}" echo "frappe/erpnext:${VERSION} OK" - name: Upload rendered compose artifact uses: actions/upload-artifact@v4 with: name: coolify-compose path: dist/docker-compose.coolify.yml if-no-files-found: error