1. CI/CD 너 도대체 누구냐?
계속 프로젝트를 진행하면서 "CI/CD를 하자! 파이프라인 구축하자!"
라는 소리는 많이 들어왔지만,
정작 어떤 방식으로 어떻게 구현해야 하는지는 잘 몰랐다.
지속적통합, 지속적배포라는 뜻만 알고 있었을 뿐이다.
궁금했기도 했고, 개발공부도 하던 참에 CI/CD를 구현해보기로 했다.
![](https://t1.daumcdn.net/keditor/emoticon/niniz/large/004.gif)
2. Github Actions 넌 또 뭐야
CI/CD를 위해서는 먼저 Github Actions 혹은 jenkins가 필요하다.
난 Github Actions를 사용했다.
Github Actions는, 깃허브에 내장되어 있는 CI/CD 도구여서
github와 통합이 쉽고, CI/CD 서버가 내장 되어 있어서 따로 CI/CD서버를 구축할 필요가 없다.
repo가 public일 경우에 무료이고, 일정 수준까진 무료이다. (무료 버전 : 스토리지 500MB, 월 2000분)
Github Actions
Github Actions의 동작방법은 간단하다.
깃헙 repo에 .github/workflows에 필요한 Actions 파일들을 yaml 형식으로 만들어두면 된다.
(*반드시 .github/workflows 폴더 아래에 yaml 파일이 존재해야 한다)
3. CI 란? (Github Actions)
test를 통과한 코드만 develop이나 main에 머지시켜서 오류를 방지하고
안정적인 코드가 배포되도록 하기 위해서 버그를 빠르게 발견하는 작업이다.
예시로, develop 브랜치에 머지된 경우, gradle test를 진행 하거나,
feature/** (feature 하위) 브랜치에 푸시되면, gradle test를 진행할 때 사용할 수 있다.
만약 gradle test가 실패한다면, 개발자에게 알림을 보낼 수 있다. (slack으로 알림보낼수있음 ㄷㄷ)
(샘플코드)
샘플코드를 참고합니다(실제 동작하지는 않아요)
# Actions 이름 github 페이지에서 볼 수 있다.
name: 'CI'
# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on:
push:
# 배열로 여러 브랜치를 넣을 수 있다.
branches: [ develop, feature/* ]
# github pull request 생성시
pull_request:
branches:
- develop # -를 쓴 여러 줄로 여러 브랜치를 명시하는 것도 가능
# 실제 어떤 작업을 실행할지에 대한 명시
jobs:
ci:
# 스크립트 실행 환경 (OS)
# 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
runs-on: [ ubuntu-latest ]
# 실제 실행 스크립트
steps:
# uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
- name: checkout
uses: actions/checkout@v4
# with은 plugin 파라미터 입니다. (java 11버전 셋업)
- name: java setup
uses: actions/setup-java@v2
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
# run은 사용자 지정 스크립트 실행
- name: run unittest
run: |
./gradlew clean test
4. CD 란? (Github Actions)
배포를 자동화하는 작업을 기술해서 빠르고 간편하게 배포하는 작업이다.
main에 코드가 머지되면 바로 배포를 할 수 있도록 한다.
예를 들어, main에 머지된 경우 test를 진행하고,
main코드를 기준으로 jar파일을 생성하여
생성된 jar파일을 특정 클라우드(aws,ncp,gcp etc..)에 배포하여
CD를 구축가능하다.
(샘플코드)
name: 'CD'
on:
push:
branches: [ main ]
jobs:
cd:
runs-on: [ ubuntu-latest ]
steps:
- name: checkout
uses: actions/checkout@v4
- name: java setup
uses: actions/setup-java@v3
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
- name: run unittest
run: |
./gradlew clean test
- name: deploy to heroku
uses: akhileshns/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: "sampleapp-github-actions" #Must be unique in Heroku
heroku_email: "nbcdocker@proton.me"
5. Github Actions Workflow
workflow는 최상위 개념으로 볼 수 있고,
여러개의 Job으로 구성되고 event에 의해서 트리거 될 수 있는 자동화된 프로세스 이다.
event는, push, pr, issue, cron(특정시간대반복) 등의 특정 규칙으로
workflow를 실행하는 것이다.
runner는 깃허브 액션 러너 앱이 설치된 VM
워크플로우가 실행될 instance로, 각각의 job들은 개별적인 runner에서 실행된다
job은 하나의 shell script 또는 action
actions는 워크 플로우의 가장 작은 단위로 재사용이 가능하며
job을 만들기 위해 step을 연결해야한다.
이와 같이 코드 변경을 감지하여
깃허브 액션을 통해 ci/cd를 자동화 하고
여기서의 예시는 aws ec2이지만, 원하는 클라우드 서비스로 배포가 가능하다.
(aws ec2에 main 브랜치를 배포하는 github action)
name: Deploy
on:
workflow_dispatch:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: gradlew bootJar
run: ./gradlew bootJar
- name: copy jar to server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ec2-user
key: ${{ secrets.SSH_KEY }}
port: 22
source: "./build/libs/*.jar"
target: "~"
strip_components: 2
- name: SSH Commands
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.SSH_HOST }}
username: ec2-user
key: ${{ secrets.SSH_KEY }}
port: 22
script_stop: true
script: |
sudo yum update -y && sudo yum install -y java-21-amazon-corretto
for pid in $(pgrep java); do
if ps -p $pid -o args= | grep -q 'java -jar'; then
echo "Java process with 'java -jar' found (PID: $pid). Terminating..."
kill -9 $pid
fi
done
echo "nohup java -jar ~/*.jar > ~/app.log 2>&1 &" | at now
6. 그래서 CI/CD 파이프 라인 구축이란?
CI/CD 파이프라인은 개발자들이 코드 변경 사항을 빠르게 통합하고,
자동화된 테스트를 통해 품질(오류없음)을 보장하며,
배포를 자동화하여 신속하게 사용자에게 제공할 수 있도록 하는 것이다!
'DevOps' 카테고리의 다른 글
Docker의 Volume과 Network를 알아보자 (0) | 2025.02.11 |
---|