GitHub에서 GitLab으로 미러링하기
GitHub → GitLab 미러링은 GitHub Actions
를 쓰면 쉽게 가능합니다.
1. 먼저 필요한 비밀 환경변수(SECRET)를 추가해 줍니다.
제가 쓸 명령어에서 필요로 하는 데이터는 3개입니다.
- 동기화될 GitLab
저장소 주소
(ssh주소가 아닌 HTTP주소) - PUSH 권한을 가진 GitLab
유저명
- PUSH 권한을 가진 GitLab 계정의
토큰(TOKEN)
위의 정보를 각각 클론 할 GitHub repository의 Actions secrets으로 저장했습니다.
Secret명은 각각 TARGET_URL
, TARGET_USERNAME
, TARGET_TOKEN
로 했습니다.
토큰은 외부에 유출되지 않도록 조심하세요!
여기서 말하는 토큰(Token)이란?
토큰은 발급할 때 특정한 권한을 주고 비밀번호 대신 사용해서 부여한 권한에 한해서 사용할 수 있습니다.
GitLab 토큰 생성법
GitLab 계정의 Token은 다음과 같이 발급하면 됩니다.
GitLab 토큰은 GitLab 사이트에 로그인한 후 Preference > Access Token에서 생성할 수 있습니다.
토큰 이름과 만료기간을 적고 용도에 따라 필요한 권한을 넣어줍니다.
저는 repository에 push 할 용도로만 사용할 것이라서 write_repository 권한만 줬습니다.
2. 아래 Actions를 넣고 Commit 합니다.
GitHub 저장소의 main
branch에 Push하거나 PR을 보낼 때마다 GitLab 저장소 Force Push 하는 Action입니다.
아래 workflow 코드를 "원하는파일명.yml"로 설정하신 뒤 GitHub 저장소의 .github/workflows/ 아래에 넣으면 됩니다.
# This is a workflow that syncs everthing on this repository to another repository
name: Sync this repository to another repository
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
push-to-gitlab:
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Fetch all history for all tags and branches
- name: Set remote repository
env: # Retrieve env variable from GiGHub secrets
gitlab_url: ${{ secrets.TARGET_URL }}
gitlab_username: ${{ secrets.TARGET_USERNAME }}
gitlab_token: ${{ secrets.TARGET_TOKEN }}
run: | # 토큰을 조합해서 저렇게 URL을 만들면 비번없이 push가 됩니다.
git remote add gitlab https://${gitlab_username}:${gitlab_token}@${gitlab_url#https://};
- name: Force push everthing
run: | # 모든 브랜치와 태그에 대하여 push합니다. gitlab에서 보호설정이 걸려있으면 Fail할 수 있습니다.
git push -f --all gitlab;
git push -f --tags gitlab;
이 액션을 실행하면 현재 GitHub Repository를 우분투상에서 clone하고 secrets에 넣어준 GitLab정보들로 인증해서 Target 저장소에 Force Push합니다.
영어, 한국어로 이것저것 주석을 달았습니다. 궁금하신 분들은 읽어보세요!
* 만약 main
브랜치뿐만이 아니라 모든 브랜치에 해당 job을 실행하고 싶으면 "main"을 "**"로 바꿔주면 됩니다.
(Default값이 "**"이므로 위 코드의 branches: ["main"] 부분을 삭제해줘도 됩니다.)
* 다른 저장소를 나타내는 부분에 GitLab이라는 변수명을 사용했지만 그냥 git 명령어로 원격 저장소 주소 저장하고 거기로 push하는 일반적인 명령어라 GitLab말고도 다 가능할 겁니다!
성공하는 경우
Fail하는 경우
GitLab상에서 그 브랜치가 protected
로 설정된 경우 Fail 할 수도 있습니다.
기본적으로 GitLab에서 Force 푸시로 인해 소스코드가 손실되는 것을 막아줍니다. 하지만 우린 직접 작업하고 사용하는 메인은 깃헙에 두고 깃랩에는 단순히 복제하게 하려는 경우이므로 옵션을 꺼줘도 상관없습니다.
프로젝트 저장소의 Settings > Repository에 가서 브랜치가 protected
로 설정되어 있는지 확인합니다. protected되어 있다면 그 브랜치를 unprotected로 만들어주세요..
Reference
그냥 여기에 있는 액션 가져다 써도 됩니닷 ㅎㅎ
댓글
이 글 공유하기
다른 글
-
Fork한 저장소에 upstream의 최신 commit 가져오기 :: GitHub Compare / Bitbucket / add remote
Fork한 저장소에 upstream의 최신 commit 가져오기 :: GitHub Compare / Bitbucket / add remote
2020.04.09 -
Git의 파일 상태 구분법
Git의 파일 상태 구분법
2020.04.09 -
Git Internals 정리 :: Git은 어떻게 동작할까?
Git Internals 정리 :: Git은 어떻게 동작할까?
2020.03.16 -
.gitignore가 동작 안할 때 상황별로 해결하기
.gitignore가 동작 안할 때 상황별로 해결하기
2020.02.29