Skip to content

Commit

Permalink
build(humanlog): make the pro build publish without goreleaser
Browse files Browse the repository at this point in the history
  • Loading branch information
aybabtme committed Nov 9, 2024
1 parent 6ba0cdc commit 828af35
Show file tree
Hide file tree
Showing 4 changed files with 348 additions and 12 deletions.
77 changes: 65 additions & 12 deletions .github/workflows/release-dev-pro.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,34 +11,87 @@ permissions:

jobs:
build:
name: "build"
strategy:
matrix:
go: [stable]
os:
- ubuntu-latest
- macos-latest
arch:
- arm64
- amd64
runs-on: ${{ matrix.os }}
targets:
- name: linux-amd64
runner: ubuntu-latest
goos: linux
goarch: amd64
# - name: linux-arm64
# runner: ubuntu-latest
# goos: linux
# goarch: arm64
# goenvs: CC=aarch64-linux-gnu-gcc CXX=x86_64-linux-gnu-g++
# preinstall: sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
- name: darwin-amd64
runner: macos-latest
goos: darwin
goarch: amd64
- name: darwin-arm64
runner: macos-latest
goos: darwin
goarch: arm64
name: ${{ matrix.targets.name }}
runs-on: ${{ matrix.targets.runner }}
env:
GOPRIVATE: "github.com/humanlogio/humanlog-pro"
GH_ACCESS_TOKEN_FOR_HUMANLOGPRO: ${{ secrets.GH_ACCESS_TOKEN_FOR_HUMANLOGPRO }}
GOARCH: ${{ matrix.arch }}
CGO_ENABLED: 1
GOBIN: /usr/local/bin/
steps:
- name: Set up Go 1
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go }}
go-version: stable
cache: true
- uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ matrix.targets.preinstall != '' }}
run: ${{ matrix.targets.preinstall }}
- run: echo "${HOME}/.humanlog/bin" >> $GITHUB_PATH
- run: curl https://humanlog.io/install_apictl.sh | bash
- run: git config --global --add safe.directory '*'
- run: git config --global url.https://[email protected]/.insteadOf https://github.com/
- run: go install github.com/goware/modvendor@latest
- run: go mod vendor
- run: modvendor -copy="**/*.a **/*.h" -v
- run: go build -tags pro -o /tmp/humanlog-${{ matrix.os }}-${{ matrix.arch }} ./cmd/humanlog
- run: mkdir -p dist/${{ matrix.targets.goos }}-${{ matrix.targets.goarch }}
- run: ${{ matrix.targets.goenvs }} ./script/build.sh
env:
HUMANLOG_GOTAGS: pro
GOOS: ${{ matrix.targets.goos }}
GOARCH: ${{ matrix.targets.goarch }}
- uses: actions/upload-artifact@v4
with:
name: humanlog-bins-${{ matrix.targets.goos }}-${{ matrix.targets.goarch }}
path: dist/*

publish:
name: "publish"
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- run: echo "${HOME}/.humanlog/bin" >> $GITHUB_PATH
- run: curl https://humanlog.io/install_apictl.sh | bash
- uses: actions/upload-artifact/merge@v4
with:
name: humanlog-bins
pattern: humanlog-bins-*
separate-directories: true
delete-merged: true
- uses: actions/download-artifact@v4
with:
name: humanlog-bins
- run: ./script/publish.sh
env:
CHANNEL: "dev"
API_URL: "https://api.humanlog.dev"
HMAC_KEY_ID: ${{ secrets.DEV_HMAC_KEY_ID }}
HMAC_PRIVATE_KEY: ${{ secrets.DEV_HMAC_PRIVATE_KEY }}
AWS_ACCESS_KEY_ID: ${{ secrets.S3_BINARIES_BUCKET_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_BINARIES_BUCKET_ACCESS_KEY }}
40 changes: 40 additions & 0 deletions .github/workflows/release-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,49 @@ permissions:
contents: write

jobs:
build:
name: "build"
strategy:
matrix:
go: [stable]
os:
- ubuntu-latest
- macos-latest
arch:
- arm64
- amd64
runs-on: ${{ matrix.os }}
env:
GOPRIVATE: "github.com/humanlogio/humanlog-pro"
GH_ACCESS_TOKEN_FOR_HUMANLOGPRO: ${{ secrets.GH_ACCESS_TOKEN_FOR_HUMANLOGPRO }}
GOARCH: ${{ matrix.arch }}
steps:
- name: Set up Go 1
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go }}
cache: true
- uses: actions/checkout@v3
with:
fetch-depth: 0
- run: git config --global --add safe.directory '*'
- run: git config --global url.https://[email protected]/.insteadOf https://github.com/
- run: git fetch --force --tags
- run: echo "${HOME}/.humanlog/bin" >> $GITHUB_PATH
- run: curl https://humanlog.dev/install_apictl.sh | bash
- run: go install github.com/goware/modvendor@latest
- run: go mod vendor
- run: modvendor -copy="**/*.a **/*.h" -v
- run: go
env:



create_a_dev_release:
name: create a dev release
runs-on: ubuntu-latest
container:
image: ghcr.io/goreleaser/goreleaser-cross:v1.23.2
env:
GOPRIVATE: "github.com/humanlogio/humanlog-pro"
GH_ACCESS_TOKEN_FOR_HUMANLOGPRO: ${{ secrets.GH_ACCESS_TOKEN_FOR_HUMANLOGPRO }}
Expand Down
115 changes: 115 additions & 0 deletions script/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
#!/usr/bin/env bash

set -euox pipefail

root=$(git rev-parse --show-toplevel)

gotags="${HUMANLOG_GOTAGS:-}"
goos="${GOOS:-$(go env GOOS)}"
goarch="${GOARCH:-$(go env GOARCH)}"
is_prod_build="${HUMANLOG_IS_PROD_BUILD:-}"
output_dir="${HUMANLOG_OUTDIR:-${root}/dist}"
output_bin="${HUMANLOG_OUTBIN:-humanlog}"
output_path="${output_dir}/${output_bin}"

function latest_git_tag() {
git describe --tags $(git rev-list --tags --max-count=1)
}

function git_commit_timestamp() {
git show --no-patch --format=%ct
}

function git_short_commit() {
git rev-parse --short HEAD
}

function current_version() {
apictl version to-json --version $(latest_git_tag) |
apictl version math build set $(git_short_commit)
}

function next_patch_version() {
current_version |
apictl version math patch add 1 |
apictl version math pre add next |
apictl version math pre add $(git_commit_timestamp)
}

function get_major() {
jq -r '.major // 0'
}

function get_minor() {
jq -r '.minor // 0'
}

function get_patch() {
jq -r '.patch // 0'
}

function get_pre() {
jq -r '.prereleases // [] | join(".")'
}

function get_build() {
jq -r '.build // ""'
}

function main() {
local major=""
local minor=""
local patch=""
local pre=""
local build=""
local version=""
if [[ "${is_prod_build}" != "true" ]]; then
echo "setting version to $(next_patch_version | apictl version from-json)"
major=$(next_patch_version | get_major)
minor=$(next_patch_version | get_minor)
patch=$(next_patch_version | get_patch)
pre=$(next_patch_version | get_pre)
build=$(next_patch_version | get_build)
version=$(next_patch_version | apictl version from-json)
else
major=$(current_version | get_major)
minor=$(current_version | get_minor)
patch=$(current_version | get_patch)
build=$(current_version | get_build)
version=$(current_version | apictl version from-json)
fi
local tarname="humanlog_${version}_${goos}_${goarch}.tar.gz"

local flags="-o ${output_path} -trimpath"
if [[ ! -z "${gotags}" ]]; then
flags+=" -tags ${gotags}"
fi

ldflags="-s -w"

if [[ "${goos}" == "linux" ]]; then
ldflags+=$" -extldflags '-lc -lrt -lpthread --static'"
fi

ldflags+=" -X main.versionMajor=${major}"
ldflags+=" -X main.versionMinor=${minor}"
ldflags+=" -X main.versionPatch=${patch}"
ldflags+=" -X main.versionBuild=${build}"
if [[ "${is_prod_build}" != "true" ]]; then
ldflags+=" -X main.versionPrerelease=${pre}"
ldflags+=" -X main.defaultApiAddr=https://api.humanlog.dev"
ldflags+=" -X main.defaultBaseSiteAddr=https://humanlog.dev"
else
ldflags+=" -X main.defaultApiAddr=https://api.humanlog.io"
ldflags+=" -X main.defaultBaseSiteAddr=https://humanlog.io"
fi

flags+=" -ldflags=\"${ldflags}\""

eval go build ${flags} ./cmd/humanlog

cd ${output_dir}
tar -zcvf ${tarname} humanlog
}

main
128 changes: 128 additions & 0 deletions script/publish.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
#!/usr/bin/env bash

set -euox pipefail

root=$(git rev-parse --show-toplevel)

is_prod_build="${IS_PROD_BUILD:-}"
api_url="${API_URL:-"https://api.humanlog.io"}"
channel="${CHANNEL:-main}"
project="${PROJECT:-humanlog}"
bucket="${BUCKET:-humanlog-binaries}"
region="${BUCKET_REGION:-sfo3}"
endpoint="${BUCKET_ENDPOINT:-https://humanlog-binaries.sfo3.digitaloceanspaces.com}"
cdn_endpoint="${BUCKET_CDN_ENDPOINT:-https://humanlog-binaries.sfo3.cdn.digitaloceanspaces.com}"

function main() {
local version=$(get_version | apictl version from-json)
local major=$(get_version | get_major)
local minor=$(get_version | get_minor)
local patch=$(get_version | get_patch)
local build=$(get_version | get_build)
local pre=""
if [[ "${is_prod_build}" != "true" ]]; then
pre=$(get_version | get_pre)
fi

local bucketdir="${project}/${channel}/$(git_commit_timestamp)/$(git_short_commit)"

for dir in $(find . -type d -name "humanlog-bins-*-*"); do
local os=$(echo "${dir}" | sed 's/\.\/humanlog-bins-\(.*\)-\(.*\)/\1/')
local arch=$(echo "${dir}" | sed 's/\.\/humanlog-bins-\(.*\)-\(.*\)/\2/')

local filename="humanlog_${version}_${os}_${arch}.tar.gz"
local bucketpath="${bucketdir}/${filename}"
local download_url="${cdn_endpoint}/${bucket}/${bucketpath}"
local sha256sum=$(get_sha256sum ${dir}/${filename})

local extra_flags="--build ${build}"
if [[ "${pre}" != "" ]]; then
extra_flags+=" --pre ${pre}"
fi

apictl --api.url ${api_url} create s3-artifact \
--filepath ${dir}/${filename} \
--s3.access_key $AWS_ACCESS_KEY_ID \
--s3.secret_key $AWS_SECRET_ACCESS_KEY \
--s3.endpoint ${endpoint} \
--s3.region ${region} \
--s3.bucket ${bucket} \
--s3.use_path_style=true \
--s3.directory ${bucketpath}

apictl --api.url ${api_url} create version-artifact \
--project ${project} \
--major ${major} \
--minor ${minor} \
--patch ${patch} \
--sha256 ${sha256sum} \
--url ${download_url} \
--os ${os} \
--arch ${arch} \
--sig "no-signature" ${extra_flags}
done

apictl --api.url ${api_url} create published-version \
--project ${project} \
--channel ${channel} \
--version ${version}
}

function latest_git_tag() {
git describe --tags $(git rev-list --tags --max-count=1)
}

function git_commit_timestamp() {
git show --no-patch --format=%ct
}

function git_short_commit() {
git rev-parse --short HEAD
}

function get_version() {
if [[ "${is_prod_build}" != "true" ]]; then
next_patch_version
else
current_version
fi
}

function current_version() {
apictl version to-json --version $(latest_git_tag) |
apictl version math build set $(git_short_commit)
}

function next_patch_version() {
current_version |
apictl version math patch add 1 |
apictl version math pre add next |
apictl version math pre add $(git_commit_timestamp)
}

function get_major() {
jq -r '.major // 0'
}

function get_minor() {
jq -r '.minor // 0'
}

function get_patch() {
jq -r '.patch // 0'
}

function get_pre() {
jq -r '.prereleases // [] | join(".")'
}

function get_build() {
jq -r '.build // ""'
}

function get_sha256sum() {
local filename=${1}
shasum -a 256 ${filename} | cut -d " " -f 1
}

main

0 comments on commit 828af35

Please sign in to comment.