initial commit
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
# IDEA
|
||||
.idea
|
||||
@@ -0,0 +1,106 @@
|
||||
# Base Runner Image
|
||||
|
||||
This is a base container image for CI/CD processes.
|
||||
|
||||
## Description
|
||||
|
||||
Based on the Debian Slim series of images, this image provides common tools for continuous integration/delivery. It is only for build, not runtime purposes. These are used by GitHub, GitLab, and Gitea runners to perform builds, releases, and related tasks.
|
||||
|
||||
## Features
|
||||
|
||||
### Inherited
|
||||
|
||||
This image provides everything [Debian Slim](https://github.com/linuxcontainers/debian-slim) provides.
|
||||
|
||||
### Tools
|
||||
|
||||
This following tools are installed and available with this image.
|
||||
|
||||
`tar`
|
||||
: TAR extraction or creation
|
||||
|
||||
`gzip`
|
||||
: GZIP or `tar.gz` extraction or creation
|
||||
|
||||
`zip`/`unzip`
|
||||
: ZIP extraction or creation
|
||||
|
||||
`curl`
|
||||
: HTTP service calls, including downloads
|
||||
|
||||
`jq`
|
||||
: JSON parsing and modification
|
||||
|
||||
`xmlstarlet`
|
||||
: XML parsing and modification
|
||||
|
||||
`git`
|
||||
: Git source control
|
||||
|
||||
### Extensible `ENTRYPOINT`
|
||||
|
||||
This base image implements a universal `ENTRYPOINT` script that executes all executable scripts in `/opt/containerd` that end with `.sh`. This provides the ability for all extending container images to include their own entrypoint script without overriding or shadowing any ancestral entrypoint.
|
||||
|
||||
This is nothing to the `CMD` directive, but if specified by an extending image, it will be respected.
|
||||
|
||||
## Tags
|
||||
|
||||
A version labeled `latest` always exists.
|
||||
|
||||
| Tag | Description |
|
||||
| -------- | ----------- |
|
||||
| `latest` | The latest version |
|
||||
| `X` | The latest version within the specified major version `X`. |
|
||||
| `X.Y` | The latest version within the specified minor version `X.Y`. |
|
||||
| `X.Y.Z` | A specific version. |
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
| Name | Required | Default | Purpose |
|
||||
| ------------------------ |:--------:| --------------- | ------- |
|
||||
| `GIT_CONFIG_USER_NAME` | No | | Initialize Git to use this `user.name`. |
|
||||
| `GIT_CONFIG_USER_EMAIL` | No | | Initialize Git to use this `user.email`. |
|
||||
| `CURL_CONFIG_DIR` | No | `/opt/etc/curl` | Expected location of Curl configuration files. |
|
||||
| `CURL_CONFIG_IDS` | No | | Create Curl configuration file(s) using values provided in corresponding environment variables. |
|
||||
| `CURL_CONFIG_*_USERNAME` | No | | An HTTP BASIC username for a corresponding Curl configuration. |
|
||||
| `CURL_CONFIG_*_PASSWORD` | No | | An HTTP BASIC password for a corresponding Curl configuration. |
|
||||
|
||||
`CURL_CONFIG_IDS`
|
||||
: The expected format: `<id>:<key> [<id>:<key> [<id>:<key> ...]]`. The key is used in place of the `*` in the environment variables above. The ID is used in the configuration filename.
|
||||
|
||||
#### Examples
|
||||
|
||||
Here are sample environment variable definitions:
|
||||
|
||||
```sh
|
||||
GIT_CONFIG_USER_NAME=John Doe
|
||||
GIT_CONFIG_USER_EMAIL=john.doe@inteligr8.com
|
||||
CURL_CONFIG_IDS="biz1:BIZ1 biz2:BIZ2"
|
||||
CURL_CONFIG_BIZ1_USERNAME=john.doe
|
||||
CURL_CONFIG_BIZ1_PASSWORD=
|
||||
CURL_CONFIG_BIZ2_USERNAME=jane.doe
|
||||
CURL_CONFIG_BIZ2_PASSWORD=
|
||||
```
|
||||
|
||||
Here is the corresponding usage of `curl` with the configuration:
|
||||
|
||||
```sh
|
||||
curl --config ${CURL_CONFIG_DIR}/biz1.cfg ...
|
||||
curl --config ${CURL_CONFIG_DIR}/biz2.cfg ...
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
This is expected to be extended or used directly for simple CI/CD runners.
|
||||
|
||||
## Contributing
|
||||
|
||||
You are welcome to copy the repository, but please open an issue first to avoid fragmentation.
|
||||
|
||||
- [Open Issue](https://git.inteligr8.com/inteligr8/base-runner-image/issues)
|
||||
|
||||
## References
|
||||
|
||||
- [Debian Slim](https://github.com/linuxcontainers/debian-slim)
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
[[ -v ${CONTAINERD_REGISTRY_HOST} ]] || CONTAINERD_REGISTRY_HOST=docker.inteligr8.com
|
||||
[[ -v ${CONTAINERD_IMAGE_NAMESPACE} ]] || CONTAINERD_IMAGE_NAMESPACE=inteligr8/
|
||||
[[ -v ${CONTAINERD_IMAGE_NAME} ]] || CONTAINERD_IMAGE_NAME=base-runner
|
||||
[[ -v ${CONTAINERD_CMD} ]] || CONTAINERD_CMD=buildah
|
||||
[[ -v ${CONTAINERD_BUILD_FORMAT} ]] || CONTAINERD_BUILD_FORMAT=docker
|
||||
[[ -v ${DEBIAN_VERSION} ]] || DEBIAN_VERSION=13
|
||||
|
||||
if [[ -v ${CONTAINERD_DEBUG} ]]; then
|
||||
SKOPEO_OPTS="${SKOPEO_OPTS} --debug"
|
||||
CONTAINERD_CMD_OPTS="${CONTAINERD_CMD_OPTS} --log-level=debug"
|
||||
fi
|
||||
|
||||
GIT_COMMIT_SHORT_SHA=$(git rev-parse --short HEAD)
|
||||
CONTAINERD_IMAGE_REMOTE_NAME=${CONTAINERD_REGISTRY_HOST}/${CONTAINERD_IMAGE_NAMESPACE}${CONTAINERD_IMAGE_NAME}
|
||||
|
||||
set +e
|
||||
skopeo ${SKOPEO_OPTS} inspect docker://${CONTAINERD_IMAGE_REMOTE_NAME}:sha${GIT_COMMIT_SHORT_SHA}
|
||||
SKOPEO_INSPECT_RC=$?
|
||||
set -e
|
||||
|
||||
if [[ "${INSPECT_RC}" == "0" ]]; then
|
||||
echo "Container image already built; skipping rebuild"
|
||||
else
|
||||
echo "Building container image"
|
||||
${CONTAINERD_CMD} ${CONTAINERD_CMD_OPTS} build \
|
||||
--format=${CONTAINERD_BUILD_FORMAT} \
|
||||
${CONTAINERD_BUILD_OPTS} \
|
||||
--build-arg DEBIAN_VERSION=${DEBIAN_VERSION} \
|
||||
--build-arg CONTAINERD_REGISTRY_HOST=${CONTAINERD_REGISTRY_HOST} \
|
||||
--build-arg CONTAINERD_IMAGE_NAMESPACE=${CONTAINERD_IMAGE_NAMESPACE} \
|
||||
--tag ${CONTAINERD_IMAGE_REMOTE_NAME}:sha${GIT_COMMIT_SHORT_SHA}
|
||||
fi
|
||||
Executable
+17
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
[[ -v ${CONTAINERD_REGISTRY_HOST} ]] || CONTAINERD_REGISTRY_HOST=docker.inteligr8.com
|
||||
[[ -v ${CONTAINERD_CMD} ]] || CONTAINERD_CMD=buildah
|
||||
|
||||
if [[ -v ${CONTAINERD_DEBUG} ]]; then
|
||||
CONTAINERD_CMD_OPTS="${CONTAINERD_CMD_OPTS} --log-level=debug"
|
||||
fi
|
||||
|
||||
if [[ -v ${CONTAINERD_REGISTRY_USERNAME} && -v ${CONTAINERD_REGISTRY_PASSWORD} ]]; then
|
||||
echo "Authenticating with container registry"
|
||||
echo "${CONTAINERD_REGISTRY_PASSWORD}" | ${CONTAINERD_CMD} ${CONTAINERD_CMD_OPTS} login \
|
||||
${CONTAINERD_REGISTRY_HOST} \
|
||||
-u ${CONTAINERD_REGISTRY_USERNAME} \
|
||||
--password-stdin
|
||||
fi
|
||||
Executable
+19
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
[[ -v ${CONTAINERD_REGISTRY_HOST} ]] || CONTAINERD_REGISTRY_HOST=docker.inteligr8.com
|
||||
[[ -v ${CONTAINERD_IMAGE_NAMESPACE} ]] || CONTAINERD_IMAGE_NAMESPACE=inteligr8/
|
||||
[[ -v ${CONTAINERD_IMAGE_NAME} ]] || CONTAINERD_IMAGE_NAME=base-runner
|
||||
[[ -v ${CONTAINERD_CMD} ]] || CONTAINERD_CMD=buildah
|
||||
|
||||
if [[ -v ${CONTAINERD_DEBUG} ]]; then
|
||||
CONTAINERD_CMD_OPTS="${CONTAINERD_CMD_OPTS} --log-level=debug"
|
||||
fi
|
||||
|
||||
GIT_COMMIT_SHORT_SHA=$(git rev-parse --short HEAD)
|
||||
CONTAINERD_IMAGE_REMOTE_NAME=${CONTAINERD_REGISTRY_HOST}/${CONTAINERD_IMAGE_NAMESPACE}${CONTAINERD_IMAGE_NAME}
|
||||
|
||||
echo "Pushing container image to registry with commit SHA: ${GIT_COMMIT_SHORT_SHA}"
|
||||
${CONTAINERD_CMD} ${CONTAINERD_CMD_OPTS} push \
|
||||
${CONTAINERD_PUSH_OPTS} \
|
||||
${CONTAINERD_IMAGE_REMOTE_NAME}:sha${GIT_COMMIT_SHORT_SHA}
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
[[ -v ${CONTAINERD_REGISTRY_HOST} ]] || CONTAINERD_REGISTRY_HOST=docker.inteligr8.com
|
||||
[[ -v ${CONTAINERD_IMAGE_NAMESPACE} ]] || CONTAINERD_IMAGE_NAMESPACE=inteligr8/
|
||||
[[ -v ${CONTAINERD_IMAGE_NAME} ]] || CONTAINERD_IMAGE_NAME=base-runner
|
||||
[[ -v ${CONTAINERD_CMD} ]] || CONTAINERD_CMD=buildah
|
||||
|
||||
if [[ -v ${CONTAINERD_DEBUG} ]]; then
|
||||
CONTAINERD_CMD_OPTS="${CONTAINERD_CMD_OPTS} --log-level=debug"
|
||||
fi
|
||||
|
||||
if [[ ! -z $1 ]]; then
|
||||
CONTAINERD_IMAGE_TAG=$1
|
||||
elif [[ ! -z ${VERSION} ]]; then
|
||||
CONTAINERD_IMAGE_TAG=${VERSION}
|
||||
fi
|
||||
|
||||
GIT_COMMIT_SHORT_SHA=$(git rev-parse --short HEAD)
|
||||
CONTAINERD_IMAGE_REMOTE_NAME=${CONTAINERD_REGISTRY_HOST}/${CONTAINERD_IMAGE_NAMESPACE}${CONTAINERD_IMAGE_NAME}
|
||||
|
||||
echo "Synchronizing container image from registry for SHA: ${GIT_COMMIT_SHORT_SHA}"
|
||||
${CONTAINERD_CMD} ${CONTAINERD_CMD_OPTS} pull \
|
||||
${CONTAINERD_IMAGE_REMOTE_NAME}:sha${GIT_COMMIT_SHORT_SHA}
|
||||
${CONTAINERD_CMD} ${CONTAINERD_CMD_OPTS} tag \
|
||||
${CONTAINERD_IMAGE_REMOTE_NAME}:sha${GIT_COMMIT_SHORT_SHA}
|
||||
${CONTAINERD_IMAGE_REMOTE_NAME}:${CONTAINERD_IMAGE_TAG}
|
||||
|
||||
echo "Tagging container image to registry with version: ${CONTAINERD_IMAGE_TAG}"
|
||||
${CONTAINERD_CMD} ${CONTAINERD_CMD_OPTS} push \
|
||||
${CONTAINERD_PUSH_OPTS} \
|
||||
${CONTAINERD_IMAGE_REMOTE_NAME}:${CONTAINERD_IMAGE_TAG}
|
||||
@@ -0,0 +1,25 @@
|
||||
ARG DEBIAN_VERSION=stable
|
||||
FROM debian:${DEBIAN_VERSION}-slim
|
||||
|
||||
# Container metadata
|
||||
LABEL org.opencontainers.image.title="Base Runner"
|
||||
LABEL org.opencontainers.image.description="CI/CD Runner image with common CLI utilities"
|
||||
LABEL org.opencontainers.image.url="https://git.inteligr8.com/inteligr8/base-runner-image"
|
||||
LABEL org.opencontainers.image.authors="Brian Long <brian@inteligr8.com>"
|
||||
LABEL org.opencontainers.image.license="LGPL"
|
||||
|
||||
# Common utilities
|
||||
RUN apt update && \
|
||||
apt install -y tar gzip zip unzip curl jq xmlstarlet git
|
||||
|
||||
# Support multiple entrypoint scripts
|
||||
RUN mkdir -p /opt/containerd
|
||||
ADD --chmod=755 entrypoint.sh /opt/containerd/entrypoint.sh
|
||||
ADD --chmod=755 configure-git.sh /opt/containerd/00-configure-git.sh
|
||||
ADD --chmod=755 configure-curl.sh /opt/containerd/00-configure-curl.sh
|
||||
|
||||
# Support build-defined curl configuration
|
||||
ENV CURL_CONFIG_DIR=/opt/etc/curl
|
||||
RUN mkdir -p ${CURL_CONFIG_DIR}
|
||||
|
||||
ENTRYPOINT ["/opt/containerd/entrypoint.sh"]
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
|
||||
# AI generated
|
||||
urlencode() {
|
||||
local LANG=C i x
|
||||
for (( i = 0; i < ${#1}; i++ )); do
|
||||
x="${1:i:1}"
|
||||
[[ "$x" =~ [a-zA-Z0-9.~_-] ]] && echo -n "$x" || printf '%%%02X' "'$x"
|
||||
done
|
||||
echo
|
||||
}
|
||||
|
||||
if [[ ! -z ${CURL_CONFIG_IDS} ]]; then
|
||||
mkdir -p ${CURL_CONFIG_DIR:-/opt/etc/curl}
|
||||
|
||||
for CURL_CONFIG_PAIR in ${CURL_CONFIG_IDS}; do
|
||||
if [[ ${CURL_CONFIG_PAIR} =~ ^([^:]+):(.+)$ ]]; then
|
||||
CURL_CONFIG_ID=${BASH_REMATCH[0]}
|
||||
CURL_CONFIG_ENVVAR_KEY=${BASH_REMATCH[1]}
|
||||
CURL_CONFIG_ENVVAR_USERNAME="CURL_CONFIG_${CURL_CONFIG_ENVVAR_KEY}_USERNAME"
|
||||
CURL_CONFIG_ENVVAR_PASSWORD="CURL_CONFIG_${CURL_CONFIG_ENVVAR_KEY}_PASSWORD"
|
||||
|
||||
CURL_CONFIG_USERNAME=`urlencode ${!CURL_CONFIG_ENVVAR_USERNAME}`
|
||||
CURL_CONFIG_PASSWORD=`urlencode ${!CURL_CONFIG_ENVVAR_PASSWORD}`
|
||||
|
||||
if [[ -z ${CURL_CONFIG_USERNAME} ]]; then
|
||||
echo "The curl configuration '${CURL_CONFIG_ID}' has no corresponding environment variable: ${CURL_CONFIG_ENVVAR_USERNAME}; ignoring"
|
||||
elif [[ -z ${CURL_CONFIG_PASSWORD} ]]; then
|
||||
echo "The curl configuration '${CURL_CONFIG_ID}' has no corresponding environment variable: ${CURL_CONFIG_ENVVAR_PASSWORD}; ignoring"
|
||||
else
|
||||
CURL_CONFIG_FILE=${CURL_CONFIG_DIR:-/opt/etc/curl}/${CURL_CONFIG_ID}.cfg
|
||||
echo "user = ${CURL_CONFIG_USERNAME}:${CURL_CONFIG_PASSWORD}" > ${CURL_CONFIG_FILE}
|
||||
|
||||
echo "Added CURL configuration file: ${CURL_CONFIG_FILE}"
|
||||
fi
|
||||
else
|
||||
echo "The curl configuration format in 'CURL_CONFIG_IDS' is invalid: ${CURL_CONFIG_PAIR}"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [[ ! -z ${GIT_CONFIG_USER_NAME} ]]; then
|
||||
git config --global user.name "${GIT_CONFIG_USER_NAME}"
|
||||
fi
|
||||
|
||||
if [[ ! -z ${GIT_CONFIG_USER_EMAIL} ]]; then
|
||||
git config --global user.email "${GIT_CONFIG_USER_EMAIL}"
|
||||
fi
|
||||
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
# any command returning non-zero, should end this script
|
||||
set -e
|
||||
|
||||
# cycle through *.sh in `opt/containerd` in alphabetical order; executing each one
|
||||
CONTAINERD_FILES=( /opt/containerd/*.sh )
|
||||
if (( ${#CONTAINERD_FILES[@]} > 1 )); then
|
||||
for (( CONTAINERD_FILEINDEX = 0; CONTAINERD_FILEINDEX < ${#CONTAINERD_FILES[@]}; CONTAINERD_FILEINDEX++ )); do
|
||||
CONTAINERD_FILE=${CONTAINERD_FILES[${CONTAINERD_FILEINDEX}]}
|
||||
if [[ ${CONTAINERD_FILE} != "/opt/containerd/entrypoint.sh" ]]; then
|
||||
echo "Executing entrypoint: ${CONTAINERD_FILE}"
|
||||
. ${CONTAINERD_FILE}
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# if there are arguments to the entrypoint, execute them to finish
|
||||
# like a server startup command
|
||||
if (( $# > 0 )); then
|
||||
echo "Executing entrypoint ..."
|
||||
exec "$@"
|
||||
fi
|
||||
Reference in New Issue
Block a user