⚒️ CI/CD란, 젠킨스 실습해보기


CI (Continuous Integration)

  • 지속적 통합
  • 개발하면서 코드에 대한 통합을 지속적으로 진행
  • 여러 개발자가 작성하거나 수정한 소스를 지속적으로 통합하고 테스트
  • 빌드 및 테스트 자동화

CI를 적용할 때의 흐름

  1. 개발자는 자신이 개발한 소프트웨어의 소스코드를 공통된 버전 관리시스템(github 등)에 저장.
  2. 소스코드상에 변동이 생기면 버전 관리 시스템에서는 CI 툴로 소스코드 변경 알림
  3. CI툴에서는 변경된 소스코드를 대상으로 Build, Test, Merge를 진행
  4. 이 과정들이 완료되면 슬랙, 카카오톡, 메일 등을 통해 통합 결과를 알림

CD (Continuous Delivery, Continuous Deployment)

  • 지속적 배포
  • 애플리케이션이 항상 신뢰 가능한 수준에서 배포될 수 있도록 지속적으로 관리하자는 개념
  • 변경 사항을 레포지토리에서 프로덕션 환경까지 자동으로 배포하는 것
  • 배포 자동화

CD를 적용했을 때의 흐름

  1. CI를 통해 소스코드를 검증
  2. 검증된 소프트웨어를 실제 프로덕션 환경으로 배포

CI/CD

Tool

  • Jenkins
  • Travis CI
  • Bamboo

젠킨스, 도커로 CI/CD 연습

docker를 이용한 CI 구축 연습하기 (젠킨스, 슬랙) 를 따라하는 일지

Build.gradle.kts에 tasks 추가

  • 필수는 아니지만, 테스트용으로 추가

쿠버네티스 설치 - 스킵

brew install kubectl
// or
brew install kubernetes-cli


kubectl version --client

  • 엥 근데 실패…

해결

$ brew cleanup
$ brew update
$ brew install kubectl

쿠버네티스 설치가 아니었음

  • 아 이걸 쿠버네티스로 착각 ㅎㅎㅎ 🙃

젠킨스 설치

이미지 pull 및 실행

docker run -itd --name jenkins -p 8085:8080 jenkins/jenkins:lts
  • run : 이미지를 실행
  • -itd : interacitve terminal + detach(background)
  • –name : 이미지 이름 지정
  • -p: <외부 port="">:<컨테이너 내부port="">
  • jenkins/jenkins:lts : docker hub이미지 저장소:버전

동작 확인

젠킨스 접속

  • 나는 port를 8085로 했으니 http://localhost:8085/ 으로 접속

  • 짠 이렇게 로그인 화면 뜸

로그인

  • 초기 비번은 젠킨스 컨테이너 안 /var/jenkins_home/secrets/initialAdminPassword 에 있음
  • 다음 명령어로 패스워드 확인
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

플러그인 설치

  • install suggested plugins 를 선택하면 많이 사용되는 플러그인들이 포함되어 자동 설치
  • github 플러그인도 자동 설치됨
  • install suggested plugins 이걸 안 선택할 이유가 뭐야 없어

관리자 계정 생성

설치 완료

  • 오예
  • 젠킨스 컨테이너를 다시 시작해야 한다면 docker start jenkins로 설치된 젠킨스 컨테이너를 실행 후,
  • docker exec -it jenkins /bin/bash 입력
  • docker run은 재설치를 함

젠킨스 설정

  • 젠킨스 메인페이지에서 새로운 Item을 클릭

  • 프로젝트 이름을 입력해주고…

  • 깃 레포지토리 주소를 등록
  • 그리고 Credentials 에 있는 Add 버튼을 누르기

image-20210712004730575

  • Kind : Username with password 선택
  • github의 계정, 비번 등록

  • 그리고 방금 등록한 계정 선택
  • 젠킨스 빌드가 관리될 브랜치 선택

Build Trigger

Build

  • Excute shell 선택

  • 빌드 스크립트 작성

토큰 발급

  • github에서 토큰 발급하기

  • 발급된 토큰을 복사하고, 다시 젠킨스로…
  • 젠킨스 대시보드 -> 젠킨스 관리 탭 -> 시스템 설정

  • Domain : Global credentials (unrestricted) 선택
  • Kind : Secret text 선택
  • Secret : 위에서 생성한 github 토큰 입력
  • ID : 본인이 지정하는 식별자(ID) 입력 (ex: github)

저장하면 끝! Build Now!

  • 콘솔도 확인할 수 있음

콘솔 출력

Started by user newwisdom
Running as SYSTEM
Building in workspace /var/jenkins_home/workspace/subway-kotlin
The recommended git tool is: NONE
using credential 0139eabb-5494-46ce-875e-1bdeedd0d391
Cloning the remote Git repository
Cloning repository https://github.com/NewWisdom/subway-kotlin.git
 > git init /var/jenkins_home/workspace/subway-kotlin # timeout=10
Fetching upstream changes from https://github.com/NewWisdom/subway-kotlin.git
 > git --version # timeout=10
 > git --version # 'git version 2.20.1'
using GIT_ASKPASS to set credentials 
 > git fetch --tags --force --progress -- https://github.com/NewWisdom/subway-kotlin.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git config remote.origin.url https://github.com/NewWisdom/subway-kotlin.git # timeout=10
 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
Avoid second fetch
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
Checking out Revision 7b0fb7eff520316950d4a0a769d11c46848f76b4 (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 7b0fb7eff520316950d4a0a769d11c46848f76b4 # timeout=10
Commit message: "feat(member): 멤버 관련 기본 셋팅 추가"
First time build. Skipping changelog.
[subway-kotlin] $ /bin/sh -xe /tmp/jenkins8995160598138643631.sh
+ ./gradlew clean print
Downloading https://services.gradle.org/distributions/gradle-7.0.2-bin.zip
..........10%...........20%...........30%..........40%...........50%...........60%..........70%...........80%...........90%..........100%

Welcome to Gradle 7.0.2!

Here are the highlights of this release:
 - File system watching enabled by default
 - Support for running with and building Java 16 projects
 - Native support for Apple Silicon processors
 - Dependency catalog feature preview

For more details see https://docs.gradle.org/7.0.2/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)
> Task :clean UP-TO-DATE

> Task :print
github push complete

BUILD SUCCESSFUL in 2m 43s
2 actionable tasks: 1 executed, 1 up-to-date
Finished: SUCCESS
  • 아직까지는 Build Now를 해야지 빌드가 됨

원격 서버 배포

  • EC2에 올리고 이후 실습을 진행해보자
  • 추후 업데이트

참고 자료