はじめに
船井総研デジタルのoswです。業務でjenkinsに触れることになったので学習記録を残します。参考になる方がいらっしゃれば幸いです。
学習環境
- Windows 11 (WSL2 Ubuntu)
- jenkins 2.387.1 (AWS EC2)
githubからクローンする方法
jenkinsでgithubからクローンするには大きく分けて次の方法があるようです。jenkinsに限らず、個人で扱う場合は1の方法でも良いかもしれませんが、セキュリティ的な観点ではDeploy key
を登録して個別にアクセス許可を与える方が良さそうです。
- 全てのリポジトリ(public / private)にアクセス可能な設定をする
-
jenkins
ユーザの公開鍵
をgithubに登録する -
Personal Access Token
を登録する
-
- 特定のリポジトリ(public / private)にアクセス可能な設定をする
1.アクセスしたいリポジトリにDeploy key
を登録する
全てのリポジトリ(public / private)にアクセス可能な設定をする
jenkins
ユーザの公開鍵
をgithubに登録する
こちらは普段からgithubで公開鍵認証をしてる方なら直感的にわかる方法かと思います。jenkinsのジョブが走る際、ジョブの実行ユーザはjenkins
のようです。
そのため、jenkins
ユーザの公開鍵を作成し、それをgithubに登録します。ただ、jenkins
ユーザはログインシェルが設定されていないため一時的に設定し、用が済んだら元に戻しておきます。
別ユーザで鍵を作成、chownなどしてからjenkins
ユーザの.sshに入れても良いと思います。
# jenkinsユーザのログインシェルを確認する(/bin/false なのでjenkinsユーザに切り替えられない)
$ sudo cat /etc/passwd | grep jenkins
jenkins:x:995:993:Jenkins Automation Server:/var/lib/jenkins:/bin/false
# シェルを変更するため chsh をインストールする。EC2環境ではこれを利用しますが、その他は chsh を指定していただければ良いかと思います
$ sudo yum -y install util-linux-user
# jenkinsユーザのログインシェルを設定する
$ sudo chsh -s /bin/bash jenkins
# jenkinsユーザのログインシェルを確認する(/bin/bash なのでjenkinsユーザとしてログイン可能)
$ sudo cat /etc/passwd | grep jenkins
jenkins:x:995:993:Jenkins Automation Server:/var/lib/jenkins:/bin/bash
# jenkinsユーザに切り替え
sudo su - jenkins
# 公開鍵を作成する。今回はパスフレーズなしにします
$ ssh-keygen -t ed25519 -N '' -C ''
# 作成した公開鍵の中身をまるまるメモしておく
$ cat .ssh/id_ed25519.pub
# githubの公開鍵を取得する
$ ssh-keyscan -t ed25519 github.com > ~/.ssh/known_hosts
# jenkinsユーザからログアウト
exit
# ログインシェルを元に戻す。これでjenkinsユーザにはログインできなくなる
$ chsh -s /bin/false jenkins
githubの公開鍵を取得する件については補足を参照してください。
あとはコピーしておいた公開鍵をgithubに登録します。
- githubにログインし、右上のプロフィールアイコンから
Setting
を押下
- 左ペインの
SSH and GPG keys
を押下
-
New SSH key
を押下
- Titleを入力, Keyにはメモした鍵をそのままを入力し、
Add SSH key
を押下
このようにすると、ジョブの作成時に認証情報を指定せずにプライベートリポジトリもクローンできるようになります。(クローンするためのURLはSSHを指定)
下記は「フリースタイル」でジョブを作成、「ソースコード管理」をONにしてプライベートリポジトリを指定しています。
githubに登録したjenkins
ユーザの公開鍵を削除すると下記のようにエラーとなります。
補足
githubに公開鍵を登録する場合、予めgithubの公開鍵をknown_hosts
として登録しておく必要があります。これはsshなどで接続する際、ホスト認証をする過程でknown_hosts
を見に行く訳ですが、初回接続時にプロンプトが表示されyes
と入力しないとknown_hosts
に登録されません。
jenkinsのジョブを実行した場合、プロンプトは表示されないためそのままエラーとなりジョブ自体が失敗します。そのため、予めknown_hosts
として登録しています。
Personal Access Token
を登録する
jenkins
ユーザの公開鍵をgithubに登録する公開鍵認証の方法では鍵の生成、githubに生成した鍵の登録、githubの公開鍵をknown_hosts
に登録、と結構手間がかかります。Personal Access Token
を登録する場合は公開鍵認証よりもだいぶ楽になります。
- githubにログインし、右上のプロフィールアイコンから
Setting
を押下
- 左ペインの
Developer settings
を押下
- 左ペインの
Personal access tokens
>Tokens(classis)
を押下し、Generate new token
>Generate new token(classic)
を押下
-
Note
にトークンの表示名を付けます。repo
にチェック(リポジトリの操作が可能)し、ページ下部のGenerate token
を押下
- 生成されたトークンをメモしておきます。2度と見れないようですので、メモしてないとトークンを作り直すことになります。
-
jenkinsダッシュボード
>Jenkinsの管理
>Manage Credentials
>System
>グローバルドメイン
>Add Credencials
を押下。下記情報を入力してCreate
します。
公開鍵を使った時と同様、「フリースタイル」のジョブを作成し、認証が通ることを確認します。クローンで指定するURLはHTTPS
を指定し、認証情報
には先程作成した認証情報を選択します。正しく設定出来ているとエラーは出ません。
特定のリポジトリ(public / private)にアクセス可能な設定をする
アクセスしたいリポジトリにDeploy key
を登録する
これも公開鍵を登録することで認証を通します。流れはjenkinsユーザの公開鍵をgithubに登録するとほぼ同じです。
異なるのは作成した公開鍵をDeploy key
として登録するか否かです。Deploy key
として登録するには次のようにします。
github側に登録した公開鍵を削除し、Deploy key
を登録したリポジトリとそうでないリポジトリを並べて設定してみると、次のようにDeploy key
を登録したリポジトリは認証情報も設定せずエラーにはなりません。(クローンはSSH方式)
リポジトリ名 |
Deploy key 登録 |
---|---|
test | なし |
test2 | あり |
testリポジトリはDeploy key
を登録してませんが、Personal Access Token
を使えばエラーは発生しません。(クローン方式をSSH
-> HTTPS
に変更する必要あり)
おわりに
公開鍵の作成はちょっと手間ですが、認証情報を設定する必要もなくなるので便利ですね。