著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

継続的インテグレーション/継続的デプロイ(CI / CD)パイプラインは、DevOps環境のコアコンポーネントの1つです。 複数のチーム間のワークフローを合理化し、生産性を向上させるのに役立ちます。 Jenkinsは、CI/CDパイプラインをセットアップできる広く使用されているオープンソース自動化サーバーです。

このチュートリアルでは、KubernetesにJenkinsをインストールします。 次に、Jenkins UIにアクセスし、サンプルパイプラインを実行します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • 動作中のKubernetesクラスタとkubectlがワークステーションにセットアップされています。 Kubernetesクイックスタートに従って、DigitalOceanにKubernetesクラスターをセットアップします。

ステップ1—KubernetesへのJenkinsのインストール

Kubernetesには宣言型APIがあり、YAMLまたはJSONファイルを使用して目的の状態を伝えることができます。 このチュートリアルでは、YAMLファイルを使用してJenkinsをデプロイします。 クラスタにkubectlコマンドが設定されていることを確認してください。

まず、kubectlを使用して、Jenkins名前空間を作成します。

  1. kubectl create namespace jenkins

次に、JenkinsをデプロイするYAMLファイルを作成します。

nanoまたはお好みのエディタを使用して、jenkins.yamlという名前の新しいファイルを作成して開きます。

  1. nano jenkins.yaml

次に、次のコードを追加して、Jenkinsイメージ、そのポート、およびその他のいくつかの構成を定義します。

jenkins.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts
        ports:
          - name: http-port
            containerPort: 8080
          - name: jnlp-port
            containerPort: 50000
        volumeMounts:
          - name: jenkins-vol
            mountPath: /var/jenkins_vol
      volumes:
        - name: jenkins-vol
          emptyDir: {}

このYAMLファイルは、 Jenkins LTSイメージを使用してデプロイメントを作成し、ポート808050000も開きます。 これらのポートを使用して、Jenkinsにアクセスし、Jenkinsワーカーからの接続をそれぞれ受け入れます。

次に、jenkins名前空間にこの展開を作成します。

  1. kubectl create -f jenkins.yaml --namespace jenkins

クラスターに数分待って、Jenkinsイメージをプルし、Jenkinsポッドを実行します。

kubectlを使用して、ポッドの状態を確認します。

  1. kubectl get pods -n jenkins

次のような出力が表示されます。

NAME                       READY   STATUS    RESTARTS   AGE
jenkins-6fb994cfc5-twnvn   1/1     Running   0          95s

ポッド名は環境によって異なることに注意してください。

ポッドが実行されたら、サービスを使用して公開する必要があります。 このチュートリアルでは、NodePortサービスタイプを使用します。 また、ワーカーがJenkinsに接続するためのClusterIPタイプのサービスを作成します。

jenkins-service.yamlという名前の新しいファイルを作成して開きます。

  1. nano jenkins-service.yaml

次のコードを追加して、NodePortサービスを定義します。

jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30000
  selector:
    app: jenkins

---

apiVersion: v1
kind: Service
metadata:
  name: jenkins-jnlp
spec:
  type: ClusterIP
  ports:
    - port: 50000
      targetPort: 50000
  selector:
    app: jenkins

上記のYAMLファイルでは、NodePortサービスを定義してから、Jenkinsポッドのポート8080をポート30000に公開します。

次に、同じ名前空間にサービスを作成します。

  1. kubectl create -f jenkins-service.yaml --namespace jenkins

サービスが実行されていることを確認します。

  1. kubectl get services --namespace jenkins

次のような出力が表示されます。

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jenkins NodePort your_cluster_ip <none> 8080:30000/TCP 15d

NodePortとJenkinsが動作しているので、JenkinsUIにアクセスして探索を開始する準備が整います。

ステップ2—JenkinsUIへのアクセス

このステップでは、JenkinsUIにアクセスして探索します。 NodePortサービスには、クラスターノード全体のポート30000からアクセスできます。 Jenkins UIにアクセスするには、ノードIPを取得する必要があります。

kubectlを使用して、ノードIPを取得します。

  1. kubectl get nodes -o wide

kubectlは、外部IPを使用して出力を生成します。

Output
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME your_node Ready <none> 16d v1.18.8 your_internal_ip your_external_ip Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9 your_node Ready <none> 16d v1.18.8 your_internal_ip your_external_ip Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9 your_node Ready <none> 16d v1.18.8 your_internal_ip your_external_ip Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9

your_external_ip値の1つをコピーします。

次に、Webブラウザーを開き、http://your_external_ip:30000に移動します。

管理者パスワードと、Jenkinsポッドログからこのパスワードを取得する手順を尋ねるページが表示されます。

kubectlを使用して、これらのログからパスワードを取得してみましょう。

まず、ターミナルに戻り、ポッド名を取得します。

  1. kubectl get pods -n jenkins

次のような出力が表示されます。

NAME                       READY   STATUS    RESTARTS   AGE
jenkins-6fb994cfc5-twnvn   1/1     Running   0          9m54s

次に、ポッドのログで管理者パスワードを確認します。 強調表示されたセクションをポッド名に置き換えます。

  1. kubectl logs jenkins-6fb994cfc5-twnvn -n jenkins

パスワードを見つけるには、上下にスクロールする必要がある場合があります。

Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
. . .

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

your_jenkins_password

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
. . .

your_jenkins_passwordをコピーします。 ブラウザに戻り、JenkinsUIに貼り付けます。

パスワードを入力すると、Jenkinsはプラグインをインストールするように促します。 異常なことは何もしていないので、推奨プラグインのインストールを選択します。

インストール後、Jenkinsは新しいページをロードし、管理者ユーザーを作成するように求めます。 フィールドに入力するか、スキップを押してこの手順をスキップし、adminリンクとして続行します。 これにより、ユーザー名は admin のままになり、パスワードはyour_jenkins_passwordのままになります。

インスタンス構成について尋ねる別の画面が表示されます。 今ではないリンクをクリックして続行します。

この後、Jenkinsは選択内容の概要を作成し、 Jenkinsの準備ができました! Jenkinsの使用を開始をクリックすると、Jenkinsのホームページが表示されます。

jenkins wizard

クラスターにJenkinsをインストールして構成したので、その機能をデモンストレーションし、サンプルパイプラインを実行しましょう。

ステップ3—サンプルパイプラインの実行

Jenkinsは、パイプラインの作成とCI/CDワークフローの管理に優れています。 このステップでは、Jenkinsのサンプルパイプラインの1つを構築します。

Jenkinsのホームページから、左側のメニューの新しいアイテムリンクをクリックします。

新しいページが表示されます。 パイプラインを選択し、OKを押します。

jenkins wizard

Jenkinsはパイプラインの構成にリダイレクトします。 パイプラインセクションを見つけて、サンプルパイプラインドロップダウンメニューから HelloWorldを選択します。 このメニューは右側に表示されます。 Hello World を選択したら、保存ボタンをクリックします。

jenkins wizard

Jenkinsはパイプラインのホームページにリダイレクトします。 左側のメニューから今すぐビルドをクリックし、パイプラインが実行を開始するのを確認します。 #1 は、これが最初のビルドであることを示します。 タスクが完了すると、ビルドに関するいくつかの統計が表示されます。

jenkins wizard

コンソール出力をチェックして、パイプラインの実行中に何が起こったかを確認することもできます。 #1 にカーソルを合わせると、ドロップダウンメニューが表示されます。 コンソール出力を選択して、ビルドの詳細を表示します。

Hello World パイプラインはそれほど洗練されていませんが、JenkinsがCI/CDワークフローをどれだけうまく作成および管理できるかを示しています。

結論

このチュートリアルでは、KubernetesクラスターにJenkinsをインストールして構成してから、サンプルパイプラインを実行しました。 Jenkinsには、非常に複雑な操作を実行するのに役立つプラグインの大規模なリポジトリがあります。 GitHubリポジトリ、複数の種類のワーカーインスタンスなどを追加することもできます。 Jenkinsの使用方法の詳細については、Jenkinsの公式ドキュメントを参照してください。