Enable Ubuntu CI Build using Docker

These changes fix many of the issues blocking our Ubuntu CI Build.
Notably, it adds a postbuild step to the CI which cleans up file
permissions on files created in Docker. This lets the next job
delete those files successfully. It also accounts for docker instances
which are left running after an aborted job.
This commit is contained in:
Bryan Thornbury 2015-10-22 17:41:39 -07:00 committed by Bryan
parent ed51925e3a
commit 9d4887ef75
9 changed files with 88 additions and 5 deletions

View file

@ -24,6 +24,7 @@ def static getBuildJobName(def configuration, def os) {
// Calculate job name
def jobName = getBuildJobName(configuration, os)
def buildCommand = '';
def postBuildCommand = '';
// Calculate the build command
if (os == 'Windows_NT') {
@ -31,6 +32,7 @@ def static getBuildJobName(def configuration, def os) {
}
else {
buildCommand = "./scripts/ci_build.sh ${lowerConfiguration}"
postBuildCommand = "./scripts/ci_postbuild.sh ${lowerConfiguration}"
}
// Create the new job
@ -45,6 +47,16 @@ def static getBuildJobName(def configuration, def os) {
else {
// Shell
shell(buildCommand)
// Post Build Cleanup
publishers {
postBuildScripts {
steps {
shell(postBuildCommand)
}
onlyIfBuildSucceeds(false)
}
}
}
}
}
@ -67,6 +79,17 @@ def static getBuildJobName(def configuration, def os) {
else {
// Shell
shell(buildCommand)
// Post Build Cleanup
publishers {
postBuildScripts {
steps {
shell(postBuildCommand)
}
onlyIfBuildSucceeds(false)
}
}
}
}
}

View file

@ -2,6 +2,16 @@
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [[ "$(uname)" == "Linux" ]]; then
# Set Docker Container name to be unique
container_name=""
#Jenkins
[ ! -z "$BUILD_TAG" ] && container_name="$BUILD_TAG"
#VSO
[ ! -z "$BUILD_BUILDID" ] && container_name="$BUILD_BUILDID"
export DOTNET_BUILD_CONTAINER_NAME="$container_name"
$SCRIPT_DIR/dockerbuild.sh debian $@
else
$SCRIPT_DIR/../build.sh $@

19
scripts/ci_postbuild.sh Executable file
View file

@ -0,0 +1,19 @@
#!/usr/bin/env bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [[ "$(uname)" == "Linux" ]]; then
# Set Docker Container name to be unique
container_name=""
#Jenkins
[ ! -z "$BUILD_TAG" ] && container_name="$BUILD_TAG"
#VSO
[ ! -z "$BUILD_BUILDID" ] && container_name="$BUILD_BUILDID"
export DOTNET_BUILD_CONTAINER_NAME="$container_name"
$SCRIPT_DIR/dockerpostbuild.sh $@
fi
ret_code=$?
exit $ret_code

0
scripts/dnvm2.sh Normal file → Executable file
View file

View file

@ -21,13 +21,10 @@ echo $DOCKER_HOST_SHARE_DIR
docker build -t $DOTNET_BUILD_CONTAINER_TAG scripts/docker/
# Run the build in the container
docker run --rm \
docker run --rm --sig-proxy=true \
--name $DOTNET_BUILD_CONTAINER_NAME \
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
-e DOTNET_BUILD_VERSION=$DOTNET_BUILD_VERSION \
$DOTNET_BUILD_CONTAINER_TAG $BUILD_COMMAND $1
docker run --rm \
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
-e DOTNET_BUILD_VERSION=$DOTNET_BUILD_VERSION \
$DOTNET_BUILD_CONTAINER_TAG chmod a+rw /opt/code

34
scripts/dockerpostbuild.sh Executable file
View file

@ -0,0 +1,34 @@
#!/usr/bin/env bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
cd $DIR/..
[ -z "$DOTNET_BUILD_CONTAINER_TAG" ] && DOTNET_BUILD_CONTAINER_TAG="dotnetcli-build"
[ -z "$DOTNET_BUILD_CONTAINER_NAME" ] && DOTNET_BUILD_CONTAINER_NAME="dotnetcli-build-container"
[ -z "$DOCKER_HOST_SHARE_DIR" ] && DOCKER_HOST_SHARE_DIR=$(pwd)
# Build the docker container (will be fast if it is already built)
docker build -t $DOTNET_BUILD_CONTAINER_TAG scripts/docker/
# First thing make sure all of our build containers are stopped
docker stop $DOTNET_BUILD_CONTAINER_NAME
docker rm $DOTNET_BUILD_CONTAINER_NAME
# Remove the sticky bit on directories created by docker so we can delete them
docker run --rm \
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
-e DOTNET_BUILD_VERSION=$DOTNET_BUILD_VERSION \
$DOTNET_BUILD_CONTAINER_TAG chmod -R -t /opt/code
# And Actually make those directories accessible to be deleted
docker run --rm \
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
-e DOTNET_BUILD_VERSION=$DOTNET_BUILD_VERSION \
$DOTNET_BUILD_CONTAINER_TAG chmod -R a+rwx /opt/code

0
scripts/publish.sh Normal file → Executable file
View file

0
scripts/repoapi_client.sh Normal file → Executable file
View file

0
scripts/windows_dockerbuild.sh Normal file → Executable file
View file