Skip to content

Commit

Permalink
ci: docker build 및 run 설정 (#4)
Browse files Browse the repository at this point in the history
* fix: docker run 문제 해결

* ci: Dockerfile 환경변수 처리

build 시에 환경변수 설정이 필요합니다.

* feature: 테스트용 member domain 추가

* ci: docker-compose(application) 추가

* ci: docker run 시 환경변수 주입하도록 수정

* docs: docker build 및 run 가이드 추가

* fix: merge confilct 해결

* chore: bootBuildImage 설정

* docs: bootBuildImage 실행 예시로 가이드 수정
  • Loading branch information
0703kyj authored Jan 30, 2024
1 parent f581ffc commit 3837936
Show file tree
Hide file tree
Showing 9 changed files with 150 additions and 35 deletions.
56 changes: 28 additions & 28 deletions .github/workflows/ci-backend.yml
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
name: Java CI with Gradle

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'

- name: Grant execute permisson for gradlew
run: chmod +x gradlew

- name: Build with Gradle
run: ./gradlew clean build
name: Java CI with Gradle

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'

- name: Grant execute permisson for gradlew
run: chmod +x gradlew

- name: Build with Gradle
run: ./gradlew clean build
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -176,4 +176,7 @@ gradle-app.setting
# Java heap dump
*.hprof

### Docker ###
**/.env

# End of https://www.toptal.com/developers/gitignore/api/intellij,gradle,macos
32 changes: 27 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
- MySQL 8.x 기동
- docker runtime 세팅
- [x] docker 설치

# ssh 접속 가이드
- `poten16-server.pem` 파일을 다운로드
- **해당 파일은 오픈채팅방에 요청주시면 전달드리겠습니다.**
Expand All @@ -28,19 +28,36 @@
EOF
```
- `ssh poten16-server` 명령어로 접속
# DB 접속 방법
- **host** : `db-lbpvf.pub-cdb.ntruss.com`
- **user** : `poten16`
- **port** : `3306`
- **password** : 문의주시면 전달드리겠습니다.
```bash
mysql -h db-lbpvf.pub-cdb.ntruss.com -u poten16 -p
```
# Docker Image
- [ ] docker image build 후, docker 실행으로 정상되는지 확인
- [x] docker image build 후, docker 실행으로 정상되는지 확인
# Docker Build 및 run 가이드
- Gradle의 bootJar 실행
- Gradle의 bootBuildImage 실행
```bash
# in local
docker login poten16.kr.ncr.ntruss.com
docker push poten16.kr.ncr.ntruss.com/poten16-server:{version}
# in server
docker pull poten16.kr.ncr.ntruss.com/poten16-server:{version}
./scripts/run_docker.sh
```
```bash
# run_docker.sh
#!/bin/bash
# Docker 실행 (환경변수는 ~/.bash_profile 에 지정함)
docker run -d --name poten16-server -p 8080:8080 -e MYSQL_URL=${MYSQL_URL} -e MYSQL_USERNAME=${MYSQL_USERNAME} -e MYSQL_PASSWORD=${MYSQL_PASSWORD} poten16.kr.ncr.ntruss.com/poten16-server sleep infinity
```
# CI/CD 세팅
- [ ] Github Actions
Expand All @@ -53,8 +70,13 @@ mysql -h db-lbpvf.pub-cdb.ntruss.com -u poten16 -p
# ECR 관련 세팅
- NCP access key, private key
```bash
docker login poten16.kr.ncr.ntruss.com
```
# 환경변수
|이름 | 설명|
|-- | --|
|MYSQL_URL | MYSQL 주소입니다 (JDBC 형태여야 합니다)|
|MYSQL_USERNAME | MYSQL 사용자 명 입니다.|
|MYSQL_PASSWORD | MYSQL 비밀번호 입니다.|
13 changes: 13 additions & 0 deletions docker/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
version: "3"

services:
application:
build: ../subprojects/api
platform: 'linux/amd64'
ports:
- '8080:8080'
environment:
MYSQL_URL: ${MYSQL_URL}
MYSQL_USERNAME: ${MYSQL_USERNAME}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
# restart: always
11 changes: 9 additions & 2 deletions subprojects/api/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
FROM openjdk:21-slim-buster as Builder
FROM openjdk:21-slim-buster AS Builder
WORKDIR /usr/bin/app
COPY build/libs/*.jar app.jar

RUN ["java", "-Djarmode=layertools", "-jar", "app.jar", "extract"]

FROM openjdk:21-slim-buster AS runner
ARG WORK_DIR=/usr/bin/app
#ARG MYSQL_URL
#ARG MYSQL_USERNAME
#ARG MYSQL_PASSWORD
WORKDIR ${WORK_DIR}

#ENV MYSQL_URL=${MYSQL_URL}
#ENV MYSQL_USERNAME=${MYSQL_USERNAME}
#ENV MYSQL_PASSWORD=${MYSQL_PASSWORD}

COPY --from=builder ${WORK_DIR}/dependencies/ ./
COPY --from=builder ${WORK_DIR}/spring-boot-loader/ ./
COPY --from=builder ${WORK_DIR}/snapshot-dependencies/ ./
Expand All @@ -17,7 +24,7 @@ COPY docker/run-java.sh /usr/bin/run-java.sh
RUN apt-get update && apt-get install -y wget
# RUN wget -O dd-java-agent.jar 'https://github.com/DataDog/dd-trace-java/releases/latest/download/dd-java-agent.jar'

ENV JAVA_MAIN_CLASS org.springframework.boot.loader.JarLauncher
ENV JAVA_MAIN_CLASS org.springframework.boot.loader.launch.JarLauncher
ENV JAVA_APP_DIR /usr/bin/app
ENV JAVA_LIB_DIR /usr/bin/app
ENV JAVA_OPTIONS "-ea -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+ExitOnOutOfMemoryError"
Expand Down
7 changes: 7 additions & 0 deletions subprojects/api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,10 @@ dependencies {
tasks.named('test') {
useJUnitPlatform()
}

tasks.named("bootBuildImage") {
imageName = "poten16.kr.ncr.ntruss.com/poten16-server"
tags = ['latest', '0.0.1']
environment["platform"] = 'linux/amd64'
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.poemfoot.api.domain.member.controller;

import com.poemfoot.api.domain.member.dao.MemberRepository;
import com.poemfoot.api.domain.member.domain.Member;
import jakarta.annotation.PostConstruct;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/members")
public class MemberController {
private final MemberRepository memberRepository;

@GetMapping
public List<Member> findAll() {
return memberRepository.findAll();
}

@PostConstruct
public void init() {
memberRepository.save(new Member("poemfoot1"));
memberRepository.save(new Member("poemfoot2"));
memberRepository.save(new Member("poemfoot3"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.poemfoot.api.domain.member.dao;

import com.poemfoot.api.domain.member.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member,Long> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.poemfoot.api.domain.member.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {

@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;

public Member(String username) {
this.username = username;
}
}

0 comments on commit 3837936

Please sign in to comment.