티스토리 뷰

DevOps/Gitlab CI

[DevOps] GitLab CI/CD란?

roopreDev 2024. 7. 17. 19:54

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을 통해 가능합니다.

 

 

참고

https://medium.com/@itsinil/gitlab-%EB%A5%BC-%ED%86%B5%ED%95%9C-ci-cd-pipeline-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-d7dd25e79283

https://artist-developer.tistory.com/24

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함