12 CI/CD 도입하기
12.1 CI/CD
서비스를 배포하고 운용하던 중에 코드를 변경할 일이 생긴다면 코드를 수정하고 로컬에서 테스트를 진행합니다. 그리고 jar 파일을 생성해 복사하고 업로드 해 새 버전을 올립니다. 이 과정은 프로젝트의 규모가 커질 수록 힘들 것입니다. 이럴 때 도입하는 것이 CI/CD입니다. 도구를 의미하는 것이 아닌 방법을 말합니다.
이 방법을 도입하면 빌드부터 배포까지의 과정을 자동화할 수 있고 잘 되는지 모니터링할 수도 있습니다.
CI 지속적 통합
Continuous Integration를 줄인 표현으로 개발자를 위해 빌드와 테스트를 자동화하는 과정입니다. 변경 사항을 자동으로 테스트해 애플리케이션에 문제가 없다는 것을 보장합니다. 또한 정기적으로 빌드하고 테스트하므로 여러 명이 동시에 작업을 하는 충돌을 방지하고 모니터링할 수 있습니다.
CD 지속적 제공과 배포
Continuous delivery라는 의미와 Continuous deployment라는 의미를 모두 갖습니다. CD는 CI 작업을 끝낸 다음 실행하는 작업입니다. 배포 준비가 된 코드를 자동으로 서버에 배포하는 작업을 자동화하는 것입니다. CI가 통과되면 수작업으로 배포하지 않아도 자동으로 배포하니 매우 편리합니다.
CI
ci.yml
# (1) 워크플로우의 이름 저장
name: CI
# (2) 워크플로우가 시작될 조건 저장
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest # (3) 실행 환경 저장
# (4) 실행 스텝 저장
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '17'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build
(1) 워크플로의 이름을 지정합니다.
(2) 워크플로를 시작할 트리거 조건을 지정합니다. main 브랜치에 푸시를 할때마다 워크플로를 시작하도록 구성했습니다.
(3) 리눅스와 윈도우와 같은 실행 환경을 지정합니다.
(4) 실행 스텝을 그룹화 합니다. 각 항목은 별도의 작업또는 명령어로 이루어졌습니다.
- uses: uses 키워드는 지정한 리포지터리를 확인하고 코드에 대한 작업을 실행할 수 있습니다.
- name: 스텝의 이름을 지정합니다.
- run: run 키워드는 실행할 명령어를 입력합니다. ./gradle clean build에는 그레들을 사용해 프로젝트를 빌드 이전 상태로 돌리고 다시 빌드하는 명령어를 실행합니다.
git add .
git commit -m "CI 추가"
git push origin main
CD
cicd.yml
name: CI/CD # (1) 깃허브 액션 이름 변경
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: '17'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build
# (2) 현재 시간 가져오기
- name: Get current time
uses: josStorer/get-current-time@v2.0.2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
# (3) 배포용 패키지 경로 저장
- name: Set artifact
run: echo "artifact=$(ls ./build/libs)" >> $GITHUB_ENV
# (4) 빈스토크 배포
- name: Beanstalk Deploy
uses: einaregilsson/beanstalk-deploy@v20
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: springboot-developer
environment_name: Springboot-developer-env
version_label: github-action-${{steps.current-time.outputs.formattedTime}}
region: ap-south-1
deployment_package: ./build/libs/blog-0.0.1-SNAPSHOT.jar
(1) 깃허브 액션 이름을 변경합니다.
(2) josStorer/get-current-time 플러그인을 사용해 현재 시간을 가져옵니다.가져온 시간은 배포 버전을 지정할 때 사용됩니다.
(3) 빌드 이후에 생성된 jar 파일을 찾아 artifact라는 환경변수에 저장합니다.
(4) einaregilsson/beanstalk-deploy 플러그인을 사용해 빈스토크 배포를 진행합니다.
AWS IAM에서 사용자를 생성하고 권한을 부여합니다.
액세스 키를 만들고 깃허브에 비밀키를 등록합니다.
git add .
git commit -m "ci.yml > cicd.yml"
git push origin main
cd가 정상적으로 작동하는 것을 확인하고 커밋과 푸시를 합니다.
요약
1. CI는 개발자를 위해 빌드와 테스트를 자동화하는 과정이고 CD는 CI 작업을 끝낸 다음 실행하는 작업으로 배포 준비가 된 코드를 자동으로 서버에 배포하는 작업을 자동화하는 겁니다.
2. 깃은 여러 명이 한 프로젝트를 동시에 작업을 할 수 있게 코드를 저장하고 관리할 수 있는 시스템입니다. 깃허브는 깃과 연동해 코드를 저장할 수 있는 서비스입니다.