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에서의 제어도 검토했지만 다음과 같은 이유로 채용하지 않았습니다.
  • 현재 개발 팀은 태그를 사용하여 운영하지 않습니다
  • 테스트를 건너 뛰기 위해 태그를 구분하는 것도 태그를 사용하는 방법으로 미묘합니다
  • branch로 필터를 적용하는 경우와 비교하여 필터가 복잡해집니다.

    다음은 태그를 사용한 제어의 예입니다.


    발화 조건
    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 레벨로 나눌 수 있어 보다 심플하게 할 수 있는 방법이 없을까라고 생각하는 곳입니다.
  • 좋은 웹페이지 즐겨찾기