生成和引用制品 artifacts

步骤产物 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>]