kkamegawa's weblog

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

OSS向けのAzure Pipelinesについて

これはAzure DevOpsアドベントカレンダー二日目の記事です。

qiita.com

別件で調べていたらサクラエディタのissueにAzure Pipelines を調査するというものがあったので、ネタにさせていただきます。実は自分ではOSS向けのAzure Pipelines使ってないので、間違っていたら教えてください。

ライセンス

オープンソースプロジェクトでは10並列、ビルド時間無制限のAzure Pipelinesが使えます。

Azure DevOpsの料金

典型的な例ではGitHubにすでにレポジトリを持っている人たちが使う、ということが考えられます。GitHubのMarketPlaceから追加してください。

始め方

docs.microsoft.com

GitHubの場合はこちらにファーストステップガイドが載っています。現在Azure PipelinesにサインアップするにはMSアカウントが認証用に必要になっています。もしも学生であれば、Microsoft Imagineの担当者にも相談してみてください。

AppVeyorなどでやっていた方はともかく、今までCIをやっていなかった方はGUIでの初期構築がいいと思います。その場合に注意すべき点はいくつかありますので、紹介します。

絶対パスをやめる

特に昔からのソースを保持している人にやっている人がいるんですが、特定のパスじゃないとビルドできないソースはこの手のCIサービスが使えません。Visual Studioを使っている場合、プロジェクトファイル内に絶対パスを書いていたらVisual Studioが用意しているマクロ($(SolutionDir)等)に移行しましょう。

あと、C/C++プロジェクトで多いですが、昔の伝統でincludeやlib環境変数を使って絶対パスに依存している例があります。もしくはプロジェクトファイルに移行していたとしても、絶対パスでincludeファイルを指定している例を結構見ます。

対策としては、Boostのような有名ライブラリであればNuGetに移行することです。そうすればincludeやlibはNuGetパッケージが解決してくれるので、この手の問題から解放されます。マイナーなライブラリの場合、自分で作るしかないですが…。

www.nuget.org

ビルド環境の注意点

環境が初期化される

CIサービスなので、ビルド環境は毎回初期化されます。したがって、docker pullやNuGetパッケージは毎回リストアですので、ローカルでやるよりも時間がかかります。また、Windows環境は2コアCPUのサーバーなので、ローカルでいいマシンを使っている場合、より差が出ます。

LinuxやWindowsではそもそも2コアサーバーですが、macOSのエージェントは実機で動いているようなので、性能が十分に出る可能性があります。.NET CoreやJavaScript、Java等プラットフォームに依存しないビルドだったらmacOSのほうが早いのかもしれません(未確認)。

ビルドマシンの制限

Azure Pipelinesのストレージは10GBなので、ゲームなどで大きなコンテンツをビルドしようとすると、容量が足りなくなるかもしれません。

docs.microsoft.com

管理者権限がないので、管理者として実行しないと動かないようなツールは使えません。

コンパイラー環境

そのほか、新しい環境は入っていますが、古い環境で使用者が少ないとなくなっていきます。例えばXcodeの8.0-8.3.2は2018/11いっぱいで使えなくなります。

Xcode 8.0-8.3.2 deprecation on Azure Pipelines hosted agents – Microsoft DevOps Blog

古いものを外部に維持してもらおう、ということはできず、むしろ積極的に切り替えていく必要があるため、古い環境こそ自分で維持する必要があります。かといって、新しすぎるものはロールアウトの都合上、少し遅れます。Azure DevOpsが3週間ごとにリリースされており、ビルドエージェントもそれに合わせて更新されていくので、新しいコンパイラーなどは少し待ってください。

英語OS

AppVeyorなどのCIを使っている方であればすでに対処しているかもしれませんが、ビルドマシンは日本語OSではありません。したがって、SHIFT-JISで保存しているファイルをビルドするとき、0x5c(表、ソ等)が文字列中に入っていると、コンパイラがエラーを起こします。

kkamegawa.hatenablog.jp

こちらに書いたのでみてください。

ビルド上限

6時間までです。

Azure DevOpsでの格納ポリシー

Pipelinesのみを使う場合であればビルドした結果を一時的にAzure DevOps内部に保持できます。これはCIであるPipelinesのビルドと、CDであるReleaseが分離されているため、一時的な受け渡し場所として使います。時間経過とともに消えますが、直近の一つの成功ビルドは残っています。成功して、問題なければGitHubのReleaseにPublishするなどしてください。

Azure DevOps(クラウド)とAzure DevOps Server 2019(オンプレミス)の比較

QiitaのAzure DevOps アドベントカレンダー1日目の記事です。結局参加者少ない…。連続は難しいですが、ちょいちょいなんか書いてみます。

qiita.com

最初は軽めに…Azure DevOpsとブランド変更された旧Visual Studio Team Servicesですが、オンプレミスもAzure DevOps Serverとなりました。現在2019のRCが公開されています。

大きな機能としては大体同じなのですが、ちょいちょい差があります。いわゆる非機能要件的なものが多いですが、わかる範囲でまとめてみました。

※:突っ込みいただいて訂正…逆だった(恥)

クラウド オンプレミス
名前 Azure DevOps Azure DevOpsサーバー
ローカライズ ほぼなし あり
英語版Azure DevOps Serverでも日本語ブラウザからアクセスすればローカライズされたコンテンツが表示されます
機能更新 ほぼ三週間に一度 四半期に一度程度
価格 いろいろあり 5人までは無料のExpress版あり
有償版への切り替えもOK
バックアップなどの保守 すべてMicrosoft OS, SQL Server, Azure DevOps
すべて自前
Boardsの違い 全機能あり 全機能あり
検索にはJavaランタイムが必要
Boardsのカスタマイズ プロセステンプレートを継承して簡単に項目追加可能 プロセステンプレートを一から作成する
照合順序 英語 インストール時任意に選択可能
ただし補助文字(SC照合順序)は非サポート
Repos 基本的に無制限 SQL Serverの容量に依存
検索にはJavaランタイムが必要
Artifacts 現在上限なし SQL Serverの容量に依存
Test Plans Visual Studio Enterprise サブスクリプション ユーザーには含まれる
その他は別料金
←同じ
負荷テスト あり なし
Pipelines Microsoft提供
Linux
Windows
macOS
自前(Self-host)管理
自前管理のみ
Preview Feature
プレビュー機能の有効化
あり
(ユーザー/組織ごとに切り替え)
原則なし
(一部過渡的な機能はできることもある)
認証 Azure AD
MSアカウント
PAT
SSH
別名認証
Active Directory
OSローカルアカウント
PAT
SSH
別名認証
サポート 最新版のみ(随時更新) バージョン毎に10年
ただし、依存するOSやSQL Serverのサポート期限を超えることはできない(はず)
稼働場所 現在7リージョンで稼働
稼働状況
USの中でも2箇所で動いているなど、Azureリージョンと対応するともっと多い
オンプレミス環境
クラウドのIaaSなど
パブリックプロジェクト あり なし
レポート機能 ウィジェットによるグラフ表示
Power BI(プレビュー)
SQL Server Reporting Servcices
ウィジェットによるグラフ表示
Power BI(プレビュー)
アクセス履歴 Organization SettingsのUsageから IISのログなどで見る

ほかに漏れているところがあれば。

Azure DevOps Server 2019 RC1インストール

Team Foundation Server改め、Azure DevOps Server 2019のRC1が公開されました。

azure.microsoft.com

定期的に公開されるモデルになっており、今回はクラウドサービスのAzure DevOpsのSprint 141か142あたりまでの内容が入っているようです。

今回はUIが刷新されており、クラウドサービスのように切り替えはできないようなので、慣れていく必要がありますね。

Azure DevOps Server 2019ではWindows Server 2019とAzure SQL Databaseをサポートしています。Azure等で試すときSQL Server入れるのややめんどくさかったのですが、そういう面から解放されそうです。

docs.microsoft.com

f:id:kkamegawa:20181122053143p:plain

インストールを始めます。TFSと違って青基調の画面になっています。内容は大体TFS2018と同じ内容なので、迷わないと思います。

f:id:kkamegawa:20181122053138p:plain

次へをクリック。

f:id:kkamegawa:20181122053135p:plain

今回はアップグレードなので、「既存のデータベースがあります」を選択。これ以降、一部英語がありますが、次のリリースまでには直るそうです。

f:id:kkamegawa:20181122053256p:plain

運用環境のアップグレードです。本番環境を更新する前には別のインスタンスでテストアップグレードを試してみましょう。

f:id:kkamegawa:20181122053132p:plain

TFS2018からのアップグレードです。

f:id:kkamegawa:20181122053253p:plain

Azure DevOps Serverのサービスアカウントを指定します。

f:id:kkamegawa:20181122053250p:plain

Webサイトの設定です。ここではNTLMで指定していますが、本来はKerberosが推奨です。

f:id:kkamegawa:20181122053247p:plain

検索設定です。Elastic Searchを使うので事前にJavaランタイムが必要です。

f:id:kkamegawa:20181122053244p:plain

レポートを構成します。SQL Serverのレポートを使っていますが、SQL Server 2017で使う場合は事前にSQL Server Reporting Serviceを構成しておく必要があります。将来的にAzure DevOpsと同等のAnalytics Servicesへの移行が発表されているので、検討しておいてください。

f:id:kkamegawa:20181122053358p:plain

Reporting Servicesのインスタンスを指定します。

f:id:kkamegawa:20181122053355p:plain

使用するデータベースインスタンスです。

f:id:kkamegawa:20181122053352p:plain

同様にAnalytics Servicesのインスタンス(通常同じ)を指定します。

f:id:kkamegawa:20181122053349p:plain

Reporting Services読み取り用のアカウントを指定します。低い権限のユーザーアカウントを指定します。

f:id:kkamegawa:20181122053429p:plain

適合性チェックを実施します。引っかかるところといえばこのくらいでしょうか(実はよく引っかかる)。

  • Javaランタイムが入ってない
  • ディスクの空き容量
  • 何らかの理由でReporting Servicesが止まってる
  • 古いXAMLビルドが動いている(登録していると警告が出ますが続行可能)

f:id:kkamegawa:20181122053426p:plain

構成を実行して

f:id:kkamegawa:20181122053423p:plain

アップグレードです。古いバージョンから累積的に実施するので、ジャンプアップが長い、データベースのサイズによっては時間がかかります。古い添付ファイルやテスト結果を削除しておくのがいいでしょう。

f:id:kkamegawa:20181122053141p:plain

終わりました。再起動がかかります。

f:id:kkamegawa:20181122065855p:plain

こんな感じになります。日本語になっていること以外はクラウドサービスと変わらないですね。

Azure DevOpsでのCIとファイルエンコーディング

Azure Pipelinesでビルドすると、こんなエラーが出てしまいました。

f:id:kkamegawa:20181120063311p:plain

ローカルのVisual Studioでは問題なくビルドできます。このエラーはここで出ています。

testStep.Step = new string[] {"ブラウザ起動", "ログイン", "About表示", "終了" };

原因は「表」の字ですね。「表」には\と同じコードである0x5cを含んでいるので、エンコーディングエラーが発生しています。昔からCコンパイラとか使っている人にはおなじみです。

何故ローカルで出なくて、Azure Pipelinesで起きるかといえば、PipelinesのMicrosoft Hosted Agentは英語版OSで動いているため、Visual Studio 2017の標準エンコーディングであるSHIFT-JISのファイルが解釈できないからです。ローカルでは日本語OSなので、SHIFT-JISで問題がないと。

回避するにはソースファイルをUTF-8で保存しましょう。ファイル保存時にやってもいいですが、こういう拡張機能を使うと楽です。

marketplace.visualstudio.com

ロケールに依存するようなテストも発生します。こちらは逆で、USロケールに依存するようなテストがローカルの日本語OSではFailになるということが起きえます。今は見てないですが、昔のCoreFXのUnit Testにもそういうところがありました。

Azure Pipelinesに限らないと思いますが、ベースのOSでこういうところに引っかかることがあるので、気を付けてください。