diff --git a/.forgejo/workflows/build-project.yml b/.forgejo/workflows/build-project.yml new file mode 100644 index 0000000..a14bb80 --- /dev/null +++ b/.forgejo/workflows/build-project.yml @@ -0,0 +1,90 @@ +# 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 + + - 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 + + # Iterate over the cmd directory to compile all binaries found there + ls ${SOURCE_DIR}/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