„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Veröffentlichen von CLI-Apps (mit Apt & YUM)

Veröffentlichen von CLI-Apps (mit Apt & YUM)

Veröffentlicht am 08.11.2024
Durchsuche:213

Publishing CLI Apps (with Apt & YUM)

Einführung

Ich bin in letzter Zeit ein großer Fan von CLI-Apps geworden. Vielleicht ist es der Reiz des Terminals meiner Kindheit (angefangen mit DOS auf einem 486/33 und dem alten Apple IIe meines Vaters). Ich wurde etwas zu spät für die Commodore64-Ära der Generation Ich weiß, dass die meisten Blog-Beiträge heutzutage Einleitungsfloskeln haben, um die Wortzahl für SEO zu reduzieren, aber das ist wirklich der Grund, warum ich die CLI immer noch liebe, wenn heutzutage so viele jüngere Leute nur GUI-Apps kennen. Nichts macht mich glücklicher, als zu sehen, wie Kinder der Generation Z das Terminal starten, selbst für einfache Aufgaben. Mann, warte, bis Gen Alpha herausfindet, was ein BBS ist. „Opa-Computer“ werden sie wahrscheinlich sagen? „Raus von meinem Rasen“ ✊✊

Projekte wie CoolRetroTerm haben definitiv einen warmen Platz in meinem Herzen, weil sie die CLI-Liebe zurückbringen. Ich blogge immer noch lieber in Micro auf meinem alten Netbook, damit Sie sich wirklich auf das Schreiben konzentrieren können. VSCode ZenMode und MarkText kommen mir nahe, denke ich?


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



Verpackung

Wie auch immer, ich schweife ab…

Nachdem ich meine kleine CLI-App Stampy geschrieben hatte, stieß ich auf ein kleines Problem: Wie soll ich sie verteilen? Ich war zumindest schlau genug, mir einen Kopf auszudenken und ihn in GoLang zu schreiben (so sehr ich ihn auch einfach in Python erstellen wollte), um dem gefürchteten Zorn der Python-Verpackung zu entgehen. Eine Sache, die mich immer verblüfft hat, war, wie Leute ihre netten CLI-Apps in schicken Paketverwaltungssystemen wie APT und YUM veröffentlichen.

Normalerweise würden Sie zum Erstellen Ihrer App einfach einen einfachen Go-Build ausführen. und boom, sofortige Binärdatei. So großartig das auch für lokale Entwickler ist, für plattformübergreifende Kompilierungen nützt es nicht viel. Es gibt einige nette Anleitungen, die Ihnen zeigen, wie es geht, aber ... was soll's für meine ???. Also habe ich noch ein bisschen gestöbert, es musste ein nettes Werkzeug sein … und zum Teufel gibt es GoReleaser!

Nachdem ich einige sehr gut geschriebene Dokumentationen durchgelesen hatte, war ich in der Lage, ganz einfach einen schnellen lokalen plattformübergreifenden Build durchzuführen.


goreleaser --snapshot --clean



Builds mit GitHub-Releases umzusetzen war ebenfalls einfach, da sie über nette vorab geschriebene GH-Aktionen verfügen!

Benutzer können meine App jetzt einfach mit Tools wie Eget (gut) und Stew (viel besser) installieren!

Sie können zwar auch github.com/xxx installieren, dazu müssten Sie lediglich das Repo klonen, es lokal erstellen und die Bin in Ihrem $GOBIN-Ordner ablegen. Nicht wirklich dasselbe wie ein richtiges Paketverwaltungstool, funktioniert aber zur Not für Leute, die Go bereits installiert haben. Für den durchschnittlichen Benutzer meiner Meinung nach keine wirkliche Option. ?

Und nicht nur das, GoReleaser bietet auch Verpackungen an! Jetzt können Sie ganz einfach DEBs und RPMs erstellen. Ich war dem verängstigten apt-get install stampy einen Schritt näher gekommen. Es fehlte nur noch, wie man ein APT-Repo erstellt. Dieser letzte wichtige Teil ist sicherlich nicht einfach. Ich habe ungefähr eine Stunde damit verbracht, herauszufinden, wie ich das mit GitHub Pages selbst hosten kann, und obwohl es machbar ist, war es weitaus einfacher, einfach einen kostenlosen Dienst wie Packagecloud zu nutzen, um das Signieren und Repo-Hosting zu den geringen Kosten von 0 $ pro Stück zu übernehmen Monat?.

Ein Beispiel des gesamten Workflows können Sie HIER sehen

Ich werde hier auch eine abgespeckte Version davon in einen Codeblock einfügen, für alle, die über den Blog-Beitrag selbst stolpern.

Für einen allgemeinen Überblick führt die GHA Folgendes durch:

  • Schreibt die GoReleaser-Konfiguration aus
  • Führt den Releaser selbst aus
  • Ladet die .debs für den nächsten Job hoch
  • Im verketteten Job rufen wir die .deb ab und laden sie in PackageCloud hoch
  • Erledigt!

Beispiel für GitHub-Aktionen


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 }}




ℹ️ Wichtig

Sie sollten sicherstellen, dass Dinge wie die Programmstruktur und Ihre go.mod-Datei ordnungsgemäß eingerichtet sind. Andernfalls treten Probleme bei der ordnungsgemäßen Veröffentlichung Ihrer App auf.

Randbemerkung: Sie können Ihre App auch mit Homebrew verteilen, aber ich habe mich nicht darum gekümmert, da die GH-Aktionen mit PAT-Geheimnissen zusätzlich komplex sind und ich mit Apt ziemlich gut vertraut bin. Lecker und Eintopf… lecker! ?

Das führt mich zum großen zweiten Punkt bei der Veröffentlichung einer App. ?DOKUMENTATION? und die viel vernachlässigte Readme.md?!

Readme-Formatierung

Es gibt ein paar Elemente, die meiner Meinung nach in jeder anständigen Readme-Datei enthalten sein sollten, da sie dazu beitragen, dass sich Ihre App von allen Apps mit wenig oder gar keiner Dokumentation oder, noch schlimmer, schlechter Dokumentation abhebt.

Ich empfehle Ihnen dringend, dieses Format für die Erstellung Ihrer eigenen Readme-Datei zu befolgen! Ich bin ein großer Fan von Abzeichen für Flair, aber ich habe das Gefühl, dass eine kleine GIF-Demo den Leuten wirklich zeigt, worum es geht, genau wie das Auflisten von Screenshots Ihrer GUI-Apps. Die Verwendung von ASCIINEMA war recht einfach und sie haben auch einen schönen GIF-Konverter, damit alles genau richtig aussieht.

? Tipp

Als Randbemerkung habe ich mir von CodeGPT einige GoLang-Unit-Tests schreiben lassen, von denen ich weiß, dass das Schreiben normalerweise mühsam ist. Es ist ein fantastisches Plugin, wenn Sie die JetBrains-Suite nutzen.

Readme-Beispiel

  • Testabzeichen
  • GIF-Demo
  • Abdeckungsabzeichen
  • Zeugnis gehen
  • Installieren
    • Paketmanager (ex apt)
    • Binärinstallation (ex eget)
    • Los, Snip installieren
  • Verwendung
    • KLARE ANWEISUNGEN und Beispielcodeausschnitte
  • Einstellungen
    • Wo Einstellungen gespeichert werden
    • Verwenden Sie INI-Dateien, JSON, Env Vars?
  • So greifen Sie auf die integrierte Hilfe zu
  • So erstellen Sie die App aus dem Quellcode
  • Stand der Technik (auch bekannt als frühere Arbeit/Inspiration)

Einpacken

Ähnlich wie damals, als ich lernen wollte, wie man Python-Apps veröffentlicht, bin ich froh, sagen zu können, dass ich das Gefühl habe, dass ich in Zukunft jede App, die ich in GoLang schreibe, ordnungsgemäß verteilen kann. Es ist eine nette Fähigkeit, die ich mir angeeignet habe, und ich hoffe, dass ich mit diesem Blogbeitrag anderen dabei helfen kann, dasselbe zu tun! Prost!

-Jelloeater


? Mastodon | ? E-Mail | ? Kommentare | ☕ Kauf mir einen Kaffee

Freigabeerklärung Dieser Artikel ist reproduziert unter: https://dev.to/jelloeater/publishing-ci-apps-with-apt-yum-568c?1 Wenn es zu Verstößen gibt, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3