Skip to content

Merge pull request #3 from minhdqdev-org/copilot/significant-swordtail #39

Merge pull request #3 from minhdqdev-org/copilot/significant-swordtail

Merge pull request #3 from minhdqdev-org/copilot/significant-swordtail #39

Workflow file for this run

name: CI on develop branch
on:
push:
branches:
- develop
concurrency:
group: build-minhdqdev-website-${{ github.ref }}
cancel-in-progress: true
env:
HARBOR_REGISTRY: harbor.minhdq.dev
HARBOR_PROJECT: minhdqdev
IMAGE_NAME: minhdqdev-website
DOCKER_CLIENT_TIMEOUT: '240'
COMPOSE_HTTP_TIMEOUT: '240'
BUILD_NUMBER: ${{ github.run_number }}
jobs:
build-and-push:
runs-on: [self-hosted, minhdqdev-org, manual]
permissions:
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Extract version from package.json
id: version
run: |
VERSION=$(jq -r '.version' package.json)
if [ -z "$VERSION" ] || [ "$VERSION" = "null" ]; then
echo "ERROR: Could not extract version from package.json" >&2
exit 1
fi
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Verify Harbor availability
run: |
set -euo pipefail
ATTEMPTS=5
SUCCESS_CODES="200 301 302 401"
for attempt in $(seq 1 $ATTEMPTS); do
STATUS=$(curl -sS -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 "https://${{ env.HARBOR_REGISTRY }}/v2/" || true)
if printf '%s' "$SUCCESS_CODES" | grep -q "\b$STATUS\b"; then
echo "Harbor responded with HTTP $STATUS on attempt $attempt/$ATTEMPTS"
exit 0
fi
echo "Harbor not reachable (HTTP ${STATUS:-N/A}) attempt $attempt/$ATTEMPTS" >&2
sleep $((attempt * 5))
done
echo "Harbor is not reachable after $ATTEMPTS attempts" >&2
exit 1
- name: Log in to Harbor
env:
HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }}
HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }}
run: |
set -euo pipefail
if [ -z "${HARBOR_USERNAME:-}" ] || [ -z "${HARBOR_PASSWORD:-}" ]; then
echo "Harbor credentials are not configured" >&2
exit 1
fi
ATTEMPTS=5
for attempt in $(seq 1 $ATTEMPTS); do
if printf '%s' "$HARBOR_PASSWORD" | docker login "https://${{ env.HARBOR_REGISTRY }}" --username "$HARBOR_USERNAME" --password-stdin; then
echo "Harbor login succeeded on attempt $attempt/$ATTEMPTS"
exit 0
fi
echo "Harbor login failed (attempt $attempt/$ATTEMPTS); waiting $((attempt * 5))s before retrying" >&2
sleep $((attempt * 5))
done
echo "Unable to log in to Harbor after $ATTEMPTS attempts" >&2
exit 1
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: |
${{ env.HARBOR_REGISTRY }}/${{ env.HARBOR_PROJECT }}/${{ env.IMAGE_NAME }}:develop
${{ env.HARBOR_REGISTRY }}/${{ env.HARBOR_PROJECT }}/${{ env.IMAGE_NAME }}:develop-${{ env.BUILD_NUMBER }}
# Use inline cache: cache embedded in the develop tag itself
cache-from: type=registry,ref=${{ env.HARBOR_REGISTRY }}/${{ env.HARBOR_PROJECT }}/${{ env.IMAGE_NAME }}:develop
cache-to: type=inline
- name: Image build summary
run: |
echo "### Docker Image Built and Pushed :rocket:" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Registry:** ${{ env.HARBOR_REGISTRY }}" >> $GITHUB_STEP_SUMMARY
echo "**Image:** ${{ env.HARBOR_PROJECT }}/${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY
echo "**Version:** ${{ steps.version.outputs.VERSION }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Tags:**" >> $GITHUB_STEP_SUMMARY
echo "- \`${{ env.HARBOR_REGISTRY }}/${{ env.HARBOR_PROJECT }}/${{ env.IMAGE_NAME }}:develop\`" >> $GITHUB_STEP_SUMMARY
echo "- \`${{ env.HARBOR_REGISTRY }}/${{ env.HARBOR_PROJECT }}/${{ env.IMAGE_NAME }}:develop-${{ env.BUILD_NUMBER }}\`" >> $GITHUB_STEP_SUMMARY