"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Publicação de aplicativos CLI (com Apt e YUM)

Publicação de aplicativos CLI (com Apt e YUM)

Publicado em 2024-11-08
Navegar:478

Publishing CLI Apps (with Apt & YUM)

Introdução

Ultimamente, tornei-me um grande fã de aplicativos CLI. Talvez seja o fascínio do terminal da minha infância (começando com o DOS em um 486/33 e o antigo Apple IIe do meu pai). Nasci um pouco tarde para a era Gen X Commodore64, mas bem a tempo de saber mais do que apenas o Windows 95. Foi uma época interessante, quando os modems dial-up e de 56k eram reis. Eu sei que a maioria das postagens de blog hoje em dia tem introduções, para aumentar a contagem de palavras para SEO, mas é por isso que ainda amo a CLI quando tantos jovens hoje em dia só conhecem aplicativos GUI. Nada me deixa mais feliz do que ver as crianças da Geração Z ligando o terminal, mesmo para tarefas simples. Cara, espere até a Geração Alfa descobrir o que é um BBS. “Computadores do vovô”, provavelmente dirão? “SAIA DO MEU GRAMADO” ✊✊

Projetos como CoolRetroTerm definitivamente têm um lugar caloroso em meu coração, por trazer de volta o amor CLI. Eu ainda prefiro fazer alguns dos meus blogs no Micro no meu antigo Netbook, vamos realmente se concentrar apenas em escrever. VSCode ZenMode e MarkText chegam perto, eu acho?


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



Embalagem

De qualquer forma, estou divagando…

Então, depois de escrever meu pequeno aplicativo CLI Stampy, me deparei com um pequeno problema, como distribuí-lo? Eu fui pelo menos inteligente o suficiente para pensar e escrevê-lo em GoLang (por mais que eu quisesse apenas construí-lo em Python) para evitar a temida ira do Python Packaging. Uma coisa que sempre me deixou perplexo foi como as pessoas publicam seus ótimos aplicativos CLI em sistemas sofisticados de gerenciamento de pacotes, como APT e YUM.

Normalmente, para construir seu aplicativo, você faria apenas um simples go build . e boom, binário instantâneo. Por melhor que seja para desenvolvedores locais, não adianta muito para compilações entre plataformas. Existem alguns guias interessantes para mostrar como fazer isso, mas… tl;dr para o meu ??. Então eu fiz mais pesquisas, tinha que haver uma ferramenta legal… e com certeza, existe o GoReleaser!

Depois de ler uma documentação muito bem escrita, consegui fazer uma construção local rápida e fácil de usar em várias plataformas.


goreleaser --snapshot --clean



Fazer com que as compilações aconteçam com os lançamentos do GitHub também foi fácil, pois eles têm ótimas ações GH pré-escritas!

Os usuários agora podem simplesmente instalar meu aplicativo com ferramentas como eget (bom) e stew (muito melhor)!

Embora você também possa instalar github.com/xxx, tudo o que isso faria seria clonar o repositório, construí-lo localmente e colocar o lixo em sua pasta $ GOBIN. Não é realmente o mesmo que uma ferramenta adequada de gerenciamento de pacotes, mas funciona muito bem para pessoas que já têm o Go instalado. Não é realmente uma opção para o usuário médio IMHO. ?

E não só isso, GoReleaser também oferece embalagens! Então agora você pode criar facilmente DEBs e RPMs. Eu estava um passo mais perto do assustado apt-get install stampy. A única coisa que faltava era como criar um repositório APT. Esta última parte fundamental não é fácil, com certeza. Passei cerca de uma hora pensando em como auto-hospedar isso com GitHub Pages e, embora seja possível, era muito mais fácil usar apenas um serviço gratuito como o Packagecloud para lidar com a assinatura e hospedagem de repositório pelo baixo custo de $ 0 por mês?.

Você pode ver um exemplo de todo o fluxo de trabalho AQUI

Também incluirei uma versão simplificada dele aqui em um bloco de código, para qualquer um que se deparar com a própria postagem do blog.

Para uma visão geral de alto nível, o GHA faz o seguinte:

  • Escreve a configuração do GoReleaser
  • Executa o próprio Release
  • Carrega o .debs para o próximo trabalho
  • No trabalho encadeado, extraímos o .deb e o carregamos no PackageCloud
  • Feito!

Exemplo de ações do 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  /tmp/goreleaser-github.yaml
          project_name: EXAMPLE
          version: 2
          builds:
            - env: [CGO_ENABLED=0]
              goos:
                - linux
              goarch:
                - amd64
          nfpms:
            -
              maintainer: YOU 
              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/[email protected]
        with:
          package-name: ./*.deb
          packagecloud-username: USERNAME
          packagecloud-reponame: APP_NAME
          packagecloud-distro: ${{ matrix.distro }}
          packagecloud-token: ${{ secrets.PACKAGECLOUD_TOKEN }}




ℹ️ Importante

Você vai querer ter certeza de que coisas como a estrutura do programa e seu arquivo go.mod estão configurados corretamente, ou você terá problemas ao publicar seu aplicativo corretamente.

Nota lateral: você também pode distribuir seu aplicativo com Homebrew, mas não me preocupei devido à complexidade extra de GH Actions envolvendo segredos PAT e ao fato de que estou muito bem coberto com Apt, Yum, e Ensopado… saboroso! ?

Isso me leva à segunda grande coisa ao lançar um aplicativo. ?DOCUMENTATION? e o muito negligenciado Readme.md?!

Formatação Leiame

Existem alguns elementos que acho que qualquer leia-me decente deveria ter, pois eles ajudarão seu aplicativo a se destacar de todos os aplicativos com pouca ou nenhuma documentação ou, pior ainda, com documentação ruim.

Eu recomendo fortemente que você siga este formato para criar seu próprio leia-me! Sou um grande fã de emblemas para talento, mas sinto que ter uma pequena demonstração GIF realmente mostra às pessoas do que se trata, assim como listar capturas de tela de seus aplicativos GUI. Usar ASCIINEMA foi bastante fácil, e eles também têm um ótimo conversor GIF para deixar tudo perfeito.

? Dica

Como observação, pedi ao CodeGPT que me escrevesse alguns testes de unidade GoLang, que eu sei que normalmente são dolorosos de escrever. É um plugin fantástico se você estiver no pacote JetBrains.

Exemplo Leiame

  • Selos de teste
  • Demonstração GIF
  • Selos de cobertura
  • Go Boletim
  • Instalar
    • Gerenciador de pacotes (ex apt)
    • Instalação binária (ex eget)
    • Vá instalar recorte
  • Uso
    • INSTRUÇÕES CLARAS e exemplos de trechos de código
  • Configurações
    • Onde as configurações são salvas
    • Você usa arquivos INI, JSON, Env Vars?
  • Como acessar a ajuda integrada
  • Como construir o aplicativo a partir da fonte
  • Arte anterior (também conhecida como trabalho/inspiração anterior)

Concluir

Semelhante a quando comecei a aprender como publicar aplicativos Python, estou feliz em poder dizer que sinto que posso distribuir adequadamente qualquer aplicativo que escrever no GoLang daqui para frente. É uma habilidade interessante que aprendi e, com esta postagem no blog, espero que possa ajudar outras pessoas a fazer o mesmo! Saúde!

-Comedor de gelatina


? Mastodonte | ? E-mail | ? Comentários | ☕ Compre um café para mim

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/jelloeater/publishing-cli-apps-with-apt-yum-568c?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3