kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Azure DevOps 2021年を振り返る

Azure DevOpsアドベントカレンダー最終日の記事です。書いていただいた&読んでいただいた皆様ありがとうございました。

qiita.com

今年の振り返り的なやつをAzure DevOps Feature Timelineみながらつらつらと。十大ニュースというほどもないはずなので、5大ニュースくらいでしょうか。

サービス継続性

https://status.dev.azure.com/_historyで振り返ることができます。Last Yearでフィルタリングしても直近100件しか出ない😥。最後が8/17なので、250近くのサービス低下があったと考えられます。US Regisonでは100件以上、APACだと28件😲。RCA(事後分析レポート)が出ている障害はなかったのですが、macOS agentが4日間ほどサービス低下していた件が直ったのが12/20なので、これはそのうち出るんじゃないかなと思います。

Azure DevOpsは複数のサービスで動いていますが、サービスはUSにしかないものがあるのかもしれないので、一概に「APACにおいていれば大丈夫」とは言えないかもしれませんがネットワーク的に近い場合、APAC選んでもいいかもしれないですね。最近は海底ケーブルどんどん施設されているので、USのほうがレイテンシー小さいことがあるかもしれません。

Azure Pipelines無料枠が申請式になる

docs.microsoft.com

docs.microsoft.com

なんといっても今年一番のニュースと言ったらこれになるでしょう。昨年末からBitCoinが高騰したことにより、こういったCIサービスの無料枠が狙われることになりました。Azure Pipelinesだけではなく、GitHub ActionsやCircle CIでも同じことが起きています。

github.blog

circleci.com

MSとしてはGitHub Actionsの方を中心に防御することにして、Azure Pipelinesの無料枠は申請式になりました。最初は申し込んでもなかなか通らなかったそうですが、今は落ち着いているようです。いい感じの機械学習モデルができたら元に戻すという話なので、期待して待ちたいと思います。

Delivery Plans 2.0が正式版になる

docs.microsoft.com

拡張機能として好評を博していたDelivery Plansが本体機能として正式版になりました。今年唯一ちゃんと作った😅新機能なんじゃないかな?本体に入ったことにより新機能や性能もよくなりました。Boardsの紹介するときは必ず入れています。

Pipelines Agent OSのEOLによる入れ替え続く

docs.microsoft.com

docs.microsoft.com

docs.microsoft.com

Windows, Ubuntu, macOSどのエージェントも古いバージョンがリタイアします。Brownout(わざと失敗させること)による警告が予定されているものもありますので、注意しておきましょう。WindowsとUbuntuはそうでもないですが、macOSはほぼ毎年更新されてリタイアすることになるので気を付けましょう。

docs.microsoft.com

docs.microsoft.com

Windows Server 2022とmacOS 11が追加されました。

Azure ReposもProtected Source対象になりました

docs.microsoft.com

個人的に気に入っている機能なのですがAzure DevOpsの各種リソースを保護対象にできます。今回はそれがReposにも広がったということですね。リリース用のtempleteを別のリポジトリに入れている時とか便利に使えますね。

PAT管理の自動化がサポートされる

docs.microsoft.com

docs.microsoft.com

小粒ですが、今までPAT(Personal Access Token)は最長一年だったので証明書と同様「忘れたころにトラブルが起きる」ものでした。Azure ADで動いているorganizationに限られるのですが、組織として運用すると担当者の引継ぎでミスしやすいところなのでうれしい機能ですね。

Azure Pipelinesのこまごました機能追加

docs.microsoft.com

docs.microsoft.com

docs.microsoft.com

派手な機能追加はなかったのですが、地味な使い勝手の改善は少しずつ行われてきました。Pipeline Decoratorとか個人的にものすごく好きな機能です。

docs.microsoft.com

一方セキュリティの強化として、自動的にEnvironmentsが作られるのが抑制されたのはいいことではあるのですが非互換としては対応必要で厳しかった人もいるのかなと思います。

まとめ

この一年もあまり主だった(目を引きやすい)わかりやすい機能強化は少なかったのですが、使っていて不便だとかセキュリティ&コンプライアンス強化のためのメンテナンスが続くという感じですね。Azure Managed IdentityのサポートOffice文書のプレビューk8sベースのセルフホストエージェントが予定されているで、この辺は期待ですね。

では来年もよろしくお願いします。

続:Azure PipelinesからのAzure Load Testingでパラメータを渡す

ついでにAzure DevOpsアドベントカレンダー20日目にしてしまいましょう。

qiita.com

kkamegawa.hatenablog.jp

の続きで、こちらの記事で「パラメータ渡せない」とあったので調べてみました。

gooner.hateblo.jp

同じパイプラインにダミーでenvを追加してみましたが、invalid jsonにもならずにうまく行ってますが…うーん🤔。私はWeb画面で編集してしまいましたが、VS Codeとか使うとエラーになるのかも?

       - task: AzureLoadTest@1
          inputs:
            azureSubscription: 'AzureLoadTest'
            loadTestConfigFile: '$(System.ArtifactsDirectory)/myWebsiteName/azure-load-testing.yml'
            resourceGroup: 'demo1204'
            loadTestResource: 'kazloadtest'
            env: |
              [
                {
                  "name": "webapp001",
                  "value": "https://webapp001.exsample.jp"
                }
              ]
 

f:id:kkamegawa:20211220182834p:plain

Azure DevOps 2021/12/6の更新

f:id:kkamegawa:20211218182956p:plain

この記事はAzure DevOpsアドベントカレンダー18日目の記事です。すいません、Test Planのこと書くつもりでちょっと間に合いませんでした。気づいていなくてだいぶ遅くなりました。

qiita.com

オリジナルはこちらから読んでください。

docs.microsoft.com

今回はAzure PipelinesのHosted Imageの廃止に関する話だけですね。今年のリリースノートはおそらくこれで終わりでしょう。次のスプリントは年末年始にかかるので飛ばされるかもしれないですね。とはいえここしばらくは小幅なものばかりなので、BoardsのModern platformがGAになる話だけ出てくるのかもしれません。

古いWindows Server 2016および、macOS 10.14のイメージを使っている人は早急に移行しましょう。ということで三週間後。

Translate to Japanese to Azure DevOps release not…

Azure Pipelinesから Azure Load Testingの負荷テストを実施する

f:id:kkamegawa:20211211130329p:plain この記事はAzure DevOpsアドベントカレンダー12日目の記事です。

qiita.com

Azure Load Testingについて

先日、Azure Load Testingという新しいサービスがプレビュー公開されました。はっきり言ってしまえばJMeterのマネージドサービスです。

azure.microsoft.com

あれ、Azure DevOpsにもLoad Testがあったよね?と思われるかもしれませんが、ありました。そして2020/3/31にディスコンになりました。

azure.microsoft.com

Visual Studioと統合されていて、VSのロードテスト機能からも使えて便利だったのですが引退してしまい、ちょっと困っていました。何回か紹介したことがあります。

kkamegawa.hatenablog.jp

kkamegawa.hatenablog.jp

今ではほかのマネージドサービスを使うか、pnopさんが出しているカスタムイメージ使うか、というくらいでしたが、新しいオプションとして選択できそうです。

www.pnop.co.jp

ちょっと試してみましょう。注意事項としてjmxファイルの内容(サンプラー名やコントローラー名といったメタデータ)は英語で書きましょう。最初日本語で書いていてLoad TestがAcceptedのままずーっと動かなくて悩みました。もしかして、と思って英語に変えたらあっさり動きました。JmeterのUIを日本語にすると自動的に日本語のメタデータが入っていしまうので、英語で使うことをお勧めします。

そういえばAzure DevOps Load Testのときも同じことで悩んでいたような…。jmeterのインストールはchocolateyやmacOSの場合はHomeBrewでできるので省略(いまだにJRE 8をペアで入れさせられるのには閉口しますが…)。そういえば、macOSでjmeterのファイル保存できないのLook & Feelを変えないといけないって誰が気付くんだ。

ポータルから作成する

f:id:kkamegawa:20211208060542p:plain

ポータルから作成します。

f:id:kkamegawa:20211208060549p:plain

サブスクリプション、名前、リージョンを設定します。今のところ限られたリージョンだけですが、米国中南部を選んでみます。Load Testingの枠としてはこれだけなのですぐ作成すればOKです。

ポータルからテストを実行する

Test Plan, Parameter(実行時パラメータ), テスト合格基準、モニタリングなどポータルから設定します。

f:id:kkamegawa:20211208060622p:plain

テスト名は任意。Run after creationにチェックがあるとすぐに実行されます。

f:id:kkamegawa:20211208060626p:plain

ここで作っておいたjmxファイルをアップロードします。くれぐれもリスナー名やクライアント名に日本語を使わないようにしましょう(重要なことなので繰り返し)。

f:id:kkamegawa:20211208060630p:plain

実行時パラメータがあれば指定します。

f:id:kkamegawa:20211208060634p:plain

実行エンジン数を指定します。4を指定すれば1000スレッドまでかけられるようですね。jmxでは250スレッドまでなので、それをいくつの実行エンジンでスケールするかということのようです。

f:id:kkamegawa:20211208060650p:plain

ここでエラー基準を決めます。注意事項としてWeb Appsのお安い(FとかDとか)インスタンスではウォームアップの時間が必要になるので、ここにあるように応答時間(Response Time)に100msなどの短い時間を指定していると初回実行が間に合わなくて失敗します。

f:id:kkamegawa:20211208060642p:plain

モニタリングするリソースを選択します。

f:id:kkamegawa:20211208060654p:plain

作成したら即実行が始まります。

f:id:kkamegawa:20211208060658p:plain

f:id:kkamegawa:20211208060701p:plain

こんな感じで結果が見えます。failedになっているのは上で書いた通り実験用の環境でWeb Appsのウォームアップが間に合ってないからです😅。実行には気を付けて。さて、CI/CDで実行するための準備をします。

CI/CDのためにロール割り当てを設定する

Azure Load Testingはプレビューだからか作っただけではAzure Pipelinesから呼び出せません。ロール割り当てをします。

f:id:kkamegawa:20211208060555p:plain

いつものようにService Connectionを作成して、Azure Load Testingのリソースグループを割り当てます。Manage Service Principalをクリックしてアプリケーションを表示して、アプリケーション表示名をコピペします。

f:id:kkamegawa:20211208060607p:plain

Load Testing Contributorにアプリ追加します。

f:id:kkamegawa:20211208060617p:plain

こんな感じで割り当て終わりです。

Azure Pipelinesから呼び出す。

marketplace.visualstudio.com

Marketplaceからタスクを追加します。実行する前に以下の二つをどこかのレポジトリにコミットしておかなくてはなりません。

  1. Azure Load Testingを実行するテストケースを記述したYAMLファイル
  2. JMeterのjmxファイル

アプリケーション外部のレポジトリでもいいですし、一緒でもいいでしょう。ただし、「Webアプリケーションはこういう基準で動かなければならない」ということが品質のルールで決められているとしたらレビューする人たちにも参照可能な外部レポジトリを用意しておくのがいいかもしれませんね。

jmxファイルも同様です。

サンプルのAzure Load Testing実行するためのYAMLです。

version: v0.1
testName: SampleTest
testPlan: sample1.jmx
description: 'Load test website home page'
engineInstances: 1
failureCriteria:
  - avg(response_time_ms) > 300
  - percentage(error) > 50

CSVでパラメータ指定も可能です。testPlanにはこのYAMLから参照可能なパスで指定してください。ここでは同じフォルダーにダウンロードしているのでパス指定はありません。

f:id:kkamegawa:20211209173720p:plain

YAMLで実行するステージを切り出すとこんな感じですね。

  - stage:
    dependsOn: Deploy
    condition: succeeded()
    jobs:
    - job: LoadTest
      pool:
        vmImage: 'Ubuntu-latest'
      steps:
        - task: DownloadBuildArtifacts@0
          displayName: 'Download Artifact'
          inputs:
            buildType: 'current'
            downloadType: 'single'
            artifactName: 'myWebsiteName'
            downloadPath: '$(System.ArtifactsDirectory)'
        - task: AzureLoadTest@1
          inputs:
            azureSubscription: '{サービス接続名}'
            loadTestConfigFile: '$(System.ArtifactsDirectory)/myWebsiteName/azure-load-testing.yml'
            resourceGroup: '{リソースグループ名}'
            loadTestResource: '{ロードテスト名}'
        - publish: $(System.DefaultWorkingDirectory)/loadTest
          artifact: results

ここでは明示的に別ステージにしています。通常デプロイが成功したらこの手のテストを実行するので、dependsOnにデプロイ用のステージを指定して、conditionsucceeded()を指定しています。

なぜDownloadBuildArtifactsタスクがあるのかと思うかもしれませんが、ステージが異なるとartifactの参照ができません。明示的にダウンロードしてくる必要があります。なので、YAMLとjmxはCopyFilesタスクでBuild.ArtifactStagingDirectoryにコピーして、PublishBuildArtifactsタスクで発行しなくてはなりません。デプロイされるアプリケーションとは別のartifactsにしておく方が望ましいかもしれませんし、同じテストを繰り返すという意味では一緒のほうがいいかもしれません。ここはお好みですかね。

最後のpublish: $(System.DefaultWorkingDirectory)/loadTestでテスト結果を発行しています。

f:id:kkamegawa:20211209173724p:plain

成功するとこんな感じですね。ログにhttpの応答時間や、View the load test run in progress atでAzureポータルのリンクが出ているのでワンクリックで結果が見えます。

f:id:kkamegawa:20211209173727p:plain

ポータルと同じようにYAMLに設定したfailureCriteriaが満たせない場合、ビルドが失敗したと表示されます。

f:id:kkamegawa:20211209173731p:plain

Azureポータルでもこんな風に失敗となります。

注意事項

  • Public InternetにあるURLに対して実施するものなので、閉域にあるサービスに対してはかけられません。JMeterのカスタムイメージ使いましょう。
  • jmxは英語で書きましょう
  • 実施可能なデータセンターの場所が限られていますので、応答時間気にするサービスで日本になくてはならないものだとちょっと注意が必要です。
  • YAMLのステージ分割は必須になる
  • YAMLとjmxをレポジトリに入れて、artifactsとしておくのを忘れずに