Azure DevOps Pipelinesでデスクトップアプリをローカル環境へデプロイしてみたよ

本ページにはプロモーションが含まれています。

お仕事

こんちわ。seiです。今日のお題は、CI/CDツールのマリー・セレスト状態、Azure DevOpsです。

そんなAzure DevOpsサービスの中のPipelinesについてです。このPipelinesでセルフホステッドエージェントを構築して自分のクライアントをビルドマシンとし、自分の端末にアプリをデプロイできるか試してみた記録になります。しかもアプリはWEBアプリではなくWindowsデスクトップアプリです。


CI/CDというとどうもWEBアプリやWEBサイトだけのものといった感があり、Windowsデスクトップアプリは蚊帳の外っぽい雰囲気で情報も少ないんですよね。

そんなWindowsデスクトップアプリでもAzure DevOpsでここまでできるんだぜ!!っというのを検証してみようと思います。

プロキシ環境下で体験したハマり情報なんかも記述したいと思います。

やりたいこととか

それではAzure DevOpsを利用して以下のことを行っていきたいと思います。

  • Azure DevOpsのリポジトリに対してコミットを行う。
  • PipelinesのBuildsによりソースコードが自端末上でビルドされる。
  • PipelinesのReleasesによりビルドされたデスクトップアプリが自端末のローカルディスクにデプロイされる。

制約、前提は

  • Azure DevOpsアカウントを取得し、組織が作成済みである。
  • Azure DevOpsのプロジェクトが作成されており、Reposにビルド可能なソリューションが登録されている。
  • ビルド端末でアプリのビルドができる(Visual Studioが入ってるとか。ちなみに自分の環境はVisual Studio 2019 Community導入済み)

て感じでしょうか。

セルフホステッドエージェントの準備

まずは、自端末でビルドを行うことができるようにセルフホステッドエージェントをセットアップする必要があります。通常であればMicrosoft Azure上のVMをエージェントとしてビルドやリリースを行うことができますが、オンプレ環境にビルドマシンを用意することでローカル環境でビルドを行うことができます。ちなみに、Azure上のVMをエージェントとすると無料枠はビルド時間1800分/月という制限がありますが、セルフホステッドエージェントであればビルド時間には制限ありません。

PATの作成

まずはPAT(Personal Access Token)と呼ばれる個人用のセキュリティキーを用意する必要がありんす。

①自アカウントから「Security」を選択する。

②[Personal Access Tokens]の画面が表示されるので、「+New Token」をクリックする。

③以下の画面が表示されるので、「Name」に適当な名前を入力後、「Show all scopes」をクリックする。有効期限なんかも設定できます。とりあえずデフォルトで。

④Agent Poolsの「Read & manage」、Deployment Groupsの「 Read & manage 」にチェックを付け、「Create」をクリックする。

⑤Success!が表示され、PATの作成が完了しました。以下のマークをクリックしてPATをクリップボードにコピーしてよしなに。ちなみに、このPATを紛失した場合はRegenerateできますが再表示はできません。エージェントとかにも再セットが必要になると思いますので取り扱いにはご注意を。

⑥一覧に作成したPATが表示されていればOKです。

セルフホステッドエージェントのセットアップ

次に自端末にエージェントをインストールして、Azure DevOpsサービスと自端末が連携できるようにします。今回はエージェントをサービスとしてPC起動と同時に実行させるようにします。

①自分のAzure DevOps組織のプロジェクトサイトから「Project settings」を選択する。

②「Agent pools」を選択し、「Default」のエージェントを選択後、右上の「New agent」をクリックする。

③以下の画面が表示されます。ビルドマシンのOSやアーキテクチャを選択後、「Download」をクリックし、ダウンロードしたファイルを適当なディレクトリに保存&解凍を行う。ここでは、D:\Agentというディレクトリを作成し、そこに保存後、解凍を行いました。下のPowerShellコマンドでやらなくてもOKですよ。

④解凍されたフォルダーをエクスプローラで開き、[ファイル]-[Windows PowerShellを開く]-[Windows PowerShellを管理者として開く]を選択し、そのディレクトリでPowerShellを実行する。

⑤PowerShellで「.\config」と入力し、Enterキーを押下する。

プロキシ環境の場合は「.\config –proxyurl http://プロキシサーバーアドレス:ポート番号」とコマンド入力を行う必要があります。ちなみにプロキシサーバー指定しないで実行した場合は「サーバーに接続しています...」から先に進みませんでした。

あとは言われたものを入力していく。

サーバーURLを入力する >https://dev.azure.com/(自組織名)を入力
認証の種類を入力する >そのままEnterキーでOK
個人用アクセストークンを入力する >PAT作成手順で取得したPATをコピペする
エージェントプールを入力する >そのままEnterキーでOK
エージェント名を入力する >そのままEnterキーでOK
作業フォルダーを入力する >そのままEnterキーでOK
エージェントをサービスとして実行しますか? >Yを入力
サービスに使用するユーザーアカウントを入力する >適当なユーザーアカウントを入力
アカウントのパスワードを入力する >ユーザーアカウントのパスワードを入力

⑥これでエージェントの作成が完了です。エージェントが走り出していれば、Azure DevOpsのAgent Poolsでオンラインかどうかが判別可能です。

CI(継続的インテグレーション)の実現

自端末にエージェントをセットアップしたらここからはPipelinesの出番です。Azure DevOpsでCIを回すためにはPipelinesのBuildsを登録します。Buildsを構築することで、リポジトリへのコミットをトリガーにソースコードのビルド~ユニットテスト(テストプロジェクトがある場合)までを実行してくれます。

①Azure DevOpsプロジェクトサイトの[Pipelines]-[Builds]を選択し、「New pipeline」を選択します。

②次にソースコードが存在する場所を選択します。Azure DevOpsのプライベートリポジトリ内で管理しているため、「Azure Repos Git」を選択します。

③リポジトリを選択します。今回は「SelfHostedCICD」という名前のプロジェクトなのでそのまま選択します。

④ビルドパイプラインのテンプレートを指定します。今回はWindowsデスクトップアプリケーションですので「.NET Desktop」を選択します。結構な数のテンプレートが存在し、このテンプレを選択すればビルドパイプラインはほとんどそのまま利用できます。すごい!

⑤選択したテンプレートのYAMLが表示されます。YAMLを修正することもできますが、ここでは特に変更は行わず右上の「Save and run」をクリックします。

⑥このまま「Save and run」をクリックします。ビルドパイプラインの初回実行が行われます。

⑦ビルドパイプラインが実行されすべてsucceededになっていればビルドパイプラインの構築は問題なしです。ちなみに今回はセットアップした自端末のエージェント上でのパイプライン実行ではありません。AzureのVM上での実行ですのでご注意を。

プロキシ環境下でエラーメッセージ「この要求の送信中にエラーが発生しました。リモート サーバーに接続できません。接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。 152.199.40.167:443」が出力され、NuGetCommandのタスクでRestoreに失敗する場合は、エージェント作成時に指定したユーザーを見直してみてください。自環境では「NETWORK SERVICE」でエージェントを実行していたら発生していました。様々なプロキシ設定を変更・見直しましたが改善せず、結果NETWORK SERVICEアカウントでは設定済みプロキシ情報にアクセスできずにNuGetコマンドに失敗していたというオチでした。

⑧そんでは、セルフホステッドエージェントでのパイプライン実行に切り替えます。[Builds]を選択し、右上の「Edit」をクリックします。

⑨YAMLの編集画面が表示されます。[Pool:]の項目の「vmImage: ‘windows-latest’」を「name: ‘Default’」に変更します。ちなみに「Default」はエージェントを登録したエージェントプールの名前です。

YAML変更前
YAML変更後

⑩さらにYAMLを修正します。パイプラインの一番最後に新しいタスクを追加します。右の[Tasks]から「Publish pipeline artifact」を選択します。似たようなタスクがいくつかあるのでお気をつけて。

⑪以下の画面になりますので、[Artifact name]に適当な名前を入力し、「Add」をクリックします。

ちなみにArtifactとは「成果物」のことで、ビルドによって出来上がったアセンブリ等のことです。 このArtifactをパイプラインで使用できるように発行するタスクを追加したことになります。

セルフホステッドエージェントに変更し、PipelineArtifactの発行を行うように修正したYAML

⑫「Queue」をクリックするとビルドパイプラインの実行キューに入ります。以下のメッセージが出てパイプライン実行に失敗する場合は「Authorize resources」をクリック後、もう一度「Queue」をクリックします。

無事、ビルドパイプラインの実行が完了したと思います。ここまででセルフホステッドエージェントを使用したCIが実現できました。とっても簡単。ちゃんと自分の端末でビルドパイプラインが実行されてますよね?

CD(継続的デリバリー)の実現

CIが実現できたので、あとはCDでアプリケーションをデプロイできれば最高です。ってことでやっていきます。Azure DevOpsでCDを担当するのはPipelinesのReleasesです。が、前手順のビルドパイプラインの実行に成功したところからリリースパイプラインの設定へ飛べますので続けて行っていきます。

①ビルドパイプラインの実行が成功した画面です。右上のロケットアイコン「Release」を選択します。

②Releasesの登録画面に遷移します。必要な項目は大体初期セットされています。テンプレートの選択ですが、クラウドサービスへのデプロイがほとんどです。Windowsデスクトップなんてテンプレートはありません。とほほですので、「Empty job」を選択します。

③ステージ名を適当に入力します。今回は「Production」と設定しました。

④[Stage]の中の「1 job,0 task」というリンクをクリックします。タスクが存在しないのでタスクの登録を行います。

⑤Agent jobの設定で、デフォルトはクラウドホステッドエージェントとなっているのをセルフホステッドエージェントに変更します。[Agent pool]のドロップダウンを「(Private)Default」に変更します。

⑥[Agent job]の右の「+」をクリックすると、[Add tasks]一覧が表示されるので、ここの[Deploy]から「Windows machine file copy」を選択し、「Add」をクリックします。

⑦タスク情報を設定していきます。[Source]欄の右の「…」をクリックします。

⑧[Select a file or folder]ダイアログが表示され、ビルドパイプラインでArtifactとした成果物が列挙されます。デプロイを行うファイルやフォルダーを選択します。今回は実行ファイルのみリリースしようと思いますので、「SelfHostedCICD.exe」を選択しました。「OK」をクリックします。

⑨ローカルディスクのデプロイ先のディレクトリです。エクスプローラーでパスをコピーします。デプロイ前ですのでからっぽの状態です。

⑩タスクの設定画面に戻り、「Machines」にリリース先のコンピューター名やIPアドレス、「Admin Login」はその端末の管理者権限のアカウント、「Password」はとりあえず「$(AdminPassword)」変数(※あとで設定します)、「Destination Folder」に先ほどエクスプローラーでコピーしたリリース先のディレクトリパスを入力します。

⑪前手順で設定した$(AdminPassword)変数を設定します。[Variables]を選択し、「+Add」をクリックします。

⑫[Name]に「AdminPassword」、[Value]にタスク実行ユーザーのパスワードを設定します。鍵マークをクリックすればシークレットになります。あとはとりあえずデフォルトで。設定したらここまでのリリースパイプラインの情報をすべて保存します。「Save」をクリックしましょう。

⑬さぁこれでリリースパイプラインまで実行する準備が整いました。Visual Studioなどからソースコードを修正してリモートリポジトリへのコミットを行います。するとビルドパイプラインからリリースパイプラインまで一気にセルフホステッドエージェント上で実行されます。無事すべてのタスクがsucceededになっているます。

エージェントをNETWORK SERVICEアカウントの実行として構成した場合、ファイルコピーのタスクで「Access Denied」でパイプラインが失敗しました。ですので一応、自端末管理者アカウントをエージェント実行ユーザーとして構成するように変更し対処しました。

⑭ちゃんとリリース対象のアセンブリがデプロイされているのが確認できます。ちゃんと動くのも確認。やったぜ!!

さいごに

今回、Azure DevOpsのPipelinesを利用してセルフホステッドエージェントを構築し、ローカル環境をビルドマシンとしてWindowsデスクトップアプリをローカル環境にリリースすることを行いました。さまざまなタスクをグラフィカルに組み合わせていくだけなのでとっても簡単にパイプラインの構築ができます。さらにYAMLを修正可能で柔軟性もあります。ディモールト良しっ!!Azure DevOps、ベネッ!!

デスクトップアプリのリリースもクラウド経由が基本だとは思いますが、やり方的には邪道かもしれませんが、こんなやり方もできるんだと自分で勝手に納得しております。

今回参考にしたサイトです。

ではでは、よきAzure DevOpsライフを♪


にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村


システムエンジニアランキング

コメント

タイトルとURLをコピーしました