diff --git a/.circleci/config.yml b/.circleci/config.yml index 690ce7bfba5..52b50f6e7e0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -121,6 +121,8 @@ workflows: - coverage - windows-test - windows-msi + - deb-package + - rpm-package filters: branches: ignore: /.*/ @@ -144,6 +146,22 @@ workflows: filters: tags: only: /^v([0-9])+.([0-9])+.([0-9])+.*/ + - build-package: + name: deb-package + package_type: deb + requires: + - cross-compile + filters: + tags: + only: /^v([0-9])+.([0-9])+.([0-9])+.*/ + - build-package: + name: rpm-package + package_type: rpm + requires: + - cross-compile + filters: + tags: + only: /^v([0-9])+.([0-9])+.([0-9])+.*/ jobs: setup-and-lint: @@ -317,3 +335,38 @@ jobs: - persist_to_workspace: root: ~/ paths: project/bin + + build-package: + executor: golang + parameters: + package_type: + type: enum + enum: ["deb", "rpm"] + steps: + - checkout + - attach_to_workspace + - run: + name: Install fpm and dependencies + command: | + sudo apt-get update + sudo apt-get install -y ruby ruby-dev rubygems build-essential rpm + sudo gem install --no-document fpm -v 1.11.0 + - run: + name: Build << parameters.package_type >> amd64 package + command: ./internal/buildscripts/packaging/fpm/<< parameters.package_type >>/build.sh "${CIRCLE_TAG:-}" "amd64" "./bin/" + - run: + name: Build << parameters.package_type >> arm64 package + command: ./internal/buildscripts/packaging/fpm/<< parameters.package_type >>/build.sh "${CIRCLE_TAG:-}" "arm64" "./bin/" + - run: + name: Test << parameters.package_type >> package installation + command: | + if [[ "<< parameters.package_type >>" = "deb" ]]; then + sudo dpkg -i bin/otel-collector*amd64.deb + else + sudo rpm -ivh bin/otel-collector*x86_64.rpm + fi + test -f /usr/bin/otelcol || (echo "/usr/bin/otelcol not found!" && exit 1) + test -f /etc/otel-collector/config.yaml || (echo "/etc/otel-collector/config.yaml not found" && exit 1) + - persist_to_workspace: + root: ~/ + paths: project/bin \ No newline at end of file diff --git a/Makefile b/Makefile index 1ff17a89ae1..0a98fa34913 100644 --- a/Makefile +++ b/Makefile @@ -204,6 +204,13 @@ binaries-linux_arm64: binaries-windows_amd64: GOOS=windows GOARCH=amd64 EXTENSION=.exe $(MAKE) binaries +.PHONY: deb-rpm-package +%-package: ARCH ?= amd64 +%-package: + $(MAKE) binaries-linux_$(ARCH) + docker build -t otelcol-fpm internal/buildscripts/packaging/fpm + docker run --rm -v $(CURDIR):/repo -e PACKAGE=$* -e VERSION=$(VERSION) -e ARCH=$(ARCH) otelcol-fpm + # Definitions for ProtoBuf generation. # The source directory for OTLP ProtoBufs. diff --git a/internal/buildscripts/packaging/fpm/Dockerfile b/internal/buildscripts/packaging/fpm/Dockerfile new file mode 100644 index 00000000000..bdc36c6fa6d --- /dev/null +++ b/internal/buildscripts/packaging/fpm/Dockerfile @@ -0,0 +1,16 @@ +FROM debian:9 + +RUN apt-get update && \ + apt-get install -y ruby ruby-dev rubygems build-essential git rpm + +RUN gem install --no-document fpm -v 1.11.0 + +VOLUME /repo +WORKDIR /repo + +ENV PACKAGE="deb" +ENV VERSION="" +ENV ARCH="amd64" +ENV OUTPUT_DIR="/repo/bin/" + +CMD ./internal/buildscripts/packaging/fpm/$PACKAGE/build.sh "$VERSION" "$ARCH" "$OUTPUT_DIR" \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/deb/README.md b/internal/buildscripts/packaging/fpm/deb/README.md new file mode 100644 index 00000000000..db9eca1c2ff --- /dev/null +++ b/internal/buildscripts/packaging/fpm/deb/README.md @@ -0,0 +1,10 @@ +# Build otel-collector deb package + +Build the otel-collector deb package with [fpm](https://github.com/jordansissel/fpm). + +To build the deb package, run `make deb-package` from the repo root directory. The deb package will be written to +`bin/otel-collector__.deb`. + +By default, `` is `amd64` and `` is the latest git tag with `-post` appended, e.g. `1.2.3-post`. +To override these defaults, set the `ARCH` and `VERSION` environment variables, e.g. +`ARCH=arm64 VERSION=4.5.6 make deb-package`. \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/deb/build.sh b/internal/buildscripts/packaging/fpm/deb/build.sh new file mode 100755 index 00000000000..5deae33310d --- /dev/null +++ b/internal/buildscripts/packaging/fpm/deb/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +set -euxo pipefail + +SCRIPT_DIR="$( cd "$( dirname ${BASH_SOURCE[0]} )" && pwd )" +REPO_DIR="$( cd "$SCRIPT_DIR/../../../../../" && pwd )" +VERSION="${1:-}" +ARCH="${2:-"amd64"}" +OUTPUT_DIR="${3:-"$REPO_DIR/bin/"}" +OTELCOL_PATH="$REPO_DIR/bin/otelcol_linux_amd64" +CONFIG_PATH="$REPO_DIR/examples/otel-local-config.yaml" + +if [[ -z "$VERSION" ]]; then + latest_tag="$( git describe --abbrev=0 --match v[0-9]* )" + VERSION="${latest_tag}-post" +fi + +fpm -s dir -t deb -n otel-collector -v ${VERSION#v} -f -p "$OUTPUT_DIR" \ + --vendor "OpenTelemetry Community" \ + --maintainer "OpenTelemetry Community " \ + --description "OpenTelemetry Collector" \ + --license "Apache 2.0" \ + --url "https://github.com/open-telemetry/opentelemetry-collector" \ + --architecture "$ARCH" \ + --config-files /etc/otel-collector/config.yaml \ + --deb-dist "stable" \ + $OTELCOL_PATH=/usr/bin/otelcol \ + $CONFIG_PATH=/etc/otel-collector/config.yaml \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/rpm/README.md b/internal/buildscripts/packaging/fpm/rpm/README.md new file mode 100644 index 00000000000..b31e42eb147 --- /dev/null +++ b/internal/buildscripts/packaging/fpm/rpm/README.md @@ -0,0 +1,10 @@ +# Build otel-collector rpm package + +Build the otel-collector rpm package with [fpm](https://github.com/jordansissel/fpm). + +To build the rpm package, run `make rpm-package` from the repo root directory. The rpm package will be written to +`bin/otel-collector-..rpm`. + +By default, `` is `amd64` and `` is the latest git tag with `~post` appended, e.g. `1.2.3~post`. +To override these defaults, set the `ARCH` and `VERSION` environment variables, e.g. +`ARCH=arm64 VERSION=4.5.6 make rpm-package`. \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/rpm/build.sh b/internal/buildscripts/packaging/fpm/rpm/build.sh new file mode 100755 index 00000000000..121d18097b5 --- /dev/null +++ b/internal/buildscripts/packaging/fpm/rpm/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +set -euxo pipefail + +SCRIPT_DIR="$( cd "$( dirname ${BASH_SOURCE[0]} )" && pwd )" +REPO_DIR="$( cd "$SCRIPT_DIR/../../../../../" && pwd )" +VERSION="${1:-}" +ARCH="${2:-"amd64"}" +OUTPUT_DIR="${3:-"$REPO_DIR/bin/"}" +OTELCOL_PATH="$REPO_DIR/bin/otelcol_linux_amd64" +CONFIG_PATH="$REPO_DIR/examples/otel-local-config.yaml" + +if [[ -z "$VERSION" ]]; then + latest_tag="$( git describe --abbrev=0 --match v[0-9]* )" + VERSION="${latest_tag}~post" +fi + +fpm -s dir -t rpm -n otel-collector -v ${VERSION#v} -f -p "$OUTPUT_DIR" \ + --vendor "OpenTelemetry Community" \ + --maintainer "OpenTelemetry Community " \ + --description "OpenTelemetry Collector" \ + --license "Apache 2.0" \ + --rpm-summary "OpenTelemetry Collector" \ + --url "https://github.com/open-telemetry/opentelemetry-collector" \ + --architecture "$ARCH" \ + --config-files /etc/otel-collector/config.yaml \ + $OTELCOL_PATH=/usr/bin/otelcol \ + $CONFIG_PATH=/etc/otel-collector/config.yaml \ No newline at end of file