使用 Ubuntu 來作為 Jenkins 的 Slave Node

8 mins.
  1. 1. Slave Node
    1. 1.1. 新增使用者
  2. 2. Jenkins Server
  3. 3. 新增 Node
    1. 3.1. 建立 Credential
    2. 3.2. 啟動
  4. 4. 安裝相關軟體
    1. 4.1. 安裝 java
    2. 4.2. 安裝 git
    3. 4.3. 安裝 docker
  5. 5. 問題排除
    1. 5.0.1. Docker Permssion Denied
  6. 5.1. Delete file permission

本篇會介紹如何使用 Ubuntu 來作為 Jenkins Slave Node 並且採用 SSH 的方式做連線。

相關環境版本
Jenkins Server: windows 11
Jenkins Version: 2.440.2
Slave Node: Ubuntu 22.04

Slave Node

安裝 openssh server

1
sudo apt-get install -y openssh-server

新增使用者

不能用安裝時所產生的使用者作為 ssh 連線的帳號

1
sudo adduser jenkins

產生 ssh key

1
ssh-keygen

~/.ssh 的目錄下會看到剛剛所產生的檔案,預設會是 id_rsa(私鑰)id_rsa.pub(公鑰)

複製公鑰 id_rsa.pub 至另一個檔案 authorized_keys,用來給 Jenkins 驗證對答案

1
cat id_rsa.pub > authorized_keys

Jenkins Server

在 server 的 .ssh 資料夾中新增 know_hosts 檔案,並加上前面所產生的 id_rsa.pub

如果是 windows ,可以參考安裝 SSH server

新增 Node

到 Jenkins 網站的 Nodes 頁面中新增一個 Node

new-node

  • Remote root directory,輸入遠端的執行跟目錄,建議是登入的使用者底下 /home/{user}/jenkins_agent

  • Labels,根據 job 的需要做輸入

  • Launch method,選擇 Launch agents vis ssh

    • Host,輸入目標電腦的 ip
    • Credentials,用新增的方法來產生一組專門資料,詳細作法後面介紹
    • Host Key Verification Strategy,選擇 Non verifying Verification Strategy

    只測試到這個做法可以順利將 node 跑起來

如果 server 和 slave 是不同平台,例如 windows/linux,那就必須在下面的 Node Properties 區塊中,重新設定一些 Tool Locations

建立 Credential

在 Kind 選擇 SSH Username with private key 的方式做認證

add-credential

  • Username,輸入登入 node 的帳號
  • Private Key,將前面 slave node 步驟所產生的 id_rsa 內容貼上

add-credential

啟動

以上設定都完成後,就可以讓 Node 啟動,可以發現連線成功,但是啟動失敗

1
2
3
4
[04/17/24 11:18:18] [SSH] Authentication successful.
[04/17/24 11:18:19] [SSH] Checking java version of /home/jenkins/jenkins-agent/jdk/bin/java
Couldn't figure out the Java version of /home/jenkins/jenkins-agent/jdk/bin/java
bash: line 1: /home/jenkins/jenkins-agent/jdk/bin/java: No such file or directory

到這邊已經差不多成功,剩下一些軟體的安裝

安裝相關軟體

安裝 java

1
sudo apt install -y openjdk-17-jre

安裝 git

1
sudo apt install -y git

安裝 docker

參考 Install Docker Engine on Ubuntu | Docker Docs

1
2
3
4
5
6
7
8
9
10
11
12
13
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

To install the latest version, run:

1
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

以上都安裝完畢,只要回到剛剛新增的 Node 並且重新啟動,就可以正常啟用。

問題排除

Docker Permssion Denied

當有看到以下的錯誤,可以用底下的做法來調整

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get https://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json: dial unix /var/run/docker.sock: connect: permission denied

Creating a group - docker

1
sudo groupadd docker

Adding user to the group “docker”

1
2
3
sudo usermod -aG docker $USER

sudo chmod 666 /var/run/docker.sock

Delete file permission

因為使用先在 slave node 起做 git pull,後續的行為是在 docker 裡面,預設是使用 root 作執行,會導致編譯出來的檔案 slave node 無法刪除,因此要將使用者加入到 root 群組

1
sudo usermod -aG root jenkins