2 Commits

Author SHA1 Message Date
unkinben 498fe0ab25 Add merged branch release notes to Gitea release body
Generates release notes from merged branches since last tag and
includes them in the release body via Gitea API.

💘 Generated with Crush

Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land>
2026-03-25 19:42:13 +11:00
unkinben b29418d1b5 Replace gitea-release plugin with curl-based release upload
ci/woodpecker/pr/lint Pipeline failed
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/unit-tests Pipeline was successful
Uses basic auth (droneci user) and Gitea API directly to create
the release and upload the binary asset.

💘 Generated with Crush

Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land>
2026-03-25 19:36:44 +11:00
2 changed files with 15 additions and 10 deletions
+11 -6
View File
@@ -17,20 +17,25 @@ steps:
- name: release - name: release
image: git.unkin.net/unkin/almalinux9-base:20260325 image: git.unkin.net/unkin/almalinux9-base:20260325
environment: environment:
RELEASER_TOKEN: DRONECI_PASSWORD:
from_secret: RELEASER_TOKEN from_secret: DRONECI_PASSWORD
commands: commands:
- | - |
curl --output /usr/local/bin/tea https://artifactapi.k8s.syd1.au.unkin.net/api/v1/remote/gitea-dl/tea/0.12.0/tea-0.12.0-linux-amd64 && chmod +x /usr/local/bin/tea
tea logins add --name gitea --url https://git.unkin.net --token "$${RELEASER_TOKEN}" --no-version-check
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
if [ -n "$PREV_TAG" ]; then if [ -n "$PREV_TAG" ]; then
NOTES=$(git log "${PREV_TAG}..${CI_COMMIT_TAG}" --merges --pretty=format:"- %s") NOTES=$(git log "${PREV_TAG}..${CI_COMMIT_TAG}" --merges --pretty=format:"- %s")
else else
NOTES=$(git log --merges --pretty=format:"- %s") NOTES=$(git log --merges --pretty=format:"- %s")
fi fi
tea releases edit "${CI_COMMIT_TAG}" --note "${NOTES}" --login gitea --repo "${CI_REPO}" BODY=$(printf '%s' "$NOTES" | sed 's/"/\\"/g; s/$/\\n/' | tr -d '\n')
tea releases assets create "${CI_COMMIT_TAG}" node-lookup --login gitea --repo "${CI_REPO}" RELEASE_ID=$(curl -sf -X POST "https://git.unkin.net/api/v1/repos/${CI_REPO}/releases" \
-u "droneci:$DRONECI_PASSWORD" \
-H "Content-Type: application/json" \
-d "{\"tag_name\":\"${CI_COMMIT_TAG}\",\"name\":\"${CI_COMMIT_TAG}\",\"body\":\"${BODY}\"}" \
| grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)
curl -sf -X POST "https://git.unkin.net/api/v1/repos/${CI_REPO}/releases/${RELEASE_ID}/assets" \
-u "droneci:$DRONECI_PASSWORD" \
-F "attachment=@node-lookup"
backend_options: backend_options:
kubernetes: kubernetes:
serviceAccountName: default serviceAccountName: default
+4 -4
View File
@@ -354,11 +354,11 @@ func TestAllFactsForNode_QueryContainsCertname(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
receivedQuery = r.URL.Query().Get("query") receivedQuery = r.URL.Query().Get("query")
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode([]fact{}) json.NewEncoder(w).Encode([]fact{})
})) }))
defer srv.Close() defer srv.Close()
_, _ = allFactsForNode(srv.URL+"/pdb/query/v4/facts", "mynode.example.com") allFactsForNode(srv.URL+"/pdb/query/v4/facts", "mynode.example.com")
if !strings.Contains(receivedQuery, "mynode.example.com") { if !strings.Contains(receivedQuery, "mynode.example.com") {
t.Fatalf("expected certname in query, got: %s", receivedQuery) t.Fatalf("expected certname in query, got: %s", receivedQuery)
} }
@@ -405,10 +405,10 @@ func TestRun_AllFacts_PrintsSortedByName(t *testing.T) {
cfg := config{PuppetDBURL: srv.URL + "/pdb/query/v4/facts", RoleFact: "enc_role"} cfg := config{PuppetDBURL: srv.URL + "/pdb/query/v4/facts", RoleFact: "enc_role"}
err := run(cfg, "node1", "", "", "", false, false, false, false, false, false, true) err := run(cfg, "node1", "", "", "", false, false, false, false, false, false, true)
_ = w.Close() w.Close()
os.Stdout = old os.Stdout = old
var buf strings.Builder var buf strings.Builder
_, _ = io.Copy(&buf, r) io.Copy(&buf, r)
out := buf.String() out := buf.String()
if err != nil { if err != nil {