👨‍🦳

[Jenkins]SSHで接続先のコマンドを実行する

2024/11/15に公開

Jenkins JobでSSH接続

本記事で利用した環境

以下に本記事利用するマシンについて、以下に記載する。

項目名
SSH接続元 Ubuntu 22.04.5 LTS
SSH接続先 macOS 14.4.1

以下に本記事で題材にするJenkinsについて、以下に記載する。

項目名
バージョン 2.479.1

※Jenkinsはプラグイン利用でSSH接続していない。

構成図

構成図について、以下に記載する。

Jenkinsの設定

Jenkinsの設定について、以下に記載する。

  1. Jenkinsユーザの鍵生成
    Jenkinsユーザの鍵を生成するコマンドを以下に記載する。

    su jenkins #jenkinsユーザに変更
    ssh-keygen -t rsa -b 4096
    
  2. 接続先にJenkinsユーザの鍵配置
    接続先にJenkinsユーザの鍵を以下のコマンドで配置する。

    ssh-copy-id -i [公開鍵へのパス] [ホスト名]@[IP]
    

接続設定

接続設定について、以下に記載する。

  1. 接続先(macOSサーバ)の接続許可
    一般 -> 設定 -> 共有からリモートログインを許可

実装

Jenkins Jobで実装したパイプラインについて、以下に記載する。

// jenkins connect SSH vm and execution command
pipeline {
    agent any
    options {
        timestamps()
    }
    //Jenkins Jobに与えるパラメータを定義
    parameters {
        string(name: "CONNECTION_NAME", defaultValue: "mac", description: "SSH接続の接続名")
        string(name: "MACHINE_NAME", defaultValue: "dev", description: "仮想マシン名")
    }
    
    stages {
        stage('ssh connect') {
            steps {
                sh """
                    ssh -tt ${CONNECTION_NAME} << EOF
                    # 実行コマンド
                    exit
                    EOF
                """
            }
        }
    }
}

SSH接続は、-tt オプションを指定する。これは擬似端末を強制的に割り当てるためのオプションである。Jenkins JobがSSH接続後にコマンドを実行する場合-ttオプションがないと下記エラーが発生する場合がある。

Pseudo-terminal will not be allocated because stdin is not a terminal.

SSH接続後は、<< EOF~EOF内に実行したいコマンドを記載しexitでSSH接続を終了する。

Discussion