コンテンツへスキップ

JenkinsのDockerイメージを再構築

JenkinsのポータルにJenkinsの新しいバージョンの通知が表示されます。
Dockerで導入したJenkinsコンテナにでは、Dockerイメージを再構築し、永続的なアップデートが必要となります。

Docker環境にJenkinsを導入した際の投稿:

「image: jenkins:latest」を利用した場合に、初期設定のプラグインインストールに失敗したので、「image: jenkins/jenkins:lts」を利用しました。

docker-composeの内容

services:
  jenkins1:
    container_name: master
    image: jenkins/jenkins:lts
    environment:
      TZ: Asia/Tokyo
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    restart: always

JenkinsのDockerイメージを再構築

  1. docker-compose動作しているDockerコンテナのシャットダウン
  2. docker-compose でイメージをビルド
  3. コンテナをバックグランドで起動
$ cd jenkins
$ sudo docker-compose down
$ sudo docker-compose pull
$ sudo docker-compose up -d

以上で、最新のltsイメージに更新されます。コンテナ便利ですね。

jenkins_homeは永続化ボリュームとして構築しているので、Jenkinsのプラグインの更新は、ポータルサイト(WEB管理画面)より通常通り実施します。

前提条件

JetsonにJenkins向けユーザー作成

別にセットアップされた、Jenkinsシステムより、NVIDIA Jetson Nanoを管理対象と資するために、Jetson NanoにJenkinsから操作する用のユーザーを作成します。

  1. Jetson Nanoに新規ユーザー作成
  2. Jenkins向けユーザーのsudoコマンド設定 パスワード
  3. Jenkins向けユーザーでのGitHubからのPull設定

1. Jenkins向けユーザーを作成

NVIDIA Jetson NanoにJenkinsユーザーを作成します。

$ sudo useradd -m -s /bin/bash jenkins
$ sudo passwd jenkins
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

2. Jenkins向けユーザーのSudoコマンド設定

Jenkinsユーザーで、各種スクリプトを実行するので、sudoが簡単に実行出来るように設定します。
※ 全体的にパスワードなしでのsudoを許可しているので、利用するコマンドごとの設定や、各種設定ファイルのアクセス権などを環境に合わせて設定し、セキュリティ対策を行って下さい。

$ cd /etc/sudoers.d/
$ sudo vi jenkins

作成するjenkinsファイルへの記載内容

Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD:ALL

3. Jenkins向けユーザーでのGitHubからのPull設定

Jenkinsを利用して、Githubに新しいソースコードがコミットされた際に、Githubより新規ソースコードの通知をトリガーとして、Jenkinsのタスクを実行させます。

Githubへの新規コミットをトリガーに、ジャンケンシステムを構成するメインのIntel NUC Ubuntuサーバー、Raspberry Pi、NVIDIA Jetson Nanoに最新のソースコードが自動的にデプロイ(Pull)される環境を構築しました。
デプロイ前に、簡単なテストなども自動化することが出来ます。

設定には、Jenkinsユーザー向けのSSHキーをNVIDIA Jetson Nanoで作成し、作成したSSHキーをGithubに登録します。GithubにSSHキーが登録出来たら、NVIDIA Jetson NanoからGithubへのアクセスを確認します。

Jetson NanoでSSHキー作成

Jenkinsユーザー向けのSSHキーを作成します。
このSSHキーをGithubに登録します。
Githubに登録することにより、Jenkinsユーザーを用いて、Githubの操作が可能になります。

$ sudo su jenkins
$ cd /home/jenkins/
$ mkdir .ssh
jenkins@jetson02:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jenkins/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jenkins/.ssh/id_rsa.
Your public key has been saved in /home/jenkins/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:
The key's randomart image is:

GithubへSSHキーの登録と接続確認

https://github.com/settings/keys で id_rsa.pub の内容を登録します。

NVIDIA Jetson NanoからGithubへ接続確認

最後に、対象のサーバーより接続確認を行います。

ssh -T git@github.com
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

めざましじゃんけん結果速報の安定動作に向けて

そろそろ、めざましじゃんけん広場を活性化させたいのですが、肝心のめざましじゃんけん速報の信頼性が十分に上がっておりません。

2020年も開始し、3週分のめざましじゃんけんが実施されました。
3週目なのですが、2回の結果速報不備が発生しました。
1件目は、実は先週の土曜日から発生しており、1月18日と20日の結果配信に一部不備が発生しました。
2件目は、めざましじゃんけんの対戦者の表示に不備が発生しました。

1件目は、Raspberry Piのフィリーズ。2件目は、ツイッター情報を本番でテキスト処理するので、想定されていないケースで失敗し、結果速報が正確に行えなくなります。

修正内容とJenkins

めざましじゃんけん結果画像検出システム実装方式の変更内容。
端的に説明すると、今まで、独立して動いていた2系統のシステムを統合的に動作させます。
Raspberry Piでシステムを稼働させ、システムの稼働率を上げるためにNVIDIAのJetson Nanoを導入しました。その際に、それぞれのシステムを独立して動作させておりました。しかし、片系にしか入らない処理があったり、シングルボードのシステムの信頼性ではシステム稼働率には大きな影響を与えました。

関連記事:めざましじゃんけん システム大規模改修

今までの実装

  • 起動方法は、Raspberry Pi with Intel NSC2およびNVIDIA Jetson NanoのそれぞれのCronで定期処理
    それぞれのシステムで定期実行させて、平行実行させておりました
  • Raspberry Piでテレビの電源ON/OFFを操作
  • じゃんけん結果後の処理は、結果を早く取得したシステムで実施
    • 通常はJetson Nanoが実施、結果取得結果が異なる場合は、アラートメール

これからの実装

  • Intel NUCのJenkinsより統合管理、Raspberry Pi with Intel NSC2とJetson Nanoは、じゃんけん結果の取得と登録に専念。(じゃんけん予想も実施させています)
  • テレビON処理失敗時には、Nature Remoを利用した電源操作もバックアップとして導入

悩んでいるところ

以下、2点を悩んでおります。

  • Jenkinsサーバーの冗長化
  • Raspberry Piの推論部分のIntel NUCへの移管

Jenkinsのノードの冗長化は、Raspberry Piに担当させて見ようかなと考えております。Raspberry Piの推論部分ですが、Intel NUCに移管しようかと考えております。Intel NSC2とIntel NUCの組み合わせでの機械学習も試してみたいところ。

WEBアクセスの負荷もあるので、まずは、性能情報を監視しして、どうするか考える予定です。

Intel Neural Compute Stick 2
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

前提条件

JenkinsとGithubを連携

Jenkinsを利用して、Githubに新しいソースコードがコミットされた際に、Githubより新規ソースコードの通知をトリガーとして、Jenkinsのタスクを実行させます。

私は、Githubへの新規コミットをトリガーに、ジャンケンシステムを構成するメインのIntel NUC Ubuntuサーバー、Raspberry Pi、NVIDIA Jetson Nanoに最新のソースコードが自動的にデプロイ(Pull)される環境を構築しました。
デプロイ前に、簡単なテストなども自動化することが出来ます。

Jenkins向けユーザーを作成

Raspberry PiやNVIDIA JetsonにJenkinsユーザーを作成します。

@raspberrypi:~ $ sudo useradd -m -s /bin/bash jenkins
@raspberrypi:~ $ sudo passwd jenkins
新しいパスワード:
新しいパスワードを再入力してください:
passwd: パスワードは正しく更新されました

Sudo設定

Jenkinsユーザーで、各種スクリプトを実行するので、sudoが簡単に実行出来るように設定します。
※ 全体的にパスワードなしでのsudoを許可しているので、利用するコマンドごとの設定や、各種設定ファイルのアクセス権などを環境に合わせて設定し、セキュリティ対策を行って下さい。

@raspberrypi:~ $ cd /etc/sudoers.d/
@raspberrypi:/etc/sudoers.d $ sudo vi jenkins
$ cat << EOS > /etc/sudoers.d/jenkins
Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD:ALL
EOS
Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD:ALL

SSHキー作成

Jenkinsユーザー向けのSSHキーを作成します。
このSSHキーをGithubに登録します。
Githubに登録することにより、Jenkinsユーザーを用いて、Githubの操作が可能になります。

jenkins@raspberrypi:/ $ sudo su jenkins

jenkins@raspberrypi:/ $ cd /home/jenkins

jenkins@raspberrypi:~ $ mkdir .ssh

jenkins@raspberrypi:~ $ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jenkins/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jenkins/.ssh/id_rsa.
Your public key has been saved in /home/jenkins/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:9QoADCZcq+4jyOWd3QeAy8av7K2riVNTK6F+TlQXU78 jenkins@raspberrypi
The key's randomart image is:

GithubへSSHキーの登録と接続確認

https://github.com/settings/keys で id_rsa.pub の内容を登録します。

最後に、対象のサーバーより接続確認を行います。

ssh -T git@github.com

 

created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

 

 

 

 

Jenkins導入

複数機器の管理、複雑なCronでのシステム管理など、スケジュール管理には導入をお勧めします。
一度利用すると、この便利さから抜け出せません。無償でここまで高機能な管理ソフトが利用出来るのは、ただただすごいです。

前提

Docker Composeを利用して、Jenkinsを導入します。
Docker Composeの導入がまだの場合は、Docker Composeを事前に導入して下さい。

docker-compose.yml作成

利用するイメージファイルですが、「image: jenkins:latest」を利用した場合に、初期設定のプラグインインストールに失敗する場合があるので、「image: jenkins:latest」を利用します。

services:
  jenkins1:
    container_name: master
    image: jenkins/jenkins:lts
    environment:
      TZ: Asia/Tokyo
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    restart: always

初回Jenkins起動

docker-compose up

作成したdocker-compose.ymlファイルのディレクトリで、docker-compose upコマンドを実行し、Jenkinsの起動を行います。

初回起動時には、最新のJenkinsのイメージが取得され、イメージのビルドが実行されます。
大切なのが、初回の起動に、Jenkinsのセットアップ時に必要となるパスワードが表示されます。初回ブラウザでのアクセス時に、パスワードの入力が必要になります。

Jenkins初期設定

JenkinsにWEBブラウザでアクセスし、初期設定を行います。

Webブラウザ上でhttp://localhost:18080/にアクセスし、Jenkinsイメージをビルドした際に表示されたパスワードを画面に入力し、初期設定を進めます。

Customize JenkinsのInstall suggested pluginsで失敗する際は、利用するコンテナイメージを確認して下さい。「image: jenkins:latest」を利用した場合に、初期設定のプラグインインストールに失敗する場合があるので、「image: jenkins:latest」を利用します。

created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)