# 透過 Docker 建立 JenkinsAgent ###### tags: `Jenkins` `Docker` ## 介紹 之前撰寫的[[透過 Docker 建立 Jenkins](/HzNLqx2TSA6885MXaDkE-A)]最後有提到,在執行各樣CI/C官方建議使用JenkinsAgent來運行,其原因主要為[安全隔離](https://www.jenkins.io/doc/book/security/controller-isolation/#not-building-on-the-built-in-node),也可以使執行不同專案的CI/CD作業時,彼此不受影響。 ## 目錄 [TOC] # 一、前言 基本上整體流程也不會太困難,這邊廢話就不多說直接進入實作 # 二、建立Jenkins 還不知道怎麼執行的可以查看此文章[透過 Docker 建立 Jenkins](/HzNLqx2TSA6885MXaDkE-A),這邊會架構在此基礎往後進行實作 # 三、新增節點 首先我們需建先建立節點,其UI操作如下 ![](https://i.imgur.com/5s0qEnp.png) 進入頁面後點選左方的**新增節點** ![](https://i.imgur.com/xGzoQ4G.png) 取個名字吧!下方選項則需要點選,然後直接點選建立 ![](https://i.imgur.com/P1PoWhd.png) 接著會針對節點進行相關設定,我們設定一個系統根目錄給它,之後捲到最下方點選儲存 ![](https://i.imgur.com/VhXGPjf.png) 完成後可以看到以下畫面,此時狀態打叉表示未連接到代理節點 ![](https://i.imgur.com/DDUmuAH.png) # 四、代理Jenkins建立 完成第二大項的步驟後,我們可以點選節點來查看相關連接資訊,進入畫面後可以看到此處有說明從Agent該如何連接,這邊的話我們只需要記住Key即可 ![](https://i.imgur.com/XmsLwcK.png) ## 運行 在運行時必須要確定master跟運行agent兩者之間的網路是否互通,此處我們透過IP來讓agent訪問master,主要指令結構如下: ```shell= docker run -d --name {CTN_NAME} --init jenkins/inbound-agent -url http://{MASTER_NODE_IP}:8080 -workDir={WORK_DIR} {KEY} {AGENT_NAME} ``` 完整指令如下: ```shell= docker run -d --name jenkins_agent --init jenkins/inbound-agent -url http://192.168.1.102:8080 -workDir=/home/jenkins/AgentNode bd38d71dc2a390f969f9e94cc7d89679eda44e3c776a26874b381810b20f2eb1 AgentNode ``` 執行後我們可以直接查看log是否連接成功 ![](https://i.imgur.com/vzaVp4L.png) 也可以進入Jenkins節點管理頁面查看連接狀況 ![](https://i.imgur.com/yMEy20u.png) 如此一來JenkinsAgent算是已經建立完成了唷! # 五、測試使用 測試前可以先閱讀[再 Jenkins 底下執行 NodeJs](/mtGREEfVTiq7mLTIPLAkfg),了解一下整體的新增/執行作業的程序如何進行,此處會快速帶過 ## 建立作業 我們建立一個Pipeline的流程,這邊增加了`agent` 並且指定對應的agent為`label 'AgentNode'`,這樣在運行的時候就會是走指定的代理,其使用腳本如下: ```json= pipeline { agent{ label 'AgentNode' } tools { nodejs '16.17.1' } stages { stage('Hello') { steps { echo 'Hello World' sh 'npm version' } } } } ``` 這邊附上畫面 ![](https://i.imgur.com/VoV5a26.png) ## 執行結果 這邊直接運行建置並且查看結果,可以看到流程是運行在我們指定的Node當中,其安裝與指令的執行也都是在此代理底下運行 ![](https://i.imgur.com/ymA1CC1.png) # 結論 經過此實作整體來說也無太大難度,比較特別的是我們在建立AgentNode的時候會有一個選項要勾起,其實也可以在運行時指定對應的DockerImage來進行相關作業操作,至於如何使用後續再來針對這一區塊做學習。 <br/> --- 相關參考來源: [Day 23: Jenkins與分散式部屬](https://ithelp.ithome.com.tw/articles/10271997) <style> .red{color: red;} </style>