Gitlab, Helm Chart CI 구축
Gitlab 은 Package Registry 라고 Helm 저장소를 지원한다. Helm Chart 를 만들고 이를 자동으로 빌드해서 Helm 저장소로 Push 하도록 만들어 보자.
Gitlab-runner
Gitlab 은 빌드를 위해서 Runner 라는 별도의 패키지를 소프트웨어를 제공한다. 이렇게 하면 서버를 여러대 둘 수 있고 각 빌드별 특성에 맞는 설정을 가진 Runner 를 셋업할 수 있다.
Helm 을 위해서는 당연히 helm 명령어가 설치되어 있어야 Runner 가 Helm 을 만들때 이용할 수 있다.
1 2 3 |
]$ curl -fsSLO https://get.helm.sh/helm-v3.14.2-linux-amd64.tar.gz ]$ tar xvzf helm-v3.14.2-linux-amd64.tar.gz ]$ sudo mv helm /usr/local/bin/; sudo chmod +x /usr/local/bin/helm |
gitlab-ci.yml
Gitlab 은 CI 를 위해서 gitlab-ci.yml 파일을 이용한다. 이 파일이 있으면 자동으로 인식해 CI 를 실행해 준다. 이 파일에서 해줘야 할 것은 다음과 같다.
- git 소스코드 clone
- helm package 제작
- gitlab 의 package registry 에 push
여기서 한가지 짚고 넘어가야하는 것이 Gitlab-Runner 는 Gitlab 에 이름으로 등록을 하게 된다. 이것을 이용하기 위해서는 gitlab-ci.yml 에서 지정을 해줘야 한다. 뼈대는 대략 다음과 같다.
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 |
stages: - package - registry helm-package: stage: package scripts: - "" artifacts: paths: - "*.tgz" after_script: - echo 'build success!' tags: - java-runner only: - main helm-registry: stage: registry dependencies: - helm-package scripts: - "" tags: - java-runner only: - main |
기본적인 틀은 위와 같다. only 는 git 브랜치가 main 을 대상으로 한다는 것을 지정한다. tags 는 Gitlab-Runner 를 말한다. 어떤 Runner 를 사용할지는 빌드환경에 따라 다르다. 위의 경우에는 java-runner 인데, Runner 의 타입이 shell 로 되어 있다. 그래서 앞에서 helm 명령어를 설치해줬다.
이제 stage:package 를 완성해야 한다. 다음과 같이 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
helm-package: stage: package script: - "/usr/local/bin/helm package ." artifacts: paths: - "*.tgz" after_script: - echo 'build success!' tags: - java-runner only: - main |
기본뼈대에서 script 부분에 helm 을 패키징하기 위한 명령어를 넣으면 끝난다.
다음으로 stage:registry 부분은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 |
helm-registry: stage: registry dependencies: - helm-package before_script: - PACKAGE=`ls *.tgz` script: - 'curl --request POST --form "chart=@${PACKAGE}" --user gitlab-ci-token:$CI_JOB_TOKEN "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/helm/api/stable/charts"' tags: - java-runner only: - main |
package 를 하고 난후에 패키징된 파일의 확장자는 tgz 이다. 이것을 Shell 환경변수로 만들고 script 명령어에서 사용할 수 있다. curl 명령어중에서 –user 부분에 gitlab-ci-token 과 $CI_JOB_TOKEN 은 이미 정의된 사용자와 변수다. 이것은 Gitlab 에서 별도로 생성하지 않는다. 이미 있는 것이다. URL 에 있는 CI_API_V4_URL 과 CI_PROJECT_ID 도 이미 정의된 변수다. 알아서 맞게 파싱을 해준다.