[CI/CD] CI/CD란 무엇인가?
개요기본적으로 서비스를 배포하기까지는 개발 외에도 테스트, 빌드, 배포 등 여러 과정을 거치게 된다. 이 과정이 일회성으로 이루어지거나 단순히 몇 진행된다면, 이 과정을 그대로 진행해도
davidy87.tistory.com
이전 글에서 CI/CD가 무엇인지 알아보았다. 이번 글에서는 개인 프로젝트를 CI 툴 중 하나인 Jenkins를 활용해 CI/CD를 구축하는 과정을 정리하려고 한다.
Jenkins 설치
먼저 Jenkins를 사용하기 위해 설치를 진행해야 하는데, 설치 방법에는 두 가지 선택지가 있다.
1. 직접 설치
Jenkins를 실행하고자 하는 machine에 직접 설치하는 방법이 있다.
하지만, Linux를 기준으로 Jenkins를 직접 설치할 경우, 위와 같이 많은 과정을 거처야 한다. 만약 Docker를 사용한다면, 위의 복잡한 과정들을 생략하고 단순하게 Jenkins 컨테이너만 내려받아 실행하면 된다. 여기서도 Docker를 활용하여 Jenkins를 설치할 것이다.
2. Docker를 활용하여 설치
Docker가 이미 설치되었다고 가정했을 때, 아래의 명령어를 통해 Jenkins 컨테이너를 내려받아 실행할 수 있다.
$ sudo docker run -d --name jenkins -p 8080:8080 jenkins/jenkins:jdk17
만약, Docker가 설치되어 있지 않다면, Docker 공식 문서에 설치 방법이 자세하게 나와있으니 참고하여 설치하면 된다.
Jenkins 실행
Jenkins 컨테이너가 성공적으로 실행되었다면, 브라우저에 로컬이라면 localhost:8080, EC2 같은 서버라면 {EC2 Public IP}:8080으로 접속하면 아래와 같은 화면이 나오는 것을 확인할 수 있다.
초기 접속을 위해서는 관리자 비밀번호를 입력해야 한다. 비밀번호를 확인하기 위해서는 아래의 명령어를 입력해 Jenkins 컨테이너에 접근하여야 한다.
$ sudo docker exec -it jenkins bash
$ cat /var/jenkins_home/secrets/initialAdminPassword
위에서 찾은 비밀번호를 입력하면 아래와 같이 Jenkins 플러그인 설치 화면이 나온다. 일단 추천 플러그인들을 설치하고 다음으로 넘어간다. 추후에 필요한 플러그인이 있다면 따로 설치가 가능하다.
플러그인 설치를 누르면 플러그인들이 하나씩 설치되는 것을 확인할 수 있다.
플러그인 설치가 완료되면 아래와 같이 사용자 설정을 진행하는 화면으로 넘어간다.
사용자 설정을 끝내면 마지막으로 Jenkins에 접속할 url을 설정하는 단계로 넘어간다. 여기서는 EC2에서 Jenkins를 설치하였기 때문에 EC2의 주소를 유지하도록 설정하였다.
url 설정을 끝내면 아래와 같은 화면이 나오며 Jenkins의 모든 설치 과정이 끝나게 된다.
위 화면에서 "Start using Jenkins" 버튼을 클릭하면 아래와 같이 Jenkins 메인 화면으로 접속하게 된다.
Jenkins Pipeline 구축하기
이제 본격적으로 CI를 위한 pipeline을 구축해보자.
1. 아이템 생성
Jenkins 메인 화면의 왼쪽을 보면 "새로운 Item"이라는 메뉴가 있다. 이것을 클릭하면 아래와 같은 화면이 나온다. 아이템의 이름을 입력하고 Pipeline을 선택하여 아이템을 생성한다.
아이템을 생성하면 pipeline 설정 화면으로 넘어가는데, 여기서 일단상단의 설정들은 건너뛰고 왼쪽의 "Pipeline" 메뉴를 클릭하여 아래와 같이 pipeline script를 입력하는 부분으로 이동하자.
2. Pipeline Script 작성
Jenkins에서는 pipeline script를 설정하는 방법에는 2가지가 존재한다.
- Script를 Jenkins에 직접 작성하여 실행하는 방법
- GitHub과 같은 원격 저장소의 repository 안에 있는 Jenkinsfile의 script를 불러와 실행하는 방법
여기서는 2번 방법을 선택하여 pipeline script를 설정할 것이다.
Pipeline 설정
먼저 SCM을 Git으로 선택한 이후, 아래와 같이 Repository URL을 입력하자.
이후, 아래와 같이 branch와 Jenkinsfile이 위치한 경로를 지정하면 pipeline 설정은 끝이다.
현재 프로젝트 repository는 public으로 열어둔 상태이기 때문에, 별도의 GitHub 인증 과정 없이도 Jenkins에서 Git checkout 과정이 잘 동작한다. 만약, 인증 절차가 필요한 경우라면 GitHub에서 access token을 생성해 Jenkins에 credential을 추가해주어야 한다.
GitHub 인증 과정은 이 글에서 자세하게 확인할 수 있다.
Pipeline Script
Pipeline script는 "Declarative Pipeline"과 "Scripted Pipeline" 2가지 구문으로 나뉘는데, 둘 다 Groovy 문법을 기반으로 작성되지만 아래와 같은 차이점이 존재한다.
- Declarative Pipeline: Scripted Pipeline보다 비교적 작성하기 쉬우며, 더 간결하고 명확한 구문이다.
- 반드시 scrpit 최상단에
pipeline {...}
이라는 block으로 시작되어야 한다.
- 반드시 scrpit 최상단에
- Scripted Pipeline: Declarative Pipleline보다 더 상세하게 작성이 가능하며, 보다 더 효과적이과 많은 기능을 포함한다. 하지만, 많은 기능을 포함하고 있기에 작성하기 더 어렵다는 문제가 있다.
- 반드시 script 최상단에
node {...}
라는 block으로 시작되어야 한다.
- 반드시 script 최상단에
해당 구문들에 대한 상세한 내용은 공식 문서를 참고하자.
여기서는 Declarative Pipeline 구문을 선택했다. 아직은 단순히 GitHub에 올라간 프로젝트를 빌드하고 배포하는 과정만 적용할 것이기 때문에 상세한 기능들은 필요없다고 판단했기 때문이다.
Jenkinsfile
GitHub에 있는 프로젝트 최상위 디렉토리에 Jenkinsfile이란 이름으로 파일을 생성해 아래와 같이 script를 작성한 후, repository에 push하였다.
pipeline {
agent any
stages {
stage('Build') {
steps {
sh './gradlew clean build'
}
}
}
}
이렇게 script를 작성하면 Jenkins에서 해당 Jenkinsfile이 있는 GitHub repository를 clone한 후, "Build" stage에서 프로젝트 빌드를 진행하게 된다.
이렇게 CI 구축을 위한 script 작성은 완료되었다. 이제 pipeline을 실행해보도록 하자.
생성한 pipeline으로 들어가 왼쪽 메뉴에 있는 "지금 빌드"를 클릭하면 Git clone부터 프로젝트 빌드까지의 CI 과정이 실행된다.
3. Credential 추가
사실, 위에서 CI 과정을 실행하면 빌드 결과가 실패로 나온다. 해당 빌드를 자세히 살펴보자.
위 화면의 좌측 하단에 있는 "Builds"에서 해당 빌드를 클릭하면, 아래와 같이 빌드 화면이 나온다. 좌측에 여러가지 메뉴들이 있는데, 그 중에서 "Console Output"을 클릭하면 빌드 과정동안 생긴 로그들을 살펴볼 수 있다.
콘솔 로그를 살펴보면 아래와 같이 프로젝트 빌드 과정에서 테스트가 실패하여 최종적으로 빌드 실패가 된 것을 확인할 수 있다.
이런 문제가 발생한 이유는, 개인 프로젝트에서 AWS 정보나 JWT secret token, .env 같은 민감한 정보가 담긴 파일들은 .gitignore에 지정해 push되지 않도록 되어있다. 그렇기 때문에 Jenkins에서 clone할 경우, 해당 파일들이 존재하지 않기 때문에 테스트에 실패하게 되는 것이다.
Jenkins에서는 credentials 설정을 통해 빌드 과정에서 해당 파일들이 추가될 수 있도록 만들 수 있다.
먼저, Jenkins dashboard 메인 화면으로 돌아가서, 좌측의 메뉴 중 "Jenkins 관리"를 클릭하자.
그러면 아래와 같은 설정 화면이 나오는데, 그 중에서 "Credentials"를 클릭하자.
이후, 아래 화면에서 "(global)" 클릭 -> 우측 상단에 "Add Credential" 버튼을 클릭하자.
그러면 아래와 같이 새 credentials를 생성할 수 있는 화면이 나오게 된다.
여기서 우리는 민감한 정보를 포함하고 있는 파일을 추가해야 하기 때문에, 아래와 같이 "Secret file"을 선택해야 한다.
그리고 등록해야 하는 파일을 선택해 업로드하고 ID를 입력한 뒤 맨 아래의 "Create" 버튼을 클릭하면 새로운 credentials가 생성된다.
이렇게 생성한 credentials를 빌드 과정에서 추가해야 한다. 이전에 생성했던 Jenkinsfile pipeline script에 아래와 같이 추가하고 GitHub repo에 push하자.
pipeline {
agent any
stages {
stage("Add Properties") {
steps {
script{
withCredentials([file(credentialsId: 'app-aws', variable: 'awsProperties'),
file(credentialsId: 'app-client', variable: 'clientProperties'),
file(credentialsId: 'app-gcp', variable: 'gcpProperties'),
file(credentialsId: 'app-jwt', variable: 'jwtProperties'),
file(credentialsId: 'app-oauth', variable: 'oauthProperties'),
file(credentialsId: 'app-payment', variable: 'paymentProperties'),
file(credentialsId: 'gcp-credential', variable: 'gcpCredential'),
file(credentialsId: 'app-env', variable: 'env')]) {
sh '''
cp -f ${awsProperties} src/main/resources/application-aws.yml
cp -f ${clientProperties} src/main/resources/application-client.yml
cp -f ${gcpProperties} src/main/resources/application-gcp.yml
cp -f ${jwtProperties} src/main/resources/application-jwt.yml
cp -f ${oauthProperties} src/main/resources/application-oauth.yml
cp -f ${paymentProperties} src/main/resources/application-payment.yml
cp -f ${gcpCredential} src/main/resources/gcp_credential.json
cp -f ${env} .env
'''
}
}
}
}
stage('Build') {
steps {
sh './gradlew clean build'
}
}
}
}
- Jenkins에서 추가한 credentials는 withCredentials(...)를 통해 불러올 수 있다. Credentials를 추가할 때 입력했던 ID를 여기서 명시해주어야 한다. 그리고 shell script 내부에서 사용할 수 있는 variable을 설정할 수 있다.
이제 다시 빌드를 시도해보면 아래와 같이 성공하는 것을 확인할 수 있다.
콘솔 로그를 자세히 살펴보면, credentials가 빌드 과정에 추가되는 것을 확인할 수 있으며, 성공적으로 프로젝트 빌드가 완료되는 것을 확인할 수 있다.
마무리
이렇게 Jenkins 설치 과정부터 pipeline 구성, 그리고 credentials 추가까지 진행하여 CI 구축을 완료했다. 글이 길어졌으니, CD는 다음 글에서 알아보도록 하겠다.
참고
[DevOps] Jenkins를 통한 CI/CD 구축기 1편 (Jenkins 설치)
🔗 연관 게시글 CI/CD란? [DevOps] Jenkins를 통한 CI/CD 구축기 1편 (Jenkins 설치) [DevOps] Jenkins를 통한 CI/CD 구축기 2편 (Backend CI/CD 구축) [DevOps] Jenkins를 통한 CI/CD 구축기 3편 (Frontend CI/CD 구축) [DevOps] Jenkins
seongwon.dev
Pipeline
Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software
www.jenkins.io
'CI&CD' 카테고리의 다른 글
[CI/CD] Jenkins + GitHub 인증 설정하기 (0) | 2024.09.16 |
---|---|
[CI/CD] Jenkins를 활용하여 CI/CD 구축하기 2 - CD 구축 (0) | 2024.09.09 |
[CI/CD] CI/CD란 무엇인가? (0) | 2024.09.03 |