使用自定义网址在gitlab-ci中定义环境

时间:2019-02-13 17:48:23

标签: 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:
    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的操作窗格的环境页面中,我希望能够为我选择“打开实时环境”选项,以可视化.sh文件生成的url。如何实现?

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

或者,如果“ testScript.sh”文件是要创建一个包含url的文本文件,那么我如何指示部署阶段从文本文件中读取并使用其内容来定义一个变量,然后使用该变量在网址字段中?


我尝试过的事情:

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

stages:
 - build
 - deploy

d_build:
  stage: build
  tags:
    - my-runner
  script:
    - echo "Build"
    - sh testScript.sh
  variables:
    url_endpoint: "myendpoint"

按如下所示修改网址:

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

但是,这不起作用,最终的URL中有一个空格,而不是“ myendpoint”,这告诉我在变量如何传播方面我也缺少一些东西。将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

  

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

https://docs.gitlab.com/ee/ci/yaml/README.html#environmenturl

您可以使用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"

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

答案 1 :(得分:0)

GitLab中的变量不会在作业之间传递。仍然有更多人要求这样做:

https://gitlab.com/gitlab-org/gitlab-ce/issues/47517

我自己尚未在GitLab中使用环境,但是从此链接来看,它看起来像环境:url在您可以使用的功能方面非常有限:

https://docs.gitlab.com/ce/ci/yaml/#environmenturl

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

https://docs.gitlab.com/ee/ci/triggers/#triggering-a-pipeline

它们具有某些功能,如果您是付费客户,这些功能将变得更容易,但是我认为无论如何都应该可以实现您想要的。您可以在d_build作业中使用类似的内容:

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

您将必须获得访问令牌:

https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html

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

https://docs.gitlab.com/ce/ci/variables/#variables

您的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”和“ except”关键字,以便在按下时仅运行构建作业,并且仅在设置此变量时才运行d_review,该变量仅在触发该作业时才存在。 / p>

我还没有测试过,但是我希望它能为您提供一些帮助。我真的希望有一个更简单的解决方案!