name: Release on: push: tags: - 'v[0-9]*' jobs: release: runs-on: ubuntu-latest container: image: golang:1.27 steps: - name: Install packaging tools run: | apt-get update apt-get install -y dpkg-dev git curl - name: Checkout source env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} run: | git clone "https://token:${FORGEJO_TOKEN}@git.janvete.com/seth/Caddyview.git" src cd src git checkout "${{ github.ref_name }}" - name: Build binaries, archives and .deb working-directory: src run: | VERSION=${{ github.ref_name }} VER=${VERSION#v} mkdir -p dist for PAIR in darwin/arm64 darwin/amd64 linux/amd64; do OS=${PAIR%/*} ARCH=${PAIR#*/} GOOS=$OS GOARCH=$ARCH go build -ldflags="-s -w" -o dist/caddyview-${OS}-${ARCH} . STAGING=$(mktemp -d) cp dist/caddyview-${OS}-${ARCH} ${STAGING}/caddyview tar -czf dist/caddyview-${VERSION}-${OS}-${ARCH}.tar.gz -C ${STAGING} caddyview rm -rf ${STAGING} done # Build .deb for linux/amd64 DEB_DIR="caddyview_${VER}_amd64" mkdir -p "${DEB_DIR}/DEBIAN" mkdir -p "${DEB_DIR}/usr/local/bin" cp dist/caddyview-linux-amd64 "${DEB_DIR}/usr/local/bin/caddyview" chmod 755 "${DEB_DIR}/usr/local/bin/caddyview" cat > "${DEB_DIR}/DEBIAN/control" << CONTROL Package: caddyview Version: ${VER} Section: utils Priority: optional Architecture: amd64 Maintainer: seth Description: TUI SSH monitor for Caddy web server logs CONTROL dpkg-deb --build "${DEB_DIR}" "dist/caddyview_${VER}_amd64.deb" mv "${DEB_DIR}" "dist/" echo "=== SHA256 checksums ===" sha256sum dist/*.tar.gz dist/*.deb - name: Create Forgejo Release working-directory: src env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} FORGEJO_URL: https://git.janvete.com run: | VERSION=${{ github.ref_name }} API="${FORGEJO_URL}/api/v1/repos/seth/Caddyview" # Try to create release; if it already exists, fetch the existing one. RELEASE_JSON=$(curl -sS -H "Authorization: token ${FORGEJO_TOKEN}" \ -H "Content-Type: application/json" \ -X POST \ -d "{\"tag_name\":\"${VERSION}\",\"name\":\"${VERSION}\",\"draft\":false,\"prerelease\":false}" \ "${API}/releases") echo "Create release response: ${RELEASE_JSON}" RELEASE_ID=$(echo "${RELEASE_JSON}" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) if [ -z "${RELEASE_ID}" ]; then echo "Release may already exist, fetching existing release..." EXISTING=$(curl -sS -H "Authorization: token ${FORGEJO_TOKEN}" \ "${API}/releases/tags/${VERSION}") echo "Existing release response: ${EXISTING}" RELEASE_ID=$(echo "${EXISTING}" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) fi if [ -z "${RELEASE_ID}" ]; then echo "Failed to create or fetch release" exit 1 fi echo "release_id=${RELEASE_ID}" >> "$GITHUB_ENV" for ARCHIVE in dist/*.tar.gz dist/*.deb; do [ -e "${ARCHIVE}" ] || continue NAME=$(basename "${ARCHIVE}") CONTENT_TYPE="application/gzip" case "${NAME}" in *.deb) CONTENT_TYPE="application/vnd.debian.binary-package" ;; esac curl -sS -H "Authorization: token ${FORGEJO_TOKEN}" \ -H "Content-Type: ${CONTENT_TYPE}" \ --data-binary "@${ARCHIVE}" \ "${API}/releases/${RELEASE_ID}/assets?name=${NAME}" echo "Uploaded ${NAME}" done - name: Update Homebrew tap working-directory: src env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} run: | VERSION=${{ github.ref_name }} VER=${VERSION#v} SHA_ARM64=$(sha256sum dist/caddyview-${VERSION}-darwin-arm64.tar.gz | awk '{print $1}') SHA_AMD64=$(sha256sum dist/caddyview-${VERSION}-darwin-amd64.tar.gz | awk '{print $1}') SHA_LINUX=$(sha256sum dist/caddyview-${VERSION}-linux-amd64.tar.gz | awk '{print $1}') git clone "https://token:${FORGEJO_TOKEN}@git.janvete.com/seth/homebrew-tools.git" tap cat > tap/Formula/caddyview.rb << FORMULA class Caddyview < Formula desc "TUI SSH monitor for Caddy web server logs" homepage "https://git.janvete.com/seth/Caddyview" version "${VER}" license "MIT" on_macos do if Hardware::CPU.arm? url "https://git.janvete.com/seth/Caddyview/releases/download/${VERSION}/caddyview-${VERSION}-darwin-arm64.tar.gz" sha256 "${SHA_ARM64}" else url "https://git.janvete.com/seth/Caddyview/releases/download/${VERSION}/caddyview-${VERSION}-darwin-amd64.tar.gz" sha256 "${SHA_AMD64}" end end on_linux do if Hardware::CPU.intel? url "https://git.janvete.com/seth/Caddyview/releases/download/${VERSION}/caddyview-${VERSION}-linux-amd64.tar.gz" sha256 "${SHA_LINUX}" end end def install bin.install "caddyview" end test do assert_match "TUI monitor", shell_output("#{bin}/caddyview --help") end end FORMULA cd tap git config user.email "forgejo-actions[bot]@janvete.com" git config user.name "forgejo-actions[bot]" git add Formula/caddyview.rb git commit -m "chore: bump caddyview to ${VERSION}" git push - name: Update APT repository working-directory: src env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} run: | VERSION=${{ github.ref_name }} VER=${VERSION#v} git clone "https://token:${FORGEJO_TOKEN}@git.janvete.com/seth/apt.git" apt-repo cp "dist/caddyview_${VER}_amd64.deb" apt-repo/ cd apt-repo dpkg-scanpackages . > Packages gzip -k -f Packages cat > Release << RELEASE Origin: janvete Label: janvete Suite: stable Codename: stable Version: 1.0 Architectures: amd64 Components: main Description: janvete tools APT repository Date: $(date -Ru) RELEASE # Append hashes to Release { echo "SHA256:" for f in Packages Packages.gz *.deb; do [ -e "$f" ] || continue printf " %s %16d %s\n" "$(sha256sum "$f" | cut -d' ' -f1)" "$(stat -c%s "$f")" "$f" done } >> Release git config user.email "forgejo-actions[bot]@janvete.com" git config user.name "forgejo-actions[bot]" git add -A git commit -m "chore: add caddyview ${VERSION}" git push