Docker による Jenkins ベースの継続的な配信パイプラインの構築


アジャイル開発の重要なステップである継続的なインテグレーションは、プロダクトのイテレーションの時間を短縮しながら高品質を維持するように設計されています。コードが更新されるたびに、自動テストが実行されてコードと機能の有効性がテストされます。コードの配信とデプロイは、自動テストに合格した後でのみ可能です。

このセクションでは、最も一般的な統合ツールの 1 つである Jenkins と Alibaba Cloud Container Service を組み合わせて、自動テストとイメージビルドプッシュを実現する方法を説明します。

以下の例では、Alibaba Cloud Container Service を使用して自動テストと Docker イメージの構築を実行する方法を示します。これにより、高品質で継続的なインテグレーションが実現されます。

背景


コードが GitHub の nodejs プロジェクトに送信されるたびに、Alibaba Cloud Container Service Jenkins は単体テストを自動的に開始します。テストで問題が見つからなければ、Jenkins は続けてイメージをビルドし、ターゲットイメージリポジトリにプッシュします。最後に、Jenkins はユーザーに結果をメールで通知します。

一般的なプロセスを下図に示します。

slave-nodejs は、単体テストおよびイメージのビルドとプッシュに使用されるスレーブノードです。

Jenkins の概要

Jenkins は、Java で開発されたオープンソースの継続的インテグレーションツールです。継続的に繰り返される作業を監視してトリガーとし、複数のプラットフォームとプラグインの拡張に対応します。また、簡単にインストールでき、WebGUI ベースの管理機能を備えています。ジョブを使用してすべての作業ステップを記述します。ノードはプロジェクトの実行環境です。マスターノードは、Jenkins ジョブのデフォルトの実行環境であると共に、Jenkins アプリケーションのインストール環境でもあります。

マスター/スレーブについて

マスター/スレーブは、サーバー/エージェントの概念と同じです。マスターは、ジョブとスレーブ機を管理するための Web インターフェイスを提供します。ジョブは、マスターで実行するか、スレーブ機に割り当てることができます。1 つのマスターを複数のスレーブと関連付けて、異なるジョブまたは同じジョブの異なる設定に対応できます。

複数のスレーブ機を設定して、異なる複数のプロジェクト用に個別のテスト環境と、ビルド環境を準備することができます。

ポイント: ここで言う Jenkins のジョブおよびプロジェクトとはすべて、Jenkins のビルド単位、つまり実行単位を表します

Jenkins アプリケーションとスレーブノードのデプロイをする


異なるアプリケーションのビルドとテストには、異なる依存関係が必要です。ベストプラクティスは、対応する実行時の依存関係とツールを含む、異なるスレーブコンテナーを使用して、テストとビルドを実行することです。Python、nodejs、go などの異なる環境用に Alibaba Cloud Container Service が提供するスレーブイメージとサンプルテンプレートを使用することで、Jenkins アプリケーションとさまざまなスレーブノードを短時間で簡単に生成できます。また、Jenkins アプリケーションにノード情報を設定後、ビルドプロジェクト内の実行ノードを指定して統合プロセス全体を実装することができます。

注意: スレーブノード開発用に Alibaba Cloud Container Service によって提供されているイメージについては、https://github.com/AliyunContainerService/jenkins-slaves を参照してください。

手順

1. Jenkins オーケストレーションテンプレートを作成します。
新しいテンプレートを作成し、以下の内容に基づいてオーケストレーションを作成します。

 jenkins:  image: 'registry.aliyuncs.com/acs-sample/jenkins:latest'  ports:      - '8080:8080'      - '50000:50000'  volumes:      - /var/lib/docker/jenkins:/var/jenkins_home  privileged: true  restart: always   labels:      aliyun.scale: '1'      aliyun.probe.url: 'tcp://container:8080'      aliyun.probe.initial_delay_seconds: '10'      aliyun.routing.port_8080: jenkins  links:      - slave-nodejs slave-nodejs:  image: 'registry.aliyuncs.com/acs-sample/jenkins-slave-dind-nodejs'  restart: always   volumes:      - /var/run/docker.sock:/var/run/docker.sock  labels:      aliyun.scale: '1' 

2. テンプレートを使用して、Jenkins アプリケーションとスレーブノードを作成します。

Alibaba Cloud Container Service によって提供されている Jenkins サンプルテンプレートを直接使用して、Jenkins アプリケーションとスレーブノードを作成することもできます。

3. 正しく作成すると、Jenkins アプリケーションとスレーブノードがサービスリストに表示されます。

4. Container Service によって提供されるアクセスエンドポイントを開くと、デプロイしたばかりの Jenkins アプリケーションを使用できます。

自動テストおよびイメージの自動ビルドとプッシュを実行する

Jenkins アプリケーションのスレーブノードとしてスレーブコンテナーを設定します。

Jenkins アプリケーションを開き、[Jenkins の管理] インターフェイスを表示します。[ノードの管理] > [新規ノード作成] の順に選択し、対応するパラメーターを設定します。次のように設定します。

注意:

  • ラベルはスレーブ固有の ID です。
  • スレーブコンテナーと Jenkins コンテナーは、Alibaba Cloud プラットフォーム上で同時に実行します。インターネットからアクセスできないコンテナーノード IP アドレスを入力することで、テスト環境を分離できます。

  • 資格情報を追加するときは、slave-nodejs イメージ作成用の Docker ファイルで jenkins アカウントとパスワード (初期パスワードは jenkins) を使用します。Docker ファイルのアドレス: https://github.com/AliyunContainerService/jenkins-slaves/tree/master/jenkins-slave-dind-nodejs
  • 2. 自動テストを実装するためのプロジェクトを作成します。

    i. アイテムを作成し、フリースタイル・プロジェクトのビルドを選択します。

    ii. プロジェクト名を入力し、プロジェクトを実行するためのノードを選択します。この例では、上で作成した slave-nodejs-ut ノードを入力します。

    iii. ソースコードの管理とコードの分岐を設定します。この例では、GitHub を使用してソースコードを管理します。

    iv. ビルドのトリガーを設定します。この例では、GitHub Webhook とサービスを組み合わせることにより、プロジェクトの実行を自動的にトリガーします。

    v. Jenkins サービスフックを GitHub に追加して、自動トリガーを実装します。

    Github のプロジェクトホームページで [Settings] タブをクリックし、[Webhooks & services] > [Add service] の順にクリックして、[Jenkins (Git plugin)] を選択します。 [Jenkins hook URL] ダイアログボックスには、「${Jenkins IP}/github-webhook/」と入力します。

    1. http://jenkins.cd****************.cn-beijing.alicontainer.com/github-webhook/

    vi. Executes シェルタイプのビルドステップを追加し、テストを実行するためのシェルスクリプトを作成します。

    この例のコマンドは次のとおりです。

    1. pwd
    2. ls
    3. cd chapter2
    4. npm test

    3. イメージを自動的にビルドしてプッシュするためのプロジェクトを作成します。

    i. アイテムを作成し、フリースタイル・プロジェクトのビルドを選択します。

    ii. プロジェクト名を入力し、プロジェクトを実行するためのノードを選択します。この例では、上で作成した slave-nodejs-ut ノードを入力します。

    iii. ソースコードの管理とコードの分岐を設定します。この例では、GitHub を使用してソースコードを管理します。

    iv. 以下のトリガーを追加し、単体テストが成功した後でのみ自動イメージビルドを実装するように設定します。

    v. イメージをビルドしてプッシュするシェルスクリプトを作成します。

    この例のコマンドは次のようになります。

     a.cd chapter2 b.docker build -t registry.aliyuncs.com/qinyujia-test/nodejs-demo . c.docker login -u ${yourAccount} -p ${yourPassword} registry.aliyuncs.com d.docker push registry.aliyuncs.com/qinyujia-test/nodejs-demo 

    アプリケーションの自動再デプロイ


    はじめにアプリケーションをデプロイします。

    オーケストレーションテンプレートを使用して、上記で作成したイメージを Container Service にデプロイし、nodejs-demo アプリケーションを作成します。

    例:

     1.```
    2.express:
    3.image: 'registry.aliyuncs.com/qinyujia-test/nodejs-demo'
    4.expose:
    5. - '22'
    6. - '3000'
    7.restart: always
    8.labels:
    9. aliyun.routing.port_3000: express
    10.```

    自動的に再デプロイします。

    1. 作成されたばかりのアプリケーション nodejs-demo を選択し、トリガーを作成します。

    2. 「自動テストおよびイメージの自動ビルドとプッシュを実行する」で作成したシェルスクリプトに行を追加します。アドレスは、上で作成したトリガーによって提供されるトリガーリンクです。

     i.curl ‘https://cs.console.aliyun.com/hook/trigger?triggerUrl=***==&secret=***’ 

    自動テストおよびイメージの自動ビルドとプッシュを実行する」の例のコマンドを次のように変更します。

     i. cd chapter2
    ii. docker build -t registry.aliyuncs.com/qinyujia-test/nodejs-demo .
    iii. docker login -u ${yourAccount} -p ${yourPassword} registry.aliyuncs.com iv.docker push registry.aliyuncs.com/qinyujia-test/nodejs-demo
    v. curl ‘https://cs.console.aliyun.com/hook/trigger?triggerUrl=***==&secret=***’

    イメージをプッシュした後、Jenkins は nodejs-demo アプリケーションの再デプロイを自動的にトリガーします。

    実行結果のメール通知を設定する

    単体テストまたはイメージ設定の結果を関連する開発者またはプロジェクト実行開始担当者にメールで送る場合は、以下の設定を実行します。

    1. Jenkins のホームページで、[Jenkins の管理] > [システム設定] の順にクリックし、Jenkins システム管理者のメールアドレスを設定します。

    2. Extended Email Notification プラグインをインストールし、SMTP サーバーおよび他の関連情報を設定して、デフォルトの受信者リストを設定します。次のように設定します。

    上の図は Jenkins アプリケーションシステムのパラメーター設定の例です。次の例では、結果がメールでプッシュされる Jenkins プロジェクトの関連設定を示します。

    1. Jenkins プロジェクトにビルド後操作ステップを追加し、[Editable Email Notification] を選択して、受信者リストを入力します。

    2. メール送信トリガーを追加します。