Skip to content

Release (manual, cgo, linux+mac) #14

Release (manual, cgo, linux+mac)

Release (manual, cgo, linux+mac) #14

Workflow file for this run

name: Release (manual, cgo, linux+mac)
on:
workflow_dispatch:
inputs:
tag:
description: 'Тег релиза (например v1.2.3)'
required: true
prerelease:
description: 'Отметить как prerelease'
type: boolean
default: false
jobs:
build-linux:
name: Build Linux (CGO)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.25.3'
- name: Install toolchains for CGO
run: |
set -eux
sudo apt-get update
sudo apt-get install -y build-essential pkg-config tar
# кросс-компилятор для linux/arm64
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# при необходимости внешние C-зависимости:
# sudo apt-get install -y libssl-dev
- name: Build (linux amd64/arm64) with CGO
env:
CGO_ENABLED: "1"
run: |
set -euxo pipefail
mkdir -p dist
# GOOS GOARCH CC
targets=(
"linux amd64 gcc"
"linux arm64 aarch64-linux-gnu-gcc"
)
for t in "${targets[@]}"; do
read -r GOOS GOARCH CCNAME <<<"$t"
BIN="tlss-${GOOS}-${GOARCH}"
echo "==> Building ${BIN} with CC=${CCNAME}"
CC="$CCNAME" GOOS="$GOOS" GOARCH="$GOARCH" CGO_ENABLED=1 \
go build -trimpath -ldflags="-s -w" -o "dist/${BIN}" .
ls -l "dist/${BIN}"
(cd dist && tar -czf "${BIN}.tar.gz" "${BIN}" && rm -f "${BIN}")
done
ls -l dist
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: bins-linux
path: dist/*
retention-days: 7
build-macos:
name: Build macOS arm64 (native CGO)
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.25.3'
# Если требуются внешние C-библиотеки (пример OpenSSL), раскомментируйте:
# - name: Install macOS deps
# run: |
# brew update
# brew install openssl@3 pkg-config
# echo "PKG_CONFIG_PATH=$(brew --prefix)/opt/openssl@3/lib/pkgconfig" >> $GITHUB_ENV
- name: Build darwin/arm64 with CGO (native)
env:
CGO_ENABLED: "1"
run: |
set -euxo pipefail
mkdir -p dist
BIN="tlss-darwin-arm64"
GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 \
go build -trimpath -ldflags="-s -w" -o "dist/${BIN}" .
(cd dist && tar -czf "${BIN}.tar.gz" "${BIN}" && rm -f "${BIN}")
ls -l dist
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: bins-macos
path: dist/*
retention-days: 7
release:
name: Create GitHub Release
runs-on: ubuntu-latest
needs: [build-linux, build-macos]
permissions:
contents: write
steps:
# 1) Гарантируем наличие тега БЕЗ checkout (через GitHub API)
- name: Ensure tag exists (via GitHub API)
uses: actions/github-script@v7
with:
script: |
const tag = '${{ inputs.tag }}';
const owner = context.repo.owner;
const repo = context.repo.repo;
// пробуем получить ref
try {
await github.rest.git.getRef({ owner, repo, ref: `tags/${tag}` });
core.info(`Tag ${tag} already exists`);
} catch (e) {
// создаём тег на текущий SHA workflow (ветка, откуда запустили)
const sha = process.env.GITHUB_SHA;
core.info(`Creating tag ${tag} at ${sha}`);
await github.rest.git.createRef({
owner, repo,
ref: `refs/tags/${tag}`,
sha
});
}
# 2) Скачиваем ВСЕ артефакты из предыдущих джобов в одну папку (на раннере)
- name: Download artifacts (merge)
uses: actions/download-artifact@v4
with:
pattern: bins-* # ваши имена артефактов
path: upload # локальная временная папка на раннере
merge-multiple: true
- name: List files
run: ls -l upload
# 3) Публикуем файлы как assets релиза
- name: Create Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ inputs.tag }}
name: ${{ inputs.tag }}
draft: false
prerelease: ${{ inputs.prerelease }}
files: upload/* # всё из временной папки
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}