つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

GitLabで.NET Coreアプリケーションの継続的インテグレーションを行う

2018年2月23日(金)にFukuoka.NET #9を開催しました。参加して頂きました皆様、誠にありがとうございました。

fukuten.connpass.com

今回のふくてんでは、GitLabで.NET Coreアプリケーションの継続的インテグレーションを行う方法についてのセッションを行いました。
この記事では登壇内容について、解説と補足をしたいなと思います。

セッションスライド

セッションの内容だけ確認したい人はこちらをどうぞ。

www.slideshare.net

概要

GitホスティングサービスであるGitLabには、IssueやWikiの他、CI/CDやContainer Registryも備わっているため、GitLab単体でだいたい必要な機能が揃います。

GitLabのCI/CDの仕組み

  • パイプライン定義はYAMLで記述する。
  • パイプライン内の各ジョブはDockerコンテナで実行される。
  • リポジトリ内に.gitlab-ci.ymlがあれば、プッシュした際に自動実行される。

.NET Coreアプリケーションをビルドしてみる

リポジトリのファイル構成

コンソールアプリケーション

単純に「Hello World!」と出力するアプリケーションです。

単体テスト

簡単なクラスとxUnitの単体テストコードを用意します。

Dockerfile

gist9f660b4f6fd093133376042a5ba408f6

.gitlab-ci.yml

正しくビルド、テスト、コンテナイメージの登録ができているYAMLファイルはこちらになります。

GitLabで.NET Coreアプリケーションの継続的インテグレーションを行う

苦戦したこと

ビルドやテストはdotnetコマンドを使って処理させるだけなので、さほど難しいことはありませんでした。
ただ今回は.NET Coreのアプリケーションをコンテナイメージ化して、GitLabのContainer Registryに登録することをゴールにしていました。

GitLabのContainer Registryへの登録にはこちらのドキュメントを参考にしました。

gitlab.com

しかし何度試しても下記のエラーが起き、パイプラインに失敗しました。(ユーザー名とパスワードは加工しています)
理由としてはdockerコマンドが見つからないという原因です。

$ docker login registry.example.com -u {user} -p {password}
/bin/bash: line 62: docker: command not found
ERROR: Job failed: exit code 1

解決策

同僚でありGitLabに詳しい@morita92hiroに大事なポイントを教えてもらいました。
Container Registryに登録するジョブのブロックにてimage: docker:latestを記述し、Dockerを使うと定義しなければならないようでした。
その部分のジョブの定義だけ抜粋するとこちらになります。

job3:
  stage: push
  image: docker:latest
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - cd src
    - docker build --pull -t "$CI_REGISTRY_IMAGE" .
    - docker push "$CI_REGISTRY_IMAGE"
  only:
    - master

感想

ある程度、シェルスクリプトYAMLファイルが扱えるような人は、GitLabのCI/CDは使いやすいんじゃないでしょうか。
アプリケーションエンジニアな私としてはちょっと難しいので、Visual Studio Team Servicesを使ってGUIでパイプラインを構築するほうがやりやすいなと感じました。

.NET Core 2.1のロードマップが公開されたようです

追記(2018/06/23 10:28)

.NET Core 2.0のサポート終了アナウンスが発表されています。

tsubalog.hatenablog.com


Twitterで「.NET Core 2.1」というフレーズをたくさん見かけたので、なんだなんだと思ったらロードマップが公開されたようです。
ロードマップは下記のブログに詳細が記載されています。今回はそれを読んでまとめてみたいと思います。
なお私の英語力にはあまり期待しないでください。

blogs.msdn.microsoft.com


まとめ

  1. ビルド性能の改善 (Build-time Performance)
  2. .NET Coreのグローバルツール (.NET Core Global Tools)
  3. 新しい型の導入 (Span, Memory and friends)
  4. HttpClientのパフォーマンス (HttpClient Performance)
  5. マイナーバージョンのロールフォワード (Minor Version Roll-forward)
  6. Windows互換パック (Windows Compatibility Pack)
  7. 可用性 (Availability)

ビルド性能の改善 (Build-time Performance)

dotnet buildコマンドやVisual Studioでのビルドのパフォーマンスが改善されたようです。
理由としてはCLIツールやMSBuildが改善されたからだ、ということです。

ビルドにかかる時間など、パフォーマンスを気にする人って多いんでしょうか?
私自身あまり気にしたこと無いんですよね。まぁ速くなることは良いことですね。

.NET Coreのグローバルツール (.NET Core Global Tools)

Node.jsのグローバルツール (npm install -g) のような、ツールが.NET Coreにも導入されるようです。
こういったツールはNuGetパッケージとして提供されるようです。
ツールの導入のためにdotnet toolコマンドが新しくできるということです。

dotnet tool install -g awesome-tool
awesome-tool

どういったツールが提供されるんでしょうかね?

新しい型の導入 (Span, Memory and friends)

C# 7.2で導入されるSpan<T>Memory<T>が使えるようになります。
新しい型についてはこちらの記事が参考になると思います。

ufcpp.net

ufcpp.net

ただ、Memory<T>の情報を見かけたことがないので、どういった型か把握していません。

HttpClientのパフォーマンス (HttpClient Performance)

C#のHTTPクライアントのパフォーマンスが改善されたとのこと。
また、機能が追加されたHttpClientFactoryも含まれます。先日のふくてんもくもく会でもテーマにした方がいました。

github.com

マイナーバージョンのロールフォワード (Minor Version Roll-forward)

ここでいう「ロールフォワード」は後方互換性という意味と、私は理解しました。

For example, you will be able to run .NET Core 2.0 applications on .NET Core 2.1 or .NET Core 2.1 applications on .NET Core 2.5 (if we ever ship such a version).

.NET Core 2.5の環境で、.NET Core 2.1のアプリケーションを、.NET Core 2.0として実行することができるという感じでしょうか。

Windows互換パック (Windows Compatibility Pack)

.NET Frameworkから.NET Coreに移行する際、新しいWindows互換機能パックが利用できるようになります。
これまでもWindows互換機能パックは利用できましたが、新しくなったということですね。

docs.microsoft.com

可用性 (Availability)

.NET Core 2.1を2018年前半の正式リリースを目指して、毎月プレビュー版を提供する予定とのこと。


翻訳間違ってるよとかありましたら指摘して頂けますと幸いです。

Fukuoka.NET もくもく会 #1を開催しました #fukuten

2018年最初のFukuoka.NET(ふくてん)を開催しました。
今回のふくてんは初の試みとして「もくもく会」を行いました。

fukuten.connpass.com

今回の勉強会は募集10名に対して、申込み10名(俺込み)で参加も10名(俺込み)という歩留まり最高な会でした。
ご参加頂きました皆様本当にありがとうございました。

この記事は帰りに寄ったジョイフルで書いてます。たまーにやる一人ファミレス。

もくもく会の目的

私はもくもく会なるものに参加したことないですが、.NETテクノロジーを気軽に集まって勉強できる場を作ってみたいなーという思いで企画しました。

タイムテーブル

時間 内容
19:00~ 自己紹介&もくもくネタの発表
~20:30 もくもく
~21:00 もくもく成果の発表

こんな感じで進めたので、もくもくする時間は概ね1時間ほどでした。

もくもくしたテーマ

参加者それぞれに共有してもらったテーマはこちら。

私はASP.NET CoreでVue.jsを使ったWebアプリケーションに触れてみるということをテーマにしました。

成果物

1時間という限られた時間のなかで、何かしら成果発表する内容を作るって難しいですね。
とりあえず成果物としてこちらのリポジトリを作りました。

github.com

元々はMLBのデータが提供されているAPIから取得できるデータをVue.jsで表示したかったですが、C#からデータがうまく取得できなかったので、べた書きAPIのデータを表示するように方針転換しました。
変にこだわって時間切れになるより、無理やりでも形にして成果発表につなげるようにしました。
昨年のハックフェスト並みに急いでコーディングしました。

alterbooth.hateblo.jp

反省点

平日の夜だからとはいえ、作業する時間が1時間しか作れなかったので、かなり慌ただしかったです。
あともう30分でもあれば皆さん余裕が出たでしょうね。

もくもく会#1 の雰囲気を知りたい方は #fukuten をご覧ください。お疲れ様でした。

twitter.com