Jenkins는 소프트웨어 개발 및 배포 프로세스를 자동화하는데 도움을 주는 오픈소스 도구입니다.
jenkins의 설치 방법은 구글링만 해도 간단하게 알 수 있으니 넘어가고 제가 이번에 다룰 내용은 GitHub의 Webhook(웹훅)을 이용해 빌드 자동화를 다루려고 합니다.
회사에서는 private 환경을 위해 GitLab을 사용하고 있지만 public 하게 이용 가능한 GitHub로 진행해보겠습니다.
( GitLab은 jenkins에서 plugin 설치가 필요합니다. 그리고 좀 더 귀찮습니다.....)
모든 내용은 jenkins설치가 잘 되어있다는 가정 하에 진행하겠습니다.
1. GitHub 토큰 발급
우선 github 토큰을 발급해 줍니다. 제가 사용하는 IDE인 IntelliJ에서 GitHub연결을 위해 token을 발급받아 계정을 등록하는데 마찬가지로 jenkins에서도 필요합니다.
따라서, 토큰을 먼저 발급해봅시다.
GitHub에 로그인하여 프로필 > Setting으로 들어갑니다.
setting으로 들어가신 후, 왼쪽 메뉴 최하단에 보시면 Developer settings로 들어가주세요.
그럼 다시 왼쪽 메뉴 부분에 Personal access tokens > Tokens > Generate new token > Gernerate new token(classic)을 눌러주세요.
note 부분에는 무엇을 위한 토큰인지 입력해주시고(안 해도 상관없습니다.) 만료기한(Expiration)은 원하는 대로 설정해주시면 됩니다.
scope는 이렇게 두 개를 선택해주고 토큰을 생성해 줍니다.
그럼 아래와 같이 토큰이 생성됩니다. 이 토큰은 IntelliJ에서 GitHub연동할 때도 사용할 수 있습니다.
2. Jenkins 자격증명 설정
GitHub에서 발급 한 토큰을 이용해 jenkins에서도 접근할 수 있는 권한을 만들어야 합니다.
우선 jenkins페이지에 로그인 하셔서 Jenkins 관리로 들어갑니다.
이후 Security 파트의 Credentials로 들어갑니다.
빨간색 동그라미가 쳐져있는 global을 클릭하신 후
+Add Credentials 버튼을 누르면 다음과 같은 화면이 나옵니다.
Username : GitHub ID
Password : GitHub에서 발급받은 토큰
ID : 식별하고 싶은 ID(아무거나)
Description : 설명(생략 가능)
위 내용을 토대로 GitHub 계정과, 발급받은 토큰 그리고 본인이 알아보기 쉽게 Jenkins에서 사용할 ID와 Description을 넣어줍니다.
모두 완료하면 다음과 같이 생성된 자격증명을 확인할 수 있습니다.
3. Jenkins 프로젝트 생성
이젠 빌드를 자동화할 프로젝트를 생성할 차례입니다.
젠킨스 대시보드에서 새로운 Item을 클릭합니다.
저는 Jenkinsfile을 이용해 테스트 - 빌드 - 도커 이미지 빌드 순으로 파이프 라인을 구축할 것이기 때문에, Pipeline을 선택했습니다.
단순 빌드를 위한다면 Freestyle project를 선택하셔도 무방합니다. (프로젝트 설정은 비슷합니다.)
프로젝트 이름을 입력하고 OK 버튼을 누르면 아래와 같이 프로젝트 설정 창이 나옵니다.
GitHub project를 체크해주시고 Project url을 넣어줍니다. 여기서 말하는 프로젝트는 github에 올라가 있는 본인의 Git Repository url을 넣어주시면 됩니다 (ex. https://github.com/{gitName})
Build Triggers에는 웹훅을 이용해 빌드를 유발할 것이기에 GitHub hook trigger for GITSCM polling을 체크해줍니다.
이후, 맨 아래로 내리다 보면 Pipeline을 설정하는 부분이 있는데 아래와 같이 선택해주고
Definition : Pipeline script from SCM
SCM : Git
Repository URL : GitHub에서 Clone할 주소 (아래 이미지 참고)
Credentials : 버튼을 드롭다운 하면 2번 단계에서 생성한 자격증명을 선택할 수 있습니다.
혹시 Repository URL을 입력했는데 아래와 같은 오류가 발생한다면
다음과 같은 과정을 진행해주세요.
- 여기부터 -
Jenkins 대시보드로 돌아가 Jenkins 관리 > SystemConfiguration 하위 Tools로 들어갑니다.
만약 Jenkins가 Windows 환경에 설치되어 있다면 Git이 설치되어 있다는 가정하에 위와 같이 git 실행 파일 경로를 넣어주면 됩니다. 만약 Git 설치가 되어있지 않다면 Git 먼저 설치해주셔야 합니다.
(저는 Linux 개발환경에 Jenkins를 설치한 상태이기 때문에 빨간 오류가 뜹니다.)
Jenkins가 Linux 환경에 설치되어 있다면 단순하게 git이라고 넣어주면 됩니다. 만약 git으로 입력되어 있는데도 불구하고 빨간색 오류가 계속 발생한다면 Linux 서버에 들어가셔서 Git을 설치해 주시면 됩니다.
- 여기까지 -
프로젝트 생성으로 다시 돌아와서, 아래와 같이 설정해줍니다.
Branches to build : 빌드할 branch를 선택해 줍니다. 보통은 실제 운영에 올라갈 branch인 main 또는 master branch를 빌드합니다.
Script Path : Pipeline 프로젝트는 스크립트 파일을 이용하여 단계별로 수행되기 때문에 해당 파일명을 기입해 줍니다. Jenkinsfile 그대로 입력하면 프로젝트 최상단 바로 하위에 Jenkinsfile이라는 이름의 파일이 있어야 합니다.
이후 프로젝트 생성을 마무리합니다.
4. Webhook 설정
이제 branch에 변화가 생기면 자동으로 빌드를 진행해 줄 webhook을 설정할 차례입니다.
다시 GitHub로 돌아와 jenkins에서 설정할 프로젝트에서 Settings > Webhooks > Add webhook을 차례로 눌러줍니다.
이후, 맨 아래로 내리다 보면 Pipeline을 설정하는 부분이 있는데 아래와 같이 선택해주고
Payload URL 에는 본인의 jenkins 도메인 뒤에 /github-webhook/ 를 붙여줍니다.
Content type은 application/json으로 설정하고 맨 아래 Active를 체크해준 뒤 Add webhook 버튼을 눌러 설정을 마칩니다. (저는 이미 만들어 둔 상태라 Update webhook으로 나타납니다.)
자, 이제 거의 다 했습니다.
5. Jenkinsfile 생성
이제 webhook도 다 생성했겠다. 마지막으로 pipeline을 위한 jenkins 파일만 만들면 됩니다. 제가 push 하려는 프로젝트는 다음과 같습니다.
위와 같은 구조를 따르는데 가장 상위 프로젝트 디렉터리 아래에 빨간색으로 동그라미 친 파일인 Jenkinsfile을 생성해 줍니다.
파일명은 꼭 Jenkinsfile로 해야 합니다. 3번의 jenkins에서 프로젝트를 생성할 당시에 Script Path에 Jenkinsfile로 넣어줬기 때문에 맞춰주어야 합니다. 혹시 다른 이름으로 설정하셨다면 해당 이름으로 맞춰서 작업하시면 됩니다.
어쨌든, 이제 Jenkinsfile로 pipeline을 구축해 봅시다.
pipeline {
agent any
stages {
stage('Prepare'){
steps {
git credentialsId : '{credentialId}',
branch : '{branchName}',
url : 'https://github.com/{repoName}/{projectName}.git'
}
}
stage('test') {
steps {
echo 'test stage'
}
}
stage('build') {
steps {
echo 'build stage'
}
}
stage('docker build') {
steps {
echo 'docker build stage'
}
}
}
}
jenkins에서 말씀드렸다시피 저는 test > build > docker build 순으로 파이프라인을 생성하려고 했기 때문에 각 단계에 맞는 stage 이름을 붙였습니다. stage는 본인의 상황게 맞게 작성해 주시면 됩니다.
Prepare 단계에서는 git 저장소에서 소스를 가져와야 하기 때문에 이에 대한 정보를 넣어주어서 clone 하였습니다.
credentialId : 2번째 단계에서 jenkins에서 생성한 자격증명 ID
branch : clone 할 branch 명 ( webhook을 설정한 branch)
url : git 프로젝트의 clone url을 넣어주시면 됩니다.
그리고 간단하게 각 stage가 동작하는지만 확인하기 위해서 echo를 이용해 sysout 만 설정해두었습니다.
이제 모든 준비가 끝났으니 Jenkinsfile을 commit > push 해서 빌드가 잘 되는지 확인해봅시다.
commit 이후 push까지 진행하겠습니다.
6. 오류 잡기
push까지 완료를 했더니 다음과 같은 상태에서 멈춰 있었습니다.
이유를 확인해 봅시다. 왼쪽에 Console Output을 클릭해서 로그를 확인할 수 있습니다.
빌드를 멈추고 확인해봤더니 Still wating to schedule task 상태에서 무한정 대기 중인 것을 확인할 수 있었습니다.
왜 대기 중인가 했더니 빌드를 진행하는 노드에 이상이 있다는 것을 jenkins 대시보드에 가면 볼 수 있었습니다.
눌러서 확인해보니 다음과 같은 오류가 발생했었습니다.
Monitoring Data를 눌러서 드롭다운 해보면 더 자세히 알 수 있습니다.
디스크 용량과 관련된 오류인 것을 추측할 수 있죠.
자, 이 내용을 토대로 구글링을 해본 결과 다음 사실을 알 수 있었습니다.
1. 저의 서버는 EC2이며 dnf 명령어를 통해 jenkins를 설치했습니다. (docker로 설치하려 했는데... 이미 설치 한 뒤라 그냥 진행했습니다.)
2. Free Temp Space의 경로는 /tmp 파티션의 용량을 따지는데 서버에서 확인해 보니 적은 용량을 가지고 있었습니다.
이 문제를 해결하기 위해서는 jenkins의 설정을 조금 만져줘야 합니다.
왼쪽의 설정으로 들어가 줍니다.
이후, 맨 아래로 내리다 보면 Pipeline을 설정하는 부분이 있는데 아래와 같이 선택해주고
아래의 Node Properties 부분에서 Disk Space Monitoring Thresholds를 체크해서 보시면 Free Temp Space Threshold와 Free Temp Space Warning Threshold 부분이 있는데 이 부분의 용량을 낮춰주시면 됩니다.
/tmp 파티션의 용량이 475M였으니까 저는 200M로 설정해주도록 하겠습니다.
이렇게 설정해준 뒤에 저장을 하고 jenkins 대시보드에 가시면 다음과 같이 오류가 사라지고 2개의 executor가 대기 중인 것을 확인할 수 있습니다.
이제 다시 테스트해봅시다 push를 해보면....
성공입니다.
Stage도 확인을 해보면?
Jenkinsfile에 각 stage에 맞게 빌드가 된 것을 확인할 수 있습니다.
'개발' 카테고리의 다른 글
[Java/자바] JPA 에 대하여 (1) - JPA의 등장 (0) | 2024.10.26 |
---|---|
node.js 실행파일 만들기 (2) | 2023.07.14 |
[CentOS 7/Linux]리눅스 MariaDB 바이너리 파일로 설치하기(yum없이 tar.gz이용) (10) | 2023.03.30 |
리눅스(CentOS) 사용자 sudo권한 주기 (0) | 2023.03.28 |
VMware 우분투 설치하기(가상머신 : Ubuntu22.04) (0) | 2023.03.06 |