googleauth 0.1.0 → 0.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.github/CODEOWNERS +7 -0
- data/.github/CONTRIBUTING.md +74 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
- data/.github/ISSUE_TEMPLATE/support_request.md +7 -0
- data/.github/renovate.json +6 -0
- data/.github/sync-repo-settings.yaml +18 -0
- data/.github/workflows/ci.yml +55 -0
- data/.github/workflows/release-please.yml +39 -0
- data/.gitignore +3 -0
- data/.kokoro/populate-secrets.sh +76 -0
- data/.kokoro/release.cfg +52 -0
- data/.kokoro/release.sh +18 -0
- data/.kokoro/trampoline_v2.sh +489 -0
- data/.repo-metadata.json +5 -0
- data/.rubocop.yml +17 -0
- data/.toys/.toys.rb +45 -0
- data/.toys/ci.rb +43 -0
- data/.toys/kokoro/.toys.rb +66 -0
- data/.toys/kokoro/publish-docs.rb +67 -0
- data/.toys/kokoro/publish-gem.rb +53 -0
- data/.toys/linkinator.rb +43 -0
- data/.trampolinerc +48 -0
- data/CHANGELOG.md +199 -0
- data/CODE_OF_CONDUCT.md +43 -0
- data/Gemfile +22 -1
- data/{COPYING → LICENSE} +0 -0
- data/README.md +140 -17
- data/googleauth.gemspec +28 -28
- data/integration/helper.rb +31 -0
- data/integration/id_tokens/key_source_test.rb +74 -0
- data/lib/googleauth.rb +7 -37
- data/lib/googleauth/application_default.rb +81 -0
- data/lib/googleauth/client_id.rb +104 -0
- data/lib/googleauth/compute_engine.rb +73 -26
- data/lib/googleauth/credentials.rb +561 -0
- data/lib/googleauth/credentials_loader.rb +207 -0
- data/lib/googleauth/default_credentials.rb +93 -0
- data/lib/googleauth/iam.rb +75 -0
- data/lib/googleauth/id_tokens.rb +233 -0
- data/lib/googleauth/id_tokens/errors.rb +71 -0
- data/lib/googleauth/id_tokens/key_sources.rb +396 -0
- data/lib/googleauth/id_tokens/verifier.rb +142 -0
- data/lib/googleauth/json_key_reader.rb +50 -0
- data/lib/googleauth/scope_util.rb +61 -0
- data/lib/googleauth/service_account.rb +177 -67
- data/lib/googleauth/signet.rb +69 -8
- data/lib/googleauth/stores/file_token_store.rb +65 -0
- data/lib/googleauth/stores/redis_token_store.rb +96 -0
- data/lib/googleauth/token_store.rb +69 -0
- data/lib/googleauth/user_authorizer.rb +285 -0
- data/lib/googleauth/user_refresh.rb +129 -0
- data/lib/googleauth/version.rb +1 -1
- data/lib/googleauth/web_user_authorizer.rb +295 -0
- data/spec/googleauth/apply_auth_examples.rb +96 -94
- data/spec/googleauth/client_id_spec.rb +160 -0
- data/spec/googleauth/compute_engine_spec.rb +125 -55
- data/spec/googleauth/credentials_spec.rb +600 -0
- data/spec/googleauth/get_application_default_spec.rb +232 -80
- data/spec/googleauth/iam_spec.rb +80 -0
- data/spec/googleauth/scope_util_spec.rb +77 -0
- data/spec/googleauth/service_account_spec.rb +422 -68
- data/spec/googleauth/signet_spec.rb +101 -25
- data/spec/googleauth/stores/file_token_store_spec.rb +57 -0
- data/spec/googleauth/stores/redis_token_store_spec.rb +50 -0
- data/spec/googleauth/stores/store_examples.rb +58 -0
- data/spec/googleauth/user_authorizer_spec.rb +343 -0
- data/spec/googleauth/user_refresh_spec.rb +359 -0
- data/spec/googleauth/web_user_authorizer_spec.rb +172 -0
- data/spec/spec_helper.rb +51 -10
- data/test/helper.rb +33 -0
- data/test/id_tokens/key_sources_test.rb +240 -0
- data/test/id_tokens/verifier_test.rb +269 -0
- metadata +114 -75
- data/.travis.yml +0 -18
- data/CONTRIBUTING.md +0 -32
- data/Rakefile +0 -15
@@ -0,0 +1,489 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
# Copyright 2020 Google LLC
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
# trampoline_v2.sh
|
17
|
+
#
|
18
|
+
# If you want to make a change to this file, consider doing so at:
|
19
|
+
# https://github.com/googlecloudplatform/docker-ci-helper
|
20
|
+
#
|
21
|
+
# This script is for running CI builds. For Kokoro builds, we
|
22
|
+
# set this script to `build_file` field in the Kokoro configuration.
|
23
|
+
|
24
|
+
# This script does 3 things.
|
25
|
+
#
|
26
|
+
# 1. Prepare the Docker image for the test
|
27
|
+
# 2. Run the Docker with appropriate flags to run the test
|
28
|
+
# 3. Upload the newly built Docker image
|
29
|
+
#
|
30
|
+
# in a way that is somewhat compatible with trampoline_v1.
|
31
|
+
#
|
32
|
+
# These environment variables are required:
|
33
|
+
# TRAMPOLINE_IMAGE: The docker image to use.
|
34
|
+
# TRAMPOLINE_DOCKERFILE: The location of the Dockerfile.
|
35
|
+
#
|
36
|
+
# You can optionally change these environment variables:
|
37
|
+
# TRAMPOLINE_IMAGE_UPLOAD:
|
38
|
+
# (true|false): Whether to upload the Docker image after the
|
39
|
+
# successful builds.
|
40
|
+
# TRAMPOLINE_BUILD_FILE: The script to run in the docker container.
|
41
|
+
# TRAMPOLINE_WORKSPACE: The workspace path in the docker container.
|
42
|
+
# Defaults to /workspace.
|
43
|
+
# Potentially there are some repo specific envvars in .trampolinerc in
|
44
|
+
# the project root.
|
45
|
+
#
|
46
|
+
# Here is an example for running this script.
|
47
|
+
# TRAMPOLINE_IMAGE=gcr.io/cloud-devrel-kokoro-resources/node:10-user \
|
48
|
+
# TRAMPOLINE_BUILD_FILE=.kokoro/system-test.sh \
|
49
|
+
# .kokoro/trampoline_v2.sh
|
50
|
+
|
51
|
+
set -euo pipefail
|
52
|
+
|
53
|
+
TRAMPOLINE_VERSION="2.0.10"
|
54
|
+
|
55
|
+
if command -v tput >/dev/null && [[ -n "${TERM:-}" ]]; then
|
56
|
+
readonly IO_COLOR_RED="$(tput setaf 1)"
|
57
|
+
readonly IO_COLOR_GREEN="$(tput setaf 2)"
|
58
|
+
readonly IO_COLOR_YELLOW="$(tput setaf 3)"
|
59
|
+
readonly IO_COLOR_RESET="$(tput sgr0)"
|
60
|
+
else
|
61
|
+
readonly IO_COLOR_RED=""
|
62
|
+
readonly IO_COLOR_GREEN=""
|
63
|
+
readonly IO_COLOR_YELLOW=""
|
64
|
+
readonly IO_COLOR_RESET=""
|
65
|
+
fi
|
66
|
+
|
67
|
+
function function_exists {
|
68
|
+
[ $(LC_ALL=C type -t $1)"" == "function" ]
|
69
|
+
}
|
70
|
+
|
71
|
+
# Logs a message using the given color. The first argument must be one
|
72
|
+
# of the IO_COLOR_* variables defined above, such as
|
73
|
+
# "${IO_COLOR_YELLOW}". The remaining arguments will be logged in the
|
74
|
+
# given color. The log message will also have an RFC-3339 timestamp
|
75
|
+
# prepended (in UTC). You can disable the color output by setting
|
76
|
+
# TERM=vt100.
|
77
|
+
function log_impl() {
|
78
|
+
local color="$1"
|
79
|
+
shift
|
80
|
+
local timestamp="$(date -u "+%Y-%m-%dT%H:%M:%SZ")"
|
81
|
+
echo "================================================================"
|
82
|
+
echo "${color}${timestamp}:" "$@" "${IO_COLOR_RESET}"
|
83
|
+
echo "================================================================"
|
84
|
+
}
|
85
|
+
|
86
|
+
# Logs the given message with normal coloring and a timestamp.
|
87
|
+
function log() {
|
88
|
+
log_impl "${IO_COLOR_RESET}" "$@"
|
89
|
+
}
|
90
|
+
|
91
|
+
# Logs the given message in green with a timestamp.
|
92
|
+
function log_green() {
|
93
|
+
log_impl "${IO_COLOR_GREEN}" "$@"
|
94
|
+
}
|
95
|
+
|
96
|
+
# Logs the given message in yellow with a timestamp.
|
97
|
+
function log_yellow() {
|
98
|
+
log_impl "${IO_COLOR_YELLOW}" "$@"
|
99
|
+
}
|
100
|
+
|
101
|
+
# Logs the given message in red with a timestamp.
|
102
|
+
function log_red() {
|
103
|
+
log_impl "${IO_COLOR_RED}" "$@"
|
104
|
+
}
|
105
|
+
|
106
|
+
readonly tmpdir=$(mktemp -d -t ci-XXXXXXXX)
|
107
|
+
readonly tmphome="${tmpdir}/h"
|
108
|
+
mkdir -p "${tmphome}"
|
109
|
+
|
110
|
+
function cleanup() {
|
111
|
+
rm -rf "${tmpdir}"
|
112
|
+
}
|
113
|
+
trap cleanup EXIT
|
114
|
+
|
115
|
+
RUNNING_IN_CI="${RUNNING_IN_CI:-false}"
|
116
|
+
|
117
|
+
# The workspace in the container, defaults to /workspace.
|
118
|
+
TRAMPOLINE_WORKSPACE="${TRAMPOLINE_WORKSPACE:-/workspace}"
|
119
|
+
|
120
|
+
pass_down_envvars=(
|
121
|
+
# TRAMPOLINE_V2 variables.
|
122
|
+
# Tells scripts whether they are running as part of CI or not.
|
123
|
+
"RUNNING_IN_CI"
|
124
|
+
# Indicates which CI system we're in.
|
125
|
+
"TRAMPOLINE_CI"
|
126
|
+
# Indicates the version of the script.
|
127
|
+
"TRAMPOLINE_VERSION"
|
128
|
+
)
|
129
|
+
|
130
|
+
log_yellow "Building with Trampoline ${TRAMPOLINE_VERSION}"
|
131
|
+
|
132
|
+
# Detect which CI systems we're in. If we're in any of the CI systems
|
133
|
+
# we support, `RUNNING_IN_CI` will be true and `TRAMPOLINE_CI` will be
|
134
|
+
# the name of the CI system. Both envvars will be passing down to the
|
135
|
+
# container for telling which CI system we're in.
|
136
|
+
if [[ -n "${KOKORO_BUILD_ID:-}" ]]; then
|
137
|
+
# descriptive env var for indicating it's on CI.
|
138
|
+
RUNNING_IN_CI="true"
|
139
|
+
TRAMPOLINE_CI="kokoro"
|
140
|
+
if [[ "${TRAMPOLINE_USE_LEGACY_SERVICE_ACCOUNT:-}" == "true" ]]; then
|
141
|
+
if [[ ! -f "${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json" ]]; then
|
142
|
+
log_red "${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json does not exist. Did you forget to mount cloud-devrel-kokoro-resources/trampoline? Aborting."
|
143
|
+
exit 1
|
144
|
+
fi
|
145
|
+
# This service account will be activated later.
|
146
|
+
TRAMPOLINE_SERVICE_ACCOUNT="${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json"
|
147
|
+
else
|
148
|
+
if [[ "${TRAMPOLINE_VERBOSE:-}" == "true" ]]; then
|
149
|
+
gcloud auth list
|
150
|
+
fi
|
151
|
+
log_yellow "Configuring Container Registry access"
|
152
|
+
gcloud auth configure-docker --quiet
|
153
|
+
fi
|
154
|
+
pass_down_envvars+=(
|
155
|
+
# KOKORO dynamic variables.
|
156
|
+
"KOKORO_BUILD_NUMBER"
|
157
|
+
"KOKORO_BUILD_ID"
|
158
|
+
"KOKORO_JOB_NAME"
|
159
|
+
"KOKORO_GIT_COMMIT"
|
160
|
+
"KOKORO_GITHUB_COMMIT"
|
161
|
+
"KOKORO_GITHUB_PULL_REQUEST_NUMBER"
|
162
|
+
"KOKORO_GITHUB_PULL_REQUEST_COMMIT"
|
163
|
+
# For Flaky Bot
|
164
|
+
"KOKORO_GITHUB_COMMIT_URL"
|
165
|
+
"KOKORO_GITHUB_PULL_REQUEST_URL"
|
166
|
+
"KOKORO_BUILD_ARTIFACTS_SUBDIR"
|
167
|
+
)
|
168
|
+
elif [[ "${TRAVIS:-}" == "true" ]]; then
|
169
|
+
RUNNING_IN_CI="true"
|
170
|
+
TRAMPOLINE_CI="travis"
|
171
|
+
pass_down_envvars+=(
|
172
|
+
"TRAVIS_BRANCH"
|
173
|
+
"TRAVIS_BUILD_ID"
|
174
|
+
"TRAVIS_BUILD_NUMBER"
|
175
|
+
"TRAVIS_BUILD_WEB_URL"
|
176
|
+
"TRAVIS_COMMIT"
|
177
|
+
"TRAVIS_COMMIT_MESSAGE"
|
178
|
+
"TRAVIS_COMMIT_RANGE"
|
179
|
+
"TRAVIS_JOB_NAME"
|
180
|
+
"TRAVIS_JOB_NUMBER"
|
181
|
+
"TRAVIS_JOB_WEB_URL"
|
182
|
+
"TRAVIS_PULL_REQUEST"
|
183
|
+
"TRAVIS_PULL_REQUEST_BRANCH"
|
184
|
+
"TRAVIS_PULL_REQUEST_SHA"
|
185
|
+
"TRAVIS_PULL_REQUEST_SLUG"
|
186
|
+
"TRAVIS_REPO_SLUG"
|
187
|
+
"TRAVIS_SECURE_ENV_VARS"
|
188
|
+
"TRAVIS_TAG"
|
189
|
+
)
|
190
|
+
elif [[ -n "${GITHUB_RUN_ID:-}" ]]; then
|
191
|
+
RUNNING_IN_CI="true"
|
192
|
+
TRAMPOLINE_CI="github-workflow"
|
193
|
+
pass_down_envvars+=(
|
194
|
+
"GITHUB_WORKFLOW"
|
195
|
+
"GITHUB_RUN_ID"
|
196
|
+
"GITHUB_RUN_NUMBER"
|
197
|
+
"GITHUB_ACTION"
|
198
|
+
"GITHUB_ACTIONS"
|
199
|
+
"GITHUB_ACTOR"
|
200
|
+
"GITHUB_REPOSITORY"
|
201
|
+
"GITHUB_EVENT_NAME"
|
202
|
+
"GITHUB_EVENT_PATH"
|
203
|
+
"GITHUB_SHA"
|
204
|
+
"GITHUB_REF"
|
205
|
+
"GITHUB_HEAD_REF"
|
206
|
+
"GITHUB_BASE_REF"
|
207
|
+
)
|
208
|
+
elif [[ "${CIRCLECI:-}" == "true" ]]; then
|
209
|
+
RUNNING_IN_CI="true"
|
210
|
+
TRAMPOLINE_CI="circleci"
|
211
|
+
pass_down_envvars+=(
|
212
|
+
"CIRCLE_BRANCH"
|
213
|
+
"CIRCLE_BUILD_NUM"
|
214
|
+
"CIRCLE_BUILD_URL"
|
215
|
+
"CIRCLE_COMPARE_URL"
|
216
|
+
"CIRCLE_JOB"
|
217
|
+
"CIRCLE_NODE_INDEX"
|
218
|
+
"CIRCLE_NODE_TOTAL"
|
219
|
+
"CIRCLE_PREVIOUS_BUILD_NUM"
|
220
|
+
"CIRCLE_PROJECT_REPONAME"
|
221
|
+
"CIRCLE_PROJECT_USERNAME"
|
222
|
+
"CIRCLE_REPOSITORY_URL"
|
223
|
+
"CIRCLE_SHA1"
|
224
|
+
"CIRCLE_STAGE"
|
225
|
+
"CIRCLE_USERNAME"
|
226
|
+
"CIRCLE_WORKFLOW_ID"
|
227
|
+
"CIRCLE_WORKFLOW_JOB_ID"
|
228
|
+
"CIRCLE_WORKFLOW_UPSTREAM_JOB_IDS"
|
229
|
+
"CIRCLE_WORKFLOW_WORKSPACE_ID"
|
230
|
+
)
|
231
|
+
fi
|
232
|
+
|
233
|
+
# Configure the service account for pulling the docker image.
|
234
|
+
function repo_root() {
|
235
|
+
local dir="$1"
|
236
|
+
while [[ ! -d "${dir}/.git" ]]; do
|
237
|
+
dir="$(dirname "$dir")"
|
238
|
+
done
|
239
|
+
echo "${dir}"
|
240
|
+
}
|
241
|
+
|
242
|
+
# Detect the project root. In CI builds, we assume the script is in
|
243
|
+
# the git tree and traverse from there, otherwise, traverse from `pwd`
|
244
|
+
# to find `.git` directory.
|
245
|
+
if [[ "${RUNNING_IN_CI:-}" == "true" ]]; then
|
246
|
+
PROGRAM_PATH="$(realpath "$0")"
|
247
|
+
PROGRAM_DIR="$(dirname "${PROGRAM_PATH}")"
|
248
|
+
PROJECT_ROOT="$(repo_root "${PROGRAM_DIR}")"
|
249
|
+
else
|
250
|
+
PROJECT_ROOT="$(repo_root $(pwd))"
|
251
|
+
fi
|
252
|
+
|
253
|
+
log_yellow "Changing to the project root: ${PROJECT_ROOT}."
|
254
|
+
cd "${PROJECT_ROOT}"
|
255
|
+
|
256
|
+
# To support relative path for `TRAMPOLINE_SERVICE_ACCOUNT`, we need
|
257
|
+
# to use this environment variable in `PROJECT_ROOT`.
|
258
|
+
if [[ -n "${TRAMPOLINE_SERVICE_ACCOUNT:-}" ]]; then
|
259
|
+
|
260
|
+
mkdir -p "${tmpdir}/gcloud"
|
261
|
+
gcloud_config_dir="${tmpdir}/gcloud"
|
262
|
+
|
263
|
+
log_yellow "Using isolated gcloud config: ${gcloud_config_dir}."
|
264
|
+
export CLOUDSDK_CONFIG="${gcloud_config_dir}"
|
265
|
+
|
266
|
+
log_yellow "Using ${TRAMPOLINE_SERVICE_ACCOUNT} for authentication."
|
267
|
+
gcloud auth activate-service-account \
|
268
|
+
--key-file "${TRAMPOLINE_SERVICE_ACCOUNT}"
|
269
|
+
log_yellow "Configuring Container Registry access"
|
270
|
+
gcloud auth configure-docker --quiet
|
271
|
+
fi
|
272
|
+
|
273
|
+
required_envvars=(
|
274
|
+
# The basic trampoline configurations.
|
275
|
+
"TRAMPOLINE_IMAGE"
|
276
|
+
"TRAMPOLINE_BUILD_FILE"
|
277
|
+
)
|
278
|
+
|
279
|
+
if [[ -f "${PROJECT_ROOT}/.trampolinerc" ]]; then
|
280
|
+
source "${PROJECT_ROOT}/.trampolinerc"
|
281
|
+
fi
|
282
|
+
|
283
|
+
log_yellow "Checking environment variables."
|
284
|
+
for e in "${required_envvars[@]}"
|
285
|
+
do
|
286
|
+
if [[ -z "${!e:-}" ]]; then
|
287
|
+
log "Missing ${e} env var. Aborting."
|
288
|
+
exit 1
|
289
|
+
fi
|
290
|
+
done
|
291
|
+
|
292
|
+
# We want to support legacy style TRAMPOLINE_BUILD_FILE used with V1
|
293
|
+
# script: e.g. "github/repo-name/.kokoro/run_tests.sh"
|
294
|
+
TRAMPOLINE_BUILD_FILE="${TRAMPOLINE_BUILD_FILE#github/*/}"
|
295
|
+
log_yellow "Using TRAMPOLINE_BUILD_FILE: ${TRAMPOLINE_BUILD_FILE}"
|
296
|
+
|
297
|
+
# ignore error on docker operations and test execution
|
298
|
+
set +e
|
299
|
+
|
300
|
+
log_yellow "Preparing Docker image."
|
301
|
+
# We only download the docker image in CI builds.
|
302
|
+
if [[ "${RUNNING_IN_CI:-}" == "true" ]]; then
|
303
|
+
# Download the docker image specified by `TRAMPOLINE_IMAGE`
|
304
|
+
|
305
|
+
# We may want to add --max-concurrent-downloads flag.
|
306
|
+
|
307
|
+
log_yellow "Start pulling the Docker image: ${TRAMPOLINE_IMAGE}."
|
308
|
+
if docker pull "${TRAMPOLINE_IMAGE}"; then
|
309
|
+
log_green "Finished pulling the Docker image: ${TRAMPOLINE_IMAGE}."
|
310
|
+
has_image="true"
|
311
|
+
else
|
312
|
+
log_red "Failed pulling the Docker image: ${TRAMPOLINE_IMAGE}."
|
313
|
+
has_image="false"
|
314
|
+
fi
|
315
|
+
else
|
316
|
+
# For local run, check if we have the image.
|
317
|
+
if docker images "${TRAMPOLINE_IMAGE}" | grep "${TRAMPOLINE_IMAGE%:*}"; then
|
318
|
+
has_image="true"
|
319
|
+
else
|
320
|
+
has_image="false"
|
321
|
+
fi
|
322
|
+
fi
|
323
|
+
|
324
|
+
|
325
|
+
# The default user for a Docker container has uid 0 (root). To avoid
|
326
|
+
# creating root-owned files in the build directory we tell docker to
|
327
|
+
# use the current user ID.
|
328
|
+
user_uid="$(id -u)"
|
329
|
+
user_gid="$(id -g)"
|
330
|
+
user_name="$(id -un)"
|
331
|
+
|
332
|
+
# To allow docker in docker, we add the user to the docker group in
|
333
|
+
# the host os.
|
334
|
+
docker_gid=$(cut -d: -f3 < <(getent group docker))
|
335
|
+
|
336
|
+
update_cache="false"
|
337
|
+
if [[ "${TRAMPOLINE_DOCKERFILE:-none}" != "none" ]]; then
|
338
|
+
# Build the Docker image from the source.
|
339
|
+
context_dir=$(dirname "${TRAMPOLINE_DOCKERFILE}")
|
340
|
+
docker_build_flags=(
|
341
|
+
"-f" "${TRAMPOLINE_DOCKERFILE}"
|
342
|
+
"-t" "${TRAMPOLINE_IMAGE}"
|
343
|
+
"--build-arg" "UID=${user_uid}"
|
344
|
+
"--build-arg" "USERNAME=${user_name}"
|
345
|
+
)
|
346
|
+
if [[ "${has_image}" == "true" ]]; then
|
347
|
+
docker_build_flags+=("--cache-from" "${TRAMPOLINE_IMAGE}")
|
348
|
+
fi
|
349
|
+
|
350
|
+
log_yellow "Start building the docker image."
|
351
|
+
if [[ "${TRAMPOLINE_VERBOSE:-false}" == "true" ]]; then
|
352
|
+
echo "docker build" "${docker_build_flags[@]}" "${context_dir}"
|
353
|
+
fi
|
354
|
+
|
355
|
+
# ON CI systems, we want to suppress docker build logs, only
|
356
|
+
# output the logs when it fails.
|
357
|
+
if [[ "${RUNNING_IN_CI:-}" == "true" ]]; then
|
358
|
+
if docker build "${docker_build_flags[@]}" "${context_dir}" \
|
359
|
+
> "${tmpdir}/docker_build.log" 2>&1; then
|
360
|
+
if [[ "${TRAMPOLINE_VERBOSE:-}" == "true" ]]; then
|
361
|
+
cat "${tmpdir}/docker_build.log"
|
362
|
+
fi
|
363
|
+
|
364
|
+
log_green "Finished building the docker image."
|
365
|
+
update_cache="true"
|
366
|
+
else
|
367
|
+
log_red "Failed to build the Docker image, aborting."
|
368
|
+
log_yellow "Dumping the build logs:"
|
369
|
+
cat "${tmpdir}/docker_build.log"
|
370
|
+
exit 1
|
371
|
+
fi
|
372
|
+
else
|
373
|
+
if docker build "${docker_build_flags[@]}" "${context_dir}"; then
|
374
|
+
log_green "Finished building the docker image."
|
375
|
+
update_cache="true"
|
376
|
+
else
|
377
|
+
log_red "Failed to build the Docker image, aborting."
|
378
|
+
exit 1
|
379
|
+
fi
|
380
|
+
fi
|
381
|
+
else
|
382
|
+
if [[ "${has_image}" != "true" ]]; then
|
383
|
+
log_red "We do not have ${TRAMPOLINE_IMAGE} locally, aborting."
|
384
|
+
exit 1
|
385
|
+
fi
|
386
|
+
fi
|
387
|
+
|
388
|
+
# We use an array for the flags so they are easier to document.
|
389
|
+
docker_flags=(
|
390
|
+
# Remove the container after it exists.
|
391
|
+
"--rm"
|
392
|
+
|
393
|
+
# Use the host network.
|
394
|
+
"--network=host"
|
395
|
+
|
396
|
+
# Run in priviledged mode. We are not using docker for sandboxing or
|
397
|
+
# isolation, just for packaging our dev tools.
|
398
|
+
"--privileged"
|
399
|
+
|
400
|
+
# Run the docker script with the user id. Because the docker image gets to
|
401
|
+
# write in ${PWD} you typically want this to be your user id.
|
402
|
+
# To allow docker in docker, we need to use docker gid on the host.
|
403
|
+
"--user" "${user_uid}:${docker_gid}"
|
404
|
+
|
405
|
+
# Pass down the USER.
|
406
|
+
"--env" "USER=${user_name}"
|
407
|
+
|
408
|
+
# Mount the project directory inside the Docker container.
|
409
|
+
"--volume" "${PROJECT_ROOT}:${TRAMPOLINE_WORKSPACE}"
|
410
|
+
"--workdir" "${TRAMPOLINE_WORKSPACE}"
|
411
|
+
"--env" "PROJECT_ROOT=${TRAMPOLINE_WORKSPACE}"
|
412
|
+
|
413
|
+
# Mount the temporary home directory.
|
414
|
+
"--volume" "${tmphome}:/h"
|
415
|
+
"--env" "HOME=/h"
|
416
|
+
|
417
|
+
# Allow docker in docker.
|
418
|
+
"--volume" "/var/run/docker.sock:/var/run/docker.sock"
|
419
|
+
|
420
|
+
# Mount the /tmp so that docker in docker can mount the files
|
421
|
+
# there correctly.
|
422
|
+
"--volume" "/tmp:/tmp"
|
423
|
+
# Pass down the KOKORO_GFILE_DIR and KOKORO_KEYSTORE_DIR
|
424
|
+
# TODO(tmatsuo): This part is not portable.
|
425
|
+
"--env" "TRAMPOLINE_SECRET_DIR=/secrets"
|
426
|
+
"--volume" "${KOKORO_GFILE_DIR:-/dev/shm}:/secrets/gfile"
|
427
|
+
"--env" "KOKORO_GFILE_DIR=/secrets/gfile"
|
428
|
+
"--volume" "${KOKORO_KEYSTORE_DIR:-/dev/shm}:/secrets/keystore"
|
429
|
+
"--env" "KOKORO_KEYSTORE_DIR=/secrets/keystore"
|
430
|
+
)
|
431
|
+
|
432
|
+
# Add an option for nicer output if the build gets a tty.
|
433
|
+
if [[ -t 0 ]]; then
|
434
|
+
docker_flags+=("-it")
|
435
|
+
fi
|
436
|
+
|
437
|
+
# Passing down env vars
|
438
|
+
for e in "${pass_down_envvars[@]}"
|
439
|
+
do
|
440
|
+
if [[ -n "${!e:-}" ]]; then
|
441
|
+
docker_flags+=("--env" "${e}=${!e}")
|
442
|
+
fi
|
443
|
+
done
|
444
|
+
|
445
|
+
# If arguments are given, all arguments will become the commands run
|
446
|
+
# in the container, otherwise run TRAMPOLINE_BUILD_FILE.
|
447
|
+
if [[ $# -ge 1 ]]; then
|
448
|
+
log_yellow "Running the given commands '" "${@:1}" "' in the container."
|
449
|
+
readonly commands=("${@:1}")
|
450
|
+
if [[ "${TRAMPOLINE_VERBOSE:-}" == "true" ]]; then
|
451
|
+
echo docker run "${docker_flags[@]}" "${TRAMPOLINE_IMAGE}" "${commands[@]}"
|
452
|
+
fi
|
453
|
+
docker run "${docker_flags[@]}" "${TRAMPOLINE_IMAGE}" "${commands[@]}"
|
454
|
+
else
|
455
|
+
log_yellow "Running the tests in a Docker container."
|
456
|
+
docker_flags+=("--entrypoint=${TRAMPOLINE_BUILD_FILE}")
|
457
|
+
if [[ "${TRAMPOLINE_VERBOSE:-}" == "true" ]]; then
|
458
|
+
echo docker run "${docker_flags[@]}" "${TRAMPOLINE_IMAGE}"
|
459
|
+
fi
|
460
|
+
docker run "${docker_flags[@]}" "${TRAMPOLINE_IMAGE}"
|
461
|
+
fi
|
462
|
+
|
463
|
+
|
464
|
+
test_retval=$?
|
465
|
+
|
466
|
+
if [[ ${test_retval} -eq 0 ]]; then
|
467
|
+
log_green "Build finished with ${test_retval}"
|
468
|
+
else
|
469
|
+
log_red "Build finished with ${test_retval}"
|
470
|
+
fi
|
471
|
+
|
472
|
+
# Only upload it when the test passes.
|
473
|
+
if [[ "${update_cache}" == "true" ]] && \
|
474
|
+
[[ $test_retval == 0 ]] && \
|
475
|
+
[[ "${TRAMPOLINE_IMAGE_UPLOAD:-false}" == "true" ]]; then
|
476
|
+
log_yellow "Uploading the Docker image."
|
477
|
+
if docker push "${TRAMPOLINE_IMAGE}"; then
|
478
|
+
log_green "Finished uploading the Docker image."
|
479
|
+
else
|
480
|
+
log_red "Failed uploading the Docker image."
|
481
|
+
fi
|
482
|
+
# Call trampoline_after_upload_hook if it's defined.
|
483
|
+
if function_exists trampoline_after_upload_hook; then
|
484
|
+
trampoline_after_upload_hook
|
485
|
+
fi
|
486
|
+
|
487
|
+
fi
|
488
|
+
|
489
|
+
exit "${test_retval}"
|