인프라
CI/CD란, 젠킨스 실습해보기
newwisdom
2021. 8. 15. 14:59
반응형
2021-07-11글
CI (Continuous Integration)
- 지속적 통합
- 개발하면서 코드에 대한 통합을 지속적으로 진행
- 여러 개발자가 작성하거나 수정한 소스를 지속적으로 통합하고 테스트
- 빌드 및 테스트 자동화
CI를 적용할 때의 흐름
- 개발자는 자신이 개발한 소프트웨어의 소스코드를 공통된 버전 관리시스템(github 등)에 저장.
- 소스코드상에 변동이 생기면 버전 관리 시스템에서는 CI 툴로 소스코드 변경 알림
- CI툴에서는 변경된 소스코드를 대상으로 Build, Test, Merge를 진행
- 이 과정들이 완료되면 슬랙, 카카오톡, 메일 등을 통해 통합 결과를 알림
CD (Continuous Delivery, Continuous Deployment)
- 지속적 배포
- 애플리케이션이 항상 신뢰 가능한 수준에서 배포될 수 있도록 지속적으로 관리하자는 개념
- 변경 사항을 레포지토리에서 프로덕션 환경까지 자동으로 배포하는 것
- 배포 자동화
CD를 적용했을 때의 흐름
- CI를 통해 소스코드를 검증
- 검증된 소프트웨어를 실제 프로덕션 환경으로 배포
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 버튼을 누르기
- 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를 설치하지 않고도 한개의 젠킨스 서버만 빌드해 모든 다른 서버에 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)에 전송하기. 이후 빌드 스크립트 실행
참고 자료
반응형