Bitbucket Cloud 저장소에서 GitLab CI/CD 사용하기
Bitbucket Cloud 저장소에서 GitLab CI/CD 사용하기
Bitbucket Cloud에 있는 저장소를 GitLab에 연결하고, 그 저장소에서 GitLab CI/CD를 실행할 수 있어요. 저장소를 GitLab으로 미러링하고 파이프라인을 돌린 뒤, 그 결과를 다시 Bitbucket으로 알려주는 흐름을 구성하는 방법을 차근차근 살펴볼게요.
출처: 문서
본문
- Tier: Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
GitLab CI/CD는 다음 두 가지로 Bitbucket Cloud와 함께 사용할 수 있어요.
- CI/CD 프로젝트를 만들어요.
- Git 저장소를 URL로 연결해요.
Bitbucket Cloud 저장소에서 GitLab CI/CD를 사용하는 방법은 이래요.
- Bitbucket에서 앱 비밀번호(App password)를 만들어서 Bitbucket에 커밋 빌드 상태를 설정하는 스크립트를 인증해요. 저장소 쓰기 권한이 필요해요.
- Bitbucket에서 저장소의 Clone을 선택한 다음,
git clone뒤에 시작하는 URL을 복사해요. - GitLab에서 프로젝트를 만들어요. 오른쪽 상단에서 Create new(플러스)를 선택하고 New project/repository를 선택해요. Run CI/CD for external repository를 선택해요. Repository by URL을 선택해요. 필드를 채워요. Git repository URL에는 Bitbucket 저장소의 URL을 입력하고,
@username은 반드시 제거해요. Username에는 앱 비밀번호와 연결된 사용자 이름을 입력해요. Password에는 Bitbucket의 앱 비밀번호를 입력해요. GitLab이 저장소를 가져오고 Pull Mirroring을 활성화해요. 프로젝트의 Settings > Repository > Mirroring repositories에서 미러링이 동작하는지 확인할 수 있어요. - GitLab에서
api범위의 개인 액세스 토큰을 생성해요. 이 토큰은 Bitbucket에 만들어 두는 웹훅이 새 커밋을 GitLab에 알릴 때 요청을 인증하는 데 사용돼요. - Bitbucket의 Settings > Webhooks에서 새 커밋을 GitLab에 알려줄 새 웹훅을 만들어요.
- 웹훅 URL을 GitLab pull mirroring 엔드포인트로 설정하고, 방금 생성한 개인 액세스 토큰으로 인증해요. 웹훅 트리거는 Repository Push로 설정해야 해요. 저장한 뒤 Bitbucket 저장소에 변경을 푸시해서 웹훅을 테스트해요.
https://gitlab.example.com/api/v4/projects/:project_id/mirror/pull?private_token=<your_personal_access_token>
- GitLab의 Settings > CI/CD > Variables에서 Bitbucket API를 통해 Bitbucket과 통신할 수 있게 다음 변수를 추가해요.
BITBUCKET_ACCESS_TOKEN: 앞서 생성한 Bitbucket 앱 비밀번호예요. 이 변수는 마스킹해야 해요.BITBUCKET_USERNAME: Bitbucket 계정의 사용자 이름이에요.BITBUCKET_NAMESPACE: GitLab과 Bitbucket의 네임스페이스가 다르면 설정해요.BITBUCKET_REPOSITORY: GitLab과 Bitbucket의 프로젝트 이름이 다르면 설정해요. - Bitbucket에서 파이프라인 상태를 Bitbucket으로 푸시하는 스크립트를 추가해요. 스크립트는 Bitbucket에서 만들지만, 미러링 과정이 GitLab 미러에 복사해요. GitLab CI/CD 파이프라인이 스크립트를 실행하고 상태를 Bitbucket으로 다시 푸시해요.
build_status파일을 만들고 아래 스크립트를 넣은 뒤, 터미널에서chmod +x build_status를 실행해서 실행 가능하게 만들어요.
#!/usr/bin/env bash
# Push GitLab CI/CD build status to Bitbucket Cloud
if [ -z "$BITBUCKET_ACCESS_TOKEN" ]; then
echo "ERROR: BITBUCKET_ACCESS_TOKEN is not set"
exit 1
fi
if [ -z "$BITBUCKET_USERNAME" ]; then
echo "ERROR: BITBUCKET_USERNAME is not set"
exit 1
fi
if [ -z "$BITBUCKET_NAMESPACE" ]; then
echo "Setting BITBUCKET_NAMESPACE to $CI_PROJECT_NAMESPACE"
BITBUCKET_NAMESPACE=$CI_PROJECT_NAMESPACE
fi
if [ -z "$BITBUCKET_REPOSITORY" ]; then
echo "Setting BITBUCKET_REPOSITORY to $CI_PROJECT_NAME"
BITBUCKET_REPOSITORY=$CI_PROJECT_NAME
fi
BITBUCKET_API_ROOT="https://api.bitbucket.org/2.0"
BITBUCKET_STATUS_API="$BITBUCKET_API_ROOT/repositories/$BITBUCKET_NAMESPACE/$BITBUCKET_REPOSITORY/commit/$CI_COMMIT_SHA/statuses/build"
BITBUCKET_KEY="ci/gitlab-ci/$CI_JOB_NAME"
case "$BUILD_STATUS" in
running)
BITBUCKET_STATE="INPROGRESS"
BITBUCKET_DESCRIPTION="The build is running!"
;;
passed)
BITBUCKET_STATE="SUCCESSFUL"
BITBUCKET_DESCRIPTION="The build passed!"
;;
failed)
BITBUCKET_STATE="FAILED"
BITBUCKET_DESCRIPTION="The build failed."
;;
esac
echo "Pushing status to $BITBUCKET_STATUS_API..."
curl --request POST "$BITBUCKET_STATUS_API" \
--user $BITBUCKET_USERNAME:$BITBUCKET_ACCESS_TOKEN \
--header "Content-Type:application/json" \
--silent \
--data "{ \"state\": \"$BITBUCKET_STATE\", \"key\": \"$BITBUCKET_KEY\", \"description\":
\"$BITBUCKET_DESCRIPTION\",\"url\": \"$CI_PROJECT_URL/-/jobs/$CI_JOB_ID\" }"
- Bitbucket에
.gitlab-ci.yml파일을 만들어서 스크립트가 파이프라인의 성공과 실패를 Bitbucket으로 푸시하도록 해요. 앞서 추가한 스크립트처럼 이 파일도 미러링 과정의 일부로 GitLab 저장소에 복사돼요.
stages:
- test
- ci_status
unit-tests:
script:
- echo "Success. Add your tests!"
success:
stage: ci_status
before_script:
- ""
after_script:
- ""
script:
- BUILD_STATUS=passed BUILD_KEY=push ./build_status
when: on_success
failure:
stage: ci_status
before_script:
- ""
after_script:
- ""
script:
- BUILD_STATUS=failed BUILD_KEY=push ./build_status
when: on_failure
이제 GitLab은 Bitbucket의 변경을 미러링하고, .gitlab-ci.yml에 설정된 CI/CD 파이프라인을 실행하며, 그 상태를 Bitbucket으로 푸시하도록 설정됐어요.
더 알아보기
외부 저장소 연동의 전체 개념이 궁금하다면 외부 저장소용 CI/CD 문서를 먼저 보는 게 좋아요. GitHub 저장소를 연결하는 방법도 함께 살펴보면 어떤 호스팅을 쓰든 같은 방식으로 GitLab CI/CD를 적용할 수 있어요.