jenkins由浅入深
1. 持续集成、持续交付、持续部署
1. 持续集成是指在软件开发过程中,频繁地将代码集成到主干上,然后进行自动化测试。Continuous Integration
2. 持续交付是指在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的类生产环境。Continuous Delivery
3. 持续部署是指在持续交付的基础上,把部署到生产环境的过程自动化。Continuous Deployment
2. 持续集成之jenkins安装部署
1. 添加yum仓库源
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
2. 保证系统java版本为8.0或8.0以上
yum install java -y
java -version
3. 关闭系统防火墙
4. 关闭selinux
5. 安装jenkins
yum install jenkins -y
6. 创建jenkins系统用户
useradd deploy
7. 更改jenkins启动用户与端口
vi /etc/sysconfig/jenkins
JENKINS_USER=deploy
JENKINS_PORT=8081
chown -R deploy.deploy /var/lib/jenkins
chown -R deploy.deploy /var/log/jenkins
chown -R deploy.deploy /var/cache/jenkins
8. 启动jenkins
systemctl start jenkins
9. 访问http://172.168.1.191:8081
初始化admin密码
复制/var/lib/jenkins/secrets/initialAdminPassword文件的内容
10. 出现错误

解决方法:
修改/var/lib/jenkins/hudson.model.UpdateCenter.xml
该文件为jenkins下载插件的源地址,改地址默认jenkins默认为:https://updates.jenkins.io/update-center.json,就是因为https的问题,此处我们将其改为http即可,之后重启jenkins服务即可。
其他国内备用地址(也可以选择使用):
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.esuni.jp/jenkins/updates/update-center.json
重启jenkins。
1) 修改/var/lib/jenkins/updates/default.json
jenkins在下载插件之前会先检查网络连接,其会读取这个文件中的网址。默认是:
访问谷歌,这就很坑了,服务器网络又不能FQ,肯定监测失败呀,不得不说jenkins的开发者脑子锈了,所以将图下的google改为www.baidu.com即可,更改完重启服务。

3. gitlab环境搭建
1. 安装Gitlab组件
yum install curl policycoreutils openssh-server openssh-clients postfix -y
2. 配置YUM仓库
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
3. 启动postfix邮件服务
centos7: systemctl start postfix && systemctl enable postfix
centos6: /etc/init.d/postfix start
4. 安装Gitlab-ce社区版本
yum install -y gitlab-ce
5. 恢复备份
1. 拷贝旧gitlab服务器/var/opt/gitlab/backups下需要恢复的备份到新服务器相同目录下。
2. 拷贝旧服务器/etc/gitlab/gitlab-secrets.json文件到新服务器相同目录下
3. 执行命令:sudo gitlab-rails runner "Project.where.not(import_url: nil).each { |p| p.import_data.destroy if p.import_data }"
4. 修改:vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml,gitlab节点host修改为实际IP地址,并重启。
5. 重启gitlab-ctl restart
6. 检查状态gitlab-ctl status
6. 管理配置gitlab
1. 配置文件
/etc/gitlab/gitlab.rb
2. 安装目录
/opt/gitlab
3. 数据目录
/var/opt/gitlab
4. 存放仓库数据
/var/opt/gitlab/git-data
5. 查看gitlab所有服务状态
gitlab-ctl status
6. 停止所有服务
gitlab-ctl stop
7. 启动所有服务
gitlab-ctl start
8. 启动关闭某个服务
gitlab-ctl start nginx
gitlab-ctl stop nginx
9. 查看所有服务的日志
gitlab-ctl tail
10. 更新配置文件后重新加载配置
gitlab-ctl reconfigure
7. gitlab服务组成
1. nginx 静态web服务器
2. gitlab-workhorse 轻量级的反向代理服务器
3. logrotate 日志文件管理工具
4. postgresql 数据库
5. redis 缓存数据库
6. sidekiq 用于在后台执行队列任务(异步执行)
7. unicorn An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。(Ruby Web Server,主要使用Ruby编写)
8. gitlab使用
1. 创建组-用户-项目
2.
9. gitlab备份
1.
4. 在jenkins服务器安装git
yum install git -y 安装git
git --version 验证一下版本
5. 在jenkins服务器上安装Maven
获取安装源:
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
然后使用命令:yum install apache-maven,输入y,等待安装结束。
使用mvn -v验证安装是否成功
6. 登录jenkins配置一下maven
在global tool configuration中,配置maven

maven是一个高级java构建脚本框架,它使用标准目录结构和标准的生命周期,协定统一配置。
在配置系统中,可以设置maven的启动参数。
7. 登录jenkins配置一下jdk

8. 登录jenkins配置一下邮件通知
在系统配置中,设置一下邮件和smtp

设置完以后,需要在作业里面添加邮件通知的模块。
9. jenkins的配置文件
1. 默认路径:/etc/sysconfig/jenkins,内容如下:
JENKINS_HOME="/var/lib/jenkins" 定义主目录 JENKINS_JAVA_CMD="" 定义java执行命令 JENKINS_USER="jenkins" 定义运行jenkins后台的用户 JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true" 定义运行jenkins的java参数 JENKINS_PORT="8089" 定义jenkins监听的端口 JENKINS_LISTEN_ADDRESS="" 定义jenkins监听的地址 JENKINS_HTTPS_PORT="" 定义jenkins监听https的端口 JENKINS_HTTPS_KEYSTORE="" JENKINS_HTTPS_KEYSTORE_PASSWORD="" JENKINS_HTTPS_LISTEN_ADDRESS="" 定义jenkins监听的HTTPS地址 JENKINS_AJP_PORT="-1" JENKINS_AJP_LISTEN_ADDRESS="" JENKINS_DEBUG_LEVEL="5" JENKINS_ENABLE_ACCESS_LOG="no" 定义jenkins的访问日志 JENKINS_HANDLER_MAX="100" 最大的http工作线程 JENKINS_HANDLER_IDLE="20" 最大的空闲的http工作线程 JENKINS_ARGS="" 定义jekins启动参数
10. jenkins的主目录结构
fingerprints 这个目录被jenkins用来跟踪人工操作的痕迹
jobs 这个目录包含jenkins管理的构建作业的配置细节,以及这些构建所输出的产物及数据
这个目录有很多以作业名称命名的子目录,子目录里面还有builds workspace config.xml等
builds目录包含为这个作业所执行的构建的历史,这个目录随着时间会增大。
workspace目录,每个项目只能有一个workspace目录,大小相对稳定
config.xml构建作业的详细配置吃的。
users 用来存储用户账户信息的目录
plugins 所有已安装的插件
updates 用来存放可用的插件更新
11. 备份jenkins数据
定时备份/var/lib/jenkins目录
12. 升级jenkins
1. 使用web方式升级
登录到web端,然后下载war包,升级
2. 更新war包升级
官网下载war包,升级
3. 升级jenkins插件
13. 配置jenkins服务器
1. 配置系统
配置全局变量
配置sonarqube
配置ssh remote hosts
配置publish Over SSH
配置邮件通知
2. 配置全局安全
配置验证方式
3. 配置资格权限
4. 从硬盘加载配置
5. 管理插件
6. 系统信息
7. 系统日志
8. 负载统计
9. jenkins命令行
10. 脚本控制台
11. 管理节点
jenkins采用分布式的结构,分布到其它节点,构建作业
12. 管理用户
13. 管理文件
14. 关机准备
该功能可以阻止新的构建请求,安全彻底地关掉jenkins
15. 管理旧数据
16. 全局工具配置
配置maven
配置jdk
配置git
14. 设置构建作业
1. 创建新的构建作业
1. 自由式构建作业
2. maven项目
3. 监视外部作业
4. 多组态作业

2. 通用选项
1. discard old builds 丢弃旧的版本

2. 权限控制

3. 配置源代码管理
1. 使用svn
2. 使用git
1. 在jenkins服务器上安装git
2. 在jenkins插件管理中,安装git
3. 在jenkins配置工具管理,使用git

4. 在项目中选择源码管理,选择git,指定对应的私库地址

设置对应的分支名称
5. 设置git的私钥

私钥从git服务器的git账号下,获得。在/var/opt/gitlab/.ssh目录下。
3. 使用ant
4. 构建触发器
远程触发构建
构建作业完成后触发下一个
计划构建作业
轮询SCM
5. 构建环境

6. 构建
使用maven构建
7. 构建后的操作
1. 采用publish over SSH插件的方式,执行远程服务器的命令。
需要提前安装好publish over SSH插件,需要配置好SSH,远程服务器的IP地址和连接账号和密码或者密钥。
15. Jenkins安全
16. Jenkins使用过程遇到的问题
安装好插件“Locale plugin”和“Localization: Chinese (Simplified)后,先设置为zh_US重新启动,再设置回来
其他插件重启Jenkins后,又出现了部分中文简体不翻译的情况。
方法如下,可以完美修复。
1. 将语言设定为zh_US,Jenkins切换为英文。
2. 重启jenkins服务。
3. 再次语言设定为zh_CN,刷新即可。
17. Jenkins部署docker
1. 安装pipeline
1. jenkins版本要求2.x或者更高版本
2. 安装pipeline插件
在插件管理中,可更新,选择pipeline
2. 配置使用pipeline脚本
node {
// 拉取代码
stage('Git Checkout') {
checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '8c2f92e3-0cae-4528-8ae9-9ae1e1c8ee69', url: 'git@192.168.31.66:/home/git/tomcat-java-demo.git']]]) }
// 代码编译
stage('Maven Build') {
sh '''
export JAVA_HOME=/usr/local/jdk
/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
'''
}
// 项目打包到镜像并推送到镜像仓库
stage('Build and Push Image') {
sh '''
REPOSITORY=192.168.31.66/library/tomcat-java-demo:${branch}
cat > Dockerfile << EOF
FROM 192.168.31.66/library/tomcat:v1
MAINTAINER www.ctnrs.com
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOF
docker build -t $REPOSITORY .
docker login 192.168.31.66 -u admin -p Harbor12345
docker push $REPOSITORY
'''
}
// 部署到Docker主机
stage('Deploy to Docker') {
sh '''
REPOSITORY=192.168.31.66/library/tomcat-java-demo:${branch}
docker rm -f tomcat-java-demo |true
docker pull $REPOSITORY
docker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY
'''
}
}
18. pipeline的使用
1. 安装和使用
在系统管理-管理插件,搜索pipeline
2. pipeline定义
1. 直接在jenkins网页中输入脚本

2. 通过创建一个jenkinsfile可以检入项目的源代码管理库
1. declarative
2. scripted pipeline
2. jenkins+docker
node {
stage('Git Checkout') {
checkout([$class: 'GitSCM', branches: [[name: '*/test']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '49f174d6-407c-4e2f-91ec-886f498c4aac', url: 'git@172.168.1.227:zhen-api/activityapi.git']]])
}
stage('Maven Build') {
sh '''
export JAVA_HOME=/usr/java/jdk1.8.0_65
/usr/local/maven/maven3/bin/mvn clean package -P test
'''
}
//deploy to docker
stage('deploy to docker') {
sshPublisher(publishers: [sshPublisherDesc(configName: '172.168.1.231-docker-dev', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''(docker ps -a | grep tomcat-activity &> /dev/null) && (docker rm -f tomcat-activity;
docker run -itd --name=tomcat-activity -p 8081:8080 -v /home/java/app/activity/webapps:/usr/local/apache-tomcat-8.5.43/webapps -v /home/java/app/activity/logs:/usr/local/apache-tomcat-8.5.43/logs tomcat:v1) ||
docker run -itd --name=tomcat-activity -p 8081:8080 -v /home/java/app/activity/webapps:/usr/local/apache-tomcat-8.5.43/webapps -v /home/java/app/activity/logs:/usr/local/apache-tomcat-8.5.43/logs tomcat:v1''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'activity/webapps', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/activity.war')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
3. jenkins+k8s
podTemplate(label: 'jnlp-slave', cloud: 'kubernetes', containers: [
containerTemplate(
name: 'jnlp',
image: '192.168.31.61/library/jenkins-slave',
alwaysPullImage: true
),
],
volumes: [
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
],
imagePullSecrets: ['registry-pull-secret'],
)
{
node("jnlp-slave"){
stage('Git Checkout'){
checkout([$class: 'GitSCM', branches: [[name: '${Tag}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '2da2a0db-b3bc-4158-b2aa-407a7f1e0842', url: 'git@192.168.31.61:/home/git/tomcat-java-demo']]])
}
stage('Unit Testing'){
echo "Unit Testing..."
}
stage('Maven Build'){
sh "mvn clean package -Dmaven.test.skip=true"
}
stage('Build and Push Image'){
sh '''
Registry=192.168.31.61
docker login -u admin -p Harbor12345 $Registry
docker build -t $Registry/project/demo:${Tag} -f Dockerfile .
docker push $Registry/project/demo:${Tag}
'''
}
stage('Deploy to K8S'){
sh '''
sed -i "/demo/{s/latest/${Tag}/}" deploy.yaml
sed -i "/namespace/{s/default/${Namespace}/}" deploy.yaml
'''
kubernetesDeploy configs: 'deploy.yaml', kubeConfig: [path: ''], kubeconfigId: '74bbb361-e426-4b66-ae41-c4cbceadd809', secretName: '', ssh: [sshCredentialsId: '*', sshServer: ''], textCredentials: [certificateAuthorityData: '', clientCertificateData: '', clientKeyData: '', serverUrl: 'https://']
}
stage('Testing'){
echo "Testing..."
}
}
}
4. 其它例子,可供参考
node ("192.168.0.218") { // 指定Slave标签
// 拉取代码
stage('Git Checkout') {
checkout([$class: 'GitSCM', branches: [[name: '$Tag']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@192.168.0.219:/home/git/solo.git']]])
}
// 代码编译
stage('Maven Build') {
sh '''
export JAVA_HOME=/usr/local/jdk1.8
/usr/local/maven3.5/bin/mvn clean package -Dmaven.test.skip=true
'''
}
// 项目打包到镜像并推送到镜像仓库
stage('Build and Push Image') {
sh '''
REPOSITORY=192.168.0.219/project/solo:${Tag}
cat > Dockerfile << EOF
FROM 192.168.0.219/library/tomcat-85:latest
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
EOF
docker build -t $REPOSITORY .
docker login -u lizhenliang -p NR4tR3LPzZ8= 192.168.0.219
docker push $REPOSITORY
'''
}
// 部署到Docker主机
stage('Deploy to Docker') {
sh '''
REPOSITORY=192.168.0.219/project/solo:${Tag}
docker rm -f blog-solo |true
docker image rm $REPOSITORY |true
docker login -u lizhenliang -p NR4tR3LPzZ8= 192.168.0.219
docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk -p 88:8080 $REPOSITORY
'''
}
}
19. 参数化构建任务
1. 常用的参数
文本参数
字符参数
2. 扩展参数化构建
extended choices parameter 插件
20. 主从架构
1. 好处
加快构建过程
减轻master的负担
2. 在slave机器上添加jenkins用户并设置密码。使master可以使用jenkins用户无密钥登录slave。
21. 安装Publish over SSH插件
1. 新版本的jenkins已经把Publish over SSH插件下架,需要去国内的镜像网站下载.hpi放到jenkins的数据目录的plugins,重启一下服务,就有插件了。
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins
2. 放到/var/lib/jenkins/plugins目录下
3. 重启jenkins服务
4. 在管理----系统配置----会出现Publish over SSH

22. 安装ssh插件
1. 安装插件

2. 添加凭据
1. 使用用户名和密码
1. jenkins主机的账号密码与目标主机的账号密码一致,可以连到远程主机
2. jenkins主机的账号密码与目标主机的账号一致密码不一致,要以远程主机的密码为准
2. 使用用户名和私钥
前提:把jenkins主机的账号的公钥发送到目标主机的authorized_keys上,jenkins主机可以直接免密钥登录远程目标主机。
1. 私钥使用远程主机的私钥,连不上远程主机
2. 私钥使用jenkins主机的私钥,可以连接上远程主机
3. 添加SSH remote hosts

23. jenkins定义变量
1. 全局变量
系统管理-全局变量,key-value
2. job变量
安装插件Environment Injector
构建环境的时候,添加变量

引用变量${deployed_server}
24. jenkins其它用户登录无权限

在jenkins家目录的config.xml中进行配置。
添加内容如下:


浙公网安备 33010602011771号