티스토리 뷰

앞서 설치한 Docker를 사용해서 Jenkins 컨테이너를 띄워볼것이다.
우선 그 사이 내 컴퓨터는 윈도우에서 맥으로 바꼈다🥳 꺄하ㅏ하
mac에서 docker설치는 거의 다운로드만 하면 될 정도로 간단하므로 자세히 다루진 않을 것이다 (캡쳐도 따기 전에 설치 다 해버림;)
🥸 Jenkins?
Jenkins는 소프트웨어 개발에서 지속적 통합(CI)과 지속적 배포(CD)를 도와주는 오픈소스 자동화 서버이다.
한 마디로 개발, 빌드, 테스트, 배포 과정을 자동화할 수 있다.

CI/CD의 개념이 낯설다면 이렇게 생각할 수 있다.
코드를 변경한 후 매번 직접 테스트하고 빌드하고 서버에 올리다 보면, 시간도 오래 걸리고 사람이 하는 일이니 실수가 많아질 수밖에 없다.
Jenkins는 이런 번거로운 작업을 자동으로 처리해주며, 덕분에 개발자들은 개발 본연의 업무에 집중할 수 있게 된다.
🎀 Jenkins의 주요 특징
1. 플러그인 시스템
Jenkins는 다양한 플러그인을 지원해서 거의 모든 환경에 맞게 커스터마이징 가능. Git, Docker, kubernetes, Slack 등 수백 가지 툴과 통합이 가능하다.
2. 웹 기반 UI
Jenkins는 직관적인 웹 인터페이스를 제공해서 설정과 관리가 비교적 쉬움.
3. 무료 오픈소스
많은 기업과 팀에서 부담 없이 도입할 수 있음.
⚙️ Jenkins 설치
Jenkins를 설치하는 방법은 여러 가지가 있지만, 가장 기본적인 Docker를 이용한 설치 방법을 소개합니다.
1. Docker 설치되어있는지 확인
docker --version

2. Jenkins 실행
docker run -d -p 8082:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts

추후 nginx와 gitlab을 8080, 8081에 띄울 것이기 때문에 jenkins는 8082에 port를 사용했음.
-d : 컨테이너를 백그라운드에서 실행
-p 8082:8080 : 포트를 지정함. 호스트 포트 8082, 컨테이너 내부 포트 8080 사용. 이 매핑을 통해, 호스트 머신의 8082 포트를 컨테이너 내부의 8080 포트에 연결한다.
-p 50000:50000 : 또 다른 포트를 지정함. Jenkins는 분산 빌드(Distributed Build)를 지원하며, Jenkins Master와 Agent 노드 간의 통신에 50000 포트를 사용. 이 매핑을 통해 Jenkins Master와 Agent가 통신할 수 있도록 설정한다.
--name jenkins : 컨테이너 이름은 'jenkins'로
jenkins/jenkins:lts : 사용할 이미지 (※ lts : Long-Term Support. 안정성과 장기 지원을 제공하는 Jenkins 버전)
3. Jenkins 컨테이너 띄워졌는지 확인
docker ps

4. 컨테이너 내부에 접속해서 jenkins 초기 비밀번호 복사
docker exec -it jenkins /bin/bash
cd /var/jenkins_home/secrets
cat initialAdminPassword

5. http://localhost:8082 접속 후 복사한 비밀번호 입력

6. 기본 plugin 설치 및 User 등록




7. Jenkins 설치 완료

📞 Jenkins Trigger
Jenkins에서 빌드를 트리거하는 방법은 여러 가지가 있다.
각 프로젝트의 요구사항에 따라 적합한 방식을 선택하여 사용한다.
1. 수동 트리거
- 사용자가 Jenkins 웹 UI에서 직접 "Build Now" 버튼을 클릭하여 빌드를 실행
- 설정 방법 :
- Jenkins에서 작업(Job)을 생성하거나 수정
- 별도의 트리거 설정이 필요하지 않음
- 사용 예시 : 간단한 테스트나 개발 환경에서 자주 사용
2. 웹훅(Webhook) 기반 트리거
- GitHub, GitLab, Bitbucket 등과 같은 소스 코드 관리 시스템(SCM)이 변경 사항을 감지하면 Jenkins에 요청을 보내 빌드를 시작.
즉, 업데이트 생겼음! 이라고 jenkins에게 알려줌 - 설정 방법 :
- Jenkins에서 SCM Polling 또는 Webhook Trigger 플러그인을 활성화
- 프로젝트 설정에서 Gitlab/GitHub Trigger를 선택
- Git Repository에 웹훅 URL을 설정 : http://<JENKINS_URL>/github-webhook/ 또는 http://<JENKINS_URL>/gitlab-webhook/
- 사용 예시 : 코드가 push 되거나 merge 될 때 자동으로 빌드 시작
3. SCM Polling
- Jenkins가 주기적으로 소스 코드 저장소를 확인하여 변경 사항이 있을 경우 빌드를 실행
즉, 업데이트 있어? 업데이트 있어? 업데이트 있어? 업데이트 있어? 업데이트 있어? 라고 jenkins에게 물어봄 - 설정 방법 :
- 작업(Job) 설정 화면에서 Build Triggers → Poll SCM 선택
- 폴링 주기를 크론 표현식으로 입력
ex) H/5 * * * * #5분마다 체크
- 사용 예시 : 웹훅 설정이 어려운 환경이나 프로젝트 초기에 커밋이 굉장히 자주 발생할 때
4. 기타
이 외에도 Cron Schedule을 이용한 트리거, 다른 작업으로부터 트리거, Jenkins REST API를 통한 트리거, Pipeline 내부에서 다른 작업을 트리거하는 등...
상황에 따라 어떤 방식을 쓸 건지 잘 선택해야 한다.
⚒️ Jenkins Pipeline

Jenkins Pipeline은 크게 두 가지 형태가 있다.
1. Declarative Pipeline : 작성이 쉽고 가독성이 좋아서 많이 사용됨
2. Scripted Pipeline : 러닝커브가 있지만 더 많은 기능을 제공함
이 두 형태 중 조금 더 자주 쓰이는 건 Declarative Pipeline이다.
Declarative Pipeline은 4가지 주요 영역으로 나뉘고, groovy언어를 사용한다.
- agent
- stages
- steps
- post
✔︎ agent
agnet는 단순히 Jenkins 작업을 실행할 프로세스다.
기본적으로 agent any가 제공되므로 별도로 agent 설정을 하지 않아도 작업이 가능하다.
그런데 agent는 Jenkins 서버가 있는 머신에서만 동작하는 게 아님. SSH 같은 방식으로 원격에서도 동작하도록 설정할 수 있다.
agent설정 시 label이라는 별칭도 줄 수 있으며, 아래처럼 'my-agent'로 특정 agent를 지정할 수 있다.
agent { label 'my-agent' }
파라미터 | 설명 | 예시 |
any | 사용가능한 어떤 agent에서도 실행될 수 있음. | agent any |
none | 파이프라인을 실행하는 동안 어떤 global agent도 할당되지 않음 | agent none |
label | 제공된 label을 이용해 파이프라인 실행 | agent {label 'example'} |
node | label과 유사. 추가적인 옵션 추가 가능 | agent {node{label'example'}} |
docker | 도커 기반 파이프라인 제공 | |
dockerfile | 도커파일 기반 파이프라인 제공 |
✔︎ steps
steps는 실제 작업을 담고 있는 블록이다.
steps 안의 명령 한 줄 한 줄이 step이라고 보면 된다.
steps 안에서 script를 사용하려면 Scripted Pipeline 문법을 부분적으로 사용할 수 있다. (※ 그렇다고 scripted 문법을 지나치게 많이 사용하면 Declarative Pipeline의 장점인 가독성이 떨어질 수 있음 !!!)
steps {
echo 'Hello World'
script {
def browsers=['chrome', 'firefox']
for (int i=0;i<browsers.size();++i){
echo "Testing the ${browsers[i]} browser"
}
}
}
✔︎ post
post는 후처리 작업을 위한 블록이다.
post블록은 pipeline이나 stage레벨에 붙이고, 내부에는 post-condition 블록을 설정할 수 있다.
이 블록은 바로 위 작업의 결과에 따라 실행 여부를 결정함.
pipeline{
agent any
stages {
stages('Example') {
steps {
echo 'Hello World'
}
post {
success {
echo 'success' # 위 steps 전부 성공하면 실행
}
failure {
error 'failure' # steps에서 하나라도 실패하면 실행
}
}
}
}
post {
always {
echo 'I will always say Hello again!' # stages 끝나고 반드시 실행
}
}
}
※ post-condition 블록❓
- success : 작업이 모두 성공했을 때 실행
- failure : 작업 중 하나라도 실패하면 실행
- always : 작업 결과와 상관없이 항상 실행
- changed : 현재 빌드의 상태가 이번 빌드의 상태와 달라졌다면 실행
- unstable : 현재 빌드의 상태가 불안하다면 실행
🍀 Jenkins 활용 팁
- Slack 알림 연동
- Slack 플러그인을 설치하면 빌드 상태를 팀원에게 실시간 공유 가능
- 이 얼마나 편한 세상인가 ,, (근데 우리 회사는 안 써서 연동 못해봄 ㅠ 언젠간 쓰겠지)
- 병렬 빌드
- 여러 작업을 동시에 처리해야 한다면, 파이프라인에서 병렬 단계를 활용할 수 있음
- 다수의 프로젝트를 동시빌드할 때 아주아주아주 요긴하게 활용함. 빌드속도와 관련 있음
- 보안 설정
- Jenkins는 기본적으로 누구나 접근 가능한 상태로 실행되기 때문에 꼭 관리자 계정과 접근 권한을 설정
'Programming > DevOps' 카테고리의 다른 글
[Linux] 리눅스 환경에서 su와 sudo의 차이점 (0) | 2024.12.11 |
---|---|
[Docker] 도커 스토리지 마운트 & 도커 컴포즈 (4) | 2024.11.01 |
[Docker] 도커 명령어 : 커맨드 및 옵션 (2) | 2024.11.01 |
- Total
- Today
- Yesterday
- IMAGE
- Java
- cicd
- bruteforce
- 아이템60
- DevOps
- docker
- OS
- dp
- 완전탐색
- 토큰기반인증
- 아이템59
- Container
- springboot
- 아이템61
- docker-compose
- EffectiveJava
- Retrofit2
- 순열
- subset
- 백준
- 운영체제
- 그래프탐색
- 알고리즘
- BOJ
- 이펙티브자바
- 조합
- BFS
- 완탐
- dfs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |