처음에 jenkins pipeline script 를 다음과 같이 구성했다.
구성 내용은 다음과 같다.

  1. Checkout: git repository로부터 main 브랜치의 코드를 받는다.
  2. Packaging: nodejs로 release 할 부분의 코드를 tar로 packaging 한다. 이 파일은 dockerizing 할 때 copy가 되며, 자동으로 압축 해제된다.
  3. Dockerinzing: 내부 docker registry 서버로 push한 후, jenkins workspace에 캐싱하는 이미지를 제거한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pipeline {
stages {
stage('Checkout') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: '${credit}', url: '${git_url}']]])
}
}
stage("Packaging") {
steps {
sh 'tar cfz docker/route-cluster.tar.gz src package*.json'
}
}
stage("Dockerizing") {
steps {
sh """
cd docker;
docker build -t docker-reg.com:5000/route-cluster .;
docker push docker-reg.com:5000/route-cluster;
docker rmi docker-reg.com:5000/route-cluster;
"""
}
}
}
}

gitlab 서버로 관리하고 있어서 git push할 때 webhook을 날려서 jenkins에서 자동으로 작업을 하도록 구성했다. 만족스러운 결과물이었다.

그러나, 첫번째 개발완료가 끝나고 추가 기능을 넣는 시점에서 문제가 발생했다. 항상 최신 버전의 도커 이미지가 만들어지기 때문에, 이 상태로는 이전 버전에서 수정 사항이 발생했을 때 그 때의 도커 버전을 올릴 수 있는 방법이 어려웠다. 즉, tag를 그어서 특정 커밋 위치에서 도커 이미지를 제공할 수 있는 방법이 필요했다.

특정, tag를 빌드하기 위해서는 git push 할 때 자동 빌드되는 방법으로는 환경을 구성하기도 어렵고 비효율적이기도 하다. 이 때 git parameter plugin을 사용하게 되었다.

parameters 란에 gitParamter를 tag용으로 설정해줌으로 해서 git에 그어진 tag를 파라메터화할 수 있다. 이름을 TAG 으로 지정했기 때문에 선택한 이름은 ${params.TAG} 값을 참조할 수 있다. Dockerizing 할 때 이 변수를 참조해서 git의 tag 이름을 도커 이미지의 tag로 사용하면 된다.

git push 상황에서는 ${params.TAG} 값이 디폴트 값으로 지정한 main으로 넘어온다. 이 경우에는 tag를 지정하지 않으면 된다.

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
pipeline {
parameters {
gitParameter name: 'TAG',
type: 'PT_TAG',
defaultValue: 'main'
}
stages {
stage('Checkout') {
steps {
checkout([$class: 'GitSCM', branches: [[name: "${params.TAG}"]], extensions: [], userRemoteConfigs: [[credentialsId: '${credit}', url: '${git_url}']]])
}
}
...
stage("Dockerizing") {
steps {
sh """
cd docker;
if [ "${params.TAG}" != "main" ]; then
docker build -t docker-reg.com:5000/route-cluster:${params.TAG} .;
docker push docker-reg.com:5000/route-cluster:${params.TAG};
docker rmi docker-reg.com:5000/route-cluster:${params.TAG};
else
docker build -t docker-reg.com:5000/route-cluster .;
docker push docker-reg.com:5000/route-cluster;
docker rmi docker-reg.com:5000/route-cluster;
fi
"""
}
}
}
}

git에 tag를 긋게 되면, Build now에서 Build with Paramters로 바뀐 메뉴를 선택해서 tag 리스트에서 선택한 후 빌드를 한 번만 해주면 된다.

좀 더 게을러질 수 있게 된 것 같다.