Skip to content

Commit e60bc15

Browse files
committed
fix(cd): handle previous bad state where docker-compose.yml was created as a directory; upload to /tmp and move into place
1 parent aa4768a commit e60bc15

1 file changed

Lines changed: 57 additions & 6 deletions

File tree

.github/workflows/cd.yml

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,32 +83,52 @@ jobs:
8383
SSH_HOST: ${{ secrets.SSH_HOST }}
8484
SSH_USER: ${{ secrets.SSH_USER }}
8585
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
86+
SSH_PASSWORD: ${{ secrets.SSH_PASSWORD }}
8687
run: |
87-
for v in SSH_HOST SSH_USER SSH_PRIVATE_KEY; do
88-
if [ -z "${!v}" ]; then echo "Missing secret: $v"; exit 1; fi
89-
done
88+
if [ -z "$SSH_HOST" ] || [ -z "$SSH_USER" ]; then
89+
echo "Missing SSH_HOST or SSH_USER"; exit 1; fi
90+
if [ -z "$SSH_PRIVATE_KEY" ] && [ -z "$SSH_PASSWORD" ]; then
91+
echo "Provide either SSH_PRIVATE_KEY or SSH_PASSWORD"; exit 1; fi
9092
91-
- name: Upload docker-compose file
93+
- name: Upload docker-compose file (key)
94+
if: ${{ secrets.SSH_PRIVATE_KEY != '' }}
9295
uses: appleboy/scp-action@v0.1.7
9396
with:
9497
host: ${{ secrets.SSH_HOST }}
9598
username: ${{ secrets.SSH_USER }}
9699
key: ${{ secrets.SSH_PRIVATE_KEY }}
100+
passphrase: ${{ secrets.SSH_PASSPHRASE }}
97101
source: "docker-compose.prod.yml"
98-
target: "/opt/edgeflow/docker-compose.yml"
102+
target: "/tmp/edgeflow-docker-compose.yml"
99103
strip_components: 0
100104

101-
- name: Deploy via SSH
105+
- name: Upload docker-compose file (password)
106+
if: ${{ secrets.SSH_PRIVATE_KEY == '' && secrets.SSH_PASSWORD != '' }}
107+
uses: appleboy/scp-action@v0.1.7
108+
with:
109+
host: ${{ secrets.SSH_HOST }}
110+
username: ${{ secrets.SSH_USER }}
111+
password: ${{ secrets.SSH_PASSWORD }}
112+
source: "docker-compose.prod.yml"
113+
target: "/tmp/edgeflow-docker-compose.yml"
114+
strip_components: 0
115+
116+
- name: Deploy via SSH (key)
117+
if: ${{ secrets.SSH_PRIVATE_KEY != '' }}
102118
uses: appleboy/ssh-action@v1.0.3
103119
with:
104120
host: ${{ secrets.SSH_HOST }}
105121
username: ${{ secrets.SSH_USER }}
106122
key: ${{ secrets.SSH_PRIVATE_KEY }}
123+
passphrase: ${{ secrets.SSH_PASSPHRASE }}
107124
script: |
108125
set -euo pipefail
109126
APP_DIR=/opt/edgeflow
110127
sudo mkdir -p ${APP_DIR}
111128
cd ${APP_DIR}
129+
# Move compose file into place
130+
if [ -d docker-compose.yml ]; then sudo rm -rf docker-compose.yml; fi
131+
if [ -f /tmp/edgeflow-docker-compose.yml ]; then mv /tmp/edgeflow-docker-compose.yml docker-compose.yml; fi
112132
# Write .env with image tags
113133
cat > .env << 'EOF'
114134
BACKEND_IMAGE=${{ needs.build-and-push.outputs.backend_image }}
@@ -127,3 +147,34 @@ jobs:
127147
# Basic health checks
128148
curl -fsS http://localhost:8000/api/health || (echo 'Backend health failed' && exit 1)
129149
curl -fsS http://localhost:3000/ || (echo 'Frontend health failed' && exit 1)
150+
151+
- name: Deploy via SSH (password)
152+
if: ${{ secrets.SSH_PRIVATE_KEY == '' && secrets.SSH_PASSWORD != '' }}
153+
uses: appleboy/ssh-action@v1.0.3
154+
with:
155+
host: ${{ secrets.SSH_HOST }}
156+
username: ${{ secrets.SSH_USER }}
157+
password: ${{ secrets.SSH_PASSWORD }}
158+
script: |
159+
set -euo pipefail
160+
APP_DIR=/opt/edgeflow
161+
sudo mkdir -p ${APP_DIR}
162+
cd ${APP_DIR}
163+
# Move compose file into place
164+
if [ -d docker-compose.yml ]; then sudo rm -rf docker-compose.yml; fi
165+
if [ -f /tmp/edgeflow-docker-compose.yml ]; then mv /tmp/edgeflow-docker-compose.yml docker-compose.yml; fi
166+
# Write .env with image tags
167+
cat > .env << 'EOF'
168+
BACKEND_IMAGE=${{ needs.build-and-push.outputs.backend_image }}
169+
FRONTEND_IMAGE=${{ needs.build-and-push.outputs.frontend_image }}
170+
EOF
171+
# Login to GHCR if credentials provided
172+
if [ -n "${{ secrets.GHCR_USERNAME }}" ] && [ -n "${{ secrets.GHCR_TOKEN }}" ]; then
173+
echo "${{ secrets.GHCR_TOKEN }}" | docker login ghcr.io -u "${{ secrets.GHCR_USERNAME }}" --password-stdin
174+
fi
175+
(docker compose version || docker-compose version)
176+
(docker compose --env-file .env -f docker-compose.yml pull || docker-compose --env-file .env -f docker-compose.yml pull)
177+
(docker compose --env-file .env -f docker-compose.yml up -d || docker-compose --env-file .env -f docker-compose.yml up -d)
178+
docker image prune -f || true
179+
curl -fsS http://localhost:8000/api/health || (echo 'Backend health failed' && exit 1)
180+
curl -fsS http://localhost:3000/ || (echo 'Frontend health failed' && exit 1)

0 commit comments

Comments
 (0)