仅在向主发出合并请求时运行gitlab-ci.yml

one*_*men 5 heroku node.js gitlab gitlab-ci

我目前在GitLabHeroku中有我的项目。我想做的是,一旦我请求与功能分支的合并请求(我们称之为crud-on-spaghetti),我想在该分支上自动运行测试(npm test基本上是使用Mocha / Chai),在测试成功后,将其crud-on-spaghettimaster,将其提交并推送至origin/master(在GitLab上是远程的),然后提交git push heroku master(基本上将其推送至存储我的应用程序的Heroku中的master分支)。我已经阅读了有关GitLab CI的几篇文章,我认为这更适合我(而不是Heroku CI,因为我没有DEV和PROD实例)。

因此,到目前为止,我手动执行此操作。这是我的.gitlab-ci.yml文件(尚未提交/推送):

stages:
  - test
  - deploy

test_for_illegal_bugs:
  stage: test
  script:
    - npm test

deploy_to_dev:
  stage: deploy
  only:
    - origin master
  script:
    - git commit
    - git push origin master
    - git pull heroku master --rebase
    - git push heroku master
Run Code Online (Sandbox Code Playgroud)

因此,我的问题是:.gitlab-ci.yml为了使所有这些“操作”(上图)自动化,我到底需要写些什么?

PS。还有另一个(理论上的)后续问题:GitLab-CI Runner是如何触发的?例如,如果我希望它在与master合并请求时触发,是否可以使用only: ...in来做到这一点.gitlab-ci.yml

Wol*_*son 10

将阶段限制为合并请求:

test仅在打开合并请求 (MR) 时执行您的阶段,请使用

   only:
     - merge_requests
Run Code Online (Sandbox Code Playgroud)

根据Gitlab 文档,您可以进一步将其限制为仅针对具有特定目标分支的 MR 执行,例如仅针对具有特定目标分支的 MR 执行master

   only:
     - merge_requests
   except:
     variables:
       - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
Run Code Online (Sandbox Code Playgroud)

这为所有不是master.

rules:用于:

  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
Run Code Online (Sandbox Code Playgroud)

将阶段限制为分支:

正如@marcolz 已经提到的,这是通过

   only:
     - master
Run Code Online (Sandbox Code Playgroud)

只执行推送到主分支的阶段。


mar*_*olz 6

尝试

only:
  - master
Run Code Online (Sandbox Code Playgroud)

origin只是遥控器的名称。master是分支的名称。

当提交被推送到存储库时,运行程序由 GitLab-CI 触发,因此不会在合并请求时触发。

您可以使用 atrigger来触发管道,然后从 中的合并请求事件调用该触发器integrations