1. CI
2. CD
개인 프로젝트에서 CI를 진행해보기 위해서 미리 CI만을 적용해보려고 한다!
* CI (지속적인 통합) 란?
지속적인 통합으로 한 곳에 지속적으로 통합하는 것! 즉, 자동화된 빌드 및 테스트가 수행된 후, 개발자가 코드 변경 사항을 중앙 리포지토리에 정기적으로 병합하는 DevOps 소프트웨어 개발 방식이다. (참고) 모든 변경사항은 자동 빌드 및 테스트를 거쳐 메인 브랜치에 통합된다.
물론 실무에서는 Jenkins를 많이 사용한다고는 하지만 나는 개인으로 하는 프로젝트라 너무 배보다 배꼽이 큰거같기도 하고, Git에서 편리하게 다 제공을 해준다는데 안쓸 이유도 없는 것 같기도 하고 ! 아무튼 CI를 진행해본다는 것 자체로 큰 의미가 있다고 생각한다!
(팀 프로젝트 전에 알았으면 훨씬 더 편했을텐데 !!!!!)
시작해보기
1. repo를 생성
git action으로 가면 친절한 github은 각각의 템플릿을 만들어 두었다. 이걸 사용하면 된다 !
2. 내용 복사 혹은 파일 생성
.github > workflows > ci.yml 파일을 생성하고 해당 파일에 복사한 내용을 복붙한 뒤 수정한다.
나 꽤나 많은 오류를 거쳤다 ,,,,, ㅠ 나의 실패와 성공이 담긴 코드를 보고 싶다면? [링크]
[나의 실패 코드]
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build-docker-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# 1. Java 17 설정
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'adopt'
# 2. Gradle 빌드
- name: Build with Gradle
uses: eskatos/gradle-command-action@v1
with:
gradle-version: '7.5'
args: bootBuildImage
# 3. Spring Boot 애플리케이션 Docker 이미지 빌드
- name: Build Docker Image
run: docker build --build-arg JAR_FILE=build/libs/\*.jar -t ${{ secrets.DOCKERHUB_USERNAME }}/board .
# 4. Docker Hub 로그인 및 이미지 푸시
- name: Push Docker Image to Docker Hub
run: |
echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
docker push ${{ secrets.DOCKERHUB_USERNAME }}/board
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
- Github에 Push나 PR이 main 브랜치로 발생하면 actions이 실행된다.
- JDK는 나의 버전에 따라 17
- Gradle 빌드를 한다. → JAR 파일
- 오류 : web docker build and push
[나의 성공 코드]
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build-docker-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# 1. Java 17 설정
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'adopt'
# 2. Gradle 빌드
- name: Build with Gradle
run: ./gradlew bootJar
# 3. 도커 이미지 빌드 후 도커허브에 push하기
- name: web docker build and push
run: |
docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }} .
docker push ${{ secrets.DOCKER_REPO }}
코드 분석
실패했던 코드와 성공시킨 코드의 차이는 아래와 같다.
1. Gradle 빌드 단계
- ./gradlew boorBuildImage : Spring Boot 애플리케이션을 Docker 이미지로 빌드
- ./gradlew bootJar : Spring Booar 애플리케이션을 JAR 파일로 빌드
빌드 후 jar 파일을 찾아서 Docker image로 변환하지 않고, jar 파일로 빌드 후 Docker image를 생성하는 방법으로 변경하였다.
(이렇게 변경한 이유에는 .gitignore로 제외된 부분으로 인해서 jar 파일을 찾지 못하는것은 아닐까하는 생각때문! .dockerignore도 생각하긴했지만, 별로 상관없었던거같다.)
2. 도커 이미지 빌드 밒 푸시
- docker build : Docker 이미지 빌드, docekr push : Docker Hub에 푸시
- login, build, push 통합
3. (Docker 사용하는 경우) settings에 환경변수를 넣어준다.
- 추가하는 값은 ci.yml 파일안에 있는 secret 값들을 넣어주면 자동으로 환경변수로 등록한 값들을 넣어줘서 실행함
- DOCKER_REPO 는 "도커아이디/이미지명"
4. Dockerfile
FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "app.jar"]
성공
근데 아직 문제가 남아있다!
보안상 github에 push 하지 않은 application.properties을 어떻게 docker로 안전하게 push 할 것인가..!
'Tech > DevOps' 카테고리의 다른 글
[CI][Gradle] GitHub Actions에서 Gradle Build 가볍게 하기 (0) | 2024.04.26 |
---|---|
[CI/CD] 민감정보를 어떻게 관리할 것인가 (application.properties) (0) | 2024.04.24 |
[IntelliJ] 테스트 커버리지(Test coverage), 테스트 코드 측정하기 (0) | 2024.03.26 |
[Docker] 도커로 Mysql 컨테이너 접속하기 (0) | 2024.02.13 |
[CI/CD] Kubernetes Cluster 환경 구축 (0) | 2023.12.13 |
댓글