Skip to content

Deploy Workflow

Deploy Workflow #43

Workflow file for this run

name: Deploy Workflow
on:
push:
branches:
- main
workflow_dispatch:
inputs:
build_number:
description: 'Build number to deploy (optional)'
required: false
type: string
jobs:
build-and-deploy:
runs-on: ubuntu-latest
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_IMAGE_NAME: product-service
DOCKER_COMPOSE_APP_SERVICE_NAME: product-service
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
EC2_SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
EC2_PUBLIC_IP_ADDRESS: ${{ secrets.EC2_PUBLIC_IP_ADDRESS }}
steps:
- name: Checkout (only if no build number provided)
if: ${{ github.event.inputs.build_number == '' }}
uses: actions/checkout@v4
- name: JDK (only if no build number provided)
if: ${{ github.event.inputs.build_number == '' }}
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- name: Generate Build Number
id: build_number
run: |
if [ -n "${{ github.event.inputs.build_number }}" ]; then
BUILD_NUMBER="${{ github.event.inputs.build_number }}"
echo "Using provided build number: $BUILD_NUMBER"
else
BUILD_NUMBER=$(date +'%d%m%Y%H%M%S')
echo "Generated Build Number: $BUILD_NUMBER"
fi
echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITHUB_ENV
echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_PASSWORD }}
- name: Check if Docker image exists
id: check_image
run: |
IMAGE_NAME="${{ env.DOCKER_USERNAME }}/${{ env.DOCKER_IMAGE_NAME }}:${{ steps.build_number.outputs.build_number }}"
echo "Checking if image exists: $IMAGE_NAME"
if docker manifest inspect "$IMAGE_NAME" >/dev/null 2>&1; then
echo "Image exists: $IMAGE_NAME"
echo "image_exists=true" >> $GITHUB_OUTPUT
else
echo "Image does not exist: $IMAGE_NAME"
echo "image_exists=false" >> $GITHUB_OUTPUT
fi
- name: Maven Clean Verify (only if no build number provided and image doesn't exist)
if: ${{ github.event.inputs.build_number == '' && steps.check_image.outputs.image_exists == 'false' }}
run: mvn -B -ntp clean verify jib:build -Ddocker.image.tag=${{ steps.build_number.outputs.build_number }}
- name: Setup SSH Agent
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ env.EC2_SSH_PRIVATE_KEY }}
- name: SSH To EC2 and Deploy
run: |
ssh -o StrictHostKeyChecking=no ec2-user@$EC2_PUBLIC_IP_ADDRESS << EOF
cd ~
sed -i 's|image: '"$DOCKER_USERNAME"'/'"$DOCKER_IMAGE_NAME"':.*$|image: '"$DOCKER_USERNAME"'/'"$DOCKER_IMAGE_NAME"':'"$BUILD_NUMBER"'|' docker-compose.yml
docker-compose pull
docker-compose up -d '$DOCKER_COMPOSE_APP_SERVICE_NAME'
docker image prune -f
docker ps
echo "$BUILD_NUMBER" > build-number.txt
EOF