Files
sessiongurad/.gitea/workflows/windows-agent-release.yml
Jan 5cb74becea
Some checks failed
release-tag / release-image (push) Successful in 1m59s
release-main / release-images (push) Failing after 4m10s
Dateien nach ".gitea/workflows" hochladen
2026-08-25 06:25:01 +02:00

281 lines
8.1 KiB
YAML

name: Windows Agent Release
on:
workflow_dispatch:
inputs:
version:
description: "Release-Version, z. B. 0.5.3"
required: true
default: "0.5.3"
prerelease:
description: "Als Pre-Release markieren (true/false)"
required: true
default: "false"
permissions:
code: read
releases: write
jobs:
windows-agent-release:
name: Build and release Windows Agent
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.23.x"
cache: false
- name: Validate release input
id: meta
shell: bash
run: |
set -euo pipefail
VERSION="${{ inputs.version }}"
VERSION="${VERSION#v}"
if ! printf '%s' "$VERSION" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$'; then
echo "Ungültige Version: $VERSION" >&2
echo "Erwartet wird z. B. 0.5.3 oder 0.5.3-rc1." >&2
exit 1
fi
case "${{ inputs.prerelease }}" in
true|false) ;;
*)
echo "prerelease muss true oder false sein." >&2
exit 1
;;
esac
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=v$VERSION" >> "$GITHUB_OUTPUT"
echo "asset_base=sessionguard-agent-windows-amd64-v$VERSION" >> "$GITHUB_OUTPUT"
- name: Set Agent version
shell: bash
env:
VERSION: ${{ steps.meta.outputs.version }}
run: |
set -euo pipefail
python3 - <<'PY'
import os
import re
from pathlib import Path
path = Path("internal/agent/agent.go")
text = path.read_text(encoding="utf-8")
updated, count = re.subn(
r'const Version = "[^"]+"',
f'const Version = "{os.environ["VERSION"]}"',
text,
count=1,
)
if count != 1:
raise SystemExit("Konnte internal/agent/agent.go: const Version nicht eindeutig ersetzen.")
path.write_text(updated, encoding="utf-8")
PY
grep -n 'const Version' internal/agent/agent.go
- name: Download Go modules
shell: bash
run: |
set -euo pipefail
go mod download
- name: Build Windows Agent
shell: bash
env:
CGO_ENABLED: "0"
GOOS: windows
GOARCH: amd64
run: |
set -euo pipefail
mkdir -p dist/package
go build \
-trimpath \
-ldflags="-s -w" \
-o dist/package/sessionguard-agent.exe \
./cmd/agent
- name: Package Windows Agent
id: package
shell: bash
env:
VERSION: ${{ steps.meta.outputs.version }}
ASSET_BASE: ${{ steps.meta.outputs.asset_base }}
run: |
set -euo pipefail
cp scripts/install-agent.ps1 dist/package/
cp configs/agent.example.json dist/package/
cat > dist/package/VERSION.txt <<EOF
SessionGuard Windows Agent
Version: ${VERSION}
Architecture: windows/amd64
Commit: ${GITHUB_SHA}
EOF
(
cd dist/package
sha256sum sessionguard-agent.exe > SHA256SUMS.txt
)
python3 - <<'PY'
import os
import zipfile
from pathlib import Path
src = Path("dist/package")
dst = Path("dist") / f'{os.environ["ASSET_BASE"]}.zip'
with zipfile.ZipFile(dst, "w", compression=zipfile.ZIP_DEFLATED) as z:
for path in sorted(src.iterdir()):
z.write(path, path.name)
PY
cp dist/package/sessionguard-agent.exe "dist/${ASSET_BASE}.exe"
(
cd dist
sha256sum \
"${ASSET_BASE}.exe" \
"${ASSET_BASE}.zip" \
> "${ASSET_BASE}.sha256"
)
echo "exe=dist/${ASSET_BASE}.exe" >> "$GITHUB_OUTPUT"
echo "zip=dist/${ASSET_BASE}.zip" >> "$GITHUB_OUTPUT"
echo "sha=dist/${ASSET_BASE}.sha256" >> "$GITHUB_OUTPUT"
ls -lh dist/
- name: Create Gitea Release
id: release
shell: bash
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
VERSION: ${{ steps.meta.outputs.version }}
TAG: ${{ steps.meta.outputs.tag }}
PRERELEASE: ${{ inputs.prerelease }}
run: |
set -euo pipefail
export RELEASE_BODY="Automatisch erzeugter Windows-Agent-Release.
- Plattform: Windows amd64
- Version: ${VERSION}
- Commit: ${GITHUB_SHA}
- Ausgelöst von: ${GITHUB_ACTOR}
Die SHA256-Prüfsummen liegen als separates Release-Asset bei."
python3 - <<'PY'
import json
import os
payload = {
"tag_name": os.environ["TAG"],
"target_commitish": os.environ["GITHUB_SHA"],
"name": f'SessionGuard Windows Agent {os.environ["TAG"]}',
"body": os.environ["RELEASE_BODY"],
"draft": False,
"prerelease": os.environ["PRERELEASE"].lower() == "true",
}
with open("/tmp/sessionguard-release.json", "w", encoding="utf-8") as f:
json.dump(payload, f)
PY
HTTP_CODE="$(
curl --silent --show-error \
--output /tmp/sessionguard-release-response.json \
--write-out '%{http_code}' \
--request POST \
--header "Authorization: token ${GITEA_TOKEN}" \
--header "Content-Type: application/json" \
--data @/tmp/sessionguard-release.json \
"${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases"
)"
if [ "$HTTP_CODE" != "201" ]; then
cat /tmp/sessionguard-release-response.json || true
echo "Gitea Release konnte nicht erstellt werden (HTTP ${HTTP_CODE})." >&2
echo "Existiert der Tag ${TAG} bereits oder fehlen dem GITEA_TOKEN Release-Schreibrechte?" >&2
exit 1
fi
RELEASE_ID="$(
python3 - <<'PY'
import json
with open("/tmp/sessionguard-release-response.json", encoding="utf-8") as f:
print(json.load(f)["id"])
PY
)"
RELEASE_URL="$(
python3 - <<'PY'
import json
with open("/tmp/sessionguard-release-response.json", encoding="utf-8") as f:
print(json.load(f).get("html_url", ""))
PY
)"
echo "id=${RELEASE_ID}" >> "$GITHUB_OUTPUT"
echo "url=${RELEASE_URL}" >> "$GITHUB_OUTPUT"
- name: Upload Release Assets
shell: bash
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
RELEASE_ID: ${{ steps.release.outputs.id }}
EXE: ${{ steps.package.outputs.exe }}
ZIP: ${{ steps.package.outputs.zip }}
SHA: ${{ steps.package.outputs.sha }}
run: |
set -euo pipefail
for FILE in "$EXE" "$ZIP" "$SHA"; do
NAME="$(basename "$FILE")"
echo "Uploading ${NAME} ..."
curl --fail-with-body --silent --show-error \
--request POST \
--header "Authorization: token ${GITEA_TOKEN}" \
--form "attachment=@${FILE}" \
"${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets?name=${NAME}"
echo
done
- name: Release summary
shell: bash
run: |
cat <<EOF
Windows Agent Release erstellt.
Version:
${{ steps.meta.outputs.tag }}
Release:
${{ steps.release.outputs.url }}
Assets:
${{ steps.meta.outputs.asset_base }}.exe
${{ steps.meta.outputs.asset_base }}.zip
${{ steps.meta.outputs.asset_base }}.sha256
EOF