Github Action을 이용한 Github -> Gitlab Mirroring

로건·2022년 8월 21일
1

CI/CD

목록 보기
2/2
post-thumbnail

소프트웨어 마에스트로 과정을 진행하면서 코드 관리를 Gitlab으로 하라고 했다. 우리팀은 Github로 관리를 하고 있었지만 평가시에도 반영이 되니 무시할 수는 없는 노릇이었다. 그렇다고 Github에도 올리고 Gitlab에도 올리는 방식은 할 일이 두배로 느는 방식이었기에 당연하게도 자동화를 하기로 하였고 우리가 현재 사용하고 있는 CI툴인 Github Actions을 이용하기로 결정했다.

전체적인 플로우는 아래와 같으며 로직은 정말 간단하다.

  • push 이벤트 발생 -> Github Action Trigger
  • job에서 해당 깃 레포를 checkout
  • Gitlab SSH를 이용해서 원격으로 지정한 레포로 그대로 push 해준다.



Gitlab SSH 연결

먼저 Gitlab에서 내 계정을 SSH로 원격 수정할 수 있도록 key pair를 만들어 줘야한다.
터미널(또는 git bash)을 열고 아래명령어를 이용해 ssh key를 만든다. (처음에 keypair를 만들 경로를 설정하라고 하는데 그냥 Enter치면 기본 경로에 설정된다 ~/.ssh/이름, 나머지는 전부 Enter)

ssh-keygen -t rsa -b 2048 -C "별명 원하는 걸로"

만들어진 key는 설정된 경로에 키이름.pub 파일과 키이름 파일 이렇게 두 개가 생성된다. 키이름.pub파일은 공개키이고 키이름 개인키로 각각 Gitlab, Github에서 사용될 예정이다.


Gitlab SSH 공개키 등록

먼저 방금 생성한 키이름.pub파일을 열어 내용을 모두 복사해준다.
해당 내용을 Gitlab 내 계정에 SSH Key로 등록할 예정이다.
Gitlab 내 계정정보로 들어가 SSH Keys 메뉴를 선택해준다

위의 Key 부분에 복사한 내용을 붙여넣고 Title 작성후 Add Key 버튼을 누르면 완료!



Gitlab Repository 권한 설정

이후에 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 SSH 개인키 등록

이제 Github에 개인키를 등록해 workflow내에서 이 key를 이용해 gitlab에 원격으로 접속할 수 있도록 해보자
Github의 해당 Repo로 들어가 Settings를 클릭한 후 좌측메뉴바에서 Security - Secrets - Actions를 클릭한다.

클릭했으면 상단에 New Repository token 버튼을 클릭한다.
내부에서 Name(원하는대로)과 Value(방금 만든 키이름 파일의 내용을 복붙)을 작성 후 완료!

💡여기서 조심할 부분은 키이름의 내용을 전부 복사해야한다
-----BEGIN OPENSSH PRIVATE KEY----- 이렇게 적혀있는 부분도 놓쳐선 안된다!

작성을 완료하면 아래와 같이 등록된 것을 확인할 수 있다. 필자는 GITLAB_SSH_KEY라는 Name으로 저장하였다.



Github Action Workflow 작성

마지막으로 workflow를 작성해보자 이 Workflow에서 2가지의 action을 사용한다.

💡 action이란?
'명령어들의 집합으로 이루어진 작업'으로 내가 직접 만들 수도 혹은 Github에서 제공하는 Marketplace에서 다른 사람이 만들어놓은 것을 가져와서 사용할 수 있다.(라이브러리처럼)


checkout action

우리의 job은 클라우드 가상환경의 runner에서 실행된다.
그곳에는 아직 우리의 repository가 없기에 git init, fetch하고 checkout하고 등 여러 작업들을 거쳐야한다. 그러나, actions에서 제공하는 'actions/checkout@v3'라는 action이 있으므로 이를 가져와서 쓴다!


mirroring action

이제 runner상에서 코드를 받았으니 gitlab에 mirroring 하는 action을 취하면 된다. 그러나 이것또한 누군가 잘 만들어주신 action이 있기에 가져다가 쓰면된다!😁

아래의 action으로 gitlab뿐만 Bitbucket 등 여러 깃 저장소로의 미러링을 지원한다.
pixta-dev/repository-mirroring-action@v1


workflow

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
profile
Life Designer

0개의 댓글