CircleCI에서 특정 브랜치로 이동하는 워크 플로우를 더 분기하고 싶습니다.
10700 단어 CircleCICircleCI2.0
소개
CircleCI workflow를 사용하여 작업을 실행할 때 분기로 필터링하여 실행할 작업을 결정했습니다. 예를 들어 릴리스용 브랜치에 병합된 경우에만 배포에 관한 job을 실행하는 등의 사용법입니다.
개발을 하고 있는 가운데 브랜치보다 좀 더 세세한 조건으로 분기로 job을 나누고 싶다고 하는 요망이 있어, 그 때 실시한 방법에 대해 소개합니다.
하고 싶은 일
remote의 브랜치에의 commit을 트리거에 브랜치에 의해 이하와 같은 workflow가 헤어지고 있는 경우에
브랜치
job
마스터 이외
test-job
마스터
test-job,deploy-job
master 브랜치에 commit을 트리거에 실행되는 workflow를 2개로 나누어 특정 조건의 경우에 테스트를 skip하도록 하고 싶다.
브랜치
job
마스터 이외
test-job
마스터
test-job,deploy-job
master(특정 조건 충족)
deploy-job
전제
전제로는 workflow를 이용한다
간단을 위해 다음과 같은 간단한
config.yml
가 있는 경우에 설명해 갑니다..circleci/config.yml
version: 2.1 # executorsのみ2.1の機能を使っていますが、それ以外は2.0の機能です
executors:
default:
working_directory: ~/sample
docker:
- image: hoge/hoge:latest
jobs:
test-job:
executor:
name: default
steps:
- run:
name: test_step
command: echo 'execute test job'
deploy-job:
executor:
name: default
steps:
- checkout
- run:
name: deploy_step
command: echo 'execute deploy job'
workflows:
test-and-deploy:
jobs:
- test-job
- deploy-job:
requires:
- test-job
filters:
branches:
only:
- master
채택한 방법
간단한 방법이지만 커밋 로그에 특정 문자열이 포함되어 있으면 테스트 실행을 skip합니다.
예를 들면
skip_test
와 같은 캐릭터 라인이 들어가 있는 경우에 실행을 한다. 경우 config.yml
를 다음과 같이 수정합니다..circleci/config.yml
version: 2.1
executors:
default:
working_directory: ~/sample
docker:
- image: hoge/hoge:latest
jobs:
test-job:
executor:
name: default
steps:
- checkout
- run:
name: test_step
command: | # commandの内容を修正
if [ -z "`git log -1 --oneline | grep skip_test`" ]; then
echo 'execute test job'
else
echo "skip test job"
fi
deploy-job:
executor:
name: default
steps:
- run:
name: deploy_step
command: echo 'execute deploy job'
workflows:
test-and-deploy:
jobs:
- test-job
- deploy-job:
requires:
- test-job
filters:
branches:
only:
- master
간단한 방법은 있지만 미묘한 점도 있습니다. job 안에서 테스트를 실행할지 어떨지를 판단하고 있기 때문에, 테스트의 실행 자체는 스킵 할 수 있습니다만, 그 전처리(예로 말하면 executor 안의 처리나, checkout의 처리)는 실행된다 따라서 그 오버 헤드는 반드시 걸립니다.
채택하지 않은 방법
git의 tag를 사용하여 실행하는 job에 filter를 걸 수 있기 때문에 tag에서의 제어도 검토했지만 다음과 같은 이유로 채용하지 않았습니다.
다음은 태그를 사용한 제어의 예입니다.
발화 조건
job
마스터 이외의 브랜치에 대한 커밋
test-job
skiptest 문자열을 포함하지 않는 태그 만들기
test-job,deploy-job
skiptest 문자열을 포함하는 태그 만들기
deploy-job
.circleci/config.yml
# workflowsのみ抜粋
workflows:
test:
jobs:
- test-job:
filters:
branches:
ignore: master # masterブランチでどのjobを実行するかはtagで制御するためignore
test-and-deploy:
jobs:
- test-job:
filters:
tags:
only: /^(?!.*skiptest).*$/ # skiptestを含まないタグの場合のみ発火
branches:
ignore: /.*/ # branchへのcommitで発火しないようにignore
- deploy-job:
requires:
- test-job
filters:
tags:
only: /^(?!.*skiptest).*$/ # skiptestを含まないタグの場合のみ発火
branches:
ignore: /.*/ # branchへのcommitで発火しないようにignore
only-deploy:
jobs:
- deploy-job:
filters:
tags:
only: /^.*skiptest.*$/ # skiptestを含むタグの場合のみ発火
branches:
ignore: /.*/ # branchへのcommitで発火しないようにignore
이 예에서는 workflow 자체가 단순하기 때문에 거기까지 복잡하지는 않지만, workflow 자체가 복잡해지면 filter 주위가 복잡하게 되어 오지 않는다는 인상입니다.
요약
CircleCI의 workflow를 사용하여 특정 브랜치에서 실행되는 작업을 더 나누어 실행하는 방법을 소개했습니다. 채용한 방법으로는 불필요한 오버헤드가 걸리고 있으므로, job 레벨로 나눌 수 있어 보다 심플하게 할 수 있는 방법이 없을까라고 생각하는 곳입니다.
Reference
이 문제에 관하여(CircleCI에서 특정 브랜치로 이동하는 워크 플로우를 더 분기하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yamashun/items/15965c9a789d7789f3f0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)