# This workflow will build a golang project for Gitea Actions # Using inline commands to avoid external action dependencies # # NOTE: All builds use CGO_ENABLED=0 since p8k library uses purego (not CGO) # The library dynamically loads libsecp256k1 at runtime via purego # # Release Process: # 1. Update the version in the pkg/version/version file (e.g. v1.2.3) # 2. Create and push a tag matching the version: # git tag v1.2.3 # git push origin v1.2.3 # 3. The workflow will automatically: # - Build binaries for Linux AMD64 # - Run tests # - Create a Gitea release with the binaries # - Generate checksums name: Go on: push: tags: - "v[0-9]+.[0-9]+.[0-9]+" jobs: build-and-release: runs-on: ubuntu-latest steps: - name: Checkout code run: | echo "Cloning repository..." git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git ${GITHUB_WORKSPACE} cd ${GITHUB_WORKSPACE} git log -1 - name: Set up Go run: | echo "Setting up Go 1.25.0..." cd /tmp wget -q https://go.dev/dl/go1.25.0.linux-amd64.tar.gz sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz export PATH=/usr/local/go/bin:$PATH go version - name: Build (Pure Go + purego) run: | export PATH=/usr/local/go/bin:$PATH cd ${GITHUB_WORKSPACE} echo "Building with CGO_ENABLED=0..." CGO_ENABLED=0 go build -v ./... - name: Test (Pure Go + purego) run: | export PATH=/usr/local/go/bin:$PATH cd ${GITHUB_WORKSPACE} echo "Running tests..." # Copy the libsecp256k1.so to root directory so tests can find it cp pkg/crypto/p8k/libsecp256k1.so . CGO_ENABLED=0 go test -v $(go list ./... | grep -v '/cmd/benchmark/external/' | xargs -n1 sh -c 'ls $0/*_test.go 1>/dev/null 2>&1 && echo $0' | grep .) || true - name: Build Release Binaries (Pure Go + purego) run: | export PATH=/usr/local/go/bin:$PATH cd ${GITHUB_WORKSPACE} # Extract version from tag (e.g., v1.2.3 -> 1.2.3) VERSION=${GITHUB_REF_NAME#v} echo "Building release binaries for version $VERSION (pure Go + purego)" # Create directory for binaries mkdir -p release-binaries # Copy the pre-compiled libsecp256k1.so for Linux AMD64 cp pkg/crypto/p8k/libsecp256k1.so release-binaries/libsecp256k1-linux-amd64.so # Build for Linux AMD64 (pure Go + purego dynamic loading) echo "Building Linux AMD64 (pure Go + purego dynamic loading)..." GOEXPERIMENT=greenteagc,jsonv2 GOOS=linux GOARCH=amd64 CGO_ENABLED=0 \ go build -ldflags "-s -w" -o release-binaries/orly-${VERSION}-linux-amd64 . # Create checksums cd release-binaries sha256sum * > SHA256SUMS.txt cat SHA256SUMS.txt cd .. echo "Release binaries built successfully:" ls -lh release-binaries/ - name: Create Gitea Release env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | export PATH=/usr/local/go/bin:$PATH cd ${GITHUB_WORKSPACE} VERSION=${GITHUB_REF_NAME} REPO_OWNER=$(echo ${GITHUB_REPOSITORY} | cut -d'/' -f1) REPO_NAME=$(echo ${GITHUB_REPOSITORY} | cut -d'/' -f2) echo "Creating release for ${REPO_OWNER}/${REPO_NAME} version ${VERSION}" # Install tea CLI for Gitea cd /tmp wget -q https://dl.gitea.com/tea/0.9.2/tea-0.9.2-linux-amd64 -O tea chmod +x tea # Configure tea with the repository's Gitea instance ./tea login add \ --name runner \ --url ${GITHUB_SERVER_URL} \ --token "${GITEA_TOKEN}" || echo "Login may already exist" # Create release with assets cd ${GITHUB_WORKSPACE} /tmp/tea release create \ --repo ${REPO_OWNER}/${REPO_NAME} \ --tag ${VERSION} \ --title "Release ${VERSION}" \ --note "Automated release ${VERSION}" \ --asset release-binaries/orly-${VERSION#v}-linux-amd64 \ --asset release-binaries/libsecp256k1-linux-amd64.so \ --asset release-binaries/SHA256SUMS.txt \ || echo "Release may already exist, updating..."