> 백엔드 개발 > Golang > CLI 앱 게시(Apt 및 YUM 사용)

CLI 앱 게시(Apt 및 YUM 사용)

Susan Sarandon
풀어 주다: 2024-10-05 06:10:30
원래의
886명이 탐색했습니다.

Publishing CLI Apps (with Apt & YUM)

소개

저는 최근 CLI 앱의 팬이 되었습니다. 어쩌면 그것은 내 어린 시절의 터미널(486/33의 DOS와 아버지의 오래된 Apple IIe로 시작)의 매력일 수도 있습니다. 나는 Gen X Commodore64 시대에 비해 너무 늦게 태어났지만 Windows 95보다 더 많은 것을 알게 된 시기였습니다. 다이얼 업과 56k 모뎀이 왕이었던 시절은 흥미로운 시대였습니다. 요즘 대부분의 블로그 게시물에는 SEO에 대한 단어 수를 추가하기 위한 소개가 포함되어 있다는 것을 알고 있지만, 요즘 많은 젊은 사람들이 GUI 앱만 알고 있는데 이것이 제가 여전히 CLI를 좋아하는 이유이기도 합니다. Z세대 아이들이 간단한 작업에도 터미널을 작동시키는 것을 보는 것보다 더 행복한 것은 없습니다. 이봐, Gen Alpha가 BBS가 무엇인지 알 때까지 기다리세요. “할아버지 컴퓨터” 그들은 아마도 ?라고 말할 것입니다. “GET OFF MY LAWN” ✊✊

CoolRetroTerm과 같은 프로젝트는 CLI에 대한 사랑을 다시 불러일으킬 수 있다는 점에서 제 마음속에 따뜻한 자리를 차지하고 있습니다. 나는 여전히 내 오래된 넷북에서 Micro로 블로그 활동을 하는 것을 선호합니다. 글쓰기에만 집중하겠습니다. VSCode ZenMode와 MarkText가 가까워진 것 같은데요?


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



로그인 후 복사

포장

어쨌든 빗나가네요…

그래서 작은 CLI 앱인 Stampy를 작성한 후 작은 문제에 부딪혔습니다. 어떻게 배포해야 할까요? 나는 적어도 Python 패키징의 무서운 분노를 피하기 위해 머리가 GoLang에서 작성한다고 생각할 만큼 똑똑했습니다(Python으로 빌드하고 싶었던 만큼). 저를 항상 당황하게 했던 것 중 하나는 사람들이 멋진 CLI 앱을 APT 및 YUM과 같은 멋진 패키지 관리 시스템에 게시하는 방법이었습니다.

일반적으로 앱을 빌드하려면 간단한 go build를 수행하면 됩니다. 그리고 붐, 인스턴트 바이너리. 로컬 개발에는 좋지만 크로스 플랫폼 컴파일에는 별로 좋지 않습니다. 이를 수행하는 방법을 보여주는 몇 가지 좋은 가이드가 있지만… 그래서 좀 더 조사해 보니 좋은 도구가 있어야 하더군요… 그런데 당연히 GoReleaser가 있습니다!

잘 작성된 문서를 읽은 후 쉽고 빠르게 로컬 크로스 플랫폼 빌드를 수행할 수 있었습니다.


goreleaser --snapshot --clean



로그인 후 복사

GitHub 릴리스에는 미리 작성된 멋진 GH Action이 있으므로 빌드를 수행하는 것도 쉬웠습니다!

이제 사용자는 eget(좋음) 및 스튜(훨씬 더 좋음)와 같은 도구를 사용하여 내 앱을 설치할 수 있습니다!

github.com/xxx를 설치할 수도 있지만 여기서 수행할 작업은 저장소를 복제하고 로컬로 빌드한 다음 $GOBIN 폴더에 저장소를 넣는 것뿐입니다. 적절한 패키지 관리 도구와 실제로 동일하지는 않지만 이미 Go를 설치한 사람들에게는 긴급하게 작동합니다. 일반 사용자 IMHO에게는 실제로 옵션이 아닙니다. ?

그뿐만 아니라 GoReleaser는 포장도 제공합니다! 이제 DEB와 RPM을 쉽게 만들 수 있습니다. 나는 겁에 질린 apt-get install stampy에 한 걸음 더 가까워졌습니다. 누락된 유일한 것은 APT 저장소를 생성하는 방법이었습니다. 이 마지막 핵심 부분은 확실히 쉽지 않습니다. GitHub Pages를 사용하여 이를 자체 호스팅하는 방법을 알아보는 데 한 시간 정도 소요되었으며, 가능하기는 하지만 Packagecloud와 같은 무료 서비스를 사용하여 당 $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 Actions 복잡성과 Apt로 꽤 잘 다루어지고 있기 때문에 신경쓰지 않았습니다. 냠냠, 그리고 찌개…맛있어요! ?

이것은 앱을 출시할 때 두 번째로 중요한 점입니다. ?문서? 그리고 많이 무시되는 Readme.md?!

읽어보기 형식 지정

괜찮은 Readme라면 갖춰야 할 몇 가지 요소가 있습니다. 문서가 거의 또는 전혀 없거나 심지어 잘못된 문서가 있어도 앱이 모든 앱 중에서 돋보일 수 있도록 도와주기 때문입니다.

자신만의 Readme를 작성하려면 이 형식을 따르는 것이 좋습니다! 저는 멋진 배지를 좋아하지만 GUI 앱의 스크린샷을 나열하는 것처럼 작은 GIF 데모를 통해 사람들에게 그 내용을 실제로 보여줄 수 있다고 생각합니다. ASCIINEMA를 사용하는 것은 충분히 쉬웠으며 모든 것을 올바르게 표시할 수 있는 멋진 GIF 변환기도 있습니다.

? 팁

부담으로 CodeGPT에서 GoLang 단위 테스트를 작성해 달라고 요청했는데, 일반적으로 작성하기 힘든 작업이었습니다. JetBrains 제품군을 사용한다면 환상적인 플러그인입니다.

읽어보기 예

  • 테스트 배지
  • GIF 데모
  • 취재 뱃지
  • 성적표 바로가기
  • 설치
    • 패키지 관리자(예: 적절)
    • 바이너리 설치(예: eget)
    • 스닙 설치하러 가기
  • 사용법
    • 명확한 지침 및 예제 코드 캡처
  • 설정
    • 설정이 저장되는 위치
    • INI 파일, JSON, Env Vars를 사용하시나요?
  • 내장 도움말에 액세스하는 방법
  • 소스에서 앱을 빌드하는 방법
  • 선행미술(일명 전작/영감)

마무리

Python 앱 게시 방법을 배우기 시작했을 때와 마찬가지로 앞으로 GoLang에서 작성하는 모든 앱을 제대로 배포할 수 있을 것 같다고 말할 수 있어서 기쁩니다. 이는 제가 익힌 훌륭한 기술이며, 이 블로그 게시물을 통해 다른 사람들도 같은 작업을 수행하는 데 도움이 되기를 바랍니다! 건배!

-젤로이터


? 마스토돈 | ? 이메일 | ? 댓글 | 😄 커피 한잔 사주세요

위 내용은 CLI 앱 게시(Apt 및 YUM 사용)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿