Monday, 23 June 2025

Github 3 - Real-World GitHub Actions Workflow Example

 

Project Goal: Node.js App → Build → Test → Dockerize → Push to ECR → Deploy with Terraform to AWS → Notify via Slack

Workflow File: .github/workflows/deploy.yml


name: CI/CD Pipeline for Node.js App on: push: branches: [main] workflow_dispatch: env: AWS_REGION: us-east-1 ECR_REPO: my-ecr-repo IMAGE_TAG: ${{ github.sha }} jobs: build-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 18 - name: Install dependencies run: npm ci - name: Run tests run: npm test docker-publish: runs-on: ubuntu-latest needs: build-test steps: - uses: actions/checkout@v3 - 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: Build and push Docker image run: | docker build -t $ECR_REPO:$IMAGE_TAG . docker tag $ECR_REPO:$IMAGE_TAG ${{ steps.login-ecr.outputs.registry }}/$ECR_REPO:$IMAGE_TAG docker push ${{ steps.login-ecr.outputs.registry }}/$ECR_REPO:$IMAGE_TAG deploy: runs-on: ubuntu-latest needs: docker-publish steps: - name: Checkout Terraform uses: actions/checkout@v3 - name: Setup Terraform uses: hashicorp/setup-terraform@v3 - name: Terraform Init run: terraform init - name: Terraform Apply run: terraform apply -auto-approve env: TF_VAR_image_tag: ${{ env.IMAGE_TAG }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} notify: runs-on: ubuntu-latest needs: deploy steps: - name: Send Slack Notification uses: slackapi/slack-github-action@v1.24.0 with: payload: | { "text": "✅ CI/CD pipeline completed. Image ${{ env.IMAGE_TAG }} deployed to AWS." } env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

No comments:

Post a Comment