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つのステップ

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アプリインスタンスの管理画面

このインスタンスに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アプリの発行プロファイルの取得

まず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にホストしているのであれば利用しない手はないだろう。