iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
自我挑戰組

DevOps的下克上之旅( ° ∀ ° )ノ゙系列 第 23

Day 23: Jenkins與分散式部屬

  • 分享至 

  • xImage
  •  

Jenkins可以採用分散式架構,也就是包含Master與Slave的Jenkins,如下圖。在部屬的時候可以選擇Build在Slave Server上,這些Slave Jenkins我們稱作為Jenkins Agent。Master透過TCP/IP與Slave交流:

https://ithelp.ithome.com.tw/upload/images/20210925/20119044jBApOTFiUH.png
取自: Jenkins Full Course

本文部分參考自使用 Docker 安裝 Jenkins Agent

建立Jenkins Agent

如果有照這個系列讀下來的話,在Day 18中我們有講到建立Jenkins,開啟了8080 port與50000 port。其中的5000 port就是默認連接的agent port。

首先,先回到你的Master Jenkins > 管理Jenkins(Manage Jenkins) > 設定全域安全(Configuew Global Security) 確保Master的Agent不是停用狀態(固定、隨機都可):
https://ithelp.ithome.com.tw/upload/images/20210925/201190448OS1mEg2DX.png

接著進入 > 管理Jenkins(Manage Jenkins) > 管理節點(Manage Node),你應該可以看到目前只有Master而已。點擊新增節點(New Node) > 取一個節點名稱 > 點擊Permanent Agent。 我們這裡先稱作jenkins_agent1吧,按下OK。

https://ithelp.ithome.com.tw/upload/images/20210925/20119044NNOsc6NyMe.png

Number of Executors選擇1,遠端檔案系統根目錄輸入/home/jenkins/agent,啟動模式選擇Lauch agent by connecting to the controller,按下save。
https://ithelp.ithome.com.tw/upload/images/20210925/20119044uJZCtEG3FY.png

打開剛剛建立的節點(node),他會echo一串secret,如下圖。比如說,我的是836cc18a87cd6182f4a859c4f86f7fc4ba5fe9083facc4fa5f4f910ae96c153c,把密碼記起來。

https://ithelp.ithome.com.tw/upload/images/20210925/20119044Z6mUy4AxRi.png

接著你需要準備另一台伺服器當作Slave Server。我們在Slave Server上執行以下指令,建立一個Jenkins Agent:

  • sudo chmod 777 /var/run/docker.sock
  • docker run -d -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker --name jenkins_agent --init jenkins/inbound-agent -url http://<Master_jenkins_IP>:<Master_jenkins_Port> -workDir=/home/jenkins/agent <secret> <agent name>

如上,把Master Jenkins、secret、agent name這些相關資訊填上去。輸入docker logs jenkins_agent,如果有出現Info:Connected代表成功綁定。重新整理Master Jenkins的時候會發現多了一個jenkins_agent1。
https://ithelp.ithome.com.tw/upload/images/20210925/20119044I4TVI6Ibpi.png

未來如果要交由jenkins_agent1來build,我們只需要將jenkins file內的agent改成{label "jenkins_agent1"}。如下,參考自Day 20

pipeline{
  agent {
    label "jenkins_agent1"
  }

  stages{
    stage("Delete Old Container"){
      steps {
        catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
          echo "Delete the container"
          sh "docker rm -f run_mynode run_myweb"
        }
      }
    }
    stage("Building") {
      steps {
        echo "Building App"
        sh "cd ./app && docker build -t mynode:latest ."
        sh "docker run -d -p 3000:3000 --name run_mynode --link my_postgres:my_postgres mynode:latest"

        echo "Building FrontEnd"
        sh "cd ./html && docker build -t myweb:latest ."
        sh "docker run -d -p 8085:80 --name run_myweb --link run_mynode:run_mynode myweb:latest"
      }
    }

    stage("Test"){
      steps{
        echo "Testing begin testing2"
        sh "pwd"
      }
    }

    stage("Deploy"){
      steps{
        echo "deploy begin"
      }
    }
  }

  post {
    failure {
      echo "No!! it fail"
    }
    success {
      echo "Yes!! it work"
    }
  }
}

成功部屬上Slave Server。
https://ithelp.ithome.com.tw/upload/images/20210925/20119044KTAamNWeqt.png


上一篇
Day 22 : Docker化Jmeter 與連結Jenkins自動化測試
下一篇
Day 24 : Jenkins 在Build完通知與好用套件
系列文
DevOps的下克上之旅( ° ∀ ° )ノ゙30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言