ジェンキンスとは何ですか?CIサーバーの説明

Jenkinsは、パイプラインを使用して、言語とソースコードリポジトリのほぼすべての組み合わせに対して継続的インテグレーションまたは継続的デリバリー(CI / CD)環境をセットアップする簡単な方法を提供し、他のルーチン開発タスクを自動化します。Jenkinsは、個々のステップのスクリプトを作成する必要性を排除しませんが、ビルド、テスト、およびデプロイメントツールのチェーン全体を簡単にビルドするよりも高速で堅牢な方法で統合できます。

「ナイトリービルドを壊さないでください!」は、テスターのために毎朝新しく作成された毎日の製品バージョンを投稿するソフトウェア開発ショップの基本的なルールです。Jenkinsの前は、ナイトリービルドの中断を回避するために開発者ができる最善のことは、コードをコミットする前に、ローカルマシンで慎重かつ正常にビルドしてテストすることでした。しかし、それは、他の人の毎日のコミットなしに、自分の変更を単独でテストすることを意味しました。ナイトリービルドが自分のコミットを生き残るという確固たる保証はありませんでした。

Jenkins –元々はHudson –は、この制限に対する直接の対応でした。

ハドソンとジェンキンス

2004年、川口耕介はSunのJava開発者でした。川口は開発作業でビルドを壊すことにうんざりし、コードをリポジトリにコミットする前に、コードが機能するかどうかを知る方法を見つけたいと考えました。そこで川口は、Javaでそれを可能にする自動化サーバーを構築しました。これはHudsonと呼ばれます。ハドソンはSunで人気を博し、オープンソースとして他社に広まりました。

2011年に早送りすると、Oracle(Sunを買収した)と独立したHudsonオープンソースコミュニティとの間の論争により、名前が変更されたフォーク、Jenkinsが生まれました。2014年、川口はJenkinsベースの継続的デリバリー製品を提供するCloudBeesのCTOになりました。

ジェンキンスははるかに活発でしたが、両方のフォークは存在し続けました。今日、ジェンキンスプロジェクトはまだ活発です。ハドソンのウェブサイトは2020年1月31日に閉鎖されました。

2019年3月、Linux Foundationは、CloudBees、Google、および他の多くの企業とともに、Continuous Delivery Foundation(CDF)と呼ばれる新しいオープンソースソフトウェア財団を立ち上げました。Jenkinsの貢献者は、自分たちのプロジェクトをこの新しい財団に参加させるべきだと決定しました。当時、川口氏は、ユーザーにとって重要なことは何も変わらないと書いていた。

2020年1月、川口は新しいスタートアップであるLaunchableに移行すると発表しました。彼はまた、継続的デリバリー財団の技術監視委員会にとどまり、CloudBeesでの彼の役割をアドバイザーに切り替えたものの、Jenkinsから正式に辞任すると述べました。

関連ビデオ:CI / CDを使用してコードをより速く配信する方法

Jenkinsの自動化

現在、Jenkinsは、あらゆる種類の開発タスクの自動化をサポートする約1,600のプラグインを備えた主要なオープンソース自動化サーバーです。Kawaguchiが最初に解決しようとしていた問題、Javaコードの継続的インテグレーションと継続的デリバリー(つまり、プロジェクトの構築、テストの実行、静的コード分析の実行、デプロイ)は、人々がJenkinsで自動化する多くのプロセスの1つにすぎません。これらの1,600個のプラグインは、プラットフォーム、UI、管理、ソースコード管理、そして最も頻繁にはビルド管理の5つの領域にまたがっています。

Jenkinsのしくみ

Jenkinsは、WARアーカイブとして、主要なオペレーティングシステムのインストーラーパッケージとして、Homebrewパッケージとして、Dockerイメージとして、およびソースコードとして配布されています。ソースコードは主にJavaであり、Groovy、Ruby、およびAntlrファイルがいくつかあります。

Jenkins WARは、スタンドアロンで実行することも、TomcatなどのJavaアプリケーションサーバーでサーブレットとして実行することもできます。いずれの場合も、Webユーザーインターフェイスを生成し、RESTAPIへの呼び出しを受け入れます。

Jenkinsを初めて実行すると、長いランダムパスワードを持つ管理ユーザーが作成されます。このパスワードを最初のWebページに貼り付けて、インストールのロックを解除できます。

Jenkinsプラグイン

Jenkinsをインストールすると、デフォルトのプラグインリストを受け入れるか、独自のプラグインを選択できます。

プラグインの初期セットを選択したら、[インストール]ボタンをクリックすると、Jenkinsがプラグインを追加します。

Jenkinsのメイン画面には、現在のビルドキューとエグゼキューターのステータスが表示され、新しいアイテム(ジョブ)の作成、ユーザーの管理、ビルド履歴の表示、Jenkinsの管理、カスタムビューの確認、資格情報の管理へのリンクが表示されます。

新しいJenkinsアイテムは、6種類のジョブのいずれかに加えて、アイテムを整理するためのフォルダーにすることができます。

コマンドラインインターフェイスを開くオプションなど、[Jenkinsの管理]ページから実行できることは18あります。ただし、この時点で、パイプラインを確認する必要があります。パイプラインは、通常、スクリプトによって定義される拡張ワークフローです。

Jenkinsパイプライン

Jenkinsを構成したら、Jenkinsがビルドできるプロジェクトをいくつか作成します。あなたが間にできるスクリプトを作成するには、Web UIを使用して、現在のベストプラクティスは、Jenkinsfileという名前のパイプラインスクリプトを作成することですそして、あなたのリポジトリにそれを確認してください。以下のスクリーンショットは、マルチブランチパイプラインの構成Webフォームを示しています。

ご覧のとおり、基本的なJenkinsインストールでのこの種のパイプラインのブランチソースは、GitまたはGitHubを含むSubversionリポジトリです。他の種類のリポジトリや別のオンラインリポジトリサービスが必要な場合は、適切なプラグインを追加してJenkinsを再起動するだけです。試しましたが、Jenkinsプラグインがまだリストされていないソースコード管理システム(SCM)を考えることができませんでした。

Jenkinsパイプラインは、宣言型またはスクリプト型にすることができます。宣言型パイプライン、2の単純は、Groovyの互換構文と使用したい場合には、ファイルを起動することができ#!groovy、右方向へのあなたのコードエディタを指すように。宣言型パイプラインは、以下の3段階の例のように、pipelineブロックで始まりagent、を定義stagesし、実行可能ファイルを含むものを定義しstepsます。

パイプライン{

    エージェント任意

    ステージ{

        stage( 'ビルド'){

            ステップ{

                エコー「建物..」

            }

        }

        stage( 'テスト'){

            ステップ{

                echo 'テスト..'

            }

        }

        stage( 'Deploy'){

            ステップ{

                echo '展開中....'

            }

        }

    }

}

pipelineJenkinsパイプラインプラグインを呼び出すための必須の外部ブロックです。agentパイプラインを実行する場所を定義します。anyパイプラインまたはステージを実行するために利用可能なエージェントを使用することを言います。より具体的なエージェントは、使用するコンテナーを宣言する場合があります。次に例を示します。

エージェント{

    docker {

        画像 'maven:3-alpine'

        ラベル 'my-defined-label'

        args'-v / tmp:/ tmp '

    }

}

stages1つ以上のステージディレクティブのシーケンスが含まれます。上記の例では、ビルド、テスト、デプロイの3つの段階があります。

steps実際の仕事をしなさい。上記の例では、手順はメッセージを出力しただけです。より便利なビルドステップは次のようになります。

パイプライン{

    エージェント任意

    ステージ{

        stage( 'ビルド'){

            ステップ{

                sh'make '

                archiveArtifactsアーティファクト: '** / target / *。jar'、フィンガープリント:true

            }

        }

    }

}

ここではmake、シェルから呼び出して、生成されたJARファイルをJenkinsアーカイブにアーカイブしています。

このpostセクションでは、パイプラインの実行またはステージの最後に実行されるアクションを定義します。あなたがポストセクション内で事後条件ブロックの数を使用することができますalwayschangedfailuresuccessunstable、とaborted

たとえば、以下のJenkinsfileは、テスト段階の後に常にJUnitを実行しますが、パイプラインに障害が発生した場合にのみ電子メールを送信します。

パイプライン{

    エージェント任意

    ステージ{

        stage( 'テスト'){

            ステップ{

                sh 'チェックする'

            }

        }

    }

    役職 {

        常に{

            junit '** / target/*。xml'

        }

        失敗{

            メール:[email protected]、件名: 'パイプラインが失敗しました:('

        }

    }

}

宣言型パイプラインは、パイプラインを定義するために必要なもののほとんどを表現でき、GroovyベースのDSLであるスクリプト化されたパイプライン構文よりもはるかに簡単に習得できます。スクリプト化されたパイプラインは、実際には本格的なプログラミング環境です。

比較のために、次の2つのJenkinsファイルは完全に同等です。

宣言型パイプライン

パイプライン{

    エージェント{docker'node:6.3 '}

    ステージ{

        stage( 'build'){

            ステップ{

                sh'npm —バージョン '

            }

        }

    }

スクリプト化されたパイプライン

node( 'docker'){

    チェックアウトscm

    stage( 'ビルド'){

        docker.image( 'node:6.3')。inside {

            sh'npm —バージョン '

        }

    }

}

ブルーオーシャン、ジェンキンスGUI

最新かつ最高のJenkinsUIが必要な場合は、グラフィカルユーザーエクスペリエンスを提供するBlueOceanプラグインを使用できます。Blue Oceanプラグインを既存のJenkinsインストールに追加するか、Jenkins / Blue OceanDockerコンテナーを実行できます。Blue Oceanがインストールされていると、Jenkinsのメインメニューに追加のアイコンが表示されます。

必要に応じて、ブルーオーシャンを直接開くことができます。Jenkinsサーバーの/ blueフォルダーにあります。ブルーオーシャンでのパイプラインの作成は、プレーンなジェンキンスよりも少しグラフィカルです。

Jenkins Docker

先に述べたように、JenkinsはDockerイメージとしても配布されます。プロセスにはそれ以上のことはありません。SCMタイプを選択したら、URLと資格情報を指定し、単一のリポジトリからパイプラインを作成するか、組織内のすべてのリポジトリをスキャンします。Jenkinsfileを持つすべてのブランチは、パイプラインを取得します。

ここでは、Blue Ocean Dockerイメージを実行しています。これには、SCMプロバイダーのデフォルトリストよりも多くのGitサービスプラグインがインストールされています。

いくつかのパイプラインを実行すると、BlueOceanプラグインは上記のようにそれらのステータスを表示します。個々のパイプラインを拡大して、ステージとステップを確認できます。

ブランチ(上)とアクティビティ(下)を拡大することもできます。  

なぜジェンキンスを使うのですか?

私たちが使用しているJenkinsPipelineプラグインは、一般的な継続的インテグレーション/継続的デリバリー(CICD)のユースケースをサポートします。これは、おそらくJenkinsの最も一般的な使用法です。他のいくつかのユースケースには、特別な考慮事項があります。

Javaプロジェクトは、Jenkinsの最初の存在理由でした。JenkinsがMavenを使用したビルドをサポートしていることはすでに見てきました。Ant、Gradle、JUnit、Nexus、Artifactoryでも動作します。

Androidは一種のJavaを実行しますが、さまざまなAndroidデバイスでテストする方法の問題が発生します。Androidエミュレータプラグインを使用すると、定義したい数のエミュレートされたデバイスでビルドおよびテストできます。Google Play Publisherプラグインを使用すると、ビルドをGoogle Playのアルファチャンネルに送信して、リリースしたり、実際のデバイスでさらにテストしたりできます。

パイプラインのエージェントとしてDockerコンテナーを指定し、DockerコンテナーでJenkinsとBlueOceanを実行した例を示しました。Dockerコンテナーは、速度、スケーラビリティー、および一貫性を向上させるためにJenkins環境で非常に役立ちます。

JenkinsとGitHubには2つの主要なユースケースがあります。1つはビルド統合です。これには、GitHubリポジトリへのコミットごとにJenkinsをトリガーするサービスフックを含めることができます。2つ目は、GitHub認証を使用してOAuth経由でJenkinsへのアクセスを制御することです。

Jenkinsは、Java以外の多くの言語をサポートしています。C / C ++の場合、コンソールからエラーと警告をキャプチャし、CMakeを使用してビルドスクリプトを生成し、単体テストを実行し、静的コード分析を実行するプラグインがあります。Jenkinsには、PHPツールとの多くの統合があります。

Pythonコードをビルドする必要はありませんが(たとえば、Cythonを使用している場合、またはインストール用のPythonホイールを作成している場合を除く)、JenkinsがNose2やPytestなどのPythonテストおよびレポートツールと統合し、コードの品質を向上させると便利です。 Pylintなどのツール。同様に、Jenkinsは、Rake、Cucumber、Brakeman、CI :: ReporterなどのRubyツールと統合されています。

CI / CD用のJenkins

全体として、Jenkinsは、パイプラインを使用して、言語とソースコードリポジトリのほぼすべての組み合わせに対してCI / CD環境をセットアップする簡単な方法を提供し、他の多くのルーチン開発タスクを自動化します。Jenkinsは、個々のステップのスクリプトを作成する必要性を排除しませんが、ビルド、テスト、およびデプロイメントツールのチェーン全体を簡単にビルドするよりも迅速かつ堅牢に統合する方法を提供します。