1- name : CD with Gradle
1+ name : backend cd
22
33on :
44 push :
5- branches : [ "main", "dev" ]
5+ branches : [ main, dev ]
6+
7+ concurrency :
8+ group : ${{ github.workflow }}-${{ github.ref }}
9+ cancel-in-progress : true
10+
11+ env :
12+ DOCKER_IMAGE_REPO : ${{ secrets.DOCKER_IMAGE_REPO }} # ex) hyuneun/crame
613
714jobs :
8- deploy :
15+ build :
916 runs-on : ubuntu-latest
10-
1117 steps :
1218 - uses : actions/checkout@v4
1319
14- - name : Set up JDK 21
20+ - name : Set up JDK 17
1521 uses : actions/setup-java@v4
1622 with :
17- java-version : ' 21'
18- distribution : ' temurin'
19-
20- - name : Create application.yml with secrets (dev)
21- if : github.ref == 'refs/heads/dev'
22- run : |
23- mkdir -p src/main/resources
24- echo "spring:" >> src/main/resources/application.yml
25- echo " jwt:" >> src/main/resources/application.yml
26- echo " secret: \"${{ secrets.JWT_SECRET }}\"" >> src/main/resources/application.yml
27- echo " access-token-duration: 10D" >> src/main/resources/application.yml
28- echo " refresh-token-duration: 100D" >> src/main/resources/application.yml
29- echo " security:" >> src/main/resources/application.yml
30- echo " oauth2:" >> src/main/resources/application.yml
31- echo " client:" >> src/main/resources/application.yml
32- echo " registration:" >> src/main/resources/application.yml
33- echo " google:" >> src/main/resources/application.yml
34- echo " client-id: \"${{ secrets.GOOGLE_CLIENT_ID }}\"" >> src/main/resources/application.yml
35- echo " client-secret: \"${{ secrets.GOOGLE_CLIENT_SECRET }}\"" >> src/main/resources/application.yml
36- echo " scope:" >> src/main/resources/application.yml
37- echo " - email" >> src/main/resources/application.yml
38- echo " - profile" >> src/main/resources/application.yml
39- echo " redirect-uri: https://dev.crame.site/login/oauth2/code/google" >> src/main/resources/application.yml
40- echo " data:" >> src/main/resources/application.yml
41- echo " mongodb:" >> src/main/resources/application.yml
42- echo " uri: \"${{ secrets.MONGO_URI_DEV }}\"" >> src/main/resources/application.yml
43- echo " redis:" >> src/main/resources/application.yml
44- echo " host: redis" >> src/main/resources/application.yml
45- echo " port: 6379" >> src/main/resources/application.yml
46- echo " password: \"${{ secrets.REDIS_PASSWORD }}\"" >> src/main/resources/application.yml
47- echo " mail:" >> src/main/resources/application.yml
48- echo " host: smtp.gmail.com" >> src/main/resources/application.yml
49- echo " port: 587" >> src/main/resources/application.yml
50- echo " username: \"${{ secrets.MAIL_USERNAME }}\"" >> src/main/resources/application.yml
51- echo " password: \"${{ secrets.MAIL_PASSWORD }}\"" >> src/main/resources/application.yml
52- echo " properties:" >> src/main/resources/application.yml
53-
54- echo " mail.smtp.auth: true" >> src/main/resources/application.yml
55- echo " mail.smtp.starttls.enable: true" >> src/main/resources/application.yml
56- echo " mail.smtp.connectiontimeout: 5000" >> src/main/resources/application.yml
57- echo " mail.smtp.timeout: 5000" >> src/main/resources/application.yml
58- echo " mail.smtp.writetimeout: 5000" >> src/main/resources/application.yml
59- echo " mail.mime.charset: UTF-8" >> src/main/resources/application.yml
60- echo " default-encoding: UTF-8" >> src/main/resources/application.yml
23+ java-version : ' 17'
24+ distribution : temurin
6125
62- echo "app:" >> src/main/resources/application.yml
63- echo " secrets:" >> src/main/resources/application.yml
64- echo " master-key-base64: \"${{ secrets.MASTER_KEY_BASE64 }}\"" >> src/main/resources/application.yml
65- echo " key-version: kv1" >> src/main/resources/application.yml
66- echo " mail:" >> src/main/resources/application.yml
67- echo " from: \"${{ secrets.MAIL_USERNAME }}\"" >> src/main/resources/application.yml
68- echo " from-personal: \"CRAME\"" >> src/main/resources/application.yml
26+ - name : Build (skip tests)
27+ run : ./gradlew build -x test
6928
70- echo "otp:" >> src/main/resources/application.yml
71- echo " ttl-seconds: 300" >> src/main/resources/application.yml
72- echo " cooldown-seconds: 60" >> src/main/resources/application.yml
73- echo " max-attempts: 5" >> src/main/resources/application.yml
74- echo " rate:" >> src/main/resources/application.yml
75- echo " window-seconds: 60" >> src/main/resources/application.yml
76- echo " max-per-window: 6" >> src/main/resources/application.yml
77- echo "springdoc:" >> src/main/resources/application.yml
78- echo " swagger-ui:" >> src/main/resources/application.yml
79- echo " path: /swagger-ui.html" >> src/main/resources/application.yml
80- echo " default-server-url: https://dev.crame.site" >> src/main/resources/application.yml
81- echo " servers:" >> src/main/resources/application.yml
82- echo " - url: https://dev.crame.site" >> src/main/resources/application.yml
83-
84- - name : Print application.yml (dev)
85- if : github.ref == 'refs/heads/dev'
86- run : |
87- echo "====== DEV application.yml ======"
88- cat src/main/resources/application.yml
89-
90- - name : Create application.yml with secrets (main)
91- if : github.ref == 'refs/heads/main'
92- run : |
93- mkdir -p src/main/resources
94- echo "spring:" >> src/main/resources/application.yml
95- echo " jwt:" >> src/main/resources/application.yml
96- echo " secret: \"${{ secrets.JWT_SECRET }}\"" >> src/main/resources/application.yml
97- echo " access-token-duration: 10D" >> src/main/resources/application.yml
98- echo " refresh-token-duration: 100D" >> src/main/resources/application.yml
99- echo " security:" >> src/main/resources/application.yml
100- echo " oauth2:" >> src/main/resources/application.yml
101- echo " client:" >> src/main/resources/application.yml
102- echo " registration:" >> src/main/resources/application.yml
103- echo " google:" >> src/main/resources/application.yml
104- echo " client-id: \"${{ secrets.GOOGLE_CLIENT_ID }}\"" >> src/main/resources/application.yml
105- echo " client-secret: \"${{ secrets.GOOGLE_CLIENT_SECRET }}\"" >> src/main/resources/application.yml
106- echo " scope:" >> src/main/resources/application.yml
107- echo " - email" >> src/main/resources/application.yml
108- echo " - profile" >> src/main/resources/application.yml
109- echo " redirect-uri: https://crame.site/login/oauth2/code/google" >> src/main/resources/application.yml
110- echo " data:" >> src/main/resources/application.yml
111- echo " mongodb:" >> src/main/resources/application.yml
112- echo " uri: \"${{ secrets.MONGO_URI }}\"" >> src/main/resources/application.yml
113- echo " redis:" >> src/main/resources/application.yml
114- echo " host: redis" >> src/main/resources/application.yml
115- echo " port: 6379" >> src/main/resources/application.yml
116- echo " password: \"${{ secrets.REDIS_PASSWORD }}\"" >> src/main/resources/application.yml
117- echo " mail:" >> src/main/resources/application.yml
118- echo " host: smtp.gmail.com" >> src/main/resources/application.yml
119- echo " port: 587" >> src/main/resources/application.yml
120- echo " username: \"${{ secrets.MAIL_USERNAME }}\"" >> src/main/resources/application.yml
121- echo " password: \"${{ secrets.MAIL_PASSWORD }}\"" >> src/main/resources/application.yml
122- echo " properties:" >> src/main/resources/application.yml
123- echo " mail.smtp.auth: true" >> src/main/resources/application.yml
124- echo " mail.smtp.starttls.enable: true" >> src/main/resources/application.yml
125- echo " mail.smtp.connectiontimeout: 5000" >> src/main/resources/application.yml
126- echo " mail.smtp.timeout: 5000" >> src/main/resources/application.yml
127- echo " mail.smtp.writetimeout: 5000" >> src/main/resources/application.yml
128- echo " mail.mime.charset: UTF-8" >> src/main/resources/application.yml
129- echo " default-encoding: UTF-8" >> src/main/resources/application.yml
130-
131- echo "app:" >> src/main/resources/application.yml
132- echo " secrets:" >> src/main/resources/application.yml
133- echo " master-key-base64: \"${{ secrets.MASTER_KEY_BASE64 }}\"" >> src/main/resources/application.yml
134- echo " key-version: kv1" >> src/main/resources/application.yml
135- echo " mail:" >> src/main/resources/application.yml
136- echo " from: \"${{ secrets.MAIL_USERNAME }}\"" >> src/main/resources/application.yml
137- echo " from-personal: \"CRAME\"" >> src/main/resources/application.yml
138-
139- echo "otp:" >> src/main/resources/application.yml
140- echo " ttl-seconds: 300" >> src/main/resources/application.yml
141- echo " cooldown-seconds: 60" >> src/main/resources/application.yml
142- echo " max-attempts: 5" >> src/main/resources/application.yml
143- echo " rate:" >> src/main/resources/application.yml
144- echo " window-seconds: 60" >> src/main/resources/application.yml
145- echo " max-per-window: 6" >> src/main/resources/application.yml
146- echo "springdoc:" >> src/main/resources/application.yml
147- echo " swagger-ui:" >> src/main/resources/application.yml
148- echo " path: /swagger-ui.html" >> src/main/resources/application.yml
149-
150- - name : Build with Gradle Wrapper
151- run : |
152- chmod +x ./gradlew
153- ./gradlew build -x test
29+ - name : Docker login
30+ uses : docker/login-action@v3
31+ with :
32+ username : ${{ secrets.DOCKER_USERNAME }}
33+ password : ${{ secrets.DOCKER_TOKEN }}
15434
155- - name : Transfer .jar file to EC2
156- uses : appleboy/scp- action@master
35+ - name : Build & Push image
36+ uses : docker/build-push- action@v6
15737 with :
158- host : ${{ secrets.SSH_HOST }}
159- username : ubuntu
160- key : ${{ secrets.SSH_KEY }}
161- source : " build/libs/*.jar"
162- target : " /home/ubuntu/crame"
38+ context : .
39+ push : true
40+ platforms : linux/arm64
41+ tags : |
42+ ${{ env.DOCKER_IMAGE_REPO }}:${{ github.ref_name }}
43+ ${{ env.DOCKER_IMAGE_REPO }}:${{ github.sha }}
16344
164- - name : Restart docker compose on EC2
45+ deploy :
46+ needs : build
47+ runs-on : ubuntu-latest
48+ steps :
49+ - name : Deploy on server
16550 uses : appleboy/ssh-action@master
16651 with :
16752 host : ${{ secrets.SSH_HOST }}
16853 username : ubuntu
16954 key : ${{ secrets.SSH_KEY }}
17055 script : |
171- cd ~/crame
172- docker compose up -d --build
173- docker image prune -f
56+ set -e
57+ cd /home/ubuntu/crame
58+ [ -f .env ] || touch .env
59+
60+ # DOCKER_IMAGE_REPO 업데이트
61+ if grep -q '^DOCKER_IMAGE_REPO=' .env; then
62+ sed -i "s|^DOCKER_IMAGE_REPO=.*|DOCKER_IMAGE_REPO=${{ env.DOCKER_IMAGE_REPO }}|" .env
63+ else
64+ echo "DOCKER_IMAGE_REPO=${{ env.DOCKER_IMAGE_REPO }}" >> .env
65+ fi
66+
67+ # 브랜치명(main/dev)으로 태그 업데이트
68+ if grep -q '^DOCKER_IMAGE_TAG=' .env; then
69+ sed -i "s|^DOCKER_IMAGE_TAG=.*|DOCKER_IMAGE_TAG=${{ github.ref_name }}|" .env
70+ else
71+ echo "DOCKER_IMAGE_TAG=${{ github.ref_name }}" >> .env
72+ fi
73+
74+ docker compose pull
75+ docker compose up -d
76+ docker image prune -f
0 commit comments