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.
Files changed (78) hide show
  1. checksums.yaml +5 -5
  2. data/.github/CODEOWNERS +7 -0
  3. data/.github/CONTRIBUTING.md +74 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
  6. data/.github/ISSUE_TEMPLATE/support_request.md +7 -0
  7. data/.github/renovate.json +6 -0
  8. data/.github/sync-repo-settings.yaml +18 -0
  9. data/.github/workflows/ci.yml +55 -0
  10. data/.github/workflows/release-please.yml +39 -0
  11. data/.gitignore +3 -0
  12. data/.kokoro/populate-secrets.sh +76 -0
  13. data/.kokoro/release.cfg +52 -0
  14. data/.kokoro/release.sh +18 -0
  15. data/.kokoro/trampoline_v2.sh +489 -0
  16. data/.repo-metadata.json +5 -0
  17. data/.rubocop.yml +17 -0
  18. data/.toys/.toys.rb +45 -0
  19. data/.toys/ci.rb +43 -0
  20. data/.toys/kokoro/.toys.rb +66 -0
  21. data/.toys/kokoro/publish-docs.rb +67 -0
  22. data/.toys/kokoro/publish-gem.rb +53 -0
  23. data/.toys/linkinator.rb +43 -0
  24. data/.trampolinerc +48 -0
  25. data/CHANGELOG.md +199 -0
  26. data/CODE_OF_CONDUCT.md +43 -0
  27. data/Gemfile +22 -1
  28. data/{COPYING → LICENSE} +0 -0
  29. data/README.md +140 -17
  30. data/googleauth.gemspec +28 -28
  31. data/integration/helper.rb +31 -0
  32. data/integration/id_tokens/key_source_test.rb +74 -0
  33. data/lib/googleauth.rb +7 -37
  34. data/lib/googleauth/application_default.rb +81 -0
  35. data/lib/googleauth/client_id.rb +104 -0
  36. data/lib/googleauth/compute_engine.rb +73 -26
  37. data/lib/googleauth/credentials.rb +561 -0
  38. data/lib/googleauth/credentials_loader.rb +207 -0
  39. data/lib/googleauth/default_credentials.rb +93 -0
  40. data/lib/googleauth/iam.rb +75 -0
  41. data/lib/googleauth/id_tokens.rb +233 -0
  42. data/lib/googleauth/id_tokens/errors.rb +71 -0
  43. data/lib/googleauth/id_tokens/key_sources.rb +396 -0
  44. data/lib/googleauth/id_tokens/verifier.rb +142 -0
  45. data/lib/googleauth/json_key_reader.rb +50 -0
  46. data/lib/googleauth/scope_util.rb +61 -0
  47. data/lib/googleauth/service_account.rb +177 -67
  48. data/lib/googleauth/signet.rb +69 -8
  49. data/lib/googleauth/stores/file_token_store.rb +65 -0
  50. data/lib/googleauth/stores/redis_token_store.rb +96 -0
  51. data/lib/googleauth/token_store.rb +69 -0
  52. data/lib/googleauth/user_authorizer.rb +285 -0
  53. data/lib/googleauth/user_refresh.rb +129 -0
  54. data/lib/googleauth/version.rb +1 -1
  55. data/lib/googleauth/web_user_authorizer.rb +295 -0
  56. data/spec/googleauth/apply_auth_examples.rb +96 -94
  57. data/spec/googleauth/client_id_spec.rb +160 -0
  58. data/spec/googleauth/compute_engine_spec.rb +125 -55
  59. data/spec/googleauth/credentials_spec.rb +600 -0
  60. data/spec/googleauth/get_application_default_spec.rb +232 -80
  61. data/spec/googleauth/iam_spec.rb +80 -0
  62. data/spec/googleauth/scope_util_spec.rb +77 -0
  63. data/spec/googleauth/service_account_spec.rb +422 -68
  64. data/spec/googleauth/signet_spec.rb +101 -25
  65. data/spec/googleauth/stores/file_token_store_spec.rb +57 -0
  66. data/spec/googleauth/stores/redis_token_store_spec.rb +50 -0
  67. data/spec/googleauth/stores/store_examples.rb +58 -0
  68. data/spec/googleauth/user_authorizer_spec.rb +343 -0
  69. data/spec/googleauth/user_refresh_spec.rb +359 -0
  70. data/spec/googleauth/web_user_authorizer_spec.rb +172 -0
  71. data/spec/spec_helper.rb +51 -10
  72. data/test/helper.rb +33 -0
  73. data/test/id_tokens/key_sources_test.rb +240 -0
  74. data/test/id_tokens/verifier_test.rb +269 -0
  75. metadata +114 -75
  76. data/.travis.yml +0 -18
  77. data/CONTRIBUTING.md +0 -32
  78. 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}"