Gitlab, Docker 빌드시 x509: certificate signed by unknown authority 오류 해결
Gitlab 은 CI/CD 를 내장하고 있다. 이는 Gitlab-runner 를 통해서 이루어진다. gitlab-ci.yaml 파일을 이용해 CI/CD 명세를 작성하면 Gitlab-Runner 가 이 파일을 읽어 실행해 준다. Gitlab-Runner 에는 타입이 존재하는데, docker 로 할 경우에 Docker 를 이용해서 CI/CD 를 진행하게 된다. 다시말해서, Docker 를 이용해서 Container 안에서 빌드, 테스트, 배포가 이루어진다는 것이다.
Private Certificate
문제는 사설 인증서다. Docker 컨테이너내에서 외부 접속을 하기 위해서 HTTPS 통신이 필요한데, 하필이면 HTTPS 가 사설 인증서를 사용한 것이라면 다음과 같은 오류가 발생한다.
1 2 |
$ gitlab-terraform validate Error refreshing state: Failed to get state: GET https://gitlab.systemv.local:8001/api/v4/projects/21/terraform/state/default giving up after 1 attempt(s): Get "https://gitlab.systemv.local:8001/api/v4/projects/21/terraform/state/default": x509: certificate signed by unknown authority |
Docker 컨테이너 안이라 사설 인증서에 대한 인증서를 붙여놔야 하는데, 어떻게 해야하는 문제가 있다.
Self-signed certificates or custom Certification Authorities
다음의 Gitlab 문서에 이에 대한 내용이 나와 있다.
Self-signed certificates or custom Certification Authorities
문서가 조금 부족한 감이 있는데, 두가지 절차가 필요하다.
Gitlab-Runner 에 볼륨 마운트
Pipeline 에서 사용할 Gitlab-Runner 에서, 당연히 Docker 타입, 볼륨 마운트 설정을 해준다. 이 설정은 Docker 명령어의 -v 옵션과 동일하다. 볼륨 마운트를 할때에 ca.crt (Root CA 인증서) 파일을 마운트 해준다.
1 2 3 4 5 6 7 8 |
[runners.docker] tls_verify = false image = "maven:3.8.4-openjdk-8-slim" privileged = false disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/etc/docker/certs.d/regi.gitlab.systemv.local/ca.crt:/tmp/ca.crt","/cache"] |
Pipeline 이 실행되고 Docker 컨테이너가 시작되면 설정한 볼륨을 마운트 해준다. 그러면 Docker 컨테이너 내에 /tmp/ca.crt 파일이 존재하게 된다.
이제 Docker 컨테이너에 ca.crt 파일을 설치해주면 된다.
gitlab-ci.yaml 에 job 내에 ca.crt 설치
이제 gitlab-ci.yaml 파일에 job 내에 ca.crt 를 설치해 준다. 다음과 같다.
1 2 3 4 5 6 7 8 9 |
build: before_script: - apk update >/dev/null - apk add ca-certificates > /dev/null - rm -rf /var/cache/apk/* # The trick is the following: - cp /tmp/ca.crt /usr/local/share/ca-certificates/ca.crt - update-ca-certificates --fresh > /dev/null |
위 내용은 Alpine 이미지를 사용할 경우, ca.crt 파일을 설치하는 방법을 기술한 것이다. 아래 두번째에 보면 Gitlab-Runner 설정에서 마운트 되었던, /tmp/ca.crt 파일을 Alpine 이 CA 설정 디렉토리로 복사해주고 있다.
이렇게 하면 build 단계에서 인증서를 설치하게 된다.
결론
Gitlab-Runner 를 사용하다보면 대부분 Docker 기반으로 빌드,테스트,배포를 하게 된다. Shell 타입도 Docker 기반일 경우에 별도의 프로그램 설치와 설정이 필요 없기 때문이다. 하지만 사설 인증서를 사용할 경우에 통신이 되지 않을 수도 있는데, 위와 같은 방법으로 해결 할 수 있다.