介绍
无论您是编写了CLI还是HTTP服务器,大多数时候,GO代码都可以汇编为静态二进制,该静态二进制是独立的,可以在您指定的目标系统上运行。在先前的一章中,我们介绍了交叉补偿,此时您应该考虑是否需要针对一个Windows,Linux或MacOS或多个环境。
。发布示例
Release-it Repo是可以通过GitHub Action构建和释放静态GO二进制的示例。它使用makefile,因此也可以在其他CI管道中或在创建新版本时手动运行。 Makefile具有以下属性,所有这些属性都已在前几章中涵盖:
•它为多个平台和操作系统构建了二进制文件
•它将git的提交和版本注入最终二进制
Version := $(shell git describe --tags --dirty)
# Version := "dev"
GitCommit := $(shell git rev-parse HEAD)
LDFLAGS := "-s -w -X main.Version=$(Version) -X main.GitCommit=$(GitCommit)"
.PHONY: all
all: gofmt dist
.PHONY: gofmt
gofmt:
@test -z $(shell gofmt -l ./ | tee /dev/stderr) || (echo "[WARN] Fix formatting issues
↪
with 'make fmt'" && exit 1)
.PHONY: dist
dist:
mkdir -p bin/
CGO_ENABLED=0 GOOS=linux go build -mod=vendor -a -ldflags $(LDFLAGS) -installsuffix cgo
↪
-o bin/release-it-amd64
CGO_ENABLED=0 GOOS=darwin go build -mod=vendor -a -ldflags $(LDFLAGS) -installsuffix cgo
↪
-o bin/release-it-darwin
GOARM=7 GOARCH=arm CGO_ENABLED=0 GOOS=linux go build -mod=vendor -a -ldflags $(LDFLAGS)
↪
-installsuffix cgo -o bin/release-it-arm
GOARCH=arm64 CGO_ENABLED=0 GOOS=linux go build -mod=vendor -a -ldflags $(LDFLAGS)
↪
-installsuffix cgo -o bin/release-it-arm64
GOOS=windows CGO_ENABLED=0 go build -mod=vendor -a -ldflags $(LDFLAGS) -installsuffix cgo
↪
-o bin/release-it.exe
此外,它运行了GOFMT。
如果项目中有任何单位测试,那么我们可以为其添加一个其他目标,例如:
.PHONY: gotest
gotest:
go test ./...
然后将所有行更新为GOFMT GOTEST DIST,它将为我们运行每个任务。
克隆示例并构建它:
$ mkdir $GOPATH/src/github.com/alexellis/
$ cd $GOPATH/src/github.com/alexellis/
$ git clone https://github.com/alexellis/release-it
$ cd release-it
$ make
默认情况下,Make将尝试运行所有目标,但是如果您想在进行构建之前测试格式,也可以使用run make gofmt
。您会在垃圾箱/文件夹中找到每个二进制文件,如果它与OS/ Architecture对匹配,则可以在系统上运行它们,或将其复制到另一个系统以在此处运行。当您向用户释放二进制文件时,GitHub的释放功能可能会派上用场,因为它允许您手动上传二进制文件或通过自动化。
用github动作释放二进制文件
github操作可以免费用于开源存储库(即公共存储库),并提供许多免费分钟的私人时间。此示例应适用于其他平台,例如Jenkins或Gitlab CI,因为这些概念基本相同。
在我们的示例中,我们将首先从github签署版本标签的代码,然后运行全部,然后将释放工件上传到github版本。
name: publish
on:
push:
tags:
- '*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
fetch-depth: 1
- name: Make all
run: make all
- name: Upload release binaries
uses: alexellis/upload-assets@0.2.2
env:
GITHUB_TOKEN: ${{ github.token }}
with:
asset_paths: '["./bin/release-it*"]'
工作流文件中的每个步骤都可以使用特定的github操作,例如Alexellis/upload-assets@0.2.2或Action/Checkout@Master,但是当您将该字段留空时,它会使用诸如Ubuntu-latest的基本系统。在基本的Ubuntu Runner上,您可以执行标准外壳,并构建所有制作命令。 Alexellis/upload-Assets操作是我在我维护的所有OSS项目上构建的操作,并允许上传许多文件。
然后,用户可以继续下载您的二进制文件并在其系统上运行。
例如:
$ cd /tmp/
$ curl -sLSf \
-o ./release-it \
https://github.com/alexellis/release-it/releases/download/0.2.11/release-it-darwin \
&& chmod +x ./release-it \
&& ./release-it
release-it: 0.2.11, commit: 4379cbf694c55bd98f5080d76ac5972fd89dcc65