yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

Jenkins超入門(Vagrant・CentOS7)〜(4)Job作成・後編〜

2019-10-22

Jenkins超入門(Vagrant・CentOS7)〜(3)Job作成前編〜 の続き

Job作成3〜まとめたrpmを任意のサーバにSCP転送(upload)〜

前回までで
(1) Gitからコードを取得して(Checkout)
(2) rpmにまとめて(Build-prep、Build)
というところまで設定が完了したので、今回は

(3) 任意のサーバにSCP転送(upload)
というJob設定(Stage)を追加する

SCPが少し厄介で、
JenkinsでSCPを使うには、「SSH Agent」というPluginのインストールが必要
なので、流れとしては、
0. 環境準備(SCP先サーバ作成)
1. 「SSH Agent」Pluginをインストール
2. SCPするための鍵設定
3. Job設定
4. いざ実行
という流れ

0. 環境準備(SCP先サーバ作成)

SCP先のサーバを作成してこの環境を作る

Vagrantで作成する
(最初にJenkinsサーバと一緒に作っておいたほうが効率よかった)

※Macのターミナルから操作

% mkdir jenkins_dstserver
% cp Vagrantfile jenkins_dstserver
% cd jenkins_dstserver
% vim Vagrantfile
% cat Vagrantfile | egrep -v "#" | egrep -v "^$"
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.define "jenkinsDstserver" do |server|
    server.vm.network "private_network", ip: "192.168.33.101"
  end
end

起動

% vagrant up

ログイン

% vagrant ssh
[vagrant@localhost ~]$ sudo su
[root@localhost vagrant]#

あと、これは必須ではないのだけど
今回、二つのサーバ(Jenkinsサーバ、SCP先のサーバ)を使うので
わかりやすいようにターミナル設定を変えておく

SCPサーバの方は「[vagrant@jkDst ~]$」と表示されるようにする

[root@localhost vagrant]# hostname jkDst
[root@localhost vagrant]# hostname
jkDst
[root@localhost vagrant]#
[root@localhost vagrant]# export PS1="[\u@\h \w]$"
[root@localhost /home/vagrant]$exit
exit
[vagrant@localhost ~]$ exit
logout
Connection to 127.0.0.1 closed.
[yoshi@19-10-20T16:47:24] ~/jenkins_work/jenkins_dstserver
% vagrant ssh
Last login: Sun Oct 20 07:46:04 2019 from 10.0.2.2
[vagrant@jkDst ~]$

Jenkinsサーバの方は「[root@jkSv vagrant]#」と表示されるようにする

[root@localhost vagrant]# hostname jkSv
[root@localhost vagrant]# hostname
jkSv
[root@localhost vagrant]#
[root@localhost vagrant]# export PS1="[\u@\h \w]$"
[root@localhost /home/vagrant]$
[root@localhost /home/vagrant]$exit
exit
[vagrant@localhost ~]$ exit
logout
Connection to 127.0.0.1 closed.
[yoshi@19-10-20T16:48:39] ~/jenkins_work
%
[yoshi@19-10-20T16:48:40] ~/jenkins_work
% vagrant ssh
Last login: Sun Oct 20 06:07:59 2019 from 10.0.2.2
[vagrant@jkSv ~]$
[vagrant@jkSv ~]$ sudo su
[root@jkSv vagrant]#

これで準備は完了

1. 「SSH Agent」Pluginをインストール

「SSH Agent」プラグインをインストールする
(すでにインストールされていればここの手順は飛ばしてOK)

「Manage Jenkins」をクリック

「Manage Plugins」をクリック

「Available」タブから「SSH Agent」を検索し「Download now and install after restart」をクリック
※検索窓を使うと便利

するとインストールが始まる

スクロール

再起動しないとインストールが完了しないので再起動をする
先ほどの「Installed」タブから「Restart Once No Jobs Are Running」をクリック

しばらくすると再起動するので
再ログインする

「Installed」タブを見ると、無事に「SSH Agent」プラグインがインストールされていることが確認できる

2. SCPするための鍵設定

Jenkinsサーバで公開鍵を作成し
SCP先のサーバに登録をしておく

Jenkinsサーバで公開鍵作成
「/var/lib/jenkins/.ssh/id_rsa.pub」に鍵が作成されるのでコピーする

[root@jkSv vagrant]# sudo -u jenkins ssh-keygen
[root@jkSv vagrant]# cat /var/lib/jenkins/.ssh/id_rsa.pub
ssh-rsa AAAAXXXXXXXXXXXXXXXXXXXXX jenkins@jkSv
[root@jkSv vagrant]#

SCP先サーバの「~/.ssh/authorized_keys」に先ほどコピーした鍵を「追記」しておく
(今回私は「vagrant」ユーザーにSCPするので、vagrantユーザーのホームディレクトリを利用)

[vagrant@jkDst ~]$ vi ~/.ssh/authorized_keys
[vagrant@jkDst ~]$ tail -1 ~/.ssh/authorized_keys
ssh-rsa AAAAXXXXXXXXXXXXXXXXXXXXX jenkins@jkSv
[vagrant@jkDst ~]$

Jenkinsサーバの鍵をSCP先サーバにコピペしたら
Jenkinsの方での認証情報の設定も必要

「Credentials」をクリック

「System」→「Global credentials(unrestricted)」とクリック

「adding some credentials?」をクリック

必要情報を入力し「OK」
(jenkinsユーザーは自動で作成されるユーザーでSCPはjenkinsユーザーとして実施される)
* Kind:SSH Username with private key
* ID:jenkins
* Username:jenkins

これで完了

3. Job設定

ここまで来てようやくJobの設定ができる

前回作成していたJobで「Configure」をクリック

下までスクロールして「Pipeline Syntax」をクリック

「Sample Step」でインストールした「sshagent: SSH Agent」を選択し「Generate Pipeline Script」でスクリプトを作成

このように記載するらしい

sshagent(['jenkins']) {
    // some block
}

先ほど自動作成したスクリプトをScriptに追記する
中身は「ssh 【SCP先サーバのユーザー名】@【SCP先サーバのIP】 “mkdir -p ~/rpms/”」と「scp dist/*.rpm 【SCP先サーバのユーザー名】@【SCP先サーバのIP】:~/rpms/」
※mkdirをしておかないと「scp: /home/vagrant/rpms/: Is a directory」のエラーが出てしまったので事前に作るようにしている

node {
    stage 'Checkout'
    checkout([$class: 'GitSCM',
        branches: [[name: '*/release']],
        doGenerateSubmoduleConfigurations: false,
        extensions: [],
        submoduleCfg: [],
        userRemoteConfigs: [[url: 'https://github.com/hylom/grrreader']]
    ])
    
    stage 'Build-prep'
    sh "cd dist && make clean"
    
    stage 'Build'
    sh "cd dist && make"
 
    stage 'upload'
    sshagent(['jenkins']) {
        sh 'ssh vagrant@192.168.33.101 "mkdir -p ~/rpms/"'
        sh 'scp dist/*.rpm vagrant@192.168.33.101:~/rpms/'
    }
    
}

「Save」を押して完了

4. いざ実行

実行は「Build Now」から

何度かトライしたが最終的には成功
※「Host key verification failed」などのエラーが出た場合は、jenkinsユーザーの設定がおかしい可能性があるので、以下「トラシュー 」の「「Host key verification failed」と出た場合」を確認ください

SCP先サーバを見るときちんとrpmファイルが置かれている

[vagrant@jkDst ~]$ ls rpms/
grrreader-0.0.7-3.noarch.rpm
[vagrant@jkDst ~]$

トラシュー

ここからはBuildの際に引っかかった点について

「/bin/sh: rpmbuild: command not found」と出た場合

「/bin/sh: rpmbuild: command not found」と出た場合

メッセージの通り、rpm-buildをインストールする
※ハイフンが間に入るので注意

 
[root@jkSv vagrant]# sudo yum -y install rpm-build

「/var/tmp/rpm-tmp.Sa3yoj: line 29: npm: command not found」と出た場合

「/var/tmp/rpm-tmp.Sa3yoj: line 29: npm: command not found」と出た場合

メッセージの通り、npmをインストールする
※ライブラリを事前に入れる必要があるのがミソ

 
[root@jkSv vagrant]# yum -y install epel-release
[root@jkSv vagrant]# yum -y install npm --enablerepo=epel

参考
node.jsをyumでインストールする(centos6.5)

「Host key verification failed」と出た場合

「Host key verification failed」と出た場合
これが一番つまづいた

原因は、jenkinsユーザーのシェルが「/bin/false」となっていたこと
参考:Jenkinsをインストールしたにもかかわらず、sudo su – jenkins でjenkinsユーザーになれない場合の対処

jenkinsユーザーはjenkinsをインストールした時に自動で作られるものの、ログインパスワードは設定されていないので設定しておく
※Jenkinsサーバで実施

 
[vagrant@localhost ~]$ sudo passwd jenkins
Changing password for user jenkins.
New password:
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
[vagrant@localhost ~]$

パスワード設定したのでログインしてみようとすると
うまくログインできているようでできない状況に
これで、jenkinsユーザー周りの設定がおかしいと気がついた

 
[vagrant@localhost ~]$ su - jenkins
Password:
Last login: Sun Oct 20 15:10:05 UTC 2019 on pts/0
Last failed login: Sun Oct 20 15:10:52 UTC 2019 on pts/0
There was 1 failed login attempt since the last successful login.
[vagrant@localhost ~]$
[vagrant@localhost ~]$ whoami
vagrant
[vagrant@localhost ~]$

jenkinsユーザーを確認するとログインシェルが「/bin/false」となっている

[vagrant@localhost ~]$ cat /etc/passwd | grep jenkins
jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/false
[vagrant@localhost ~]$

これを他のユーザーと同じように「/bin/bash」に変える
※シェルの変更は、注意して実施してください

[vagrant@localhost ~]$ sudo chsh jenkins -s /bin/bash
Changing shell for jenkins.
Shell changed.
[vagrant@localhost ~]$
[vagrant@localhost ~]$ cat /etc/passwd | grep jenkins
jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/bash
[vagrant@localhost ~]$

これで無事にログインできるようになり、「Host key verification failed」のエラーも解消された

[vagrant@localhost ~]$ su - jenkins
Password:
Last login: Sun Oct 20 15:18:41 UTC 2019 on pts/0
-bash-4.2$
-bash-4.2$ whoami
jenkins
-bash-4.2$

これで入門終わり!