1+ name : Java CI/CD with Gradle
2+
3+ on :
4+ push :
5+ branches : [ "main","dev","test" ]
6+ pull_request :
7+ branches : [ "main","dev","test" ]
8+
9+ jobs :
10+ test :
11+ runs-on : ubuntu-latest
12+ permissions :
13+ contents : read
14+
15+ steps :
16+ - uses : actions/checkout@v4
17+ - name : Set up JDK 17
18+ uses : actions/setup-java@v4
19+ with :
20+ java-version : ' 17'
21+ distribution : ' temurin'
22+
23+ - name : Setup Gradle
24+ uses : gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
25+
26+ - name : Test with Gradle Wrapper
27+ run : ./gradlew test
28+
29+ build :
30+ runs-on : ubuntu-latest
31+ permissions :
32+ contents : read
33+
34+ steps :
35+ - uses : actions/checkout@v4
36+ - name : Set up JDK 17
37+ uses : actions/setup-java@v4
38+ with :
39+ java-version : ' 17'
40+ distribution : ' temurin'
41+
42+ - name : Cache Gradle packages
43+ uses : actions/cache@v4
44+ with :
45+ path : |
46+ ~/.gradle/caches
47+ ~/.gradle/wrapper
48+ key : gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
49+ restore-keys : |
50+ gradle-${{ runner.os }}-
51+
52+ - name : Setup Gradle
53+ uses : gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
54+
55+ - name : Build with Gradle Wrapper
56+ run : ./gradlew build
57+
58+ - name : Upload Build Artifact
59+ uses : actions/upload-artifact@v4
60+ with :
61+ name : build-artifact
62+ path : build/libs/*SNAPSHOT.jar
63+
64+ docker-image-upload :
65+ runs-on : ubuntu-latest
66+ if : |
67+ !contains(github.event.head_commit.message, 'skip deploy') &&
68+ !contains(github.event.pull_request.body, 'skip deploy')
69+ needs : test
70+ steps :
71+ - uses : actions/checkout@v3.3.0
72+
73+ - name : Download Build Artifact
74+ uses : actions/download-artifact@v4
75+ with :
76+ name : build-artifact
77+ path : .
78+
79+ - name : login to docker hub
80+ uses : docker/login-action@v2
81+ with :
82+ username : ${{ secrets.DOCKERHUB_USERNAME }}
83+ password : ${{ secrets.DOCKERHUB_PASSWORD }}
84+
85+ - name : Set up Docker Buildx
86+ uses : docker/setup-buildx-action@v2
87+
88+ - name : Build and push
89+ uses : docker/build-push-action@v3
90+ with :
91+ context : .
92+ file : ./Dockerfile
93+ push : true
94+ tags : ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}:latest
95+
96+ deploy :
97+ runs-on : ubuntu-latest
98+ needs : docker-image-upload
99+ steps :
100+ - uses : actions/checkout@v3.3.0
101+
102+ - name : execute remote ssh
103+ uses : appleboy/ssh-action@master
104+ with :
105+ host : ${{ secrets.DEV_AWS_EC2_HOST }}
106+ username : ${{ secrets.DEV_AWS_EC2_USERNAME }}
107+ key : ${{ secrets.DEV_AWS_EC2_SSH_KEY }}
108+ port : 22
109+ script : |
110+ cd /home/ubuntu/workspace
111+ rm .env
112+ touch .env
113+ echo "PROJECT_NAME=${{ secrets.PROJECT_NAME }}" >> .env
114+ # echo "GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}" >> .env
115+ # echo "GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}" >> .env
116+ echo "MYSQL_DATABASE=${{ secrets.PROJECT_NAME }}" >> .env
117+ echo "MYSQL_USER=admin" >> .env
118+ echo "MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}" >> .env
119+ echo "SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/${{ secrets.PROJECT_NAME }}" >> .env
120+ echo "SPRING_DATASOURCE_USERNAME=admin" >> .env
121+ echo "SPRING_DATASOURCE_PASSWORD=${{ secrets.MYSQL_PASSWORD }}" >> .env
122+ echo "TEST_ENV_VAR=${{ secrets.TEST_ENV_VAR }}" >> .env
123+ echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
124+ docker-compose down -v
125+ docker-compose up -d
0 commit comments