无法在 gitlab ci yaml 文件中的作业之间共享全局变量值



我正在尝试使用GitLab CI.构建一个应用程序

生成的文件的名称取决于时间,以这种格式

DEV_APP_yyyyMMddhhmm

(例如:DEV_APP_201810221340,对应于今天的日期2018/10/22 13h40)。

如何将此名称存储在.gitlab-ci.yml文件内的全局变量中?

这是我的.gitlab-ci.yml文件:

image: docker:latest
image: docker:latest
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
SPRING_PROFILES_ACTIVE: gitlab-ci
#   TIME: ""
#  BRANCH: ""
#  REC_BUILD_NAME: ""
TIME: "timex"
BRANCH: "branchx"
DEV_BUILD_NAME: "DEV_APP_x"
stages:
- preparation
- build
- package
- deploy
- manual_rec_build
- manual_rec_package
job_preparation:
stage: preparation
script:
- echo ${TIME}
- export TIME=$(date +%Y%m%d%H%M)
- "BRANCH=$(echo $CI_BUILD_REF_SLUG | sed 's/[^[[:alnum:]]/_/g')"
- "DEV_BUILD_NAME=DEV_APP_${BRANCH}_${TIME}"
- echo ${TIME}
maven-build:
image: maven:3-jdk-8
stage: build
script:
- echo ${TIME}
- "mvn package -B"
artifacts:
paths:
- target/*.jar
only:
- merge-requests
- /^feature/sprint.*$/
- /^DEV_.*$/
#  when: manual

docker-build:
stage: package
script:
- echo ${TIME}
- docker build -t registry.gitlab.com/mourad.sellam/actuator-simple .
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
- docker push registry.gitlab.com/mourad.sellam/actuator-simple
only:
- merge-requests
- /^feature/sprint.*$/
- /^DEV_.*$/
when: manual
k8s-deploy-production:
image: google/cloud-sdk
stage: deploy
script:
- echo ${TIME}
- echo "$GOOGLE_KEY" > key.json
- gcloud auth activate-service-account --key-file key.json
- gcloud config set compute/zone europe-west1-c
- gcloud config set project actuator-sample
- gcloud config set container/use_client_certificate True
- gcloud container clusters get-credentials actuator-example
- kubectl delete secret registry.gitlab.com
- kubectl create secret docker-registry registry.gitlab.com --docker-server=https://registry.gitlab.com --docker-username=myUserName--docker-password=$REGISTRY_PASSWD --docker-email=myEmail@gmail.com
- kubectl apply -f deployment.yml --namespace=production
environment:
name: production
url: https://example.production.com
when: manual
job_manual_rec_build:
image: maven:3-jdk-8
stage: manual_rec_build
script:
- echo ${TIME}
- "mvn package -B"
artifacts:
paths:
- target/*.jar
when: manual
#   allow_failure: false
job_manual_rec_package:
stage: manual_rec_package
variables:
script:
- echo ${TIME}
- echo ${DEV_BUILD_NAME}
- docker build -t registry.gitlab.com/mourad.sellam/actuator-simple:${DEV_BUILD_NAME} .
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
- docker push registry.gitlab.com/mourad.sellam/actuator-simple
artifacts:
paths:
- target/*.jar
when: on_success
#test 1

当我呼叫时

echo ${TIME}

它显示";timex";。

回波故障

你能告诉我如何存储全局变量并在每个作业中设置它吗?

检查GitLab 13.0(2020年5月)是否对您的情况有所帮助:

从其他作业继承环境变量

现在可以在CI作业之间传递环境变量(或其他数据)

通过使用dependencies关键字(或DAG管道的needs关键字),如果其他作业的变量来源于dotenv报表工件,则作业可以继承这些变量。

与工件或传递文件相比,这提供了一种更优雅的方法来更新作业之间的变量。

请参阅文档和问题。

您可以从从属作业继承环境变量。

此功能利用artifacts:reports:dotenv报告功能。

带有dependencies关键字的示例。

build:
stage: build
script:
- echo "BUILD_VERSION=hello" >> build.env
artifacts:
reports:
dotenv: build.env
deploy:
stage: deploy
script:
- echo $BUILD_VERSION # => hello
dependencies:
- build

带有needs关键字的示例:

build:
stage: build
script:
- echo "BUILD_VERSION=hello" >> build.env
artifacts:
reports:
dotenv: build.env
deploy:
stage: deploy
script:
- echo $BUILD_VERSION # => hello
needs:
- job: build
artifacts: true

您可以使用工件在作业之间传递数据。以下是Flant的示例,用于检查以前的管道手动决策:

approve:
script:
- mkdir -p .ci_status
- echo $(date +%s) > .ci_status/approved
artifacts:
paths:
- .ci_status/
NOT approve:
script:
- mkdir -p .ci_status
- echo $(date +%s) > .ci_status/not_approved
artifacts:
paths:
- .ci_status/
deploy to production:
script:
- if [[ $(cat .ci_status/not_approved) > $(cat .ci_status/approved) ]]; then echo "Need approve from release engineer!"; exit 1; fi
- echo "deploy to production!"

Gitlab CE上存在一个开放问题47517"在作业之间传递变量"。。

CI/CD通常需要将信息从一个作业传递到另一个作业,并且工件可以用于此,尽管这是一个繁重的解决方案意想不到的副作用。工作空间是另一个通过的建议作业之间的文件。但有时你根本不想传递文件,只是一小部分数据。

我也遇到过同样的问题,解决方法是将数据存储在文件中,然后在其他作业中访问它。。

你可以。。。。我的做法:

您可以向项目发送POST请求以保存变量:

export VARIABLE=secret
curl --request POST --header "PRIVATE-TOKEN: $CI_ACCESS_TOKEN" "https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/variables/" --form "key=VARIABLE" --form "value=$VARIABLE"

在完成工作/触发后进行清理

curl --request DELETE --header "PRIVATE-TOKEN: $CI_ACCESS_TOKEN" "https://gitlab.seznam.net/api/v4/projects/$CI_PROJECT_ID/variables/VARIABLE"

我不确定它是否应该这样使用,但它确实奏效了。您可以为以下所有作业访问该变量(特别是当您在该作业中使用triggerscript时,这不是一个选项。)

只是请确保,即使前一次失败,你也会运行清理作业。。。

相关内容

  • 没有找到相关文章

最新更新