feat(deployment): update Semaphore stack and Traefik configuration
- Add QUICKSTART.md and SETUP_REPOSITORY.md for Semaphore stack - Add playbooks directory for Semaphore deployment - Update Semaphore docker-compose.yml, env.example, and README - Add Traefik local configuration files - Disable semaphore.yml in Traefik dynamic config - Update docker-compose.local.yml and build-image workflow
This commit is contained in:
@@ -150,7 +150,7 @@ jobs:
|
||||
NEEDS_BUILD=false
|
||||
OTHER_NON_IGNORED=false
|
||||
IGNORE_PATTERN='^(docs/|docs$|tests/|tests$|tests-e2e/|\.github/|\.gitea/|\.idea/|\.vscode/|\.husky/|.*\.md$|.*\.MD$|LICENSE$|CHANGELOG|CHANGELOG\.md$|\.editorconfig$|\.gitignore$)'
|
||||
BUILD_TRIGGER_PATTERN='^(src/|resources/|config/|app/|public/|composer\.json$|composer\.lock$|composer/|package\.json$|package-lock\.json$|pnpm-lock\.yaml$|yarn\.lock$|Dockerfile\.production$|Dockerfile\.runtime$|docker-compose\.production\.yml$|docker/|vite\.config\.(js|ts)$|tsconfig\.json$|babel\.config\.js$|Makefile$|artisan$)'
|
||||
BUILD_TRIGGER_PATTERN='^(src/|resources/|config/|app/|public/|composer\.json$|composer\.lock$|composer/|package\.json$|package-lock\.json$|pnpm-lock\.yaml$|yarn\.lock$|Dockerfile\.production$|Dockerfile\.runtime$|docker-compose\..*\.yml$|docker-compose\.yml$|docker/|vite\.config\.(js|ts)$|tsconfig\.json$|babel\.config\.js$|Makefile$|artisan$)'
|
||||
while IFS= read -r FILE; do
|
||||
[ -z "$FILE" ] && continue
|
||||
if echo "$FILE" | grep -Eq "$RUNTIME_PATTERN"; then
|
||||
@@ -817,10 +817,8 @@ jobs:
|
||||
# Job 3: Auto-deploy to Staging (only for staging branch)
|
||||
deploy-staging:
|
||||
name: Auto-deploy to Staging
|
||||
needs: [changes, build, runtime-base]
|
||||
if: |
|
||||
(github.ref_name == 'staging' || github.head_ref == 'staging' || (github.ref_name == '' && contains(github.ref, 'staging'))) &&
|
||||
(needs.build.result != 'failure')
|
||||
needs: [changes]
|
||||
if: github.ref_name == 'staging' || github.head_ref == 'staging' || (github.ref_name == '' && contains(github.ref, 'staging'))
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: staging
|
||||
@@ -876,28 +874,12 @@ jobs:
|
||||
DEPLOYMENT_HOST="${{ env.DEPLOYMENT_HOST }}"
|
||||
REGISTRY_HOST="${{ env.REGISTRY }}"
|
||||
IMAGE_NAME="${{ env.IMAGE_NAME }}"
|
||||
BUILD_RESULT="${{ needs.build.result }}"
|
||||
IMAGE_TAG_RAW="${{ needs.build.outputs.image_tag }}"
|
||||
IMAGE_URL_RAW="${{ needs.build.outputs.image_url }}"
|
||||
|
||||
DEFAULT_IMAGE="${REGISTRY_HOST}/${IMAGE_NAME}:latest"
|
||||
SELECTED_IMAGE=""
|
||||
|
||||
if [ "$BUILD_RESULT" = "success" ] && [ -n "$IMAGE_URL_RAW" ] && [ "$IMAGE_URL_RAW" != "null" ]; then
|
||||
SELECTED_IMAGE="$IMAGE_URL_RAW"
|
||||
fi
|
||||
|
||||
if [ -z "$SELECTED_IMAGE" ]; then
|
||||
if [ "$BUILD_RESULT" = "success" ] && [ -n "$IMAGE_TAG_RAW" ] && [ "$IMAGE_TAG_RAW" != "null" ]; then
|
||||
SELECTED_IMAGE="${REGISTRY_HOST}/${IMAGE_NAME}:${IMAGE_TAG_RAW}"
|
||||
else
|
||||
SELECTED_IMAGE="$DEFAULT_IMAGE"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$SELECTED_IMAGE" ]; then
|
||||
SELECTED_IMAGE="$DEFAULT_IMAGE"
|
||||
fi
|
||||
# Always use latest image - if a build happened, it would have pushed to latest anyway
|
||||
# Using latest ensures we always get the most recent image, whether it was just built or not
|
||||
SELECTED_IMAGE="$DEFAULT_IMAGE"
|
||||
|
||||
STACK_PATH_DISPLAY="~/deployment/stacks/staging"
|
||||
|
||||
@@ -1024,14 +1006,9 @@ jobs:
|
||||
echo "⏳ Waiting for services to start..."
|
||||
sleep 15
|
||||
|
||||
# Pull latest code from Git repository only if image was actually rebuilt
|
||||
# Skip if build was skipped (no changes detected) - container already has latest code
|
||||
if [ "${{ needs.build.result }}" = "success" ] && [ -n "${{ needs.build.outputs.image_url }}" ] && [ "${{ needs.build.outputs.image_url }}" != "null" ]; then
|
||||
echo "🔄 Pulling latest code from Git repository in staging-app container (image was rebuilt)..."
|
||||
docker compose -f docker-compose.base.yml -f docker-compose.staging.yml exec -T staging-app bash -c "cd /var/www/html && git -c safe.directory=/var/www/html fetch origin staging && git -c safe.directory=/var/www/html reset --hard origin/staging && git -c safe.directory=/var/www/html clean -fd" || echo "⚠️ Git pull failed, container will sync on next restart"
|
||||
else
|
||||
echo "ℹ️ Skipping Git pull - no new image built, container already has latest code"
|
||||
fi
|
||||
# Pull latest code from Git repository - always sync code when deploying
|
||||
echo "🔄 Pulling latest code from Git repository in staging-app container..."
|
||||
docker compose -f docker-compose.base.yml -f docker-compose.staging.yml exec -T staging-app bash -c "cd /var/www/html && git -c safe.directory=/var/www/html fetch origin staging && git -c safe.directory=/var/www/html reset --hard origin/staging && git -c safe.directory=/var/www/html clean -fd" || echo "⚠️ Git pull failed, container will sync on next restart"
|
||||
|
||||
# Also trigger a restart to ensure entrypoint script runs
|
||||
echo "🔄 Restarting staging-app to ensure all services are up-to-date..."
|
||||
|
||||
Reference in New Issue
Block a user