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와 함께 사용할 수 있어요.

  1. CI/CD 프로젝트를 만들어요.
  2. Git 저장소를 URL로 연결해요.

Bitbucket Cloud 저장소에서 GitLab CI/CD를 사용하는 방법은 이래요.

  1. Bitbucket에서 앱 비밀번호(App password)를 만들어서 Bitbucket에 커밋 빌드 상태를 설정하는 스크립트를 인증해요. 저장소 쓰기 권한이 필요해요.
  2. Bitbucket에서 저장소의 Clone을 선택한 다음, git clone 뒤에 시작하는 URL을 복사해요.
  3. 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에서 미러링이 동작하는지 확인할 수 있어요.
  4. GitLab에서 api 범위의 개인 액세스 토큰을 생성해요. 이 토큰은 Bitbucket에 만들어 두는 웹훅이 새 커밋을 GitLab에 알릴 때 요청을 인증하는 데 사용돼요.
  5. Bitbucket의 Settings > Webhooks에서 새 커밋을 GitLab에 알려줄 새 웹훅을 만들어요.
  6. 웹훅 URL을 GitLab pull mirroring 엔드포인트로 설정하고, 방금 생성한 개인 액세스 토큰으로 인증해요. 웹훅 트리거는 Repository Push로 설정해야 해요. 저장한 뒤 Bitbucket 저장소에 변경을 푸시해서 웹훅을 테스트해요.
https://gitlab.example.com/api/v4/projects/:project_id/mirror/pull?private_token=<your_personal_access_token>
  1. GitLab의 Settings > CI/CD > Variables에서 Bitbucket API를 통해 Bitbucket과 통신할 수 있게 다음 변수를 추가해요. BITBUCKET_ACCESS_TOKEN: 앞서 생성한 Bitbucket 앱 비밀번호예요. 이 변수는 마스킹해야 해요. BITBUCKET_USERNAME: Bitbucket 계정의 사용자 이름이에요. BITBUCKET_NAMESPACE: GitLab과 Bitbucket의 네임스페이스가 다르면 설정해요. BITBUCKET_REPOSITORY: GitLab과 Bitbucket의 프로젝트 이름이 다르면 설정해요.
  2. 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\" }"
  1. 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를 적용할 수 있어요.