Azure DevOps 事始め

この記事は Azure DevOps を概観しつつ、利用して感じたことなどを書いていきたいと思います。  
ここで触れなかったトピックなどについて、何か気付きがあればまた別の機会にお届けできればと思います！  
※スクリーンショットに黒塗り部分が多くなっていますが、ご容赦ください。
# Azure DevOps とは
## 一次情報
[公式ページ](https://azure.microsoft.com/ja-jp/products/devops)によると次のように定義されています。
> モダンな一連の開発サービスを利用して、よりスマートに計画を立て、より効率的に共同作業を行い、より迅速に出荷しましょう。
### モダンな一連の開発サービスたち
開発プロジェクトを進めるために必要なサービス群の総称が Azure DevOps です。  
Azure DevOps に含まれるモダンな一連の開発サービスと呼ばれるものは次のとおりです。
|サービス名|説明|
|:--|:--|
|Azure Boards|アジャイル計画のためのボードとバックログ|
|Azure Repos |ソースコードのバージョン管理と管理のためのリポジトリ|
|Azure Pipelines|継続的インテグレーションとデプロイのためのパイプライン|
|Azure Artifacts|成果物のバージョン管理と管理のためのリポジトリ|
|Azure Test Plans|プロジェクトライフサイクル全体の継続的なテスト統合|

:::note info
Azure DevOps は SaaS での提供となる `Azure DevOps Services` と、サーバライセンスでの提供となる `Azure DevOps Server` の2つの形態での提供となっており、今回は `Azure DevOps Services` についての記事となっています。
:::
### Azure Test Plans について
このサービスは利用料金がちょっと試してみようと思える金額ではないので、今回は使用を見送っています。  
[Azure DevOps の料金](https://azure.microsoft.com/ja-jp/pricing/details/devops/azure-devops-services/)によると次のように規定されていました(2023/03/31 14:15 確認)。
- Test Plans を使用しないプラン $6/user/month
- Test Plans を使用するプラン $52/user/month

$52 = ¥6,907 ですから、数人のチームで試そうと思うと数万円必要になりますね。  
正直ちょっと使いにくいお値段かもしれないなと思います。。。
# Azure DevOps の始め方
## 前提条件
今回は私が所属している会社の環境で実施したので次のことが前提になります。
- AADにディレクトリが存在している
- 自分たちのチーム用にサブスクリプションが作成されている
- サブスクリプションレベルの権限が付与されている
## Azure Portal から始めよう
![azure_portal_AzureDevOpsOrganizations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/c6853194-544b-48a4-ba3f-c4a1fa7e725b.png)
## 何はなくともOrganization
Azure DevOps を始めるには Organization (組織) が必要です。<br>
プロジェクトやリポジトリ、パイプラインなどのリソースは Organization に紐付きます。<br>
また、原則的(※)に課金ユーザの識別や範囲も Organization の単位で制御されます。
1. Azure portal から遷移した先で Azure DevOps の Organization 画面へ遷移します
![azure_devops_organizations_entrypage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/af80a2da-6289-7d37-ba30-c225b275e912.png)

1. **新しい組織の作成** から組織を作ります
![azure_devops_create_new_organization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/fe17c0f8-1ae5-e807-8fcc-800750ee41f6.png)
:::note info
※原則的
後述しますが、複数 Organization に所属するユーザに対して一度だけ課金するようなオプションも存在しているため、原則的という表現になっています。
:::
## プロジェクトを作成しよう
Organization を作成したらプロジェクトを作成しましょう。<br>
プロジェクトは Azure Repos や Azure Boards などを関連付けるコンテナになります。<br>
### Organization、プロジェクト、各サービスの関係
![azure_devops_concepts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/0158c95e-d2af-cb5f-fe1a-c6e1d3470655.png)<br>
※この図では Azure Boards/Azure Repos/Azure Pipelines のみが描画されていますが、Azure Test Plans/Azure Artifacts も同様にプロジェクトに関連付けられます。<br>
## サービス各論
### Azure Boards
- プロジェクトのテンプレートがあり、アジャイル系ならすぐに始められます
    - この記事では Scrum を選択したものとして記述しています
- 過去に作成したプロジェクトをテンプレートとして開始することもできます
![azure_devops_project_style.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/0ecfeddb-938d-84b8-eff3-0354a467966f.png)
- Azure Repos/Azure Pipelines等との相互作用により次のような事が実現でき、良い開発体験が得られます
    - Azure Boards で起票したタスクからブランチを作る
    - Azure Boards で起票したタスクに Azure Pipelines や他の作業項目を関連付ける
    - ブランチがPRを通じてマージされたら自動的にタスクのステータスを Completed にする<br>
    Azure Repos/Azure Pipelines/Azure Boards との連携などは、図中の赤線部分で管理できます
    ![azure_devops_new_item.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/653184ad-9def-262c-4192-a7f4d264f6b2.png)  
    この辺りの自動的にタスクが閉じていく様は体験しないと伝わりづらいかなと思うので、ぜひご自分で試してみてください！
### Azure Repos
- いわゆるソースコードホスティングサービスです。
- プロジェクト作成時に Git リポジトリとして作成します。
![azure_repos_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/c89e2142-fb59-5a25-faef-ef93796000b2.png)
:::note warn
Azure Repos について、次のような理由から現時点では Microsoft と GitHub の動向を注視していく必要があると、筆者は考えています。
・Azure Repos でできることは一定程度 GitHub でも実現可能
・Azure Repos -> GitHub へ[移行する仕組み(GitHub Enterprise Importer)](https://docs.github.com/ja/enterprise-cloud@latest/migrations/using-github-enterprise-importer/understanding-github-enterprise-importer/about-github-enterprise-importer)などが用意されている
・VSCode から 拡張機能を使用して Static Web Apps をデプロイしようとした時に GitHub アカウントを求められる一方、 Azure DevOps はそもそも選択肢として存在しないなど、明らかに GitHub を志向したサービス展開が見られる
![vscode_github_only.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/dc1e8162-f636-18e4-8d1c-c4bfb42edff0.png)

:::
### Azure Pipelines
- CI/CDをサポートする仕組みです。GitHub Actions などをご存知であれば理解しやすいと思います。
![azure_pipelines_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/c6f82810-7ca5-8750-0180-4e6a9d3ce8d2.png)
### Azure Artifacts
- 今回使用していないので割愛
### Azure Test Plans
- 今回使用していないので割愛
## 料金について
Azure DevOps のコストの発生や複数組織に所属するユーザの課金については一部難しいところがありますので、少し細かめに書いてみます。
### コストの発生について
#### 結論
- 月あたり料金を日割りして、日次でコストが計上されます。
- 月あたりの料金は[公式](https://azure.microsoft.com/ja-jp/pricing/details/devops/azure-devops-services/)によると、$6/ユーザです。
    - 2023/3/29現在で見ると¥132.5855 x 6 = ¥795.513
    - これを日割りすると、¥25.66171/日/ユーザ
    - このチームでは2-3名がBasicアクセスレベル以上で課金される対象だったので¥50-¥80程度のコストが発生していて概ね正しそうです。
![azure_devops_cost_daily_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/09e58b30-dd42-4586-5f96-b816994980d7.png)
#### 無用なコストの発生を回避する
- たとえば、プロジェクトの内容は見てほしいけどタスクの実行や開発をする訳ではないユーザがプロジェクト関係者にいる場合、そのユーザに必要な権限は Basic レベルではなく、 Stakeholder レベルかもしれません。
- コストが発生するのは Basic レベル以上のユーザの数に対してなので、こうしたケースでは権限レベルを変更するだけで無用なコストの発生を回避しつつ、プロジェクトに参加してもらうことができます。
![azure_devops_change_user_access_level.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/4d4e8de9-220a-e7d1-b449-385ad74d213d.png)
#### 料金に関するミスリードっぽく見えるかもしれない公式情報
[Microsoft の Azure DevOps Services のページ](https://azure.microsoft.com/ja-jp/pricing/details/devops/azure-devops-services/) を見ると、下図のように書かれています。  
![azure_devops_services_cost_information.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/ce50c7b9-a792-e256-1217-5d4d26d879e3.png)  
これだけを読むと月次課金されるのかな？と思ってしまいそうです。  
ですが、これはそうではなく月あたり料金の日割分が日次でコストとして発生するというのが正しいです。  
こちらについては公式にドキュメントで次のように説明されています。  
> Q: 毎月のコミットされた購入ではなく、日割り計算料金の違いは何ですか？  
> A: ユーザー割り当てベースの課金に対する変更の一環として、月単位から毎日の請求に切り替えました。ユーザーに数週間又は数日の有料アクセス権を付与すると、１か月間ではなく、有料アクセスに割り当てられた時間に対してのみ支払われます。organizationを月単位から日単位の請求に切り替えると、次の Azure 課金は以前よりも低くなる可能性があります。翌月は、１か月分の１日の料金が蓄積されると、通常の状態に戻ります。

※[MS-Learn > Azure > Azure DevOps > セキュリティ > 請求に関する FAQ](https://learn.microsoft.com/ja-jp/azure/devops/organizations/billing/billing-faq?view=azure-devops#q-----------------------------------) より引用  

結論のところで紹介したように日次でコストが発生しているので、このドキュメントは正しそうです。  
![azure_devops_cost_daily_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/09e58b30-dd42-4586-5f96-b816994980d7.png)
### 複数組織に所属するユーザの課金を一度だけにする
[複数organization課金](https://learn.microsoft.com/ja-jp/azure/devops/organizations/billing/billing-faq?view=azure-devops#multi-organization-billing)では、同一サブスクリプションに所属する一人のユーザが複数の Organization に所属するケースについて、マルチorganization課金設定を有効にすることでコスト効率が改善することが説明されています。  
![azure_devops_billing_multi-organization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/20d2be40-f010-7033-0d38-f19ef835004b.png)
Single organization で運用する場合、organization ごとに5人のBasicアクセスレベルを持った無料のユーザを設定可能です。一方、Multi organization で運用する場合、5人のBasicアクセスレベルを持った無料のユーザはサブスクリプションで共有されます。  
このことから、公式ドキュメントでも次のように説明されています。
> Q: マルチorganization課金はすべての顧客にとって意味がありますか？
> A: いいえ。たとえば、既定の割り当てベースの課金では、各organizationは５人の無料 Basic ユーザーを取得します。複数organization課金に変更すると、Azure サブスクリプションには５人の無料の Basic ユーザーが付与され、リンクされているすべての組織間で共有されます。ほとんどのユーザーが１つのorganizationにのみアクセスすると、５人の無料ユーザーが最もコスト効率が高くなります。多くのユーザーが複数の組織にアクセスする場合は、マルチorganization課金が最適なオプションである可能性があります。

※[MS-Learn > Azure > Azure DevOps > セキュリティ > 請求に関する FAQ](https://learn.microsoft.com/ja-jp/azure/devops/organizations/billing/billing-faq?view=azure-devops#q-----organization----------------------) より引用
# まとめ
Microsoftさんがどういう方向に舵を切るかわからないところはあるものの、お手軽に従量課金で始められるので、まずは始めてみましょう。  
アジャイルに適合した形で利用可能であることも、モダンな開発現場に適合したツールだと思います。