kkamegawa's weblog

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

Visual Studio Team Services CI/CDアドベントカレンダー:データベースへのCI/CD(10日目)

はじめに

これはVisual Studio Team Servicesのアドベントカレンダー10日目の記事です。

qiita.com

CI/CDといえば、プログラムが主ですが、データベースにデプロイするときはどうしているでしょうか。Visual Studio 2017 Enterpriseに付属するReadyRollを使ってCI/CDをやってみましょう。Re

なお、VS2017に付属するReadyRollはCoreエディションなので、一部機能のみですが、SQLに対するIntelliSenceとかは使えます。SSDTに内蔵されているものよりも高機能に見えます。

www.red-gate.com

Pro/Communityエディション向けには体験版が用意されています。

marketplace.visualstudio.com

ReadyRollはSQL Server(SQL Database)専用ですが、開発しているRedGate社はMySQLやOracle DBに対応した製品も販売しているようです。

www.red-gate.com

RedGate ReadyRollとEntity Frameworkの違い

データベースの管理ではないですが、移行をサポートしたものとしてすぐに思いつくのはEntity FrameworkのCode Firstとの違いです。以前も書いたのでこちらをみてください。

kkamegawa.hatenablog.jp

ただ、VSTSと組み合わせると結構便利なこともあります。ちょっと見てみましょう。

拡張機能の追加

marketplace.visualstudio.com

まず、対象のVSTSにReadyRoll拡張機能を追加します。この拡張機能そのものは無償です。ライセンスはあくまでもクライアントのみにかかるようです。追加すると、ReadyRollのビルドタスクが表示されます。

ビルド定義を作る

f:id:kkamegawa:20171210172604p:plain

ReadyRollには専用のビルド定義が用意されています。こちらを選びます。

f:id:kkamegawa:20171210154152p:plain

こんな感じのビルド定義が用意されています。当然ですが、ビルドエージェントにはHosted VS2017か、Visual Studio 2017 Enterpriseがインストールされているプライベートエージェントをプールを選んでください。

f:id:kkamegawa:20171210154148p:plain

ターゲットのSQL Server(Database)を選んで接続情報を指定します。余談ですが、パスワードはAzure Key Vaultを使うこともできます。

f:id:kkamegawa:20171210154147p:plain

Variable GroupにKey Vaultを指定します。

f:id:kkamegawa:20171210154146p:plain

Key Vaultに登録したVariable Groupを参照しておけば、ビルド定義内でKey Vaultに登録しているパスワードをビルド内変数として参照できます。

f:id:kkamegawa:20171210154149p:plain

Visual StudioのビルドタスクもReadyRollように調整されています。ビルドを実行してみましょう。

f:id:kkamegawa:20171210154150p:plain

VSTSにReadyRoll拡張機能をインストールすると、Database diff scriptとDatabase scriptという項目ができています。ReadyRollプロジェクトをビルドすると、ここに表示されます。このキャプチャを取った11/26時点ではWindows 10 Fall Creators UpdateのEdgeではここが表示されないようで、Chromeでキャプチャを取りました。

f:id:kkamegawa:20171210154151p:plain

データベースに対して実行したスクリプトも表示されます。

ReadyRollでリリース

ビルドができたら次はリリースです。

f:id:kkamegawa:20171210154153p:plain

リリースでの成果物(Artifact)にReadyRollのビルド定義を指定します。

f:id:kkamegawa:20171210154154p:plain

リリースのタスクにReadyRoll deploy Database Packageがあるので、選択します。

f:id:kkamegawa:20171210154155p:plain

ビルドパッケージにはReadyRollで生成されたPowerShellスクリプトを指定します。

f:id:kkamegawa:20171210190710p:plain

このように、リリースも正常に行われています。

Visual Studioでの注意事項

f:id:kkamegawa:20171210190748p:plain

Visual StudioでReadyRollのプロジェクトを作ったときデプロイ先によって、プロジェクトのこの設定を変更してください。

特にSQL DatabaseとSQL Serverでは使えるSQLに差があります。具体的にはuse命令がSQL Databaseでは使えないので、SQL ServerのままだとSQL Databaseへのデプロイに失敗します*1

まとめ

ReadyRollを使った基本的なデプロイまで紹介しました。もちろん一回のデプロイで終わるわけはなく、継続的にリリースするときにはいろいろ考慮することがありますが、もうちょっと使いこなしてみて紹介できればと思います。

*1:最初これに気づかなかった…

わんくま&プロ生合同勉強会でWindows コンテナーのことをしゃべってきました

わんくま&プロ生合同勉強会でWindowsコンテナーについて基本編を解説してきました。Windowsコンテナーは選択肢やインストールがまだ混乱しているというか、ちょっとわかりにくい状況になっていると思っているので、できるだけ整理したつもりです。

コンテナーを使われている方がほとんどいらっしゃらなかったので、ちょうどよかったのではないかなという感じです。今回CIはLinux環境で行いましたが、Windows環境でやる方法をちょっと探しておきます。

Azure コンテナー レジストリを使う

azure.microsoft.com

Azureのサービスの1つ、コンテナーレジストリサービスを使って自前のイメージを管理しましょうという話。Docker hubでもいいのですが、広く公開するものでもないし、あちらは無料だと一つだけ(9/7現在)なので。

今回はクロスプラットフォーム用のAzCopyイメージをAzureコンテナーレジストリに登録します。なんでかというと、まだ公式イメージがないから自前で用意するしかないからです。

f:id:kkamegawa:20170907065258p:plain

Azureポータルからさくっとコンテナーレジストリを作ります。Azureストレージアカウントも作られます。ここで「管理者ユーザー」を「有効にする」を選んでおきます。

ユーザー名とパスワードが表示されます。このユーザーとパスワードでdocker loginします。

f:id:kkamegawa:20170907065309p:plain

パスワードがあるので、docker pullしても、認証がないよと言われます。

docker login ログインサーバー

ユーザーとパスワード聞かれるので、このブレードにあるユーザー名とパスワードを指定すると、ログインできます。

docker pull ログインサーバー/imagename

これで普通にpullもできました。お値段はストレージアカウントの料金と転送料だけなので、自分で作った公開しなくてもいいかイメージを管理するために便利です。

もちろんVSTSでも使えます。

f:id:kkamegawa:20170908071137p:plain

DockerタスクでContainer Registry TypeをAzure Containerを選んでください。Servicesに登録しているAzureサブスクリプションからコンテナーレジストリを登録しているサブスクリプションを選択してください。

Visual Studio Team ServicesでRe:VIEWのCIを実施する

はじめに

TFS2017本をRe:VIEWを使って書いているのですが、ローカルビルドでやっていました。ビルド環境が安定しないのと、Windows Subsystem for Linuxでpdf生成までやろうとすると、ディスク食うのでやってみたかったDockerとの連携をすることにしてみました。

VSTSビルドエージェントを作る

最初はVSTSのLinux Hosted Agentを使おうとしたのですが、残念ながらLinux Hosted AgentにGit-LFSが入っていないようで、原稿のpullができませんでした(報告済み)。
(8/25追記)今日最新のHosted Agentが更新されたようで、Git LFSも入っています。試したらちゃんとHosted Agentでビルドできました。したがって、この手順は不要です。ビルド時にLinux Hosted Agentを選択してください。

そこで、Azure(じゃなくてもいいんだけど)にUbuntu 16.04 LTSを立てて、ビルドエージェントを作ります。VSTSビルドエージェントのdockerイメージが提供されているので、素直に使います。

https://store.docker.com/community/images/microsoft/vsts-agent

f:id:kkamegawa:20170820200923p:plain

こんな感じのシェルスクリプトを作って起動させます。

docker run -d --hostname ubuntsu001 \
  -e VSTS_ACCOUNT={vsts account} \
  -e VSTS_TOKEN={PAT} \
  -e VSTS_WORK='/var/vsts/$VSTS_AGENT' \
  -v /var/vsts:/var/vsts \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -it microsoft/vsts-agent

PAT(Personal Access Token)は最長一年なので、気を付けてください。期限切れの通知もありません。Sprint 136の新機能でPATの有効期限切れが通知されるようになりました。

VSTSエージェントをdockerで実行します。/var/run/docker.sock をマウントさせるのはほんとはまずいらしいのですが、VSTSエージェントはsshなどでログインさせる必要がないので、大丈夫のはずです。

qiita.com

Dockerレジストリへの接続設定

最初にDocker拡張機能を追加します。

marketplace.visualstudio.com

f:id:kkamegawa:20170820200904p:plain

拡張機能を追加すると、dockerビルドタスクが使えるようになります。コンテナイメージを都度pullする場合、管理ページからdocker.comへの接続を作ります。

f:id:kkamegawa:20170820200858p:plain

DockerIDとパスワードを指定します。

Re:VIEW文書をビルドする

本のPDF/epubごとにビルドタスクを作ります。

f:id:kkamegawa:20170820200916p:plain

  • DisplayName:タスクの表示名です。好きな名前でどうぞ
  • Container Registry Type: Azureコンテナレジストリか、それ以外か
  • Docker Registry Connection:上で作成したdocker.comへの接続を選択します
  • Action:pullしたイメージを実行するので、"Run an image"
  • Image Name:vvakameさんが提供してくれてる、vvakame/reviewを指定します。

f:id:kkamegawa:20170820200909p:plain

  • Volumes: マウントするボリュームを選択します。$(Agent.BuildDirectory)配下にTeXフォントキャッシュ(?)を指定します。ビルドで使用する$(Build.SourcesDirectory)をマウントしておきます。
  • Command: ビルドに指定するコマンドを指定します。
/bin/sh -c "cd $(Build.SourcesDirectory)/1_setup && review-pdfmaker config.yml"

ソースリポジトリからpullしたソースが$(Build.SourcesDirectory)にあるので、その下/1_setupでPDFを作ります。

この記事中に出てくる$()で囲まれている文字列は、VSTS内で定義されている値です。どんな値が定義されているかはこちらに載っています。

www.visualstudio.com

例えば、Gitのコミットハッシュやブランチ名などを使うのもいいでしょう。

$(Build.SourcesDirectory)などのこの記事中の値はすべてVSTSでデフォルト定義されているものしか使っていませんが、例えばデータベースへのパスワードなどはvariablesハブで定義した独自の値を使うこともできます。

実際データベースのパスワードのような機密性の高い値はvariableへの直書きではなく、variable groupsに定義して、さらにAzure KeyVaultに保存しましょう。

ビルドのvariablesはビルド内しか使えませんが、variable groupsに登録しておけば、ビルドとリリースの両方で使えます(今回はリリースを使っていませんが)。

成果物にする

Re:VIEWでは特に指定しなければ、ソースフォルダ直下に作成します。このままではすぐに消えてしまうので、どこかに取っておきます。ここではVSTSの中に保持しておきます(これもデフォルトでは一定期間で削除されます)。

www.visualstudio.com

www.visualstudio.com

f:id:kkamegawa:20170820212349p:plain

まず、成果物として、VSTS内に保存したいファイルだけをソースファイルからステージングフォルダへコピーします。次で説明するPublish to Artifactタスクがフォルダ丸ごとのコピーしかできないためです。

  • Source Folder:$(Build.SourcesDirectory)を指定します。
  • Contents:コピーしたいファイルを選択します。minmatchパターンが使えます。
  • Target Folder:$(Build.ArtifactStagingDirectory)を指定します。

f:id:kkamegawa:20170820212642p:plain

Publish ArtifactタスクでVSTS内に保存します。

  • Path to Publish:先ほどコピーした$(Build.ArtifactStagingDirectory)を指定します。
  • Artifact Name:成果物の名前です。dropを慣例的につけてます。
  • Artifact Type:Serverを指定すると、VSTSに保存します。File Shareを指定すると、UNCのファイル共有になります。実際はAzure Storageのファイル共有になるでしょう。

f:id:kkamegawa:20170820212345p:plain

ビルドが成功すれば、このようにartifactsに格納されます。

成果物の原稿を他人と共有する(追加)

VSTSは無料で5人まで無制限のGitリポジトリとしてアクセスできます。ただ、epub/pdfだけアクセスできればいいという場合、ライセンスを使うのももったいない話です。

そういう場合、ビルドタスクで各種クラウドストレージやGitHubに送るという方法が考えられます。

例えば、ビルド成果物をGitHub Releaseに送る拡張機能。

marketplace.visualstudio.com

AWSのS3などに送るための拡張機能。

marketplace.visualstudio.com

標準機能でもあるのですが、ビルドできたことをSlackへ通知するための拡張機能(VSTSへのアクセス権がある人はメール通知もできます)。

marketplace.visualstudio.com

www.visualstudio.com

#MS Teamsは現時点では残念ながらAzure ADで運用しているVSTSじゃないと使えません。

最初はMS FlowやLogic Appを使って通知および、ファイルコピーしようと思ったのですが、VSTSのコネクタにはビルド成果物へのアクセスがないので、REST APIを使うしかないようです。

www.visualstudio.com

個人的にはAzureのBlobストレージへのコピーをやろうとしているのですが、Azure CLI 2.0のコマンドがよく理解できなくて止まってます…。Windows上のエージェントだったらPowerShellやAzCopyを使ったコピーが楽にできるのですが。

#.NET CoreベースのAzCopyにはまだ公式Dockerイメージがないようなので。自分で作るしかないか…。

終わりに

dockerをあまり理解しておらずやってたので、結構試行錯誤しました。これでCIができました。VSTSのhosted agent使えばビルド時にdockerイメージをpullすることもできるはずです。

Git LFSが入っていないことに気づくまで、何回かHosted Agentでやったのですが、vvakame/reviewイメージのダウンロードは大体30秒かからないようです。でも、毎回だとちょっときついですね。