#!/usr/bin/env bash
# vim:ts=4:sts=4:sw=4:et
#
# Author: Hari Sekhon
# Date: 2020-03-19 19:21:31 +0000 (Thu, 19 Mar 2020)
#
# https://github.com/harisekhon/bash-tools
#
# License: see accompanying Hari Sekhon LICENSE file
#
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help improve or steer this or other code I publish
#
# https://www.linkedin.com/in/harisekhon
#
# Start a quick local Concourse CI
set -euo pipefail
[ -n " ${ DEBUG :- } " ] && set -x
srcdir = " $( dirname " ${ BASH_SOURCE [0] } " ) "
# shellcheck disable=SC1090
. " $srcdir /lib/utils.sh "
# shellcheck disable=SC2034
usage_description = "
Boots Concourse CI in Docker, and builds the current repo
- boots Concourse container in Docker
- creates job pipeline from \$ PWD/.concourse.yml
- unpauses pipeline and job
- triggers pipeline job
- follows job build log in CLI
- prints recent build statuses
${ 0 ##*/ } [ up]
${ 0 ##*/ } down
${ 0 ##*/ } ui - prints the Concourse URL and on Mac automatically opens in browser
Idempotent, you can re-run this and continue from any stage
See Also:
fly.sh - wraps the fly command specifying target from the environment variable FLY_TARGET to avoid repetition. Also automatically downloads the 'fly' utility if not present in \$ PATH
"
# used by usage() in lib/utils.sh
# shellcheck disable=SC2034
usage_args = "[up|down|ui]"
help_usage " $@ "
export CONCOURSE_USER = " ${ CONCOURSE_USER :- test } "
export CONCOURSE_PASSWORD = " ${ CONCOURSE_PASSWORD :- test } "
export CONCOURSE_HOST = localhost
export CONCOURSE_PORT = 8081
protocol = "http"
if [ -n " ${ CONCOURSE_SSL :- } " ] ; then
protocol = https
fi
CONCOURSE_URL = " $protocol :// $CONCOURSE_HOST : $CONCOURSE_PORT "
export COMPOSE_FILE = " $srcdir /setup/concourse-docker-compose.yml "
export FLY_TARGET = "ci"
pipeline = " ${ PWD ##*/ } "
job = " $pipeline /build "
if ! type docker-compose & >/dev/null; then
" $srcdir /install_docker_compose.sh "
fi
action = " ${ 1 :- up } "
shift || :
if ! [ -f " $COMPOSE_FILE " ] ; then
timestamp "downloading Concourse CI docker-compose.yml" # this is in Git so shouldn't run any more
wget -O " $COMPOSE_FILE " https://concourse-ci.org/docker-compose.yml
fi
if [ " $action " = up ] ; then
timestamp "Booting Concourse:"
docker-compose up -d " $@ "
echo >& 2
elif [ " $action " = restart ] ; then
docker-compose down
echo >& 2
exec " ${ BASH_SOURCE [0] } " up
elif [ " $action " = ui ] ; then
echo " Concourse URL: $CONCOURSE_URL "
echo
echo " Concourse user: $CONCOURSE_USER "
echo " Concourse password: $CONCOURSE_PASSWORD "
echo
if is_mac; then
open " $CONCOURSE_URL "
fi
exit 0
else
docker-compose " $action " " $@ "
echo >& 2
exit 0
fi
export PATH = " $PATH : " ~/bin
when_url_content " $CONCOURSE_URL " '(?i:concourse)' # Concourse
echo
# done in fly.sh now
# which checks for executable which command -v and type -P don't
# shellcheck disable=SC2230
#if [ "$action" = up ] &&
# ! which fly &>/dev/null; then
# # fly.sh has ~/bin in $PATH
# dir=~/bin
# mkdir -pv "$dir"
# os="$(uname -s | tr '[:upper:]' '[:lower:]')"
# echo "Downloading fly for OS = $os"
# wget -cO "$dir/fly" "http://$CONCOURSE_HOST:$CONCOURSE_PORT/api/v1/cli?arch=amd64&platform=$os"
# chmod +x "$dir/fly"
# echo
#fi
timestamp "fly login:"
" $srcdir /fly.sh " login -c " $CONCOURSE_URL " -u " $CONCOURSE_USER " -p " $CONCOURSE_PASSWORD "
echo
concourse_yml = ".concourse_yml"
if ! [ -f " $concourse_yml " ] ; then
timestamp " Concourse configuration file ' $concourse_yml ' not found "
echo >& 2
timestamp "Skipping loading missing pipeline"
echo >& 2
timestamp " Re-run this from the directory containing ' $concourse_yml ' to auto-load a pipeline "
exit 0
fi
timestamp " updating pipeline: $pipeline "
timestamp " loading config from $concourse_yml "
# fly sp
set +o pipefail
yes | " $srcdir /fly.sh " set-pipeline -p " $pipeline " -c " $concourse_yml "
set -o pipefail
echo
timestamp " unpausing pipeline: $pipeline "
# fly up
" $srcdir /fly.sh " unpause-pipeline -p " $pipeline "
echo
timestamp " unpausing job: $job "
# fly uj
" $srcdir /fly.sh " unpause-job --job " $job "
#"$srcdir/fly.sh" trigger-job -j "$job"
#"$srcdir/fly.sh" watch -j "$job"
echo
echo " Concourse URL: $CONCOURSE_URL "
echo
# trigger + watch together
" $srcdir /fly.sh " trigger-job -j " $job " -w
echo
" $srcdir /fly.sh " builds