커밋 메시지에 특정 문자열이 포함되어 있으면 특정 작업을 수행 할 수 있습니다.

8233 단어 CircleCICircleCI2.1

소개



이 기사에서는 CircleCI에서 "커밋 메시지에 특정 문자열이 포함되어 있으면 특정 작업을 수행하고 싶다"는 경우를 구현하는 방법을 소개합니다. 결론은 circleci-agent step halt 명령을 사용하여 비교적 간단합니다.

이번에는 CircleCI 2.1에서 동작 확인을 실시하고 있습니다.

실현하고 싶은 일



이전에는 iOS 프로젝트에서 다음 규칙으로 워크 플로를 정의했습니다.
  • master 이외의 브랜치는 Unit test를 실행한다
  • master 브랜치는 Unit test 이외에 UI testApp Store Connect へのデプロイ를 실행합니다

  • 이 외에도 새로운 규칙을 추가했습니다.
  • master 이외의 브랜치는 커밋 메시지에 "kick-ui-test"가 포함되어 있으면 Unit test 다음에 UI test를 실행합니다.

    정의한 워크플로의 전체 이미지







    그림 : master 브랜치 이외의 Workflow






    그림: master 브랜치 Workflow


    yaml의 전체 이미지



    ※ 각 작업내에서 하고 있는 처리(호출하고 있는 commands)에 대해서는 생략해 예시합니다.
    version: 2.1
    
    jobs:
      unit_test:
        <<: *defaults
        steps:
          - unit-test
    
      run_ui_test_as_needed:
        <<: *defaults
        steps:
          - checkout
          - run:
              name: Decide whether to run ui-test, depending on the content of the commit message.
              command: |
                COMMIT_MESSAGE=$(git log -1 HEAD --pretty=format:%s)
                TRIGGER_MATCH_PATTERN="^.*kick-ui-test.*$"
                if [[ ${COMMIT_MESSAGE} =~ ${TRIGGER_MATCH_PATTERN} ]]; then
                  echo "Continue to run ui_test, as the commit message contains kick-ui-test."
                else
                  echo "Since the commit message does not include kick-ui-test, this job will be successfully terminated."
                  circleci-agent step halt
                fi
          - ui_test
    
      ui_test:
        <<: *defaults
        steps:
          - ui_test
    
      deploy_appstore:
        <<: *defaults
        steps:
          - deploy
    
    workflows:
      build-workflow:
        jobs:
          - unit_test
          - run_ui_test_as_needed:
              requires:
                - unit_test
              filters:
                branches:
                  ignore: 
                    - master
          - ui_test:
              filters:
                branches:
                  only:
                    - master
          - deploy_appstore:
              requires:
                - unit_test
                - ui_test
              filters:
                branches:
                  only:
                   - master
    

    run_ui_test_as_needed 작업 정보



    이 작업에서 "커밋 메시지에 "kick-ui-test"가 포함되어 있으면 Unit test 다음에 UI test를 실행한다"라는 제어를 실현하고 있습니다.
    run_ui_test_as_needed:
      <<: *defaults
      steps:
        - checkout
        - run:
            name: Decide whether to run ui-test, depending on the content of the commit message.
            command: |
              COMMIT_MESSAGE=$(git log -1 HEAD --pretty=format:%s)
              TRIGGER_MATCH_PATTERN="^.*kick-ui-test.*$"
              if [[ ${COMMIT_MESSAGE} =~ ${TRIGGER_MATCH_PATTERN} ]]; then
                echo "Continue to run ui_test, as the commit message contains kick-ui-test."
              else
                echo "Since the commit message does not include kick-ui-test, this job will be successfully terminated."
                circleci-agent step halt
              fi
        - ui_test
    

    주로 shell script 로 다음의 처리를 실시하고 있습니다.
  • 최근 커밋 메시지 가져오기
  • 정규 표현으로, 지정하고 싶은 캐릭터 라인 (이번이라면 kick-ui-test )을 정의
  • 1. 에서 얻은 커밋 메시지에 특정 문자열이 포함되어 있는지 확인
  • 만약, 포함되어 있으면 아무것도 하지 않는 것을 echo 하는 것만으로, 다음 단계로 진행한다
  • 포함되어 있지 않으면 그 시점에서 작업을 성공적으로 종료합니다.

  • ui_test 실행

  • 3.2에서 작업을 성공적으로 종료하려면 circleci-agent step halt 명령을 사용합니다. 이 명령은 작업을 실패하지 않고 종료할 수 있으며 작업을 조건부로 실행해야 하는 이번 사례에 유용합니다.

    Ending a Job from within a step | CircleCI

    사이고에게



    이번에는, master 브랜치 이외(기능의 실장 도중 등)에서도 간편하게 ui_test 를 실행하고 싶은 경우가 있어, run_ui_test_as_needed job 를 추가했습니다.

    CircleCI 2.0 부터 다음 작업을 계속하기 전에 수동 승인 작업을 기다리는 제어 가 가능하게 되었습니다만, 구조상, 수동으로 승인하는 수고가 발생하기 때문에, 이번과 같이 커밋하는 시점에서 특정 작업의 실행을 제어할 수 있으면 편리하다고 느꼈습니다.

    참고


  • Ending a Job from within a step | CircleCI
  • 좋은 웹페이지 즐겨찾기