Bitbucket Cloud 저장소에서 GitLab CI/CD 사용하기

Tier: 프리미엄, 얼티밋 Offering: GitLab.com, Self-managed, GitLab Dedicated

GitLab CI/CD를 Bitbucket Cloud와 함께 사용하려면 다음을 수행합니다:

  1. CI/CD 프로젝트를 생성합니다.
  2. URL을 통해 Git 저장소를 연결합니다.

Bitbucket Cloud 저장소에서 GitLab CI/CD를 사용하려면 다음을 수행합니다:

  1. Bitbucket에서 스크립트를 설정하는 앱 비밀번호를 생성하여 커밋 빌드 상태를 설정하는 스크립트를 확인합니다. 저장소 쓰기 권한이 필요합니다.

    Bitbucket Cloud webhook

  2. Bitbucket에서 저장소에서 Clone을 선택한 후 git clone 이후의 URL을 복사합니다.

  3. GitLab에서 프로젝트를 생성합니다:

    • 왼쪽 사이드바에서 상단에 새로 만들기 () 및 새 프로젝트/저장소를 선택합니다.
    • 외부 저장소용 CI/CD 실행을 선택합니다.
    • URL로 저장소 선택을 선택합니다.
    • 필드를 작성합니다:
      • Git 저장소 URL에 Bitbucket 저장소의 URL을 입력합니다. @사용자이름을 제거했는지 확인합니다.
      • 사용자 이름에 앱 비밀번호와 연결된 사용자 이름을 입력합니다.
      • 비밀번호에 Bitbucket의 앱 비밀번호를 입력합니다.

    GitLab은 저장소를 가져와 Pull Mirroring을 활성화합니다. 프로젝트의 설정 > 저장소 > 저장소 미러링에서 미러링이 작동하는지 확인할 수 있습니다.

  4. GitLab에서 개인 액세스 토큰을 생성합니다. 이 토큰은 Bitbucket에서 생성된 웹 후크에서 GitLab에 새로운 커밋을 알리는 데 사용됩니다.

  5. Bitbucket에서 설정 > 웹후크에서 GitLab에 새 커밋을 알리는 새 웹후크를 생성합니다.

    웹훅 URL은 인증을 위해 방금 생성한 개인 액세스 토큰을 사용하여 Pull Mirroring을 트리거하는 GitLab API로 설정되어야 합니다.

    https://gitlab.example.com/api/v4/projects/:project_id/mirror/pull?private_token=<your_personal_access_token>
    

    웹훅 트리거는 저장소 푸시로 설정되어야 합니다.

    Bitbucket Cloud webhook

    저장한 후, Bitbucket 저장소에 변경 사항을 푸시하여 웹훅을 테스트합니다.

  6. GitLab에서 설정 > CI/CD > 변수에서 다음과 같은 변수를 추가하여 Bitbucket과 통신할 수 있도록 합니다:

    • BITBUCKET_ACCESS_TOKEN: 위에서 생성한 Bitbucket 앱 비밀번호. 이 변수는 마스킹되어야 합니다.
    • BITBUCKET_USERNAME: Bitbucket 계정의 사용자 이름입니다.
    • BITBUCKET_NAMESPACE: GitLab 및 Bitbucket 네임스페이스가 다른 경우 이 변수를 설정합니다.
    • BITBUCKET_REPOSITORY: GitLab 및 Bitbucket 프로젝트 이름이 다른 경우 이 변수를 설정합니다.
  7. Bitbucket에서 Bitbucket에 파이프라인 상태를 푸시하는 스크립트를 추가합니다. 이 스크립트는 Bitbucket에서 생성되지만 미러링 프로세스에 의해 GitLab 미러로 복사됩니다. GitLab CI/CD 파이프라인은 스크립트를 실행하고 상태를 다시 Bitbucket에 푸시합니다.

    build_status 파일을 생성하고 아래 스크립트를 삽입한 후 터미널에서 chmod +x build_status를 실행하여 스크립트를 실행 가능하게 만듭니다.

    #!/usr/bin/env bash
    
    # GitLab CI/CD 빌드 상태를 Bitbucket Cloud에 푸시합니다.
    
    if [ -z "$BITBUCKET_ACCESS_TOKEN" ]; then
       echo "ERROR: BITBUCKET_ACCESS_TOKEN이 설정되지 않았습니다"
    exit 1
    fi
    if [ -z "$BITBUCKET_USERNAME" ]; then
        echo "ERROR: BITBUCKET_USERNAME이 설정되지 않았습니다"
    exit 1
    fi
    if [ -z "$BITBUCKET_NAMESPACE" ]; then
        echo "BITBUCKET_NAMESPACE를 $CI_PROJECT_NAMESPACE(으)로 설정하는 중"
        BITBUCKET_NAMESPACE=$CI_PROJECT_NAMESPACE
    fi
    if [ -z "$BITBUCKET_REPOSITORY" ]; then
        echo "BITBUCKET_REPOSITORY를 $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="진행 중"
       BITBUCKET_DESCRIPTION="빌드가 진행 중입니다!"
       ;;
    passed)
       BITBUCKET_STATE="성공"
       BITBUCKET_DESCRIPTION="빌드가 성공했습니다!"
       ;;
    failed)
       BITBUCKET_STATE="실패"
       BITBUCKET_DESCRIPTION="빌드에 실패했습니다."
       ;;
    esac
    
    echo "$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\" }"
    
  8. Bitbucket에서 .gitlab-ci.yml 파일을 생성하여 파이프라인 성공 및 실패를 Bitbucket에 푸시하도록 스크립트를 사용합니다. 위에서 추가한 스크립트와 유사하게, 이 파일은 미러링 프로세스의 일환으로 GitLab 저장소로 복사됩니다.

    stages:
      - test
      - ci_status
    
    unit-tests:
      script:
        - "성공. 여기에 테스트를 추가하세요!"
    
    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에 푸시하도록 구성되어 있습니다.