Skip to content

fix Update and Deploy.yml #83

fix Update and Deploy.yml

fix Update and Deploy.yml #83

Workflow file for this run

name: Deploy Blogify to EC2
on:
push:
branches: [ main ]
env:
AWS_REGION: ${{ secrets.AWS_REGION }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
EC2_HOST: ${{ secrets.EC2_HOST }}
EC2_USER: ${{ secrets.EC2_USER }}
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: Blogapp
steps:
- name: Checkout latest code
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Prune previous images
run: |
retain=2
repo=${{ secrets.ECR_REPOSITORY }}
images=$(aws ecr describe-images --repository-name $repo --query 'imageDetails[*].{imagePushedAt:imagePushedAt,imageDigest:imageDigest}' --output json | jq -r 'sort_by(.imagePushedAt) | reverse | .['${retain}':] | .[].imageDigest')
if [ -n "$images" ]; then
echo "Deleting old images: $images"
for digest in $images; do
aws ecr batch-delete-image --repository-name $repo --image-ids imageDigest=$digest
done
else
echo "No images to prune."
fi
- name: Build, tag, and push images to Amazon ECR
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
VITE_API_BACKEND_URL: ${{ secrets.VITE_API_BACKEND_URL }}
VITE_GOOGLE_CLIENT_ID: ${{ secrets.VITE_GOOGLE_CLIENT_ID }}
GITHUB_SHA: ${{ github.sha }}
run: |
# Build and push API image
docker build --no-cache -t $ECR_REGISTRY/$ECR_REPOSITORY:api-${GITHUB_SHA} ./api
docker push $ECR_REGISTRY/$ECR_REPOSITORY:api-${GITHUB_SHA}
# Build and push Client image
docker build --no-cache -t $ECR_REGISTRY/$ECR_REPOSITORY:client-${GITHUB_SHA} \
--build-arg VITE_API_BACKEND_URL=$VITE_API_BACKEND_URL \
--build-arg VITE_GOOGLE_CLIENT_ID=$VITE_GOOGLE_CLIENT_ID \
./client
docker push $ECR_REGISTRY/$ECR_REPOSITORY:client-${GITHUB_SHA}
- name: Update docker-compose.yml
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
VITE_API_BACKEND_URL: ${{ secrets.VITE_API_BACKEND_URL }}
GITHUB_SHA: ${{ github.sha }}
run: |
cat > docker-compose.yml <<EOL
version: '3.8'
services:
client:
image: ${ECR_REGISTRY}/${ECR_REPOSITORY}:client-${GITHUB_SHA}
ports:
- "5173:80"
depends_on:
- api
environment:
- VITE_API_BACKEND_URL=\${VITE_API_BACKEND_URL}
- VITE_GOOGLE_CLIENT_ID=\${VITE_GOOGLE_CLIENT_ID}
env_file:
- .env
api:
image: ${ECR_REGISTRY}/${ECR_REPOSITORY}:api-${GITHUB_SHA}
ports:
- "4000:4000"
env_file:
- .env
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- client
- api
EOL
echo "Updated docker-compose.yml:"
cat docker-compose.yml
- name: Deploy to EC2
env:
PRIVATE_KEY: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
run: |
echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
scp -i private_key -o StrictHostKeyChecking=no docker-compose.yml $EC2_USER@$EC2_HOST:~/
scp -i private_key -o StrictHostKeyChecking=no nginx.conf $EC2_USER@$EC2_HOST:~/
ssh -i private_key -o StrictHostKeyChecking=no $EC2_USER@$EC2_HOST "
aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin $ECR_REGISTRY
docker compose pull
docker compose up -d
docker system prune -af
"
- name: Cleanup
if: always()
run: rm -f private_key