Jenkins 基础 01 简介与部署详解
简单介绍
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
目录 返回
首页