mirror of
https://git.proxmox.com/git/libgit2
synced 2026-03-24 09:00:39 +00:00
110 lines
3.8 KiB
YAML
110 lines
3.8 KiB
YAML
# Run a build step in a container or directly on the Actions runner
|
|
name: Download or Build Container
|
|
description: Download a container from the package registry, or build it if it's not found
|
|
|
|
inputs:
|
|
container:
|
|
description: Container name
|
|
type: string
|
|
required: true
|
|
dockerfile:
|
|
description: Dockerfile
|
|
type: string
|
|
base:
|
|
description: Container base
|
|
type: string
|
|
registry:
|
|
description: Docker registry to read and publish to
|
|
type: string
|
|
default: ghcr.io
|
|
config-path:
|
|
description: Path to Dockerfiles
|
|
type: string
|
|
github_token:
|
|
description: GitHub Token
|
|
type: string
|
|
|
|
runs:
|
|
using: 'composite'
|
|
steps:
|
|
- name: Download container
|
|
run: |
|
|
IMAGE_NAME="${{ inputs.container }}"
|
|
DOCKERFILE_PATH="${{ inputs.dockerfile }}"
|
|
DOCKER_REGISTRY="${{ inputs.registry }}"
|
|
DOCKERFILE_ROOT="${{ inputs.config-path }}"
|
|
|
|
if [ "${DOCKERFILE_PATH}" = "" ]; then
|
|
DOCKERFILE_PATH="${DOCKERFILE_ROOT}/${IMAGE_NAME}"
|
|
else
|
|
DOCKERFILE_PATH="${DOCKERFILE_ROOT}/${DOCKERFILE_PATH}"
|
|
fi
|
|
|
|
GIT_WORKTREE=$(cd "${GITHUB_ACTION_PATH}" && git rev-parse --show-toplevel)
|
|
echo "::: git worktree is ${GIT_WORKTREE}"
|
|
cd "${GIT_WORKTREE}"
|
|
|
|
DOCKER_CONTAINER="${GITHUB_REPOSITORY}/${IMAGE_NAME}"
|
|
DOCKER_REGISTRY_CONTAINER="${DOCKER_REGISTRY}/${DOCKER_CONTAINER}"
|
|
|
|
echo "dockerfile=${DOCKERFILE_PATH}" >> $GITHUB_ENV
|
|
echo "docker-container=${DOCKER_CONTAINER}" >> $GITHUB_ENV
|
|
echo "docker-registry-container=${DOCKER_REGISTRY_CONTAINER}" >> $GITHUB_ENV
|
|
|
|
# Identify the last git commit that touched the Dockerfiles
|
|
# Use this as a hash to identify the resulting docker containers
|
|
echo "::: dockerfile path is ${DOCKERFILE_PATH}"
|
|
|
|
DOCKER_SHA=$(git log -1 --pretty=format:"%h" -- "${DOCKERFILE_PATH}")
|
|
echo "docker-sha=${DOCKER_SHA}" >> $GITHUB_ENV
|
|
|
|
echo "::: docker sha is ${DOCKER_SHA}"
|
|
|
|
DOCKER_REGISTRY_CONTAINER_SHA="${DOCKER_REGISTRY_CONTAINER}:${DOCKER_SHA}"
|
|
|
|
echo "docker-registry-container-sha=${DOCKER_REGISTRY_CONTAINER_SHA}" >> $GITHUB_ENV
|
|
echo "docker-registry-container-latest=${DOCKER_REGISTRY_CONTAINER}:latest" >> $GITHUB_ENV
|
|
|
|
echo "::: logging in to ${DOCKER_REGISTRY} as ${GITHUB_ACTOR}"
|
|
|
|
exists="true"
|
|
docker login https://${DOCKER_REGISTRY} -u ${GITHUB_ACTOR} -p ${GITHUB_TOKEN} || exists="false"
|
|
|
|
echo "::: pulling ${DOCKER_REGISTRY_CONTAINER_SHA}"
|
|
|
|
if [ "${exists}" != "false" ]; then
|
|
docker pull ${DOCKER_REGISTRY_CONTAINER_SHA} || exists="false"
|
|
fi
|
|
|
|
if [ "${exists}" = "true" ]; then
|
|
echo "::: docker container exists in registry"
|
|
echo "docker-container-exists=true" >> $GITHUB_ENV
|
|
else
|
|
echo "::: docker container does not exist in registry"
|
|
echo "docker-container-exists=false" >> $GITHUB_ENV
|
|
fi
|
|
shell: bash
|
|
env:
|
|
GITHUB_TOKEN: ${{ inputs.github_token }}
|
|
- name: Create container
|
|
run: |
|
|
if [ "${{ inputs.base }}" != "" ]; then
|
|
BASE_ARG="--build-arg BASE=${{ inputs.base }}"
|
|
fi
|
|
|
|
GIT_WORKTREE=$(cd "${GITHUB_ACTION_PATH}" && git rev-parse --show-toplevel)
|
|
echo "::: git worktree is ${GIT_WORKTREE}"
|
|
cd "${GIT_WORKTREE}"
|
|
|
|
docker build -t ${{ env.docker-registry-container-sha }} --build-arg UID=$(id -u) --build-arg GID=$(id -g) ${BASE_ARG} -f ${{ env.dockerfile }} .
|
|
docker tag ${{ env.docker-registry-container-sha }} ${{ env.docker-registry-container-latest }}
|
|
shell: bash
|
|
working-directory: source/${{ inputs.config-path }}
|
|
if: env.docker-container-exists != 'true'
|
|
- name: Publish container
|
|
run: |
|
|
docker push ${{ env.docker-registry-container-sha }}
|
|
docker push ${{ env.docker-registry-container-latest }}
|
|
shell: bash
|
|
if: env.docker-container-exists != 'true' && github.event_name != 'pull_request'
|