11name : Build and Deploy
22
33on :
4- push :
5- branches : [ main, feature/terraform-eks ]
4+ push :
5+ branches : [ main, feature/ansible ]
66
77jobs :
88 build-and-push :
99 runs-on : ubuntu-latest
10+ outputs :
11+ image_tag : ${{ steps.meta.outputs.tags }}
1012
1113 steps :
1214 - name : Checkout code
1315 uses : actions/checkout@v4
1416
15- - name : Log in to secrets
17+ - name : Log in to Docker Hub
1618 uses : docker/login-action@v3
1719 with :
1820 username : ${{ secrets.DOCKERHUB_USERNAME }}
1921 password : ${{ secrets.DOCKERHUB_TOKEN }}
2022
21- - name : Build and Push client
23+ - name : Extract Docker metadata
24+ id : meta
25+ uses : docker/metadata-action@v5
26+ with :
27+ images : ${{ secrets.DOCKERHUB_USERNAME }}/task-manager
28+ tags : |
29+ type=sha,prefix=,format=short
30+
31+ - name : Build and push Docker image (client)
2232 uses : docker/build-push-action@v5
2333 with :
2434 context : ./client
2535 push : true
26- tags : |
27- ${{ secrets.DOCKERHUB_USERNAME }}/client:${{ github.run_number }}
28- ${{ secrets.DOCKERHUB_USERNAME }}/client:latest
36+ tags : ${{ secrets.DOCKERHUB_USERNAME }}/task-manager-client:${{ github.sha }}
2937
30- - name : Build and Push server
38+ - name : Build and push Docker image ( server)
3139 uses : docker/build-push-action@v5
3240 with :
3341 context : ./server
3442 push : true
35- tags : |
36- ${{ secrets.DOCKERHUB_USERNAME }}/server:${{ github.run_number }}
37- ${{ secrets.DOCKERHUB_USERNAME }}/server:latest
38-
39- provision :
40- runs-on : ubuntu-latest
41- needs : build-and-push
42-
43- steps :
44- - name : Checkout code
45- uses : actions/checkout@v4
46-
47- - name : Configure AWS Credentials
48- uses : aws-actions/configure-aws-credentials@v2
49- with :
50- aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
51- aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY}}
52- aws-region : ${{ secrets.AWS_REGION }}
53-
54- - name : Setup Terraform
55- uses : hashicorp/setup-terraform@v2
56-
57- - name : Terraform Init
58- run : terraform -chdir=infra init
43+ tags : ${{ secrets.DOCKERHUB_USERNAME }}/task-manager-server:${{ github.sha }}
5944
60- - name : Terraform Plan
61- run : terraform -chdir=infra plan
62-
63- - name : Terraform Apply
64- run : terraform -chdir=infra apply -auto-approve
6545 deploy :
6646 runs-on : ubuntu-latest
67- needs : provision
47+ needs : build-and-push
6848
6949 steps :
7050 - name : Checkout code
7151 uses : actions/checkout@v4
7252
73- - name : Configure AWS Credentials
74- uses : aws-actions/configure-aws-credentials@v2
75- with :
76- aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
77- aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY}}
78- aws-region : ${{ secrets.AWS_REGION }}
79-
80- - name : Set up kubectl
81- uses : azure/setup-kubectl@v3
53+ - name : Write SSH private key for Ansible droplet
54+ run : |
55+ mkdir -p ~/.ssh
56+ echo "${{ secrets.ANSIBLE_DROPLET_SSH_KEY }}" > ~/.ssh/ansible_droplet.pem
57+ chmod 600 ~/.ssh/ansible_droplet.pem
8258
83- - name : Configure kubeconfig
59+ - name : Write EC2 SSH key (used by Ansible on the droplet)
8460 run : |
85- aws eks update-kubeconfig --region ${{ secrets.AWS_REGION }} --name ${{ secrets.EKS_CLUSTER_NAME }}
61+ echo "${{ secrets.EC2_SSH_KEY }}" > /tmp/ssh-key.pem
62+ chmod 600 /tmp/ssh-key.pem
8663
87- - name : Update image tags
64+ - name : Copy Ansible files to droplet
8865 run : |
89- sed -i "s|image: ${{ secrets.DOCKERHUB_USERNAME }}/server:.*|image: ${{ secrets.DOCKERHUB_USERNAME }}/server:${{ github.run_number }}|" k8s/backend/deployment.yaml
90- sed -i "s|image: ${{ secrets.DOCKERHUB_USERNAME }}/client:.*|image: ${{ secrets.DOCKERHUB_USERNAME }}/client:${{ github.run_number }}|" k8s/frontend/deployment.yaml
66+ scp -i ~/.ssh/ansible_droplet.pem \
67+ -o StrictHostKeyChecking=no \
68+ -r .ansible/ \
69+ ${{ secrets.ANSIBLE_DROPLET_USER }}@${{ secrets.ANSIBLE_DROPLET_HOST }}:~/ansible/
9170
92- - name : Deploy to EKS Cluster
71+ - name : Copy EC2 SSH key to droplet
9372 run : |
94- kubectl apply -f k8s/postgres/secret.yaml
95- kubectl apply -f k8s/postgres/deployment.yaml
96- kubectl apply -f k8s/backend/deployment.yaml
97- kubectl apply -f k8s/frontend/deployment.yaml
98- kubectl rollout status deployment/backend --timeout=300s
99- kubectl rollout status deployment/frontend --timeout=300s
73+ scp -i ~/.ssh/ansible_droplet.pem \
74+ -o StrictHostKeyChecking=no \
75+ /tmp/ssh-key.pem \
76+ ${{ secrets.ANSIBLE_DROPLET_USER }}@${{ secrets.ANSIBLE_DROPLET_HOST }}:~/.ssh-key.pem
10077
101- - name : Verify deployment
78+ - name : Run Ansible playbook on droplet
10279 run : |
103- kubectl get pods
104- kubectl get services
80+ ssh -i ~/.ssh/ansible_droplet.pem \
81+ -o StrictHostKeyChecking=no \
82+ ${{ secrets.ANSIBLE_DROPLET_USER }}@${{ secrets.ANSIBLE_DROPLET_HOST }} \
83+ "cd ~/ansible && \
84+ export AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }} && \
85+ export AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }} && \
86+ export AWS_REGION=ap-southeast-1 && \
87+ ansible-playbook deploy-docker-new-user.yaml \
88+ -e image_tag=${{ github.sha }} \
89+ -e dockerhub_username=${{ secrets.DOCKERHUB_USERNAME }}"
0 commit comments