教程:将 Azure 存储用于生成项目

重要

许多 Azure 服务都有 Jenkins 插件。其中一些插件将从 2024 年 2 月 29 日开始不受支持。 当前推荐通过 Azure CLI 将 Jenkins 与 Azure 服务集成。 有关详细信息,请参阅适用于 Azure 的 Jenkins 插件一文。

本文介绍了如何将 Blob 存储用作 Jenkins 持续集成 (CI) 解决方案创建的生成项目的存储库,或者用作要在生成过程中使用的可下载文件的源。 在以下情况下,会发现此解决方案很有用:你在敏捷开发环境进行编码(使用 Java 或其他语言),生成基于持续集成运行并且需要一个适用于生成项目的存储库,以便(举例来说)你能与其他组织成员、客户共享生成项目或维护存档。 另一种情况是,当生成作业本身需要其他文件时,例如需要下载依赖项作为生成输入的一部分时。

先决条件

添加执行 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.txt 和 date.txt 。
    7. 复制这两项中任一项的 URL,并将其粘贴到浏览器中。
    8. 你会看到已作为生成工件上传的文本文件。

    要点

    • 在 Azure 存储中,容器名称和 Blob 名称都是小写的(并且区分大小写)。

创建要从 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 是否已成功下载。

后续步骤