Jenkins前身是Hudson,使用java语言开发的自动化发布工具。在中大型金融等企业中普遍使用Jenkins来作为项目发布工具。 Jenkins官方提供的插件使Jenkins更为强大。Jenkins是一个自动化服务器,目前发展超过15年,比较成熟的CI工具(也可以CD)能够实现自动化集成发布。建立好流水线后,期间无需专业运维人员介入,开发人员随时发布部署,任性!。
jenkins插件尽量按需使用,少安装一些插件,当你Jenkins的规模越来越大了,流水线作业越来越多了,可以会因为插件的原因导致无法启动成功。
通过代码的方式比代码更加好使,这样减少插件依赖,同时对你技能提升也是很有帮助。
总结就是,你想要做到的,Jenkins都可以帮你做到。
做测试的可能会使用master节点构建一些任务,但是实际的生产环境绝对不能使用master节点去构建任务,因为任务多了之后会影响Jenkins的性能,导致你直接宕机了。
可以将Jenkins作为一个引擎,然后外面包了devops平台,用devops去调用Jenkins,这样就不需要让用户操作Jenkins了。如果要开发devops平台,那么可以将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。
持续集成实践
持续部署实践
自动化测试实践
传统运维,开发人员写完代码了,然后交给测试去部署测试环境,测试测试好了交给运维部署到预生产和生产环境。建立了稳定的流水线,可以分为三条流水线,一条测试流水线,一条预生产流水线,一条是生产流水线。
期间就不需要运维来操作了,开发人员写完代码点击流水线部署到测试环境,没问题之后点击预生产流水线,那就可以部署到预生产,预生产没问题就可以部署到生产。
Jenkins要想实现源代码的下载,需要集成svn或者git,这样就可以下载代码了,jenkins只是调用git客户端去下载代码,并不是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 mirrors下载稳定的Jenkins版本(https://mirror.tuna.tsinghua.edu.cn/jenkins/war/2.175/jenkins.war )。由于Jenkins是基于Java开发的一种持续集成工具,所以Jenkins服务器需安装JAVA JDK开发软件。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)
Index of /jenkins/redhat-stable/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
这样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包
版本 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
配置你的Tomcat,并且进行优化
[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
[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
terraform创建两个文件就行了,一个main的tf,那可以将所有代码写到main.tf里面。其他的文件都是后面运行生成的。