diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 700f83c7c..6e8e6d5d1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,21 +1,98 @@ -name: Deploy PetClinic - -on: - workflow_dispatch: - inputs: - environment: - description: 'Environment to deploy to' - required: true - default: 'dev' - type: choice - options: - - dev - - staging - - prod - -jobs: - test-job: - runs-on: ubuntu-latest - steps: - - name: Echo Environment - run: echo "Selected environment is ${{ github.event.inputs.environment }}" +--- + name: Deploy PetClinic + + on: + workflow_dispatch: + inputs: + environment: + description: 'Environment to deploy to' + required: true + default: 'dev' + type: choice + options: + - dev + - staging + - prod + + jobs: + deploy-infrastructure: + runs-on: ubuntu-latest + environment: ${{ github.event.inputs.environment }} + steps: + - uses: actions/checkout@v3 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-west-2 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v2 + - name: Terraform Init + working-directory: ./terraform + run: terraform init + - name: Terraform Plan + working-directory: ./terraform + run: | + terraform plan -var="environment=${{ github.event.inputs.environment }}" \ + -var="db_username=${{ secrets.DB_USERNAME }}" \ + -var="db_password=${{ secrets.DB_PASSWORD }}" \ + -var="vpc_id=${{ secrets.VPC_ID }}" + - name: Terraform Apply + if: github.event.inputs.environment != 'prod' + working-directory: ./terraform + run: | + terraform apply -auto-approve -var="environment=${{ github.event.inputs.environment }}" \ + -var="db_username=${{ secrets.DB_USERNAME }}" \ + -var="db_password=${{ secrets.DB_PASSWORD }}" \ + -var="vpc_id=${{ secrets.VPC_ID }}" + - name: Terraform Apply (Production) + if: github.event.inputs.environment == 'prod' + working-directory: ./terraform + run: | + terraform apply -var="environment=${{ github.event.inputs.environment }}" \ + -var="db_username=${{ secrets.DB_USERNAME }}" \ + -var="db_password=${{ secrets.DB_PASSWORD }}" \ + -var="vpc_id=${{ secrets.VPC_ID }}" + + build-and-deploy: + needs: deploy-infrastructure + runs-on: ubuntu-latest + environment: ${{ github.event.inputs.environment }} + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-west-2 + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + - name: Build, tag, and push image to Amazon ECR + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + ECR_REPOSITORY: petclinic-${{ github.event.inputs.environment }} + IMAGE_TAG: ${{ github.sha }} + run: | + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . + docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest + - name: Deploy to ECS + run: | + aws ecs update-service --cluster petclinic-${{ github.event.inputs.environment }} \ + --service petclinic-service \ + --force-new-deployment + - name: Verify Deployment + run: | + echo "Waiting for deployment to complete..." + aws ecs wait services-stable --cluster petclinic-${{ github.event.inputs.environment }} \ + --services petclinic-service \ No newline at end of file