본문 바로가기

인프라

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

2021-07-11글

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이미지 저장소:버전

동작 확인

젠킨스 접속

  • 짠 이렇게 로그인 화면 뜸

로그인

  • 초기 비번은 젠킨스 컨테이너 안 /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 버튼을 누르기

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

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

Github Web Hook 적용

해당 레포에서 Setting - Webhooks

  • Payload URL : "http://{본인의 ip}:8080/jenkins/github-webhook/" 입력
    • 참고로 localhost는 Payload URL로 입력할 수 없고, 나같은 경우는 새로운 EC2에서 진행했고 기록을 위해 ip를 localhost로쓴 것일뿐
  • Just the push event: push 이벤트가 일어날 경우 트리거 유발

 

Build Trigger

  • PUSH나 MERGE가 일어나면 트리거 유발

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를 해야지 빌드가 됨

 

Jenkins 원격 서버 배포 (Publish Over SSH)

이번엔 [Jenkins] [ec2] Jenkins 원격 서버 배포(Publish Over SSH) 참고

  • 배포할 서버가 여러대로 늘어나 젠킨스 서버와 배포 서버가 분리되어야 할 때
  • 각각 서버마다 Jenkins를 설치하지 않고도 한개의 젠킨스 서버만 빌드해 모든 다른 서버에 SSH 방식으로 파일 전송, 빌드 스크립트 유발하여 관리 가능

Publish Over SSH 플러그인

설치

  • Jenkins 관리 -> 플러그인 관리 -> Publish Over SSH 검색하고 설치

설정

  • Jenkins 관리 -> 시스템 설정

  • Key
    • RSA 키 필요
    • EC2를 생성할 때 받은 pem 파일 내용을 복붙하면 됨
  • Name : 사용할 임의의 SSH Servers의 Name을 입력
  • Hostname : 실제로 접속할 원격 서버 ip, 접속 경로를 입력
  • Username : 접속할 원격 서버의 user 이름
  • Remote Directory : 원격서버에 접속하여 작업을 할 디렉토리

 

빌드할 Item, Job 설정

  • 빌드할 Item에서 -> 구성

  • 빌드 후 조치 -> 빌드후 조치 추가 -> Send build artifacts over SSH 선택
  • Remove prefix : Source files에서 지정한 경로의 하위 폴더를 지우는 기능
  • Remote directory : SSH Server로 지정한 서버의 원격지 폴더
  • Exec command : 파일 전송이 모두 끝난 이후에, SSH Server로 지정한 서버에서 실행될 스크립트를 지정할 수 있는 기능
  • Source files : 전송할 파일을 지정한다. 혹시 전체 파일 이동을 하려면 */ 과 같이 입력 하면 됨.
    ./build/libs/subway-kotlin-0.0.1-SNAPSHOT.jar

여기까지 아래의 작업 완료

  • GitHub과 Jenkins를 연동하여 소스 당겨와 최신화 및 빌드
  • 빌드된 파일(jar 또는 war)을 원격 서버(ec2)에 전송하기. 이후 빌드 스크립트 실행

참고 자료

'인프라' 카테고리의 다른 글

AWS CloudFront와 S3 구성  (0) 2021.08.23
생활코딩 OAuth 2.0 강의와 놀토의 OAuth  (0) 2021.08.20
Flyway 적용기  (0) 2021.08.15
Docker란  (0) 2021.08.14
REST API에 대하여  (0) 2021.08.06