KAGURA実験室

KAGURA開発者の個人ブログ

C/C++でもCI/CDしたい!

CI/CD

CI/CD(継続的インテグレーションと継続的デリバリー)とは、ソフトウェア開発の作業単位を小さくし、頻繁に統合・ビルド・テストをして常にリリースできる状態に保つことです。開発の無駄を省き、ユーザーに価値を届けることを大切にする、いまどきの開発のあるべき姿です。

しかしながら、現在のKAGURA開発ではこれが実践できているとは言い難い状態です。自動ビルドの仕組みがないため、リリースのための準備に時間がかかったり、人的ミスが起こるリスクがあったりして、時間とリソースに無駄が生じてしまいます。

KAGURAにCI/CDを取り入れるのは、簡単ではありません。 開発言語がC++であるため、

  • 今流行りの言語やフレームワークに比べて情報が少ない
  • OS・プラットフォームごとにバイナリの互換性がない
  • ビルドに時間がかかる

という問題があります。近年、CI/CDがトレンドになっても、KAGURAには関係ないことだと思っていました。

しかし、この先もKAGURAを進化させていくために、CI/CDを導入したい!

C++でもモダンな開発スタイルを手に入れるんだ!!

と意気込んでいる今日この頃。

まずは自動ビルド

KAGURAのビルドに必要な条件は以下のようなものです。

  • 言語は主にC++
  • WindowsmacOSのネイティブアプリ
  • CMakeを使いたい

これを満たす自動ビルド環境をできるだけ簡単に構築する方法を探しています。

Azure DevOpsを使ってみる

azure.microsoft.com

Azure DevOpsでプロジェクトを作る

適当に名前をつけて、プロジェクトを作ります。

gitリポジトリの作成

f:id:nkshigeru:20190118233959p:plain Azure Reposはプライベートなgitを無制限に作れます。

f:id:nkshigeru:20190118005621p:plain これまた適当な名前でgitリポジトリを作ります。

パイプラインの作成

f:id:nkshigeru:20190118010017p:plain

Azure Pipelinesは、ビルドなどのタスクを自動で実行してくれるものです。今回の話のメインです。

f:id:nkshigeru:20190118010625p:plain ビルドするコードの場所を指定します。 先ほど作ったAzure Reposを選択します。さすが、GitHubにも対応してます。

f:id:nkshigeru:20190118010825p:plain testリポジトリを選択します。

f:id:nkshigeru:20190118012437p:plain パイプラインのテンプレートを選択します。ここでは、minimalなパイプラインである「Starter pipeline」を選択してみます。

f:id:nkshigeru:20190118012621p:plain azure-pipeline.ymlが表示されました。どうやらこれが、パイプラインの設定ファイルのようです。

# azure-pipeline.yml(一部)
steps:
- script: echo Hello, world!
  displayName: 'Run a one-line script'

azure-pipeline.ymlでは、stepsに実行したいタスクを順に記述します。そのうちの一つ、scriptは任意のコマンドをコマンドライン(シェル)で実行するタスクです。

「Save and run」ボタンを押して確かめてみましょう。 f:id:nkshigeru:20190118014714p:plain

パイプラインが実行され、ログが表示されます。 f:id:nkshigeru:20190118014937p:plain 確かに、サーバー上でechoコマンドが実行されています。

CMakeを使ってみる

早速、僕の大好きなCMakeが使えるのかどうか試してみます。

# azure-pipeline.yml(追加)

- script: cmake --version

とりあえず、コマンドライン上でcmakeコマンド(バージョンを表示)を叩いてみます。 f:id:nkshigeru:20190118225539p:plain 「Save and run」を実行。

f:id:nkshigeru:20190118230820p:plain おぉー、CMakeのバージョンが表示されました!

いや、ちょっと待て、喜ぶのはまだ早い。

# azure-pipeline.yml(一部)
pool:
  vmImage: 'Ubuntu-16.04'

vmImageに書いてある通り、これはUbuntuの環境で実行したものです。僕がやりたいのはWindowsおよびMacでビルドをすること。

Windows(Visual Studio)環境を使ってみる

https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=vsts&tabs=yaml#use-a-microsoft-hosted-agent

こちらのページに書いてある通り、ビルドを実行する環境を選ぶことができます。

# azure-pipeline.yml(変更)
pool:
  vmImage: 'vs2017-win2016'

'vs2017-win2016'、つまりWindows Saver 2016にVisual Studio 2017がインストールされた環境を使ってみます。

f:id:nkshigeru:20190118232206p:plain 「Save and run」を実行。

f:id:nkshigeru:20190118232310p:plain おぉ!バージョンが少し違いますが、CMakeコマンドを実行できました!

macOS(Xcode)環境を使ってみる

# azure-pipeline.yml(変更)
pool:
  vmImage: 'macOS-10.13'

f:id:nkshigeru:20190118232809p:plain 「Save and run」を実行。 f:id:nkshigeru:20190118232955p:plain おぉぉぉぉぉ!ちゃんとCMakeが入ってる!

まとめ

  • Azure Pipelinesはgitリポジトリと連携して自動ビルドできる
  • パイプラインの設定は、azure-pipelines.ymlを編集する
  • WindowsおよびMac環境でCMakeを使うことができる

僕はCI/CD初心者ですが、Azure Pipelinesはとても分かりやすかったです。ここまで試してみて、つまづくことはほとんどありませんでした。

それに、Microsoftが用意したWindows環境にCMakeがデフォルトで入っていたり、macOSの環境がクラウドで使えたりするのって、凄くないですか?いつの間にそんな時代になっていたんですか???

KAGURAの開発で使えるかどうかはまだ分かりませんが、Azure DevOpsすごい。

次は実際にC++のビルドができるのか試してみたいと思います。

補足

azure-pipelines.ymlの詳しい仕様はこちら YAML schema - Azure Pipelines | Microsoft Docs

今回はとりあえず、コマンドラインでcmakeコマンドを実行したけど、CMake用のタスクがあるみたい。 CMake build and release task - Azure Pipelines | Microsoft Docs