ホームページ >バックエンド開発 >Golang >CLI アプリの公開 (Apt および YUM を使用)

CLI アプリの公開 (Apt および YUM を使用)

Susan Sarandon
Susan Sarandonオリジナル
2024-10-05 06:10:30887ブラウズ

Publishing CLI Apps (with Apt & YUM)

イントロ

私は最近、CLI アプリのファンになっています。おそらくそれは、私の子供時代の端末 (486/33 の DOS や父の古い Apple IIe から始まりました) の魅力なのかもしれません。私は Gen X Commodore64 の時代には少し遅すぎましたが、Windows 95 だけではなく、それ以上のことを知るにはちょうど間に合いました。ダイヤルアップと 56k モデムが主流だった興味深い時代でした。最近のほとんどのブログ投稿には、SEO のために文字数を増やすためにイントロが冗長になっているのは知っていますが、これが、最近の若い人たちの多くが GUI アプリしか知らない中で、私が今でも CLI を愛する理由でもあります。 Z 世代の子供たちが、たとえ簡単な作業であってもターミナルを起動するのを見るのが、これほど嬉しいことはありません。アルファ世代が BBS とは何かを知るまで待ってください。 「おじいちゃんコンピューター」と彼らは言うでしょう? 「芝生から出て行け」✊✊

CoolRetroTerm のようなプロジェクトは、CLI への愛を取り戻すために、間違いなく私の心の中に暖かい場所を持っています。私は今でも、ブログの一部を古い Netbook の Micro で行うことを好みます。本当に、書くことだけに集中できます。 VSCode ZenMode と MarkText はかなり近いものなのではないでしょうか?


flowchart LR
Build_App --> GH_Actions --> ??? --> Profit!!!



包装

それはともかく、余談ですが…

小さな CLI アプリ Stampy を作成した後、小さな問題に遭遇しました。それをどのように配布するか?少なくとも、私は Python パッケージングの恐ろしい怒りを避けるために (Python でビルドしたいのと同じくらい) GoLang で書くことを頭で考えるだけの賢さはありました。私がいつも困惑していることの 1 つは、人々がどのようにして素晴らしい CLI アプリを APT や YUM などの高級なパッケージ管理システムに公開するかということでした。

通常、アプリをビルドするには、単純な go build を実行するだけです。そしてブーム、インスタントバイナリ。これはローカル開発にとっては素晴らしいことですが、クロスプラットフォームのコンパイルにはあま​​り役に立ちません。その方法を示す素晴らしいガイドがいくつかありますが…私の ?? については、お読みください。そこで、さらに詳しく調べてみると、優れたツールがなければなりませんでした…そして、確かに、GoReleaser がありました!

非常によく書かれたドキュメントを読んだ後、簡単にローカルのクロスプラットフォーム ビルドを行うことができました。


goreleaser --snapshot --clean



GitHub リリースでは、事前に作成された優れた GH アクションがあるため、ビルドを実行するのも簡単でした!

ユーザーは、eget (優れた) や シチュー (はるかに優れた) などのツールを使用して私のアプリをインストールできるようになりました!

github.com/xxx をインストールすることもできますが、これで行われるのは、リポジトリのクローンを作成し、ローカルでビルドし、ビンを $GOBIN フォルダーに置くことだけです。適切なパッケージ管理ツールと実際には同じではありませんが、すでに Go をインストールしているにとっては、いざという時に機能します。私の意見では、平均的なユーザーにとっては実際には選択肢ではありません。 ?

それだけではなく、GoReleaser はパッケージングも提供しています。これで、DEB と RPM を簡単に作成できるようになりました。恐怖の apt-get install stampy にまた一歩近づきました。唯一欠けていたのは、APT リポジトリの作成方法でした。この最後の重要な部分は確かに簡単ではありません。私はこれを GitHub Pages でセルフホストする方法を検討するのに 1 時間ほど費やしました。それは実行可能ですが、Packagecloud のような無料サービスを使用して、1 件あたり 0 ドルの低コストで署名とリポジトリのホスティングを処理する方がはるかに簡単です。月?.

ワークフロー全体の例はここでご覧いただけます

ブログ投稿そのものに遭遇した人のために、コード ブロックの中にその簡素化されたバージョンも含めておきます。

高レベルの概要として、GHA は次のことを行います:

  • GoReleaser 構成を書き込みます
  • リリーサー自体を実行します
  • 次のジョブの .debs をアップロードします
  • 連鎖ジョブでは、.deb をプルして PackageCloud にアップロードします
  • 完了!

GitHub アクションの例


name: Release

on:
  pull_request:
  push:
    # run only against tags
    tags:
      - "*"

permissions:
  contents: write
  packages: write
  issues: write

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: stable

      - name: Release config
        run: |
          cat << EOF > /tmp/goreleaser-github.yaml
          project_name: EXAMPLE
          version: 2
          builds:
            - env: [CGO_ENABLED=0]
              goos:
                - linux
              goarch:
                - amd64
          nfpms:
            -
              maintainer: YOU <your@email.com>
              bindir: /usr/local/bin
              description: Copy formatted timestamp to system clipboard
              homepage: https://github.com/USERNAME/REPO
              license: MIT
              formats:
                - deb

          release:
            draft: false # If set to true, will not auto-publish the release.
            replace_existing_draft: true
            replace_existing_artifacts: true
            target_commitish: "{{ .Commit }}"
            prerelease: auto
            make_latest: true
            mode: replace
            include_meta: true
          EOF          

      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v6
        with:
          distribution: goreleaser
          # 'latest', 'nightly', or a semver
          version: "~> v2"
          args: release --clean --verbose --config /tmp/goreleaser-github.yaml
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Upload .deb artifact x86
        uses: actions/upload-artifact@v3
        with:
          name: deb-package
          path: dist/*amd64.deb

  pkgcld_amd64-deb:
    runs-on: ubuntu-latest
    needs:
      - goreleaser
    strategy:
      max-parallel: 3
      matrix:
        distro:
        - debian/bookworm
        - ubuntu/noble
        - ubuntu/jammy
    steps:
      - name: Download .deb artifact
        uses: actions/download-artifact@v3
        with:
          name: deb-package

      - name: Push package to packagecloud.io
        uses: computology/packagecloud-github-action@v0.6
        with:
          package-name: ./*.deb
          packagecloud-username: USERNAME
          packagecloud-reponame: APP_NAME
          packagecloud-distro: ${{ matrix.distro }}
          packagecloud-token: ${{ secrets.PACKAGECLOUD_TOKEN }}




ℹ️重要

プログラム構造や go.mod ファイルなどが適切にセットアップされていることを確認する必要があります。そうしないと、アプリを適切に公開する際に問題が発生します。

補足: Homebrew を使用してアプリを配布することもできますが、PAT シークレットを含む GH アクションがさらに複雑であることと、Apt で十分にカバーされているという事実のため、私は気にしませんでした。 おいしい、そしてシチュー…おいしい! ?

これは、アプリをリリースするときの重要な 2 番目の事柄につながります。 ?DOCUMENTATION?、そして無視されていた Readme.md?!

Readme のフォーマット

まともな Readme には必要だと思う要素がいくつかあります。これらの要素は、ドキュメントがほとんど、あるいはまったくない、あるいは最悪の場合、ドキュメントが不十分なアプリの中であなたのアプリを目立たせるのに役立ちます。

独自の Readme を作成するには、この形式に従うことを強くお勧めします。私はセンスを表すバッジの大ファンですが、GUI アプリの スクリーンショット をリストするのと同じように、小さな GIF デモを作成することで、それが何であるのかを人々に実際に示すことができると感じています。 ASCIINEMA の使用は非常に簡単で、すべてを正しく表示するための優れた GIF コンバーターも備えています。

?ヒント

余談ですが、私は CodeGPT にいくつかの GoLang 単体テストを書いてもらいましたが、これを書くのは通常大変なことだとわかっています。 JetBrains スイートを使用している場合、これは素晴らしいプラグインです。

Readme の例

  • テストバッジ
  • GIF デモ
  • 取材バッジ
  • Go レポートカード
  • インストール
    • パッケージマネージャー (例)
    • バイナリインストール (ex eget)
    • 「インストール」スニップに移動
  • 使用法
    • 明確な手順とコード例
  • 設定
    • 設定が保存される場所
    • INI ファイル、JSON、環境変数を使用しますか?
  • 組み込みヘルプにアクセスする方法
  • ソースからアプリをビルドする方法
  • 先行アート (別名、以前の作品/インスピレーション)

まとめ

私が Python アプリの公開方法を学び始めたときと同じように、今後は GoLang で作成したアプリを適切に配布できると感じていると言えてうれしいです。これは私が習得した素晴らしいスキルであり、このブログ投稿が他の人にも同じように役立つことを願っています。乾杯!

-ジェロイーター


?マストドン | ?電子メール | ?コメント | ☕ コーヒーを買ってきて

以上がCLI アプリの公開 (Apt および YUM を使用)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。