소프트웨어 마에스트로 과정을 진행하면서 코드 관리를 Gitlab으로 하라고 했다. 우리팀은 Github로 관리를 하고 있었지만 평가시에도 반영이 되니 무시할 수는 없는 노릇이었다. 그렇다고 Github에도 올리고 Gitlab에도 올리는 방식은 할 일이 두배로 느는 방식이었기에 당연하게도 자동화를 하기로 하였고 우리가 현재 사용하고 있는 CI툴인 Github Actions을 이용하기로 결정했다.
전체적인 플로우는 아래와 같으며 로직은 정말 간단하다.
- push 이벤트 발생 -> Github Action Trigger
- job에서 해당 깃 레포를 checkout
- Gitlab SSH를 이용해서 원격으로 지정한 레포로 그대로 push 해준다.
먼저 Gitlab에서 내 계정을 SSH로 원격 수정할 수 있도록 key pair를 만들어 줘야한다.
터미널(또는 git bash)을 열고 아래명령어를 이용해 ssh key를 만든다. (처음에 keypair를 만들 경로를 설정하라고 하는데 그냥 Enter치면 기본 경로에 설정된다 ~/.ssh/이름, 나머지는 전부 Enter)
ssh-keygen -t rsa -b 2048 -C "별명 원하는 걸로"
만들어진 key는 설정된 경로에 키이름.pub
파일과 키이름
파일 이렇게 두 개가 생성된다. 키이름.pub
파일은 공개키이고 키이름
개인키로 각각 Gitlab, Github에서 사용될 예정이다.
먼저 방금 생성한 키이름.pub
파일을 열어 내용을 모두 복사해준다.
해당 내용을 Gitlab 내 계정에 SSH Key로 등록할 예정이다.
Gitlab 내 계정정보로 들어가 SSH Keys
메뉴를 선택해준다
위의 Key 부분에 복사한 내용을 붙여넣고 Title 작성후 Add Key 버튼을 누르면 완료!
이후에 Github Actions의 Runner에서 실행이 될때 아래와 같은 에러가 날 수 있다.
[remote rejected] master -> master (pre-receive hook declined)
이는 Gitlab Repository의 Protected branches가 설정되어 있기 때문에 그런데 이를 해제해 줘야한다.
위와 같이 gitlab Repository의 Settings - Repository에 Protected branches에서 아래의 Unprotect 버튼을 눌러 보호조치를 풀어버리자! push권한을 설정해 준다는 것인데 필요없으므로 Unprotect!
이제 Github에 개인키를 등록해 workflow내에서 이 key를 이용해 gitlab에 원격으로 접속할 수 있도록 해보자
Github의 해당 Repo로 들어가 Settings를 클릭한 후 좌측메뉴바에서 Security - Secrets - Actions를 클릭한다.
클릭했으면 상단에 New Repository token 버튼을 클릭한다.
내부에서 Name(원하는대로)과 Value(방금 만든 키이름
파일의 내용을 복붙)을 작성 후 완료!
💡여기서 조심할 부분은
키이름
의 내용을 전부 복사해야한다
-----BEGIN OPENSSH PRIVATE KEY----- 이렇게 적혀있는 부분도 놓쳐선 안된다!
작성을 완료하면 아래와 같이 등록된 것을 확인할 수 있다. 필자는 GITLAB_SSH_KEY
라는 Name으로 저장하였다.
마지막으로 workflow를 작성해보자 이 Workflow에서 2가지의 action을 사용한다.
💡 action이란?
'명령어들의 집합으로 이루어진 작업'으로 내가 직접 만들 수도 혹은 Github에서 제공하는 Marketplace에서 다른 사람이 만들어놓은 것을 가져와서 사용할 수 있다.(라이브러리처럼)
우리의 job은 클라우드 가상환경의 runner에서 실행된다.
그곳에는 아직 우리의 repository가 없기에 git init, fetch하고 checkout하고 등 여러 작업들을 거쳐야한다. 그러나, actions에서 제공하는 'actions/checkout@v3'라는 action이 있으므로 이를 가져와서 쓴다!
이제 runner상에서 코드를 받았으니 gitlab에 mirroring 하는 action을 취하면 된다. 그러나 이것또한 누군가 잘 만들어주신 action이 있기에 가져다가 쓰면된다!😁
아래의 action으로 gitlab뿐만 Bitbucket 등 여러 깃 저장소로의 미러링을 지원한다.
pixta-dev/repository-mirroring-action@v1
name: sync to gitlab
on: [push, delete]
jobs:
to_gitlab:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2 # checkout
with:
fetch-depth: 0
- uses: pixta-dev/repository-mirroring-action@v1 # mirroring
with:
target_repo_url:
# gitlab repo url ex) git@git.~~~~
ssh_private_key:
${{ secrets.GITLAB_SSH_KEY }} # github에 등록한 key name