Azure Site Extensions の自動更新が可能に

このポストは、6 月 3 日に投稿された Auto-update your Azure Site Extension の翻訳です。

Azure Site Extensions を使用すると、Azure Web Apps のアプリを簡単に拡張したり、サイトの機能を強化したりすることができます。たとえば、New Relic (英語)Visual Studio Online (英語) を任意の Web アプリに統合できるほか、拡張機能を自作して Site Extensions ギャラリー (英語) で公開することも可能です。Site Extensions 拡張機能の作成方法とギャラリーでの公開方法の詳細については、こちらの記事でご確認いただけます。

しかし、このような拡張機能を更新する作業には少し手間がかかります。これまでは、Site Extensions 拡張機能の新しいバージョンを公開する場合、ユーザーが Site Extensions ギャラリーにアクセスして最新バージョンを取得し、更新ボタンをクリックして更新版を手動でデプロイする必要がありました。しかし、今回 Site Extensions の自動更新機能 (英語) が導入され、わずか 1 行のコードで自ら更新できるようになりました。

自動更新の有効化

わずか 1 行のコードで

Site Extensions 拡張機能の自動更新を有効にする手順は、拡張機能のホーム ページ (またはユーザーのアクセスが多い任意のページ) に次のスクリプト タグを追加するだけです。

 <script src="https://cdn.siteextensions.net/lib/siteExtensionUpdater/siteExtensionUpdater.1.0.0.min.js"></script>

このように、非常に簡単です。

これで、ユーザーが Site Extensions 拡張機能のページにアクセスするとバックグラウンドでこのスクリプトが実行され、利用可能な新バージョンの拡張機能の有無が確認されるようになります。新しいバージョンが存在する場合は、アクセスしたユーザーが使用している拡張機能のコピーが更新され、ユーザーのページを更新して新バージョンを取得するように促すメッセージが表示されます。この一連の処理は、わずか数秒程度で実行されます。

注: Site Extensions の自動更新機能は UI によって動作します。

Bower を使用して導入する

Bower を使用することもできます。その場合は、下記のコマンドを実行し Bower からスクリプトを実装します。

 bower install  azure-site-extension-updater

カスタマイズされた applicationHost.xdt ファイルの使用

Site Extensions 拡張機能で applicationHost.xdt ファイルを使用していない場合は、このセクションをお読みいただく必要はありません。applicationHost.xdt ファイルを使用している場合は、ご注意いただきたい点があります。

自動更新機能では、拡張機能の *.nuspec ファイルの ID が applicationHost.xdt ファイルで指定しているパスと一致している必要があります。

注: Site Extensions 拡張機能に applicationHost.xdt ファイルが含まれていない場合、Kudu によって適切なパスを指定する既定のファイルが生成されます。

*.nuspec ファイルの例

 <?xml version="1.0"?>
<package >
  <metadata>
    <id>MySiteExtension</id>
    <version>7.0.0</version>
    <authors>ZainRizvi</authors>
    <owners>ZainRizvi</owners>
    <licenseUrl>https://www.github.com/zainrizvi/mysite/license</licenseUrl>
    <projectUrl>https://www.github.com/zainrizvi/mysite</projectUrl>
    <iconUrl>https://www.github.com/zainrizvi/mysite/image.ico</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2015</copyright>
    <tags>Tag1 Tag2</tags>
  </metadata>
  <files>
    <file src="\**\*.*" target="content" />
  </files>
</package>

applicationHost.xdt ファイルの例

 <?xml version="1.0"?>
<configuration xmlns:xdt="https://schemas.microsoft.com/XML-Document-Transform">
  <system.applicationHost>
    <sites>
      <site name="%XDT_SCMSITENAME%" xdt:Locator="Match(name)">
        <application path="/MySiteExtension" xdt:Locator="Match(path)" xdt:Transform="Remove" />
        <application path="/MySiteExtension" applicationPool="%XDT_APPPOOLNAME%" xdt:Transform="Insert">
          <virtualDirectory path="/" physicalPath="%XDT_EXTENSIONPATH%" />
        </application>
      </site>
    </sites>
  </system.applicationHost>
</configuration>

制限事項

自動更新スクリプトには注意点が 2 つあります。

  1. 自動更新スクリプトの JavaScript ファイルはブラウザー内で実行される必要があるため、ユーザーが拡張機能の更新版を入手するためには、スクリプトをインポートするページにユーザーがアクセスする必要があります。このため、Site Extensions 拡張機能の自動更新は UI ベースでのみ可能です。
  2. 更新は Kudu (SCM) サイト (英語) に対して API 呼び出しを行うことにより実行されますが、この Kudu サイトにアクセスする際にはユーザー認証が必要です。したがって、Site Extensions 拡張機能のパスが Kudu サイト外に変更されている場合 (拡張機能のパスが https://<サイト名>.scm.azurewebsites.net/… でない場合)、必要な認証情報が不足するため自動更新が実行されません (既定では、Site Extensions 拡張機能のパスには Kudu サイト内の場所が指定されています)。

 

しくみ

このスクリプトは、ページの URL を解析して Site Extensions 拡張機能の名前を認識します。たとえば、拡張機能のパスが下記のように指定されているとします。

  https://<サイト名>.scm.azurewebsites.net/MySiteExtension/

この場合スクリプトは、拡張機能の名前が「MySiteExtension」であると認識します。

スクリプトはこの名前を使用して、2 つの API 呼び出しを Kudu サイトに対して実行し、拡張機能の更新版があるかどうかを確認します。更新版が存在する場合は、スクリプトが Kudu に対して下記の要求を送信し、最新バージョンをインストールするように指示します。

 PUT https://<サイト名>.scm.azurewebsites.net/api/siteExtensions/<Site Extensions 名>

 

これは、Site Extensions ギャラリーで [update] ボタンをクリックしたときに送信される要求と同じものです。

詳細については、GitHub プロジェクトのページ (英語) をご覧ください。ソース コードの全文もこちらでご確認いただけます。

今回の記事を皆様の開発にお役立ていただけますと幸いです。