我知道有秘密变量,我尝试将秘密传递给bash脚本。
在具有#!/bin/bash -x
的bash脚本上使用时,使用docker login命令时可以以明文形式看到密码:
docker login "$USERNAME" "$PASSWORD" $CONTAINERREGISTRY
有没有办法安全地登录gitlab-ci中的容器注册表?
答案 0 :(得分:2)
如果需要多个认证,则可以在before_script
文件的开头或每个作业内部使用gitlab-ci.yml
:
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin
其中$CI_REGISTRY_USER
和CI_REGISTRY_PASSWORD
是秘密变量。
在每个脚本之后或在整个文件的开头:
after_script:
- docker logout
我写了一个关于使用Gitlab CI和Docker构建docker映像的答案: https://stackoverflow.com/a/50684269/8247069
答案 1 :(得分:1)
GitLab在运行作业时提供一系列环境变量。您需要熟悉并在开发(运行测试版本等)时使用它们,这样您就不需要做任何事情,只需在GitLab中相应地设置CI / CD变量(例如ENV)即可,而Gitlab将提供大部分功能你想要的。参见GitLab Environment variables。
只需稍稍调整一下以前的建议(将GitLab建议与此结合)。
有关在何处/如何使用before_script和after_script的更多信息,请参见.gitlab-ci-yml Configuration parameters。我倾向于将登录命令作为最后的命令之一放在我的主before_script中(不在阶段中),而将注销退出到最终命令中。 “ after_script”。
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login "$CI_REGISTRY" -u "$CI_REGISTRY_USER" --password-stdin;
然后继续下载.gitlab-ci.yml ...
after_script:
- docker logout;
对于我的本地开发,我创建一个遵循通用约定的.env文件,然后以下bash代码段将检查该文件是否存在并将这些值导入到您的shell中。为了使我的项目安全和友好,.env
被忽略,但是我维护了一个带有安全示例值的.env.sample,并且我确实将其包括在内。
if [ -f .env ]; then printf "\n\n::Sourcing .env\n" && set -o allexport; source .env; set +o allexport; fi
这是一个最完整的示例:
image: docker:19.03.9-dind
stages:
- buildAndPublish
variables:
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_DRIVER: overlay2
services:
- docker:19.03.9-dind
before_script:
- printf "::GitLab ${CI_BUILD_STAGE} stage starting for ${CI_PROJECT_URL}\n";
- printf "::JobUrl=${CI_JOB_URL}\n";
- printf "::CommitRef=${CI_COMMIT_REF_NAME}\n";
- printf "::CommitMessage=${CI_COMMIT_MESSAGE}\n\n";
- printf "::PWD=${PWD}\n\n";
- echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin;
build-and-publish:
stage: buildAndPublish
script:
- buildImage;
- publishImage;
rules:
- if: '$CI_COMMIT_REF_NAME == "master"' # Run for master, but not otherwise
when: always
- when: never
after_script:
- docker logout registry.gitlab.com;