通过bash命令设置gitlab-ci.yml变量

时间:2018-02-28 10:01:46

标签: bash gitlab-ci

variables:
  CUSTOM_NODE_VERSION: '$${cat .nvmrc}'

我希望通过CUSTOM_NODE_VERSION文件(位于项目根目录中)的内容填充变量.nvmrc。如何在gitlab-ci.yml文件中执行此操作?

上面的例子不起作用。我还尝试过以下方法:

  • CUSTOM_NODE_VERSION: $(cat .nvmrc) - > (cat .nvmrc)
  • CUSTOM_NODE_VERSION: "$(cat .nvmrc)" - > (cat .nvmrc)
  • CUSTOM_NODE_VERSION: '$(cat .nvmrc)' - > (cat .nvmrc)
  • CUSTOM_NODE_VERSION: ${cat .nvmrc} - > (空字符串)
  • CUSTOM_NODE_VERSION: '${cat .nvmrc}' - > (空字符串)
  • CUSTOM_NODE_VERSION: "${cat .nvmrc}" - > (空字符串)

如果我把它放在before_script中,如下所示:

before_script:
  - CUSTOM_NODE_VERSION=$(cat .nvmrc)

但是gitlab-ci.yml文件的以下部分无法访问它:

lint:
  stage: Test
  image: node:$CUSTOM_NODE_VERSION

2 个答案:

答案 0 :(得分:4)

.gitlab-ci.yml的某些部分可以使用变量,有些部分则不可用。

在Gitlab本身解析.yml文件,然后由跑步者执行命令。因此,此时无法设置作业配置中使用的变量。您可以使用预定义的秘密变量,但这似乎无法满足您的需求。

有些问题需要跟踪文档中您可以做什么和不能做什么:

答案 1 :(得分:1)

我还想在 .gitlab-ci.yml 文件中使用版本字符串,但要将其附加到 Docker 映像名称。我是这样做的:

build:
  stage: build_images
  script:
    - API_VERSION=v$(grep -E -o "(version = )(.*)" pyproject.toml | cut -d\" -f2)
    - echo $API_VERSION
    # Build and push new images for staging.
    - docker pull $API_STAGING:latest
    - docker build --cache-from $API_STAGING:latest >-
        -t $API_STAGING:latest >-
        -t $API_STAGING:$CI_COMMIT_SHORT_SHA >-
        -t $API_STAGING:$API_VERSION >-
        -f dockerfiles/Dockerfile.staging .
    - docker push $API_STAGING
  tags:
    - build

这里的关键行是 API_VERSION=v$(grep -E -o "(version = )(.*)" pyproject.toml | cut -d\" -f2)

说明:我试图在 pyproject.toml 中读取的字符串类似于 version = "0.17.1",而我想要的结果是 v0.17.1

  • v 只是一个字符串,我想添加到我的版本号中
  • -E (--extended-regexp) 调用 grep 作为 egrep;允许使用特殊的正则表达式字符
  • -o (--only-matching) 对我的用例没有影响,但在其他情况下可能会有所帮助(我不确定)
  • (version = )(.*):两个捕获组;后者捕获等号后空格后的任何内容
  • 只运行 $ grep -E -o "(version = )(.*)" pyproject.toml 将导致 version = "0.1.0",所以我没有使用捕获组;相反,我使用的是 cut
  • cut“剪切[s] 出文件每一行的选定部分”
  • -d\" 将分隔符设置为双引号而不是默认值(制表符)
  • -f2 指定要返回的字段;值 1 将返回第一个引号之前的所有内容,即 version = ,因此 2 返回第二个引号之前和第一个引号之后的所有内容,并且在此示例中 3 不返回任何内容,因为没有第三个双引号分隔字段
  • echo $API_VERSION 只是为了看看它是否有效