Jenkins+Ansible+Gitlab自动化部署三剑客(三)--Jenkins
Jenkins介绍
jenkins是一个开源持续集成工具
开发工具: JAVA
功能: 提供了软件开发的持续集成服务
特点: 支持主流软件配置管理,配合实现软件配置管理,持续集成功能
Jenkins的优势和应用场景
主流的运维开发平台,兼容所有主流开发环境
插件市场可与海量业内主流开发工具实现集成
job为配置单位与日志管理,使运维与开发人员能协同工作
权限管理划分不同job不同角色
强大的负载均衡功能,保证我们项目的可靠性
Jenkins安装配置管理
安装Jenkins前的环境准备(CentOS7)
1.添加yum仓库源
# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
#rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
2.保证系统JAVA版本为8.0或8.0以上
# yum -y install java
#java -version
3.关闭系统防火墙
# systemctl stop firewalld
# systemctl disable firewalld
4.关闭SELINUX(强制访问控制安全策略)并重启
# vi /etc/sysconfig/selinux
...
SELINUX=disabled
...
# reboot
Jenkins安装与初始化配置
1.Yum源安装Jenkins最新版本
# yum install jenkins
2.创建Jenkins系统用户
# useradd deploy
3.更改Jenkins启动用户与端口
# vi /etc/sysconfig/jenkins
...
JENKINS_USER=deploy
JENKINS_PORT=8080
...
4.启动Jenkins
# systemctl start jenkins
遇到的问题:
这里通过lsof -i:8080查看端口,但是端口并没有启动
查看日志
cat /var/log/jenkins/jenkins.log
java.io.FileNotFoundException: /var/cache/jenkins/war/META-INF/MANIFEST.MF (权限不够)
看到是因为deploy用户没有/var/cache目录的权限
chown -R deploy:deploy /var/cache/jenkins/
修改目录权限后,问题解决
登录jenkins web管理界面
根据路径查找对应密码
选择社区版
等待安装
安装完成创建用户,这里等待安装的时间可能比较长
Jenkins job的介绍(Freestyle job 和 Pipeline job)
代表一个任务或者项目
可配置与可执行
执行后的记录称之为Build
日志监控与记录
所有文件集中保存
Freestyle job
1.需要在页面添加模块配置项与参数完成配置
2.每个Job仅能实现一个开发功能
3.无法将配置代码化,不利于job配置迁移与版本控制
4.逻辑相对简单,无需额外的学习成本
Pipeline job
匹配持续集成与持续交付的概念
1.所有模块,参数配置都可以体现为一个pipeline脚本
2.可以定义多个stage构建一个管道工作集
3.所有配置代码化,方便Job配置迁移与版本控制
4.需要pipeline脚本语法基础
Jenkins job环境准备
1.配置Jenkins server本地Gitlab DNS
vim /etc/hosts
192.168.0.115 gitlab.example.com
2.安装git clent,curl工具依赖
yum -y install git curl
3.关闭系统Git http.sslVerify安全认证
4.添加Jenkins后台Git client user 与email
5.添加凭据
Jenkins freestyle job的构建与配置
1.创建一个Freestyle project
项目构建配置
#!/bin/sh export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" # Print env variable echo "[INFO] Print env variable" echo "Current deployment envrionment is $deploy_env" >> test.properties echo "THe build is $version" >> test.properties echo "[INFO] Done..." # Check test properties echo "[INFO] Check test properties" if [ -s test.properties ] then cat test.properties echo "[INFO] Done..." else echo "test.properties is empty" fi echo "[INFO] Build finished..."
OK,保存
接下来点击Build with Parameters构建任务
Jenkins Pipeline job的编码规范
pipeline基础架构
1.所有代码包裹在pipeline{}层内
2.stages{}层用来包含该pipeline所有stage子层
3.stage{}层用来包含具体我们需要编写任务的steps{}子层
4.steps{}层用来添加我们具体需要调用的模块语句
agent区域
1.agent定义pipeline在哪里运行
可以使用any,none,或具体的jenkins node主机名等
例如:我们要特指在node1上执行,可以写成
agent{node {label 'node1'}}
environment区域
1."变量名称=变量值"定义我们的环境变量
2.可以定义全局环境变量,应用所有stages任务
3.可以定义stage环境变量,应用单独的stage任务
script区域(可选)
1.在steps内定义script{}
2.groovy脚本语言
3.用来进行脚本逻辑运算
常用的steps区域
echo:打印输出
sh:调用Linux系统shell命令
git url:调用git模块进行git相关操作
Jenkins Pipeline job的构建配置
新建项目
2.添加描述保存
3.添加pipeline script
#!groovy pipeline { agent {node {label 'master'}} environment { PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" } parameters { choice( choices: 'dev\nprod', description: 'choose deploy environment', name: 'deploy_env' ) string (name: 'version', defaultValue: '1.0.0', description: 'build version') } stages { stage("Checkout test repo") { steps{ sh 'git config --global http.sslVerify false' dir ("${env.WORKSPACE}") { git branch: 'master', credentialsId:"1bc88d18-1b1d-46e1-a8cb-0893d2c42e51", url: 'https://root@gitlab.example.com/root/test-repo.git' } } } stage("Print env variable") { steps { dir ("${env.WORKSPACE}") { sh """ echo "[INFO] Print env variable" echo "Current deployment environment is $deploy_env" >> test.properties echo "The build is $version" >> test.properties echo "[INFO] Done..." """ } } } stage("Check test properties") { steps{ dir ("${env.WORKSPACE}") { sh """ echo "[INFO] Check test properties" if [ -s test.properties ] then cat test.properties echo "[INFO] Done..." else echo "test.properties is empty" fi """ echo "[INFO] Build finished..." } } } } }
4.立即构建
这里报错:groovy.lang.MissingPropertyException: No such property: deploy_env for class: groovy.lang.Binding
需要点击Build with Parameters再运行