All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m14s
Handles first deploy — images aren't in the local registry yet, so they must be built even if the diff doesn't touch app dirs.
84 lines
2.8 KiB
YAML
84 lines
2.8 KiB
YAML
name: Build and Deploy
|
|
|
|
on:
|
|
push:
|
|
branches: [main, decoupling]
|
|
|
|
env:
|
|
REGISTRY: registry.rose-ash.com:5000
|
|
COOP_DIR: /root/rose-ash
|
|
|
|
jobs:
|
|
build-and-deploy:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Install tools
|
|
run: |
|
|
apt-get update && apt-get install -y --no-install-recommends openssh-client
|
|
|
|
- name: Set up SSH
|
|
env:
|
|
SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
|
|
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
|
run: |
|
|
mkdir -p ~/.ssh
|
|
echo "$SSH_KEY" > ~/.ssh/id_rsa
|
|
chmod 600 ~/.ssh/id_rsa
|
|
ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts 2>/dev/null || true
|
|
|
|
- name: Build and deploy changed apps
|
|
env:
|
|
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
|
run: |
|
|
ssh "root@$DEPLOY_HOST" "
|
|
cd ${{ env.COOP_DIR }}
|
|
|
|
# Save current HEAD before updating
|
|
OLD_HEAD=\$(git rev-parse HEAD 2>/dev/null || echo none)
|
|
|
|
git fetch origin ${{ github.ref_name }}
|
|
git reset --hard origin/${{ github.ref_name }}
|
|
|
|
NEW_HEAD=\$(git rev-parse HEAD)
|
|
|
|
# Detect what changed
|
|
REBUILD_ALL=false
|
|
if [ \"\$OLD_HEAD\" = \"none\" ] || [ \"\$OLD_HEAD\" = \"\$NEW_HEAD\" ]; then
|
|
# First deploy or CI re-run on same commit — rebuild all
|
|
REBUILD_ALL=true
|
|
else
|
|
CHANGED=\$(git diff --name-only \$OLD_HEAD \$NEW_HEAD)
|
|
if echo \"\$CHANGED\" | grep -q '^shared/'; then
|
|
REBUILD_ALL=true
|
|
fi
|
|
if echo \"\$CHANGED\" | grep -q '^docker-compose.yml'; then
|
|
REBUILD_ALL=true
|
|
fi
|
|
fi
|
|
|
|
for app in blog market cart events federation account; do
|
|
IMAGE_EXISTS=\$(docker image ls -q ${{ env.REGISTRY }}/\$app:latest 2>/dev/null)
|
|
if [ \"\$REBUILD_ALL\" = true ] || echo \"\$CHANGED\" | grep -q \"^\$app/\" || [ -z \"\$IMAGE_EXISTS\" ]; then
|
|
echo \"Building \$app...\"
|
|
docker build \
|
|
--build-arg CACHEBUST=\$(date +%s) \
|
|
-f \$app/Dockerfile \
|
|
-t ${{ env.REGISTRY }}/\$app:latest \
|
|
-t ${{ env.REGISTRY }}/\$app:${{ github.sha }} \
|
|
.
|
|
docker push ${{ env.REGISTRY }}/\$app:latest
|
|
docker push ${{ env.REGISTRY }}/\$app:${{ github.sha }}
|
|
else
|
|
echo \"Skipping \$app (no changes)\"
|
|
fi
|
|
done
|
|
|
|
source .env
|
|
docker stack deploy -c docker-compose.yml coop
|
|
echo 'Waiting for services to update...'
|
|
sleep 10
|
|
docker stack services coop
|
|
"
|