Build ARM64 images
This commit is contained in:
parent
13d66f2ae7
commit
cee1b5b079
100
.github/workflows/push.yml
vendored
100
.github/workflows/push.yml
vendored
@ -1,3 +1,4 @@
|
|||||||
|
---
|
||||||
name: push
|
name: push
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@ -13,55 +14,66 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Checks syntax of our code
|
name: Checks syntax of our code
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
# Full git history is needed to get a proper list of changed files within `super-linter`
|
# Full git history is needed to get a proper
|
||||||
fetch-depth: 0
|
# list of changed files within `super-linter`
|
||||||
- uses: actions/setup-python@v4
|
fetch-depth: 0
|
||||||
with:
|
- uses: actions/setup-python@v4
|
||||||
python-version: '3.9'
|
with:
|
||||||
- name: Lint Code Base
|
python-version: '3.9'
|
||||||
uses: github/super-linter@v4
|
- name: Lint Code Base
|
||||||
env:
|
uses: github/super-linter@v4
|
||||||
DEFAULT_BRANCH: develop
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
DEFAULT_BRANCH: develop
|
||||||
SUPPRESS_POSSUM: true
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
LINTER_RULES_PATH: /
|
SUPPRESS_POSSUM: true
|
||||||
VALIDATE_ALL_CODEBASE: false
|
LINTER_RULES_PATH: /
|
||||||
VALIDATE_DOCKERFILE: false
|
VALIDATE_ALL_CODEBASE: false
|
||||||
FILTER_REGEX_EXCLUDE: (.*/)?(LICENSE|configuration/.*)
|
VALIDATE_DOCKERFILE: false
|
||||||
|
FILTER_REGEX_EXCLUDE: (.*/)?(LICENSE|configuration/.*)
|
||||||
EDITORCONFIG_FILE_NAME: .ecrc
|
EDITORCONFIG_FILE_NAME: .ecrc
|
||||||
DOCKERFILE_HADOLINT_FILE_NAME: .hadolint.yaml
|
DOCKERFILE_HADOLINT_FILE_NAME: .hadolint.yaml
|
||||||
MARKDOWN_CONFIG_FILE: .markdown-lint.yml
|
MARKDOWN_CONFIG_FILE: .markdown-lint.yml
|
||||||
PYTHON_BLACK_CONFIG_FILE: pyproject.toml
|
PYTHON_BLACK_CONFIG_FILE: pyproject.toml
|
||||||
PYTHON_FLAKE8_CONFIG_FILE: .flake8
|
PYTHON_FLAKE8_CONFIG_FILE: .flake8
|
||||||
PYTHON_ISORT_CONFIG_FILE: pyproject.toml
|
PYTHON_ISORT_CONFIG_FILE: pyproject.toml
|
||||||
|
YAML_CONFIG_FILE: .yamllint.yaml
|
||||||
build:
|
build:
|
||||||
continue-on-error: ${{ matrix.docker_from == 'alpine:edge' }}
|
continue-on-error: ${{ matrix.build_cmd != './build-latest.sh' }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
build_cmd:
|
build_cmd:
|
||||||
- ./build-latest.sh
|
- ./build-latest.sh
|
||||||
- PRERELEASE=true ./build-latest.sh
|
- PRERELEASE=true ./build-latest.sh
|
||||||
- ./build.sh feature
|
- ./build.sh feature
|
||||||
- ./build.sh develop
|
- ./build.sh develop
|
||||||
docker_from:
|
platform:
|
||||||
- '' # use the default of the build script
|
- linux/amd64
|
||||||
|
- linux/arm64
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
env:
|
||||||
|
GH_ACTION: enable
|
||||||
|
IMAGE_NAMES: docker.io/netboxcommunity/netbox
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Builds new NetBox Docker Images
|
name: Builds new NetBox Docker Images
|
||||||
steps:
|
steps:
|
||||||
- id: git-checkout
|
- id: git-checkout
|
||||||
name: Checkout
|
name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- id: docker-build
|
- id: qemu-setup
|
||||||
name: Build the image from '${{ matrix.docker_from }}' with '${{ matrix.build_cmd }}'
|
name: Set up QEMU
|
||||||
run: ${{ matrix.build_cmd }}
|
uses: docker/setup-qemu-action@v1
|
||||||
env:
|
- id: buildx-setup
|
||||||
DOCKER_FROM: ${{ matrix.docker_from }}
|
name: Set up Docker Buildx
|
||||||
GH_ACTION: enable
|
uses: docker/setup-buildx-action@v1
|
||||||
- id: docker-test
|
- id: docker-build
|
||||||
name: Test the image
|
name: Build the image for '${{ matrix.platform }}' with '${{ matrix.build_cmd }}'
|
||||||
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
|
run: ${{ matrix.build_cmd }}
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
env:
|
||||||
|
BUILDX_PLATFORM: ${{ matrix.platform }}
|
||||||
|
BUILDX_BUILDER_NAME: ${{ steps.buildx-setup.outputs.name }}
|
||||||
|
- id: docker-test
|
||||||
|
name: Test the image
|
||||||
|
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
|
||||||
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
|
130
.github/workflows/release.yml
vendored
130
.github/workflows/release.yml
vendored
@ -1,3 +1,4 @@
|
|||||||
|
---
|
||||||
name: release
|
name: release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@ -6,82 +7,77 @@ on:
|
|||||||
- published
|
- published
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '45 5 * * *'
|
- cron: '45 5 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
build_cmd:
|
build_cmd:
|
||||||
- ./build-latest.sh
|
- ./build-latest.sh
|
||||||
- PRERELEASE=true ./build-latest.sh
|
- PRERELEASE=true ./build-latest.sh
|
||||||
- ./build.sh feature
|
- ./build.sh feature
|
||||||
- ./build.sh develop
|
- ./build.sh develop
|
||||||
|
platform:
|
||||||
|
- linux/amd64,linux/arm64
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Builds new NetBox Docker Images
|
name: Builds new NetBox Docker Images
|
||||||
env:
|
env:
|
||||||
GH_ACTION: enable
|
GH_ACTION: enable
|
||||||
|
IMAGE_NAMES: docker.io/netboxcommunity/netbox quay.io/netboxcommunity/netbox ghcr.io/netbox-community/netbox
|
||||||
steps:
|
steps:
|
||||||
-
|
- id: source-checkout
|
||||||
name: Checkout
|
name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
-
|
- id: set-netbox-docker-version
|
||||||
name: Get Version of NetBox Docker
|
name: Get Version of NetBox Docker
|
||||||
run: |
|
run: echo "::set-output name=version::$(cat VERSION)"
|
||||||
echo "::set-output name=version::$(cat VERSION)"
|
shell: bash
|
||||||
shell: bash
|
- id: qemu-setup
|
||||||
-
|
name: Set up QEMU
|
||||||
id: docker-build
|
uses: docker/setup-qemu-action@v1
|
||||||
name: Build the image with '${{ matrix.build_cmd }}'
|
- id: buildx-setup
|
||||||
run: ${{ matrix.build_cmd }}
|
name: Set up Docker Buildx
|
||||||
-
|
uses: docker/setup-buildx-action@v1
|
||||||
name: Test the image
|
- id: docker-build
|
||||||
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
|
name: Build the image with '${{ matrix.build_cmd }}'
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
run: ${{ matrix.build_cmd }}
|
||||||
|
- id: test-image
|
||||||
# docker.io
|
name: Test the image
|
||||||
-
|
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
|
||||||
name: Login to docker.io
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
uses: docker/login-action@v2
|
# docker.io
|
||||||
with:
|
- id: docker-io-login
|
||||||
registry: docker.io
|
name: Login to docker.io
|
||||||
username: ${{ secrets.dockerhub_username }}
|
uses: docker/login-action@v2
|
||||||
password: ${{ secrets.dockerhub_password }}
|
with:
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
registry: docker.io
|
||||||
-
|
username: ${{ secrets.dockerhub_username }}
|
||||||
name: Push the image to docker.io
|
password: ${{ secrets.dockerhub_password }}
|
||||||
run: ${{ matrix.build_cmd }} --push-only
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
# quay.io
|
||||||
|
- id: quay-io-login
|
||||||
# quay.io
|
name: Login to Quay.io
|
||||||
-
|
uses: docker/login-action@v2
|
||||||
name: Login to Quay.io
|
with:
|
||||||
uses: docker/login-action@v2
|
registry: quay.io
|
||||||
with:
|
username: ${{ secrets.quayio_username }}
|
||||||
registry: quay.io
|
password: ${{ secrets.quayio_password }}
|
||||||
username: ${{ secrets.quayio_username }}
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
password: ${{ secrets.quayio_password }}
|
# ghcr.io
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
- id: ghcr-io-login
|
||||||
-
|
name: Login to GitHub Container Registry
|
||||||
name: Build and push the image with '${{ matrix.build_cmd }}'
|
uses: docker/login-action@v2
|
||||||
run: ${{ matrix.build_cmd }} --push
|
with:
|
||||||
env:
|
registry: ghcr.io
|
||||||
DOCKER_REGISTRY: quay.io
|
username: ${{ github.repository_owner }}
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
# ghcr.io
|
- id: build-and-push
|
||||||
-
|
name: Push the image
|
||||||
name: Login to GitHub Container Registry
|
run: ${{ matrix.build_cmd }} --push
|
||||||
uses: docker/login-action@v2
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
with:
|
env:
|
||||||
registry: ghcr.io
|
BUILDX_PLATFORM: ${{ matrix.platform }}
|
||||||
username: ${{ github.repository_owner }}
|
BUILDX_BUILDER_NAME: ${{ steps.buildx-setup.outputs.name }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
|
||||||
-
|
|
||||||
name: Build and push the image with '${{ matrix.build_cmd }}'
|
|
||||||
run: ${{ matrix.build_cmd }} --push
|
|
||||||
env:
|
|
||||||
DOCKER_REGISTRY: ghcr.io
|
|
||||||
DOCKER_ORG: netbox-community
|
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
|
||||||
|
5
.yamllint.yaml
Normal file
5
.yamllint.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
rules:
|
||||||
|
line-length:
|
||||||
|
max: 120
|
@ -1,8 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
push_image_to_registry() {
|
|
||||||
local target_tag=$1
|
|
||||||
echo "⏫ Pushing '${target_tag}'"
|
|
||||||
$DRY docker push "${target_tag}"
|
|
||||||
echo "✅ Finished pushing the Docker image '${target_tag}'."
|
|
||||||
}
|
|
400
build.sh
400
build.sh
@ -6,10 +6,9 @@ echo "▶️ $0 $*"
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
|
if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
|
||||||
echo "Usage: ${0} <branch> [--push|--push-only]"
|
echo "Usage: ${0} <branch> [--push]"
|
||||||
echo " branch The branch or tag to build. Required."
|
echo " branch The branch or tag to build. Required."
|
||||||
echo " --push Pushes the built Docker image to the registry."
|
echo " --push Pushes the built Docker image to the registry."
|
||||||
echo " --push-only Only pushes the Docker image to the registry, but does not build it."
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "You can use the following ENV variables to customize the build:"
|
echo "You can use the following ENV variables to customize the build:"
|
||||||
echo " SRC_ORG Which fork of netbox to use (i.e. github.com/\${SRC_ORG}/\${SRC_REPO})."
|
echo " SRC_ORG Which fork of netbox to use (i.e. github.com/\${SRC_ORG}/\${SRC_REPO})."
|
||||||
@ -30,15 +29,10 @@ if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
|
|||||||
echo " When <branch>=master: latest"
|
echo " When <branch>=master: latest"
|
||||||
echo " When <branch>=develop: snapshot"
|
echo " When <branch>=develop: snapshot"
|
||||||
echo " Else: same as <branch>"
|
echo " Else: same as <branch>"
|
||||||
echo " DOCKER_REGISTRY The Docker repository's registry (i.e. '\${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}'')"
|
echo " IMAGE_NAMES The names used for the image including the registry"
|
||||||
echo " Used for tagging the image."
|
echo " Used for tagging the image."
|
||||||
echo " Default: docker.io"
|
echo " Default: docker.io/netboxcommunity/netbox"
|
||||||
echo " DOCKER_ORG The Docker repository's organisation (i.e. '\${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}'')"
|
echo " Example: 'docker.io/netboxcommunity/netbox quay.io/netboxcommunity/netbox'"
|
||||||
echo " Used for tagging the image."
|
|
||||||
echo " Default: netboxcommunity"
|
|
||||||
echo " DOCKER_REPO The Docker repository's name (i.e. '\${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}'')"
|
|
||||||
echo " Used for tagging the image."
|
|
||||||
echo " Default: netbox"
|
|
||||||
echo " DOCKER_TAG The name of the tag which is applied to the image."
|
echo " DOCKER_TAG The name of the tag which is applied to the image."
|
||||||
echo " Useful for pushing into another registry than hub.docker.com."
|
echo " Useful for pushing into another registry than hub.docker.com."
|
||||||
echo " Default: \${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}:\${TAG}"
|
echo " Default: \${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}:\${TAG}"
|
||||||
@ -50,9 +44,24 @@ if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
|
|||||||
echo " Default: Dockerfile"
|
echo " Default: Dockerfile"
|
||||||
echo " DOCKER_FROM The base image to use."
|
echo " DOCKER_FROM The base image to use."
|
||||||
echo " Default: 'debian:11-slim'"
|
echo " Default: 'debian:11-slim'"
|
||||||
echo " DOCKER_TARGET A specific target to build."
|
echo " BUILDX_PLATFORMS"
|
||||||
echo " It's currently not possible to pass multiple targets."
|
echo " Specifies the platform(s) to build the image for."
|
||||||
echo " Default: main"
|
echo " Example: 'linux/amd64,linux/arm64'"
|
||||||
|
echo " Default: 'linux/amd64'"
|
||||||
|
echo " BUILDX_BUILDER_NAME"
|
||||||
|
echo " If defined, the image build will be assigned to the given builder."
|
||||||
|
echo " If you specify this variable, make sure that the builder exists."
|
||||||
|
echo " If this value is not defined, a new builx builder with the directory name of the"
|
||||||
|
echo " current directory (i.e. '$(basename "${PWD}")') is created."
|
||||||
|
echo " Example: 'clever_lovelace'"
|
||||||
|
echo " Default: undefined"
|
||||||
|
echo " BUILDX_REMOVE_BUILDER"
|
||||||
|
echo " If defined (and only if BUILDX_BUILDER_NAME is undefined),"
|
||||||
|
echo " then the buildx builder created by this script will be removed after use."
|
||||||
|
echo " This is useful if you build NetBox Docker on an automated system that does"
|
||||||
|
echo " not manage the builders for you."
|
||||||
|
echo " Example: 'on'"
|
||||||
|
echo " Default: undefined"
|
||||||
echo " HTTP_PROXY The proxy to use for http requests."
|
echo " HTTP_PROXY The proxy to use for http requests."
|
||||||
echo " Example: http://proxy.domain.tld:3128"
|
echo " Example: http://proxy.domain.tld:3128"
|
||||||
echo " Default: undefined"
|
echo " Default: undefined"
|
||||||
@ -97,6 +106,9 @@ fi
|
|||||||
|
|
||||||
source ./build-functions/gh-functions.sh
|
source ./build-functions/gh-functions.sh
|
||||||
|
|
||||||
|
IMAGE_NAMES="${IMAGE_NAMES-docker.io/netboxcommunity/netbox}"
|
||||||
|
IFS=' ' read -ra IMAGE_NAMES <<<"${IMAGE_NAMES}"
|
||||||
|
|
||||||
###
|
###
|
||||||
# Enabling dry-run mode
|
# Enabling dry-run mode
|
||||||
###
|
###
|
||||||
@ -220,188 +232,194 @@ develop)
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
###
|
###
|
||||||
# Determine targets to build
|
# composing the final TARGET_DOCKER_TAG
|
||||||
###
|
###
|
||||||
DEFAULT_DOCKER_TARGETS=("main")
|
TARGET_DOCKER_TAG="${DOCKER_TAG-${TAG}}"
|
||||||
DOCKER_TARGETS=("${DOCKER_TARGET:-"${DEFAULT_DOCKER_TARGETS[@]}"}")
|
TARGET_DOCKER_TAG_PROJECT="${TARGET_DOCKER_TAG}-${PROJECT_VERSION}"
|
||||||
echo "🏭 Building the following targets:" "${DOCKER_TARGETS[@]}"
|
|
||||||
|
|
||||||
|
###
|
||||||
|
# composing the additional DOCKER_SHORT_TAG,
|
||||||
|
# i.e. "v2.6.1" becomes "v2.6",
|
||||||
|
# which is only relevant for version tags
|
||||||
|
# Also let "latest" follow the highest version
|
||||||
|
###
|
||||||
|
if [[ "${TAG}" =~ ^v([0-9]+)\.([0-9]+)\.[0-9]+$ ]]; then
|
||||||
|
MAJOR=${BASH_REMATCH[1]}
|
||||||
|
MINOR=${BASH_REMATCH[2]}
|
||||||
|
|
||||||
|
TARGET_DOCKER_SHORT_TAG="${DOCKER_SHORT_TAG-v${MAJOR}.${MINOR}}"
|
||||||
|
TARGET_DOCKER_LATEST_TAG="latest"
|
||||||
|
TARGET_DOCKER_SHORT_TAG_PROJECT="${TARGET_DOCKER_SHORT_TAG}-${PROJECT_VERSION}"
|
||||||
|
TARGET_DOCKER_LATEST_TAG_PROJECT="${TARGET_DOCKER_LATEST_TAG}-${PROJECT_VERSION}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
IMAGE_NAME_TAGS=()
|
||||||
|
for IMAGE_NAME in "${IMAGE_NAMES[@]}"; do
|
||||||
|
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_TAG}")
|
||||||
|
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_TAG_PROJECT}")
|
||||||
|
done
|
||||||
|
if [ -n "${TARGET_DOCKER_SHORT_TAG}" ]; then
|
||||||
|
for IMAGE_NAME in "${IMAGE_NAMES[@]}"; do
|
||||||
|
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_SHORT_TAG}")
|
||||||
|
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_SHORT_TAG_PROJECT}")
|
||||||
|
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_LATEST_TAG}")
|
||||||
|
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_LATEST_TAG_PROJECT}")
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
gh_env "FINAL_DOCKER_TAG=${IMAGE_NAME_TAGS[0]}"
|
||||||
|
|
||||||
|
###
|
||||||
|
# Checking if the build is necessary,
|
||||||
|
# meaning build only if one of those values changed:
|
||||||
|
# - base image digest
|
||||||
|
# - netbox git ref (Label: netbox.git-ref)
|
||||||
|
# - netbox-docker git ref (Label: org.opencontainers.image.revision)
|
||||||
|
###
|
||||||
|
# Load information from registry (only for docker.io)
|
||||||
|
SHOULD_BUILD="false"
|
||||||
|
BUILD_REASON=""
|
||||||
|
if [ -z "${GH_ACTION}" ]; then
|
||||||
|
# Asuming non Github builds should always proceed
|
||||||
|
SHOULD_BUILD="true"
|
||||||
|
BUILD_REASON="${BUILD_REASON} interactive"
|
||||||
|
elif [[ "${IMAGE_NAME_TAGS[0]}" = docker.io* ]]; then
|
||||||
|
source ./build-functions/get-public-image-config.sh
|
||||||
|
IFS=':' read -ra DOCKER_FROM_SPLIT <<<"${DOCKER_FROM}"
|
||||||
|
if ! [[ ${DOCKER_FROM_SPLIT[0]} =~ .*/.* ]]; then
|
||||||
|
# Need to use "library/..." for images the have no two part name
|
||||||
|
DOCKER_FROM_SPLIT[0]="library/${DOCKER_FROM_SPLIT[0]}"
|
||||||
|
fi
|
||||||
|
IFS='/' read -ra ORG_REPO <<<"${IMAGE_NAMES[0]}"
|
||||||
|
echo "Checking labels for '${ORG_REPO[1]}' and '${ORG_REPO[2]}'"
|
||||||
|
BASE_LAST_LAYER=$(get_image_last_layer "${DOCKER_FROM_SPLIT[0]}" "${DOCKER_FROM_SPLIT[1]}")
|
||||||
|
mapfile -t IMAGES_LAYERS_OLD < <(get_image_layers "${ORG_REPO[1]}"/"${ORG_REPO[2]}" "${TAG}")
|
||||||
|
NETBOX_GIT_REF_OLD=$(get_image_label netbox.git-ref "${ORG_REPO[1]}"/"${ORG_REPO[2]}" "${TAG}")
|
||||||
|
GIT_REF_OLD=$(get_image_label org.opencontainers.image.revision "${ORG_REPO[1]}"/"${ORG_REPO[2]}" "${TAG}")
|
||||||
|
|
||||||
|
if ! printf '%s\n' "${IMAGES_LAYERS_OLD[@]}" | grep -q -P "^${BASE_LAST_LAYER}\$"; then
|
||||||
|
SHOULD_BUILD="true"
|
||||||
|
BUILD_REASON="${BUILD_REASON} debian"
|
||||||
|
fi
|
||||||
|
if [ "${NETBOX_GIT_REF}" != "${NETBOX_GIT_REF_OLD}" ]; then
|
||||||
|
SHOULD_BUILD="true"
|
||||||
|
BUILD_REASON="${BUILD_REASON} netbox"
|
||||||
|
fi
|
||||||
|
if [ "${GIT_REF}" != "${GIT_REF_OLD}" ]; then
|
||||||
|
SHOULD_BUILD="true"
|
||||||
|
BUILD_REASON="${BUILD_REASON} netbox-docker"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
SHOULD_BUILD="true"
|
||||||
|
BUILD_REASON="${BUILD_REASON} no-check"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${SHOULD_BUILD}" != "true" ]; then
|
||||||
|
echo "Build skipped because sources didn't change"
|
||||||
|
echo "::set-output name=skipped::true"
|
||||||
|
exit 0 # Nothing to do -> exit
|
||||||
|
else
|
||||||
|
gh_echo "::set-output name=skipped::false"
|
||||||
|
fi
|
||||||
gh_echo "::endgroup::"
|
gh_echo "::endgroup::"
|
||||||
|
|
||||||
###
|
###
|
||||||
# Build each target
|
# Build the image
|
||||||
###
|
###
|
||||||
export DOCKER_BUILDKIT=${DOCKER_BUILDKIT-1}
|
gh_echo "::group::🏗 Building the image"
|
||||||
for DOCKER_TARGET in "${DOCKER_TARGETS[@]}"; do
|
###
|
||||||
gh_echo "::group::🏗 Building the target '${DOCKER_TARGET}'"
|
# Composing all arguments for `docker build`
|
||||||
echo "🏗 Building the target '${DOCKER_TARGET}'"
|
###
|
||||||
|
DOCKER_BUILD_ARGS=(
|
||||||
###
|
--pull
|
||||||
# composing the final TARGET_DOCKER_TAG
|
--target main
|
||||||
###
|
-f "${DOCKERFILE}"
|
||||||
TARGET_DOCKER_TAG="${DOCKER_TAG-${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_REPO}:${TAG}}"
|
)
|
||||||
if [ "${DOCKER_TARGET}" != "main" ]; then
|
for IMAGE_NAME in "${IMAGE_NAME_TAGS[@]}"; do
|
||||||
TARGET_DOCKER_TAG="${TARGET_DOCKER_TAG}-${DOCKER_TARGET}"
|
DOCKER_BUILD_ARGS+=(-t "${IMAGE_NAME}")
|
||||||
fi
|
|
||||||
TARGET_DOCKER_TAG_PROJECT="${TARGET_DOCKER_TAG}-${PROJECT_VERSION}"
|
|
||||||
|
|
||||||
gh_env "FINAL_DOCKER_TAG=${TARGET_DOCKER_TAG_PROJECT}"
|
|
||||||
gh_echo "::set-output name=skipped::false"
|
|
||||||
|
|
||||||
###
|
|
||||||
# composing the additional DOCKER_SHORT_TAG,
|
|
||||||
# i.e. "v2.6.1" becomes "v2.6",
|
|
||||||
# which is only relevant for version tags
|
|
||||||
# Also let "latest" follow the highest version
|
|
||||||
###
|
|
||||||
if [[ "${TAG}" =~ ^v([0-9]+)\.([0-9]+)\.[0-9]+$ ]]; then
|
|
||||||
MAJOR=${BASH_REMATCH[1]}
|
|
||||||
MINOR=${BASH_REMATCH[2]}
|
|
||||||
|
|
||||||
TARGET_DOCKER_SHORT_TAG="${DOCKER_SHORT_TAG-${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_REPO}:v${MAJOR}.${MINOR}}"
|
|
||||||
TARGET_DOCKER_LATEST_TAG="${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_REPO}:latest"
|
|
||||||
|
|
||||||
if [ "${DOCKER_TARGET}" != "main" ]; then
|
|
||||||
TARGET_DOCKER_SHORT_TAG="${TARGET_DOCKER_SHORT_TAG}-${DOCKER_TARGET}"
|
|
||||||
TARGET_DOCKER_LATEST_TAG="${TARGET_DOCKER_LATEST_TAG}-${DOCKER_TARGET}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
TARGET_DOCKER_SHORT_TAG_PROJECT="${TARGET_DOCKER_SHORT_TAG}-${PROJECT_VERSION}"
|
|
||||||
TARGET_DOCKER_LATEST_TAG_PROJECT="${TARGET_DOCKER_LATEST_TAG}-${PROJECT_VERSION}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
###
|
|
||||||
# Proceeding to buils stage, except if `--push-only` is passed
|
|
||||||
###
|
|
||||||
if [ "${2}" != "--push-only" ]; then
|
|
||||||
###
|
|
||||||
# Checking if the build is necessary,
|
|
||||||
# meaning build only if one of those values changed:
|
|
||||||
# - base image digest
|
|
||||||
# - netbox git ref (Label: netbox.git-ref)
|
|
||||||
# - netbox-docker git ref (Label: org.opencontainers.image.revision)
|
|
||||||
###
|
|
||||||
# Load information from registry (only for docker.io)
|
|
||||||
SHOULD_BUILD="false"
|
|
||||||
BUILD_REASON=""
|
|
||||||
if [ -z "${GH_ACTION}" ]; then
|
|
||||||
# Asuming non Github builds should always proceed
|
|
||||||
SHOULD_BUILD="true"
|
|
||||||
BUILD_REASON="${BUILD_REASON} interactive"
|
|
||||||
elif [ "$DOCKER_REGISTRY" = "docker.io" ]; then
|
|
||||||
source ./build-functions/get-public-image-config.sh
|
|
||||||
IFS=':' read -ra DOCKER_FROM_SPLIT <<<"${DOCKER_FROM}"
|
|
||||||
if ! [[ ${DOCKER_FROM_SPLIT[0]} =~ .*/.* ]]; then
|
|
||||||
# Need to use "library/..." for images the have no two part name
|
|
||||||
DOCKER_FROM_SPLIT[0]="library/${DOCKER_FROM_SPLIT[0]}"
|
|
||||||
fi
|
|
||||||
BASE_LAST_LAYER=$(get_image_last_layer "${DOCKER_FROM_SPLIT[0]}" "${DOCKER_FROM_SPLIT[1]}")
|
|
||||||
mapfile -t IMAGES_LAYERS_OLD < <(get_image_layers "${DOCKER_ORG}"/"${DOCKER_REPO}" "${TAG}")
|
|
||||||
NETBOX_GIT_REF_OLD=$(get_image_label netbox.git-ref "${DOCKER_ORG}"/"${DOCKER_REPO}" "${TAG}")
|
|
||||||
GIT_REF_OLD=$(get_image_label org.opencontainers.image.revision "${DOCKER_ORG}"/"${DOCKER_REPO}" "${TAG}")
|
|
||||||
|
|
||||||
if ! printf '%s\n' "${IMAGES_LAYERS_OLD[@]}" | grep -q -P "^${BASE_LAST_LAYER}\$"; then
|
|
||||||
SHOULD_BUILD="true"
|
|
||||||
BUILD_REASON="${BUILD_REASON} debian"
|
|
||||||
fi
|
|
||||||
if [ "${NETBOX_GIT_REF}" != "${NETBOX_GIT_REF_OLD}" ]; then
|
|
||||||
SHOULD_BUILD="true"
|
|
||||||
BUILD_REASON="${BUILD_REASON} netbox"
|
|
||||||
fi
|
|
||||||
if [ "${GIT_REF}" != "${GIT_REF_OLD}" ]; then
|
|
||||||
SHOULD_BUILD="true"
|
|
||||||
BUILD_REASON="${BUILD_REASON} netbox-docker"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
SHOULD_BUILD="true"
|
|
||||||
BUILD_REASON="${BUILD_REASON} no-check"
|
|
||||||
fi
|
|
||||||
###
|
|
||||||
# Composing all arguments for `docker build`
|
|
||||||
###
|
|
||||||
DOCKER_BUILD_ARGS=(
|
|
||||||
--pull
|
|
||||||
--target "${DOCKER_TARGET}"
|
|
||||||
-f "${DOCKERFILE}"
|
|
||||||
-t "${TARGET_DOCKER_TAG}"
|
|
||||||
-t "${TARGET_DOCKER_TAG_PROJECT}"
|
|
||||||
)
|
|
||||||
if [ -n "${TARGET_DOCKER_SHORT_TAG}" ]; then
|
|
||||||
DOCKER_BUILD_ARGS+=(-t "${TARGET_DOCKER_SHORT_TAG}")
|
|
||||||
DOCKER_BUILD_ARGS+=(-t "${TARGET_DOCKER_SHORT_TAG_PROJECT}")
|
|
||||||
DOCKER_BUILD_ARGS+=(-t "${TARGET_DOCKER_LATEST_TAG}")
|
|
||||||
DOCKER_BUILD_ARGS+=(-t "${TARGET_DOCKER_LATEST_TAG_PROJECT}")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --label
|
|
||||||
DOCKER_BUILD_ARGS+=(
|
|
||||||
--label "netbox.original-tag=${TARGET_DOCKER_TAG_PROJECT}"
|
|
||||||
--label "org.opencontainers.image.created=${BUILD_DATE}"
|
|
||||||
--label "org.opencontainers.image.version=${PROJECT_VERSION}"
|
|
||||||
)
|
|
||||||
if [ -d ".git" ]; then
|
|
||||||
DOCKER_BUILD_ARGS+=(
|
|
||||||
--label "org.opencontainers.image.revision=${GIT_REF}"
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
if [ -d "${NETBOX_PATH}/.git" ]; then
|
|
||||||
DOCKER_BUILD_ARGS+=(
|
|
||||||
--label "netbox.git-branch=${NETBOX_GIT_BRANCH}"
|
|
||||||
--label "netbox.git-ref=${NETBOX_GIT_REF}"
|
|
||||||
--label "netbox.git-url=${NETBOX_GIT_URL}"
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
if [ -n "${BUILD_REASON}" ]; then
|
|
||||||
BUILD_REASON=$(sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' <<<"$BUILD_REASON")
|
|
||||||
DOCKER_BUILD_ARGS+=(--label "netbox.build-reason=${BUILD_REASON}")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --build-arg
|
|
||||||
DOCKER_BUILD_ARGS+=(--build-arg "NETBOX_PATH=${NETBOX_PATH}")
|
|
||||||
|
|
||||||
if [ -n "${DOCKER_FROM}" ]; then
|
|
||||||
DOCKER_BUILD_ARGS+=(--build-arg "FROM=${DOCKER_FROM}")
|
|
||||||
fi
|
|
||||||
# shellcheck disable=SC2031
|
|
||||||
if [ -n "${HTTP_PROXY}" ]; then
|
|
||||||
DOCKER_BUILD_ARGS+=(--build-arg "http_proxy=${HTTP_PROXY}")
|
|
||||||
DOCKER_BUILD_ARGS+=(--build-arg "https_proxy=${HTTPS_PROXY}")
|
|
||||||
fi
|
|
||||||
if [ -n "${NO_PROXY}" ]; then
|
|
||||||
DOCKER_BUILD_ARGS+=(--build-arg "no_proxy=${NO_PROXY}")
|
|
||||||
fi
|
|
||||||
|
|
||||||
###
|
|
||||||
# Building the docker image
|
|
||||||
###
|
|
||||||
if [ "${SHOULD_BUILD}" == "true" ]; then
|
|
||||||
echo "🐳 Building the Docker image '${TARGET_DOCKER_TAG_PROJECT}'."
|
|
||||||
echo " Build reason set to: ${BUILD_REASON}"
|
|
||||||
$DRY docker build "${DOCKER_BUILD_ARGS[@]}" .
|
|
||||||
echo "✅ Finished building the Docker images '${TARGET_DOCKER_TAG_PROJECT}'"
|
|
||||||
echo "🔎 Inspecting labels on '${TARGET_DOCKER_TAG_PROJECT}'"
|
|
||||||
$DRY docker inspect "${TARGET_DOCKER_TAG_PROJECT}" --format "{{json .Config.Labels}}" | jq
|
|
||||||
else
|
|
||||||
echo "Build skipped because sources didn't change"
|
|
||||||
echo "::set-output name=skipped::true"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
###
|
|
||||||
# Pushing the docker images if either `--push` or `--push-only` are passed
|
|
||||||
###
|
|
||||||
if [ "${2}" == "--push" ] || [ "${2}" == "--push-only" ]; then
|
|
||||||
source ./build-functions/docker-functions.sh
|
|
||||||
push_image_to_registry "${TARGET_DOCKER_TAG}"
|
|
||||||
push_image_to_registry "${TARGET_DOCKER_TAG_PROJECT}"
|
|
||||||
|
|
||||||
if [ -n "${TARGET_DOCKER_SHORT_TAG}" ]; then
|
|
||||||
push_image_to_registry "${TARGET_DOCKER_SHORT_TAG}"
|
|
||||||
push_image_to_registry "${TARGET_DOCKER_SHORT_TAG_PROJECT}"
|
|
||||||
push_image_to_registry "${TARGET_DOCKER_LATEST_TAG}"
|
|
||||||
push_image_to_registry "${TARGET_DOCKER_LATEST_TAG_PROJECT}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
gh_echo "::endgroup::"
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# --label
|
||||||
|
DOCKER_BUILD_ARGS+=(
|
||||||
|
--label "netbox.original-tag=${TARGET_DOCKER_TAG_PROJECT}"
|
||||||
|
--label "org.opencontainers.image.created=${BUILD_DATE}"
|
||||||
|
--label "org.opencontainers.image.version=${PROJECT_VERSION}"
|
||||||
|
)
|
||||||
|
if [ -d ".git" ] && [ -z "${SKIP_GIT}" ]; then
|
||||||
|
DOCKER_BUILD_ARGS+=(
|
||||||
|
--label "org.opencontainers.image.revision=${GIT_REF}"
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
if [ -d "${NETBOX_PATH}/.git" ] && [ -z "${SKIP_GIT}" ]; then
|
||||||
|
DOCKER_BUILD_ARGS+=(
|
||||||
|
--label "netbox.git-branch=${NETBOX_GIT_BRANCH}"
|
||||||
|
--label "netbox.git-ref=${NETBOX_GIT_REF}"
|
||||||
|
--label "netbox.git-url=${NETBOX_GIT_URL}"
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
if [ -n "${BUILD_REASON}" ]; then
|
||||||
|
BUILD_REASON=$(sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' <<<"$BUILD_REASON")
|
||||||
|
DOCKER_BUILD_ARGS+=(--label "netbox.build-reason=${BUILD_REASON}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --build-arg
|
||||||
|
DOCKER_BUILD_ARGS+=(--build-arg "NETBOX_PATH=${NETBOX_PATH}")
|
||||||
|
|
||||||
|
if [ -n "${DOCKER_FROM}" ]; then
|
||||||
|
DOCKER_BUILD_ARGS+=(--build-arg "FROM=${DOCKER_FROM}")
|
||||||
|
fi
|
||||||
|
# shellcheck disable=SC2031
|
||||||
|
if [ -n "${HTTP_PROXY}" ]; then
|
||||||
|
DOCKER_BUILD_ARGS+=(--build-arg "http_proxy=${HTTP_PROXY}")
|
||||||
|
DOCKER_BUILD_ARGS+=(--build-arg "https_proxy=${HTTPS_PROXY}")
|
||||||
|
fi
|
||||||
|
if [ -n "${NO_PROXY}" ]; then
|
||||||
|
DOCKER_BUILD_ARGS+=(--build-arg "no_proxy=${NO_PROXY}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
DOCKER_BUILD_ARGS+=(--platform "${BUILDX_PLATFORM-linux/amd64}")
|
||||||
|
if [ "${2}" == "--push" ]; then
|
||||||
|
# output type=docker does not work with pushing
|
||||||
|
DOCKER_BUILD_ARGS+=(
|
||||||
|
--output=type=image
|
||||||
|
--push
|
||||||
|
)
|
||||||
|
else
|
||||||
|
DOCKER_BUILD_ARGS+=(
|
||||||
|
--output=type=docker
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
###
|
||||||
|
# Building the docker image
|
||||||
|
###
|
||||||
|
if [ -z "${BUILDX_BUILDER_NAME}" ]; then
|
||||||
|
BUILDX_BUILDER_NAME="$(basename "${PWD}")"
|
||||||
|
fi
|
||||||
|
if ! docker buildx ls | grep --quiet --word-regexp "${BUILDX_BUILDER_NAME}"; then
|
||||||
|
echo "👷 Creating new Buildx Builder '${BUILDX_BUILDER_NAME}'"
|
||||||
|
$DRY docker buildx create --name "${BUILDX_BUILDER_NAME}"
|
||||||
|
BUILDX_BUILDER_CREATED="yes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "🐳 Building the Docker image '${TARGET_DOCKER_TAG_PROJECT}'."
|
||||||
|
echo " Build reason set to: ${BUILD_REASON}"
|
||||||
|
$DRY docker buildx \
|
||||||
|
--builder "${BUILDX_BUILDER_NAME}" \
|
||||||
|
build \
|
||||||
|
"${DOCKER_BUILD_ARGS[@]}" \
|
||||||
|
.
|
||||||
|
echo "✅ Finished building the Docker images"
|
||||||
|
gh_echo "::endgroup::" # End group for Build
|
||||||
|
|
||||||
|
gh_echo "::group::🏗 Image Labels"
|
||||||
|
echo "🔎 Inspecting labels on '${IMAGE_NAME_TAGS[0]}'"
|
||||||
|
$DRY docker inspect "${IMAGE_NAME_TAGS[0]}" --format "{{json .Config.Labels}}" | jq
|
||||||
|
gh_echo "::endgroup::"
|
||||||
|
|
||||||
|
gh_echo "::group::🏗 Clean up"
|
||||||
|
if [ -n "${BUILDX_REMOVE_BUILDER}" ] && [ "${BUILDX_BUILDER_CREATED}" == "yes" ]; then
|
||||||
|
echo "👷 Removing Buildx Builder '${BUILDX_BUILDER_NAME}'"
|
||||||
|
$DRY docker buildx rm "${BUILDX_BUILDER_NAME}"
|
||||||
|
fi
|
||||||
|
gh_echo "::endgroup::"
|
||||||
|
Loading…
Reference in New Issue
Block a user