7.6. バイナリービルド
7.6.1. はじめに
OpenShift のバイナリービルドの機能では、開発者はビルドで Git リポジトリーの URL からソースをプルするのではなく、ソースまたはアーティファクトをビルドに直接アップロードします。ソース、Docker またはカスタムのストラテジーが指定された BuildConfig はバイナリービルドとして起動できます。ローカルのアーティファクトからビルドを起動する場合は、既存のソース参照をローカルユーザーのマシンのソースに置き換えます。
ソースは複数の方法で提供できます。 これは、start-build コマンドの使用時に利用可能な引数に相当します。
-
ファイルから (
--from-file
): これは、ビルドのソース全体が単一ファイルで構成されている場合です。たとえば、Docker ビルドはDockerfile
、Wildfly ビルドはpom.xml
、Ruby ビルドはGemfile
です。 -
ディレクトリーから (
--from-directory
): ソースがローカルのディレクトリーにあり、Git リポジトリーにコミットされていない場合に使用します。start-build
コマンドは指定のディレクトリーのアーカイブを作成して、ビルダーにソースとしてアップロードします。 -
アーカイブから (
--from-archive
): ソースが含まれるアーカイブがすでに存在する場合に使用します。アーカイブはtar
、tar.gz
またはzip
形式のいずれかを使用できます。 -
Git リポジトリーから (
--from-repo
): これはソースがユーザーのローカルマシンで Git リポジトリーの一部となっている場合に使用します。現在のリポジトリーの HEAD コミットがアーカイブされ、ビルド用に OpenShift に送信されます。
7.6.1.1. 使用例
バイナリービルドの場合は、ビルドでソースを既存の git リポジトリーからプルする必要がありません。バイナリービルドを使用する理由は以下のとおりです。
- ローカルコードの変更をビルドし、テストする。パブリックリポジトリーからのソースはクローンでき、ローカルの変更を OpenShift にアップロードしてビルドできます。ローカルの変更はコミットまたはプッシュする必要はありません。
- プロイベートコードをビルドする。新規ビルドをゼロからバイナリービルドとして起動することができます。ソースは、SCM にチェックインする必要なく、ローカルのワークステションから OpenShift に直接アップロードできます。
- 別のソースからアーティファクトを含むイメージをビルドする。Jenkins Pipeline では、Maven または C コンパイラー、これらのビルドを活用するランタイムイメージなどのツールでビルドしたアーティファクトを組み合わせる場合に、バイナリービルドが役立ちます。
7.6.1.2. 制限
- バイナリービルドは反復できません。バイナリービルドは、ビルドの開始時にアーティファクトをアップロードするユーザーに依存するため、そのユーザーが毎回同じアップロードを繰り返さない限り、OpenShift は同じビルドを反復できません。
- バイナリービルドは自動的にトリガーできません。バイナリービルドは、ユーザーが必要なバイナリーアーティファクトをアップロードする時にのみ手動で起動できます。
バイナリービルドとして起動したビルドには設定済みのソース URL が含まれる場合があります。その場合、トリガーでビルドが正常に起動しますが、ソースはビルドの最終実行時にユーザーが指定した URL ではなく、設定済みのソース URL から取得されます。
7.6.2. チュートリアルの概要
以下のチュートリアルは、OpenShift クラスターが利用可能であり、アーティファクトを作成できるプロジェクトが用意されていることを前提としています。このチュートリアルでは、git
と oc
がローカルで使用できる必要があります。
7.6.2.1. チュートリアル: ローカルコードの変更のビルド
既存のソースリポジトリーをベースにして新規アプリケーションを作成し、そのルートを作成します。
$ oc new-app https://github.com/openshift/ruby-hello-world.git $ oc expose svc/ruby-hello-world
初期ビルドが完了するまで待機し、ルートのホストに移動してアプリケーションのページを表示します。Welcome ページが表示されるはずです。
$ oc get route ruby-hello-world
リポジトリーをローカルにクローンします。
$ git clone https://github.com/openshift/ruby-hello-world.git $ cd ruby-hello-world
-
アプリケーションのビューに変更を加えます。任意のエディターで
views/main.rb
を編集します。<body>
タグを<body style="background-color:blue">
に変更します。 ローカルで変更したソースで新規ビルドを起動します。リポジトリーのローカルディレクトリーから、以下を実行します。
---- $ oc start-build ruby-hello-world --from-dir="." --follow ----
ビルドが完了し、アプリケーションが再デプロイされたら、アプリケーションのルートホストに移動すると、青のバックグラウンドのページが表示されるはずです。
ローカルでさらに変更を加えて、oc start-build --from-dir
でコードをビルドします。
また、コードのブランチを作成し、変更をローカルでコミットし、リポジトリーの HEAD をビルドのソースとして使用します。
$ git checkout -b my_branch $ git add . $ git commit -m "My changes" $ oc start-build ruby-hello-world --from-repo="." --follow
7.6.2.2. チュートリアル: プライベートコードのビルド
コードを保存するローカルディレクトリーを作成します。
$ mkdir myapp $ cd myapp
このディレクトリーで、以下の内容を含む
Dockerfile
という名前のファイルを作成します。FROM centos:centos7 EXPOSE 8080 COPY index.html /var/run/web/index.html CMD cd /var/run/web && python -m SimpleHTTPServer 8080
以下の内容を含む
index.html
という名前のファイルを作成します。<html> <head> <title>My local app</title> </head> <body> <h1>Hello World</h1> <p>This is my local application</p> </body> </html>
アプリケーションの新規ビルドを作成します。
$ oc new-build --strategy docker --binary --docker-image centos:centos7 --name myapp
ローカルディレクトリーの内容を使用して、バイナリービルドを起動します。
$ oc start-build myapp --from-dir . --follow
new-app
を使用してアプリケーションをデプロイしてから、そのルートを作成します。$ oc new-app myapp $ oc expose svc/myapp
ルートのホスト名を取得して、そこに移動します。
$ oc get route myapp
コードをビルドし、デプロイした後に、ローカルファイルに変更を加えて、oc start-build myapp --from-dir
を呼び出して新規ビルドを起動します。ビルドされると、コードが自動的にデプロイされ、ページを更新すると、変更がブラウザーに反映されます。
7.6.2.3. チュートリアル: パイプラインからのバイナリーアーティファクト
OpenShift の Jenkins では、適切なツールでスレーブイメージを使用して、コードをビルドすることができます。たとえば、maven
スレーブを使用して、コードリポジトリーから WAR をビルドできます。ただし、このアーティファクトがビルドされたら、コードを実行するための適切なランタイムアーティファクトが含まれるイメージにコミットする必要があります。これらのアーティファクトをランタイムイメージに追加するために、バイナリービルドが使用される場合があります。以下のチュートリアルでは、maven
スレーブで WAR をビルドし、Dockerfile
でバイナリービルドを使用してこの WAR を WIldfly のランタイムイメージに追加するように Jenkins パイプラインを作成します。
アプリケーションの新規ディレクトリーを作成します。
$ mkdir mavenapp $ cd mavenapp
WAR を wildfly イメージ内の適切な場所にコピーする
Dockerfile
を作成します。以下をDockerfile
という名前のローカルファイルにコピーします。FROM wildfly:latest COPY ROOT.war /wildfly/standalone/deployments/ROOT.war CMD $STI_SCRIPTS_PATH/run
Dockerfile の新規 BuildConfig を作成します。
注記これにより、ビルドが自動的に起動しますが、
ROOT.war
アーティファクトがまだ利用できないので初回は失敗します。以下のパイプラインでは、バイナリービルドを使用してその WAR をビルドに渡します。$ cat Dockerfile | oc new-build -D - --name mavenapp
Jenkins Pipeline で BuildConfig を作成します。この BuildConfig では WAR をビルドし、以前に作成した
Dockerfile
を使用してこの WAR でイメージをビルドします。ツールのセットでバイナリーアーティファクトをビルドしてから、最終的なパッケージ用に別のランタイムイメージと組み合わせる場合など、同じパターンを別のプラットフォームでも使用できます。 以下のコードをmavenapp-pipeline.yml
に保存します。apiVersion: v1 kind: BuildConfig metadata: name: mavenapp-pipeline spec: strategy: jenkinsPipelineStrategy: jenkinsfile: |- pipeline { agent { label "maven" } stages { stage("Clone Source") { steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [ [$class: 'RelativeTargetDirectory', relativeTargetDir: 'mavenapp'] ], userRemoteConfigs: [[url: 'https://github.com/openshift/openshift-jee-sample.git']] ]) } } stage("Build WAR") { steps { dir('mavenapp') { sh 'mvn clean package -Popenshift' } } } stage("Build Image") { steps { dir('mavenapp/target') { sh 'oc start-build mavenapp --from-dir . --follow' } } } } } type: JenkinsPipeline triggers: []
Pipeline ビルドを作成します。Jenkins がプロジェクトにデプロイされていない場合は、パイプラインが含まれる BuildConfig を作成すると、Jenkins がデプロイされます。Jenkins がパイプラインをビルドする準備ができるまで、2 分ほどかかる場合があります。Jenkins のロールアウトの状況を確認するには、
oc rollout status dc/jenkins
を起動します。$ oc create -f ./mavenapp-pipeline.yml
Jenkins の準備ができたら、以前に定義したパイプラインを起動します。
$ oc start-build mavenapp-pipeline
パイプラインがビルドを完了した時点で、new-app で新規アプリケーションをデプロイし、ルートを公開します。
$ oc new-app mavenapp $ oc expose svc/mavenapp
ブラウザーで、アプリケーションのルートに移動します。
$ oc get route mavenapp