Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Azure Devops の bash で envしたときの値

タイトル通りの備忘録、vmImage は、 ubuntu-latest です。

##[section]Starting: Bash
==============================================================================
Task         : Bash
Description  : Run a Bash script on macOS, Linux, or Windows
Version      : 3.151.3
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash
==============================================================================
Generating script.
========================== Starting Command Output ===========================
[command]/bin/bash --noprofile --norc /home/vsts/work/_temp/e71081de-9d69-489d-b250-e78785b008ac.sh
BUILD_SOURCEBRANCH=refs/heads/master
SYSTEM_TEAMFOUNDATIONCOLLECTIONURI=https://dev.azure.com/hogehoge/
SYSTEM_TASKDEFINITIONSURI=https://dev.azure.com/hogehoge/
SYSTEM_JOBATTEMPT=1
AGENT_VERSION=2.155.1
LEIN_HOME=/usr/local/lib/lein
BUILD_QUEUEDBY=Microsoft.VisualStudio.Services.TFS
SYSTEM_COLLECTIONURI=https://dev.azure.com/hogehoge/
SYSTEM_HOSTTYPE=build
GOROOT_1_11_X64=/usr/local/go1.11
SYSTEM_JOBPARALLELISMTAG=Private
BUILD_REPOSITORY_GIT_SUBMODULECHECKOUT=False
ANDROID_HOME=/usr/local/lib/android/sdk
GOROOT_1_9_X64=/usr/local/go1.9
BUILD_STAGINGDIRECTORY=/home/vsts/work/1/a
RUNNER_TOOLSDIRECTORY=/opt/hostedtoolcache
AGENT_MACHINENAME=fv-az103
KEY_SECUREFILEPATH=/home/vsts/work/_temp/0DBA5D69E52A419E6EEC62AD51B1CF407F55ECC2.asc
SYSTEM_WORKFOLDER=/home/vsts/work
COMMON_TESTRESULTSDIRECTORY=/home/vsts/work/1/TestResults
GRADLE_HOME=/usr/share/gradle
AGENT_JOBNAME=Test_Build
ANDROID_SDK_ROOT=/usr/local/lib/android/sdk
MSDEPLOY_HTTP_USER_AGENT=VSTS_2978d119-f2d9-4265-b996-67b5d046d383_build_3_0
JAVA_HOME_8_X64=/usr/lib/jvm/zulu-8-azure-amd64
AGENT_OSARCHITECTURE=X64
BUILD_SOURCEVERSIONAUTHOR=foo bar
BUILD_REQUESTEDFOREMAIL=hoge@example.com
GENT_ACCEPTTEEEULA=True
SYSTEM_STAGEATTEMPT=1
ANT_HOME=/usr/share/ant
GIT_TERMINAL_PROMPT=0
SYSTEM_DEFINITIONNAME=test-project-build
SYSTEM_CULTURE=en-US
JAVA_HOME_11_X64=/usr/lib/jvm/zulu-11-azure-amd64
AGENT_TEMPDIRECTORY=/home/vsts/work/_temp
BUILD_REPOSITORY_CLEAN=False
BUILD_REPOSITORY_PROVIDER=TfsGit
BUILD_SOURCEBRANCHNAME=master
USER=vsts
SYSTEM_JOBIDENTIFIER=Build.Test_Build.__default
SYSTEM_TEAMFOUNDATIONSERVERURI=https://dev.azure.com/hogehoge/
TF_BUILD=True
SYSTEM_TASKDISPLAYNAME=Bash
AZURE_HTTP_USER_AGENT=VSTS_2978d119-f2d9-4265-b996-67b5d046d383_build_3_0
BUILD_QUEUEDBYID=00000002-0000-8888-8000-000000000000
SYSTEM_STAGENAME=Build
ImageVersion=157.1
AGENT_DISABLELOGPLUGIN_TESTRESULTLOGPLUGIN=true
AGENT_ROOTDIRECTORY=/home/vsts/work
VSTS_PROCESS_LOOKUP_ID=vsts_cb8bf79f-6a51-484b-96bc-c52beebf5333
SYSTEM_TEAMPROJECTID=e4548d85-1016-40fb-bf68-213e2fcce2e6
AGENT_HOMEDIRECTORY=/home/vsts/agents/2.155.1
SYSTEM_TEAMPROJECT=test-project
AGENT_TOOLSDIRECTORY=/opt/hostedtoolcache
BUILD_SOURCEVERSIONMESSAGE=Update azure-pipelines.yml for Azure Pipelines
BUILD_REPOSITORY_ID=8b48d9e0-132e-40ed-a795-0c28536e6cb5
agent.jobstatus=Succeeded
BUILD_REPOSITORY_LOCALPATH=/home/vsts/work/1/s
SYSTEM_JOBDISPLAYNAME=Test_Build
BUILD_REASON=IndividualCI
SYSTEM=build
AGENT_BUILDDIRECTORY=/home/vsts/work/1
SYSTEM_PIPELINESTARTTIME=2019-08-30 02:08:22+00:00
BUILD_SOURCESDIRECTORY=/home/vsts/work/1/s
AGENT_OS=Linux
DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
PATH=/usr/share/rust/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
SYSTEM_PHASEATTEMPT=1
LEIN_JAR=/usr/local/lib/lein/self-installs/leiningen-2.9.1-standalone.jar
SYSTEM_ISSCHEDULED=False
VSTS_AGENT_PERFLOG=/home/vsts/perflog
PWD=/home/vsts/work/1/s
BUILD_BUILDURI=vstfs:///Build/Build/73
SYSTEM_PULLREQUEST_ISFORK=False
INPUT_ARGUMENTS=
CONDA=/usr/share/miniconda
GOROOT_1_10_X64=/usr/local/go1.10
SYSTEM_DEFINITIONID=3
JAVA_HOME=/usr/lib/jvm/zulu-8-azure-amd64
AGENT_DISABLELOGPLUGIN_TESTFILEPUBLISHERPLUGIN=true
SYSTEM_STAGEID=6884a131-87da-5381-61f3-d7acc3b91d76
VCPKG_INSTALLATION_ROOT=/usr/local/share/vcpkg
JAVA_HOME_7_X64=/usr/lib/jvm/zulu-7-azure-amd64
JAVA_HOME_12_X64=/usr/lib/jvm/zulu-12-azure-amd64
SYSTEM_ENABLEACCESSTOKEN=SecretVariable
LANG=en_US.UTF-8
SYSTEM_TASKINSTANCENAME=Bash
SYSTEM_PHASEDISPLAYNAME=Test_Build
SYSTEM_SERVERTYPE=Hosted
BUILD_REPOSITORY_NAME=test-project
GOROOT_1_12_X64=/usr/local/go1.12
BUILD_REPOSITORY_URI=https://hogehoge@dev.azure.com/hogehoge/test-project/_git/test-project
PIPELINE_WORKSPACE=/home/vsts/work/1
AGENT_WORKFOLDER=/home/vsts/work
BUILD_DEFINITIONNAME=test-project-build
SYSTEM_JOBNAME=__default
BUILD_REQUESTEDFOR=foo bar
SYSTEM_ARTIFACTSDIRECTORY=/home/vsts/work/1/a
SYSTEM_TIMELINEID=06e8a6f5-c63c-4215-9467-2157ead94a3a
SHLVL=1
AGENT_ID=8
M2_HOME=/usr/share/apache-maven-3.6.1
BOOST_ROOT_1_69_0=/usr/local/share/boost/1.69.0
HOME=/home/vsts
GOROOT=/usr/local/go1.12
AGENT_RETAINDEFAULTENCODING=false
JDKVERSIONOPTION=1.8
SYSTEM_JOBPOSITIONINPHASE=1
BUILD_REQUESTEDFORID=8c49f8fe-d3e4-4ef7-8054-a6556f864dc4
BUILD_BINARIESDIRECTORY=/home/vsts/work/1/b
BUILD_ARTIFACTSTAGINGDIRECTORY=/home/vsts/work/1/a
BUILD_BUILDID=73
SYSTEM_TASKINSTANCEID=19971af4-fe77-501e-3b0e-49e78c139014
BUILD_SOURCEVERSION=aead9c9fa1a6f6e7b0978e9a9992566f2eda4a34
CHROME_BIN=/usr/bin/google-chrome
BOOST_ROOT=/usr/local/share/boost/1.69.0
SYSTEM_DEFAULTWORKINGDIRECTORY=/home/vsts/work/1/s
SYSTEM_JOBID=e4da4a28-3e47-5b33-a32e-48e227b26997
SYSTEM_TOTALJOBSINPHASE=1
AGENT_NAME=Hosted Agent
SYSTEM_STAGEDISPLAYNAME=Build
SYSTEM_PLANID=06e8a6f5-c63c-4215-9467-2157ead94a3a
BUILD_DEFINITIONVERSION=2
SYSTEM_PHASEID=5a5c60a4-7e04-5ed9-3b32-2033c226d379
SYSTEM_COLLECTIONID=2978d119-f2d9-4265-b996-67b5d046d383
AGENT_JOBSTATUS=Succeeded
TASK_DISPLAYNAME=Bash
ENDPOINT_URL_SYSTEMVSSCONNECTION=https://dev.azure.com/hogehoge/
XML_SECUREFILEPATH=/home/vsts/work/_temp/settings.xml
BUILD_BUILDNUMBER=20190830.7
SYSTEM_PHASENAME=Test_Build
BUILD_CONTAINERID=2861896
ISGITHUBTAG=False
_=/usr/bin/env

色々なAzure WebApps に Spring Boot アプリケーションをデプロイする方法

Azure WebAppsへのデプロイは azure-webapp-maven-plugin でやっているのですが、いつも色々細かい設定を忘れがちなので、備忘録にまとめました。

github.com

以下README転載気味

色々なAzure WebApps に Spring Boot アプリケーションをデプロイする方法

Azure WebApps は複数のOS(Windows、Linux)と複数のアプリケーションコンテナをサポートしています。それぞれのAzure WebAppsにデプロイする最小コードのサンプルです。

以下の組み合わせを想定しています

  • Windows

    • Jetty (jar)
    • Tomcat 8.5 (war)
  • Linux

    • JRE (jar)
    • Tomcat 8.5 (war)

最小サンプルは、JSON を返却する RestControllerです。

デプロイ方法

pom.xml(共通)

azure-webapp-maven-plugin を利用しています。Web Appsの構成は pom.xml に記述されています。mvn azure-webapp:config で再構成が可能です。またconfiguration 要素を削除してから実行すると、初期設定可能です。

最小限、各々の pom.xml の以下を書き換えてください。

appName 要素 は、 Azure WebApps のドメインです。Azure全体で一意な必要があるため、そこだけは書き換える必要があります。

resourceGroupappServicePlanName また、pricingTierregion は任意に書き換えればよいです。

各要素の詳細は、 Maven Plugin for Azure App Service | Microsoft Docs のリファレンスを参照のこと。

サブスクリプション

az コマンドであらかじめAzureサブスクリプションにログインする必要があります。サブスクリプションが複数ある場合は、一覧の IsDefaultTrue なものに作られますので、デフォルトに注意してください。

az account login
az account list -o table 

実際の操作

linux jre8

WebApps on Linux に Spring Boot の jar をデプロイするサンプルです。

mvn clean package azure-webapp:deploy

とAzure上にリソースが作成され、デプロイされます。リソースが作成済みの場合はそれが利用されます。ブラウザや curl でURLを叩くとJSONのレスポンスが取得できます。

curl https://foobar.azurewebsites.net/hello?name=world

Windows jetty

WebApps on Windows に Spring Boot の jar をデプロイするサンプルです。コンテナがJettyになっています。

オペレーションはlinux jre8 と同様です。

Linux Tomcat 8.5

WebApps on Linux に Spring Boot の war をデプロイするサンプルです。jar をデプロイする場合との差分を説明します。

SpringBootServletInitializer を継承します。これがないとデプロイは成功しますが起動しません。 war からSpring Bootアプリケーションを起動するときには必須です。それに加えconfigure メソッドをオーバーライドします(しなくても実行できたけど)。

また、pom.xml<packaging>war</packageing> を定義します。詳細はサンプルを参照してください。

以下でデプロイします。spring boot plugin を削除するのが面倒だったので(ローカルでrunしたかったので)、リパッケージをスキップしてます。

mvn clean package azure-webapp:deploy -Dspring-boot.repackage.skip=true

サンプルでは sample コンテキストにデプロイするようになっています。ROOTコンテキストにデプロイしたい場合は、configuration 配下の以下の要素を削除してください。

<targetPath>${project.build.finalName}</targetPath>

curl を実行してレスポンスを確認します。

curl https://foobar.azurewebsites.net/sample/hello

Tomcatですとデプロイしてからレスポンスが返ってくるまで少し時間がかかりるみたいです。

Windows Tomcat 8.5

Linux の場合と同じです。

以上

最近のAzure Client SDK事情 Java編

Azure storage SDK for java V10 (その1) - Azureの小ネタ (改) で言及したように、V8から大幅変更されたV10がリリースされてから約一年たちましたが、V10系(現在はV11)の失敗を認めて、V12系を新規に立ち上げるようです。

V10を試してみたとき使いにくいSDKだなとは思っていたのですが、 こんな Issue まで立てられるしまつ。 This API is useless (v10) · Issue #432 · Azure/azure-storage-java

そして以下のようなリリースを見つけました。(この記事執筆時点で5 days ago なので、そこそこ早く見つけた感)

azure-storage-java/V12 Upgrade Story.md at master · Azure/azure-storage-java

そもそもV8では

そのそもV8ではBlob/Queue/Tableなどすべての機能が入っておりフィットプリントの大きさや、スレッドセーフ、オブジェクトの不変性、同期APIベースなどが問題になりV10への移行が決定したわけですが、V10では少々やり過ぎて、ホントにREST APIに薄い皮が被ったラッパーAPIと化した感じでしたし、非同期APIしかなかったし。

V10になって

先ほどの文書を多少意訳しますと以下のような感じです。

  • 大規模なアプリでのネットワーク不安定 Rx-Netty実装の結果
  • 同期APIの非サポート
  • 扱いにくく、直感的でな設計(クラス)
  • 利便性の欠如(まあ、SDKは便利なAPIをサポートしてなんぼという気もしますが、コンテナのexistsメソッドもなかったですし)

V12では

V12ではこれらを反映して、同期、非同期の両APIサポート、フレームワークライブラリ変更(RxJavaからReactor、okhttp から Reactor-Netty などなど。

その他、色々と反省の弁が書かれていますので、ぜひご一読を(Google翻訳で普通に読める感じに翻訳されますw)

ライブラリは既に公開されていますので、例によってコンテナ作ってファイルをアップロードするサンプルの破片など。名前空間は、com.azureに変更されてます。MavenのGroupIdもcom.microsoft.azureからcom.azureへ。

SharedKeyCredential creds = new SharedKeyCredential(accountName, key);
        
        StorageClient client = new StorageClientBuilder()
                .credential(creds)
                .endpoint("https://" + accountName + ".blob.core.windows.net").buildClient();

        ContainerClient containerClient = client.getContainerClient("hoge");
        if (containerClient.exists().value() == false) {
            containerClient.create();
        }

        BlockBlobClient blobClient = containerClient.getBlockBlobClient("blob.txt");
        blobClient.uploadFromFile("c:/temp/a.pdf");

ちなみに、V8系, V10系はともにメンテナンスは継続されるとのこと。ではでは。

[追加]

ソースのありか。READMEにサンプルが書かれてます。

azure-sdk-for-java/sdk/storage/azure-storage-blob at master · Azure/azure-sdk-for-java · GitHub