[雲端] Jenkins === ###### tags: `雲端`, `Jenkins` <br> ![](https://i.imgur.com/25RSr1D.png) [TOC] <br> ## 如何新增帳號,並賦予權限? - Security / Manage Users ![](https://i.imgur.com/3OXlaMK.png) --- <img src="https://i.imgur.com/vJkNg49.png" style="border: 1px solid; "> --- <img src="https://i.imgur.com/ghZ17R9.png" style="border: 1px solid; "> - 權限採用 union (聯集) 當一個帳號擁有多個角色,若某個功能需要權限,會去各角色詢問 <br> ## 權限(Permissions) ### [權限] ==權限的通則(非常重要)== 1. ### 角色差別 - 「全域角色」就是根目錄 (例如:```麵包屑: Jenkins/```) - 「資料夾角色」就是子目錄 (例如:```麵包屑: Jenkins/tj_folder```) - tj_folder 亦視為「資料夾角色」的根目錄 - 兩者差別是: - 「全域角色」比「資料夾角色」多了 ==**Agent**== 和 ==**Overall**== 類別權限 ([下一節](#權限-全域角色的權限-vs-資料夾角色的權限)有列舉對照) 2. ### 權限相對關係 - **某一層**擁有的**權限**為: - 上層、或更上層的所有權限集合(**聯集**) - **上層**要前往**下層**子目錄,上層要先有權限 - 例如: ```jenkins(根目錄)/tj_folder(folder角色根目錄)/A/B/C``` - 要存取C,需要 jenkins 層授予 job_read 或是 tj_folder 授予 job_read 才能繼續往下層存取 - 若上層未授予權限,即使 C 擁有 folder 角色的全部權限,仍無法讀取 ![](https://i.imgur.com/xTweLzi.png =50%x50%) 3. ### 權限所產生的物件所屬關係 - **某一層** 擁有的**物件**為: - 上層、或更上層的所有物件集合(**聯集**) <br> ### [權限] ==全域角色的權限 v.s. 資料夾角色的權限== > 「全域角色」比「資料夾角色」多了 Agent 和 Overall 類別權限 | global-permission<br>全域角色的權限<br>(根目錄資料夾) | folder-permission<br>資料夾角色的權限<br>(子目錄資料夾) | |----------------------------|----------------------------| | Credentials/Create | Credentials/Create | | Credentials/Delete | Credentials/Delete | | Credentials/ManageDomains | Credentials/ManageDomains | | Credentials/Update | Credentials/Update | | Credentials/UseItem | Credentials/UseItem | | Credentials/UseOwn | Credentials/UseOwn | | Credentials/View | Credentials/View | | Agent/Build | | | Agent/Configure | | | Agent/Connect | | | Agent/Create | | | Agent/Delete | | | Agent/Disconnect | | | Agent/ExtendedRead | | | Agent/Provision | | | Overall/Administer | | | Overall/Manage | | | Overall/Read | | | Overall/SystemRead | | | Job/Build | Job/Build | | Job/Cancel | Job/Cancel | | Job/Configure | Job/Configure | | Job/Create | Job/Create | | Job/Delete | Job/Delete | | Job/Discover | Job/Discover | | Job/ExtendedRead | Job/ExtendedRead | | Job/Move | Job/Move | | Job/Read | Job/Read | | Job/WipeOut | Job/WipeOut | | Job/Workspace | Job/Workspace | | Run/Artifacts | Run/Artifacts | | Run/Delete | Run/Delete | | Run/Replay | Run/Replay | | Run/Update | Run/Update | | View/Configure | View/Configure | | View/Create | View/Create | | View/Delete | View/Delete | | View/Read | View/Read | | SCM/Tag | SCM/Tag | | Lockable Resources/Reserve | Lockable Resources/Reserve | | Lockable Resources/Unlock | Lockable Resources/Unlock | | Lockable Resources/View | Lockable Resources/View | <br> ### [權限] ==如何查閱需要什麼權限?== - ### 方法一:UI 會直接顯示「缺少 XXX 權限」 ![](https://i.imgur.com/QMqG2KU.png) 上面的圖顯示:缺少 ```Credentials/View``` 權限 http://10.78.26.241:58080/credentials/ - ### 方法二:從 URL 判斷 底下這個 URL http://10.78.26.241:58080/++job++/tj_folder3/ 就可以推斷跟 job 有關的權限 要能 read ,權限應該會是 Job/Read - ### 方法三:分上半部 / 下半部,進行二分搜尋 (暴力法) - 對所有的權限分兩半搜尋 - 上半部全打勾 - 下半部全取消 - 如果還是有 Access Denied,表示所需的權限位於下半部 - 反覆進行,就可以找到對應的權限 :+1: <br> <hr> <br> ## 憑證(Credentials) ### [憑證] ==倉庫架構== - #### store 就是用於儲存物件的地方,比如儲放憑證 - Jenkins 就是一個 store - 每個帳戶(使用者) 也擁有自身的 store - #### domain 為領域 - 簡單講就是:用來建立「類別」,分門別類 <br> <table> <thead> <tr> <th>store (憑證倉庫)</th> <th>domain (領域)</th> <th> 補充說明</th> </tr> </thead> <tbody> <tr> <td>Jenkins<br>(就是根目錄)</td> <td>(global) (預設領域)<br>可額外建立其他領域<br>底下以此類推</td> <td>User 可在 Source Code Management 資訊看到全部</td> </tr> <tr> <td>Jenkins/tj_folder/A/B<br>(子目錄範例)</td> <td>(global)</td> <td>User 可在 Source Code Management 資訊看到該層以上的憑證,但不包含其子層</td> </tr> <tr> <td>User:tj_tsai1</td> <td>(global)</td> <td>admin 看不到</td> </tr> <tr> <td>User:tj_tsai2</td> <td>(global)</td> <td>admin 看不到</td> </tr> <tr> <td rowspan=3>User:tj_tsai3</td> <td>(global)</td> <td>admin 看不到</td> </tr> <tr> <td>tj_tsai3__subdomain1</td> <td>admin 看不到</td> </tr> <tr> <td>tj_tsai3__subdomain2</td> <td>admin 看不到</td> </tr> <tr> <td colspan=3></td> </tr> <tr> <td>User:tj_tsai3 示意圖<br><img src="https://i.imgur.com/F5XqJLD.png"></td> <td><br><img src="https://i.imgur.com/xZctJWP.png"> </td> <td>admin 看不到</td> </tr> <tr> <td colspan=3><img src="https://i.imgur.com/KWli72D.png"> </td> </tr> </tbody> </table> <br> ### [憑證] ==各階層的憑證視野== - 根據前面的權限通則 - 權限所產生的物件所屬關係 **某一層** 擁有的物件為:上層、或更上層的所有物件集合(聯集) - #### 位於 ```Jenkins/tj_folder/A/B``` 看到的憑證 ![](https://i.imgur.com/8xCfzIw.png) - 看不到 C 層(子層)的憑證,但可以看到該層以上的憑證,包括 - Jenkins 層 ( global 層) - tj_folder 層 - A 層 (即使 A 層完全沒有指派任何權限,也可以看到) (因為根目錄層已經有指派 Job/Read 權限) - #### ```位於 Jenkins/tj_folder/A/B/C``` 看到的憑證 ![](https://i.imgur.com/U8ylw7v.png) - 可以看到該層以上的憑證,包括 - Jenkins 層 ( global 層) - tj_folder 層 - A 層 - B 層 <br> ### [憑證] ==admin 帳戶,可看到哪些憑證?== - ### 查看全域&用戶的憑證 - Jenkins (位於最頂層) / 從 [側欄] Manage Jenkins 進入 / 再點選 Manage Credentials [![](https://i.imgur.com/unmMQXz.png)](https://i.imgur.com/unmMQXz.png) <br> - 查看 Credentials 資訊 [![](https://i.imgur.com/abdG4c3.png)](https://i.imgur.com/abdG4c3.png) - 只能看到全域的憑證 - 看不到用戶的憑證 - 看不到 folder-based 的憑證(有其他方法可看到,見底下) <br> - ### 查看其他用戶的憑證 / 從 People 進入 / 再點選某個用戶 - Jenkins (位於最頂層) / 從 People 進入 [![](https://i.imgur.com/m88L2XX.png)](https://i.imgur.com/m88L2XX.png) <br> - 再點選 Configure,查看 Credentials 資訊 [![](https://i.imgur.com/8Lk2x3s.png)](https://i.imgur.com/8Lk2x3s.png) - Credentials are only available to the user they belong to 看不到該用戶的憑證 <br> - ### 查看其他帳戶的憑證 / 從 folder 進入 - Jenkins (位於最頂層) / 從 [folder-based] Name 進入 [![](https://i.imgur.com/tYfIFxp.png)](https://i.imgur.com/tYfIFxp.png) <br> - 一路點進去到 project / 再從 [側欄] Configure 進入 [![](https://i.imgur.com/J6xEjbG.png)](https://i.imgur.com/J6xEjbG.png) <br> - 查看 Source Code Management 資訊 [![](https://i.imgur.com/ugwhrn6.png)](https://i.imgur.com/ugwhrn6.png) <br> - 亦可從 [側欄]Credentials 進入 [![](https://i.imgur.com/0JhnBAZ.png)](https://i.imgur.com/0JhnBAZ.png) <br> ### [憑證] ==一般帳戶,可看到哪些憑證?== - Jenkins (根目錄) 的全域憑證 - Folder (Jenkins的子目錄; 資料夾角色的根目錄) 的憑證 (決取於根目錄是否有指派 Job/Read 權限) - 自身的憑證 <br> <hr> <br> ## 專案(Projects) ### [專案] ==如何建立一個新專案?== - #### 點選 New Item ![](https://i.imgur.com/9ul4670.png) - #### 點選 Freestyle project,然後按 OK ![](https://i.imgur.com/HeiE6o8.png) <br> ### [專案] ==如何透過憑證取得 gitlab / github 的原始碼?== - #### 使用 Docker Image 安裝 GitLab,可參考 [此篇](/IarR3jEoRw-d5DthZMGl-Q) - #### 在 gitlab / github 上先開一個專案,並準備一支 shell script 供測試 - ```run.sh``` ```shell pwd date date +%T ``` - #### 在專案 config 的 Source Code Management 裡 - 填寫 git clone 的 URL - 可在 project 右上方 Clone 按鈕查到 ![](https://i.imgur.com/LFJEChj.png) <br> - 選擇憑證(帳號&密碼) - 如下所示 ![](https://i.imgur.com/GJ3Abgo.png) :::success :information_source: **如果 project 是 public,任意選憑證 都可以過** ::: :::warning :warning: **不正確的「 URL 」,會有錯誤訊息:unable to access** 如:port 不正確,把 80 寫成 8080 ![](https://i.imgur.com/H4fUD5t.png) ::: :::warning :warning: **不正確的「憑證」,會有錯誤訊息:Access denied** 如:帳號密碼給錯 ![](https://i.imgur.com/xHBN3lB.png) ::: :::info :information_source: **手動自行測試** - public 的專案,不會提示要輸入帳密 ```bash $ git ls-remote -h http://10.78.26.241:50080/tj_tsai3/tj3-jenkins-project1-public.git HEAD ``` - private 的專案,會提示要輸入帳密,帳密為 ```tj_tsai3/tj_tsai3``` ```bash $ git ls-remote -h http://10.78.26.241:50080/tj_tsai3/tj3-jenkins-project2-private.git HEAD ``` ::: - #### 選擇 Build 方式 ![](https://i.imgur.com/dEaMnSN.png) --- 並填上啟動指令 (就跟 docker 一樣,總是會有一個入口點) ```bash sh run.sh ``` ![](https://i.imgur.com/wN0B5F0.png) - #### 啟動 Build <img src="https://i.imgur.com/1RcOrs9.png" style="border: 1px solid; "> --- #### 查閱這次 Build 的結果: <a href="https://i.imgur.com/tinOX6r.png" target="_blank"><img src="https://i.imgur.com/tinOX6r.png" style="border: 1px solid; "></a><br> <a href="https://i.imgur.com/4fgWz7o.png" target="_blank"><img src="https://i.imgur.com/4fgWz7o.png" style="border: 1px solid; "></a> :+1: :100: <br> <hr> <br> ## 語言設定 - ### Manage Jenkins / [System Configuration] Configure System - en_us / zh_US (不分大小寫) - zh_tw / zh_TW (不分大小寫) ![](https://i.imgur.com/8DvjGTC.png) <br> <hr> <br> ## 參考資料:中文界面部份對照 ### Manage Jenkins [![](https://i.imgur.com/nDTWMOe.png)](https://i.imgur.com/nDTWMOe.png) ### Manage Jenkins / [System Configuration] Configure System [![](https://i.imgur.com/0oqHOHS.png)](https://i.imgur.com/0oqHOHS.png)