我们如何在 gitlab-ci.yml 中使用“变量”关键字?

Posted

技术标签:

【中文标题】我们如何在 gitlab-ci.yml 中使用“变量”关键字?【英文标题】:How do we use the 'variables' keyword in gitlab-ci.yml? 【发布时间】:2015-10-28 22:59:59 【问题描述】:

我正在尝试使用 Gitlab CI 文档中记录的 variables: 关键字:

发件人:https://docs.gitlab.com/ce/ci/yaml/README.html

变量

此功能需要 gitlab-runner 版本等于或大于 0.5.0.

GitLab CI 允许您将设置的变量添加到 .gitlab-ci.yml 在构建环境中。变量存储在存储库中,并且是 旨在存储非敏感项目配置,即。 RAILS_ENV 或 DATABASE_URL。

variables:   
  DATABASE_URL: "postgres://postgres@postgres/my_database"

这些变量以后可以在所有执行的命令中使用,并且 脚本。

YAML 定义的变量也设置为所有创建的服务 容器,从而允许对其进行微调。

当我尝试使用它时,我的构建没有运行任何阶段并且无论如何都标记为成功,这是 YAML 错误的好兆头。我将我的 gitlab-ci.yml 内容粘贴到设置区域的 LINT 工具中,输出错误为:

状态:语法不正确

错误:变量作业:未知参数 PACKAGE_NAME

我使用与文档相同的 YAML 语法,但它不起作用。我找不到与此相关的任何未解决的错误。以下是我当前的版本和我的 gitlab-ci.yml 的净化版本。

Gitlab 版本:7.13.2 Omnibus

Gitlab Runner 版本:0.5.2

gitlab-ci.yml(已消毒)

types:
  - test
  - build

variables:
  PACKAGE_NAME: "awesome-django-app"
  PACKAGE_SUMMARY: "Awesome webapp backend."
  MAJOR_RELEASE: "1"
  MINOR_RELEASE: "0"
  PATCH_LEVEL: "0dev"
  DEV_DB_URL: "db"
  DEV_SERVER: "pydev.example.com"
  PROD_SERVER: "pyprod.example.com"
  TEST_SERVER: "pytest.example.com"

envtest:
  type: test
  script:
  - ". ./testbuild.sh"
  tags:
  - python2.7
  - postgres
  - linux
  except:
  - tags

buildrpm:
  type: build
  script:
  - mkdir -p ~/rpmbuild/SOURCES
  - mkdir -p ~/rpmbuild/SPECS
  - mkdir -p ~/tarbuild/$PACKAGE_NAME-$MAJOR_RELEASE.$MINOR_RELEASE.$PATCH_LEVEL
  - cp $PACKAGE_NAME.spec ~/rpmbuild/SPECS/.
  - cp -r * ~/tarbuild/$PACKAGE_NAME-$MAJOR_RELEASE.$MINOR_RELEASE.$PATCH_LEVEL/.
  - cd ~/tarbuild
  - tar -zcf ~/rpmbuild/SOURCES/$PACKAGE_NAME-$MAJOR_RELEASE.$MINOR_RELEASE.$PATCH_LEVEL.tar.gz *
  - cd ~
  - rm -Rf ~/tarbuild
  - rpmlint -i ~/rpmbuild/SPECS/$PACKAGE_NAME.spec
  - echo $CI_BUILD_ID
  - 'rpmbuild -ba ~/rpmbuild/SPECS/$PACKAGE_NAME.spec \
                    --define="_build_number $CI_BUILD_ID" \
                    --define="_python_version_min 2.7" \
                    --define="_version $MAJOR_RELEASE.$MINOR_RELEASE.$PATCH_LEVEL" \
                    --define="_package_name $PACKAGE_NAME" \
                    --define="_summary $SUMMARY"'
  - scp rpmbuild/RPMS/noarch/$PACKAGE_NAME-$MAJOR_RELEASE.$MINOR_RELEASE.$PATCH_LEVEL-$CI_BUILD_ID.noarch.rpm $DEV_SERVER:~/.
  tags:
  - python2.7
  - postgres
  - linux
  - rpm
  except:
  - tags

问题:

如何正确使用这个值?

其他信息:

从 YAML 文件中删除此部分会导致一切正常,因此文件的其余部分正常工作。 (当然未定义的变量会导致脚本错误...)

即使只是将用于测试的变量减少到 PACKAGE_NAME 也会导致相同的中断。

【问题讨论】:

【参考方案1】:

原来的答案不再正确。

原始文档现在存在,现在还有更多方法。变量可以从 GUI、API 中创建,也可以在 .gitlab-ci.yml 中定义。

https://docs.gitlab.com/ce/ci/variables/README.html

【讨论】:

【参考方案2】:

虽然它在文档中,但我不认为变量包含在最新版本的 gitlab (7.13) 中。从 yaml 文件中读取变量的功能是由 commit by ayufan 9 天前引入的。

看看the parser on the 7.13 stable branch,你可以看到他的贡献没有进入。所以假设你在7.13或更早,恐怕我们不走运。由于它在 master 上,我相当肯定我们会在下一个版本中看到它。在那之前,我们可以使用猴子补丁,如果您直接使用源代码,请执行 git pull,或者在下一个版本之前只依赖项目变量。

【讨论】:

出色的调查,我错过了。我真的很想知道为什么它进入了文档而不是解析器。无论如何,我通过在我的构建脚本中为该作业定义变量来解决它,它创建了许多具有多个作业的冗余变量定义,但现在可以使用。

以上是关于我们如何在 gitlab-ci.yml 中使用“变量”关键字?的主要内容,如果未能解决你的问题,请参考以下文章

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

无法从 gitlab-ci.yml 推送

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

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

如何在 .gitlab-ci.yml 中指定通配符工件子目录?

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