Jenkins CLIをSSHで利用する

Jenkins CLIを稼働中のJenkinsサーバへSSHログインして操作する方法です。

# 想定環境

* CentOS7.5以降
* Jenkins 2以降（検証用環境はver. 2.138.1）
* リバースプロキシにApacheを利用

# 必要なプラグイン

* 特になし

# リバースプロキシの設定

[こちらの記事](https://wiki.jenkins.io/plugins/servlet/mobile?contentId=9043974#content/view/9043974) を参考に設定します。

# Jenkinsの設定を行う

## ポート番号を設定する

「 **Jenkinsの管理** 」→「 **グローバルセキュリティの設定**」→「 **SSH サーバー** 」→「 **SSHD ポート** 」で 「 **ランダム** 」 に設定します。

<img width="1024" alt="6D4E99BF-6B78-49D5-AD2E-23D9CEEB4E28.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/79373/f5ae76fc-768d-9136-eac3-0907ffb8499b.jpeg">
![9E7EC2C2-9249-4608-AF9E-EB17ACA6977D.jpeg](https://qiita-image-store.s3.amazonaws.com/0/79373/df46f10c-3746-cbf8-748c-01358a405802.jpeg)
![280BC478-6149-41F9-8524-33C56280A19E.jpeg](https://qiita-image-store.s3.amazonaws.com/0/79373/bab300e5-dca9-6f01-e8ce-2efd71fea633.jpeg)

## ユーザーに操作権限を与える

「 **Jenkinsの管理** 」→「 **グローバルセキュリティの設定**」→「 **権限管理** 」→「 **ログイン済みユーザーに許可** 」に設定します。

<img width="1024" alt="D02C71BC-5F5C-4D73-A93C-2C714A8EDBD9.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/79373/08d2eda7-8210-4478-79ab-b44b80072954.jpeg">


## Jenkins CLI操作用のユーザーを作成する

「 **Jenkinsの管理** 」→「 **ユーザーの管理** 」→「 **ユーザー作成** 」から今回はユーザー「jenkinscli」を作成します。管理者用のアカウントがすでにある場合はこの手順をスキップします。


<img width="1024" alt="942601E9-539C-4C12-9EA0-1E3A6430E362.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/79373/7d7c9bb1-ed87-89ba-1a2f-983b17432d5f.jpeg">
![D9C90099-1CA0-4E70-A473-89E7DC99F8DD.jpeg](https://qiita-image-store.s3.amazonaws.com/0/79373/99a94783-5100-87ee-a521-da2c81452d5b.jpeg)
<img width="1024" alt="E1EB21B1-7AFD-4A74-8918-880ED19A01C9.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/79373/b8528e85-1ecf-9ec6-b88f-91856d547ebd.jpeg">



## ペア鍵を作成する

Jenkinsが稼働しているシステムにSSHログインし **Jenkins CLIを操作するユーザーと同名のユーザー** を作成します。このユーザーの鍵を作成します。

<details><summary>ユーザーを追加するサンプルコード</summary><div>

```bash
# rootユーザーで実行する / パスワードが必要な場合はpasswdコマンドで適宜設定する
adduser jenkinscli
su jenkinscli

# jenkinscliユーザーで実行する
ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key (/home/jenkinscli/.ssh/id_rsa): 
Created directory '/home/jenkinscli/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/jenkinscli/.ssh/id_rsa.
Your public key has been saved in /home/jenkinscli/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vcbYq/bGKtlhGFQNY+nGYiu2UuKUdWuoDBj/JaPDoNo jenkinscli@tk2-243-31223.vs.sakura.ne.jp
The key's randomart image is:
+---[RSA 2048]----+
|       .=+       |
|      .....      |
|     . o         |
|.   . = +.       |
|.o o + BS .      |
|+ = B * o+ .     |
|.B B B +.o=      |
|..O o o o.o.     |
|o Eo   oo=o      |
+----[SHA256]-----+
```

</div></details>

## 公開鍵をJenkinsへ登録する

稼働中のJenkinsへ公開鍵を登録します

「 **Jenkinsの管理** 」→「 **ユーザーの管理** 」→「 **ユーザー名** 」→「 **設定** 」→「 **SSH Public Keys** 」の順で公開鍵を登録します。

<img width="1024" alt="DB325EC7-DA5C-4821-977C-4198DE9BAF8B.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/79373/d0129e63-5396-7cc8-5cf3-b120d77432aa.jpeg">
<img width="1024" alt="2F68FDBC-23C2-464C-B55D-F5AF96E783A7.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/79373/fd68d48f-6ca9-8004-e079-cb057f196962.jpeg">
<img width="1024" alt="0E87AB3A-5740-4C6B-AFB9-387A4B97B558.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/79373/17f00562-924d-6bac-0f63-3590e04a4cd4.jpeg">







# Jenkins CLIを利用する

稼働中のJenkinsへSSHログインしJenkins CLIを利用します

## ポートを調べる

SSHを利用してJenkins CLIを利用します。先ほどこの操作用ポートをランダムに選択するように設定しましたので操作用ポート番号を確認します。

```bash
# リバースプロクシの設定によって変化する
curl -v http://localhost:8080/jenkins/login 2>&1 | grep SSH-Endpoint| cut -d':' -f3
46321

# リバースプロクシの設定によって変化する
curl -v http://localhost:8080/login 2>&1 | grep SSH-Endpoint| cut -d':' -f3
46321
```

## Jenkins CLIを実行する

以下のコマンドでJenkins CLIのhelp画面を表示します

```bash
# jenkinscli操作用のユーザーで実行します
# ポート番号はランダムに変更されますので環境に合わせて下さい
su jenkinscli
ssh -l jenkinscli -p 46321 localhost help

  add-job-to-view
    Adds jobs to view.
  build
    ジョブをビルドします。オプションで完了するまで待ちます。
  cancel-quiet-down
    "quiet-down"コマンドの処理をキャンセルします。
  clear-queue
    ビルドキューをクリアします。
  connect-node
    ノードと再接続します。
  console
    ビルドのコンソール出力を取得します。
  copy-job
    ジョブをコピーします。
  create-credentials-by-xml
    Create Credential by XML
  create-credentials-domain-by-xml
    Create Credentials Domain by XML
  create-job
    標準入力をConfig XMLとして読み込み、ジョブを新規に作成します。
  create-node
    標準入力をConfig XMLとして読み込み、ノードを新規に作成します。
  create-view
    Creates a new view by reading stdin as a XML configuration.
  delete-builds
    ビルドを削除します。
  delete-credentials
    Delete a Credential
  delete-credentials-domain
    Delete a Credentials Domain
  delete-job
    ジョブを削除します。
  delete-node
    ノードを削除します。
  delete-view
    Deletes view(s).
  disable-job
    ジョブを無効化します。
  disconnect-node
    ノードとの接続を切断します。
  enable-job
    ジョブを有効化します。
  enable-plugin
    Enables one or more installed plugins transitively.
  get-credentials-as-xml
    Get a Credentials as XML (secrets redacted)
  get-credentials-domain-as-xml
    Get a Credentials Domain as XML
  get-job
    ジョブ定義XMLを標準出力に出力します。
  get-node
    ノード定義XMLを標準出力に出力します。
  get-view
    Dumps the view definition XML to stdout.
  groovy
    指定したGroovyスクリプトを実行します。
  groovysh
    対話式のGroovyシェルを起動します。
  help
    利用可能なコマンドの一覧を表示します。
  import-credentials-as-xml
    Import credentials as XML. The output of "list-credentials-as-xml" can be used as input here as is, the only needed change is to set the actual Secrets which are redacted in the output.
  install-plugin
    ファイル、URLおよびアップデートセンターからプラグインをインストールします。
  install-tool
    ツールの自動インストールを実行し、インストール先を表示します。
  keep-build
    ビルドを保存するようにマークします。
  list-changes
    指定したビルドの変更履歴を表示します。
  list-credentials
    Lists the Credentials in a specific Store
  list-credentials-as-xml
    Export credentials as XML. The output of this command can be used as input for "import-credentials-as-xml" as is, the only needed change is to set the actual Secrets which are redacted in the output.
  list-credentials-context-resolvers
    List Credentials Context Resolvers
  list-credentials-providers
    List Credentials Providers
  list-jobs
    指定したビューかItem Groupのすべてのジョブを一覧表示します。
  list-plugins
    インストール済みのプラグインを一覧表示します。
  login
    認証情報を保存して、認証情報なしにコマンドを実行できるようにします。
  logout
    loginコマンドで保存した認証情報を削除します。
  mail
    標準入力の内容をメールとして送信します。
  offline-node
    "online-node"コマンドが実行されるまで、ビルドを実行するノードの使用を一時的に停止します。
  online-node
    直前に実行した"online-node"コマンドを取り消し、ビルドを実行するノードの使用を再開します。
  quiet-down
    Jenkinsは再起動に向けて終了処理を実施中です。ビルドを開始しないでください。
  reload-configuration
    メモリにあるすべてのデータを破棄して、ファイルから再ロードします。設定ファイルを直接修正した場合に役に立ちます。
  reload-job
    Reload job(s)
  remove-job-from-view
    Removes jobs from view.
  restart
    Jenkinsを再起動します。
  safe-restart
    Jenkinsを安全に再起動します。
  safe-shutdown
    Jenkinsを終了モードに変更しビルドが完了後に、シャットダウンします。
  session-id
    Jenkinsの再起動ごとに変化するセッションIDを出力します。
  set-build-description
    ビルドの説明を設定します。
  set-build-display-name
    ビルドの名称を設定します。
  set-build-parameter
    現在実行中のビルドのビルドパラメータを設定、更新します。
  set-build-result
    現在のビルドの結果を設定します。ビルド中に呼び出された場合のみ動作します。
  shutdown
    Jenkinsサーバーを直ちにシャットダウンします。
  update-credentials-by-xml
    Update Credentials by XML
  update-credentials-domain-by-xml
    Update Credentials Domain by XML
  update-job
    標準入力からの情報でジョブ定義XMLを更新します。get-jobコマンドの正反対のことを行います。
  update-node
    標準入力からの情報でノード定義XMLを更新します。get-nodeコマンドの正反対のことを行います。
  update-view
    Updates the view definition XML from stdin. The opposite of the get-view command.
  version
    バージョンを表示します。 
  wait-node-offline
    ノードがオフラインになるのを待ちます。
  wait-node-online
    ノードがオンラインになるのを待ちます。
  who-am-i
    認証情報を表示します。
```

# 参考にしたサイト

- [Running Jenkins behind Apache - Jenkins - Jenkins Wiki](https://wiki.jenkins.io/plugins/servlet/mobile?contentId=9043974#content/view/9043974)
- [Jenkins CLI](https://jenkins.io/doc/book/managing/cli/)