티스토리 뷰

 

앞서 설치한 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 등록

Plugin설치
Admin User 등록
접근할 URL설정
준비갈완료!

 

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는 기본적으로 누구나 접근 가능한 상태로 실행되기 때문에 꼭 관리자 계정과 접근 권한을 설정
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함
250x250