diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 3a5753e..b26f338 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -112,3 +112,91 @@ jobs: files: | dist/**/duidreader-*.tar.gz dist/**/duidreader-*.zip + publish-agent: + if: startsWith(github.ref, 'refs/tags/') + needs: release + runs-on: ubuntu-fast + env: + PRODUCT: duidreader + AGENT_URL: ${{ secrets.AGENT_URL }} + AGENT_TOKEN: ${{ secrets.AGENT_TOKEN }} + + # Funktioniert in GitHub und Gitea (Actions) weitgehend gleich: + SERVER_URL: ${{ github.server_url }} # z.B. https://github.com oder https://gitea.example.com + REPOSITORY: ${{ github.repository }} # owner/repo + TAG: ${{ github.ref_name }} # vX.Y.Z + + steps: + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + path: ./dist + + - name: Publish release metadata to Version Agent + shell: bash + run: | + set -euo pipefail + + if [[ -z "${AGENT_URL:-}" || -z "${AGENT_TOKEN:-}" ]]; then + echo "Missing AGENT_URL or AGENT_TOKEN" >&2; exit 1 + fi + + VERSION="${TAG#v}" # 12.3.1[-rc.1|-beta.1] + MAJOR="${VERSION%%.*}" # 12 + BRANCH="${MAJOR}.x" # 12.x + + CHANNEL="stable" + [[ "$VERSION" == *"-rc"* ]] && CHANNEL="rc" + [[ "$VERSION" == *"-beta"* ]] && CHANNEL="beta" + # Optional: Nightly-Channel bei Non-Tag-Builds (separater Job, siehe unten) + + RELEASED_AT="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" + NOTES_URL="${SERVER_URL}/${REPOSITORY}/releases/tag/${TAG}" + + publish() { # args: OS ARCH FILE + local OS="$1" ARCH="$2" FILE="$3" + local BIT="64" + case "$ARCH" in 386|armv7) BIT="32";; esac + + local FNAME="$(basename "$FILE")" + local URL="${SERVER_URL}/${REPOSITORY}/releases/download/${TAG}/${FNAME}" + + local SHA256 SIZE + SHA256="$(sha256sum "$FILE" | awk '{print $1}')" + SIZE="$(stat -c%s "$FILE")" + + jq -n \ + --arg branch "$BRANCH" \ + --arg channel "$CHANNEL" \ + --arg arch "$ARCH" \ + --arg bit "$BIT" \ + --arg os "$OS" \ + --arg version "$VERSION" \ + --arg released_at "$RELEASED_AT" \ + --arg notes "$NOTES_URL" \ + --arg url "$URL" \ + --arg sha256 "$SHA256" \ + --argjson size "$SIZE" \ + '{ + branch:$branch, channel:$channel, arch:$arch, bit:$bit, os:$os, + release:{ + version:$version, released_at:$released_at, notes_url:$notes, + assets:[{url:$url, sha256:$sha256, size_bytes:$size}] + } + }' > payload.json + echo @payload.json + curl -fsS -H "Content-Type: application/json" \ + -H "Authorization: Bearer ${AGENT_TOKEN}" \ + -d @payload.json "${AGENT_URL}/v1/publish" + } + + shopt -s nullglob + + # linux/amd64 + # for f in dist/**/${PRODUCT}-linux-amd64.tar.gz; do publish linux amd64 "$f"; done + # linux/arm64 + # for f in dist/**/${PRODUCT}-linux-arm64.tar.gz; do publish linux arm64 "$f"; done + # linux/armv7 + # for f in dist/**/${PRODUCT}-linux-armv7.tar.gz; do publish linux armv7 "$f"; done + # windows/amd64 + for f in dist/**/${PRODUCT}-windows-amd64.zip; do publish windows amd64 "$f"; done \ No newline at end of file diff --git a/main.go b/main.go index 1df58e2..98042f4 100644 --- a/main.go +++ b/main.go @@ -33,6 +33,21 @@ var ( reKVIAID = regexp.MustCompile(`^IAID=(\d+)`) // systemd-networkd ) +func getenv(k, d string) string { + if v := os.Getenv(k); v != "" { + return v + } + return d +} + +func enabled(k string, def bool) bool { + b, err := strconv.ParseBool(strings.ToLower(os.Getenv(k))) + if err != nil { + return def + } + return b +} + func iaidsLinux() ([]iaidInfo, error) { candidates := []string{ "/var/lib/NetworkManager", @@ -292,7 +307,7 @@ func main() { body, _ := json.Marshal(p) // --- HTTP senden --- - url := "https://client-ipv6.stadt-hilden.de/register" // <-- ggf. anpassen + url := getenv("DUID_REGISTER_URL", "https://client-ipv6.stadt-hilden.de/register") // <-- ggf. anpassen req, _ := http.NewRequest(http.MethodPost, url, bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json")