From 71b248cf340777df7c4541791daf3175ba7949c0 Mon Sep 17 00:00:00 2001 From: restitux Date: Wed, 24 Dec 2025 07:36:35 +0000 Subject: [PATCH] meta: add CI to build debian package (#1) This change adds a CI job that builds the latest version of coredns with this plugin installed and uploads it to the gitea package registry. The package version is calculated from the coredns version and the current timestamp (to the minute). Reviewed-on: https://git.ohea.xyz/dns/coredns-netbox-plugin-dns/pulls/1 --- .gitea/workflows/build-release.yml | 29 ++++++ ci/build.sh | 145 +++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 .gitea/workflows/build-release.yml create mode 100755 ci/build.sh diff --git a/.gitea/workflows/build-release.yml b/.gitea/workflows/build-release.yml new file mode 100644 index 0000000..5e933be --- /dev/null +++ b/.gitea/workflows/build-release.yml @@ -0,0 +1,29 @@ +name: Build Coredns with netboxdns plugin +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Restore build state + uses: actions/cache/restore@v4 + with: + path: .build-state + key: coredns-netboxdns-${{ runner.os }} + + - name: Build + env: + CI_REGISTRY_USER: ${{ secrets.CI_REGISTRY_USER }} + CI_REGISTRY_PASSWORD: ${{ secrets.CI_REGISTRY_PASSWORD }} + run: ./ci/build.sh + + - name: Save build metadata + uses: actions/cache/save@v4 + with: + path: .build-state + key: coredns-netboxdns-${{ runner.os }} + + diff --git a/ci/build.sh b/ci/build.sh new file mode 100755 index 0000000..2fba7b3 --- /dev/null +++ b/ci/build.sh @@ -0,0 +1,145 @@ +#!/usr/bin/env bash +set -xeuo pipefail + +main() { + # Location to persist build metadata between runs (use Actions cache on this). [web:51][web:52] + BUILD_STATE_DIR="${BUILD_STATE_DIR:-${GITHUB_WORKSPACE:-.}/.build-state}" + mkdir -p "${BUILD_STATE_DIR}" + META_FILE="${BUILD_STATE_DIR}/coredns-netboxdns.meta" + + GO_VERSION=$(curl -s 'https://go.dev/VERSION?m=text' | head -n1) + ACTION_REPO_DIR="${PWD}" + ACTION_COMMIT="$(git rev-parse HEAD)" + + # 2. Create temp directory + TMPDIR="$(mktemp -d)" + echo "Using temp dir: ${TMPDIR}" + + cd "${TMPDIR}" + mkdir golang + cd golang + GOLANG_URL="https://go.dev/dl/${GO_VERSION}.linux-amd64.tar.gz" + wget "${GOLANG_URL}" + tar xzf "${GO_VERSION}.linux-amd64.tar.gz" + PATH="${PATH}:$PWD/go/bin" + + cd "${ACTION_REPO_DIR}" + go mod edit -go "$(echo "${GO_VERSION}" | sed 's/^go//')" + + # 3. Clone CoreDNS + cd "${TMPDIR}" + COREDNS_REPO_URL="https://github.com/coredns/coredns.git" + COREDNS_DIR="${TMPDIR}/coredns" + + # 4. Checkout coredns to latest release + git clone --depth=1 --filter=blob:none --tags "${COREDNS_REPO_URL}" "${COREDNS_DIR}" + cd "${COREDNS_DIR}" + git fetch --tags + COREDNS_LATEST_VERSION="$(git tag --list --sort=-version:refname | head -n 1)" + git fetch --tags --depth=1 origin "${COREDNS_LATEST_VERSION}" + git checkout "${COREDNS_LATEST_VERSION}" + + echo "CoreDNS version (tag): ${COREDNS_LATEST_VERSION}" + echo "Action repo commit : ${ACTION_COMMIT}" + + # 4b. Skip build if same CoreDNS version and same action repo commit as last time. # NEW + if [ -f "${META_FILE}" ]; then + LAST_COREDNS_TAG="$(sed -n 's/^COREDNS_TAG=//p' "${META_FILE}")" + LAST_ACTION_COMMIT="$(sed -n 's/^ACTION_COMMIT=//p' "${META_FILE}")" + + if [ "${LAST_COREDNS_TAG}" = "${COREDNS_LATEST_VERSION}" ] && + [ "${LAST_ACTION_COMMIT}" = "${ACTION_COMMIT}" ]; then + echo "No changes in CoreDNS version or action repo commit since last build." + echo "Skipping build and upload." + exit 0 + fi + fi + + # 5. Update plugin.cfg to include netboxdns plugin + # Insert netboxdns after the 'cache' plugin entry as recommended. + if ! grep -q '^netboxdns:' plugin.cfg; then + awk ' + /^cache:/ { + print + print "netboxdns:github.com/doubleu-labs/coredns-netbox-plugin-dns" + next + } + { print } + ' plugin.cfg >plugin.cfg.new + mv plugin.cfg.new plugin.cfg + fi + + # 6. Update coredns repo to latest golang version + # TODO: do we need this? I think we should actually force the plugin to use the coredns configured golang version + # this possibly only works because coredns is using the latest golang version + go mod edit -go "$(echo "${GO_VERSION}" | sed 's/^go//')" + + # 7. go mod replace plugin path to the cloned action repo + # This assumes the plugin lives at github.com/doubleu-labs/coredns-netbox-plugin-dns in your repo. + + go mod edit -replace=github.com/doubleu-labs/coredns-netbox-plugin-dns="${ACTION_REPO_DIR}" + + # 7. Regenerate plugin source files + # CoreDNS uses go generate (via Makefile) to rebuild plugin glue code. + + make gen + + # 9. Compile CoreDNS + make coredns || make + + # 10. Strip the binary + STRIP_BIN="${STRIP_BIN:-strip}" + "${STRIP_BIN}" ./coredns + + # 11. Create a .deb installing /usr/local/bin/coredns + # Minimal Debian package using dpkg-deb. + PKG_ROOT="${TMPDIR}/pkg-root" + mkdir -p "${PKG_ROOT}/DEBIAN" "${PKG_ROOT}/usr/local/bin" + + # Basic metadata; tweak as needed + PKG_NAME="coredns-netboxdns" + PKG_VERSION="$(echo "${COREDNS_LATEST_VERSION}" | sed 's/^v//')" + PKG_ARCH="$(dpkg --print-architecture 2>/dev/null || echo amd64)" + + cat >"${PKG_ROOT}/DEBIAN/control" < +Description: CoreDNS with netboxdns plugin + Custom CoreDNS build with netboxdns plugin compiled in. +EOF + + install -m 0755 ./coredns "${PKG_ROOT}/usr/local/bin/coredns" + + DEB_OUT="${TMPDIR}/${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}.deb" + dpkg-deb --build "${PKG_ROOT}" "${DEB_OUT}" + + echo "Built Debian package at: ${DEB_OUT}" + + # 12. Upload the package to Gitea Debian registry + # Gitea uses HTTP PUT with the .deb in the request body. + DEB_REGISTRY_URL="https://git.ohea.xyz/api/packages/dns/debian/pool/trixie/main/upload" + echo "Uploading ${DEB_OUT} to ${DEB_REGISTRY_URL}" + curl \ + --fail \ + --show-error \ + --silent \ + --request PUT \ + --user "${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD}" \ + --upload-file "${DEB_OUT}" \ + "${DEB_REGISTRY_URL}" + + # 13. Store metadata for next run (so it can be used with actions/cache). # NEW + cat >"${META_FILE}" <