Mavenプラグインを利用したデプロイのワークフロー

GitHub Actionsは、GitHubで提供されているワークフローの自動化ツールであり、プロジェクトのリポジトリに対するCI/CD (Continuous Integration / Continuous Delivery) を手軽に導入できる。Microsoftは、Azureの各種サービスと連携するGitHub Actions用のアクションを多数提供している。

前回は、このGitHub ActionsをAzure Webアプリをビルド・デプロイする一連の方法を紹介した。今回はワークフロー定義の中身をもう少し詳しく解説しよう。

前回使用したワークフロー定義のYAMLファイルは次のようなものだった。

/.github/workflows/main.yml

# This is a basic workflow to help you get started with Actions

name: AzureWebApps

on:
  push:
    branches: [ master ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11

    # Build package using Maven
    - name: maven build, clean
      run: |
        mvn clean package -D skipTests

    # Maven plugin can cosume this authentication method automatically
    - name: Azure Login
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    # Maven deploy, make sure you have correct configurations in your pom.xml
    - name: deploy to Azure App Service using Maven
      run: |
        mvn azure-webapp:deploy

nameは任意のワークフロー名、onはこのワークフローを実行するトリガーの設定になる。この例では、masterブランチに何らかの変更がpushされると、それをトリガーとしてワークフローが起動する。jobsが実際に実行される処理で、今回はbuild-and-deployというジョブが1つだけ宣言してある。

runs-onはワークフローを実行する仮想環境のOSの設定で、今回はUbuntu最新版を指定している。それぞれの仮想環境には、あらかじめビルドやテストなどに必要となるさまざまなツールが含まれている。具体的にどのOSにツールが組み込まれているかは「GitHubホストランナーにインストールされるソフトウェア」にまとめられている。

本稿で使用しているサンプルプロジェクトのビルドにはJDKおよびMavenが必要だが、これらもデフォルトで提供されていることがわかる。

ジョブの処理は、steps以下に記述された各ステップが順番に実行される。この例では、build-and-deployのジョブは下図の5つのステップから構成されている。

  • build-and-deployに含まれる5つのステップ

    build-and-deployに含まれる5つのステップ

usesは、あらかじめ用意されたアクションを実行したい場合に使用する。「actions/checkout@v2」と「actions/setup-java@v1」は、GitHub Actionsで公式に提供されているアクションで、それぞれリポジトリのチェックアウトと、JDK(JDKのビルド環境)のセットアップを行う。withはアクションに渡すパラメータの指定で、今回はJDK 11を使用したいので、java-versionに「11」を指定した。

次の「maven build, clean」のステップでプロジェクトのビルドを実行したいのだが、usesでアクションを使っておらず、代わりにrunが指定されている。runを使うと、シェルを使って任意のコマンドを実行できる。今回のプロジェクトではすでにpom.xmlにMavenを使ったビルドの設定が組み込まれているので(詳細は「第7回 Spring BootとAzure Cosmos DBで蔵書管理アプリを作る(その1)」を参照)、「mvn clean package」でビルドが実行できる。「-D skipTests」はテストをスキップするオプションだか、今回はそもそもテストを記述していないのであまり意味はない。

次の「Azure Login」は、ビルドして生成されたWebアプリをAzure App Serviceにデプロイするために、Azureにログインするステップになる。「azure/login@v1」はMicrosoftによって提供されている、Azureサービスにログインするためのアクションで、パラメータとして認証情報のシークレットを渡して実行する。ここで指定しているシークレットは、前回登録した「AZURE_CREDENTIALS」だ。

最後に、WebアプリをAzure App Serviceにデプロイする。このプロジェクトの場合、azure-webapp-maven-plugin を使ってMavenでデプロイできるようにpom.xmlを構成済みなので、ビルドの時と同様にrunで「mvn azure-webapp:deploy」コマンドを実行すればよい。

そのほか、ワークフローの記述方法に関する詳細は「GitHub Actionsのワークフロー構文」を参照いただきたい。

Azure WebAppアクションを使ったデプロイ

上の例ではAzure App ServiceへのデプロイにMavenプラグインを使用したが、Microsoftが提供しているAzure WebAppアクションを使ってデプロイする方法もある。ただし、この場合はあらかじめAzure Web Service上に対象となるWebアプリのインスタンスが用意されている必要がある。Webアプリのインスタンスは、AzureポータルのApp Serviceの管理画面で作成することができる。

下図は、「booklist-mynaviazurejava」という名前でWebアプリのインスタンスを作成した例である。

  • 新規Webアプリインスタンスの作成

    新規Webアプリインスタンスの作成

  • 新規Webアプリインスタンスの作成

    新規Webアプリインスタンスの作成

  • Webアプリインスタンスの管理画面

    Webアプリインスタンスの管理画面

このインスタンスにSpringアプリケーションをデプロイするGitHub Actionsのワークフローは、次のようになる。

s is a basic workflow to help you get started with Actions

name: AzureWebApps

on:
  push:
    branches: [ master ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11

    # Build package using Maven
    - name: maven build, clean
      run: |
        mvn clean package -D skipTests

    # Maven plugin can cosume this authentication method automatically
    - name: Azure Login
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    # Deploy to Azure WebApp using webapp-deploy
    - name: 'Deploy to Azure WebApp'
      uses: azure/webapps-deploy@v2
      with: 
        app-name: 'booklist-mynaviazurejava'
        package: '${{ github.workspace }}/target/*.jar'

Mavenプラグインを使う場合から変わっているのは、最後のデプロイの箇所だけだ。mvnコマンドでデプロイする代わりに「azure/webapps-deploy@v2」というアクションを使用している。このアクションは、パラメータとして対象のWebアプリのインスタンス名とデプロイするパッケージを指定して実行する。JavaのWebアプリの場合、パッケージはJARファイルかWARファイルである。プロジェクトのルートディレクトリのパスは${{ github.workspace }}環境変数に格納されているので、そこからJARまたはWARファイルのパスを参照できる。

なお、このケースでもMavenプラグインの場合と同様にAzureサービスへの認証にはazure/login@v1アクションを利用している。

発行プロファイルを使用する

WebアプリをデプロイするためだけにAzureサービスにログインしたくない場合は、Webアプリの「発行プロファイル」を使うとよいだろう。発行プロファイルを使った認証であれば、影響範囲を対象のWebアプリだけに限定することができる。

発行プロファイルは、AzureポータルのWebアプリの管理画面から取得できる。下図の画面から[発行プロファイルの取得]をクリックすると、認証情報が記述されたテキストファイルがダウンロードできる。これを、前回行なったサービスプリンシパル用のシークレットの作成と同様に、GitHubリポジトリのシークレットとして登録する。

  • Webアプリの発行プロファイルの取得

    Webアプリの発行プロファイルの取得

まずGitHubリポジトリの[Settings]→[Secrets]のメニューを選択し、[New secret]ボタンで新規シークレットの作成ページを開く。

  • 新規シークレットの作成

    新規シークレットの作成

ここで、[Name]を「AZURE_WEBAPP_PUBLISH_PROFILE」とし、[Value]に先ほどダウンロードした発行プロファイルの内容をコピーして登録すればよい。

  • 発行プロファイルの内容を登録する

    発行プロファイルの内容を登録する

Azure WebAppアクションで認証プロファイルを使ってデプロイするワークフローは次のようになる。

# This is a basic workflow to help you get started with Actions

name: AzureWebApps

on:
  push:
    branches: [ master ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11

    # Build package using Maven
    - name: maven build, clean
      run: |
        mvn clean package -D skipTests

    # Deploy to Azure WebApp using webapp-deploy
    - name: 'Deploy to Azure WebApp'
      uses: azure/webapps-deploy@v2
      with: 
        app-name: 'booklist-mynaviazurejava'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        package: '${{ github.workspace }}/target/*.jar'

先ほどと変わったのは、まずazure/login@v1を使ったログインが不要になったことと、webapp-deployのpublish-profileパラメータに発行プロファイル用のシークレットを指定している点である。

前回紹介したように、GitHub ActionsではAzureの各種サービスと手軽に連携できるさまざまなアクションが用意されている。プロジェクトをGitHubにホストしているのであれば利用しない手はないだろう。