jenkins安装及使用
1.1 持续集成Continuous integration (CI)
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
1.2 前言
- 维护一个单一的代码库
- 使构建自动化
- 执行测试是构建的一部分
- 集成日志及历史记录
- 使用统一的依赖包管理库
- 每天至少集成一次
1.3 什么是jenkins
Jenkins is an automation engine with an unparalleled plugin ecosystem to support all of your favorite tools in your delivery pipelines, whether your goal is continuous integration, automated testing, or continuous delivery.
持续集成、自动测试、持续部署的超级引擎,支持自定义工具集、多种交付通道。
1.4 安装
安装依赖
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
YUM安装(不推荐)
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key or rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
安装Jenkins
启动的话,jenkins 2.60版本之后支持systemctl的使用,而之前的版本我暂时没看到支持的。都是使用service启动。
yum –y install jenkins service jenkins start
RPM安装
下载地址
https://pkg.jenkins.io/redhat-stable/ https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/
RPM安装
rpm –ivh jenkins-2.32.3-1.1.noarch.rpm service jenkins start ckconfig Jenkins on
1.5页面
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword bc47caf27ba24145828a48024c52bf0b
选择建议安装插件。
通常得十来分钟。
插件默认路径是
cd /var/lib/jenkins/plugins/
输入用户名和密码
安装成功
安装jenkins卡启动,直接断网即可。jenkins尝试连接官网
jenkins
1.6 插件--目录:/var/lib/jenkins/plugins/
安装插件后需要重启服务
插件跟jenkins版本存在兼容性问题。
去官网下载插件。
http://updates.jenkins-ci.org/
1.7 镜像管理
全部镜像
http://mirrors.jenkins-ci.org/status.html
更换镜像
http://updates.jenkins-ci.org/update-center.json https://mirrors.tuna.tsinghua.edu.cn/ http://mirror.esuni.jp/jenkins/updates/update-center.json https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
1.8 配置文件
1.8.1 目录结构
/var/lib/jenkins 主目录 /etc/init.d/jenkins 启动文件 /var/cache/Jenkins 程序文件 /var/log/Jenkins 日志文件
[root@jenkins plugins]# rpm -ql jenkins /etc/init.d/jenkins # 启动文件 启动文件里的变量是去配置文件里拿的 /etc/logrotate.d/jenkins /etc/sysconfig/jenkins # 配置文件 /usr/lib/jenkins /usr/lib/jenkins/jenkins.war # war包存放位置 /usr/sbin/rcjenkins /var/cache/jenkins # 程序文件 /var/lib/jenkins # 工作目录 升级只要把war包放在这里即可 /var/log/jenkins # 日志文件
[root@jenkins ~]# grep -vE "^$|#" /etc/sysconfig/jenkins JENKINS_HOME="/var/lib/jenkins" # jenkins工作目录 JENKINS_JAVA_CMD="" JENKINS_USER="jenkins" # Jenkins的启动用户 JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true" # java的启动选项 JENKINS_PORT="8080" # jenkins端口 JENKINS_LISTEN_ADDRESS="" # Jenkins监听端口 JENKINS_HTTPS_PORT="" # HTTPS 的指定端口 JENKINS_HTTPS_KEYSTORE="" # HTTPS 指定认证 JENKINS_HTTPS_KEYSTORE_PASSWORD="" # HTTPS 指定KEY文件 JENKINS_HTTPS_LISTEN_ADDRESS="" # HTTPS 指定监听地址 JENKINS_DEBUG_LEVEL="5" # 日志级别 JENKINS_ENABLE_ACCESS_LOG="no" # 不记录访问日志 JENKINS_HANDLER_MAX="100" # 最大的工作线程 JENKINS_HANDLER_IDLE="20" # idle工作的线程数 JENKINS_ARGS="" # 启动参数
1.9 备份 备份/var/lib/jenkins/ 即可
主要备份就是jenkins的工作目录,程序目录就算啦。
tar zxvf jenknis.tar.gz /var/lib/jenkins/ # 每次全量,后期受不了 用rsync增量备份最好。 # 增量也有缺点,各有舍取
1.10 创建第一个项目(项目)
构建自由风格的软件项目。 此处使用的是python代码
认证信息的话,可以是jenkins的公钥。密钥分发需要先记录主机 也就是免密登陆的yes。
还要注意权限。也可以使用账号密码进行使用。
构建完成后
点击构建就会自动拉取代码并执行shell命令。
1.11 maven(工作没用上,暂时没上)
maven主要是构建java用的项目,安装插件后可以创建对应的项目。
可以拉取代码并且自动编译,部署,重启tomcat。具体细节,往后有时间更新。
1.12 按版本发布
安装git parameter plugin插件
任务配置中勾选<参数化构建过程>
选择 git parameter
创建变量名release
选择发布类型:
- tag 按标签发布
- branch按分支分布
- Revision 按修订发布
Branched to build:换成 $release (不然永远拉取都是最新的)
pipeline不能使用使用变量名。这个需要跟环境(目录名进行结合。)
1.13 远程管理
笔者使用的是saltstack,而且只是使用了shell 执行模块。
saltstack的github地址:https://github.com/AgoCan/MySalt
saltstack需要注意的一点就是缓存和 工作空间的.git目录会有冲突,笔者建议,job构建后第一次直接删.git目录进行推送。
然后使用 mount --bind 工作空间目录 salt的files目录 这样就可以使两个目录相同了。不然salt笔者暂时没找到好的方案。
可以使用的方案有:
- SSH
- ansible
- saltstack
- saltstack 的API
1.14 代码推送,代码有点旧,新代码请看github上的代码。持续更新中。
mkdir files
mkdir files/dev
vi delete_three_ago_code.sh
# 删除三次以前的代码
#!/bin/sh num=`ls -d /usr/local/nginx/html/luffy_dev*|wc -l` if [ $num -gt 4 ];then ls -dt /usr/local/nginx/html/luffy_dev* | tail -1|xargs -i rm -r '{}' fi
mount --bind /var/lib/jenkins/workspace/dev/ /srv/salt/base/files/dev
# 推送之前需要需要把源文件给改名
change_code_name: cmd.run: - name: mv /usr/local/nginx/html/luffy_dev /usr/local/nginx/html/luffy_dev`date +%F-%H` delete_and_push_code: cmd.script: - source: salt://files/push_code.sh - user: root file.recurse: - name: /usr/local/nginx/html/luffy_dev - source: salt://files/dev
安装ssh plugin插件
类似于ansible的scripts的模块和saltstack的cmd.script模块
系统管理>SSH remote hosts 增加主机信息
在项目中选择execute shell scripts on remote host using ssh
类似于在本地写shell。跟ssh 直接执行没差。 使用salt即可。
制作jenkins主机免密登录
直接在 execute shell界面执行ssh命令
或在脚本中接调用ssh语句
ssh root@192.168.47.175 “ifconfig”
scp xxx root@192.168.47.175/xxx/
安装ansible
配置ansible hosts
配置ansible对其它机器的免密权限
执行ansible 命令
1.15 集群
创建节点
在Configure Global Security中开启TCP port for JNLP agents随机选取或指定端口
新建节点,系统设置里
节点名
执行器数量
远程工作目录(可以不存在)
用法-只允许绑定到这台机器的job
Lanch slave agents on unix machines vis SSH
增加认证权限
节点的构建环境要符合job的要求
分配任务到节点
在任务配置中勾选Restrict where this project can be run
1.16 权限 按角色授权(这个很重要,权限的限制)
笔者的salt是直接使用root用户执行,而为了使用jenkins用户执行的jenkins能够执行saltstack,做了个sudo权限审计,不可避免就是权限过大。
那么这里的限制是很重要的。比如不能让开发修改JOB的配置文件。只给构建和执行。还有就是线上的构建他们是看不到的,只能自己看到自己的代码。
插件Role-based Authorization Strategy
创建用户
刚创建是没权限登陆的。需要一个只读的权限,才能登陆jenkins。、
建项目角色
系统设置
要有只读权限,view,不然登陆不上。
下面是全局配置
下面是给角色,也就是用户分配项目
1.17 pipeline
pipeline,也就是流水线。构建完第一个项目之后,紧跟这第二个项目。你们自己类比下,福特公司的流水线给他带来多大的好处。
插件:pipeline
新建一个pipe项目
生成pipeline脚本即可。
node { stage 'Stage 1' build ‘dev’ stage 'Stage 2' build ‘python’ }
# 点击左下角,有解释其他用法,比如如何执行shell,执行等等。
末尾:认为此博客有一点帮助的,就点击右边的赞助,来吧。
你们的支持是笔者多写点工作上的困难,问题的动力。