利用 Jenkins 管理非自動化用途的服務器資源

0. 服務器資源之痛

現在筆者所在的團隊中有 50+ 個研發及測試工程師,由於工作需要經常使用 20+ 臺服務器進行研發或者測試工作。那麼如何掌控這些機器的使用狀態就是一個比較麻煩的事情。

爲了做好這個事情,團隊內嘗試過:

  • 設置共享文檔進行使用前進行填寫:不規範而且時長忘記更新,且自動化使用與非自動化使用的鴻溝很難跨越
  • 設置專人進行管理:對口的人太多,效率低下,工作附加值低

看來,改革服務器管理方案勢在必行。

1. 方案及效果

通過梳理需求,我們發現其實服務器資源管理的核心述求如下:

  • 無需服務器管理員這樣的專職崗位
  • 收集團隊的設備列表
  • 知道當前每臺設備是否被人使用及其詳情(申請人、申請時長、申請事項)
  • 無人使用的設備可以作爲資源池被自動化調用

最終我們藉助 Jenkins 的能力實現的上述述求,首先所有設備信息維護在 Jenkins 上,默認狀態無人使用,故支持被自動化調用:
被Jenkins管理的設備列表
當需要申請某臺設備進行使用時,需填寫下表:
在這裏插入圖片描述
表格填寫完成,Jenkins會自動幫助你“佔領”這臺機器,且在狀態也告知其他人相關使用信息(申請人、申請時長、申請事項):
在這裏插入圖片描述

2. 實現過程細節

2.1 設備命名方式

需要根據團隊中的使用習慣進行設計,由於筆者所在團隊主要從事CPU/GPU密集計算相關工作,所以我們約定按照:

“設備類型-CPU-內存-GPU-IP”的形式來命名機器。其中:

  • 設備類型包含:PM-物理機、VM-虛擬機、DM-Docker
  • CPU:型號*數量
  • 內存:總大小
  • GPU:型號*數量
  • IP:略

2.2 Jenkins 設備管理設置

  • #of executors:設置爲1,保證一旦被申請,就不會被其他人或者其他自動化任務所使用
  • Usage:設置爲Only build jobs with label expressions matching this node,保證設備佔用前需要有明確的意圖,減少資源浪費的可能
    在這裏插入圖片描述

2.3 Jenkins Pipeline 腳本編寫

pipeline {
    agent none
    parameters {
		string(name: 'user', defaultValue: '', description: '申請人')
		string(name: 'machine', defaultValue: '', description: '申請機器IP')
		string(name: 'time', defaultValue: '', description: '申請使用時間,正整數形式,以小時爲單位')
		string(name: 'task', defaultValue: '', description: '所要執行的任務')
	}
	
    stages {
        stage('parameters check') {
			when { 
                anyOf {
                    environment name: 'machine', value: ''
                } 
            }
            steps {
                error '參數錯誤,無法構建:未指定使用機器'
            }
        }
		stage('use machine') {
            agent { label env.machine }
            steps {
				script {
					releasetime=sh(returnStdout: true,  script: 'date +%Y%m%d%H%M -d \'+(${time}) hours\'')
					buildName "${BUILD_DISPLAY_NAME}_${user}_${releasetime}_${task}"
					sh label: '', script: '''let seconds=${time}*3600
					sleep $seconds'''
				}
            }
        }    
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章