#!/bin/bash set -o errexit set -o nounset set -o pipefail function key { git config --local --get "${1}" } function addkey { git config --local --add "${1}" "${2}" } function detect { local repoURL="$1" local repoName="$2" local detectionScript=${DETECTION_SCRIPT:-} local buildStrategy=${BUILD_STRATEGY:-} local strategyArg="" if [[ -n "$buildStrategy" ]]; then strategyArg="--strategy=${buildStrategy}" fi # The purpose of using a custom detection script is that users can customize the # 'detect-language' script to return the image that's appropriate for their needs. # It is possible to just have new-app do code detection. In that case, just set # the DETECTION_SCRIPT variable to an empty string. if [[ -z $detectionScript ]]; then oc new-app "${repoURL}" $strategyArg else if ! lang=$($(dirname $0)/${detectionScript}); then return fi echo "detect: found language ${lang} for ${repoName}" oc new-app "${lang}~${repoURL}" $strategyArg fi # TODO: when a command to set a secret is available, # set an optional secret on the resulting build configuration } # If the 'oc' command is not found, exit if ! oc=$(which oc); then echo "detect: oc is not installed" exit 0 fi # If the current repository has no self.url, exit if ! url=$(key gitserver.self.url); then echo "post-receive: no self url set" exit 0 fi # Save received commits to a temporary file commits=$(mktemp) cat > ${commits} # Extract the name of the repository from the URL name=$(basename "${url}") name="${name%.*}" foundbc=false # Loop through build configurations that match this git repository while read bc ref do foundbc=true # If a generic webhook exists on the build config, determine if one of the received # commits affects the reference in the build configuration if webhook=$(oc start-build --list-webhooks="generic" "${bc}" | head -n 1); then # Loop through the commits received by the hook. If the build configuration's git ref is an # ancestor for the received commit, then start a new build for it. while read old_commit new_commit ref_name do if $(git merge-base --is-ancestor "${ref}" "${new_commit}"); then oc start-build --from-webhook="${webhook}" && echo "build: started on build configuration '${bc}'" break fi done < "${commits}" fi done < <(gitrepo-buildconfigs "${name}") if $foundbc; then exit 0 fi generate_artifacts=${GENERATE_ARTIFACTS:-} if [ "${generate_artifacts}" == "true" ]; then detect "$url" "$name" fi