방법: CircleCI 파이프라인에서 순차 워크플로 만들기

4297 단어

머리말



CircleCI에서 pipeline , workflows은 서로 독립적으로 실행됩니다. 따라서 워크플로 A 다음에 워크플로 B가 실행되도록 하는 기본 제공 기능이 없습니다.

그러나 약간의 속임수를 통해 여전히 주문을 수행할 수 있습니다.

어떻게



순서를 지정하려면 작업 흐름 B의 첫 번째 작업으로 an approval job을 설정하기만 하면 됩니다.

# contrived snippet of a .circleci/config.yaml

workflows:
  aaa:
    jobs:
      - one
      - two
  bbb:
    jobs:
      - start:
          type: approval
      - next:
          requires:
            - start



워크플로 B의 후속 작업은 승인 작업이 승인된 경우에만 실행됩니다. 따라서 대기를 "강제"할 수 있으며 워크플로 A가 완료될 때만 이 작업을 승인할 수 있습니다.

물론 여기에는 수동 개입이 필요합니다.

그러나 이 접근 방식의 이점은 팀에서 워크플로 A의 결과를 확인하는 데 시간을 할애할 수 있다는 것입니다. 예를 들어 워크플로 A는 일부 인프라 변경 사항(예: terraform apply )을 배포했으며 워크플로를 실행하기 전에 이러한 변경 사항을 검사하는 것을 선호합니다. 비.

한 걸음 더 나아가



워크플로 A의 끝에서 the Approve a job API을 통해 이 승인을 자동화할 수 있습니다.

특히 다음을 수행하는 작업을 생성해야 합니다.

  • Find workflow B's ID from the current pipeline .

  • Find the approval job's ID from the invoked workflow B .

  • Approve the job .

  • jobs:
      ...
      approve-workflow:
        parameters:
          workflow-name:
            type: string
            description: workflow name
          job-name:
            type: string
            description: name of approval job in workflow
        docker:
          - image: cimg/base:current
        steps:
          - run:
              name: Find Workflow ID for << parameters.workflow-name >>
              command: |
                curl -H "Circle-Token: $CIRCLE_TOKEN" https://circleci.com/api/v2/pipeline/<< pipeline.id >>/workflow > workflows.json
                WORKFLOW_ID=$(jq -r '.items | map(select(.name == "<< parameters.workflow-name >>")) | .[0].id' workflows.json)
                echo "export WORKFLOW_ID='${WORKFLOW_ID}'" >> $BASH_ENV
          - run:
              name: Find Job ID for << parameters.job-name >>
              command: |
                curl -H "Circle-Token: $CIRCLE_TOKEN" "https://circleci.com/api/v2/workflow/${WORKFLOW_ID}/job" > jobs.json
                APPROVAL_JOB_ID=$(jq -r '.items | map(select(.name == "<< parameters.job-name >>" and .type == "approval")) | .[0].id' jobs.json)
                echo "export APPROVAL_JOB_ID='${APPROVAL_JOB_ID}'" >> $BASH_ENV
          - run:
              name: Approve job
              command: |
                curl -X POST -H "Circle-Token: $CIRCLE_TOKEN" "https://circleci.com/api/v2/workflow/${WORKFLOW_ID}/approve/${APPROVAL_JOB_ID}" | jq .
    
    


    나눔의 정신으로 여러분의 편의를 위해 위의 작업을 코드화한 CircleCI Orb를 만들었습니다.

    https://circleci.com/developer/orbs/orb/kelvintaywl/control-flow

    이 기사와 Orb가 유용하기를 바랍니다. 계속 구축하세요, 여러분!

    #circleci #cicd #workflow

    buy Kelvin a cup of coffee

    좋은 웹페이지 즐겨찾기