1.はじめに
現代のソフトウェア開発では、__パイプラインという用語がよく使われます。しかし、それは何ですか?
一般的に言って、** ビルドパイプラインは、コードを開発から本番に移行する一連の自動ステップです。
ビルドパイプラインは、ソフトウェアの継続的インテグレーションワークフローを実装するのに最適です。それらは、バグをより早く見つけ、それらの影響を減らすことを目的として、
私たちが
より大きな頻度で** 小さな変更を構築することを可能にします。
このチュートリアルでは、https://travis-ci.org/[Travis CI]を使用して簡単なビルドパイプラインを構築することを検討します。
2.ビルドパイプラインのステップ
ビルドパイプラインは、さまざまな手順で構成できますが、少なくとも次の作業が含まれます。
-
Compiling code
:私たちの場合、それはJavaソースコードをコンパイルすることを意味します
クラスファイルに
**
テストの実行
:単体テストの実行や統合のようなもの
テスト
** 成果物のデプロイ:コンパイルしたコードを成果物にパッケージ化する、と言います。
jar
ファイルに展開し、それらをデプロイする
アプリケーションが異なるテクノロジを使用している場合は、
追加の手順をビルドパイプラインに含めることができます
。たとえば、JavaScriptファイルを縮小したり、更新されたAPIドキュメントを公開したりする追加の手順があるとします。
3. Travis CIとは何ですか?
サンプルビルドパイプラインには、クラウドベースの継続的統合ツールである** Travis CIを使用します。
これには、ビルドパイプラインを使い始めるための素晴らしい選択肢となるいくつかの機能があります。
-
パブリックGitHubリポジトリと素早く統合
-
すべての主要なプログラミング言語をサポート
-
複数の異なるクラウドプラットフォームにデプロイする
-
さまざまなメッセージングおよび警告ツールを提供
高レベルでは、GitHubリポジトリで新しいコミットを監視することで機能します。
新しいコミットが行われると、設定ファイルで定義されているようにビルドパイプラインのステップを実行します(詳細は後述)。いずれかのステップが失敗すると、パイプラインは終了し、それが通知されます。
箱から出してすぐに、Travis CIはほとんど構成を必要としません。
唯一必要な設定はプログラミング言語を指定することです
。
必要に応じて、パイプラインを調整するためにいつでもより多くの構成を提供できます。たとえば、どのブランチがビルドをトリガーするかを制限したり、パイプラインに追加の手順を追加したりすることができます。
3.1. 無料版と有料版
Travis CIには現在、無料版と有料版の2つの製品があります。
.org
ドメイン名で表示される無料版は、すべての公開GitHubリポジトリ
に対して
完全な機能を提供します。ビルドまたはリポジトリの数に制限はありませんが、パイプラインが実行されているときにはリソースの制限があります。
プライベートのGitHubリポジトリには、
.com
ドメイン名を使用する有料版が必要です。また、無料プランと比較して、より多くの同時ビルドと無制限のビルド時間を提供します。有料版をテストするための最初の100ビルドのための無料トライアルがあります。
4. Travis CIでビルドパイプラインを作成する
このチュートリアルでは、上記の無料版を使用します。無料のパイプラインを作成するために、任意の公開リポジトリを使用できます。
GitHubアカウントでTravis CIにログインして承認するだけです。
GitHubアカウントにアクセス許可を付与したら、ビルドパイプラインの構成を開始する準備が整いました。
4.1. リポジトリの設定
当初、私たちのすべてのパブリックリポジトリは非アクティブと見なされていました。これを解決するには、
アカウント設定ページからリポジトリを有効にする必要があります
。
これはトグルボタンとともに私たちのすべての公開リポジトリを一覧表示します。
トグルボタンをクリックすると、__masterのデフォルトブランチを使用して、そのリポジトリの新しいコミットの監視を開始するようにTravis CIが設定されます。
各リポジトリにも
Settings
ボタンがあります。これが異なるパイプライン動作を設定できる場所です。
-
どのイベントがパイプラインをトリガーするかを定義する
など)
** パイプラインに渡される環境変数を設定する
-
自動キャンセルは、新しいイベントが発生したときにビルドされます。
このチュートリアルでは、デフォルト設定で問題ありません。後で、デフォルトの動作のいくつかをオーバーライドする方法を見ます。
4.2. Travis設定を作成する
次のステップはリポジトリのルートディレクトリに
.travis.yml
という名前の新しいファイルを作成することです。このファイルには、パイプラインを構成するために必要なすべての情報が含まれています。 ** このファイルがないと、パイプラインは実行されません。
このチュートリアルでは、プログラミング言語を指定する最低限の設定を含めるだけです。
language: java
それでおしまい!これ以上の情報を提供することなく、Travis CIは以下のような単純なパイプラインを実行します。
-
私たちのソースコードをコンパイルします
-
テストを実行します
.travis.yml
ファイルをコミットすると、Travisは最初のビルドを開始します。
master
ブランチへのそれ以上のコミットは追加のビルドを引き起こします。ダッシュボードでは、コミットまたはプル要求を必要とせずにいつでも手動でパイプラインをトリガーすることもできます。
5.追加の設定
前のセクションでは、ビルドパイプラインを実行するために必要なのは1行の構成だけであることを確認しました。しかし、ほとんどのプロジェクトでは、意味のあるパイプラインを実装するために追加の構成が必要になります。
このセクションは私達が私達のパイプラインに加えたいと思うかもしれないいくつかのより有用な構成を概説する。
5.1. デフォルトのビルドコマンドを変更する
Mavenプロジェクトを構築するために使用されるデフォルトのコマンドは次のとおりです。
mvn test -B
.travis.yml
で
script
ディレクティブを設定することでこれを任意のコマンドに変更できます。
script: mvn package -DskipTests
を使用して、1つの
script__行に複数のコマンドをまとめることができます。
一部のビルドコマンドは複雑で、複数行にわたる場合や複雑なロジックを持つ場合があります。たとえば、環境変数に基づいてさまざまなアクションを実行する可能性があります。
-
このような場合は、buildコマンドをスタンドアロンのスクリプトに記述し、そのスクリプトを設定ファイル内から呼び出すことをお勧めします。
script: ./build.sh
5.2. コードの配置
Javaプロジェクトのデフォルトのビルド設定は、単にコードをコンパイルしてテストを実行するだけです。結果のアーティファクト(.jarファイルなど)は、どこかにデプロイしない限り、パイプラインの終わりに破棄されます。
Travis CIはさまざまな有名なサードパーティサービスをサポートしています。アーティファクトは、Amazon S3、Google Cloud Storage、Bintrayなどの一般的なクラウドストレージシステムにコピーできます。
また、https://docs.travis-ci.com/user/deployment/[コードをAWS、Google App Engine、Herokuなどの最も人気のあるクラウドコンピューティングプラットフォームに直接展開することもできます。
以下は、Herokuにデプロイする方法を示す設定例です。
暗号化されたプロパティを生成するには、https://github.com/travis-ci/travis.rb#readme[Travis CLIツール]を使用する必要があります。
deploy:
provider: heroku
api__key:
secure: "ENCRYPTED__API__KEY"
さらに、それは私たちが私たち自身の配備スクリプトを書くことを可能にする一般的な配備オプションを提供します。これは、ネイティブにサポートされていないサードパーティシステムにアーティファクトをデプロイする必要がある場合に役立ちます。
たとえば、アーティファクトをプライベートFTPサーバーに安全にコピーするシェルスクリプトを作成できます。
deploy:
provider: script
script: bash ./custom-deploy.sh
5.3. どのブランチがパイプラインをトリガするかの管理
デフォルトでは、パイプラインは
master
のコミットに対して実行されます。
しかし、ほとんどの大規模プロジェクトは開発サイクルを管理するために何らかの形のgit分岐を使用します。
-
Travis CIは、どのコミットがパイプラインをトリガーするかを判断するために、gitブランチのホワイトリストとブラックリストの両方をサポートしています。
例として、次の設定を考えます。
branches:
only:
- release
- stable
except:
- master
- nightly
これは
master
と
nightly
ブランチのコミットを無視します。
release
および
stable
ブランチへのコミットはパイプラインをトリガーします。
only
ディレクティブは常に
except
ディレクティブよりも優先されることに注意してください。
どの分岐がパイプラインをトリガーするかを制御するために正規表現を使うこともできます。
branches:
only:
-/^development.** $/----
これは__development__で始まるブランチのコミットに対してのみパイプラインを開始します。
==== 5.4. 特定のコミットをスキップする
** git commitメッセージを使って個々のコミットをスキップすることができます** 。 Travis CIは次のパターンについてメッセージを調べます。
** <KEYWORD>をスキップ
** <KEYWORD>スキップ
<KEYWORD>は以下のいずれかの値です。
** ci
** トラビス
** travis ci
** travis-ci
** トラヴィッシ
コミットメッセージがこれらのパターンのいずれかと一致すると、パイプラインは実行されません。
==== 5.5. 異なるビルド環境を使用する
Javaプロジェクトのデフォルトのビルド環境はUbuntu Linuxです。
以下の設定を__.travis.yml__に追加することで、Mac OSXまたはWindows Server上でパイプラインを実行することもできます。
[source,shell,gutter:,true]
os: osx # can also be ‘windows’
Linuxでも、3つの異なるディストリビューションから選択できます。 [source,text,gutter:,true]
os: linux
dist: xenial # other choices are ‘trusty’ or ‘precise’
https://docs.travis-ci.com/user/reference/overview/[build platform documentation]には、利用可能なすべての環境とその違いが記載されています。 プラットフォームを変更した場合、互換性を確保するためにカスタムの__build__または__deploy__スクリプトも変更する必要があるかもしれません。 https://docs.travis-ci.com/user/multi-os/[複数のオペレーティングシステムを処理する]にはいくつかの方法があります。 ==== 5.6. 異なるJDKバージョンの使用 __.travis.yml__ファイルに次の設定を設定することで、JDKの特定のバージョンに対してテストすることもできます。 [source,text,gutter:,true]
jdk: oraclejdk8
ビルド環境が異なれば、Linuxディストリビューションが異なれば、使用可能なJDKバージョンも異なる可能性があることに注意してください。 JDKのバージョンの完全なリストについては、各環境の資料を参照してください。 === 6.行列を作る デフォルトでは、パイプラインが実行されるたびに、それは単一のジョブとして実行されます。これは、パイプラインのすべてのフェーズが単一の仮想マシン上で同じ設定で順次実行されることを意味します。 しかし、Travis CIの優れた機能の1つは、ビルドマトリックスを作成できることです。これにより、以前に確認した設定のいくつかに異なる値を使用して、コミットごとに複数のジョブを実行できます。 たとえば、LinuxとMac OSXの両方で、またはJDK 8と9の両方でパイプラインを実行するために、ビルドマトリックスを使用できます。 ** 構築行列を作成する方法は2つあります** 。まず、以前に見た1つ以上の言語と環境の設定に対して** 値の配列を** 提供できます。例えば: [source,text,gutter:,true]
language: java
jdk:
– openjdk8
– openjdk9
os:
– linux
– osx
このアプローチを使用して、Travis CIは自動的に複数のジョブを形成するために設定のあらゆる組み合わせを拡張します。上記の例では、結果は合計4つのジョブになります。 ** 構築行列を作成する2番目の方法は__matrix.include__ディレクティブを使うことです。これにより、実行したい組み合わせを明示的に宣言できます。 [source,text,gutter:,true]
language: java
matrix:
include:
– jdk: openjdk8
os: linux
– jdk: openjdk9
os: osx
上記の例では、2つのジョブが発生します。 繰り返しになりますが、複数のオペレーティングシステム上で構築する場合は、__build__および__deployment__スクリプトがすべてのケースで機能するように注意する必要があります。たとえば、シェルスクリプトはWindowsでは機能しません。異なるオペレーティングシステムを処理するには、適切な条件文を使用する必要があります。 https://docs.travis-ci.com/user/build-matrix/[その他のオプション]があり、どのジョブを作成し、どのように障害を処理するかをより細かく制御できます。 === 7.まとめ この記事では、Travis CIを使用して簡単なビルドパイプラインを作成しました。 ほとんどそのまま使用できる構成を使用して、コードを構築しテストを実行するパイプラインを作成しました。 Travis CIの設定可能性のほんの少しの例も見ました。さまざまなプログラミング言語とサードパーティのクラウドプラットフォームで動作します。 1つの欠点は、現在GitHubリポジトリでしか動作しないことです。 Travis CIを使用してパイプラインを管理している方法については、https://github.com/eugenp/tutorials/[GitHubページ]を参照してください。