"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Publicación de aplicaciones CLI (con Apt y YUM)

Publicación de aplicaciones CLI (con Apt y YUM)

Publicado el 2024-11-08
Navegar:837

Publishing CLI Apps (with Apt & YUM)

Introducción

Últimamente me he vuelto un gran fanático de las aplicaciones CLI. Tal vez sea el atractivo del terminal de mi infancia (comenzando con DOS en un 486/33 y el viejo Apple IIe de mi padre). Nací un poco tarde para la era Gen X Commodore64, pero justo a tiempo para saber más que solo Windows 95. Era una era interesante, cuando el acceso telefónico y los módems de 56k eran los reyes. Sé que la mayoría de las publicaciones de blogs en estos días tienen una introducción introductoria, para completar el recuento de palabras para SEO, pero esta es realmente la razón por la que todavía amo la CLI cuando muchos de los jóvenes en estos días solo conocen las aplicaciones GUI. Nada me hace más feliz que ver a los niños de la Generación Z encender la terminal, incluso para tareas simples. Hombre, espera hasta que Gen Alpha descubra qué es un BBS. “Las computadoras del abuelo” probablemente dirán?. “SALGA DE MI CÉSPED” ✊✊

Proyectos como CoolRetroTerm definitivamente tienen un lugar cálido en mi corazón, por recuperar el amor por CLI. Todavía prefiero escribir algunos de mis blogs en Micro en mi viejo Netbook, de verdad, concentrémonos en escribir. Supongo que VSCode ZenMode y MarkText se acercan.


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



Embalaje

De todos modos, estoy divagando…

Entonces, después de escribir mi pequeña aplicación CLI Stampy, me encontré con un pequeño problema: ¿cómo distribuirla? Al menos fui lo suficientemente inteligente como para pensar y escribirlo en GoLang (por mucho que quisiera simplemente compilarlo en Python) para evitar la temida ira de Python Packaging. Una cosa que siempre me ha dejado perplejo fue cómo la gente publica sus bonitas aplicaciones CLI en sofisticados sistemas de gestión de paquetes como APT y YUM.

Normalmente, para crear tu aplicación, simplemente harías una simple compilación. y boom, binario instantáneo. Por muy bueno que sea para el desarrollador local, no sirve de mucho para las compilaciones multiplataforma. Hay algunas guías interesantes que le muestran cómo hacerlo, pero... tl;dr para mi ??. Así que investigué un poco más, tenía que haber una buena herramienta... y claro, ¡existe GoReleaser!

Después de leer documentación muy bien escrita, pude realizar una compilación multiplataforma local rápida y sencilla.


goreleaser --snapshot --clean



¡Conseguir que se realicen compilaciones con las versiones de GitHub también fue fácil, ya que tienen bonitas acciones de GH preescritas!

¡Los usuarios ahora pueden simplemente instalar mi aplicación con herramientas como eget (bueno) y estofado (mucho mejor)!

Si bien también puedes instalar github.com/xxx, todo lo que esto haría es clonar el repositorio, compilarlo localmente y colocar el contenedor en tu carpeta $GOBIN. En realidad, no es lo mismo que una herramienta de administración de paquetes adecuada, pero funciona en caso de necesidad para las personas que ya tienen Go instalado . Realmente no es una opción para el usuario promedio en mi humilde opinión. ?

Y no solo eso, ¡GoReleaser también ofrece empaques! Ahora puedes crear DEB y RPM fácilmente. Estaba un paso más cerca del asustado apt-get install stampy. Lo único que faltaba era cómo crear un repositorio APT. Esta última parte clave no es fácil con seguridad. Pasé aproximadamente una hora investigando cómo alojar esto yo mismo con GitHub Pages y, si bien es factible, fue mucho más fácil usar un servicio gratuito como Packagecloud para manejar la firma y el alojamiento del repositorio por el bajo costo de $0 por ¿mes?.

Puedes ver un ejemplo de todo el flujo de trabajo AQUÍ

También incluiré una versión simplificada aquí en un bloque de código, para cualquiera que encuentre la publicación del blog.

Para obtener una descripción general de alto nivel, la GHA hace lo siguiente:

  • Escribe la configuración de GoReleaser
  • Ejecuta el Liberador mismo
  • Sube los .debs para el siguiente trabajo
  • En el trabajo encadenado, extraemos el .deb y lo subimos a PackageCloud
  • ¡Hecho!

Ejemplo de acciones de 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

Querrás asegurarte de que aspectos como la estructura del programa y tu archivo go.mod estén configurados correctamente, o tendrás problemas para publicar tu aplicación correctamente.

Nota al margen: también puedes distribuir tu aplicación con Homebrew, pero no me molesté debido a la complejidad adicional de las acciones de GH que involucran secretos PAT y al hecho de que estoy bastante bien cubierto con Apt, Mmm, y Estofado… ¡sabroso! ?

Esto me lleva a la segunda cosa importante al lanzar una aplicación. ?DOCUMENTACIÓN? y el muy olvidado Readme.md?!

Formato Léame

Hay algunos elementos que creo que cualquier archivo Léame decente debería tener, ya que ayudarán a que tu aplicación se destaque de todas las aplicaciones con poca o ninguna documentación, o peor aún, con mala documentación.

¡Te recomiendo encarecidamente que sigas este formato para crear tu propio archivo Léame! Soy un gran admirador de las insignias con estilo, pero siento que tener una pequeña demostración de GIF realmente muestra a la gente de qué se trata, al igual que enumerar capturas de pantalla de sus aplicaciones GUI. Usar ASCIINEMA fue bastante fácil y también tienen un buen conversor de GIF para que todo luzca perfecto.

? Consejo

Como nota al margen, pedí que CodeGPT me escribiera algunas pruebas unitarias de GoLang, que sé que normalmente son difíciles de escribir. Es un complemento fantástico si estás en la suite JetBrains.

Ejemplo Léame

  • Insignias de prueba
  • Demostración GIF
  • Insignias de cobertura
  • Ir boleta de calificaciones
  • Instalar
    • Administrador de paquetes (ex apto)
    • Instalación binaria (ex eget)
    • Ir a instalar el recorte
  • Uso
    • INSTRUCCIONES CLARAS y fragmentos de código de ejemplo
  • Ajustes
    • Dónde se guardan las configuraciones
    • ¿Utiliza archivos INI, JSON, Env Vars?
  • Cómo acceder a la ayuda integrada
  • Cómo crear la aplicación desde el código fuente
  • Arte anterior (también conocido como trabajo anterior/inspiración)

Envolver

Al igual que cuando me propuse aprender a publicar aplicaciones Python, me alegra poder decir que siento que puedo distribuir adecuadamente cualquier aplicación que escriba en GoLang en el futuro. Es una gran habilidad que adquirí y, con esta publicación de blog, espero que pueda ayudar a otros a hacer lo mismo. ¡Salud!

-Come gelatina


? Mastodonte | ? Correo electrónico | ? Comentarios | ☕ Invítame un café

Declaración de liberación Este artículo se reproduce en: https://dev.to/jelloeater/publishing-cli-apps-with-apt-yum-568c?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3