نحوه انتشار به Homebrew با Goreleaser ، Actions Github و انتشار معنایی

در این مقاله شما را از طریق فرآیند خودکار سازی نسخه های پروژه GO خود با اقدامات GoreLeaser و GitHub راهنمایی می کند. برچسب ها با انتشار معنایی تولید می شوند. همه اینها به هم گره خورده اند ، بنابراین هر ادغام به Main به طور خودکار با یک تغییر خودکار ایجاد می شود و سپس می تواند از طریق شیر آب خانگی نصب شود.
1. تنظیمات GitHub تنظیم
اولین چیزی که شما نیاز دارید یک مخزن دوم GitHub برای ذخیره فرمول Homebrew است. نام این باید با شروع شود homebrew-
(این در اینجا بیشتر توضیح داده شده است). من فرمی را توصیه می کنم که نام پروژه فعلی شما باشد و فقط آماده شود homebrew-
به آن
به عنوان مثال ، من دارم github.com/hadlow/gopublish
وت github.com/hadlow/homebrew-gopublish
بشر
2. نشانه های دسترسی را ایجاد کنید
نکته بعدی تنظیم این است که نشانه دسترسی شخصی GitHub شما است. این مورد برای انتشار معنایی و GoreLeaser برای ایجاد برچسب ، فشار فایل و غیره استفاده می شود.
برای ایجاد یک نشانه ، به GitHub بروید و روی عکس پروفایل خود ، در سمت راست بالا کلیک کنید. سپس به تنظیمات و سپس تنظیمات توسعه دهنده در سمت چپ بروید. سپس بر روی نشانه های دسترسی شخصی و نشانه های ریز دانه کلیک کنید ، سپس New Token تولید کنید.
نشانه خود را چیزی توصیفی نامگذاری کنید. من با GH_TOKEN_GO_PUBLISH
بشر اکنون به پایین بروید و به مخزن اصلی و هم دسترسی پیدا کنید homebrew-
مخزن
برای مجوزها از موارد زیر استفاده می کنم:
- اقدامات: بخوانید و بنویسید
- وضعیت تعهد: بخوانید و بنویسید
- مطالب: بخوانید و بنویسید
- استقرار: بخوانید و بنویسید
- محیط: فقط خواندنی
- اسرار: فقط خواندنی
- متغیرها: فقط خواندنی
اکنون می توانید پیش بروید و نشانه را ایجاد کنید. این نشانه را کپی کنید زیرا در مرحله بعدی به آن احتیاج خواهیم داشت.
3. نشانه دسترسی را به محیط اضافه کنید
به تنظیمات مخزن خود بروید و به محیط ها بروید. یک محیط جدید به نام “انتشار” ایجاد کنید و یک راز محیط را اضافه کنید. آن را صدا کنید GH_TOKEN
و در نشانه دسترسی خود ایجاد شده در مرحله قبل چسبانده شوید.
4. انتشار معنایی را اضافه کنید
قبل از افزودن انتشار معنایی ، به یک پرونده اقدامات GitHub نیاز خواهیم داشت. پرونده ای به نام Reselle.yml ایجاد کنید و آن را در مخزن اصلی خود در فهرست .github/گردش کار قرار دهید. چسباندن در زیر:
name: release
on:
push:
branches:
- main
jobs:
main:
runs-on: ubuntu-latest
environment:
name: Release
steps:
- name: Checkout
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Semantic Release
uses: cycjimmy/semantic-release-action@v4
with:
extra_plugins: |
@semantic-release/git
@semantic-release/exec
@semantic-release/changelog
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Run GoReleaser
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.GH_TOKEN }}
run: |
curl -sL https://git.io/goreleaser | bash
بعد ، در ریشه repo خود ، پرونده ای به نام ایجاد کنید .releaserc.json
و چسباندن در:
{
"branches": ["main"],
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
"@semantic-release/github",
[
"@semantic-release/git",
{
"assets": ["CHANGELOG.md"],
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
]
]
}
5. Goreleaser را پیکربندی کنید
بعد می خواهیم پیکربندی GoreLeaser را اضافه کنیم. یک پرونده در ریشه repo خود ایجاد کنید .goreleaser.yaml
بشر چسباندن در زیر:
version: 2
project_name:
before:
hooks:
# You may remove this if you don't use go modules.
- go mod tidy
# you may remove this if you don't need go generate
- go generate ./...
builds:
- env:
- CGO_ENABLED=0
goos:
- linux
- windows
- darwin
archives:
- format: tar.gz
name_template: >-
{{ .ProjectName }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
{{- if .Arm }}v{{ .Arm }}{{ end }}
# use zip for windows archives
format_overrides:
- goos: windows
format: zip
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
brews:
-
name:
commit_author:
name:
email:
commit_msg_template: "Brew formula update for {{ .ProjectName }} version {{ .Tag }}"
directory: Formula
description: " DESCRIPTION>"
license: " LICENSE>"
install: |
bin.install ""
test: |
system "#{bin}/ --version"
# Repository to push the generated files to.
repository:
owner:
name: homebrew-
branch: main
token: "{{ .Env.GITHUB_TOKEN }}"
در صورت لزوم همه متغیرها را به روز کنید.
6. فشار را فشار دهید
اکنون می توانید این تغییرات را مرتکب و فشار دهید. شما باید چیزی را در برگه اقدامات خود مشاهده کنید. به این مراحل نگاهی بیندازید ، آنها باید در حال ساخت و انتشار برنامه GO شما باشند.
اکنون نگاهی به repo خود بیندازید ، باید یک برچسب ایجاد شده توسط انتشار معنایی داشته باشد.
و بعد ، در خود homebrew-
repo ، شما باید یک پوشه فرمول را ببینید.
7. نصب برنامه ما
برای نصب ، دستور HomeBrew TAP را با استفاده از قالب اجرا کنید brew tap
، برای این مثال چیزی شبیه به این است:
brew tap hadlow/gopublish
شما باید خروجی را ببینید که چیزی شبیه به این است:
==> Tapping hadlow/gopublish
Cloning into '/opt/homebrew/Library/Taps/hadlow/homebrew-gopublish'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 12 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (12/12), done.
Resolving deltas: 100% (2/2), done.
Tapped 2 formulae (14 files, 9.8KB).
سپس می توانیم با:
brew install gopublish
که سپس به ما می دهد:
==> Fetching hadlow/gopublish/gopublish
==> Downloading https://github.com/hadlow/gopublish/releases/download/v1.0.1/gopublish_Darwin_arm64.tar.gz
==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2e65be/92130980
################################################################################################### 100.0%
==> Installing gopublish from hadlow/gopublish
🍺 /opt/homebrew/Cellar/gopublish/1.0.1: 5 files, 1.5MB, built in 0 seconds
==> Running `brew cleanup gopublish`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
سپس وقتی من GOPublish را اجرا می کنم ، کار می کند!
> gopublish
Hello, world
پیچیدن
و این تقریباً همین است. شما می توانید همه این موارد را متناسب با نیازهای خود اصلاح کنید ، اما من می خواستم آن را تا حد امکان ساده نگه دارم به خاطر آسانتر کردن این راهنما.
اگر سوالی دارید ، خوشحال می شوم که در نظرات به آنها پاسخ دهم!