CI/CD Pipeline for Fortune App #47
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI/CD Pipeline for Fortune App | |
| on: | |
| push: | |
| tags: | |
| - "v*" # tag rule (v1.0.0) | |
| workflow_dispatch: | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v3 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v3 | |
| with: | |
| distribution: 'temurin' | |
| java-version: '17' | |
| - name: Grant execute permission to Gradle Wrapper | |
| run: chmod +x ./gradlew | |
| - name: Extract Version from Tag | |
| run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV | |
| - name: Build with Gradle (Skip Tests) | |
| run: ./gradlew build -x test | |
| - name: Check if JAR file exists | |
| run: ls -l build/libs/ | |
| - name: Build Docker Image with Version | |
| run: docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/fortune-app:${{ env.VERSION }} . | |
| - name: Log in to Docker Hub | |
| run: echo ${{ secrets.DOCKER_HUB_PASSWORD }} | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin | |
| - name: Push Docker Image | |
| run: docker push ${{ secrets.DOCKER_HUB_USERNAME }}/fortune-app:${{ env.VERSION }} | |
| deploy: | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Copy SSH Key | |
| run: | | |
| echo "${{ secrets.EC2_SSH_KEY }}" > fortune-app-key.pem | |
| chmod 600 fortune-app-key.pem | |
| - name: Verify SSH Key | |
| run: ls -l fortune-app-key.pem | |
| - name: Debug SSH Connection | |
| run: ssh -v -o StrictHostKeyChecking=no -i fortune-app-key.pem ${{ vars.EC2_USERNAME }}@${{ vars.EC2_HOST }} "echo Connected" | |
| - name: Extract Version from Tag | |
| run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV | |
| - name: Print DOCKER_HUB_USERNAME | |
| run: echo "DOCKER_HUB_USERNAME=${{ secrets.DOCKER_HUB_USERNAME }}" | |
| - name: Deploy to EC2 | |
| run: | | |
| ssh -o StrictHostKeyChecking=no -i fortune-app-key.pem ${{ vars.EC2_USERNAME }}@${{ vars.EC2_HOST }} << 'EOF' | |
| docker pull mysql:8.0 | |
| docker stop mysql-container || true | |
| docker rm mysql-container || true | |
| docker run -d \ | |
| --name mysql-container \ | |
| -e MYSQL_ROOT_PASSWORD=${{ secrets.MYSQL_ROOT_PASSWORD }} \ | |
| -e MYSQL_DATABASE=fortune_db \ | |
| -p 3306:3306 \ | |
| mysql:8.0 | |
| docker pull redis:latest | |
| docker stop redis-container || true | |
| docker rm redis-container || true | |
| docker run -d \ | |
| --name redis-container \ | |
| -p 6379:6379 \ | |
| redis:latest | |
| docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/fortune-app:${{ env.VERSION }} | |
| docker stop fortune-container || true | |
| docker rm fortune-container || true | |
| docker run -d \ | |
| -p 8080:8080 \ | |
| --name fortune-container \ | |
| --link mysql-container:mysql \ | |
| --link redis-container:redis \ | |
| -e SPRING_PROFILES_ACTIVE=prod \ | |
| -e SERVER_PORT=8080 \ | |
| -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql-container:3306/fortune_db \ | |
| -e SPRING_DATASOURCE_USERNAME=root \ | |
| -e SPRING_DATASOURCE_PASSWORD=${{ secrets.MYSQL_ROOT_PASSWORD }} \ | |
| -e SPRING_REDIS_HOST=redis-container \ | |
| -e SPRING_REDIS_PORT=6379 \ | |
| -e JWT_SECRET=${{ secrets.JWT_SECRET }} \ | |
| -v /home/ubuntu/config/application.properties:/app/config/application.properties \ | |
| -e "SPRING_CONFIG_LOCATION=file:/app/config/" \ | |
| ${{ secrets.DOCKER_HUB_USERNAME }}/fortune-app:${{ env.VERSION }} | |
| EOF |