Imported Upstream version 2.6.1
[scm/test.git] / docker / run_dockers.bsh
1 #!/usr/bin/env bash
2
3 # Usage:
4 #  ./run_dockers.bsh - Run all the docker images
5 #  ./run_dockers.bsh centos_6 centos_7 - Run only CentOS 6 & 7 image
6 #  ./run_dockers.bsh centos_6 -- bash #Runs bash in the CentOS 6 docker
7 #
8 # Special Environmet Variables
9 #  REPO_HOSTNAME - Override the hostname for all the repos generated/tested
10 #  DOCKER_AUTOPULL - Default 1. If set to 0, it will not build docker images
11 #                before running
12 #  AUTO_REMOVE - Default 1. If set to 0, it will not automatically delete the
13 #                docker instance when done. This can be useful for a post mortem
14 #                analysis. Just make sure you clean up the docker instances
15 #                manually
16
17 set -eu
18
19 #Mingw32 auto converts /drive/dir/blah to drive:\dir\blah ... Can't have that.
20 if [[ `uname` == MINGW* ]]; then
21   MINGW_PATCH='/'
22 else
23   MINGW_PATCH=''
24 fi
25
26 CUR_DIR=$(cd $(dirname "${BASH_SOURCE[0]}"); pwd)
27 REPO_DIR=$(cd ${CUR_DIR}/..; pwd)
28 PACKAGE_DIR=${REPO_DIR}/repos
29 mkdir -p ${PACKAGE_DIR}/centos || :
30 mkdir -p ${PACKAGE_DIR}/debian || :
31
32 #If you are not in docker group and you have sudo, default value is sudo
33 : ${SUDO=`if ( [ ! -w /var/run/docker.sock ] && id -nG | grep -qwv docker && [ "${DOCKER_HOST:+dh}" != "dh" ] ) && which sudo > /dev/null 2>&1; then echo sudo; fi`}
34
35 function split_image_name()
36 { #$1 - image dockerfile
37   #sets IMAGE_NAME to the basename of the dir containing the docker file
38   #sets IMAGE_INFO to be the array name following my pattern
39   local IFS=_
40   IMAGE_INFO=($1)
41 }
42
43 # Parse Arguments
44 IMAGES=()
45 while [[ $# > 0 ]]; do
46   if [ "$1" == "--" ]; then
47     shift
48     DOCKER_CMD="${@}"
49     break
50   else
51     IMAGES+=("$1")
52   fi
53   shift
54 done
55
56 if [[ ${#IMAGES[@]} == 0 ]]; then
57   IMAGES=(centos_6 centos_7 debian_7 debian_8 debian_9)
58 fi
59
60 mkdir -p "${PACKAGE_DIR}"
61 #Run docker to build pacakges
62 for IMAGE_NAME in "${IMAGES[@]}"; do
63   split_image_name "${IMAGE_NAME}" #set IMAGE_NAME and IMAGE_INFO
64
65   #Auto pull docker unless DOCKER_AUTOPULL=0
66   if [[ ${DOCKER_AUTOPULL-1} != 0 ]]; then
67     $SUDO docker pull gitlfs/build-dockers:${IMAGE_NAME}
68   fi
69
70   #It CAN'T be empty () with set -u... So I put some defaults in here
71   OTHER_OPTIONS=("-it")
72
73   if [ "${AUTO_REMOVE-1}" == "1" ]; then
74     OTHER_OPTIONS+=("--rm")
75   fi
76
77   if [ -s ${CUR_DIR}/${IMAGE_NAME}.key ]; then
78     CONTAINER_NAME=git-lfs-gpg ${CUR_DIR}/gpg-agent_preload.bsh
79     OTHER_OPTIONS+=("--volumes-from" "git-lfs-gpg")
80     OTHER_OPTIONS+=("-v" "${CUR_DIR}/${IMAGE_NAME}.key:${MINGW_PATCH}/tmp/${IMAGE_NAME}.key")
81     OTHER_OPTIONS+=("-e" "$(docker exec git-lfs-gpg cat ${MINGW_PATCH}/tmp/gpg-agent/gpg_agent_info)")
82     #Do I need this? Or can I get away with hardcoding???
83     #GPG_AGENT_INFO=/tmp/gpg-agent/S.gpg-agent:1:1
84   fi
85
86   FINAL_UID=$(id -u)
87   FINAL_GID=$(id -g)
88   if [[ $FINAL_UID == 0 ]]; then
89     FINAL_UID=${SUDO_UID-}
90   fi
91   if [[ $FINAL_GID == 0 ]]; then
92     FINAL_GID=${SUDO_GID-}
93   fi
94
95   echo Compiling LFS in docker image ${IMAGE_NAME}
96   IMAGE_REPO_DIR="${PACKAGE_DIR}"/"${IMAGE_INFO[0]}"/"${IMAGE_INFO[1]}"
97   $SUDO docker run "${OTHER_OPTIONS[@]}" ${DOCKER_OTHER_OPTIONS-} \
98                    -e USER=root \
99                    -e REPO_HOSTNAME=${REPO_HOSTNAME:-git-lfs.github.com} \
100                    -e FINAL_UID=${FINAL_UID} \
101                    -e FINAL_GID=${FINAL_GID} \
102                    -v "${MINGW_PATCH}${REPO_DIR}:/src" \
103                    -v "${MINGW_PATCH}${IMAGE_REPO_DIR}:/repo" \
104                    gitlfs/build-dockers:${IMAGE_NAME} ${DOCKER_CMD-}
105
106 done
107
108 echo "Docker run completed successfully!"