summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Mills <1290234+prologic@users.noreply.github.com>2020-01-28 05:51:18 +1000
committerGitHub <noreply@github.com>2020-01-28 05:51:18 +1000
commitd307ba7ec545f9e76f55cd9f2af08ffd6db6fbc2 (patch)
tree3e9170472756960f063d4c95b14c6063bc9a2325
parentcb7f19ba2dc40d24ec9cd68c08a7d20acd891a37 (diff)
Adds Docker based build system for Binary Packages, CI/CD, Smoke Testing and Development. (#7735)
* Added Dockerfile for building, packaging and performing basic smoke tests of the package(s) and NetData Agent itself * Moved install of package per distro into a script and refactor in order to supprot other distro(s) * Add support for RPM based systems too (Fedora, CentOS) * Drop the unnecessary (for now) Debian cleanup steps * Reverse the order of installing NetData agent and testing tools * Update default VERSION to 0.1 to match builder images * Added support for openSUSE * Minor fixes from review * Update Dockerfile Co-Authored-By: Austin S. Hemmelgarn <ahferroin7@gmail.com> * Update Dockerfile Co-Authored-By: Austin S. Hemmelgarn <ahferroin7@gmail.com> * Move thigns around a bit * Re-update test/install shell scripts to be POSIX. We don't really want to depend on Bash here * Fixed support for yum vs. dnf * Fixed paths to scripts * Added a script to kick off the build/package/install/test flow more easily for both humans and CI/CD Co-authored-by: Austin S. Hemmelgarn <ahferroin7@gmail.com>
l---------.dockerignore1
-rw-r--r--packaging/Dockerfile.packager42
-rwxr-xr-xpackaging/build_package_install_test.sh37
-rwxr-xr-xpackaging/scripts/install.sh58
-rwxr-xr-xpackaging/scripts/test.sh27
5 files changed, 165 insertions, 0 deletions
diff --git a/.dockerignore b/.dockerignore
new file mode 120000
index 0000000000..3e4e48b0b5
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+.gitignore \ No newline at end of file
diff --git a/packaging/Dockerfile.packager b/packaging/Dockerfile.packager
new file mode 100644
index 0000000000..14f711ca68
--- /dev/null
+++ b/packaging/Dockerfile.packager
@@ -0,0 +1,42 @@
+ARG ARCH=amd64
+ARG DISTRO=debian
+ARG DISTRO_VERSION=10
+ARG VERSION=0.1
+
+FROM netdata/package-builders:${DISTRO}${DISTRO_VERSION} AS build
+
+ARG ARCH
+ARG DISTRO
+ARG DISTRO_VERSION
+ARG VERSION
+
+ENV ARCH=$ARCH
+ENV DISTRO=$DISTRO
+ENV DISTRO_VERSION=$DISTRO_VERSION
+ENV VERSION=$VERSION
+
+WORKDIR /netdata
+COPY . .
+
+RUN /build.sh
+
+FROM ${DISTRO}:${DISTRO_VERSION} AS runtime
+
+ARG ARCH
+ARG DISTRO
+ARG DISTRO_VERSION
+ARG VERSION
+
+ENV ARCH=$ARCH
+ENV DISTRO=$DISTRO
+ENV DISTRO_VERSION=$DISTRO_VERSION
+ENV VERSION=$VERSION
+
+COPY ./packaging/scripts/install.sh /install.sh
+COPY ./packaging/scripts/test.sh /test.sh
+
+COPY --from=build /netdata/artifacts /artifacts
+
+RUN /install.sh
+
+CMD ["/test.sh"]
diff --git a/packaging/build_package_install_test.sh b/packaging/build_package_install_test.sh
new file mode 100755
index 0000000000..e3b3362d41
--- /dev/null
+++ b/packaging/build_package_install_test.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+set -e
+
+# If we are not in netdata git repo, at the top level directory, FAIL
+TOP_LEVEL=$(basename "$(git rev-parse --show-toplevel)")
+CWD=$(git rev-parse --show-cdup || echo "")
+if [ -n "${CWD}" ] || [ ! "${TOP_LEVEL}" = "netdata" ]; then
+ echo "Run as ./packaging/$(basename "$0") from top level directory of netdata git repository"
+ exit 1
+fi
+
+if [ $# -lt 2 ] || [ $# -gt 3 ]; then
+ echo "Usage: ./packaging/$(basename "$0") <distro> <distro_version> [<netdata_version>]"
+ exit 1
+fi
+
+if ! command -v docker > /dev/null; then
+ echo "Docker CLI not found. You need Docker to run this!"
+ exit 2
+fi
+
+DISTRO="$1"
+DISTRO_VERSION="$2"
+# TODO: Auto compute this?
+VERSION="${3:-1.19.0}"
+
+TAG="netdata/netdata:${DISTRO}_${DISTRO_VERSION}"
+
+docker build \
+ -f ./packaging/Dockerfile.packager \
+ --build-arg DISTRO="$DISTRO" \
+ --build-arg DISTRO_VERSION="$DISTRO_VERSION" \
+ --build-arg VERSION="$VERSION" \
+ -t "$TAG" . |
+ tee build.log
diff --git a/packaging/scripts/install.sh b/packaging/scripts/install.sh
new file mode 100755
index 0000000000..db8d4a67f4
--- /dev/null
+++ b/packaging/scripts/install.sh
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+install_debian_like() {
+ # This is needed to ensure package installs don't prompt for any user input.
+ export DEBIAN_FRONTEND=noninteractive
+
+ apt-get update
+
+ # Install NetData
+ apt-get install -y "/artifacts/netdata_${VERSION}_${ARCH}.deb"
+
+ # Install testing tools
+ apt-get install -y --no-install-recommends \
+ curl netcat jq
+}
+
+install_fedora_like() {
+ # Using a glob pattern here because I can't reliably determine what the
+ # resulting package name will be (TODO: There must be a better way!)
+
+ PKGMGR="$( (command -v dnf > /dev/null && echo "dnf") || echo "yum")"
+
+ # Install NetData
+ "$PKGMGR" install -y /artifacts/netdata-"${VERSION}"-*.rpm
+
+ # Install testing tools
+ "$PKGMGR" install -y curl nc jq
+}
+
+install_suse_like() {
+ # Using a glob pattern here because I can't reliably determine what the
+ # resulting package name will be (TODO: There must be a better way!)
+
+ # Install NetData
+ # FIXME: Allow unsigned packages (for now) #7773
+ zypper install -y --allow-unsigned-rpm \
+ /artifacts/netdata-"${VERSION}"-*.rpm
+
+ # Install testing tools
+ zypper install -y --no-recommends \
+ curl netcat jq
+}
+
+case "${DISTRO}" in
+ debian | ubuntu)
+ install_debian_like
+ ;;
+ fedora | centos)
+ install_fedora_like
+ ;;
+ opensuse)
+ install_suse_like
+ ;;
+ *)
+ printf "ERROR: unspported distro: %s_%s\n" "${DISTRO}" "${DISTRO_VERSION}"
+ exit 1
+ ;;
+esac
diff --git a/packaging/scripts/test.sh b/packaging/scripts/test.sh
new file mode 100755
index 0000000000..24ba2966f5
--- /dev/null
+++ b/packaging/scripts/test.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+wait_for() {
+ host="${1}"
+ port="${2}"
+ name="${3}"
+ timeout="${4:-30}"
+
+ printf "Waiting for %s on %s:%s ... " "${name}" "${host}" "${port}"
+
+ i=0
+ while ! nc -z "${host}" "${port}"; do
+ sleep 1
+ if [ "$i" -gt "$timeout" ]; then
+ printf "Timed out!\n"
+ return 1
+ fi
+ i="$((i + 1))"
+ done
+ printf "OK\n"
+}
+
+netdata -D > netdata.log 2>&1 &
+
+wait_for localhost 19999 netdata
+
+curl -sS http://127.0.0.1:19999/api/v1/info | jq '.version'