개요
GitLab을 사용하고 있는데, 레포지터리 내 특정 파일에 변경 사항이 발생하면 pipeline job 내에서 다른 파일을 변경하여 레포지터리에 push 하려는 요구사항이 있다.
때문에 이번 글에서는 gitlab 레포지터리에 push를 수행하는 gitlab 파이프라인을 구성해보려고 한다. 다만, 파이프라인은 구성을 잘못하면 파이프라인이 동작할 때마다 파이프라인을 트리거하는 문제가 발생할 수 있기 때문에 주의해야 한다.
테스트 환경은 gitlab.com으로, 별도 러너 구성 없이 gitlab 제공 러너를 사용할 것이다.
이번 글에서는 SSH 인증 구성 방법만 정리해둔다.
인증 구성 옵션
gitlab 레포지터리에 작업을 수행하기 위해서는 인증이 필요하다.
인증 방식에는 여러 선택지가 존재하지만, 이번 글에서는 SSH 인증을 사용하여 구성한다. 다른 선택지를 사용하지 않은 이유는 다음과 같다.
- 개인 액세스 토큰 : 구성이 간편하다. 하지만 gitlab 16.0부터 강제로 만료일을 지정하게끔 변경되었다. 만료일을 관리해야 하는 불편함이 존재한다.
- Job Token : gitlab 17.2 이상에서는 gitlab-ci-token을 사용하여 레포지터리에 쓰기 작업을 수행할 수 있도록 개발하고 있다. 하지만 아직 테스트 상태이기도 하고, 유료 라이선스 사용자에게만 제공하는 것 같다.
- 배포 토큰 : 레포지터리 읽기 권한은 제공하지만 쓰기 권한은 제공하지 않는다.
- SSH 인증 : 직접 SSH 키쌍을 생성하고 배포 키와 CI/CD 변수를 사용하여 구성해야 하는 번거로움이 있지만, 별다른 만료일이 존재하지 않는다.
따라서 이번 글에서는 SSH 인증 방식으로 구성해 보겠다. 구성 방법은 다음과 같다.
1. SSH 키 쌍 생성
2022.04.15-[GitLab] 사용자 계정에 SSH 키 등록 글을 참고하여 키 쌍을 생성한다.
ssh-keygen -f /PATH/OUTPUT_FILENAME
# 예시
ssh-keygen -f ./gitlab-runner
개인 키와 공개 키 파일이 생성된다. 참고로 공개 키 파일이 .pub 확장자를 가진다.
2. 프로젝트 CI/CD 변수에 개인 키 저장
프로젝트 CI/CD 설정에서 Variables 항목을 찾는다.
변수 추가 버튼을 누르고, Type을 일반 변수로 지정한 뒤 다른 설정은 적절히 구성한다. 이 글에서는 Flags에서 보호 변수는 제거하는 정도만 지정했다.
그리고 이제 키 이름과 값을 지정해야 한다. gitlab 공식 안내에 따르면 Key 이름은 SSH_PRIVATE_KEY으로 지정하도록 권하고 있다. values에는 ssh-keygen으로 생성한 비밀 키를 복사하여 붙여 넣는다. 값은 줄 바꿈으로 끝나야 한다!
이상이 없다면 변수를 저장한다.
참고로 변수의 값을 포함한 모든 구성은 언제든지 편집을 통해 변경할 수 있다.
3. 배포 키 구성
프로젝트의 레포지터리 설정에서 배포 키 항목으로 이동한다.
Add new key를 누르고 Key 이름은 식별 가능한 정도로, Key에는 ssh-keygen으로 생성한 공개 키를 복사하여 붙여 넣는다.
키를 생성할 때는 레포지터리 쓰기 작업을 허용해야 하고, 만료일은 필요한 경우 지정한다.
여기까지 해서 gitlab CI/CD 파이프라인 인증 구성을 마친다.
참고 문서
https://forum.gitlab.com/t/git-push-from-inside-a-gitlab-runner/30554/4
https://docs.gitlab.com/ci/jobs/ssh_keys/
https://gitlab.com/gitlab-examples/ssh-private-key/
https://www.reddit.com/r/gitlab/comments/1arymxp/is_it_possible_to_push_the_code_from_gitlab/