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

Tier: Premium, Ultimate 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에서 커밋 빌드 상태를 설정하는 스크립트를 인증합니다. 저장소 쓰기 권한이 필요합니다.

    Bitbucket Cloud webhook

  2. Bitbucket에서 저장소에서 Clone를 선택한 다음 git clone 이후에 시작하는 URL을 복사합니다.

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

    1. 왼쪽 사이드바에서 상단의 Create new ( ) 및 New project/repository를 선택합니다.
    2. 외부 저장소에 대해 CI/CD 실행을 선택합니다.
    3. URL로 저장소를 선택합니다.
    4. 필드를 완료합니다:
      • Git 저장소 URL에 Bitbucket 저장소의 URL을 입력합니다. @username을 제거해야 합니다.
      • 사용자 이름에 앱 비밀번호와 연결된 사용자 이름을 입력합니다.
      • 비밀번호에 Bitbucket의 앱 비밀번호를 입력합니다.

    GitLab은 저장소를 가져오고 Pull Mirroring을 활성화합니다.
    Settings > Repository > Mirroring repositories에서 미러링이 작동하는지 확인할 수 있습니다.

  4. GitLab에서
    개인 접근 토큰
    api 범위로 생성합니다. 이 토큰은 Bitbucket에서 GitLab에 새 커밋을 알리기 위해 생성된 웹 후크의 요청을 인증하는 데 사용됩니다.

  5. Bitbucket에서 Settings > Webhooks에서 GitLab에 새 커밋을 알리기 위한 새로운 웹 후크를 생성합니다.

    웹 후크 URL은 개인 접근 토큰을 인증에 사용하여 풀 미러링을 트리거하는 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에서 Settings > CI/CD > Variables에서 Bitbucket API를 통해 Bitbucket과의 통신을 허용하는 변수를 추가합니다:

    • BITBUCKET_ACCESS_TOKEN: 위에서 생성한 Bitbucket 앱 비밀번호. 이 변수는 mask되어야 합니다.
    • 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
    
    # Bitbucket Cloud에 GitLab CI/CD 빌드 상태 푸시하기
    
    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="INPROGRESS"
       BITBUCKET_DESCRIPTION="빌드가 실행 중입니다!"
       ;;
    passed)
       BITBUCKET_STATE="SUCCESSFUL"
       BITBUCKET_DESCRIPTION="빌드가 성공적으로 실행되었습니다!"
       ;;
    failed)
       BITBUCKET_STATE="FAILED"
       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에서 파이프라인 성공 및 실패를 Bitbucket에 푸시하는 데 사용할 스크립트를 포함하는 .gitlab-ci.yml 파일을 생성합니다.
    위에 추가된 스크립트와 유사하게 이 파일은 미러링 프로세스의 일부로 GitLab 저장소에 복사됩니다.

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