一、Jenkins磁碟佔滿
由於新產生的工作區和構建,Jenkins的磁碟空間會隨著時間而增長。當磁碟被佔據到某種程度,Jenkins將不再有足夠的空間持續創建工作任務及構建,嚴重影響工作流程。Jenkins的空間管理需要用到插件實現。
Jenkins空間監控檢測插件Disk Usage插件檢查和管理磁碟空間和磁碟使用率,檢測特定工作區的空間使用,也可以組織工件和工作區的深度存儲,支持展示以圖標方式顯示磁碟使用情況。
node('master') {
checkout scm
def versionNumber = getVersionNumber()
docker.withRegistry( 'https://registry.example.com', 'registry-credentials'){
def app = docker.build("myorg/myapp:${versionNumber}")
app.push()
}
}
二、Jenkins CI/CD是啥
CI/CD的全稱是 Continuous Integration and Continuous Delivery/Deployment,指持續集成和持續交付/部署。當我們的團隊或個人寫了一些代碼,我們希望在開發周期內發布到生產環境中。CI/CD管道就是為了幫助我們實現這一目標,簡化流程,提高效率。
Jenkins就是一個CI/CD工具,它提供了自動化軟體開發過程的各種功能,例如構建、測試、打包和部署。Jenkins 可以在大多數大型軟體開發公司中使用,並為開發者提供了廣泛的靈活性,因為它可以在不同的平台上使用,可以與其他工具以及大多數雲解決方案集成。
三、Jenkins磁碟空間不足
當Jenkins使用偏小的磁碟空間,則可能經常檢測到不足的情況。Jenkins提供了一些插件和選項來幫助管理磁碟空間,如增加磁碟空間、移動工件以及刪除不必要的工件等。Jenkins空間插件中Discard Old Build插件為你提供了另一個選項,允許在創建指定數量的構建後刪除舊構建。
def get_package_name() {
withEnv(["PATH+GRADLE=${tool 'Gradle'}/bin"]) {
sh 'gradle clean assembleDebug --no-build-cache --no-daemon'
def apk = glob '**/build/outputs/apk/debug/*-debug.apk'
return apk[0]
}
}
node('ios') {
stage('Build') {
def artifact = get_package_name()
stash includes: artifact, name: 'PACKAGE'
}
}
node('android') {
stage('Test') {
def artifact = unstash 'PACKAGE'
sh "./gradlew test"
}
}
四、Jenkins CI/CD流程
Jenkins的CI/CD流程通常包括步驟:編碼、構建、測試、部署、監測,其中後面四個可以自動化實現,大大提升著作效率。
編碼:程序員寫代碼並推送到代碼庫。
構建:Jenkins 構建代碼,並檢查代碼的編譯、靜態分析,或執行任務來構建容器鏡像等。
測試:Jenkins會啟用測試套件或針對代碼進行靜態和動態分析,以確保代碼質量和穩定性。
部署:Jenkins 將被構建的工件或容器部署到生產環境。
監測:Jenkins進行系統監測,包括運行日誌監測、錯誤監測、性能監測等,以確保系統運行正常,同時在改進或修復方面給開發者提供幫助。
五、Jenkins CI/CD教程
這裡列出一些Jenkins CI/CD的教程,供大家學習和實踐:
六、Jenkins CI/CD審批
Jenkins中的審批是管理和授權流程中一個至關重要的組成部分。使用Jenkins的審批機制,只有在組織或公司的管理人員授權後,才能進行部署。這樣可以防止人員的任意操作,即使有惡意行為,我各個階段的審批流程也能起到作用。
Jenkins 插件中的Config File Provider插件可以為其配置授權密鑰,該插件應用於代碼倉庫、雲服務等多個場景中。
def makeDockerRecipe(String data){
String stage
String contextDir
String imageTag
String imageName
def sl = new groovy.util.slurpersupport.GPathResult(new XmlSlurper().parseText(data))
sl.get("buildSteps.buildStep").each {
if(it['$'].class.toLower() == 'dockerbuildandpublish') {
stage = it.buildStepName[0]
contextDir = it.dockerBuildContextDir[0]
imageTag = it.dockerImageTag[0]
imageName = it.dockerRepoName[0]
}
}
return new DockerRecipe(stage, contextDir, imageTag, imageName)
}
node('master') {
stage('Build') {
git 'https://github.com/ACME/inc-finance.git'
def recipe = makeDockerRecipe(readFile 'build.xml')
stash includes: '**', name: 'source'
def linuxBuild = docker.build(recipe.toString())
linuxBuild.push()
}
}
七、Jenkins CI/CD K8s
K8s 是一種用於自動化部署、擴展和管理應用容器的解決方案。Jenkins CI/CD用來部署容器時,可以使用Kubernetes插件。將構建的容器鏡像託管在一個可用的部署環境中。Kubernetes的Jenkins插件會在構建後自動更新。此插件可以輕鬆實現在Kubernetes群集中動態創建、更新和刪除資源,如部署、服務和Ingress對象。
Jenkins和Kubernetes的結合使用建議使用Kubernetes Plugin,該插件提供Kubernetes Pipeline步驟和DSL,使我們無需編寫任何 Kubernetes YAML 文件就能夠操作Kubernetes。
node('linux') {
stage('Docker Build') {
git 'https://github.com/ACME/inc-finance.git'
def recipe = makeDockerRecipe(readFile 'build.xml')
def linuxBuild = docker.build(recipe.toString())
linuxBuild.push()
}
stage('Deploy') {
def kubernetes = container('kubectl') {
sh 'kubectl version'
sh 'kubectl apply -f deployment.yml'
}
kubernetes.withKubeConfig(credentialsId: 'k8s-creds', serverUrl: 'https://my-k8s-apiserver') {
sh 'kubectl version'
sh 'kubectl set image deployment/my-app my-container=my-image:latest'
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/186609.html