RockyLinux 8.6
때로는 찾기 어려운 이유로 여러번 commit/push를 반복해야 하는 경우가 있는데 서버에서 도는 gitlab-runner는 느리기 때문에 시간이 너무 오래 걸렸다. 그래서 로컬에서 확인할 수 있는 방법을 알아보게 되었다.
관련 내용들을 찾아보면 크게 gitlab-runner를 로컬에서 직접 실행하는 경우와 gitlab-runner 자체가 docker 이미지인 경우가 있는 듯 하다. 여기서는 전자에 대한 확인 결과이다. 이 방법을 사용하면 서버로 push하지 않고 commit까지만 수행한 후 gitlab-runner를 통해 CI 결과를 확인할 수 있다.
먼저 docker를 설치한다.
그리고 gitlab-runner를 가져온다.
wget https://s3.dualstack.us-east-1.amazonaws.com/gitlab-runner-downloads/v14.2.0/binaries/gitlab-runner-linux-386
sudo mv gitlab-runner-linux-386 /usr/bin/gitlab-runner
sudo chmod 700 /usr/bin/gitlab-runner
# 필요에 따라 버전(v14.2.0), 종류(binaries/rpm), 플랫폼(amd64) 변경
# 참고: https://docs.gitlab.com/runner/install/bleeding-edge.html#download-any-other-tagged-release
그리고 .git/과 .gitlab-ci.yml이 존재하는 디렉터리로 이동해서 gitlab-runner를 실행한다. 관련 문서들을 찾아보면 exec 전에 gitlab-runner run 이 필요하다고 하는데 내 경우에는 exec만 해도 CI가 진행되었다.
sudo gitlab-runner exec docker <stage> --docker-pull-policy if-not-present --env "foo=bar" --docker-privileged
# 예시
sudo gitlab-runner exec docker test:unit-test --docker-pull-policy if-not-present --docker-privileged
기타 몇 가지 exec의 옵션:
- --env 환경 값. 여러 번 쓸 수 있다. .gitlab-ci.yml에 전달할 환경 값도 이것으로 지정한다.
ex) --env "foo=bar" - --pre-clone-script clone 전에 수행할 명령
ex) --pre-clone-script 'cd /tmp; ls' - --pre-build-script, --post-build-script 수행 시점만 다르고 --pre-clone-script와 동일하다.
- --docker-privileged umount를 하려면 필요하다.
내 실제 작업 디렉터리가 /pkg라고 할 때 gitlab-runner가 실행되면 아마도 docker 내부에서도 /pkg가 mount되는 것 같다(검증은 안해봄). 내 경우 /pkg와 그 하위의 파일/디렉터리가 그대로 docker 내부에 존재했다(따라서 /pkg 하위의 임시 파일들까지 그대로 존재함). --env 'GIT_STRATEGY=none' 를 전달하면 docker 내부에 빌드 디렉터리(내 경우 /builds/project-00)는 생기지만 git 소스가 clone되지 않는다. 따라서 직접 소스코드를 clone해야 한다. 그리고 이 경우에도 /pkg를 docker 에서 찾을 수 있었다.
내 경우에는 특정 위치에서 테스트를 진행하는 게 필요했고 그 위치에 write가 발생해야 했지만 docker에 마운트된 /pkg는 readonly 상태였고 임시 파일들이 존재하기 때문에 깨끗한 테스트를 위해 /pkg를 umount 후 /builds/project-00/*을 /pkg/로 복사했다.
이 방법으로 로컬에서 더 빠르게 반복 사이클을 수행할 수 있었다. 하지만 gitlab 서버에서 사용한 동일한 docker 이미지에 동일한 gitlab-ci.yml이었음에도 실제 실행 결과는 달랐기 때문에 로컬에서 검증한 내용이 gitlab 서버에서도 파이프라인을 깨뜨리지 않을거라는 100% 확신은 갖을 수 없었다.
# 최종
sudo gitlab-runner exec docker test:unit-test --docker-pull-policy if-not-present \
--env 'BASEDIR=/pkg' --docker-privileged \
--pre-build-script 'umount /pkg; cp -a /builds/project-0/* /pkg/'