Skip to content

Publishing a release #26

Publishing a release

Publishing a release #26

# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0
name: build-and-release
run-name: Publishing a release
on:
push:
tags:
- '*.*.*'
workflow_dispatch:
inputs:
release_type:
description: "Release type"
required: true
type: choice
options:
- public
- unofficial
default: public
ref:
description: "Tag, branch or SHA to checkout"
required: true
type: string
default: "main"
image_prefix:
description: "Prefix to use for destination image name"
required: false
type: string
default: "opentelemetry-ebpf-"
additional_tag:
description: "Additional tag to use when pushing to docker repository"
required: false
type: string
dry_run:
description: "Build everything but don't actually push to repository"
required: false
type: boolean
default: false
env:
BENV_IMAGE: public.ecr.aws/u7d6c4a3/solarwinds-opentelemetry-network:buil-env-buildx
BENV_IMAGE_ARM: public.ecr.aws/u7d6c4a3/solarwinds-opentelemetry-network:build-env-arm64
DOCKER_REGISTRY: docker.io
DOCKER_NAMESPACE: solarwinds
IMAGE_PREFIX: "opentelemetry-ebpf-"
jobs:
build-and-release:
name: Build and release
runs-on: ubuntu-24.04
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref }}
fetch-depth: 0
submodules: recursive
path: src
- name: Compute version numbers
run: |
# sets environment variables for use in later steps.
# see https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable
cd $GITHUB_WORKSPACE/src
source ./version.sh
git_short_hash=$(git rev-parse --short=8 HEAD)
short_version_number="${EBPF_NET_MAJOR_VERSION}.${EBPF_NET_MINOR_VERSION}"
full_version_number="${EBPF_NET_MAJOR_VERSION}.${EBPF_NET_MINOR_VERSION}.${EBPF_NET_PATCH_VERSION}"
if [[ "${{ inputs.release_type }}" == "public" ]]; then
github_tag=v${full_version_number}
else
github_tag=v${full_version_number}-${git_short_hash}
fi
echo "git_short_hash=${git_short_hash}" >> "$GITHUB_ENV"
echo "short_version_number=${short_version_number}" >> "$GITHUB_ENV"
echo "full_version_number=${full_version_number}" >> "$GITHUB_ENV"
echo "github_tag=${github_tag}" >> "$GITHUB_ENV"
- name: Output build information
run: |
echo "github.workspace = ${{ github.workspace }}"
echo "github.ref = ${{ github.ref }}"
echo "inputs.image_prefix = ${{ inputs.image_prefix }}"
echo "inputs.dry_run = ${{ inputs.dry_run }}"
echo "git_short_hash = ${git_short_hash}"
echo "short_version_number = ${short_version_number}"
echo "full_version_number = ${full_version_number}"
echo "github_tag = ${github_tag}"
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Fetch build environment
run: |
docker pull $BENV_IMAGE $BENV_IMAGE_ARM
- name: Build artifacts
run: |
mkdir -p $GITHUB_WORKSPACE/out
docker run -t --rm \
--mount "type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock" \
--mount "type=bind,source=$GITHUB_WORKSPACE/src,destination=/root/src,readonly" \
--mount "type=bind,source=$GITHUB_WORKSPACE/out,destination=/root/out" \
--env EBPF_NET_SRC_ROOT=/root/src \
$BENV_IMAGE \
./build.sh docker
docker run -t --rm \
--mount "type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock" \
--mount "type=bind,source=$GITHUB_WORKSPACE/src,destination=/root/src,readonly" \
--mount "type=bind,source=$GITHUB_WORKSPACE/out,destination=/root/out" \
--env EBPF_NET_SRC_ROOT=/root/src \
--env ENABLE_ARM64_BUILD=TRUE \
$BENV_IMAGE_ARM \
./build.sh docker
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.OPENTELEMETRY_DOCKER_HUB_CI_USER }}
password: ${{ secrets.OPENTELEMETRY_DOCKER_HUB_CI_PASSWORD }}
- name: Push to container registry
run: |
cd $GITHUB_WORKSPACE/src
if [[ "${{ inputs.release_type }}" == "public" ]]; then
tags=(
latest
latest-v${short_version_number}
v${full_version_number}
)
else
tags=(
v${full_version_number}-${git_short_hash}
)
fi
if [[ "${{ inputs.additional_tag }}" != "" ]]; then
tags=(${tags[@]} "${{ inputs.additional_tag }}")
fi
images=(
reducer
kernel-collector
# cloud-collector
k8s-watcher
k8s-relay
)
# strip potential "https://" prefix and trailing slashes from docker registry
docker_registry=$(sed -e 's,^https://,,' -e 's,/*$,,' <<< $DOCKER_REGISTRY)
for image in ${images[@]}; do
image_name="${IMAGE_PREFIX}${image}"
image_path="${docker_registry}/${DOCKER_NAMESPACE}/${image_name}"
docker tag "${image}" ${image_path}:v${full_version_number}-amd64
docker tag "${image}-arm64" ${image_path}:v${full_version_number}-arm64
if [[ "${{ inputs.dry_run }}" == "false" ]];
then
docker push ${image_path}:v${full_version_number}-arm64
docker push ${image_path}:v${full_version_number}-amd64
else
echo "Would run: docker push ${image_path}:v${full_version_number}-{arm64,amd64}"
fi
for tag in ${tags[@]}; do
manifest_cmd="docker manifest create ${image_path}:${tag}"
manifest_cmd="${manifest_cmd} --amend ${image_path}:v${full_version_number}-arm64"
manifest_cmd="${manifest_cmd} --amend ${image_path}:v${full_version_number}-amd64"
if [[ "${{ inputs.dry_run }}" == "false" ]]; then
eval $manifest_cmd
docker manifest push ${image_path}:${tag}
else
echo "Would run: $manifest_cmd"
echo "Would run: docker manifest push ${image_path}:${tag}"
fi
done
done
docker images --no-trunc