diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml new file mode 100644 index 0000000..1e591c0 --- /dev/null +++ b/.gitea/workflows/ci.yaml @@ -0,0 +1,107 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +env: + REGISTRY: forgejo.riotpiao.com + IMAGE: forgejo.riotpiao.com/rock/kmsvc-sdk + +jobs: + test: + name: Test + runs-on: golang + steps: + - name: Install Node.js for actions runtime + run: apt-get update && apt-get install -y nodejs + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Configure git auth for private modules + run: | + git config --global url."https://oauth2:${REGISTRY_PAT}@forgejo.riotpiao.com".insteadOf "https://forgejo.riotpiao.com" + env: + REGISTRY_PAT: ${{ secrets.REGISTRY_PAT }} + + - name: gofmt + run: | + fmt_out="$(gofmt -l .)" + if [ -n "$fmt_out" ]; then + echo "$fmt_out" + echo "::error::gofmt found unformatted files" + exit 1 + fi + + - name: go vet + run: go vet ./... + + - name: go build + run: go build ./... + + - name: go test + run: go test ./... -race -coverprofile=coverage.out + + - name: coverage summary + run: go tool cover -func=coverage.out | tail -1 + + release: + name: Create Release (on tag) + if: startsWith(github.ref, 'refs/tags/v') + runs-on: golang + permissions: + contents: write + steps: + - name: Install Node.js + run: apt-get update && apt-get install -y nodejs + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Configure git auth + run: | + git config --global url."https://oauth2:${REGISTRY_PAT}@forgejo.riotpiao.com".insteadOf "https://forgejo.riotpiao.com" + env: + REGISTRY_PAT: ${{ secrets.REGISTRY_PAT }} + + - name: Run gate (vet, build, test) + run: | + go vet ./... + go build ./... + go test ./... -race + + - name: Extract changelog + id: changelog + run: | + tag="${GITHUB_REF_NAME}" + version="${tag#v}" + notes="$(awk -v ver="$version" ' + $0 ~ "^## v"ver"([^.0-9]|$)" { found=1; next } + found && /^## / { exit } + found { print } + ' CHANGELOG.md)" + if [ -z "$notes" ]; then + notes="(no changelog entry found for $tag)" + fi + { + echo "notes<> "$GITHUB_OUTPUT" + + - name: Create Forgejo release + run: | + curl -fsSL -X POST \ + -H "Authorization: token ${FORGEJO_TOKEN}" \ + -H "Content-Type: application/json" \ + "${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases" \ + -d "$(jq -n \ + --arg tag "$GITHUB_REF_NAME" \ + --arg body "${{ steps.changelog.outputs.notes }}" \ + '{tag_name: $tag, name: $tag, body: $body, draft: false, prerelease: false}')" \ + | jq . + env: + FORGEJO_TOKEN: ${{ secrets.GITHUB_TOKEN }}