如何处理异步 request/response 作为 Gitlab CI/CD 测试的一部分

How to handle an asynchronous request/response as part of a Gitlab CI/CD test

我希望从 Jenkins 迁移到 GitLab CI/CD。我们目前使用 Jenkins 的 BlazeMeter 插件对 Blazemeter 进行 运行 GUI 功能测试,作为 Jenkins 工作的一部分。

不幸的是,BlazeMeter 没有 GitLab 的插件,但他们有一个简单的 JSON API 来开始测试。

因为测试可能很长-运行Blazemeter API 是异步的。一个 cUrl 端点用于启动测试,另一个用于轮询和获取结果(传递在第一次调用中返回的 ID)。

作为 GitLab CI 管道作业的一部分处理此异步过程的最佳方法是什么?示例 gitlab yaml 是什么?

general solution是使用shell/cmd脚本来管理gitlab的循环-ci.

build:
  stage: runBlazeMeter
  script:
    - echo "START test run"
      echo "use curl to initiate test"
      COUNT=0
      while
        COUNT=$((COUNT + 1))
        echo "use curl to query test completion"
        RES=$(curl --silent https://jsonplaceholder.typicode.com/users/${COUNT} | wc -c)
        [ $RES -gt 3 ]
      do :; done
      echo "END test run"

GitLab 具有 webhook 或管道触发器功能,您可以从任何地方调用它。 blazemeter 也有通过 webhooks 的通知。通过结合这两者将解决您的问题 而无需长时间 运行 一项工作 直到测试完成。

test-trigger:
  stage: test
  script:
    - # curl command to invoke test
  except:
    - triggers

test-completion:
  stage: test
  script:
    - # reporting script
  only:
   - triggers

以下资源将帮助您入门。

您可以使用两个阶段来实现这一点,方法是使用工件将 ID 从一个阶段复制到下一个阶段

start-test:
  stage: test
  artifacts:
    untracked: true
  script:
    - curl http://run/the/test > testid.json

test:
  stage: test
  dependencies: 
    - start-test
  script:
    - TESTID=`cat testid.json`
      while
        sleep 1000
        RES=$(curl https://test/status/${TESTID} | grep "COMPLETE")
        [ $RES -gt 0 ]
      do :; done
      echo "TEST COMPLETE"