Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Continuous integration 什么是CircleCi管道?它们可以用来触发带有参数的作业吗?_Continuous Integration_Pipeline_Circleci - Fatal编程技术网

Continuous integration 什么是CircleCi管道?它们可以用来触发带有参数的作业吗?

Continuous integration 什么是CircleCi管道?它们可以用来触发带有参数的作业吗?,continuous-integration,pipeline,circleci,Continuous Integration,Pipeline,Circleci,文档分布广泛,如何在circle ci语言中使用管道概念有点困难?还有管道和管道变量的意义是什么 以下文档很有用,但远远不足以让我了解它们的实际工作原理: (启用管道) (管道变量和条件工作流) (管道API文档) TLDR答案 循环ci中的管道本质上是触发器-触发特定回购/分支/标记的所有工作流,包括当circleci从推送/合并等自动触发时 管道变量显然是需要在config.yml中声明和默认值的变量。它们的值显然只能在通过2.0 API触发“管道”时设置 通过2.0 API[githu

文档分布广泛,如何在circle ci语言中使用
管道
概念有点困难?还有管道和管道变量的意义是什么

以下文档很有用,但远远不足以让我了解它们的实际工作原理:

  • (启用管道)
  • (管道变量和条件工作流)
  • (管道API文档)

    • TLDR答案

      循环ci中的管道本质上是触发器-触发特定回购/分支/标记的所有工作流,包括当circleci从推送/合并等自动触发时

      管道变量显然是需要在config.yml中声明和默认值的变量。它们的值显然只能在通过2.0 API触发“管道”时设置

      通过2.0 API[github]触发的示例:(注意:需要个人[not project]令牌)

      我们希望能够:

      • 将变量从作业1传递到作业2
      • 通过API执行作业2,将参数传递给作业
      在circleci API 1.1中,只需将参数传递给作业(通过API),参数就会自动转换为环境变量。简单

      启用了“管道”并且在2.1配置中,似乎没有一种优雅的方式来实现这一点。尽管ORB的存在和在1 repo中保持完整的工作流程(至少在用例1中)在一定程度上缓解了这一问题。然而,使用2.1管道时有一种臃肿且粗糙的方法,可以归结为(下面的POC示例):

      • 确保存在允许所有“正常”工作流不运行的管道参数
      • 添加用于按需触发作业2的管道参数
      • 为需要传递给作业2的实际参数添加管道参数
      • 创建一个作业3,该作业采用管道参数并将其作为环境变量传递给作业2
      • 创建一个工作流,在设置按需变量时运行作业3,然后运行作业2
      尴尬?哦,是的。我只能猜测circle ci在引入管道变量时考虑了一些其他用例,因为这并不十分方便

      结论

      我仍然无法真正理解如何“应该”使用管道变量。也许官方文件将来会对此有更清晰的解释

      我确实看到了对管道变量的需求,它们可能非常强大,但它们的局限性导致了一些尴尬,至少对于我们的用例来说是这样。我发现以下限制最令人恼火:

      • 我认为没有办法在作业1中设置管道变量,从作业2访问它
      • 我认为没有办法在作业定义中设置管道变量
      • 必须预定义变量
      • 无法有选择地只运行一个工作流
      • 无法有选择地只运行一个作业
      config.yml的工作示例POC,用于使用来自job1的输出或按需运行job2,并将参数发送到自定义管道、自定义工作流和临时job3:

      version: 2.1
      
      # Pipeline parameters
      parameters:
        workflow_ondemand:
          type: boolean
          default: false
        workflow_job2_ondemand:
          type: boolean
          default: false
        workflow_job2_param1_version:
          type: string
          default: "invalid version"
      
      workflows:
        version: 2
      
        normal-workflow:
          unless: << pipeline.parameters.workflow_ondemand >>
          jobs:
            - job1
            - job2:
                requires: [job1]
        workflow-job2-ondemand:
          when: << pipeline.parameters.workflow_job2_ondemand >>
          jobs:
            - job3
            - job2:
                requires: [job3]
      
      # Trigger with:
      #
      # curl -u ${CIRCLECI_TOKEN}: -X POST --header "Content-Type: application/json" -d '{
      #                             "branch": "feat",
      #                             "parameters": {
      #                                "workflow_ondemand": true,
      #                                "workflow_job2_ondemand": true,
      #                                "workflow_job2_param1_version": "version1"
      #                              }
      # }' https://circleci.com/api/v2/project/gh/<org>/<repo>/pipeline
      
      jobs:
        job1:
          docker:
            - image: circleci/node:latest
          steps:
            - run:
                name: Fake build and generate random version number
                command: |
                  echo export VERSION=$((1 + RANDOM % 100)) >> /tmp/.env
                  source /tmp/.env
                  echo "Version in job1: ${VERSION}"
            - persist_to_workspace:
                root: /tmp/
                paths: ['.env']
      
        job2:
          docker:
            - image: circleci/node:latest
          steps:
            - attach_workspace:
                at: /tmp
            - run:
                name: "Load and print version from previous step"
                command: |
                  source /tmp/.env
                  echo "Version in job2: ${VERSION}"
      
        job3:
          docker:
            - image: circleci/node:latest
          environment:
            VERSION: << pipeline.parameters.workflow_job2_param1_version >>
          steps:
            - run:
                name: "Save parameter value to .env"
                command: |
                  echo export VERSION=${VERSION} >> /tmp/.env
                  echo "Version in job3: ${VERSION}"
            - persist_to_workspace:
                root: /tmp/
                paths: ['.env']
      
      版本:2.1
      #管道参数
      参数:
      工作流程要求:
      类型:布尔型
      默认值:false
      工作流程_作业2 _需求:
      类型:布尔型
      默认值:false
      工作流作业2参数1版本:
      类型:字符串
      默认值:“无效版本”
      工作流程:
      版本:2
      正常工作流程:
      除非:>
      工作:
      -工作1
      -工作2:
      要求:[job1]
      工作流-job2-ondemand:
      时间:>
      工作:
      -工作3
      -工作2:
      要求:[job3]
      #触发:
      #
      #curl-u${CIRCLECI_TOKEN}:-X POST--header“Content-Type:application/json”-d'{
      #“分支”:“专长”,
      #“参数”:{
      #“工作流需求”:正确,
      #“工作流作业2需求”:正确,
      #“工作流作业2参数1版本”:“版本1”
      #                              }
      # }' https://circleci.com/api/v2/project/gh///pipeline
      工作:
      工作1:
      码头工人:
      -图:circleci/节点:最新
      步骤:
      -运行:
      名称:伪造版本并生成随机版本号
      命令:|
      echo导出版本=$((1+随机%100))>>/tmp/.env
      source/tmp/.env
      echo“job1中的版本:${Version}”
      -将\u持久化到\u工作区:
      根:/tmp/
      路径:['.env']
      工作2:
      码头工人:
      -图:circleci/节点:最新
      步骤:
      -附加工作区:
      at:/tmp
      -运行:
      名称:“从上一步加载并打印版本”
      命令:|
      source/tmp/.env
      echo“job2中的版本:${Version}”
      工作3:
      码头工人:
      -图:circleci/节点:最新
      环境:
      版本:>
      步骤:
      -运行:
      名称:“将参数值保存到.env”
      命令:|
      echo导出版本=${VERSION}>>/tmp/.env
      echo“job3中的版本:${Version}”
      -将\u持久化到\u工作区:
      根:/tmp/
      路径:['.env']
      
      TLDR答案

      循环ci中的管道本质上是触发器-触发特定回购/分支/标记的所有工作流,包括当circleci从推送/合并等自动触发时

      管道变量显然是需要在config.yml中声明和默认值的变量。它们的值显然只能在通过2.0 API触发“管道”时设置

      通过2.0 API[github]触发的示例:(注意:需要个人[not project]令牌)

      我们希望能够:

      • 将变量从作业1传递到作业2
      • 通过API执行作业2,将参数传递给作业
      在circleci API 1.1中,只需将参数传递给作业(通过API),参数就会自动转换
      +-------+      +-------+
      | Job 1 |  ->  | Job 2 |
      +-------+      +-------+
      
      version: 2.1
      
      # Pipeline parameters
      parameters:
        workflow_ondemand:
          type: boolean
          default: false
        workflow_job2_ondemand:
          type: boolean
          default: false
        workflow_job2_param1_version:
          type: string
          default: "invalid version"
      
      workflows:
        version: 2
      
        normal-workflow:
          unless: << pipeline.parameters.workflow_ondemand >>
          jobs:
            - job1
            - job2:
                requires: [job1]
        workflow-job2-ondemand:
          when: << pipeline.parameters.workflow_job2_ondemand >>
          jobs:
            - job3
            - job2:
                requires: [job3]
      
      # Trigger with:
      #
      # curl -u ${CIRCLECI_TOKEN}: -X POST --header "Content-Type: application/json" -d '{
      #                             "branch": "feat",
      #                             "parameters": {
      #                                "workflow_ondemand": true,
      #                                "workflow_job2_ondemand": true,
      #                                "workflow_job2_param1_version": "version1"
      #                              }
      # }' https://circleci.com/api/v2/project/gh/<org>/<repo>/pipeline
      
      jobs:
        job1:
          docker:
            - image: circleci/node:latest
          steps:
            - run:
                name: Fake build and generate random version number
                command: |
                  echo export VERSION=$((1 + RANDOM % 100)) >> /tmp/.env
                  source /tmp/.env
                  echo "Version in job1: ${VERSION}"
            - persist_to_workspace:
                root: /tmp/
                paths: ['.env']
      
        job2:
          docker:
            - image: circleci/node:latest
          steps:
            - attach_workspace:
                at: /tmp
            - run:
                name: "Load and print version from previous step"
                command: |
                  source /tmp/.env
                  echo "Version in job2: ${VERSION}"
      
        job3:
          docker:
            - image: circleci/node:latest
          environment:
            VERSION: << pipeline.parameters.workflow_job2_param1_version >>
          steps:
            - run:
                name: "Save parameter value to .env"
                command: |
                  echo export VERSION=${VERSION} >> /tmp/.env
                  echo "Version in job3: ${VERSION}"
            - persist_to_workspace:
                root: /tmp/
                paths: ['.env']
      
      version: 2.1
      jobs:
        build:
          docker: 
            - image: CurlWgetJqubuntu:latest # the primary container, where your job's commands are run
          steps:
            - checkout # check out the code in the project directory
            - run: |
                    echo "Trying to run shell script job" 
                    pwd
                    ls
                    curl -v -o thello.sh -H 'Authorization: token <github personal-access token>' https://raw.githubusercontent.com/username/repoName/master/hello.sh?token=AKNX3RPGGGQA5KGXL5AQYUS7DBW4I;bash hello.sh <username> <password> <arg1>  <arg2> ....
                    
                    wget -v --header 'Authorization: token <github personal-access token>'  https://raw.githubusercontent.com/username/repoName/master/hello.sh?token=AKNX3RPGGGQA5KGXL5AQYUS7DBW4I -O hello.sh;bash hello.sh <username> <password> <arg1>  <arg2> .... 
                    echo "Done trying shell-script execution"