DevOps实践-Jenkins的环境管理讨论

简介: 在经过公司内部自研持续交付环境,再到使用很长时间的Jenkins之后。

DevOps实践系列文章,请参见连接。

背景

在经过公司内部自研持续交付环境,再到使用很长时间的Jenkins之后。对于持续交付工具的一些特点有一定认识。在为软件开发流程设计持续交付过程中需要考虑到很多方面的内容。一般通用的持续集成系统中都会设计到以下几个部分:

  1. 环境管理。在持续集成环境中包括很多类型的环境。例如:持续交付运行环境,编译环境,存储环境,发布环境,被测环境,测试环境等等。之前在通信行业进行持续交付环境构建时,考虑到硬件资源以及硬件型号的问题对于不同的硬件型号需要运行不同的构建与测试过程。
  2. Pipeline流程。为持续交付提供流程、步骤的支持,可以使用原子操作、组合操作进行组合形成一套Pipeline流程。最终满足持续交付的过程需要。
  3. 原子操作。针对通信行业中的交付过程,可能涉及到不同的网元。对于网元间版本控制与接口对接的以及测试要求需要考虑。所以,原子操作可以拆成对网元的操作。对于互联网应用中的微服务体系的操作,可以定义一套编译,构建,发布是原子操作。每个微服务都是由这些原子操作的过程组成,然后这些微服务的统一管理的pipeline又可以是一个更上层的流程。
  4. 结果展示。各项结果都需要有好的展示出来。代码扫描结果,编译结果,流程结果,原子操作结果等等都是需要展示出来的。

综上,要构建一套持续交付环境需要对各个层级有比较清晰的认识之后再做环境构建时是比较好的。本篇文章着重讨论环境管理部分的内容。

环境管理发展

环境管理发展描述从比较单一的持续构建环境一路发展为环境即代码环境管理方式。这个过程从某个侧面可以认为是IT业界对环境管理过程的认知升级的过程。一步步的从手动管理环境到自动化调度、控制环境的过程。

  • 1. 直接使用Jenkins服务器做为构建环境

在刚开始接触Jenkins时,一般都会使用Jenkins Server作为我们所有动作执行的地方。在Jenkins Server上执行代码Checkout,编译,依赖管理,制品管理。慢慢的随着要处理的微服务个数,要存储的制品、要做的频率不断的提升会逐渐的觉得只使用Jenkins Server完成这些工作比较吃力。想办法逐渐的把各项工作分散到不同的机器上完成。可能通过ssh,ansible,chef等工具完成。

  • 2. 使用Jenkins的Node管理作为构建环境

在用ssh一段时间之后,发现ssh的服务器只能通过代码进行管理。在同时执行一个Job的时候回发生环境冲突的问题。ssh不能进行环境调度的工作,只能将Job和主机绑定。从这个时候开始借助Jenkins Agent来进行辅助服务器的管理工作。使用Jenkins Agent可以对服务器进行包活,任务调度的管理。

  • 3. 使用Docker作为Node进行环境管理

在经过对Job的调度工作时候,慢慢的发现每个Agent都是一个持续交付的环境。每个Agent上跑着所有的任务,任务都在Agent上存储一部分Job数据。Job间可能会造成排队与存储干扰的问题。在持续交付环境管理中已经投入了机器的情况下,还是会遇到一些环境的一些问题。就需要考虑怎样处理这些问题。正好Docker第一个功能就是做环境隔离的工作。用Docker将不同的环境隔离出来,例如:专门做Node编译的,专门做Java编译的,专门做C#编译的,专门做发布的。都可以独立的隔离出来,这样可以按照持续交付的步骤进行环境的隔离,解决排队和干扰的问题。

  • 4. 使用一次性Docker容器作为Node的环境管理

慢慢的固定的Docker容器去做工作,会发现Docker很多时候都是空闲的。所以,就想怎样提高资源的利用率。开始使用一次性Docker解决问题,最终可以做到随建随走,随用随走。

  • 5. 使用环境即代码的方式管理环境

在Docker的仓库,Docker与物理机之间的关系等在发展到一定阶段之后也是需要进行大量的管理的。这个时候Docker的调度,Docker的恢复,Docker的监控,Docker的镜像等都需要进行管理。在这个使用控制环境如果还是使用某种二进制包+说明文档的方式进行管理就不能很好的完成工作了。这个时候就明显的需要对环境进行版本化管理,对环境进行版本化管理可以很快的复制一套相同的环境做其他用途。

实现方式

从上面的环境管理发展可以总结出环境管理的几个要点任务:

  • 环境包活
  • 任务调度
  • 环境隔离
  • 资源利用率
  • 环境管理版本化

针对每一个发展阶段都有它自己的技术特点。每个阶段的技术主要内容有:

  1. Jenksin、Gitlab、TeamCity、Travis CI
  2. Agent
  3. Docker
  4. Swarm,K8s,ansible

这里给出来一个Jenkins上使用一次性Docker的一个例子:

  1. 环境构建

Jenkins环境

  1. 配置Pipeline
pipeline {
    agent {
        docker {
            image 'maven:3.3.3'
            args  '-v /tmp:/tmp -v $HOME/.m2:/root/.m2 -v /opt/docker/ci/pmd/p3c:/opt/p3c -v p3c_result:/opt/result'
        }
    }
    options {
        timeout(time: 1, unit: 'HOURS')
    }
    stages {
        stage("init workspace") {
            steps {
                cleanWs()
            }
        }
        stage("checkout code"){
            steps {
                echo "checkout code"
                checkout([$class: 'GitSCM', branches: [[name: '*/dev']], doGenerateSubmoduleConfigurations: false, 
                    extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'wales_kuo', url: git_url]]])
            }
        }
        stage("scan code"){
            steps {
                echo "scan code"
                sh '''
                export p3c_jar_path="/opt/p3c/p3c-pmd-2.0.0.jar:/opt/p3c/lib/antlr4-runtime-4.7.jar:/opt/p3c/lib/asm-7.1.jar:/opt/p3c/lib/commons-io-2.6.jar"
                export p3c_jar_path=$p3c_jar_path:"/opt/p3c/lib/commons-lang3-3.8.1.jar:/opt/p3c/lib/gson-2.8.5.jar:/opt/p3c/lib/javacc-5.0.jar"
                export p3c_jar_path=$p3c_jar_path:"/opt/p3c/lib/javax.annotation-api-1.3.2.jar:/opt/p3c/lib/jcommander-1.72.jar:/opt/p3c/lib/pmd-core-6.15.0.jar:"
                export p3c_jar_path=$p3c_jar_path:"/opt/p3c/lib/pmd-java-6.15.0.jar:/opt/p3c/lib/pmd-vm-6.15.0.jar:/opt/p3c/lib/saxon-9.1.0.8.jar"
                
                export p3c_rulesets="rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml"
                export p3c_rulesets=$p3c_rulesets,"rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-orm.xml"
                export p3c_rulesets=$p3c_rulesets,"rulesets/java/ali-other.xml,rulesets/java/ali-set.xml,rulesets/vm/ali-other.xml"

                export CWD=$(pwd)
                export result_path=/opt/result/'''+BUILD_NUMBER+'''
                mkdir -p $result_path
                java -cp "$p3c_jar_path" net.sourceforge.pmd.PMD -R $p3c_rulesets -d $CWD -f yahtml -P outputDir=$result_path | exit 0'''
            }
        }
        stage("run test"){
            steps {
                echo "run test"
            }
        }
        stage("build service"){
            steps {
                echo "build"
                // sh 'mvn clean package'
            }
        }
        stage("publish service"){
            steps {
                echo "public"
                
            }
        }
    }
}
  1. 完成。

参考:

持续交付
持续交付2.0
DevOps实践指南

目录
相关文章
|
26天前
|
运维 Devops jenkins
DevOps实践:自动化部署与持续集成的实现之旅
本文旨在通过一个实际案例,向读者展示如何将DevOps理念融入日常工作中,实现自动化部署和持续集成。我们将从DevOps的基础概念出发,逐步深入到工具的选择、环境的搭建,以及流程的优化,最终实现一个简单而高效的自动化部署流程。文章不仅提供代码示例,更注重于实践中的思考和问题解决,帮助团队提高软件开发和运维的效率。
|
28天前
|
监控 安全 Devops
DevOps实践中,如何平衡开发速度和安全审核的效率
DevOps实践中,如何平衡开发速度和安全审核的效率
|
19天前
|
运维 监控 Devops
DevOps实践:自动化部署与持续集成的融合之旅
【10月更文挑战第7天】在软件开发领域,DevOps已成为一种文化和实践,它倡导开发(Dev)与运维(Ops)之间的协作与整合。本文将引导读者了解如何通过自动化部署和持续集成(CI)的实践来提升软件交付的速度和质量。我们将探讨一些实用的工具和技术,以及它们是如何帮助团队高效地管理代码变更、测试和部署的。文章将不包含代码示例,但会详细解释概念和流程,确保内容的通俗易懂和条理性。
124 62
|
9天前
|
运维 Prometheus 监控
从文化到实践:DevOps的基本概念与核心实践详解
从文化到实践:DevOps的基本概念与核心实践详解
31 5
|
8天前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
39 2
|
19天前
|
运维 监控 Devops
DevOps实践:持续集成与部署的自动化之旅
【10月更文挑战第7天】在软件开发领域,DevOps已成为提升效率、加速交付和确保质量的关键策略。本文将深入探讨如何通过实施持续集成(CI)和持续部署(CD)来自动化开发流程,从而优化运维工作。我们将从基础概念入手,逐步过渡到实际操作,包括工具选择、流程设计以及监控和反馈机制的建立。最终,我们不仅会展示如何实现这一自动化流程,还会讨论如何克服常见的挑战,以确保成功实施。
55 9
|
4天前
|
运维 安全 Devops
DevOps实践:持续集成与持续部署(CI/CD)的自动化之路
【10月更文挑战第22天】在软件交付的快速迭代中,DevOps文化和实践成为企业加速产品上市、保证质量和提升客户满意度的关键。本文将通过一个实际案例,深入探讨如何利用持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)实现软件开发流程的高效自动化,包括工具选择、流程设计以及问题解决策略。我们将一起探索代码从编写到部署的全自动化旅程,揭示其对企业运维效率和产品质量所带来的深远影响。
|
29天前
|
运维 Devops jenkins
DevOps实践:自动化部署与持续集成的实现
【9月更文挑战第36天】本文通过深入浅出的方式,向读者展示了在现代软件开发中,DevOps如何通过自动化部署和持续集成提高开发效率和软件质量。文章不仅介绍了相关概念,还提供了实用的代码示例,帮助读者理解如何在实际工作中应用这些技术。
|
25天前
|
jenkins Java 持续交付
Docker搭建jenkins环境
这篇文章详细介绍了如何利用Docker搭建Jenkins环境,包括拉取Jenkins镜像、配置端口映射及初始化设置的步骤。
89 0
Docker搭建jenkins环境
|
28天前
|
运维 安全 Devops
DevOps实践中的安全审核和合规性
DevOps实践中的安全审核和合规性