setup gox
gox๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ค.
Gox - Simple Go Cross Compilation
๋ค์ ์น์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ์.
project ํด๋์์ ๋ค์์ ์คํํ๋ค.
Copy go get github.com/mitchellh/gox@v1.0.1
go.mod์ ๋ด์ฉ์ด ์ถ๊ฐ๋๊ฑธ ํ์ธํ ์ ์๋ค.
์ด์ ci/cd์์ ์ด ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ฒ ํด์ฃผ๋ฉด๋๋ค.
vi tools.go
Copy //go:build tools
// +build tools
package main
// These imports are to force `go mod tidy` not to remove that tools we depend
// on development. This is explained in great detail in
// https://marcofranssen.nl/manage-go-tools-via-go-modules/
import (
_ "github.com/mitchellh/gox"
)
build
make ํ์ผ์ ์ฌ์ฉํด์ ๋น๋๋ฅผ ํด๋ณด์.
ํ๋ก์ ํธ์ Makefile์ ๋ง๋ค์.
vi Makefile
Copy PROJECT_NAME := jiractl
.PHONY: setup clean build-binaries
setup: clean
$Q mkdir -p bin/
$Q go mod tidy
# From https://marcofranssen.nl/manage-go-tools-via-go-modules/
@cat tools.go | \
grep _ | \
awk -F'"' '{print $$2}' | \
GOBIN=$(CURDIR)/bin xargs -tI % go install %
clean:
$Q rm -rf bin/*
BUILD_PLATFORMS ?= -os '!netbsd' -os '!openbsd'
build-binaries: setup
# Building $(PROJECT_NAME) for $(BUILD_PLATFORMS)
${CURDIR}/bin/gox $(BUILD_PLATFORMS) \
-output="bin/binaries/$(PROJECT_NAME)-{{.OS}}-{{.Arch}}" .
clean -> setup -> build-binaries ๋ก ๋์ํ๋ค.
make build-binaries๋ฅผ ํ๋ฉด ํจํค์ง๋ฅผ ๋น๋ํ๋ค.
ci/cd setup
.gitlab-ci.yml
Copy variables:
GO_VERSION: '1.18.5'
# See https://docs.gitlab.com/ee/user/packages/generic_packages/#publish-a-package-file
PACKAGE_REGISTRY_URL: '$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/jiractl'
image: golang:${GO_VERSION}
.binaries: &binaries
image: golang:1.18
rules:
- if: '$CI_COMMIT_TAG'
stage: build
script:
- export platforms=$(echo $CI_JOB_NAME | sed 's|binaries ||')
- make build-binaries BUILD_PLATFORMS="-osarch='$platforms'"
artifacts:
paths:
- app/bin/binaries
expire_in: 7d
binaries darwin/amd64: *binaries
binaries darwin/arm64: *binaries
binaries freebsd/386 freebsd/amd64 freebsd/arm: *binaries
binaries linux/386 linux/amd64 linux/arm linux/arm64 linux/ppc64le: *binaries
binaries windows/386 windows/amd64:
extends: .binaries
yaml yank๋ฅผ ์ด์ฉํด์ yaml์ ์ค์ฟ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ *binaries์ ์์ binary๋ฅผ ๋ค ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
binaries darwin/amd64
์ด๊ฒ ์์
์ด๋ฆ์ธ๋ฐ ์ด๊ฒ์ค์ darwin/amd64๋ฅผ ๊ฐ์ ธ์์ ๊ทธ๊ฑธ make์ ๋ณด๋ด์ฃผ๋ฉด make๊ฐ ๋น๋๋ฅผ ํ๋ ๊ตฌ์กฐ์ด๋ค.
artifact๋ฅผ ์ด์ฉํ์ฌ ์ ์ฅ์ ํด๋๋๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํด๋๋ฉด ui์์ ๋ค์ด๋ก๋๋ฅผ ๋ฐ์์ ์๋ค.
upload artifact to package & registries
vi .gitlab-ci.yml
Copy upload binaries to generic package for tag:
stage: publish
image: curlimages/curl:latest
needs:
- 'binaries darwin/amd64'
- 'binaries darwin/arm64'
- 'binaries freebsd/386 freebsd/amd64 freebsd/arm'
- 'binaries linux/386 linux/amd64 linux/arm linux/arm64 linux/ppc64le'
- 'binaries windows/386 windows/amd64'
rules:
- if: '$CI_COMMIT_TAG'
script:
- cd app/bin/binaries/
- |
for FILE in *; do
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${FILE} ${PACKAGE_REGISTRY_URL}/${CI_COMMIT_TAG}/${FILE} ;
done
์๊น ์ค์ ํด๋ variable ์ ์ฌ์ฉํ๋ค.
Copy PACKAGE_REGISTRY_URL: '$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/jiractl'
for๋ฌธ์ ๋๋ฉด์ ํ์ผ์ ์
๋ก๋ํ๋ค.
์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํจํค์ง์ ์
๋ก๋ ๋จ์ ์์์๋ค.
release
vi .gitlab-ci.yml
์ผ๋จ git์ ๋ก๊ทธ๋ฅผ ์ฝ์ด์์ description์ด๋ผ๋ ํ๊ฒฝ๋ณ์ ์ฌ์ฉํด์ผํ๋ฏ๋ก ํ์ผ์ ์ ์ด๋ํ artifact์ ์ถ๊ฐํด์ค๋ค. ๋์ค์ $DESCRIPTION ์ด๋ฌ๋ฉด ๋ค๋ฅธ ์์
์์ ์ฌ์ฉํ ์ ์๋ค.
Copy generate_description:
# generate_description needs to run in a previous stage before release
stage: publish
rules:
- if: '$CI_COMMIT_TAG'
script:
# generate description from annotated tag's subject
- echo "DESCRIPTION=$(git log $(git describe --tags --abbrev=0 HEAD^)..HEAD --pretty=format:'At %ci, %cN committed %h - %s' --decorate --graph)" > description.env
- cat description.env
artifacts:
reports:
dotenv: description.env
์ด์ release๋ฅผ ์์ฑํ์ file์ ๋งํฌ๋ก ์ก์์ ์ฌ๋ ค์ฃผ๋ฉด ๋๋ค.
Copy release-from-tag:
image: registry.gitlab.com/gitlab-org/release-cli
stage: release
needs:
- 'upload binaries to generic package for tag'
- 'generate_description'
rules:
- if: '$CI_COMMIT_TAG' # Run this job when a tag is created manually
script:
- echo "Creating a release for $CI_COMMIT_TAG"
- echo "$DESCRIPTION"
release:
name: 'Release $CI_COMMIT_TAG'
description: '$DESCRIPTION'
tag_name: '$CI_COMMIT_TAG'
ref: '$CI_COMMIT_TAG'
assets:
links:
- name: 'darwin/amd64'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-darwin-amd64'
filepath: '/app/bin/binaries/jiractl-darwin-amd64'
- name: 'darwin/arm64'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-darwin-arm64'
filepath: '/app/bin/binaries/jiractl-darwin-arm64'
- name: 'freebsd/386'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-freebsd-386'
filepath: '/app/bin/binaries/jiractl-freebsd-386'
- name: 'freebsd/amd64'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-freebsd-amd64'
filepath: '/app/bin/binaries/jiractl-freebsd-amd64'
- name: 'freebsd/arm'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-freebsd-arm'
filepath: '/app/bin/binaries/jiractl-freebsd-arm'
- name: 'linux/386'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-linux-386'
filepath: '/app/bin/binaries/jiractl-linux-386'
- name: 'linux/amd64'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-linux-amd64'
filepath: '/app/bin/binaries/jiractl-linux-amd64'
- name: 'linux/arm'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-linux-arm'
filepath: '/app/bin/binaries/jiractl-linux-arm'
- name: 'linux/arm64'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-linux-arm64'
filepath: '/app/bin/binaries/jiractl-linux-arm64'
- name: 'linux/ppc64le'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-linux-ppc64le'
filepath: '/app/bin/binaries/jiractl-linux-ppc64le'
- name: 'windows/386'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-windows-386.exe'
filepath: '/app/bin/binaries/jiractl-windows-386.exe'
- name: 'windows/amd64'
url: '$PACKAGE_REGISTRY_URL/$CI_COMMIT_TAG/jiractl-windows-amd64.exe'
filepath: '/app/bin/binaries/jiractl-windows-amd64.exe'
๋ค์์ฒ๋ผ release๊ฐ ์๊ธด๊ฒ์ ์์ ์๋ค.
์์ฑ