Continuous integration 什么是CircleCi管道?它们可以用来触发带有参数的作业吗?
文档分布广泛,如何在circle ci语言中使用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
管道
概念有点困难?还有管道和管道变量的意义是什么
以下文档很有用,但远远不足以让我了解它们的实际工作原理:
- (启用管道)
- (管道变量和条件工作流)
- (管道API文档)
- 将变量从作业1传递到作业2
- 通过API执行作业2,将参数传递给作业
- 确保存在允许所有“正常”工作流不运行的管道参数
- 添加用于按需触发作业2的管道参数
- 为需要传递给作业2的实际参数添加管道参数
- 创建一个作业3,该作业采用管道参数并将其作为环境变量传递给作业2
- 创建一个工作流,在设置按需变量时运行作业3,然后运行作业2
- 我认为没有办法在作业1中设置管道变量,从作业2访问它
- 我认为没有办法在作业定义中设置管道变量
- 必须预定义变量
- 无法有选择地只运行一个工作流
- 无法有选择地只运行一个作业
- 将变量从作业1传递到作业2
- 通过API执行作业2,将参数传递给作业
- TLDR答案强>
循环ci中的管道本质上是触发器-触发特定回购/分支/标记的所有工作流,包括当circleci从推送/合并等自动触发时
管道变量显然是需要在config.yml中声明和默认值的变量。它们的值显然只能在通过2.0 API触发“管道”时设置
通过2.0 API[github]触发的示例:(注意:需要个人[not project]令牌)
我们希望能够:
在circleci API 1.1中,只需将参数传递给作业(通过API),参数就会自动转换为环境变量。简单
启用了“管道”并且在2.1配置中,似乎没有一种优雅的方式来实现这一点。尽管ORB的存在和在1 repo中保持完整的工作流程(至少在用例1中)在一定程度上缓解了这一问题。然而,使用2.1管道时有一种臃肿且粗糙的方法,可以归结为(下面的POC示例):
尴尬?哦,是的。我只能猜测circle ci在引入管道变量时考虑了一些其他用例,因为这并不十分方便
结论
我仍然无法真正理解如何“应该”使用管道变量。也许官方文件将来会对此有更清晰的解释
我确实看到了对管道变量的需求,它们可能非常强大,但它们的局限性导致了一些尴尬,至少对于我们的用例来说是这样。我发现以下限制最令人恼火:
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]令牌)
我们希望能够:
在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"