CI/CD, Gitlab

calis_ws·2023년 8월 10일
0

CI/CD

사용자에게 우리가 만들어낸 프로젝트를 배포했는데 어떠한 동작이 올바르게 동작하지 않아 문제가 발생했다고 가정해보자.

개발자들은 수정된 코드에 문제가 다시 생기면 또 다시 컴파일, 빌드, 배포하는 과정을 반복해야한다. 이 과정들은 시간도 많이 걸리고 실수하기도 쉽다.
이를 위해서 CI/CD가 생겨났다.

Continuous Integration

지속적 통합

  • 개별 개발자의 작업이 통합되지 않은 채 개발이 지속되는 것을 방지하면, 통합 과정에서 문제가 더 크고 복잡해진다.

  • CI는 이를 방지하기 위해서 짧은 주기로 코드를 통합하고, 통합된 코드를 자동으로 테스트(TDD) 할 수 있는 환경을 구성하는데 목적을 둔다.

Continuous Delivery / Deployment

지속적 전달, 지속적 배포

  • 짧은 주기로 빌드된 소프트웨어가 자동으로 배포될 수 있도록 구성하는 개발 방식이다.

  • 항상 코드를 배포 가능한 상태로 유지하는데 목표를 둔다.

  • Delivery와 Deployment의 차이는 Click of a Button

DevOps

Software Development와 IT Operations의 작업의 통합과 자동화를 통해 소프트웨어를 개발할 수 있다. 생명주기의 단축을 목표로 하는 개발 방법론이다.

  1. Infrastructure as Code
  2. CI / CD Pipeline
  3. Monitoring

Git lab

DevOps를 위한 다양한 도구를 갖춘 DevOps 플랫폼이다.

  • Git 저장소
  • CI/CD 도구
  • 기타 등등

유료 클라우드 서비스이지만 자체 서버에 운영이 가능하다.

sign in

New Project/Repository 생성

SSH key 등록

Pipelines

카드 등록

Run pipeline

yml 추가

stages:
  - build
  - test

build-job:
  stage: build
  environment: build-env
  script:
    - mkdir build
    - cd build
    - touch students.txt
    - echo "alex" >> students.txt
    - echo "brad" >> students.txt
    - echo "chad" >> students.txt

test-job:
  stage: test
  environment: test-env
  script:
    - test -f build/students.txt
    - cd build
    - grep "alex" students.txt
    - grep "brad" students.txt
    - grep "chad" students.txt

failed 실패

build-job

test-job

각 job들은 독립적으로 실행된다.

코드 추가

passed 성공

Download artifacts

Spring Boot 프로젝트와 CI/CD

Spring Boot 프로젝트의 산출물은 JAR

  1. Gradle을 이용해 Build를 진행

  2. Unit Test와 Integration Test 진행

  3. 완성된 JAR 파일을 서버에 업로드 및 실행

boot-gitlab-cicd 생성

cicd-template push

 git init
 git remote add origin git@gitlab.com:<id>/boot-gitlab-cicd.git
 git add --all
 git commit -m "init"
 git push --set-upstream origin main

push 에서 갑자기 막혔다

강사님의 "이걸로 한번 해보세요"

바로 완치 :)

yml 추가

stages:
  - build
  - test
  - deploy

default:
  image: gradle:alpine
  before_script:
    - GRADLE_USER_HOME="$(pwd)/.gradle"
    - export GRADLE_USER_HOME
  cache:
    key: "$CI_COMMIT_REF_NAME"
    paths:
      - build
      - .gradle

build:
  stage: build
  script:
    - gradle --build-cache assemble
  artifacts:
    paths:
      - build/libs/*.jar
    exclude:
      - build/libs/*-plain.jar
    expire_in: 1 hour
  cache:
    policy: push

test:
  stage: test
  script: gradle test
  cache:
    policy: pull

deploy:
  stage: deploy
  script:
    - ls -alF build/libs
  environment: production

Jobs

profile
반갑습니다람지

0개의 댓글