|
2 | 2 |
|
3 | 3 | set -e |
4 | 4 |
|
5 | | -CURRENT_SCRIPT_DIR="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" |
| 5 | +# TODO(phlax): Add a check that a usable version of docker compose is available |
6 | 6 |
|
7 | | -# shellcheck source=ci/envoy_build_sha.sh |
8 | | -. "${CURRENT_SCRIPT_DIR}"/envoy_build_sha.sh |
9 | 7 |
|
10 | | -function is_windows() { |
11 | | - [[ "$(uname -s)" == *NT* ]] |
12 | | -} |
| 8 | +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 9 | + |
| 10 | +# Source build SHA information |
| 11 | +# shellcheck source=ci/envoy_build_sha.sh |
| 12 | +source "${SCRIPT_DIR}/envoy_build_sha.sh" |
13 | 13 |
|
14 | | -read -ra ENVOY_DOCKER_OPTIONS <<< "${ENVOY_DOCKER_OPTIONS:-}" |
| 14 | +# User/group IDs |
| 15 | +USER_UID="$(id -u)" |
| 16 | +USER_GID="$(id -g)" |
| 17 | +export USER_UID |
| 18 | +export USER_GID |
15 | 19 |
|
| 20 | +# These should probably go in users .env as docker compose will pick that up |
16 | 21 | export HTTP_PROXY="${HTTP_PROXY:-${http_proxy:-}}" |
17 | 22 | export HTTPS_PROXY="${HTTPS_PROXY:-${https_proxy:-}}" |
18 | 23 | export NO_PROXY="${NO_PROXY:-${no_proxy:-}}" |
19 | 24 | export GOPROXY="${GOPROXY:-${go_proxy:-}}" |
20 | 25 |
|
21 | | -if is_windows; then |
22 | | - [[ -z "${IMAGE_NAME}" ]] && IMAGE_NAME="envoyproxy/envoy-build-windows2019" |
23 | | - # TODO(sunjayBhatia): Currently ENVOY_DOCKER_OPTIONS is ignored on Windows because |
24 | | - # CI sets it to a Linux-specific value. Undo this once https://github.com/envoyproxy/envoy/issues/13272 |
25 | | - # is resolved. |
26 | | - ENVOY_DOCKER_OPTIONS=() |
27 | | - # Replace MSYS style drive letter (/c/) with Windows drive letter designation (C:/) |
28 | | - DEFAULT_ENVOY_DOCKER_BUILD_DIR=$(echo "${TEMP}" | sed -E "s#^/([a-zA-Z])/#\1:/#")/envoy-docker-build |
29 | | - BUILD_DIR_MOUNT_DEST=C:/build |
30 | | - SOURCE_DIR=$(echo "${PWD}" | sed -E "s#^/([a-zA-Z])/#\1:/#") |
31 | | - SOURCE_DIR_MOUNT_DEST=C:/source |
32 | | - START_COMMAND=("bash" "-c" "cd /c/source && export HOME=/c/build && $*") |
33 | | -else |
34 | | - [[ -z "${IMAGE_NAME}" ]] && IMAGE_NAME="envoyproxy/envoy-build-ubuntu" |
35 | | - # We run as root and later drop permissions. This is required to setup the USER |
36 | | - # in useradd below, which is need for correct Python execution in the Docker |
37 | | - # environment. |
38 | | - ENVOY_DOCKER_OPTIONS+=(-u root:root) |
39 | | - DOCKER_USER_ARGS=() |
40 | | - DOCKER_GROUP_ARGS=() |
41 | | - DEFAULT_ENVOY_DOCKER_BUILD_DIR=/tmp/envoy-docker-build |
42 | | - USER_UID="$(id -u)" |
43 | | - USER_GID="$(id -g)" |
44 | | - if [[ -n "$ENVOY_DOCKER_IN_DOCKER" ]]; then |
45 | | - ENVOY_DOCKER_OPTIONS+=(-v /var/run/docker.sock:/var/run/docker.sock) |
46 | | - DOCKER_GID="$(stat -c %g /var/run/docker.sock 2>/dev/null || stat -f %g /var/run/docker.sock)" |
47 | | - DOCKER_USER_ARGS=(--gid "${DOCKER_GID}") |
48 | | - DOCKER_GROUP_ARGS=(--gid "${DOCKER_GID}") |
49 | | - else |
50 | | - DOCKER_GROUP_ARGS+=(--gid "${USER_GID}") |
51 | | - DOCKER_USER_ARGS+=(--gid "${USER_GID}") |
52 | | - fi |
53 | | - BUILD_DIR_MOUNT_DEST=/build |
54 | | - SOURCE_DIR="${PWD}" |
55 | | - SOURCE_DIR_MOUNT_DEST=/source |
56 | | - ENVOY_DOCKER_SOURCE_DIR="${ENVOY_DOCKER_SOURCE_DIR:-${SOURCE_DIR_MOUNT_DEST}}" |
57 | | - START_COMMAND=( |
58 | | - "/bin/bash" |
59 | | - "-lc" |
60 | | - "groupadd ${DOCKER_GROUP_ARGS[*]} -f envoygroup \ |
61 | | - && useradd -o --uid ${USER_UID} ${DOCKER_USER_ARGS[*]} --no-create-home --home-dir /build envoybuild \ |
62 | | - && usermod -a -G pcap envoybuild \ |
63 | | - && chown envoybuild:envoygroup /build \ |
64 | | - && chown envoybuild /proc/self/fd/2 \ |
65 | | - && sudo -EHs -u envoybuild bash -c 'cd ${ENVOY_DOCKER_SOURCE_DIR} && $*'") |
| 26 | +# Docker-in-Docker handling |
| 27 | +if [[ -n "$ENVOY_DOCKER_IN_DOCKER" ]]; then |
| 28 | + DOCKER_GID="$(stat -c %g /var/run/docker.sock 2>/dev/null || echo "$USER_GID")" |
| 29 | + export DOCKER_GID |
| 30 | +fi |
| 31 | + |
| 32 | +if [[ -n "$ENVOY_DOCKER_IN_DOCKER" || -n "$ENVOY_SHARED_TMP_DIR" ]]; then |
| 33 | + export SHARED_TMP_DIR="${ENVOY_SHARED_TMP_DIR:-/tmp/bazel-shared}" |
| 34 | + mkdir -p "${SHARED_TMP_DIR}" |
| 35 | + chmod 777 "${SHARED_TMP_DIR}" |
66 | 36 | fi |
67 | 37 |
|
68 | 38 | if [[ -n "$ENVOY_DOCKER_PLATFORM" ]]; then |
69 | 39 | echo "Setting Docker platform: ${ENVOY_DOCKER_PLATFORM}" |
70 | 40 | docker run --rm --privileged multiarch/qemu-user-static --reset -p yes |
71 | | - ENVOY_DOCKER_OPTIONS+=(--platform "$ENVOY_DOCKER_PLATFORM") |
72 | 41 | fi |
73 | 42 |
|
74 | | -# The IMAGE_ID defaults to the CI hash but can be set to an arbitrary image ID (found with 'docker |
75 | | -# images'). |
76 | | -if [[ -z "${IMAGE_ID}" ]]; then |
77 | | - IMAGE_ID="${ENVOY_BUILD_SHA}" |
78 | | - if ! is_windows && [[ -n "$ENVOY_BUILD_CONTAINER_SHA" ]]; then |
79 | | - IMAGE_ID="${ENVOY_BUILD_SHA}@sha256:${ENVOY_BUILD_CONTAINER_SHA}" |
80 | | - fi |
81 | | -fi |
82 | | -[[ -z "${ENVOY_DOCKER_BUILD_DIR}" ]] && ENVOY_DOCKER_BUILD_DIR="${DEFAULT_ENVOY_DOCKER_BUILD_DIR}" |
83 | | -# Replace backslash with forward slash for Windows style paths |
84 | | -ENVOY_DOCKER_BUILD_DIR="${ENVOY_DOCKER_BUILD_DIR//\\//}" |
85 | | -mkdir -p "${ENVOY_DOCKER_BUILD_DIR}" |
86 | | - |
87 | | -[[ -t 1 ]] && ENVOY_DOCKER_OPTIONS+=("-it") |
88 | | -[[ -f .git ]] && [[ ! -d .git ]] && ENVOY_DOCKER_OPTIONS+=(-v "$(git rev-parse --git-common-dir):$(git rev-parse --git-common-dir)") |
89 | | -[[ -n "${SSH_AUTH_SOCK}" ]] && ENVOY_DOCKER_OPTIONS+=(-v "${SSH_AUTH_SOCK}:${SSH_AUTH_SOCK}" -e SSH_AUTH_SOCK) |
90 | | - |
91 | | -export ENVOY_BUILD_IMAGE="${IMAGE_NAME}:${IMAGE_ID}" |
92 | | - |
93 | | -VOLUMES=( |
94 | | - -v "${ENVOY_DOCKER_BUILD_DIR}":"${BUILD_DIR_MOUNT_DEST}" |
95 | | - -v "${SOURCE_DIR}":"${SOURCE_DIR_MOUNT_DEST}") |
| 43 | +export DOCKER_COMMAND="${*:-bash}" |
96 | 44 |
|
| 45 | +COMPOSE_SERVICE="envoy-build" |
97 | 46 | if [[ -n "$MOUNT_GPG_HOME" ]]; then |
98 | | - VOLUMES+=( |
99 | | - -v "${HOME}/.gnupg:${BUILD_DIR_MOUNT_DEST}/.gnupg") |
100 | | -fi |
101 | | - |
102 | | -if ! is_windows; then |
103 | | - export BUILD_DIR="${BUILD_DIR_MOUNT_DEST}" |
104 | | -fi |
105 | | - |
106 | | -if [[ -n "$ENVOY_DOCKER_IN_DOCKER" || -n "$ENVOY_SHARED_TMP_DIR" ]]; then |
107 | | - # Create a "shared" directory that has the same path in/outside the container |
108 | | - # This allows the host docker engine to see artefacts using a temporary path created inside the container, |
109 | | - # at the same path. |
110 | | - # For example, a directory created with `mktemp -d --tmpdir /tmp/bazel-shared` can be mounted as a volume |
111 | | - # from within the build container. |
112 | | - SHARED_TMP_DIR="${ENVOY_SHARED_TMP_DIR:-/tmp/bazel-shared}" |
113 | | - mkdir -p "${SHARED_TMP_DIR}" |
114 | | - chmod +rwx "${SHARED_TMP_DIR}" |
115 | | - VOLUMES+=(-v "${SHARED_TMP_DIR}":"${SHARED_TMP_DIR}") |
116 | | -fi |
117 | | - |
118 | | -if [[ -n "${ENVOY_DOCKER_PULL}" ]]; then |
119 | | - time docker pull "${ENVOY_BUILD_IMAGE}" |
| 47 | + COMPOSE_SERVICE="envoy-build-gpg" |
| 48 | +elif [[ -n "$ENVOY_DOCKER_IN_DOCKER" ]]; then |
| 49 | + COMPOSE_SERVICE="envoy-build-dind" |
120 | 50 | fi |
121 | 51 |
|
122 | | -# Since we specify an explicit hash, docker-run will pull from the remote repo if missing. |
123 | | -docker run --rm \ |
124 | | - "${ENVOY_DOCKER_OPTIONS[@]}" \ |
125 | | - "${VOLUMES[@]}" \ |
126 | | - -e BUILD_DIR \ |
127 | | - -e HTTP_PROXY \ |
128 | | - -e HTTPS_PROXY \ |
129 | | - -e NO_PROXY \ |
130 | | - -e GOPROXY \ |
131 | | - -e BAZEL_STARTUP_OPTIONS \ |
132 | | - -e BAZEL_BUILD_EXTRA_OPTIONS \ |
133 | | - -e BAZEL_EXTRA_TEST_OPTIONS \ |
134 | | - -e BAZEL_REMOTE_CACHE \ |
135 | | - -e BAZEL_STARTUP_EXTRA_OPTIONS \ |
136 | | - -e CI_BRANCH \ |
137 | | - -e CI_SHA1 \ |
138 | | - -e CI_TARGET_BRANCH \ |
139 | | - -e DOCKERHUB_USERNAME \ |
140 | | - -e DOCKERHUB_PASSWORD \ |
141 | | - -e ENVOY_DOCKER_SAVE_IMAGE \ |
142 | | - -e BUILD_REASON \ |
143 | | - -e BAZEL_REMOTE_INSTANCE \ |
144 | | - -e GCP_SERVICE_ACCOUNT_KEY \ |
145 | | - -e GCP_SERVICE_ACCOUNT_KEY_PATH \ |
146 | | - -e NUM_CPUS \ |
147 | | - -e ENVOY_BRANCH \ |
148 | | - -e ENVOY_RBE \ |
149 | | - -e ENVOY_BUILD_IMAGE \ |
150 | | - -e ENVOY_SRCDIR \ |
151 | | - -e ENVOY_BUILD_TARGET \ |
152 | | - -e ENVOY_BUILD_DEBUG_INFORMATION \ |
153 | | - -e ENVOY_BUILD_FILTER_EXAMPLE \ |
154 | | - -e ENVOY_COMMIT \ |
155 | | - -e ENVOY_HEAD_REF \ |
156 | | - -e ENVOY_PUBLISH_DRY_RUN \ |
157 | | - -e ENVOY_REPO \ |
158 | | - -e ENVOY_TARBALL_DIR \ |
159 | | - -e ENVOY_GEN_COMPDB_OPTIONS \ |
160 | | - -e GCS_ARTIFACT_BUCKET \ |
161 | | - -e GCS_REDIRECT_PATH \ |
162 | | - -e GITHUB_REF_NAME \ |
163 | | - -e GITHUB_REF_TYPE \ |
164 | | - -e GITHUB_TOKEN \ |
165 | | - -e GITHUB_APP_ID \ |
166 | | - -e GITHUB_INSTALL_ID \ |
167 | | - -e MOBILE_DOCS_CHECKOUT_DIR \ |
168 | | - -e BAZELISK_BASE_URL \ |
169 | | - -e ENVOY_BUILD_ARCH \ |
170 | | - -e SYSTEM_STAGEDISPLAYNAME \ |
171 | | - -e SYSTEM_JOBDISPLAYNAME \ |
172 | | - "${ENVOY_BUILD_IMAGE}" \ |
173 | | - "${START_COMMAND[@]}" |
| 52 | +exec docker compose \ |
| 53 | + -f "${SCRIPT_DIR}/docker-compose.yml" \ |
| 54 | + ${ENVOY_DOCKER_PLATFORM:+-p "$ENVOY_DOCKER_PLATFORM"} \ |
| 55 | + run \ |
| 56 | + --rm \ |
| 57 | + "${COMPOSE_SERVICE}" |
0 commit comments