Skip to content

Commit 985ec5d

Browse files
committed
CI/CD: Add GitHub Action Script and Dockerfile
1 parent a5c3030 commit 985ec5d

4 files changed

Lines changed: 165 additions & 1 deletion

File tree

.github/workflows/dev.yml

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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

Dockerfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
FROM openjdk:17-jdk-slim
2+
LABEL authors="mangobutter"
3+
WORKDIR /app
4+
COPY *SNAPSHOT.jar app.jar
5+
EXPOSE 8080
6+
ENTRYPOINT ["java","-jar","app.jar"]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.mangobutter.dev_back;
2+
3+
import org.springframework.beans.factory.annotation.Value;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RestController;
6+
7+
@RestController
8+
public class HelloController {
9+
@Value("${test_env}")
10+
private String test_env;
11+
12+
@GetMapping
13+
public String getHello() {
14+
return "hello";
15+
}
16+
17+
@GetMapping("/test")
18+
public String getTest() {
19+
return test_env;
20+
}
21+
22+
}

src/main/resources/application.yml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
11
spring:
22
application:
3-
name: dev-back
3+
name: dev-back
4+
5+
datasource:
6+
url: jdbc:mysql://localhost:3306/${PROJECT_NAME:mangobutter}?serverTimezone=UTC&characterEncoding=UTF-8
7+
username: root
8+
password: ${MYSQL_PASSWORD:1234}
9+
10+
jpa:
11+
hibernate:
12+
ddl-auto: create-drop
13+
14+
test_env: ${TEST_ENV_VAR:test_is_fail}

0 commit comments

Comments
 (0)