#!/usr/bin/env bash # Little helper script to display latest commit as "Applying configuration version xxx" message # instead of the bare "servername-branch-commit_id" message (which is also a great idea, # we just started differently :-) ) # Syntax is: `$script environment` # ...or `$script environment environmentpath` # The former tries to find the standard paths for Puppet and PE, the latter # lets you specify the path yourself. if [ -z "$1" ]; then printf 'No env. USAGE: %b ENVIRONMENT [ENVIRONMENTS_PATH]\n' "$(basename "$0")" >&2 exit 101 fi if [ -n "$2" ]; then CODEDIRS="$2" else CODEDIRS=( # The actual code directory. In case of PE, you may want to adapt - # since PE 2023.x, they have introduced an internal git deployer between # the code pulled from git repos and what is then deployed to the agents, # for reasons unknown and for raised complexity. # If the directory does not exist, this will be ignored. '/etc/puppetlabs/code' # PE originally staged here - if you stage, too, check this directory. # If it doesn't exist, it will be ignored. '/etc/puppetlabs/code-staging' ) fi # I.e.: if none of the above exist or yield a (valid) .git folder underneath # $VARIABLE/.git, AND/OR we have nop git binary on the resp. puppet compiler, # we will have no version+commitmsg statement in agent runs. # ... # ...yay, code! # Check if /usr/bin/git exists, otherwise, yield a generic message. if [ -x /usr/bin/git ]; then # iterate over codestagedir and codedir. First appearance with # a .git folder underneath = break out of loop. for cdir in "${CODEDIRS[@]}"; do # Check if directory exists. if [ -d "$cdir" ]; then # Check if ./environments/ENVNAME/.git exists. # If so, we have a winner and break the loop. if [ -d "${cdir}/environments/${1}/.git" ]; then ENVGITDIR="${cdir}/environments/${1}/.git" break # Check if ./ENVNAME/.git exists. If so, ... elif [ -d "${cdir}/${1}/.git" ]; then ENVGITDIR="${cdir}/${1}/.git" break fi fi done # Did all of the above yield a value in $ENVGITDIR? If so: have a nice line # with last committer and commit. If not: Standard output with env. name. if [ -n "$ENVGITDIR" ]; then if ! mycomm="$(/usr/bin/git --git-dir "$ENVGITDIR" log --pretty=format:'%h - %an, %ad : %s' -1 2>/dev/null)"; then printf 'Environment: %b (.git content invalid inside deployed environment)\n' "$1" else printf '%b -- %b\n' "$1" "$mycomm" fi else # In case the code deployments have no git folder. # TODO: Maybe implement a git hook that places a file with the commit message somewhere where # we can read it? printf 'Environment: %b (no git directory in code deployments)\n' "$1" fi else printf 'Environment: %b (no git binary on server)\n' "$1" fi exit 0