您的位置:

Jenkins CI/CD的应用

一、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官方教程

Jenkins配置教程

利用Jenkins和Docker实现CI/CD

Jenkins实战场景示例

六、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'
    }
  }
}