虚拟化容器,大数据,DBA,中间件,监控。

Jenkins 基础 01 简介与部署详解

20 12月
作者:admin|分类:系统运维

 

简单介绍


Jenkins前身是Hudson,使用java语言开发的自动化发布工具。在中大型金融等企业中普遍使用Jenkins来作为项目发布工具。 Jenkins官方提供的插件使Jenkins更为强大。Jenkins是一个自动化服务器,目前发展超过15年,比较成熟的CI工具(也可以CD)能够实现自动化集成发布。建立好流水线后,期间无需专业运维人员介入,开发人员随时发布部署,任性!。

 

传统应用发布模式


一般一个开发团队中都会存在多个角色:开发、测试、运维。当时我们的应用发布模式可以能是这样的:

  • 开发同学进行项目代码开发,本地运行测试成功后将代码上传到版本控制系统
  • 开发同学通知运维同学项目可以发布了,然后运维同学下载代码进行打包和构建,生成应用制品
  • 运维同学使用部署脚本将生成的制品部署到测试环境,并提示测试同学可以进行产品的测试。
  • 测试同学开始进行手动、自动化测试,测试完成后提醒运维同学可以进行预生产环境部署
  • 运维同学开始进行预生产环境部署,然后测试同学进行测试,测试完成后,开始部署生产环境

手动操作很多、出现的问题很多。上面看似很流畅的过程,其实每次构建或发布都可能会出现问题。未对每次提交验证、构建环境不一致:开发人员本地测试成功后提交代码,运维同学下载代码进行编译却出现了错误。

 

Jenkins简介与应用场景


对于持续集成工具现在也有很多,目前应用最多的是Jenkins。Jenkins前身是Hudson,使用java语言开发的自动化发布工具。Jenkins是跨平台的可以在Win、Linux、MacOS部署。Jenkins是应用最广的开源免费的持续集成服务器,企业中普遍使用Jenkins来作为项目集成发布工具。Jenkins官方提供的插件使Jenkins更为强大。目前发展超过15年,比较成熟的CI工具(也可以CD)能够实现自动化集成发布。目前普遍使用Jenkins完成持续集成CI/持续部署CD等相关技术实践。 可以把Jenkins想象成一个脚本执行器,我们可以通过编写代码的方式灵活的控制Jenkins作业的运行与控制。

Jenkins是一个自动化服务器,目前发展超过15年,比较成熟的CI工具(也可以CD)能够实现自动化集成发布。建立好流水线后,期间无需专业运维人员介入,开发人员随时发布部署,任性!。

Jenkins就是一个自动化的服务器,实现自动化的脚本叫pipeline,脚本里面的各个函数叫做stage,CI是持续集成,也就是编译打包,CD就是发布,将软件发布到环境当中,比如通过ansible工具。我们现在这块CI/CD还是使用jenkins,从代码拉取到编译打包以及发布都是使用jenkins。

 

 应用场景


持续集成实践

  • 集成svn/git客户端实现源代码下载检出
  • 集成maven/ant/gradle/npm等构建工具实现源码编译打包单元测试
  • 集成sonarqube对源代码进行质量检查(坏味道、复杂度、新增bug等)

持续部署实践

  • 集成SaltStack/Ansible实现自动化部署发布

 自动化测试实践

  • 集成Jmeter/Soar/Kubernetes/.....

 

jenkins核心就是流水线


传统运维,开发人员写完代码了,然后交给测试去部署测试环境,测试测试好了交给运维部署到预生产和生产环境。建立了稳定的流水线,可以分为三条流水线,一条测试流水线,一条预生产流水线,一条是生产流水线。

期间就不需要运维来操作了,开发人员写完代码点击流水线部署到测试环境,没问题之后点击预生产流水线,那就可以部署到预生产,预生产没问题就可以部署到生产。

Jenkins要想实现源代码的下载,需要集成svn或者git,这样就可以下载代码了,jenkins只是调用git客户端去下载代码,并不是jenkins本身就有下载代码的功能,这个都是需要插件去实现的。(如果你代码编译出现问题,一般都不会是jenkins出现问题,你得好好排查你的代码)

 

Jenkins安装部署


关于Jenkins的安装可以使用rpm或者war包安装,需要提前安装好JDK8+环境。 Jenkins采用分布式架构,分为server节点和agent节点。server节点也是可以运行构建任务的,但我们一般使其主要来做任务的调度。(毕竟server节点挂了就都...)agent节点专门用于任务的执行。随着现在容器的盛行,我们可以将server节点和agent节点在容器或者基于Kubernetes中部署。关于agent节点借助容器可以实现动态的资源分配等等好处。agent节点可以分为静态节点和动态节点。静态节点是固定的一台vm虚机或者容器。动态节点是随着任务的构建来自动创建agent节点。

Server端负责主要负责调度,也就是master端,agent端是正式去执行任务的

 

Jenkins软件平台部署


Jenkins官网免费获取Jenkins软件,官网地址为:http://mirrors.jenkins-ci.org/下载稳定的Jenkins版本(https://mirror.tuna.tsinghua.edu.cn/jenkins/war/2.175/jenkins.war )。由于Jenkins是基于Java开发的一种持续集成工具,所以Jenkins服务器需安装JAVA JDK开发软件。Jenkins平台搭建步骤如下:

 

 

RPM部署jenkins


安装JDK环境 

如果使用rpm的方式安装的Jenkins需要提前安装好JDK,Jenkins Slave运行也需要使用JDK。

https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/jdk/x64/linux/ 

安装jdk就两个步骤,一个是解压,还有一个是配置环境变量

tar zxf OpenJDK8U-jdk_x64_linux_hotspot_8u282b08.tar.gz -C /usr/local

cd /usr/loca/jdk8u282-b08
pwd

vim /etc/profile

export JAVA_HOME=/usr/local/jdk8u282-b08
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile

java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.282-b08, mixed mode)

 安装Jenkins Master

 https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/

 这样jenkins就算安装好了

[root@jenkins-master ~]# rpm -qa | grep jenkins
[root@jenkins-master ~]# rpm -e jenkins
error: package jenkins is not installed

[root@jenkins-master ~]# rpm -ivh jenkins-2.277.1-1.1.noarch.rpm 
warning: jenkins-2.277.1-1.1.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 45f2c3d5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:jenkins-2.277.1-1.1              ################################# [100%]

 Jenkins的配置文件

[root@jenkins-master ~]# cat /etc/sysconfig/jenkins 

Jenkins的数据目录,家目录就放这了
JENKINS_HOME="/var/lib/jenkins"

修改为root
JENKINS_USER="root"

看看端口有没有被占用
[root@jenkins-master ~]# netstat  -tpln | grep 8080



如果启动报错如下,需要做个软链接
[root@jenkins-master ~]# service jenkins start
Starting jenkins (via systemctl):  Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.
                                                           [FAILED]

[root@jenkins-master ~]# service jenkins status
?.jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2021-03-28 20:10:56 CST; 5min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1309 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=1/FAILURE)

Mar 28 20:10:56 jenkins-master systemd[1]: Starting LSB: Jenkins Automation Server...
Mar 28 20:10:56 jenkins-master runuser[1314]: pam_unix(runuser:session): session opened for user root by (uid=0)
Mar 28 20:10:56 jenkins-master jenkins[1309]: Starting Jenkins bash: /usr/bin/java: No such file or directory
Mar 28 20:10:56 jenkins-master jenkins[1309]: [FAILED]
Mar 28 20:10:56 jenkins-master systemd[1]: jenkins.service: control process exited, code=exited status=1
Mar 28 20:10:56 jenkins-master systemd[1]: Failed to start LSB: Jenkins Automation Server.
Mar 28 20:10:56 jenkins-master systemd[1]: Unit jenkins.service entered failed state.
Mar 28 20:10:56 jenkins-master systemd[1]: jenkins.service failed.

[root@jenkins-master ~]# ln -s /usr/local/jdk8/bin/java /usr/bin/java
[root@jenkins-master ~]# service  jenkins start
Starting jenkins (via systemctl):                          [  OK  ]


[root@jenkins-master ~]# systemctl  status jenkins
?.jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Sun 2021-03-28 20:22:36 CST; 4min 34s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1417 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/jenkins.service
           ?..1436 /usr/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/j...

Mar 28 20:22:34 jenkins-master systemd[1]: Starting LSB: Jenkins Automation Server...
Mar 28 20:22:34 jenkins-master runuser[1422]: pam_unix(runuser:session): session opened for user root by (uid=0)
Mar 28 20:22:36 jenkins-master jenkins[1417]: Starting Jenkins [  OK  ]
Mar 28 20:22:36 jenkins-master systemd[1]: Started LSB: Jenkins Automation Server.

rpm安装的也是war包

 

 

Docker Jenkins部署


版本  LTS: 2.277.1

docker pull jenkins/jenkins:2.277.1-lts-centos7

mkdir -p /data/cicd/jenkins
chmod 777 -R /data/cicd/jenkins

docker run -itd --name jenkins \
-p 8080:8080 \
-p 50000:50000 \
--privileged=true  \
-v /data/cicd/jenkins:/var/jenkins_home docker.io/jenkins/jenkins:2.277.1-lts-centos7


##FAQ
[root@jenkins-master ~]# docker logs  -f jenkins
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?


chmod 777 -R jenkins/

在使用docker 部署的时候5000端口要开出来,因为要部署slave

  • 8080 Jenkins  web端访问端口
  • 50000  Jenkins与Agent建立连接所需要的端口

 

Tomcat热部署jenkins 


 配置你的Tomcat,并且进行优化

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="30000"
               URIEncoding="UTF-8"
               minSpareThreads="100"
               maxThreads="4096"
               acceptCount="10000"
               enableLookups="false" 
               disableUploadTimeout="true"
               redirectPort="8443" />


[root@localhost ~]# vim /usr/local/tomcat/bin/catalina.sh 
JAVA_OPTS="-server -Xms900m -Xmx900m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
[root@localhost ~]# ps -ef | grep java
 -server -Xms900m -Xmx900m -XX:PermSize=256m -XX:MaxPermSize=512m 
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
  • unpackWARs="true"  是否自动解压war包
  • autoDeploy="true"   自动部署,回头你只要往我的站点目录下/code丢一个war包,不需要重启tomcat,自动帮你解压,然后就可以访问了
[root@localhost ~]# mv jenkins.war ROOT.war
[root@localhost ~]# cp ROOT.war /usr/local/tomcat/webapps/

#查看日志可以看到tomcat解压并且部署上传的war包
27-Oct-2020 17:37:52.957 INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.undeploy Undeploying context []
27-Oct-2020 17:37:53.129 INFO [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /usr/local/tomcat/webapps/ROOT.war
Jenkins home directory: /root/.jenkins found at: $user.home/.jenkins
27-Oct-2020 17:38:18.475 INFO [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /usr/local/tomcat/webapps/ROOT.war has finished in 25,346 ms
27-Oct-2020 17:38:24.980 INFO [pool-7-thread-1] jenkins.InitReactorRunner$1.onAttained Started initialization
27-Oct-2020 17:38:25.103 INFO [pool-7-thread-1] jenkins.InitReactorRunner$1.onAttained Listed all plugins
27-Oct-2020 17:38:32.872 INFO [pool-7-thread-2] jenkins.InitReactorRunner$1.onAttained Prepared all plugins
27-Oct-2020 17:38:32.907 INFO [pool-7-thread-2] jenkins.InitReactorRunner$1.onAttained Started all plugins
27-Oct-2020 17:38:32.936 INFO [pool-7-thread-2] jenkins.InitReactorRunner$1.onAttained Augmented all extensions
............................................................................
27-Oct-2020 17:45:30.725 INFO [pool-7-thread-2] jenkins.InitReactorRunner$1.onAttained Completed initialization
27-Oct-2020 17:45:30.930 INFO [Jenkins initialization thread] hudson.WebAppMain$3.run Jenkins is fully up and running


[root@localhost ~]# ls /usr/local/tomcat/webapps/
docs  examples  host-manager  manager  ROOT  ROOT.war

部署成功之后输入密码

[root@localhost ~]# cat /root/.jenkins/secrets/initialAdminPassword
ee0d75d5495b4ee1a522d6947a060065

 

浏览479 评论0
返回
目录
返回
首页
Jenkins 更新网站静态文件 Jenkins 传统网站更新和CI/CD概念