今回の資料
前回までの作業で、Azure SQL を利用し、AppServicesでWEBサーバの構築を行いました。
今回は、開発環境を考えてみたいと思います。
前回は、VSCから、直接 Azure の AppServices へアップロードしていました。
この開発環境だと、1人で丸抱えの大変な状況です。(小規模なら否定はしませんが)
これを、中~大規模に耐えられるように、開発環境を整えたいと思います。
Microsoftが買収した GitHub に依存する方法もありますが、Azure DevOps という CI/CD ツールを利用してみたいと思います。
クラウドサービスの DevOpsもありますが、VPN環境でも利用可能なように、オンプレの DevOps を利用してみたいと思います。
今回の準備
Windows 10 Pro を使います。
こちらに、Azure DevOps のオンプレ環境を用意します。
そして、Azure DevOps から、AppServices へデプロイします。
≪注意≫
Windows 10 Home 無理でした。(DevOpsのInstall不可です)Pro 必須。
もしくは、Windows 11 か、Windows Server が必要となるようでした。
(詳しくは、Copilotにでも御確認ください)
後、クラウドサービスとしても、DevOps(無料枠もあり)が用意されていますが、AppService へのデプロイは、Azure 側の設定が全く違うので、御注意下さい。( Public でクラウド DevOps を利用する方が、私は好きですが…)
環境構築(Azure Entra)
AppService へデプロイする為の権限付与のアプリ設定が必要です。
EntraIDの設定から、アプリを登録します。

シングルテナントで問題ありません。

アプリ登録が終わったら、シークレットの「値」の設定へ進みます。

「新しいクライアントシークレット」から登録を行います。

登録の際、附番される「値」を DevOps の設定で利用するので、コピーして保管しておきましょう。
環境構築(Azure AppService)
既に前回までに登録済なので、今回はデプロイができるように、設定変更だけ行います。
AppServiceを開き、「アクセス制御(IAM)」で「ロールの割り当ての追加」を行います。

選択するロールは、「特権管理者ロール」より、「共同作成者」を選択します。

メンバーには、EntraID で登録したアプリを設定します。

他の設定ポイントとして、「設定」⇒「構成」の中の「SCM基本認証」をONにします。

環境構築(DevOps)
セットアップには、SQLサーバが必要となりますが、最近はSQLサーバも使い方次第で無料枠を利用できるようです。今回も、無料枠で準備を進めます。
https://learn.microsoft.com/ja-jp/azure/devops/server/download/azuredevopsserver?view=azure-devops
こちらのURLより、DevOpsを取得し、インストール作業を進めます。
Expressであれば、制限はありますが、無料で利用できるようです。

再起動等の作業もありますが、「構成センター」が起動します。

余り悩む部分はありませんが、ポイントをいくつか。
Webサーバを立てることになるので、IISのようにポート設定が可能な感じです。

検索機能は面倒そうだった事もあり、準備しないというのも可能でした。

インストールを進めると、SQLサーバのインストールも行われます。
※外部接続不可の場合、SQLサーバをダウンロードする為のURLが提示されます

インストールが終了したら、「 http://localhost 」へアクセスして確認します。
プロジェクトの登録が、DevOpsでの最初の作業になります。

プロジェクトの作成が終わったら、プロジェクトの設定を行います。
画面左下にメニューがあります。

プロジェクト設定メニューの下の方に、「サービス接続」があるので設定画面を起動します。

「Azure Resource Manager」を選択して、次へ ⇒ サービスプリンシパル ⇒ 次へ

Azure サブスクリプションの ID と、名称を入力し、サービスプリンシパルIDには、EntraIDのアプリケーションIDを入力します。

下段にスクロールして、サービスプリンシパルのキーに、EntraIDのアプリに設定したシークレットで附番された「値」を設定し、テナントIDは、EntraIDのテナントを入力します。
「検証」ボタンをクリックして、「検証成功」と表示されればOKです。

「サービス接続名」を決定し保存します。
次に、プロジェクトの設定のうち、「エージェントプール」を設定します。
https://github.com/microsoft/azure-pipelines-agent/releases
このURLより、ダウンロードして解凍します。
「config.cmd」を、DOS窓で実行します。

色々設定できるようですが、デフォルトでも問題ありません。(例は全部デフォルトです)
DevOps から Azure へ、デプロイする際は、DOS窓で「run.cmd」を実行したままにしておきましょう。
環境構築(開発クライアントにGit)
DevOps 環境にプログラムをプッシュする必要があります。
DevOps で直接プログラム開発を行うことも可能ですが、ローカルでVSC等を利用した開発環境を想定しています。開発環境や使い方は、それぞれ諸事情があるでしょうし、Gitの利用が参考になれば幸いです。
https://git-scm.com/downloads/win
より、GIT をダウンロードしました。
実行可能な圧縮ファイルでしたので、実行して、そのまま解凍します。
環境変数「Path」に、解凍した「bin」フォルダを設定したら環境構築完了です。
dotnetで開発している場合、プロジェクトのルートディレクトリで、
git init
git remote add origin http://localhost/DefaultCollection/プロジェクト名/_git/プロジェクト名
git config --global user.name "名前"
git config --global user.email "メールアドレス"
git add .
git commit -m "初回コミット等のコメント"
git branch (ブランチの確認:masterの場合)
git push -u origin master
順にコマンド実行する事で、DevOps へプログラムをプッシュすることが可能です。
環境構築(DevOps)
パイプラインを作成していきます。

コード(プログラム)は、DevOps の Repos にあります。

DevOps に登録したプロジェクトを選択します。

スタートパイプラインで構成します。

Yamlの作成が必要です。以下で作成します。
trigger:
- master ← DevOpsのブランチを指定します
pool:
name: 'Default' ← DevOpsのエージェントプール名です
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)'
zipAfterPublish: true
- task: AzureWebApp@1
inputs:
azureSubscription: 'AzureEntraApi' ← DevOpsのサービス接続名です
appType: 'webApp'
appName: 'AzureのAppServiceの名前'
package: '$(Build.ArtifactStagingDirectory)/**/*.zip'
「保存して実行」のボタンで正常に処理されれば完了です。
「trigger:」でブランチを指定しており、ブランチ内に更新があると、そのまま Azure へデプロイされますが、「trigger: none」と変更する事で、手動でパイプラインを実行する事でのみ、デプロイする処理に、変更することが可能です。
又、以下のYamlでは、ローカルのiisフォルダへ発行が可能です。この場合、DevOpsがフォルダへ更新できる権限を要する必要があるので、コピー先となるフォルダ権限は見直しが必要です。
trigger: none
pool:
name: default
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
arguments: '--configuration Release /p:PublishDir=$(Build.ArtifactStagingDirectory)\PublishedApp'
- task: CopyFiles@2
inputs:
SourceFolder: '$(Build.ArtifactStagingDirectory)\PublishedApp'
Contents: '**'
TargetFolder: 'C:\inetpub\wwwroot\test'
OverWrite: true
最後に
一人でシステム構築をやりきる…(やりきれる…) これは、重要、かつ、貴重なスキルですが、そのシステムは3年後、稼働していますか?
あなたが健康で、今の仕事を継続できている保証はありますか? 無責任なシステムを、世に生み出していませんか?
ジジィ的には、次の世代に引き継ぐために、このような知識は必須なわけで、今も備忘の為、このような記事を残している次第です。
以上、お疲れさまでした~。