步骤产物 artifacts 为一系列关于制品文件的信息组合,用于保存流水线运行过程中的产物,以供后续任务 Job、阶段 Stage、甚至流水线 Pipeline 引用。
生成制品
Flow 流水线镜像构建、构建物上传等步骤目前会生成以下三种类型产物:
镜像产物:镜像构建任务构建完成后,上传至 ACR 或者私有镜像仓库的 Docker 镜像。制品信息结构如下:
{ "artifact": "yunxiao-demo", //镜像名称 "type": "dockerImage", //制品类型 "dockerUrl": "registry.cn-beijing.aliyuncs.com/yunxiao/yunxiao-demo:1.0", //镜像地址 "dockerTag": "1.0" //镜像tag }
Packages 通用制品:构建完成后,使用构建物上传至云效 Packages 的通用制品。制品信息结构如下:
{ "artifact": "yunxiao-demo", //制品名称 "type": "packages", //制品类型 "repoId": "packages_repo_id", //Packages仓库id "downloadUrl": "https://packages.aliyun.com/downloadurlxxxx", //制品下载地址 "version": "1.0", //制品版本 "md5": "dfdfdffff" //制品MD5 }
云效公共存储空间通用制品: 构建完成后,使用构建物上传归档至云效公共存储空间的通用制品。制品信息结构如下:
{ "artifact": "yunxiao-demo", //制品名称 "type": "flowPublic", //制品类型 "downloadUrl": "https://sdfdff", //制品下载地址 "md5": "dffff" //制品MD5 }
引用制品
Flow 流水线提供以下几种方式引用制品:
同一条流水线内跨 Job 或跨 stage 引用制品:通常适用于同一条流水线前序任务构建、后续任务部署,CI/CD同一条流水线场景。
跨流水线引用制品:通常适用于源流水线构建产物,目标流水线引用产物部署场景(如生产流水线直接引用预发验证通过的镜像),CI、CD分离场景。
从流水线制品源引用制品:通常适用于制品晋级场景(如预发验证通过上传到制品仓库,生产环境根据版本号直接从制品仓库选择制品发布)。
示例1:同一条流水线内跨 Job 或跨 Stage 引用制品
以下是一个类型为 Docker 镜像,同一条流水线内跨 Job 的 artifact 生产和使用示例:
sources: my_repo: …… stages: my_stage: name: 构建并部署 jobs: build_job: name: 镜像构建任务 steps: docker_build_step: step: ACRDockerBuild # 步骤 ACRDockerBuild 会上传生成 artifact name: 镜像构建 with: serviceConnection: <your-service-connection-id> region: cn-hangzhou artifact: my-image dockerRegistry: registry.cn-hangzhou.aliyuncs.com/ns/my-image dockerTag: 1.0 dockerfilePath: Dockerfile deploy_job: name: Kubernetes 发布任务 steps: kubectl_apply: step: KubectlApply name: Kubectl 发布 with: kubernetesCluster: <your-kubernetes-id> kubectlVersion: "1.16.4" namespace: default yamlPath: app-configs/manifest-app variables: - key: image value: $[jobs.build_job.docker_build_step.artifacts.my_image] # 引用 docker_build_step 步骤生成的镜像 my-image
以下是一个类型为云效公共存储空间通用制品,同一条流水线内跨 stage 的 artifact 生产和使用示例:
sources: my_repo: …… stages: build_stage: name: 构建阶段 jobs: build_job: name: 构建任务 steps: build_step: step: JavaBuild name: java构建 with: run: | mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip upload_step: step: ArtifactUpload # 步骤 ArtifactUpload 会上传生成 artifact name: 构建物上传 with: type: flowPublic artifact: default path: - target/ - deploy.sh deploy_stage: name: 部署阶段 jobs: deploy_job: name: 主机组部署任务 component: VMDeploy with: artifact: $[stages.build_stage.build_job.upload_step.artifacts.default] # 使用步骤 upload_step 生成的制品 default machineGroup: <your-machine-group-id> artifactDownloadPath: /home/admin/app/package.tgz executeUser: root run: | mkdir -p /home/admin/application/ tar zxvf /home/admin/app/package.tgz -C /home/admin/application/ sh /home/admin/application/deploy.sh restart
示例2:跨流水线引用制品
以下示例为源流水线 A 从源代码通过镜像构建任务生成镜像,目标流水线 B 引用 A 的镜像进行部署。跨流水线引用产物,通常用于预发阶段镜像通过验证后,生产阶段流水线直接使用预发镜像发布场景。
源流水线 A
sources: my_repo: type: gitSample name: Java示例代码源 endpoint: https://atomgit.com/flow-example/spring-boot.git branch: master stages: build_stage: name: "构建" jobs: build_job: name: "Java 镜像构建" steps: build_step: name: "Java 构建" step: "JavaBuild" with: jdkVersion: "1.8" mavenVersion: "3.6.3" run: "mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip\n" acr_docker_build_step: name: "镜像构建并推送至阿里云镜像仓库个人版" step: "ACRDockerBuild" with: artifact: "my_image" # 源流水线 A 构建任务生成镜像 dockerfilePath: "Dockerfile" dockerRegistry: registry.cn-qingdao.aliyuncs.com/ns/demo dockerTag: myimage-${DATETIME} region: "cn-hangzhou" serviceConnection: <your-service-connection-id>
目标流水线 B
sources: pipeline_a: type: flowPipeline name: 源流水线A flowPipeline: n86bmctmphs84icj # 源流水线 A 的 流水线 ID build: lastSuccessfulBuild triggerEvents: buildSuccess stages: kubectl_apply_stage: name: "部署" jobs: deploy_job: name: "Appstack 部署任务" component: AppStackFlowDeploy with: application: <your-app-name> # AppStack 应用名 environment: <your-env-name> # AppStack 应用环境名 artifacts: - label: backend # 对应 AppStack 应用 k8s 编排中的镜像占位符 value: $[sources.pipeline_a.stages.build_stage.build_job.acr_docker_build_step.artifacts.my_image] # 部署任务引用镜像
示例3:从流水线制品源引用制品
制品仓库或镜像仓库通常用于流水线构建产物存储和管理,用于衔接 CI 和 CD 阶段。云效 Flow 流水线支持直接从制品源选择制品发起部署,目前支持 「Packages 通用制品仓库」和「ACR 企业版镜像仓库」。
从 Packages 通用制品仓库选择制品部署
sources: my_packages: type: packages repoType: generic # 仓库类型,目前只支持通用制品仓库generic repo: "<your-repo-id>, eg: flow_generic_repo" # 仓库id,可以在packages.aliyun.com页面从仓库基本信息获取仓库id artifact: "<your-artifact-name>, eg: Artifacts_1418394" # 制品名称 version: "<your-artifact-version>, eg: 2024-03-28-11-53-39" # 制品版本,如果填latest,则表示使用最新版本 certificate: type: serviceConne ction serviceConnection: <your-service-connection-id> stages: my_stage: name: "部署" jobs: job1: name: "主机部署" component: VMDeploy with: artifact: $[sources.my_package] # $[sources.<source_id>] 引用制品 machineGroup: B7D9WDd33gQrkUwO artifactDownloadPath: /home/admin/app/package.tgz run: ls -l /home/admin/app/ job2: name: "云效AppStack部署" component: AppStackFlowDeploy with: application: app-test environment: test4 artifacts: - label: demoapp value: $[sources.my_package.downloadUrl] # $[sources.<source_id>.downloadUrl] 引用制品
从 ACR 企业版镜像仓库选择镜像部署
sources: my_acr: type: acr region: cn-hangzhou instance: "<your-acr-ee-instance>, eg: yunxiao" # ACR实例名称 namespace: default # 命名空间 imageRepo: "<your-docker-registry>, eg: test" # 镜像仓库名称 imageTag: v1.0 # 镜像版本 versionFilter: .* # 镜像版本的过滤规则,请填写正则表达式 triggerEvents: - pushCompleted - scanCompleted certificate: type: serviceConnection serviceConnection: <your-service-connection-id> stages: my_stage: name: "部署" jobs: deploy_job_1: name: "Kubernetes 分批发布任务" component: KubernetesBatchDeploy with: kubernetesCluster: <your-kubernetes-id> kubectlVersion: "1.20.1" namespace: flow-test1 service: spring-boot-sample container: nginx artifact: $[sources.my_acr.dockerUrl] # 如果要使用vpc地址,使用 $[sources.<source_id>_vpc.dockerUrl] batchNumber: 2 deploy_job_2: name: "云效AppStack部署" component: AppStackFlowDeploy with: application: <your-app-name> # AppStack 应用名 environment: <your-env-name> # AppStack 应用环境名 artifacts: - label: backend # 对应 AppStack 应用 k8s 编排中的镜像占位符 value: $[sources.my_acr.dockerUrl] # 如果要使用vpc地址,使用 $[sources.<source_id>_vpc.dockerUrl]
详细说明
生成步骤产物 artifact
通过云效提供的构建物上传、镜像构建等步骤打包上传镜像制品。具体查看流水线步骤 steps。
引用产物 artifact
同一条流水线同一阶段内跨 Job 引用产物:
$[jobs.<job_id>.<step_id>.artifacts.<artifact>]
同一条流水线跨 Stage 引用产物:
$[stages.<stage_id>.<job_id>.<step_id>.artifacts.<artifact>]
跨流水线引用产物(其中 sources 类型为 flowPipeline):
$[sources.<source_id>.stages.<stage_id>.<job_id>.<step_id>.artifacts.<artifact>]
从制品源引用产物(其中 sources 类型为 packages 或 acr):
$[sources.<source_id>.stages.<stage_id>.<job_id>.<step_id>.artifacts.<artifact>]