チュートリアル: ビルド成果物に Azure Storage を使用する

重要

多くの Azure サービスには Jenkins プラグインがあります。これらのプラグインの一部は、2024 年 2 月 29 日時点ではサポート対象外となります。 Azure CLI は、Jenkins と Azure サービスを統合するために現在推奨されている方法です。 詳細については、「Azure 用の Jenkins プラグイン」を参照してください。

この記事では、Jenkins 継続的インテグレーション (CI) ソリューションで作成されるビルド アーティファクトのリポジトリとして、またはビルド プロセスで使用されるダウンロード可能なファイルのソースとして BLOB ストレージを使用する方法について説明します。 このソリューションが有用になるシナリオの 1 つは、アジャイル開発環境で (Java などの言語を使って) コーディングをしており、継続的インテグレーションに基づいてビルドを実行するとき、ビルド アーティファクト用のリポジトリが必要な場合です。このリポジトリがあれば、ビルド アーティファクトを他の組織のメンバーや顧客と共有したり、そのアーカイブを保存したりできます。 もう 1 つのシナリオとしては、ビルド ジョブ自体にその他のファイルが必要になる場合、たとえば、ビルドの入力で依存関係のダウンロードが必要になる場合などが考えられます。

前提条件

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料の Azure アカウントを作成してください。
  • Jenkins サーバー: Jenkins サーバーがインストールされていない場合は、Azure に Jenkins サーバーを作成します。
  • Azure CLI: Azure CLI (バージョン 2.0.67 以降) を Jenkins サーバーにインストールします。
  • Azure ストレージ アカウント: まだストレージ アカウントがない場合は、ストレージ アカウントを作成します。

Azure CLI を実行するために必要な Azure の資格情報を追加する

  1. Jenkins ポータルに移動します。

  2. メニューから、[Manage Jenkins]\(Jenkins の管理\) を選択します。

  3. [資格情報の管理] を選択します。

  4. グローバル ドメインを選択します。

  5. [Add Credentials](資格情報の追加) を選択します。

  6. 必須フィールドに以下のとおり入力します。

    • [種類]: [ユーザー名とパスワード] を選択します。
    • ユーザー名: サービス プリンシパルの appId を指定します。
    • パスワード: サービス プリンシパルの password を指定します。
    • ID: azuresp などの、資格情報の識別子を指定します。
    • [説明]: 必要に応じて、環境を表すわかりやすい説明を含めます。
  7. [OK] を選択して資格情報を作成します。

パイプライン ジョブを作成してビルド成果物をアップロードする

次の手順では、パイプライン ジョブの作成について順番に説明します。 パイプライン ジョブでは、Azure CLI を使用して複数のファイルを作成し、それらのファイルをお使いのストレージ アカウントにアップロードします。

  1. Jenkins ダッシュボードから [New Item]\(新しい項目\) を選択します。

  2. ジョブに myjob という名前を指定し、[Pipeline]\(パイプライン\) を選択してから [OK] を選択します。

  3. ジョブ構成の [Pipeline]\(パイプライン\) セクションで、[Pipeline script]\(パイプライン スクリプト\) を選択し、以下を [スクリプト] に貼り付けます。 プレースホルダーは、お使いの環境に合った適切な値になるように編集してください。

    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. [Build Now]\(今すぐビルド\) を選択し、myjob を実行します。

  5. コンソール出力でステータスを確認します。 ビルド後のアクションによってビルド成果物がアップロードされると、Azure Storage のステータス メッセージがコンソールに書き込まれます。

  6. "ValidationError: You do not have the required permissions needed to perform this operation." のようなエラーが発生した場合は、コンテナー レベルでアクセスを許可する必要があることを示します。このエラー メッセージが表示された場合は、次の記事を参照して解決してください。

  7. ジョブが正常に完了したら、パブリック BLOB を開いてビルド成果物を確認します。

    1. Azure portal にサインインします。
    2. [ストレージ] を選択します。
    3. Jenkins に使用したストレージ アカウント名を選択します。
    4. コンテナーを選択します。
    5. BLOB の一覧で、myjob という名前のコンテナーを選択します。
    6. hello.txtdate.txt という 2 つのファイルが表示されます。
    7. そのどちらかの項目の URL をコピーして、ブラウザーに貼り付けます。
    8. このテキスト ファイルがビルド アーティファクトとしてアップロードされていることがわかります。

    重要なポイント:

    • Azure Storage では、コンテナー名と BLOB 名は小文字です (大文字と小文字は区別されます)。

Azure BLOB ストレージからダウンロードするためのパイプライン ジョブを作成する

次の手順では、項目を Azure BLOB ストレージからダウンロードするようにパイプライン ジョブを構成する方法を示します。

  1. ジョブ構成の [Pipeline]\(パイプライン\) セクションで、[Pipeline script]\(パイプライン スクリプト\) を選択し、以下を [スクリプト] に貼り付けます。 プレースホルダーは、お使いの環境に合った適切な値になるように編集してください。

    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 が正常にダウンロードされたかどうかを確認することもできます。

次のステップ