meta: add CI to build debian package (#1)
Build Coredns with netboxdns plugin / build (push) Successful in 4s

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: #1
This commit was merged in pull request #1.
This commit is contained in:
2025-12-24 07:36:35 +00:00
parent 05c3b0ff0b
commit 71b248cf34
2 changed files with 174 additions and 0 deletions
+29
View File
@@ -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 }}
Executable
+145
View File
@@ -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" <<EOF
Package: ${PKG_NAME}
Version: ${PKG_VERSION}-$(date +%Y%m%d%H%M)
Section: net
Priority: optional
Architecture: ${PKG_ARCH}
Maintainer: CI <restitux@ohea.xyz>
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}" <<EOF
COREDNS_TAG=${COREDNS_LATEST_VERSION}
ACTION_COMMIT=${ACTION_COMMIT}
EOF
echo "Updated build metadata at ${META_FILE}"
}
main "$@"