Post

GitLab Webhook으로 Jenkins 빌드 유발

1. 환경

  • Ubuntu 24.04

  • OpenJDK 17.0.11

  • Jenkins 2.452.3

  • GitLab 17.2

  • Docker version 27.1.1

  • Docker Compose version v2.29.1

  • Spring Boot 3.3.2

  • Apache Maven 3.9.8

2. Jenkins 플러그인 설치

  • Install suggested plugins (추천 플러그인)

  • GitLab

  • Pipeline

  • Pipeline: Stage View

  • Docker

  • Docker Pipeline

  • Maven Integration

  • Publish Over SSH

install-plugins

3. Pipeline 생성

new-item

4. Jenkins Build Triggers 설정

1) GitLab webhook URL 확인

build-triggers

2) Secret Token 생성

secret-token

5. GitLab Webhook 설정

1) Webhook 추가

new-webhooks

2) Jenkins Triggers 정보 입력

Secret token 값은 Jenkins에서 생성한 Secret token 값을 넣는다.

webhooks

trigger

6. GitLab Webhook 테스트

1) Push Events

push-events

2) Push Events 결과 확인

push-events-status

7. GitLab Personal Access Token 생성

gitlab-access-token

add-personal-access-token

personal-access-token

8. Jenkins Credential 등록

credentials

add-credentials

1) GitLab API Token

API Token 항목은 GitLab에서 생성한 Personal Access Token이다.

이 Credentials은 Jenkins 관리 > System에서 GitLab connection을 위해 사용한다.

gitlab-token-credentials

2) GitLab - Username with password

Username 값은 GitLab 로그인 아이디, Password 값은 GitLab에서 생성한 Personal Access Token이다.

이 Credentials은 Pipeline script from SCM에서 GitLab에 접속하기 위해 사용한다.

gitlab-username-credentials

3) DockerHub - Username with password

Username 값은 DockerHub 로그인 아이디, Password 값은 DockerHub 로그인 비번이다.

이 Credentials은 DockerHub에 Docker Image push를 위해 사용한다.

dockerhub-credentials

9. GitLab connections 테스트

gitlab-connections

10. Tools 설정

tools

1) Maven installations 설정

maven-installations

11. Docker in Docker 설치

Docker로 설치한 Jenkins 컨테이너 안에 Docker Build를 위해 Docker를 설치한다.

1) Docker Container 접속

1
$ sudo docker exec -it jenkins /bin/bash

2) Docker 설치를 위한 Shell 다운로드

1
root@1dbb561762de:/# curl -fsSL get.docker.com -o get-docker.sh

3) Docker install shell script 실행

1
root@1dbb561762de:/# sh get-docker.sh

4) Docker 설치 확인

1
2
root@1dbb561762de:/# docker --version
Docker version 27.1.0, build 6312585

12. 매개변수 추가

Docker 빌드시 tag로 사용된다.

parameter

string-parameter

13. Pipeline 설정

1) Pipeline script from SCM 설정

pipeline1

pipeline2

14. Jenkins 파일 생성

Jenkins Pipeline은 프로젝트의 전체 파이프라인을 개발자가 직접 정의한 코드 형태(Pipeline as Code)로 받아 하나의 Job에서 이를 수행할 수 있는 기능을 제공한다.

Pipeline이 정의된 코드는 Jenkinsfile에 저장하고, 프로젝트 소스코드가 있는 Repository에 같이 관리함으로써, 프로젝트 단위의 파이프라인 정의가 이루어진다. 또한 파이프라인의 변경 이력이 남기 때문에 추적 및 복구가 용이하다.

GitLab 저장소에 Jenkins 파일을 생성(확장자 없음)하고 Pipeline을 작성한다.

프로젝트 환경에 맞는 stages를 적용한다.

jenkinsfile

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
31
32
33
34
35
36
37
38
39
40
41
pipeline {
    agent any
    tools {
        maven 'M2_HOME'
    }
    environment {
        imageName = 'dejavuhyo/example'
        containerName = 'example'
    }
    stages {
        stage('Maven Build') {
            steps {
                script {
                    sh 'mvn clean package'
                }
            }
        }
        stage('Build Image') {
            steps {
                script {
                    sh 'docker build -t ${imageName}:${BUILD_NUMBER} -f ./Dockerfile .'
                }
            }
        }
        stage('Stop and Remove Container') {
            steps {
                script {
                    sh 'docker stop ${containerName} || true'
                    sh 'docker rm ${containerName} || true'
                }
            }
        }
        stage('Run Image') {
            steps {
                script {
                    sh 'docker run -d -p 8090:8090 --name ${containerName} ${imageName}:${BUILD_NUMBER}'
                }
            }
        }
    }
}

15. Docker 파일 생성

Dockerfile은 Docker Image를 생성하기 위한 스크립트(설정 파일)이다.

Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며 Docker Image를 생성한다.

GitLab 저장소에 Docker 파일을 생성(확장자 없음)하고 스트립트를 작성한다.

dockerfile

1
2
3
4
5
6
FROM openjdk:17-jdk-alpine
CMD ["./mvnw", "clean", "package"]
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

repository

16. Jenkins 빌드 및 배포 확인

1) GitLab main branch

GitLab Webhook 설정이 되어 있어 main branch에 소스 변경이 일어나면, Jenkins Build Trigger 된다.

gitlab-webhook

2) 파라미터와 함께 빌드

매개변수를 입력하여 GitLab Webhook 없이 빌드한다. 빌드 시점의 GitLab 레파지토리 소스를 받아 빌드한다.

Jenkins에서 수동으로 빌드시 Jenkins Build Triggers는 설정하지 않아도 된다.

parameter-build-number

parameter-build

3) 배포 확인

release

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.