깃허브 액션으로 CI 자동화하기 + 도커로 배포 알아보기
일반적인 CI/CD의 절차로 아래 방식대로 진행할 예정이다.
CI 절차 : Develope -> Test -> Build -> Build Docker Image -> Push
CD 절차 : Pull -> Run
파란색 영역 : Docker 관련 영역
CI/CD 전략
아래 예시에는 깃허브 액션과 젠킨스가 있지만 이번에는 깃허브 액션을 이용하여 CI/CD 전략을 구성하려고 한다.
1. Develope: Local 에서 수행
2. Test : Local 또는 Gihub Actions / Jenkins 에서 수행
3. Build : Local 또는 Gihub Actions / Jenkins 에서 수행
4. Build Docker Image : Local 또는 Gihub Actions / Jenkins 에서 수행
5. Push Docker Image to Registry : Local 또는 Gihub Actions / Jenkins 에서 수행
6. Pull Docker Image from Registry : Local 또는 Gihub Actions / Jenkins 에서 수행
7. Run Docker Image : Server 에서 수행
Github Actions란?
Github Actions 동작 원리
Github Actions는 프로젝트 내에서 자동화된 작업을 실행할 수 있게 해주는 CI/CD 도구이다. 이 도구는 커밋, 풀 리퀘스트, 이슈 생성 등 다양한 이벤트를 기준으로 동작하여 개발자가 설정한 자동화
fabric0de.tistory.com
Github Actions는 Github에서 제공하는 CI/CD 도구이다. 코드 변경이 있을 때마다 특정 작업(workflow)을 자동으로 실행할 수 있다. 이 작업들은 YAML 파일로 정의되며 코드가 푸시될 때마다 설정된 규칙에 따라 빌드, 테스트, 배포 등의 작업을 처리한다.
Github Actions의 주요 특징
- 자동화된 빌드 및 테스트: 코드가 푸시될 때마다 자동으로 테스트와 빌드를 수행한다.
- 멀티 플랫폼 지원: 리눅스, 윈도우, macOS 등 다양한 환경에서 실행 가능하다.
- 유연한 설정: 조건에 따라 다양한 작업을 설정하고 실행할 수 있다.
CI 준비하기 (배포 코드 작성 및 깃허브 업로드)
아래 깃허브 링크를 참고하면 이번 포스팅에 작성된 코드를 볼 수 있다.
GitHub - fabric0de/github_action_tur
Contribute to fabric0de/github_action_tur development by creating an account on GitHub.
github.com
CI의 첫번째 절차로는 우선 Develope이 되어야 하기 때문에 개발한 코드나 새로운 프로젝트를 새로 생성하여 프로젝트를 준비한다.
준비가 되었다면 프로젝트에 .github/workflows/hello_github_action.yml 을 생성한다. ("hello_github_action.yml " 파일명 외에는 변경되면 안된다.)
추가로 workflows 안에는 n개의 workflow가 들어갈 수 있다.
hello_github_action.yml 예시 코드
name: Java CI with Gradle
# master 브랜치에 push, PR 이벤트 발생시 동작.
on:
push:
branches: ["main"]
pull_request:
branches: ["main"]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# (1) 프로그램 빌드 (Java 빌드) 1) Java 및 Docker 빌드를 위한 환경 설정
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: "17"
distribution: "temurin"
# (1) 프로그램 빌드 (Java 빌드) 2) Java 빌드를 위한 ./gradlew 파일 권한 변경
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
# (1) 프로그램 빌드 (Java 빌드) 3) Java 빌드
- name: Spring Boot Build
run: ./gradlew clean build
# (2) Docker 이미지 빌드 1) DockerFile 을 기반으로 Docker Image 빌드
- name: docker image build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo .
# (2) Docker 이미지 빌드 2) Docker Hub 에 Login
- name: docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PW }}
# (2) Docker 이미지 빌드 3) Docker Hub 에 빌드된 이미지 push
- name: docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
그 이후 Dockerfile을 같이 깃허브에 올려야 GithubAction 동작 스크립트에서 Docker를 통한 이미지 빌드가 가능해진다.
Dockerfile 예시 코드
FROM amazoncorretto:17-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
여기까지 완료되었다면 Dockerfile과 hello_github_action.yml 파일을 깃허브에 같이 푸쉬해준다.
여기까지 완료 했음에도 오류가 깃허브 액션에 오류가 발생할텐데 그 이유는
${{ secrets.DOCKERHUB_USERNAME}} 과
${{ secrets.DOCKERHUB_PW}} 에 값이 채워지지 않아서 그렇다.
Docker 회원가입 및 인증 키 발급 받기
위에 값들을 채워주기 위해서 먼저 도커 허브에 접속하여 회원가입을 해야한다.
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
회원가입이 완료되었다면 우측 상단에 프로필을 누른다. 그 다음 Account settings를 클릭한다.
Security 항목에 "Personal access tokens"를 클릭한다. 페이지가 전환되면 "Generate new token"버튼을 클릭한다.
아래 처럼 설정해주고 Generate를 누르면 키 생성이 완료될 것이다. 2번에 모자이크 된 부분이 토큰으로 Copy를 진행하면 된다.
그 이후에는 깃허브에 이 키를 등록해주어야 한다.
깃허브 액션에 secrets key 등록하기
깃허브 액션에 secrets key를 등록하기 위해서는 생성한 프로젝트의 Settings로 이동하고 Security -> Secrets and variables -> Actions 에 들어간다.
그 이후 "New repository secret" 을 눌러 Name을 왼쪽과 같이 지정하고 PW에는 아까 COPY한 값을 USERNAME에는 DOCKER HUB 닉네임을 넣어주면 된다.
그 이후 Actions 탭에 들어가 다시 실행시기면 정상적으로 작동하는 것을 확인할 수 있다.
혹시 아직도 오류가 난다면 차근차근 다시 해보는 것을 추천한다.
여기까지 완료되었다면 Github Action을 통하여 Docker 빌드 및 CI 자동화 작업이 완료된다.
참고문헌
Get started
Get started with Docker
docs.docker.com
GitHub Actions 설명서 - GitHub Docs
GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완
docs.github.com
'DevOps' 카테고리의 다른 글
클라우드 컴퓨팅의 개념과 활용 예 (3) | 2024.11.24 |
---|---|
Github Actions 동작 원리 (0) | 2024.10.18 |
CI/CD 란 무엇인가? (2) | 2024.10.15 |
Docker의 개념 (3) | 2024.10.15 |