티스토리 뷰
CI / CD란?
Continuous Integration (CI)
- 지속적인 통합이라는 의미로 제품(어플리케이션 코드)의 새로운 변경 사항이나 추가적인 사항을 정기적으로 빌드 및 테스트가 되어 최종 형상으로 병합하는 과정을 의미한다.
- CI의 핵심 목표는 버그를 신속하게 찾고, 소프트웨어의 품질을 개선 및 관리하며, 릴리즈의 시간을 단축하는 것에 의미가 있습니다.
Continuous Delivery & Continuous Deployment (CD)
- 지속적인 전달, 배포라는 의미로 배포하고자 하는 서비스를 운영환경으로 릴리즈 할 수 있도록 최종 결과물을 통합 레포지토리에 생성 및 배포하는 과정을 의미한다.
- CD의 핵심 목표는 DevOps 상 배포를 하고자 하는 일련의 과정들을 자동화를 통해 운영 리소스를 절감하고 멱등성을 지닌 배포 결과를 통해 서비스 신뢰성을 부여합니다.
GitLab CI/CD 용어 및 개념
Pipelines
파이프라인은 지속적 통합, 전달 및 배포의 최상위 구성 요소입니다.
파이프라인은 다음으로 구성됩니다.
- 수행할 작업을 정의하는 Jobs. 예를 들어, 코드를 컴파일하거나 테스트하는 Job
- 작업을 실행할 시기를 정의하는 Stages. 예를 들어 코드를 컴파일 하는 단계 후에 테스트를 실행하는 단계
- Job은 러너에 의해 실행됩니다. 동시(concurrent) 러너가 충분한 경우, 동일한 단계의 여러 Job이 병렬로 실행됩니다. 한 단계의 모든 Job이 성공하면, 파이프라인은 다음 단계로 넘어갑니다.
- 한 단계의 어떤 Job이 실패하면, 다음 단계는 (일반적으로) 실행되지 않고 파이프라인이 일찍 종료됩니다.
일반적으로 파이프라인은 자동으로 실행되며 생성된 후에는 개입이 필요하지 않습니다. 그러나 수동으로 파이프라인과 상호작용할 수 있는 경우도 있습니다.
Jobs
파이프라인 구성은 Job으로 시작됩니다. Job은 gitlab-ci.yml 파일의 가장 기본적인 요소입니다.
Job은 Runner가 실행해야 하는 명령 모음입니다. Job의 결과물(Output)이 무엇인지 실시간으로 볼 수 있으므로, 개발자는 Job이 실패한 이유를 이해할 수 있습니다.
Job은
- 어떤 조건에서 실행되어야 하는지를 명시하는 제약 조건으로 정의됩니다.
- 임의의 이름을 가진 최상위 요소이며 최소한 script 절을 포함해야 합니다.
- 정의할 수 있는 수에는 제한이 없습니다.
Variables
CI/CD 변수는 환경 변수의 한 유형입니다. 이를 사용하여 다음을 수행할 수 있습니다.
- Jobs 및 파이프라인의 동작을 제어
- 재사용하려는 값을 저장
- gitlab-ci.yml 에서 미리 정의된 CI/CD 변수를 먼저 선언하지 않고도 사용할 수 있습니다.
예제
stages:
- build
- test
- package
build:
image: adoptopenjdk/openjdk11
stage: build
only:
- develop
script:
- ./gradlew clean
- ./gradlew build
artifacts:
paths:
- build/libs/*.jar
expire_in: 5 min
test:
image: adoptopenjdk/openjdk11
stage: test
needs: ["build"]
only:
- develop
script:
- ./gradlew test
artifacts:
when: always
reports:
junit: build/test-results/test/**/TEST-*.xml
package:
image: docker:latest
stage: package
needs: ["test"]
only:
- develop
- tags
variables:
IMAGE_NAME: baas/homepage-api
TAG: $CI_COMMIT_REF_NAME
CA_CERTIFICATE: $CA
services:
- name: docker:dind
command:
- /bin/sh
- -c
- echo "CA_CERTIFICATE" > /usr/local/share/ca-certificates/my-ca.crt && update-ca-certificates && dockerd-entrypoint.sh || exit
before_script:
- docker login $PRI_DOCKER_REPO -u $PRI_DOCKER_USER -p $PRI_DOCKER_PW
script:
- docker build -t $IMAGE_NAME:$TAG .
- docker push $IMAGE_NAME:$TAG
after_script:
- docker logout
Build Stage
- 해당 스테이지에서는 adoptopenjdb/openjdk11 라는 docker image를 통해 내부에서 gradlew 명령어를 통해 프로젝트를 build합니다.
- 그 후 artifacts 명령어를 통해 build 한 xx.jar 결과물을 산출합니다.
Test Stage
- 해당 스테이지에서 adoptopenjdk/openjdk11 라는 docker image를 통해 Test를 진행합니다.
- 그 후 artifacts 명령어를 통해 test reports 결과물을 산출합니다.
Package State
- 해당 스테이지에서는 docker:latest 라는 docker image를 통해 docker image를 생성 및 push 합니다.
전역 변수 설정
위의 예제 파일에서 $PRI_DOCKER_REPO, $PRI_DOCKER_USER 변수 같은 경우 GitLab 페이지에서 직접 생성할 수 있습니다.
Settings -> CI/CD -> Variables에서 생성 가능합니다.
Pipelines 실행
위의 모든 설정이 끝났다면 .gitlab-ci.yml 파일이 담긴 프로젝트의 branch를 push 해줍니다. 그런 다음 아래와 같이 확인을 할 수 있습니다.
또한, 별도 브랜치 push없이 기존 pipeline을 한번 더 실행시키고 싶다면, Run pipeline을 통해 가능합니다.