# 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