Rust로 GiitHub CLI extension 만들기

얼마 전에 GiitHub CLI 2.0이 출시되어 독자적인 사용자 정의 명령(GiitHub CLI extension)을 만들 수 있게 되었다.
Zenn에서도 다음과 같은 사람이 쓴 기사가 있다.
https://zenn.dev/ymmmtym/articles/github-cli-gh-extension
https://zenn.dev/kawarimidoll/articles/75430b40622e7c
이전 사람들의 GiitHub CLI extension은 아래에서 찾을 수 있습니다.
https://github.com/topics/gh-extension
기본적으로 조개 스크립트로 쓰는 것이 가장 쉽지만, 저는 Rust로 쓰고 싶어서 이 방법을 소개합니다.
설명은 주로 사용자 정의 명령의 실행 파일을 만드는 방법과 발표하는 방법에 관한 것이다.
참고로 이번 제작의 지령은 다음과 같다.
GiitHub의 기본 브랜치 이름을 참조하고 변경할 수 있습니다.
기본 분기를 마스터에서main으로 바꿀 때는 GUI가 귀찮아서 CLI로 하려고 했는데 자신을 위한 지령이었다.[1]
https://github.com/daido1976/gh-default-branch/tree/v0.1
하는 일이 순서대로 진행되는 것gitgh 지령에 불과하기 때문에 중간에 보니 완전히 조개 각본이어서 다행이다. 하지만 이 보도의 소재가 될 수 있어서 다행이다.

생성 방법


나는 아래의 창고를 참고했다.
https://github.com/vilmibm/gh-user-status/tree/v1.0.1
https://github.com/carlsberg/gh-releaser/tree/0.4.10
대략적인 절차는 다음과 같다.
  • Rust로 일부 CLI 어플리케이션 제작
  • cargo build gh release create로 발표된 바이너리
  • gh-xx의 실행 파일에서 진행gh release downloadexec 명령으로 다운로드한 바이너리
  • 여러분이 추측한 바와 같이 만약 이런 방법이라면, Rust가 아니더라도 발표용 이진 프로그래밍 언어에 적용될 수 있습니다.
    위의 참조 저장소에는 각각 Go, Type Script(Deno)가 사용됩니다.

    1. Rust로 CLI 애플리케이션 만들기


    자유롭게 만들어 보세요.
    물론 코드에서 gh 명령을 사용할 수 있습니다.
    gh api 지령의 유연성이 높기 때문에 나는 기본적으로 무엇이든 할 수 있다고 생각한다.
    그리고jq에 의존하지 않고 jq 옵션을 사용할 수 있다는 것은 정말 대단하다.

    2. 게시


    다음 발표용 스크립트를 써서 $ ./release.sh v0.1의 느낌으로 실행합니다.
    release.sh
    #!/bin/bash
    set -e
    
    tag="${1}"
    cargoOutput="./target/release/gh-default-branch"
    
    if [ "${tag}" == "" ]; then
      echo "tag argument required"
      exit 1
    fi
    
    cargo build --release
    mv "${cargoOutput}" "${cargoOutput}-${tag}"
    gh release create "$tag" "${cargoOutput}-${tag}" --title="${tag}" --notes "${tag}"
    

    3. 명령 실행(발표된 바이너리 다운로드)

    gh 명령에 의존하지만 GiitHub CLI extension 사용 = GiitHub CLI가 설치되어 있으므로 문제가 없습니다.현명한 해결책이네.
    gh-default-branch
    #!/bin/bash
    set -e
    
    # TODO: 現状だと新しいバージョンがリリースされるたびに手動でこの tag を書き換える必要があるので、
    # バージョン文字列のみ別ファイルに逃し、リリース時に上書きするなどして自動で更新されるようにしたい
    tag="v0.1"
    
    repo="daido1976/gh-default-branch"
    exe="gh-default-branch-${tag}"
    extensionPath="$(dirname "$0")"
    
    if [[ ! -x "${extensionPath}/bin/${exe}" ]]; then
      mkdir -p "${extensionPath}/bin"
      rm -f "${extensionPath}/bin/gh-default-branch-"*
      gh release -R"${repo}" download "${tag}" -p "${exe}" --dir="${extensionPath}/bin"
      chmod +x "${extensionPath}/bin/${exe}"
    fi
    
    exec "${extensionPath}/bin/${exe}" "$@"
    

    참고 자료


    https://docs.github.com/en/github-cli/github-cli/creating-github-cli-extensions
    https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository
    각주
    README에 기재된 바와 같이 GUI에서 온rename에 비해 기능이 압도적으로 적으니 주의하십시오.↩︎

    좋은 웹페이지 즐겨찾기