Jenkins OCP Agent研究,隨手記錄2

Jenkins OCP Agent研究,隨手記錄2

ZONGRU Li
9 min readJul 21, 2022

參考以下文章(LINK):

嘗試建置出可以在OCP上面進行image打包的Jenkins Agent Container

提供外部的Jenkins進行Agent Pod形式做pipeline

過程因為架構不一樣的關係,有做些微調整

首先我先在獨立的podman機台(起Jenkins Container的機台)上

拉取Redhatregistry.redhat.io/openshift4/ose-jenkins-agent-base

#登入redhat的registry(可能要登入帳密):
sudo podman login registry.redhat.io
#拉取Jenkins Agent Base image:
sudo
podman pull registry.redhat.io/openshift4/ose-jenkins-agent-base:v4.10.0-202206270836.p0.gc5b7159.assembly.stream

imageURL解說頁LINK

過程如果podman loginregistry.redhat.io可能需要另外的帳密:

先建立兩個Dockerfile:

1.Dockerfile.base:

儲存!
  • 內容除了引用Redhat提供的基本base Jenkins agent
  • ENV部分確保了Podmanbuildah執行上是在user namespace,且chroot isolation
  • 可以特別注意到就是基於RHbase Jenkins agent加裝podman,buildah,skopeo
  • 其餘還有很多解說可以參考原文

2.基於上面image為基礎的Dockerfile.python:

儲存
  • 基於前面第一個建立的image為基礎來建置實際供Jenkins使用的agent buildcontainer
  • 為了促使使用第一個包好的image,我把FROMimage只給名稱
#實際建置以上兩個image,第一個:
sudo podman build -t registry.redhat.io/openshift4/non-root-jenkins-agent-base -f Dockerfile.base
#實際建置以上兩個image,第二個:
sudo podman build -t registry.redhat.io/openshift4/non-root-jenkins-agent-python -f Dockerfile.python

最後也成功build完:

把上面最後的python那個image推上OCPRegistry,供之後Jenkins使用

#打Tag,指到OCP上要存放的Registry:
sudo podman tag \
registry.redhat.io/openshift4/non-root-jenkins-agent-python \
{公司OCP Registry位置}/{這邊放NameSpace}/non-root-jenkins-agent-python
#上述打好Tag的image推上去OCP裡面(過程要--tls-verify=false   --remove-signatures):
sudo podman push {公司OCP Registry位置}/{這邊放NameSpace}/non-root-jenkins-agent-python --tls-verify=false --remove-signatures
(如果有要求帳密就是用建立的ServiceAccount名稱與oc sa get-token {SA名稱}顯示的token)

建立新的SCC(SecurityContextConstraints)JenkinsJob使用的ServiceAccount使用

建立nonroot-builder.yml,內容如下:

這個東西要在OCPBastion上面建立

如內容,名稱會是nonrootbuilder
#執行建立:
oc apply -f nonroot-builder.yml
#賦予Jenkins使用的ServiceAccount這個SCC:
oc adm policy add-scc-to-user nonrootbuilder -z {ServiceAccount名稱} -n {NameSpace}
#07/25補充:
#移除jenkinssa的nonrootbuilder權限SCC,並新增anyuid這個SCC:
oc adm policy remove-scc-from-user nonrootbuilder -z jenkinssa -n jk
oc adm policy add-scc-to-user anyuid -z jenkinssa -n jk

(07/25補充):

嘗試建置簡單的pipeline Job:

執行上會卡在:

#錯誤訊息提示:
process apparently never started in /home/jenkins/agent/workspace/ocp4@tmp/durable-6e5ea581
(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)

可能原因:

手伸進去執行指令是可以的:

後來做了多方研究,一些整理的截圖如下:

最終發現其實只要不用sh呼叫的指令就可以正常執行

像是簡單echo 'hello'這是可以執行的

但是sh開頭的指令就不行

最後找到的解決辦法是這篇:

也就是我客製化的Container會有sh會卡住

所以要另外設置:

這樣就可以跑:

最終目前可以執行podman指令的pipeline內容如下:

真是費力費時的研究....(汗

隔天研究必要的設置,發現單一個Maven Container可以如下正常運作:

這樣也可以跑

當有兩個不同Container時候(其中一個是上面的Maven)

Maven那個Container也要加入以下設置:

securityContext:
runAsUser: 0
這個可以跑,不會卡在sh

但是以下這樣就會卡住:

當有兩個Container時,Maven那個沒有設runAsUser 0就會卡在sh

所以workdirJENKINS_AGENT_DIR的設定不是必要的

另外額外補充用ServiceAccountSecret Token內容

來當作Jenkins驅動Agent Pod的憑證,而不是之前直接塞~/.kube/config

#首先取得建立的ServiceAccount連帶建立的Secret
#(舊版k8s,會在建立SA時候連待建立Secret)
oc describe secret -n {NameSpace} $(oc describe sa jenkinssa -n {NameSpace}|grep Tokens|awk '{print $2}' )

嘗試把~/kube.config檔搬離開:

然後會看到有憑證的問題,因為現在呼叫的是https

所以只好再搬回去...

移除憑證後再嘗試連線:

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet