circleback 모드를 사용하는 고급 파이프 배열
This tutorial covers:
- Orchestrating triggers for a dependent pipeline
- Intro to the circleback pattern
- Creating the config for a circleback pipeline
여러 팀이 많은 프로젝트에서 일하기 때문에, 당신의 소프트웨어에 하나의 파이프라인만 제공하는 것만으로는 부족합니다.테스트와 발표에 앞서 이 항목들은 구축과 통합이 필요하다.그렇다면 개발팀은 이런 상황을 어떻게 처리할까?많은 팀들이 소프트웨어를 더욱 작은 부분으로 분해함으로써 이 문제를 해결하는데, 이런 부분은 더욱 적게 하고 유지보수와 구축이 더욱 쉽다.이런 방법은 마이크로 서비스 체계 구조를 우리 업계에서 점점 보편화시켰다.
단점은 소프트웨어를 더 작은 부분으로 분해하면 복잡성이 증가한다는 것이다.더 많은 부품과 더 복잡한 결합은 테스트 응용 프로그램과 생산 과정에서 그것들을 조작하는 것을 더욱 어렵게 한다.
CI/CD 파이프는 여기서도 예외가 아니다.에서 우리는 다른 파이프에서 터치 파이프를 연구했다.이 기사는 한 배치가 다른 배치를 시작할 수 있도록 Circleci에서 여러 항목을 연결하는 방법을 설명한다.
본문에서 우리는 더욱 진일보할 것이다.나는 첫 번째 파이프가 다른 파이프를 촉발할 뿐만 아니라, 다른 파이프가 완성되기를 기다리고 있는 예시를 제공할 것이다.나는 작업을 끝낼 때 신호를 보내기 위해 두 번째 파이프로 되돌아오는 것을 circleback 모드라고 부른다.이 모델을 사용하면 더욱 좋은 통합 테스트와 더욱 복잡한 배치와 발표 장면을 실현할 수 있다.
선결 조건
참고 자료 및 샘플 코드
이 예제의 소스 코드는 두 저장소에 있습니다.
링 백 모드 소개
이러한 여러 파이프의 순환 배열에는 세 가지 절차가 있다.
두 번째 파이프의 상태에 따라 첫 번째 파이프가 성공적으로 종료되거나 실패할 때까지 계속 실행됩니다.
왜 파이프는 다른 프로젝트가 완성되기를 기다려야 합니까?
인용문에서 언급한 바와 같이 이것은 여러 항목을 처리하기 때문에 발생하는 복잡성을 통제하는 선진적인 기술이다.이것은 여러 개의 상호 의존 프로젝트에 종사하는 단체가 사용할 수 있으며, 그들은 이 프로젝트를monorepo와 같은 단일 저장소에 넣고 싶지 않다.또 다른 용도는 테스트를 위해 하드웨어 회사와 같은 집중적인 저장소를 구축하는 것이다.이 기술은 마이크로 서비스 응용 프로그램의 통합 테스트나 복잡한 배치 장면을 편성하는 데도 사용된다.가능성이 많다.
파이프 트리거 구현
우리는 두 개의 파이프가 조화를 필요로 한다
파이핑 B는 A에 종속적이며 A를 검증하는 데 사용할 수 있습니다.
두 파이프 모두 API 키를 설정하고 사용할 수 있어야 합니다.파이핑 A의 작업에서 환경 변수로 API 키 세트를 사용할 수 있습니다(
CIRCLECI_API_KEY
. 이 키 세트는 콜백 시 파이핑 B에서도 사용할 수 있습니다.두 항목에서 설정하거나 조직 수준에서 컨텍스트로 설정할 수 있습니다.이 자습서에서는 두 항목이 동일한 API 키를 사용할 수 있도록 조직 수준에서 컨텍스트circleci_api
로 설정합니다.시작 파이프
이 강좌의 첫 부분은 촉발 과정을 깊이 있게 설명할 것이다.다음 강좌에서 나는 몇 가지 중요한 차이점을 소개할 것이다.
triggering-pipeline-id
라고 합니다.curl --request POST \
--url https://circleci.com/api/v2/project/gh/zmarkan-demos/circleback-cicd-project-b/pipeline \
--header "Circle-Token: $CIRCLECI_API_KEY" \
--header "content-type: application/json" \
--data '{"branch":"main","parameters":{"triggering-pipeline-id":"<< pipeline.id >>"}}'
파이핑 ID를 저장하려면 패키지curl
호출$()
을 실행하여 변수CREATED_PIPELINE
에 지정합니다.응답 본문에서 ID를 추출하려면 jq
도구를 사용하여 파일에 기록합니다pipeline.txt
.CREATED_PIPELINE=$(curl --request POST \
--url https://circleci.com/api/v2/project/gh/zmarkan-demos/semaphore_demo_project_b/pipeline \
--header "Circle-Token: $CIRCLECI_API_KEY" \
--header "content-type: application/json" \
--data '{"branch":"main","parameters":{"triggering-pipeline-id":"<< pipeline.id >>"}}' \
| jq -r '.id'
)
echo "my created pipeline"
echo $CREATED_PIPELINE
mkdir ~/workspace
echo $CREATED_PIPELINE > pipeline.txt
파일pipeline.txt
이 생성되었으므로 persist_to_workspace
을 사용하여 파일을 저장하고 다음 작업에 사용합니다.- persist_to_workspace:
root: .
paths:
- pipeline.txt
전체 작업 구성은 다음과 같습니다....
jobs:
trigger-project-b-pipeline:
docker:
- image: cimg/base:2021.11
resource_class: small
steps:
- run:
name: Ping another pipeline
command: |
CREATED_PIPELINE=$(curl --request POST \
--url https://circleci.com/api/v2/project/gh/zmarkan-demos/semaphore_demo_project_b/pipeline \
--header "Circle-Token: $CIRCLECI_API_KEY" \
--header "content-type: application/json" \
--data '{"branch":"main","parameters":{"triggering-pipeline-id":"<< pipeline.id >>"}}' \
| jq -r '.id'
)
echo "my created pipeline"
echo $CREATED_PIPELINE
mkdir ~/workspace
echo $CREATED_PIPELINE > pipeline.txt
- persist_to_workspace:
root: .
paths:
- pipeline.txt
...
대기 예약
마지막 작업은 파이프 B를 트리거하여 파이프 a로 돌아가기 전에 파이프 B를 완료해야 합니다. 다음과 같이 CirclecI에서
approval
작업을 사용할 수 있습니다....
workflows:
node-test-and-deploy:
jobs:
...
- trigger-project-b-pipeline:
context:
- circleci-api
requires:
- build-and-test
filters:
branches:
only: main
- wait-for-triggered-pipeline:
type: approval
requires:
- trigger-project-b-pipeline
- check-status-of-triggered-pipeline:
requires:
- wait-for-triggered-pipeline
context:
- circleci-api
...
작업trigger-project-b-pipeline
을 완료한 후 wait-for-triggered-pipeline
를 입력합니다.이 작업 유형은 approval
이므로 수동으로 승인하는 사람이 있을 때까지 기다립니다.(자세한 내용은 다음 섹션에서 설명합니다.)승인 후 후속 작업을 계속하기 위해 requires
섹션을 추가합니다.CircleciCI API를 사용하는 두 작업 모두
context
가 지정되어 있으므로 API 태그를 환경 변수로 사용할 수 있습니다.파이프 A로 돌아가기
지금 우리는 이미 파이프 A를 완성했고, 지금은 파이프 B가 빛을 발할 때이다.Circleci
approval
의 업무는 특수한 업무로 받아들여지기를 기다려야 한다.그것은 보통 인공 납품 담당자나 정보 안전 엔지니어의 승인을 받을 때까지 파이프를 대기 상태로 유지하는 데 쓰인다.이때 파이핑 B는 파이핑 A의 ID를 알고 있으므로 approval API를 사용하여 파이핑 A를 가져올 수 있습니다.실행 중인 파이프의 ID만 있고 승인할 실제 작업이 없으므로 여러 API 호출이 필요합니다.
파이프 B의 테스트가 실패하면 이 작업은 자동으로 실패합니다.이 경우 필요한 작업을 포함하는 워크플로는 계속되지 않습니다.파이프에서 사용할 수 있습니다
post-steps
. 파이프는 항상 실행됩니다.전체 작업 흐름은 다음 예시 코드 블록에 표시됩니다.매개변수:
parameters:
triggering-pipeline-id:
type: string
default: ""
...
workflows:
node-test-and-deploy:
jobs:
- build-and-test:
post-steps:
- approve-job-in-triggering-pipeline
context:
- circleci-api
API 호출을 승인하는 스크립트를 실행하면 이렇게 할 수 있습니다.이 강좌에서 나는 command
을 사용했다....
commands:
approve-job-in-triggering-pipeline:
steps:
- run:
name: Ping CircleCI API and approve the pending job
command: |
echo << pipeline.parameters.triggering-pipeline-id >>
if ! [-z "<< pipeline.parameters.triggering-pipeline-id >>"]
then
workflow_id=$(curl --request GET \
--url https://circleci.com/api/v2/pipeline/<< pipeline.parameters.triggering-pipeline-id >>/workflow \
--header "Circle-Token: $CIRCLECI_API_KEY" \
--header "content-type: application/json" \
| jq -r '.items[0].id')
echo $workflow_id
waiting_job_id=$(curl --request GET \
--url https://circleci.com/api/v2/workflow/$workflow_id/job \
--header "Circle-Token: $CIRCLECI_API_KEY" \
--header "content-type: application/json" \
| jq -r '.items[] | select(.name == "wait-for-triggered-pipeline").id')
echo $waiting_job_id
curl --request POST \
--url https://circleci.com/api/v2/workflow/$workflow_id/approve/$waiting_job_id \
--header "Circle-Token: $CIRCLECI_API_KEY" \
--header "content-type: application/json"
fi
when: always
...
스크립트는 먼저 triggering-pipeline-id
파이프 파라미터가 존재하는지 검사합니다.이 매개 변수가 존재할 때만 계속됩니다.명령의 행when: always
은 종료 상태와 관계없이 명령이 실행되도록 합니다.그런 다음 API 호출을 세 번 수행합니다.
jq
승인 작업 이름wait-for-triggered-pipeline
과 일치하는 작업을 선택하여 승인 작업의 ID주의: 응답에서 보낼 수 있는 작업 수를 초과하면 페이지를 처리해야 할 수도 있습니다.
이제 승인 요청을 보냈습니다. 파이핑 B가 완료되었으므로 파이핑 A가 다시 실행되어야 합니다.
B 결과로 파이프 A 업데이트하기
파이핑 A가 승인되면 워크플로의 다음 작업이 시작됩니다.워크플로우 다이어그램에 필요한 경우 파이핑 A는 여러 작업을 트리거할 수 있습니다.
우리는 여전히 이전의 작업 절차의 결과를 나타낼 기미가 보이지 않는다.이러한 정보를 얻으려면 API를 사용하여 파이핑 A에서 B의 상태를 다시 가져올 수 있습니다. 예제 작업은 다음과 같습니다.
check-status-of-triggered-pipeline
.먼저 트리거 파이프의 ID, 즉 파이프 B를 읽어들여야 합니다. 이 ID는 이전 단계에서 작업공간에 유지된 ID와 동일합니다.
cat
로 검색: - attach_workspace:
at: workspace
- run:
name: Check triggered workflow status
command: |
triggered_pipeline_id=$(cat workspace/pipeline.txt)
그런 다음 API를 사용하여 워크플로우를 읽어들입니다.jq
를 사용하여 반환된 워크플로우 배열에서 첫 번째 항목의 상태만 가져옵니다.created_workflow_status=$(curl --request GET \
--url "https://circleci.com/api/v2/pipeline/${triggered_pipeline_id}/workflow" \
--header "Circle-Token: $CIRCLECI_API_KEY" \
--header "content-type: application/json" \
| jq -r '.items[0].status'
)
상태가 비success
인지 확인합니다.그렇지 않으면 exit
를 사용하여 코드-1에서 작업을 종료하십시오.워크플로가 성공하면 워크플로가 종료됩니다.if [["$created_workflow_status" != "success"]]; then
echo "Workflow not successful - ${created_workflow_status}"
(exit -1)
fi
echo "Created workflow successful"
다음은 작업의 전체 구성check-status-of-triggered-pipeline
입니다. check-status-of-triggered-pipeline:
docker:
- image: cimg/base:2021.11
resource_class: small
steps:
- attach_workspace:
at: workspace
- run:
name: Check triggered workflow status
command: |
triggered_pipeline_id=$(cat workspace/pipeline.txt)
created_workflow_status=$(curl --request GET \
--url "https://circleci.com/api/v2/pipeline/${triggered_pipeline_id}/workflow" \
--header "Circle-Token: $CIRCLECI_API_KEY" \
--header "content-type: application/json" \
| jq -r '.items[0].status'
)
echo $created_workflow_status
if [["$created_workflow_status" != "success"]]; then
echo "Workflow not successful - ${created_workflow_status}"
(exit -1)
fi
echo "Created workflow successful"
결론
본고에서 우리는 복잡한 파이프 배열 모델의 예시를 되돌아보았는데, 나는 그것을'circleback'이라고 명명했다.circleback 모드에서 의존 파이프를 만들고 완성하기 전에 종료를 기다릴 수 있습니다.이것은 두 항목에서 여러 개의 API 키를 생성하고 승인 작업과Circleci를 사용하는 작업공간 기능을 포함하여 작업 흐름에서 파이프 ID를 저장하고 전달하는 등 값을 포함한다.예제 항목은 다른 저장소에 있습니다.project A 및 project B.
만약 이 문장이 당신에게 도움이 된다면, 나는 그것에 대해 어떤 문제나 건의가 있거나, 미래의 문장과 지침에 대해 어떤 생각을 가지고 있는지 알고 싶습니다. email me
Reference
이 문제에 관하여(circleback 모드를 사용하는 고급 파이프 배열), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/circleci/advanced-pipeline-orchestration-with-the-circleback-pattern-4ee8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)