使用自定义url在gitlab ci中定义环境 当前配置:

使用自定义url在gitlab ci中定义环境 当前配置:,gitlab,sh,gitlab-ci,gitlab-ci-runner,Gitlab,Sh,Gitlab Ci,Gitlab Ci Runner,我正在与gitlab ci合作。我目前在gitlab-ci.yml文件中有两个阶段,一个用于构建,一个用于部署。作业正在成功运行 gitlab ci.yml stages: - build - deploy d_build: stage: build tags: - my-runner script: - echo "Build" - sh testScript.sh d_review: stage: deploy environment:

我正在与gitlab ci合作。我目前在gitlab-ci.yml文件中有两个阶段,一个用于构建,一个用于部署。作业正在成功运行

gitlab ci.yml

stages:
 - build
 - deploy

d_build:
  stage: build
  tags:
    - my-runner
  script:
    - echo "Build"
    - sh testScript.sh
d_review:
  stage: deploy
  environment:
    name: staging
    url: (INSERT URL HERE)
  tags:
    - my-runner
  script:
    - echo "Foo"
Gitlab Runner Vesion:11.7.0

操作系统:windows/amd64


期望的行为: 在部署阶段,testScript.sh shell文件正在生成一个我希望在环境的url字段中使用的url

在gitlab的操作窗格的环境页面中,我希望能够选择“Open live environment”选项,以可视化由.sh文件生成的url。如何做到这一点

我想到了两种可能的方法,但我不确定如何实现这两种方法。是否可以从“testScript.sh”在构建阶段设置环境变量,以便在部署阶段获取它

或者,如果“testScript.sh”文件要创建一个包含url的文本文件,我如何指示deploy阶段从文本文件中读取并使用其内容为其定义一个变量,然后在url字段中使用


我尝试的是: 作为测试,我尝试在构建阶段的变量中设置一个变量:

stages:
 - build
 - deploy

d_build:
  stage: build
  tags:
    - my-runner
  script:
    - echo "Build"
    - sh testScript.sh
  variables:
    url_endpoint: "myendpoint"
按如下方式修改url:

d_review:
  stage: deploy
  environment:
    name: staging
    url: https://localhost:1234&endpoint=$url_endpoint
  tags:
    - my-runner
  script:
    - echo "Foo"

然而,这并没有起作用,在最终的url中有一个空白而不是“myendpoint”,这告诉我在变量如何传播方面也遗漏了一些东西。如果您有任何建议,我们将不胜感激。

在运行作业时,必须设置url。在部署之前,不能在作业中设置环境url:

url参数可以使用任何已定义的CI变量,包括预定义的, 安全变量和.gitlab-ci.yml变量。但是,您不能使用变量 在脚本下定义

您可以使用javascript重定向作为解决方法:

d_build:
  stage: build
  tags:
    - my-runner
  script:
    - echo "Build"
    - UUID=$(sh testScript.sh)
    - echo '<html><head><script type="text/javascript">window.location.replace("https://localhost:5939/mywebpage/index.html?id='$UUID'");</script></head></html>' > redirect.html

d_review:
  stage: deploy
  environment:
    name: staging
    url: https://localhost:5939/mywebpage/redirect.html
  tags:
    - my-runner
  script:
    - echo "Foo"
d_构建:
阶段:建造
标签:
-我的跑步者
脚本:
-回声“构建”
-UUID=$(sh testScript.sh)
-“echo”窗口。位置。替换(“https://localhost:5939/mywebpage/index.html?id=“$UUID'”;”>重定向.html
d_审查:
阶段:部署
环境:
名称:登台
网址:https://localhost:5939/mywebpage/redirect.html
标签:
-我的跑步者
脚本:
-回声“Foo”

这将创建一个
redirect.html
,它使用
testScript.sh
创建的参数重定向到本地主机url。如果由于字符转义而导致
redirect.html
的创建失败,请尝试将以
echo
开头的行放入sh脚本中。

GitLab中的变量不会在作业之间传递。但是,有更多的人要求是否可以做到这一点:

我自己还没有在GitLab中使用过环境,但从这个链接来看,环境:url在您可以使用它做的事情方面非常有限:

应该可以使用API从构建作业手动触发新管道:

curl -X POST \
-H "Content-Type: application/json" \
-d '{"token":"token", "ref":"my-branch", "variables": {"url_endpoint": "myendpoint"}}' \
 https://gitlab.com/api/v4/projects/:iid/trigger/pipeline

如果你是一个付费客户,他们的一些功能会让你变得更容易,但我认为无论如何都应该可以实现你想要的。您可以从d_构建作业中使用类似的内容:

curl -X POST \
-H "Content-Type: application/json" \
-d '{"token":"token", "ref":"my-branch", "variables": {"url_endpoint": "myendpoint"}}' \
 https://gitlab.com/api/v4/projects/:iid/trigger/pipeline
您必须获得访问令牌:

您可以使用变量或受保护变量将其发送到GitLab脚本:

然后,您的gitlab ci文件将类似于:

stages:
 - build
 - deploy

d_build:
  stage: build
  tags:
    - my-runner
  script:
    - echo "Build"
    - sh testScript.sh
    - [curl script here]
except:
  variables:
    - $url_endpoint

d_review:
  stage: deploy
  environment:
    name: staging
    url: $url_endpoint
  tags:
    - my-runner
  script:
    - echo "Foo"
  only:
    variables:
      - $url_endpoint
“only”和“Exception”关键字应使其在推送时仅运行生成作业,而d_review仅在设置此变量时运行,该变量应仅在触发作业时出现


我还没有测试过这个,但我希望它能给你一些可以使用的东西。我真的希望有一个更简单的解决方案,这

谢谢你的回答,我试过你的建议了。使用curl请求正确触发部署阶段,但是当我尝试在脚本中
echo$url\u endpoint
时,它没有打印出来,这意味着变量没有正确传播。在environment部分中显示的网页也不正确。从注释中可以看出,无论何时触发构建,gitlab都会解析当前在
.gitlab ci.yml
中设置的内容。每当运行
d_review
时,Gitlab不会再次解析
.Gitlab ci.yml
。这意味着,
$url\u endpoint
从一开始就是空的,并且在此管道中保持为空。更糟糕的是:在下一个版本中,
$url\u endpoint
具有上一个版本的值。@Berta先生,请帮助我解决同样的问题,请检查一次链接。请详细说明.sh脚本可以生成什么类型的url和多少不同的url。@mles.sh脚本只生成一个url。url的静态部分类似于
https://localhost:5939/mywebpage/index.html?id=
,动态部分跟随静态部分,由字母数字字符组成。有关更多信息,请参阅我的更新答案suggestion@Paolo请帮我解决同样的问题,请检查一下链接谢谢,这是一个非常聪明的解决方案。我想用Node.js做类似的事情,但实际上更简单。您知道如何使用此方法打开驱动器上的文件吗?例如,将环境中的url设置为
file:///H:/Documents/myfolder/redirect.html
?@mles,你能帮我解决同样的问题吗?请检查链接:-