Jenkins OCP Agent研究,隨手記錄2
參考以下文章(LINK):
嘗試建置出可以在OCP上面進行image打包的Jenkins Agent Container
提供外部的Jenkins進行Agent Pod形式做pipeline
過程因為架構不一樣的關係,有做些微調整
首先我先在獨立的podman機台(起Jenkins Container的機台)上
拉取Redhat的registry.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
image的URL解說頁LINK
過程如果podman login到registry.redhat.io可能需要另外的帳密:
先建立兩個Dockerfile:
1.Dockerfile.base:
- 內容除了引用Redhat提供的基本base Jenkins agent
- ENV部分確保了Podman或buildah執行上是在user namespace,且chroot isolation
- 可以特別注意到就是基於RH的base Jenkins agent加裝podman,buildah,skopeo
- 其餘還有很多解說可以參考原文
2.基於上面image為基礎的Dockerfile.python:
- 基於前面第一個建立的image為基礎來建置實際供Jenkins使用的agent build的container
- 為了促使使用第一個包好的image,我把FROM的image只給名稱
#實際建置以上兩個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推上OCP的Registry,供之後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)供Jenkins起Job使用的ServiceAccount使用
建立nonroot-builder.yml,內容如下:
這個東西要在OCP如Bastion上面建立
#執行建立:
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 jkoc 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
但是以下這樣就會卡住:
所以workdir與JENKINS_AGENT_DIR的設定不是必要的
另外額外補充用ServiceAccount的Secret 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
所以只好再搬回去...
移除憑證後再嘗試連線: