1+ name : CI/CD with github actions & docker
2+
3+ on :
4+ push :
5+ branches : [ "develop", "main" ]
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+ with :
37+ fetch-depth : 2
38+
39+ - name : Detect Changed Services
40+ id : detect_changes
41+ run : |
42+ CHANGED_FILES=$(git diff --name-only HEAD^ HEAD)
43+ echo "Changed files: $CHANGED_FILES"
44+
45+ SERVICES_TO_BUILD=""
46+
47+ for CHANGED_FILE in $CHANGED_FILES; do
48+ FOLDER=$(echo "$CHANGED_FILE" | sed 's/\/.*//')
49+
50+ if [[ ! "$SERVICES_TO_BUILD" =~ "$FOLDER" ]]; then
51+ SERVICES_TO_BUILD="$SERVICES_TO_BUILD $FOLDER"
52+ fi
53+ done
54+
55+ echo "Folders to build: $SERVICES_TO_BUILD"
56+ echo "services_to_build=$SERVICES_TO_BUILD" >> $GITHUB_ENV
57+
58+ - name : Skip Unchanged Services
59+ if : ${{ !contains(env.services_to_build, matrix.service.folder) }}
60+ run : |
61+ echo "Skipping service: ${{ matrix.service.name }}"
62+ exit 0
63+
64+ - name : Set up JDK 17
65+ if : ${{ contains(env.services_to_build, matrix.service.folder) }}
66+ uses : actions/setup-java@v4
67+ with :
68+ java-version : ' 17'
69+ distribution : ' temurin'
70+
71+ - name : Inject application.yml
72+ if : ${{ contains(env.services_to_build, matrix.service.folder) }}
73+ run : |
74+ if [ "${{ matrix.service.name }}" == "eureka" ]; then
75+ echo "${{ secrets.EUREKA_SERVER_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
76+ elif [ "${{ matrix.service.name }}" == "auth" ]; then
77+ echo "${{ secrets.AUTH_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
78+ elif [ "${{ matrix.service.name }}" == "charge" ]; then
79+ echo "${{ secrets.CHARGE_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
80+ elif [ "${{ matrix.service.name }}" == "coupon" ]; then
81+ echo "${{ secrets.COUPON_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
82+ elif [ "${{ matrix.service.name }}" == "gateway" ]; then
83+ echo "${{ secrets.GATEWAY_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
84+ elif [ "${{ matrix.service.name }}" == "hotel" ]; then
85+ echo "${{ secrets.HOTEL_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
86+ elif [ "${{ matrix.service.name }}" == "promotion" ]; then
87+ echo "${{ secrets.PROMOTION_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
88+ elif [ "${{ matrix.service.name }}" == "reservation" ]; then
89+ echo "${{ secrets.RESERVATION_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
90+ elif [ "${{ matrix.service.name }}" == "payment" ]; then
91+ echo "${{ secrets.PAYMENT_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
92+ fi
93+
94+ - name : Build with Gradle
95+ if : ${{ contains(env.services_to_build, matrix.service.folder) }}
96+ run : |
97+ cd ${{ matrix.service.folder }}
98+ chmod +x gradlew
99+ ./gradlew clean
100+ ./gradlew build -x test --no-daemon
101+
102+ - name : Build Docker Image
103+ if : ${{ contains(env.services_to_build, matrix.service.folder) }}
104+ env :
105+ DOCKER_USERNAME : ${{ secrets.DOCKER_USERNAME }}
106+ run : |
107+ cd ${{ matrix.service.folder }}
108+ docker buildx build -t $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest .
109+
110+ - name : Push Docker Image
111+ if : ${{ contains(env.services_to_build, matrix.service.folder) }}
112+ env :
113+ DOCKER_USERNAME : ${{ secrets.DOCKER_USERNAME }}
114+ DOCKER_PASSWORD : ${{ secrets.DOCKER_PASSWORD }}
115+ run : |
116+ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
117+ docker push $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
118+
119+ - name : Deploy Docker Image to EC2
120+ if : ${{ contains(env.services_to_build, matrix.service.folder) }}
121+ env :
122+ AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
123+ AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
124+ EC2_SSH_PRIVATE_KEY : ${{ secrets.EC2_SSH_PRIVATE_KEY }}
125+ EC2_INSTANCE_IP : ${{ secrets.EC2_INSTANCE_IP }}
126+ DOCKER_USERNAME : ${{ secrets.DOCKER_USERNAME }}
127+ DOCKER_PASSWORD : ${{ secrets.DOCKER_PASSWORD }}
128+ run : |
129+ # Set up SSH Key for EC2 instance
130+ echo "$EC2_SSH_PRIVATE_KEY" > private_key.pem
131+ chmod 600 private_key.pem
132+
133+ case ${{ matrix.service.name }} in
134+ "eureka")
135+ SERVICE_PORT=${{ secrets.EUREKA_PORT }}
136+ ;;
137+ "gateway")
138+ SERVICE_PORT=${{ secrets.GATEWAY_PORT }}
139+ ;;
140+ "auth")
141+ SERVICE_PORT=${{ secrets.AUTH_PORT }}
142+ ;;
143+ "coupon")
144+ SERVICE_PORT=${{ secrets.COUPON_PORT }}
145+ ;;
146+ "charge")
147+ SERVICE_PORT=${{ secrets.CHARGE_PORT }}
148+ ;;
149+ "promotion")
150+ SERVICE_PORT=${{ secrets.PROMOTION_PORT }}
151+ ;;
152+ "hotel")
153+ SERVICE_PORT=${{ secrets.HOTEL_PORT }}
154+ ;;
155+ "reservation")
156+ SERVICE_PORT=${{ secrets.RESERVATION_PORT }}
157+ ;;
158+ "payment")
159+ SERVICE_PORT=${{ secrets.PAYMENT_PORT }}
160+ ;;
161+ esac
162+
163+ # SSH into EC2 and debug Docker variables
164+ ssh -i private_key.pem -o StrictHostKeyChecking=no ubuntu@$EC2_INSTANCE_IP << EOF
165+ echo "Using Docker image: $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest"
166+ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
167+ sudo docker stop ${{ matrix.service.name }}
168+ sudo docker rm ${{ matrix.service.name }}
169+ sudo docker pull $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
170+ sudo docker run -d --name ${{ matrix.service.name }} -p $SERVICE_PORT:$SERVICE_PORT $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
171+ EOF
0 commit comments