circleci API를 사용하여 별도의 저장소 빌드 실행

7230 단어 CircleCI

목적


  • job에서 다른 저장소를 빌드하고 싶습니다
  • 실행 한 다른 리포지토리의 빌드가 완료 될 때까지 기다리고 성공/실패를 판정하고 다음 단계로 진행할지 여부를 제어하고 싶습니다.

    어떤 때?


  • e2e 테스트 전용 리포지토리와 일부 마이크로 서비스로 구성된 애플리케이션 코드 용 리포지토리가 있습니다.

    환경설정


  • A 작업을 실행하는 측의 저장소
  • B를 작업이 실행되는 측의 리포지토리로 설정합니다.

    API Permissions에서 토큰 만들기


  • 대시보드에서 B 리포지토리 설정 API Permissions -> Create Token 버튼에서 토큰을 지불


  • 지불 한 토큰을 A 리포지토리의 환경 변수에 등록합니다.


  • 대시보드에서 A 리포지토리 설정 Environment Variables
  • 이번은 예로서 Add Variable 로 했습니다

  • 이렇게 하면 토큰을 B_REPO_TOKEN 에 하드코딩하지 않고 완료됩니다.


  • job 설정


  • .circleci/config.yml 리포지토리의 A를 작성합니다.

    .circleci/config.yml
    steps:
      - checkout
      - run:
          name: install jq
          command: |
            # APIのレスポンスを解析するためにjqがあったほうがいいです
            apk add --no-cache --update jq 
      - run:
          command: |
            base_path='https://circleci.com/api/v1.1/project/<ここに:vcs-type>/<ここは:username>/<ここに:project>'
            target_branch='ここにBリポジトリのビルド対象になるブランチ名(大体はmasterが一般的でしょう)'
            # Bリポジトリのビルドを実行
            build_num=$(wget --header='Accept: application/json' --post-data='' \
              "${base_path}/tree/${target_branch}?circle-token=${B_REPO_TOKEN}" -O - 2>/dev/null | jq -r -e '.build_num')
    
                    # 特定のjobのみを実行したい場合は build_parameters[CIRCLE_JOB] を指定します
            # build_num=$(wget --header='Accept: application/json' --post-data='build_parameters[CIRCLE_JOB]=実行したいjob名' \
            #  "${base_path}/tree/${target_branch}?circle-token=${B_REPO_TOKEN}" -O - 2>/dev/null | jq -r -e '.build_num')
    
            if [ "$build_num" = "" ]; then
              exit 1
            fi
    
            # ビルド実行APIはリクエストするとすぐレスポンスが返ってくる非同期なものなのでビルドの状況をポーリングして完了するまで待機
            # ループの数はお好みで
            for i in `seq 1 10`; do
              echo "[Try ${i}] Waiting for build: ${base_path}/${build_num}"
    
              response=$(wget --header='Accept: application/json' "${base_path}/${build_num}?circle-token=${B_REPO_TOKEN}" -O - 2>/dev/null)
              if [ "`echo "$response" | jq -r -e '.lifecycle'`" = "finished" ]; then
                if [ "`echo "$response" | jq -r -e '.status'`" = "success" ]; then
                  # ビルドが正常完了したので次のstepに進ませます
                  exit 0
                fi
    
                break
              fi
    
              if [ $i -eq 1 ]; then
                # ある程度ビルドに時間がかかるようであれば1回目の待機は長い秒数にしておくとAPIの問い合わせ回数が減らせてよいでしょう
                sleep 120
              else
                sleep 15
              fi
            done
    
            # 終了ステータスを1以外にすることで次のstepに進ませないようにします
            exit 1
      - run:
          name: after B repo build
          command: |
            echo 'Bリポジトリのビルドが正常に完了したのでそのあとに何かやりたい処理...'
    

    요약



    빌드의 실행으로부터 대기까지를 다른 쉘 파일에 잘라 공통화해 두면 보수성이 높아진다고 생각합니다.

    API 경유로 빌드 실행을 유연하게 조작할 수 있으면 여러가지 시츄에이션으로 활용할 수 있을 것 같네요.
  • 좋은 웹페이지 즐겨찾기