#!/bin/bash # # Builds docker image and runs a command under it. # This is a generic script that is configured with the following variables: # # DOCKERFILE_DIR - Directory in which Dockerfile file is located. # DOCKER_RUN_SCRIPT - Script to run under docker (relative to protobuf repo root) # OUTPUT_DIR - Directory that will be copied from inside docker after finishing. # $@ - Extra args to pass to docker run set -ex cd $[dirname $0]/.. global git_root := $[pwd] cd - # Use image name based on Dockerfile location checksum global DOCKER_IMAGE_NAME := "$[basename $DOCKERFILE_DIR]_$[sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d' ']" # Make sure docker image has been built. Should be instantaneous if so. docker build -t $DOCKER_IMAGE_NAME $DOCKERFILE_DIR # Ensure existence of ccache directory global CCACHE_DIR := '/tmp/protobuf-ccache' mkdir -p $CCACHE_DIR # Choose random name for docker container global CONTAINER_NAME := ""build_and_run_docker_$[uuidgen]"" # Run command inside docker docker run \ @Argv \ -e CCACHE_DIR=$CCACHE_DIR \ -e EXTERNAL_GIT_ROOT="/var/local/jenkins/protobuf" \ -e TEST_SET="$TEST_SET" \ -e THIS_IS_REALLY_NEEDED='see https://github.com/docker/docker/issues/14203 for why docker is awful' \ -v "$git_root:/var/local/jenkins/protobuf:ro" \ -v $CCACHE_DIR:$CCACHE_DIR \ -w /var/local/git/protobuf \ --name=$CONTAINER_NAME \ $DOCKER_IMAGE_NAME \ bash -l "/var/local/jenkins/protobuf/$DOCKER_RUN_SCRIPT" || global FAILED := '"true'" # Copy output artifacts if test $OUTPUT_DIR != "" { docker cp "$CONTAINER_NAME:/var/local/git/protobuf/$OUTPUT_DIR" $git_root || global FAILED := '"true'" } # remove the container, possibly killing it first docker rm -f $CONTAINER_NAME || true if test $FAILED != "" { exit 1 } (CommandList children: [ (C {(set)} {(-ex)}) (C {(cd)} { (CommandSubPart command_list: (CommandList children:[(C {(dirname)} {($ VSub_Number "$0")})]) left_token: spids: [36 40] ) (/..) } ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:git_root) op: Equal rhs: { (CommandSubPart command_list: (CommandList children:[(C {(pwd)})]) left_token: spids: [44 46] ) } spids: [43] ) ] spids: [43] ) (C {(cd)} {(-)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:DOCKER_IMAGE_NAME) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [(C {(basename)} {($ VSub_Name "$DOCKERFILE_DIR")})] ) left_token: spids: [57 61] ) (_) (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(sha1sum)} {($ VSub_Name "$DOCKERFILE_DIR") (/Dockerfile)}) (C {(cut)} {(-f1)} {(-d) (EscapedLiteralPart token:)}) ] negated: False ) ] ) left_token: spids: [63 77] ) } spids: [56] ) ] spids: [56] ) (C {(docker)} {(build)} {(-t)} {($ VSub_Name "$DOCKER_IMAGE_NAME")} {($ VSub_Name "$DOCKERFILE_DIR")}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CCACHE_DIR) op: Equal rhs: {(/tmp/protobuf-ccache)} spids: [97] ) ] spids: [97] ) (C {(mkdir)} {(-p)} {($ VSub_Name "$CCACHE_DIR")}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CONTAINER_NAME) op: Equal rhs: { (DQ (build_and_run_docker_) (CommandSubPart command_list: (CommandList children:[(C {(uuidgen)})]) left_token: spids: [113 115] ) ) } spids: [110] ) ] spids: [110] ) (AndOr children: [ (C {(docker)} {(run)} {(DQ ($ VSub_At "$@"))} {(-e)} {(Lit_VarLike "CCACHE_DIR=") ($ VSub_Name "$CCACHE_DIR")} {(-e)} {(Lit_VarLike "EXTERNAL_GIT_ROOT=") (DQ (/var/local/jenkins/protobuf))} {(-e)} {(Lit_VarLike "TEST_SET=") (DQ ($ VSub_Name "$TEST_SET"))} {(-e)} {(Lit_VarLike "THIS_IS_REALLY_NEEDED=") (SQ <"see https://github.com/docker/docker/issues/14203 for why docker is awful">) } {(-v)} {(DQ ($ VSub_Name "$git_root") (":/var/local/jenkins/protobuf:ro"))} {(-v)} {($ VSub_Name "$CCACHE_DIR") (Lit_Other ":") ($ VSub_Name "$CCACHE_DIR")} {(-w)} {(/var/local/git/protobuf)} {(--name) (Lit_Other "=") ($ VSub_Name "$CONTAINER_NAME")} {($ VSub_Name "$DOCKER_IMAGE_NAME")} {(bash)} {(-l)} {(DQ (/var/local/jenkins/protobuf/) ($ VSub_Name "$DOCKER_RUN_SCRIPT"))} ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:FAILED) op:Equal rhs:{(DQ (true))} spids:[212])] spids: [212] ) ] op_id: Op_DPipe ) (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$OUTPUT_DIR"))} {(KW_Bang "!") (Lit_Other "=")} {(DQ )} {(Lit_Other "]")} ) ] action: [ (AndOr children: [ (C {(docker)} {(cp)} { (DQ ($ VSub_Name "$CONTAINER_NAME") (":/var/local/git/protobuf/") ($ VSub_Name "$OUTPUT_DIR") ) } {(DQ ($ VSub_Name "$git_root"))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:FAILED) op: Equal rhs: {(DQ (true))} spids: [256] ) ] spids: [256] ) ] op_id: Op_DPipe ) ] spids: [-1 237] ) ] spids: [-1 261] ) (AndOr children: [(C {(docker)} {(rm)} {(-f)} {($ VSub_Name "$CONTAINER_NAME")}) (C {(true)})] op_id: Op_DPipe ) (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$FAILED"))} {(KW_Bang "!") (Lit_Other "=")} {(DQ )} {(Lit_Other "]")} ) ] action: [(C {(exit)} {(1)})] spids: [-1 296] ) ] spids: [-1 303] ) ] )