教程:将 Azure 存储用于生成构件

重要

许多 Azure 服务都有 Jenkins 插件。截至 2024 年 2 月 29 日,其中一些插件将不受支持。 Azure CLI 是目前建议将 Jenkins 与 Azure 服务集成的方法。 有关详细信息,请参阅适用于 Azure的 Jenkins 插件 一文。

本文演示如何将 Blob 存储用作 Jenkins 持续集成(CI)解决方案创建的生成项目的存储库,或用作生成过程中要使用的可下载文件的源。 在敏捷开发环境中进行编码时(无论是使用 Java 还是其他语言),一种你会发现此解决方案非常有用的场景是,生成过程基于持续集成运行,并且你需要一个存储库来存放构建工件,以便你能够与其他组织成员、客户共享,或用于维护存档。 另一种情况是,构建任务本身需要其他文件,例如,一些依赖项作为构建输入的一部分进行下载。

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始前 创建免费的 Azure 帐户
  • Jenkins 服务器:如果没有安装 Jenkins 服务器,在 Azure上创建 Jenkins 服务器。
  • Azure CLI:在 Jenkins 服务器上安装 Azure CLI(版本 2.0.67 或更高版本)。
  • Azure 存储帐户:如果还没有存储帐户,创建存储帐户

添加执行 Azure CLI 所需的 Azure 凭据

  1. 浏览到 Jenkins 门户。

  2. 从菜单中选择 管理 Jenkins

  3. 选择管理凭据

  4. 选择全局域。

  5. 选择“添加凭据”。

  6. 填写必填字段,如下所示:

    • 种类:选择用户名携带密码
    • 用户名:指定服务主体的 appId
    • 密码:指定服务主体的 password
    • ID:指定凭据标识符,例如 azuresp
    • 描述:(可选)可为您的环境添加一个有意义的描述。
  7. 选择“确定”创建凭据。

创建一个管道作业以上传构建工件

以下步骤指导你创建管道作业。 管道作业创建多个文件,并使用 Azure CLI 将文件上传到存储帐户。

  1. 在 Jenkins 仪表板中,选择“新建项”

  2. 将作业命名myjob,选择流水线,然后选择确定

  3. 在作业配置的 管道 部分中,选择 管道脚本,并将以下内容粘贴到 脚本。 请编辑占位符以匹配您的环境的值。

    pipeline {
      agent any
      environment {
        AZURE_SUBSCRIPTION_ID='99999999-9999-9999-9999-999999999999'
        AZURE_TENANT_ID='99999999-9999-9999-9999-999999999999'
        AZURE_STORAGE_ACCOUNT='myStorageAccount'
      }
      stages {
        stage('Build') {
          steps {
            sh 'rm -rf *'
            sh 'mkdir text'
            sh 'echo Hello Azure Storage from Jenkins > ./text/hello.txt'
            sh 'date > ./text/date.txt'
          }
    
          post {
            success {
              withCredentials([usernamePassword(credentialsId: 'azuresp', 
                              passwordVariable: 'AZURE_CLIENT_SECRET', 
                              usernameVariable: 'AZURE_CLIENT_ID')]) {
                sh '''
                  echo $container_name
                  # Login to Azure with ServicePrincipal
                  az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID
                  # Set default subscription
                  az account set --subscription $AZURE_SUBSCRIPTION_ID
                  # Execute upload to Azure
                  az storage container create --account-name $AZURE_STORAGE_ACCOUNT --name $JOB_NAME --auth-mode login
                  az storage blob upload-batch --destination ${JOB_NAME} --source ./text --account-name $AZURE_STORAGE_ACCOUNT
                  # Logout from Azure
                  az logout
                '''
              }
            }
          }
        }
      }
    }
    
  4. 选择立即生成以运行 myjob

  5. 检查控制台输出的状态。 生成后操作上传生成项目时,Azure 存储的状态消息将写入控制台。

  6. 如果遇到类似于以下内容的错误,这意味着需要在容器级别授予访问权限:ValidationError: You do not have the required permissions needed to perform this operation. 如果收到此错误消息,请参阅以下文章来解决:

  7. 成功完成此作业后,可通过打开公共 Blob 检查生成项目。

    1. 登录 Azure 门户
    2. 选择“存储”
    3. 选择用于 Jenkins 的存储帐户名称。
    4. 选择“容器”
    5. 在 blob 列表中选择名为 myjob的容器。
    6. 应会看到以下两个文件:hello.txtdate.txt
    7. 复制其中任一项的 URL,并将其粘贴到浏览器中。
    8. 可以看到上传作为构建工件的文本文件。

    要点

    • 容器名称和 blob 名称在 Azure 存储中均为小写(并且区分大小写)。

创建一个管道作业以从 Azure Blob 存储中下载数据

以下步骤演示如何配置管道作业以从 Azure Blob 存储下载项。

  1. 在作业配置的 管道 部分中,选择 管道脚本,并将以下内容粘贴到 脚本。 请编辑占位符以匹配您的环境的值。

    pipeline {
      agent any
      environment {
        AZURE_SUBSCRIPTION_ID='99999999-9999-9999-9999-999999999999'
        AZURE_TENANT_ID='99999999-9999-9999-9999-999999999999'
        AZURE_STORAGE_ACCOUNT='myStorageAccount'
      }
      stages {
        stage('Build') {
          steps {
            withCredentials([usernamePassword(credentialsId: 'azuresp', 
                            passwordVariable: 'AZURE_CLIENT_SECRET', 
                            usernameVariable: 'AZURE_CLIENT_ID')]) {
              sh '''
                # Login to Azure with ServicePrincipal
                az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID
                # Set default subscription
                az account set --subscription $AZURE_SUBSCRIPTION_ID
                # Execute upload to Azure
                az storage blob download --account-name $AZURE_STORAGE_ACCOUNT --container-name myjob --name hello.txt --file ${WORKSPACE}/hello.txt --auth-mode login
                # Logout from Azure
                az logout
              '''   
            }
          }
        }
      }
    }
    
  2. 运行构建后,检查构建历史记录控制台输出。 或者,还可以查看下载位置,确认预期的 Blob 是否已成功下载。

后续步骤