問題目標
- 自動化實現(xiàn)jenkins container的初始化。包含初始化jenkins job、plugins十籍、slave node 等等
問題描述
- 我們采用官網(wǎng)推薦的方式,將job的config.xml舞竿、jenkins所需要的插件(由于AWS下載插件速度過慢)、以及node 的config.xml均使用docker cp的方式從容器外部copy到容器內(nèi)
/var/jenkins_home
下的對應文件 - 當使用docker cp將插件和job都放在容器中的正確位置之后,打開jenkins GUI發(fā)現(xiàn)沒有一個job被load玩荠。
思路
- Q1:為什么明明在容器中的
~/jobs/
下面存放了一個test job枚冗,卻在GUI上看不到這個job围俘? - A1:表象是GUI上看不見這個test job羹呵,真實的是這個job沒有被創(chuàng)建,既然創(chuàng)建失敗瓷们,必然會有l(wèi)og信息业栅。因此
docker logs jenkins -f
發(fā)現(xiàn)果然報錯,報出錯誤java.io.IOException: Failed to create a temporary file in /var/jenkins_home/jobs/test/builds Caused by: java.io.IOException: Permission denied
錯誤信息很明顯說是沒有辦法在/var/jenkins_home/jobs/test
下創(chuàng)建builds文件
- Q2:為什么沒有辦法在
/var/jenkins_home/jobs/test
下創(chuàng)建builds文件秒咐? - A2:看到permission denied可以反應過來,肯定是test文件夾下不能創(chuàng)建文件碘裕。那么我們進入容器查看test文件夾的權(quán)限反镇,發(fā)現(xiàn)權(quán)限很奇怪
drwxr-xr-x 3 501 dialout 4096 Aug 17 10:11 test
,那么說明我現(xiàn)在需要一個寫權(quán)限,通過使用whoami
發(fā)現(xiàn)當前用戶是jenkins
娘汞,發(fā)現(xiàn)文件夾確實沒有給jenkins寫權(quán)限歹茶,那么不如直接chmod
修改權(quán)限,但是jenkins用戶沒有chmod的權(quán)限。只好重新cp 一份權(quán)限是775 的test文件夾你弦。發(fā)現(xiàn)依舊不能創(chuàng)建文件惊豺。
- Q3:為什么權(quán)限改成755這時候我已經(jīng)給jenkins用戶分配了寫的權(quán)限為什么還是不能創(chuàng)建文件呢?
- A3:因為好奇去查看的Linux文件權(quán)限禽作,才發(fā)現(xiàn)自己對文件權(quán)限的理解一直是錯的尸昧。我一直以為
drwxr-xr-x 3 501 dialout 4096 Aug 17 10:11 test
第一組rwx是分給root用戶的,第二組是給jenkins的旷偿,第三組是給其他人的烹俗,所以理解完全錯誤。用一張圖給出正解:
image.png
因此說明此時jenkins并不是501用戶萍程,他只有最后一組權(quán)限幢妄。所以我嘗試重新再次修改權(quán)限為757docker cp。此是GUI可以看到這個job了茫负,但是不能構(gòu)建蕉鸳,構(gòu)建就會立刻報錯
No such file: /var/jenkins_home/jobs/test/builds/2/log
進入容器發(fā)現(xiàn)builds文件夾存在但是沒有2文件夾
- Q4:既然沒有/builds/2/log文件能說明builds文件夾jenkins也沒有創(chuàng)建文件的權(quán)限對嗎?這樣改下去什么真的很痛苦忍法,有沒有別的辦法潮尝?
- A4:查看build之后發(fā)現(xiàn)確實沒有權(quán)限創(chuàng)建文件。想起胡老師說盡量不要改權(quán)限饿序,可以采用讓當前用戶cp一份這個文件勉失,那么jenkins用戶就擁有了對文件的所有權(quán)限了。這時候原探,在容器中使用jenkins用戶在jobs 下cp test test1 乱凿。restart之后發(fā)現(xiàn)可以test1 job并且可以構(gòu)建。
- Q5:問題解決踢匣,突然想起來看到的test文件的owner竟然是501告匠,是什么鬼?為什么使用docker cp進來的文件權(quán)限如此奇怪离唬?
- A5:經(jīng)過查閱Linux知識發(fā)現(xiàn):每個用戶其實有對應的UID number(比如root UIDnumber是0),而UID是501的用戶是admin划鸽。并且查閱官網(wǎng)后發(fā)現(xiàn)使用docker cp將文件從容器外cpoy到容器內(nèi)文件owner會變成root--->files copied to a container are created with UID:GID of the root user.
反思
- Linux基礎知識實在太差输莺。
action
- 以后每天至少總結(jié)一條Linux基礎知識戚哎,不可以間斷