jenkins pipeline script 모듈화

mhlee·2021년 5월 20일
0
post-thumbnail

jenkins pipeline script를 통해 빌드와 배포를 한다.
배포와 관련된 cli를 script화 해서 처리했지만, 이 역시 겹치는 부분이 많이 생긴다.
pipeline script 자체가 git code로 관리되고 있어, 모듈화하는 방식에서 고생(?)을 했고 이를 기록에 남깁니다.

1. 배포 구조

아래 그림과 같이, pipeline script from SCM을 통해, jenkins 파일을 다운로드 한다.
그리고, 해당 스크립트 내용대로 app & docker 를 빌드하고, registry에 저장후 배포한다.
예상하겠지만, cli 명령이 거의 동일하기 때문에 거의 모든 script가 비슷한 내용이고, 복/붙으로 구성되어 있다.

2. 구조 개선

중복된 script 코드를 모듈화 해서 import하면 쉽게 끝날것이라 생각했다.
그런데, 문제는 pipeline script from SCM을 사용하면, 작업 script 하나만 보고 작업해 나가는 구조로 추측된다. 즉, 외부에 commons.groovy라 파일을 만들고 import해도 안된다. (어쩌면 가능 한데 제가 못찾았을수도 있습니다.)

아래와 같이 jenkins에서 global pipeline library를 생성할수 있다.
공통된 부분을 라이브러리 미리 만들고, pipeline script에서는 해당 모듈을 불러 사용하는 방법이다.

3. global pipeline libray 만들기

아래와 같이, 젠킨스관리 > 환경설정 > Global Pipeline Libraries로 이동한다.
해당 항목에 name과 default, 그리고 체크항목을 아래와 같이 입력한다.
해당 소스코드도 gitlab으로 관리할것이기 때문에 해당 gitlab repository 정보를 등록한다.

4. 테스트

/vars/git.groovy 파일을 생성후 아래와 같이 입력한다.

def getServer() {
    return "ssh://git@192.168.20.106:8884"
}

def clone(repository, directory) {
    gitServer = getServer()
    sh "git clone ${gitServer}/${repository} ${directory}"
}

def checkout(branch) {
    gitServer = getServer()
    sh "git checkout ${branch}"
    sh "git pull"
}

이제 이 내용을 pipeline script에서 아래와 같이 사용할수 있다.
상단에 @Library("commons") _ 이 내용은 commons에 있는 내용을 모두 import하는것 같다.(사실 groovy하나도 몰라요 ㅜ.ㅜ)

@Library("commons") _

node {
    GIT_REPOSITORY = "backend-api.git"
    GIT_BRANCH = "production"

    DOCKER_FILE = "Dockerfile"
    DOCKER_NAME = "backend-prod"

    PROFILE = "production"
    SERVICE_PORT = "8031"
    
    stage("git clone") {
        git.clone(GIT_REPOSITORY, DOCKER_NAME)
        dir("${DOCKER_NAME}") {
            git.checkout(GIT_BRANCH)
        }
    }
    
    ...
    //이후 배포 스크립트 계속
}

5. 뱀꼬리

이 내용은 아래 사이트와 구글링해서 주워 들은 내용을 기반으로 기록했습니다.
https://www.jenkins.io/doc/book/pipeline/shared-libraries/
문서에 보면 /src 폴더와 /vars 폴더등 예제가 나오는데, 일단 문제해결에 포커싱해서 어떤 차이인지 자세히 보지는 않았습니다.
배포 방법이 여러가지인데, 개인적으로 직접 코드를 작성하는 방식을 선호합니다.
shell로 진행하다 pipeline으로 진행하다 이번에 script를 모듈화 하는 방법까지 해보게되었습니다.
더 좋은 방법이 아마 많이 있을것 같은데, 일단 저와 비슷한 케이스가 있으신분들이 있을수 있다고 보고 기록을 남겨둡니다.

profile
삽질하는 개발자

0개의 댓글