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의 계정, 비번 등록
- 그리고 방금 등록한 계정 선택
- 젠킨스 빌드가 관리될 브랜치 선택
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에 올리고 이후 실습을 진행해보자
- 추후 업데이트