blob: 50efaada3e04f9a563a3723af4626e971edb28cf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
#!/bin/bash
# SPDX-license-identifier: Apache-2.0
##############################################################################
# Copyright (c) 2016 Ericsson AB and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
set -o errexit
set -o nounset
set -o pipefail
echo "Using Docker $(docker --version) on $NODE_NAME"
echo "Starting Docker build for $DOCKER_REPO_NAME ..."
echo "--------------------------------------------------------"
echo
function remove_containers_images()
{
# Remove previous running containers if exist
#
# $ docker ps -a
# CONTAINER ID IMAGE COMMAND ...
# 6a796ed40b8e anuket/example-tasks:latest "/bin/bash" ...
# 99fcb59f4787 anuket/example-tasks-base:latest "/bin/bash" ...
# cc5eee16b995 anuket/example-tasks-k8s "/bin/bash" ...
#
# Cut image name by leading space and ending space or colon(tag)
if [[ -n "$(docker ps -a | grep " $DOCKER_REPO_NAME[ :]")" ]]; then
echo "Removing existing $DOCKER_REPO_NAME containers..."
docker ps -a | grep " $DOCKER_REPO_NAME[ :]" | awk '{print $1}' | xargs docker rm -f
t=60
# Wait max 60 sec for containers to be removed
while [[ $t -gt 0 ]] && [[ -n "$(docker ps| grep " $DOCKER_REPO_NAME[ :]")" ]]; do
sleep 1
let t=t-1
done
fi
# Remove existing images if exist
#
# $ docker images
# REPOSITORY TAG IMAGE ID ...
# anuket/example-tasks latest 6501569fd328 ...
# anuket/example-tasks-base latest 8764fe29c434 ...
# anuket/example-tasks-k8s latest 61094cac9e65 ...
#
# Cut image name by start of line and ending space
if [[ -n "$(docker images | grep "^$DOCKER_REPO_NAME ")" ]]; then
echo "Docker images to remove:"
docker images | head -1 && docker images | grep "^$DOCKER_REPO_NAME "
image_ids=($(docker images | grep "^$DOCKER_REPO_NAME " | awk '{print $3}'))
for id in "${image_ids[@]}"; do
if [[ -n "$(docker images|grep "^$DOCKER_REPO_NAME "|grep $id)" ]]; then
echo "Removing docker image $DOCKER_REPO_NAME:$id..."
docker rmi -f $id
fi
done
fi
}
count=30 # docker build jobs might take up to ~30 min
while [[ -n `ps -ef| grep 'docker build' | grep $DOCKER_REPO_NAME | grep -v grep` ]]; do
echo "Build or cleanup of $DOCKER_REPO_NAME in progress. Waiting..."
sleep 60
count=$(( $count - 1 ))
if [ $count -eq 0 ]; then
echo "Timeout. Aborting..."
exit 1
fi
done
# Remove the existing containers and images before building
remove_containers_images
DOCKER_PATH=$WORKSPACE/$DOCKER_DIR
cd $DOCKER_PATH || exit 1
HOST_ARCH="$(uname -m)"
#If there is a patch for other arch then x86, apply the patch and
#replace Dockerfile file
dockerfile_patch="Dockerfile.${HOST_ARCH}.patch"
if [[ -f "${dockerfile_patch}" ]]; then
patch -f Dockerfile -p1 < "${dockerfile_patch}"
fi
# Get tag version
echo "Current branch: $BRANCH"
BUILD_BRANCH=$BRANCH
GERRIT_REFNAME=${GERRIT_REFNAME:-''}
RELEASE_VERSION=${GERRIT_REFNAME/refs\/tags\/}
# If we're being triggered by a comment-added job, then extract the tag
# from the comment and use that as the release version.
# Expected comment format: retag anuket-x.y.z
if [[ "${GERRIT_EVENT_TYPE:-}" == "comment-added" ]]; then
RELEASE_VERSION=$(echo "$GERRIT_EVENT_COMMENT_TEXT" | grep 'retag' | awk '{print $2}')
fi
if [[ "$BRANCH" == "master" ]]; then
DOCKER_TAG="latest"
fi
if [[ "$BRANCH" =~ "stable" ]]; then
DOCKER_TAG="stable"
fi
if [[ -n "${RELEASE_VERSION-}" ]]; then
DOCKER_TAG=${RELEASE_VERSION}
if git checkout ${RELEASE_VERSION}; then
echo "Successfully checked out the git tag ${RELEASE_VERSION}"
else
echo "The tag ${RELEASE_VERSION} doesn't exist in the repository. Existing tags are:"
git tag
exit 1
fi
fi
if [[ -n "${COMMIT_ID-}" && -n "${RELEASE_VERSION-}" ]]; then
DOCKER_TAG=$RELEASE_VERSION
BUILD_BRANCH=$COMMIT_ID
fi
ARCH_BUILD_ARG=""
ARCH_TAG=${ARCH_TAG:-}
if [[ -n "${ARCH_TAG}" ]]; then
DOCKER_TAG=${ARCH_TAG}-${DOCKER_TAG}
ARCH_BUILD_ARG="--build-arg ARCH=${ARCH_TAG}"
fi
EXTRA_BUILD_ARGS=${EXTRA_BUILD_ARGS:-}
if [ -n "${EXTRA_BUILD_ARGS}" ]; then
EXTRA_BUILD_ARGS=" "$(echo ${EXTRA_BUILD_ARGS})
EXTRA_BUILD_ARGS=${EXTRA_BUILD_ARGS// / --build-arg }
fi
# Start the build
echo "Building docker image: $DOCKER_REPO_NAME:$DOCKER_TAG"
echo "--------------------------------------------------------"
echo
cmd="docker build --pull=true --no-cache -t $DOCKER_REPO_NAME:$DOCKER_TAG --build-arg BRANCH=$BUILD_BRANCH
$ARCH_BUILD_ARG $EXTRA_BUILD_ARGS
-f $DOCKERFILE $DOCKER_PATH"
echo ${cmd}
${cmd}
# list the images
echo "Available images are:"
docker images
# Push image to Dockerhub
if [[ "$PUSH_IMAGE" == "true" ]]; then
echo "Pushing $DOCKER_REPO_NAME:$DOCKER_TAG to the docker registry..."
echo "--------------------------------------------------------"
echo
docker push $DOCKER_REPO_NAME:$DOCKER_TAG
fi
# Remove the existing containers and images after building
remove_containers_images
|