1+ name : CI/CD with github actions & docker
2+
3+ on :
4+ push :
5+ branches : [ "ci-cd/#38-independence-implementation" ]
6+
7+ jobs :
8+ build-and-deploy :
9+ name : Build
10+ runs-on : ubuntu-latest
11+ strategy :
12+ matrix :
13+ service :
14+ - name : " eureka"
15+ folder : " com.bkmarriott.eureka"
16+ - name : " gateway"
17+ folder : " com.bkmarriott.gateway"
18+ - name : " auth"
19+ folder : " com.bkmarriott.auth"
20+ - name : " coupon"
21+ folder : " com.bkmarriott.coupon"
22+ - name : " charge"
23+ folder : " com.bkmarriott.charge"
24+ - name : " promotion"
25+ folder : " com.bkmarriott.promotion"
26+ - name : " hotel"
27+ folder : " com.bkmarriott.hotel"
28+ - name : " reservation"
29+ folder : " com.bkmarriott.reservation"
30+ - name : " payment"
31+ folder : " com.bkmarriott.payment"
32+
33+ steps :
34+ - name : Checkout
35+ uses : actions/checkout@v4
36+
37+ - name : Detect Changed Services
38+ id : detect_changes
39+ run : |
40+ # Get the list of changed files between the current and the previous commit
41+ CHANGED_FILES=$(git diff --name-only HEAD^ HEAD)
42+
43+ # Initialize a variable to store services to include
44+ SERVICES_TO_BUILD=""
45+
46+ # Loop through all services in the matrix
47+ for SERVICE_FOLDER in $(echo "${{ toJSON(matrix.service) }}" | jq -r '.[] | .folder'); do
48+ if echo "$CHANGED_FILES" | grep -q "$SERVICE_FOLDER"; then
49+ SERVICES_TO_BUILD="$SERVICES_TO_BUILD $SERVICE_FOLDER"
50+ fi
51+ done
52+
53+ echo "Services to build: $SERVICES_TO_BUILD"
54+ echo "services_to_build=$SERVICES_TO_BUILD" >> $GITHUB_ENV
55+
56+ - name : Skip Unchanged Services
57+ if : ${{ !env.services_to_build || !contains(env.services_to_build, matrix.service.folder) }}
58+ run : |
59+ echo "Skipping unchanged service: ${{ matrix.service.name }}"
60+
61+ - name : Set up JDK 17
62+ uses : actions/setup-java@v4
63+ with :
64+ java-version : ' 17'
65+ distribution : ' temurin'
66+
67+ - name : Inject application.yml
68+ run : |
69+ if [ "${{ matrix.service.name }}" == "eureka" ]; then
70+ echo "${{ secrets.EUREKA_SERVER_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
71+ elif [ "${{ matrix.service.name }}" == "auth" ]; then
72+ echo "${{ secrets.AUTH_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
73+ elif [ "${{ matrix.service.name }}" == "charge" ]; then
74+ echo "${{ secrets.CHARGE_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
75+ elif [ "${{ matrix.service.name }}" == "coupon" ]; then
76+ echo "${{ secrets.COUPON_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
77+ elif [ "${{ matrix.service.name }}" == "gateway" ]; then
78+ echo "${{ secrets.GATEWAY_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
79+ elif [ "${{ matrix.service.name }}" == "hotel" ]; then
80+ echo "${{ secrets.HOTEL_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
81+ elif [ "${{ matrix.service.name }}" == "promotion" ]; then
82+ echo "${{ secrets.PROMOTION_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
83+ elif [ "${{ matrix.service.name }}" == "reservation" ]; then
84+ echo "${{ secrets.RESERVATION_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
85+ elif [ "${{ matrix.service.name }}" == "payment" ]; then
86+ echo "${{ secrets.PAYMENT_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
87+ fi
88+
89+ - name : Build with Gradle
90+ run : |
91+ cd ${{ matrix.service.folder }}
92+ chmod +x gradlew
93+ ./gradlew clean
94+ ./gradlew build -x test --no-daemon
95+
96+ - name : Build Docker Image
97+ env :
98+ DOCKER_USERNAME : ${{ secrets.DOCKER_USERNAME }}
99+ run : |
100+ cd ${{ matrix.service.folder }}
101+ docker buildx build -t $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest .
102+
103+ - name : Push Docker Image
104+ env :
105+ DOCKER_USERNAME : ${{ secrets.DOCKER_USERNAME }}
106+ DOCKER_PASSWORD : ${{ secrets.DOCKER_PASSWORD }}
107+ run : |
108+ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
109+ docker push $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
110+
111+ - name : Deploy Docker Image to EC2
112+ env :
113+ AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
114+ AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
115+ EC2_SSH_PRIVATE_KEY : ${{ secrets.EC2_SSH_PRIVATE_KEY }}
116+ EC2_INSTANCE_IP : ${{ secrets.EC2_INSTANCE_IP }}
117+ DOCKER_USERNAME : ${{ secrets.DOCKER_USERNAME }}
118+ DOCKER_PASSWORD : ${{ secrets.DOCKER_PASSWORD }}
119+ run : |
120+ # Set up SSH Key for EC2 instance
121+ echo "$EC2_SSH_PRIVATE_KEY" > private_key.pem
122+ chmod 600 private_key.pem
123+
124+ case ${{ matrix.service.name }} in
125+ "eureka")
126+ SERVICE_PORT=${{ secrets.EUREKA_PORT }}
127+ ;;
128+ "gateway")
129+ SERVICE_PORT=${{ secrets.GATEWAY_PORT }}
130+ ;;
131+ "auth")
132+ SERVICE_PORT=${{ secrets.AUTH_PORT }}
133+ ;;
134+ "coupon")
135+ SERVICE_PORT=${{ secrets.COUPON_PORT }}
136+ ;;
137+ "charge")
138+ SERVICE_PORT=${{ secrets.CHARGE_PORT }}
139+ ;;
140+ "promotion")
141+ SERVICE_PORT=${{ secrets.PROMOTION_PORT }}
142+ ;;
143+ "hotel")
144+ SERVICE_PORT=${{ secrets.HOTEL_PORT }}
145+ ;;
146+ "reservation")
147+ SERVICE_PORT=${{ secrets.RESERVATION_PORT }}
148+ ;;
149+ esac
150+
151+ # SSH into EC2 and debug Docker variables
152+ ssh -i private_key.pem -o StrictHostKeyChecking=no ubuntu@$EC2_INSTANCE_IP << EOF
153+ echo "Using Docker image: $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest"
154+ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
155+ sudo docker stop ${{ matrix.service.name }}
156+ sudo docker rm ${{ matrix.service.name }}
157+ sudo docker pull $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
158+ sudo docker run -d --name ${{ matrix.service.name }} -p $SERVICE_PORT:$SERVICE_PORT $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
159+ EOF
0 commit comments