如何在 gitlab-ci.yml 文件中通过 ssh 设置变量值

Posted

技术标签:

【中文标题】如何在 gitlab-ci.yml 文件中通过 ssh 设置变量值【英文标题】:How to set variable value over ssh in gitlab-ci.yml file 【发布时间】:2021-11-13 20:54:48 【问题描述】:

我正在尝试为我的 GitLab Runner 设置一个环境变量,我使用 ssh 命令检索该值。我厌倦了在workflow 中设置变量,如下所示。问题是ssh命令没有执行,被当作字符串处理。

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: always
      variables:
        TABLE_STATUS: ssh gitlab-runner@$TARGET_HOST "source $DRIVE_PATH/config/.config && mysql -u $USER -p$PASSWORD -e \"SELECT IF(MONTH(datetime) = MONTH(NOW()), IF(status = 1, 'TRUE', 'FALSE'), 'FALSE') FROM schema.table WHERE table_name = 'tbl_name';\" "
        BRANCH: prod
        DRIVE_PATH: /path/to/prod
    - when: always

ssh 命令在脚本中工作,但我不知道如何在脚本之前将值分配给变量。

【问题讨论】:

【参考方案1】:

在你的变量中直接使用字符串命令确实有可能导致……一个字符串值。

执行命令应该涉及到seen here,子shell命令$(xxx)

在您的情况下,来自your comment,使用before_script directive:

before_script:
   TABLE_STATUS=$(ssh gitlab-runner@$TARGET_HOST "source $DRIVE_PATH/config/.config && mysql ...)

【讨论】:

使用: 也会产生一个字符串。我将其更改为TABLE_STATUS=$(ssh ...,并将其从workflow 移至before_script。现在应该可以了。我接受这个答案,因为您发布的链接正是我想要的。 @luigigi 好的。我已经相应地修改了答案。

以上是关于如何在 gitlab-ci.yml 文件中通过 ssh 设置变量值的主要内容,如果未能解决你的问题,请参考以下文章

如何让 gitlab-runner 从指定文件中读取而不是 .gitlab-ci.yml?

如何创建一个工件,以便它可以在 .gitlab-ci.yml 中下载

如何使用 gitlab-ci.yml 在 gitlab 中更新 JSON 文件的内容?

如何在gitlab-ci.yml中将文件从存储库复制到用于作业的docker容器中

如何从 .net 项目文件中获取 gitlab-ci.yml 文件中的项目版本?

如何排除 gitlab-ci.yml 更改触发作业