workflow-sample-go/.forgejo/workflows/build-project.yml
j 3c2f929873
Some checks failed
Build & Release Go Project / build (push) Failing after 40s
Go requires git installed
2025-06-17 15:56:49 +10:00

93 lines
3 KiB
YAML

# This workflow will build a standard Go project structure into
# a binary and release it via the Forgejo Releases tab.
#
# The anticipated project structure references something like below,
# however I would expect you to change "go-project" to "src".
#
# .
# ├── cmd
# │   └── sample
# │   └── main.go
# ├── internal
# │   └── greet
# │   └── greet.go
# ├── pkg
# │   └── util
# │   └── util.go
# ├── go.mod
# └── README.md
#
# We expect go.mod to exist and be correct.
name: Build & Release Go Project
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: docker
container: debian:12
steps:
- name: Prepare Build Environment
run: |
apt update && apt -y install zip nodejs curl jq golang git
- name: Checkout repo
uses: actions/checkout@v4
- name: Build All Binaries
run: |
# Create the build directory for a consistent place to store binaries
mkdir -p build
# Do a quick tidy
go mod tidy
# Iterate over the cmd directory to compile all binaries found there
ls ./cmd | while read BINARY ; do
go build -v -o build/${BINARY} ./cmd/${BINARY}
done
- name: Create a release if it doesn't exist
run: |
# Curl request that uses the repos token & Forgejo's built-in variables
# to create a new release based on the tag that you have pushed
#
# It doesn't care if the release exists or not.
curl -X POST "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases" \
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
-H "Content-Type: application/json" \
-d '{
"tag_name": "'"${GITHUB_REF##*/}"'",
"target_commitish": "main",
"name": "'"${GITHUB_REF##*/}"'",
"body": "Auto release",
"draft": false,
"prerelease": false
}' || true
- name: Upload Binaries To Release Tab
run: |
# Set some variables because it's cleaner than in-line
TAG_NAME="${GITHUB_REF##*/}"
REPO_NAME="$(basename $GITHUB_REPOSITORY)"
# Get the release ID created in the last step
RELEASE_ID=$(curl -s \
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/tags/${TAG_NAME}" \
| jq -r '.id')
# We're going to want to push each binary, so we'll iterate over them and
# push them one-by-one.
ls build | while read BINARY ; do
curl -X POST "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets?name=${BINARY}" \
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
-H "Content-Type: application/zip" \
--data-binary "@build/${BINARY}"
done