今年はビルド周りで自分の常識がいろいろ変わった年だったので、既存の知見もあわせてまとめます。
Mavenのバージョンを固定する
Travis CIは不定期にビルド用仮想マシンを更新しますが、そのタイミングでの最新のMavenを仮想マシンに入れるようです。このブログ投稿時だと3.5.2が入っています。
もっと新しいバージョンを使う、あるいはMavenのバージョンを固定するには、Maven Wrapperを使うと良いでしょう。Travis CIはプロジェクトルートディレクトリにmvnw
スクリプトがある場合はそれを優先的に使います。
mvnコマンド指定時の注意点
script
や install
、deploy
などのフェーズで mvn
コマンドを明示的に実行する場合、 -B
オプションを忘れないようにします。このオプションによってMavenはインタラクティブなログを抑制するようになり、ログサイズが激減します。Travis CIはログサイズに上限があるため、うっかり忘れるとビルドが不安定になります。
グローバルにコマンドラインパラメータを指定する方法
グローバルにコマンドラインパラメータを指定する場合、それがローカルでの実行時にも必要となるパラメータならば、Maven 3.3から導入された .mvn/maven.config
あるいは .mvn/jvm.config
を使うことも可能です。ただし現状これらのファイルはコメントを書けないので、チームで使用する場合はどこかで説明が必要でしょう。
SonarCloudによるコード解析
FOSSならSonarCloudを使えば無料で解析できます。Travis CIには専用Addonがあって、MavenでSonarQube専用プロパティをややこしく設定しなくても、pom.xml
をよしなに解析してプロジェクトホームやIssueトラッカのURLを見つけてくれます。
なおコード解析をPRにも働かせる場合は、PRのもととなるブランチも同じリポジトリに存在する必要があります。これはトークンの復号化に必要なためです。
Travis CIによるSonatype Nexusへのデプロイ
これを取り入れるかどうかは意見が別れるところだと思います。というのもこれをやるには、暗号化済みとは言えGPG署名に必要なファイルやSonatype Nexusのパスワードをリポジトリにコミットする必要があるのです。
私の場合、個人プロダクトでは使わずに Maven Release Pluginを使うようにしています。ただしSpotBugsのような共同リポジトリの場合、リリース難度を下げ属人性をなくすために使用しています。
作業内容は単純に、GPG public keyring, GPG secret keyring そしてGPG passphaseとSonatype Nexusアカウント情報を含んだ settings.xml
を暗号化してリポジトリにコミットし、それをデプロイ時に使うだけです。以下のPRが参考になると思います。
GPGのkeyringは以下のようにコマンドで出力できます。
$ gpg --export $KEY_ID > .travis/pubring.gpg $ gpg --export-secret-key $KEY_ID > .travis/secring.gpg
またリリースの属人性をなくすため、リリース手順書も合わせてコミットしておくと良いでしょう。settings.xml
のテンプレートもあると、引継や暗号化済みファイルの更新に役立ちます。
Contributorに対するリマインド
GitHubはPRやIssueにテンプレートを作成することができます。またContributing Guidelineを作成することもできます。従来はこれがユーザに対するほぼ唯一のIssue/PR作成時のリマインダでした。
ただチェックボックスをテンプレートに入れたとしても、すべてのContributorがこれを使ってくれるわけではありません。ので、個人的には以下のブログで紹介されているProbotに期待しています。