사용자에게 우리가 만들어낸 프로젝트를 배포했는데 어떠한 동작이 올바르게 동작하지 않아 문제가 발생했다고 가정해보자.
개발자들은 수정된 코드에 문제가 다시 생기면 또 다시 컴파일, 빌드, 배포하는 과정을 반복해야한다. 이 과정들은 시간도 많이 걸리고 실수하기도 쉽다.
이를 위해서 CI/CD가 생겨났다.
지속적 통합
개별 개발자의 작업이 통합되지 않은 채 개발이 지속되는 것을 방지하면, 통합 과정에서 문제가 더 크고 복잡해진다.
CI는 이를 방지하기 위해서 짧은 주기로 코드를 통합하고, 통합된 코드를 자동으로 테스트(TDD) 할 수 있는 환경을 구성하는데 목적을 둔다.
지속적 전달, 지속적 배포
짧은 주기로 빌드된 소프트웨어가 자동으로 배포될 수 있도록 구성하는 개발 방식이다.
항상 코드를 배포 가능한 상태로 유지하는데 목표를 둔다.
Delivery와 Deployment의 차이는 Click of a Button
Software Development와 IT Operations의 작업의 통합과 자동화를 통해 소프트웨어를 개발할 수 있다. 생명주기의 단축을 목표로 하는 개발 방법론이다.
DevOps를 위한 다양한 도구를 갖춘 DevOps 플랫폼이다.
유료 클라우드 서비스이지만 자체 서버에 운영이 가능하다.
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 실패
각 job들은 독립적으로 실행된다.
passed 성공
Spring Boot 프로젝트의 산출물은 JAR
Gradle을 이용해 Build를 진행
Unit Test와 Integration Test 진행
완성된 JAR 파일을 서버에 업로드 및 실행
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 에서 갑자기 막혔다
강사님의 "이걸로 한번 해보세요"
바로 완치 :)
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