CircleCI에서 hub 명령을 활용해 보았습니다.

Qiita 첫 투고입니다! 감사합니다

TL;DR



이 기사를 읽으면 한 리포지토리에서 출력되는 출력을 다른 리포지토리에 반영하는 풀 요청을 자동으로 만들 수 있습니다.

리포지토리 간에 종속성이 있거나 사용법을 찾을 수 있습니다.

1. 했던 일


  • 과제
    A 리포지토리에서 수정하고, Pull Request가 master 브랜치에 병합된 후 webpack 하고, B 리포지토리에 반영하는 Pull Request를 매번 수동으로 실시하는 것이 상당히 번거로움. 가끔 B리포지토리에 반영하는 것을 잊고, 저기...같은 사태에 빠지기 쉽다.
  • 솔루션
    CircleCI가 master 브랜치에 병합될 때마다 괜찮게 해준다.

  • 2. hub 명령을 CircleCI로 해결합니다.



    hub 명령이란?



    허브 명령은 GitHub에서 제공하는 명령줄 도구입니다. git 명령을 확장하여 GitHub의 다양한 기능을 사용할 수 있습니다.

    이번에는 hub 명령 ( v2.13.0 )을 사용하여 CLI에서 풀 요청을 만듭니다.

    3. 실행 절차



    Pull Request를 작성하기 위한 쉘 스크립트 작성



    c 희귀 테이프 - 퀘스트 st. sh


    #!/bin/bash
    
    set -ex
    
    LOCAL_REPO=path/to/some_repo
    REMOTE_REPO=organization/some_repo
    COPY_FROM=path/to/copy_from
    COPY_TO=path/to/copy_to
    NEW_BRANCH=some_branch_name
    COMMIT_HASH="$(echo $CIRCLE_SHA1 | cut -c -7)"
    PR_TEMPLATE=$HOME/target/.github/CIRCLECI_PULL_REQUEST_TEMPLATE.md
    
    # install hub command
    wget https://github.com/github/hub/releases/download/v$HUB_VER/hub-linux-amd64-2.13.0.tgz
    tar zvxvf hub-linux-amd64-2.13.0.tgz
    sudo ./hub-linux-amd64-2.13.0/install
    rm -rf hub-linux-amd64-2.13.0
    
    # git clone
    mkdir -p $REPO_DIR
    hub clone $REPO_LOCATION $REPO_DIR
    
    # 反映したい内容をコピー
    cp -fp $COPY_FROM $COPY_TO
    
    # git configの設定
    git config --global user.email "[email protected]"
    git config --global user.name "circleci"
    
    # 反映したい内容をCommit
    cd $REPO_DIR
    git checkout -b $NEW_BRANCH
    git add . && git commit -m "update for $COMMIT_HASH"
    
    # Pull Request Templateを編集
    ## 作成するPull RequestのタイトルにCommit Hashを付ける
    sed -ie "s/hoge$/hoge($COMMIT_HASH)/" $PR_TEMPLATE
    
    ## 作成するPull Requestの内容に作成元のPull Requestを紐付ける
    echo -e "$CIRCLE_PULL_REQUEST" >> $PR_TEMPLATE
    
    # Pull Requestを作成
    hub pull-request -F $PR_TEMPLATE -b develop -p
    

    쉘 스크립트는 실행 권한을 부여하는 것을 잊지 마십시오.

    RC ぇし_ぷっ l_레쿠에 ST_로 MP. md


    update: for hoge
    
    ## Reference pull request
    
    hoge는 쉘 스크립트에서 hoge(commit_hash)로 대체되어 템플릿의 행 끝에 CircleCI 실행 대상 Pull Request URL을 추가합니다.

    CircleCI에 쉘 스크립트 포함



    config.yml (CircleCI)



    이 문서의 대상인 config.yml의 일부를 발췌하여 아래에 설명합니다.
    version: 2
    
    references:
      ## branch filters
      filter_only_master: &filter_only_master
        branches:
          only:
            - /^master/
    
    jobs:
      create_pull_request:
        docker:
          - image: some-docker-image
        steps:
          - checkout
          - run:
              name: create pull request
              command: ./.circleci/create-pull-request.sh
    
    workflows:
      version: 2
      build_and_deploy:
        jobs:
          - create_pull_request:
              filters: *filter_only_master
    

    4. 조금 고생한 곳



    hub pull-request 명령은 처음 실행할 때 username과 password를 다음과 같이 묻습니다.
    $ hub pull-request -F PULL_REQUEST_TEMPLATE.md
    github.com username:
    github.com password for user (never stored):
    two-factor authentication code:
    

    이 문제를 해결하기 위해 다음을 수행하여 해결할 수있었습니다.
  • CircleCI의 Environment Variables에 GITHUB_USEROAUTH_TOKEN 추가
  • 쉘 스크립트에 다음 추가
  • cat << EOF > ~/.config/hub
    github.com:
    - user: $GITHUB_USER
      oauth_token: $OAUTH_TOKEN
      protocol: https
    EOF
    chmod 600 ~/.config/hub
    

    이것은, hub pull-request 명령을 최초로 실행했을 때에 생성되는 것을 수동으로 작성한 것입니다만, 쉘 스크립트에 쓰는 것은 조금 까다롭습니다. . . 라고 생각했으므로, 좀 더 조사해 보면 이하와 같은 기술을 발견했습니다.
    $ man hub
    :(snip)
    CONFIGURATION
       GitHub OAuth authentication
           Hub will prompt for GitHub username  password the first time it needs to access the API and exchange it for an OAuth token, which it saves in ~/.config/hub.
    
           To avoid being prompted, use GITHUB_USER and GITHUB_PASSWORD environment variables.
    
           Alternatively, you may provide GITHUB_TOKEN, an access token with repo permissions. This will not be written to ~/.config/hub.
    :(snip)
    

    과연. . . 그래서 궁극적으로 다음을 수행하여 해결했습니다.
  • CircleCI의 Environment Variables에 GITHUB_TOKEN 추가

  • 이제 처음 실행할 때 username 과 password 를 듣지 않고 hub pull-request 를 실행할 수 있었습니다.

    5. 궁리한 곳



    Pull Request간의 대응 관계를 알기 쉽게 하기 위해서 이하를 실시했습니다.
  • 템플릿 제목에 해시 값을 추가하여 풀 요청을 식별 할 수 있습니다
  • Template의 내용에 원래 Pull Request URL을 추가하여 Reference 할 수있게했다

  • 6. 앞으로 하고 싶은 일


  • Hotfix등의 대응의 경우에, 베이스 브랜치를 바꿀 수 있도록(듯이) 하고 싶다!
  • Commit한 내용을 판정하고, 반영하는 내용을 바꿀 수 있도록 하고 싶다!

  • 7. 정리



    이번에는 CircleCI와 hub 명령의 일부를 사용해 보았습니다만, 사용법에 따라서는 여러가지 유연하게 할 수 있을 것 같다는 느낌이었습니다. 그 밖에도 사용 장면이 있을 것 같기 때문에 사용해 가려고 생각합니다.

    이상!

    좋은 웹페이지 즐겨찾기