GITLAB-CI 预定义在部署阶段的脚本步骤中定义,但在通过 'bash -s' 运行的 Bash 脚本中未定义



我正在尝试部署默认(主)分支以外的分支。由于某些原因,预定义的变量在roll-out.sh脚本中不可见。但是在调用脚本之前的echo语句确实正确地打印了变量。

我有另一个滚出主分支的脚本。在这个脚本中,它能够运行docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY没有问题。

我已经尝试了保护和不保护的分支。由于某些原因,变量仍然是未定义的。我哪里做错了?

build:
stage: build
image: docker:20.10.12
services:
- docker:20.10-dind
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH # not master branch
allow_failure: true
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- docker pull $CI_REGISTRY_IMAGE/client/base:latest || true
- docker build --cache-from $CI_REGISTRY_IMAGE/client/base:latest --cache-from $CI_REGISTRY_IMAGE/client:latest -t $CI_REGISTRY_IMAGE/client:$CI_COMMIT_BRANCH .
- docker push $CI_REGISTRY_IMAGE/client:$CI_COMMIT_BRANCH
deploy:
variables:
branch: $CI_COMMIT_BRANCH
stage: deploy
image: alpine
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH # not master branch
before_script:
- apk add openssh-client
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
script:
- echo $CI_COMMIT_REF_NAME
- echo $CI_COMMIT_BRANCH
- echo $branch
- ssh -o StrictHostKeyChecking=no $SERVER_USER@$DOMAIN 'bash -s' < ./script/roll_out.sh

如果你在ci脚本中发送到另一台机器,我认为它不会访问你在之前的行中回显的变量,因为它是在另一台机器上的新会话。

你可以尝试一些不同的事情来实现你想要的;

  1. 尝试将变量作为参数发送(通过ssh向机器发送信息不是很好)

  2. 在你试图ssh到的主机上安装一个gitlab运行器,标记这个运行器,这样它只运行特定的部署作业,然后你将在主机上有可用的变量。

通过显式地将环境变量传递给脚本

解决了这个问题- ssh -o StrictHostKeyChecking=no $SERVER_USER@$DOMAIN "CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH bash -s" < ./script/roll_out_tagged.sh

我有另一个经验丰富的开发人员来看看。他不知道docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY为什么会起作用。这就是为什么我相信所有的环境变量在远程上都是可用的。但似乎这三个变量是某种例外。

最新更新