1、持续集成
- 开发人员将会频繁的提交代码到主干,这些新提交在最终合并到主线之前,都需要通过编译和自动化测试流进行验证。这样做是基于之前,目的是让产品可以快速迭代,同时还能保持高质量,简化工作流程
2、持续交付
-
持续交付就是讲我们的应用发布出去的过程。这个过程可以确保我们尽可能快的实现交付。这就意味着除了自动化测试,我们还需要有自动化的发布流,以及通过一个按键就可以随时随地实现应用的部署上线。 通过持续交付,可以决定每天,每周,每两周发布一次,这完全可以根据自己的业务进行设置。 但是,如果真的希望体验持续交付的优势,就需要先进行小批量发布,尽快部署到生产线,以便在出现问题时方便进行故障排除;简单来说就是让通过持续集成后的代码可以部署、持续重复前者动作
3、持续部署
- 基于交付集成之上,无论何时代码都是能部署并且没有问题的
4、持续集成实现的思路 git jenkins shell
5、版本控制系统
-
将文件的每一次变化集中在一个系统中加以版本记录,以便后续查阅文件的历史版本记录 系统
-
常见版本控制系统
- svn 集中式
- 依赖于网络
- git 分布式
- 不依赖网络
- svn 集中式
-
git版本控制
-
环境准备 git gitlab
-
基本使用
[root@git ~]# yum -y install git [root@git ~]# git config global user.name "test" [root@git ~]# git config global user.email "test@163.com" [root@git ~]# git config global color.ui true
-
创建本地仓库
[root@git ~]# mkdir demo #实战一、提交目录文件到本地仓库 touch file{1..3} git status git add . git commit -m "描述信息" #实战二、git文件改名并重新提交本地仓库 git mv file1 file git status git commit -m "修改file1名称为file" #比对文件差异 git diff file1 ##本地和暂存区之间的差异 git diff --cached file1 ##暂存区和本地仓库的区别
-
git回退 git commit (快照)
##暂存区覆盖本地(误操作提交暂存区) git add . git status git reset HEAD file1 git checkout file1 ##查看已提交仓库的历史 git log --oneline git reflog git reset --hard id号
创建分支 [root@git demo]# git branch dev [root@git demo]# git branch dev * master [root@git demo]# git checkout dev [root@git demo]# git branch dev [root@git demo]# git branch dev * master [root@git demo]# git checkout dev Switched to branch 'dev' [root@git demo]# git branch * dev master 合并分支 [root@git demo]# git merge master Already up-to-date. 删除分支 [root@git demo]# git branch dev -d
-
git标签
打tag
[root@git demo]# git tag -a "v1.0" -m "描述" [root@git demo]# git tag v1.0 查看标签内容 [root@git demo]# git show v1.0 tag v1.0 Tagger: test <15235613543@163.com> Date: Sat May 16 08:00:28 2020 -0700 项目创建 commit 1e1e8e9af1a3b5417c047d38595771ed430ccc1c Author: test <15235613543@163.com> Date: Sat May 16 03:19:58 2020 -0700 : 删除标签 [root@git demo]# git tag -d v1.0 Deleted tag 'v1.0' (was b811d4d) [root@git demo]# git tag
-
git远程仓库
登录码云创建仓库 选择ssh连接 点设置上传公钥
[root@git demo]# ssh-keygen [root@git demo]# cat /root/.ssh/ authorized_keys id_rsa id_rsa.pub [root@git demo]# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC74DWuQPv/dGe5AsZyXcoInyfAiqrOjHtRRaKqrVhJ6GiE1XXzsyQPN2Z954OlLvmmD/WvcM733bGA/clMABnxkm+IeBrGl5SLY9I//jMVjPhqBPlIF1XwESEisO/smuSsro1Ewg7uySHbNkFZzJqXWcHliB9fGsrA40varJ0Yv2IOyAwRbKImXlCOtE0+48zwQoAzdHJs+tp/exZajTOrnR5m7GOmgU3PusGZpnIYBS/uDOEAMshWDX0vXt1oLGiB1d4MXAm7f9oePHUY/f9RyO+cKmNghCdBrmXAMBtB4s2DoT3soOtOz79pQQg4yu3v2LSLK1OSPWNlU7rUgnL9 root@git 添加远程连接用户 git remote add origin git@gitee.com:gou_jinyang/test-lianxi.git 推送master到远程仓库 git push -u origin master 删除远程仓库 [root@git demo]# git remote remove origin(用户名称) 克隆远程仓库 [root@git demo]# git clone git@gitee.com:gou_jinyang/test-lianxi.git 查看别人提交 [root@git demo]# git pull origin master
-
git与github关联
-
gitlab仓库
搭建gitlab 清华大学源下载gitlab安装包 清华源:https://mirror.tuna.tsinghua.edu.cn/
1、安装依赖
yum -y install curl postfix policycoreutils-python openssh-server wget
2、下载gitlab服务,并安装
yum localinstall 安装包 yum自动解决依赖问题
3、配置gitlab服务、访问域名及邮箱
vim /etc/gitlab/gitlab.rb external_url 'http://gitlab.test.com' #配置邮箱 gitlab_rails['gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = '1120633815@qq.com' gitlab_rails['gitlab_email_display_name'] = 'goujinyang-test-gitlab' gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.qq.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "1120633815@qq.com" gitlab_rails['smtp_password'] = "cmyxycuvzweghdcb" gitlab_rails['smtp_domain'] = "qq.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true #默认开启普罗米修斯监控会很占内存 关闭 prometheus['enable'] = false
4、初始化git服务、启动gitlab服务
[root@git ~]# gitlab-ctl reconfigure
[root@git ~]# gitlab-ctl start | restart | status | stop
##ps:每次修改/etc/gitlab/gitlab.rb 都需要 reconfigure
######192.168.53.130gitlab服务登录密码为:123123123 突然忘记了gitlab的登陆用户密码, 进入gitlab 后台控制台,等到打开ruby控制界面,有点慢 # gitlab-rails console production 修改用户密码: 1、> user=User.where(username: "root").first [ username / email ] => #<User id:1 @root> 【进入root用户,若出现=> nil 则表示没有这个用户】 2、> user.password=123123123 [此处用纯数字,至少8位] 3、> user.save! 4、> quit
成功。
5、访问gitlab服务、以及gitlab邮箱测试
6、汉化包地址:https://gitlab.com/xhang/gitlab
#查看版本、到网站下载对应汉化包 [root@git ~]# rpm -qa |grep gitlab gitlab-ce-12.2.0-ce.0.el7.x86_64 [root@git ~]# tar xf gitlab-v12.2.0-zh.tar.gz [root@git ~]# cd gitlab-v12.2.0-zh/ [root@git gitlab-v12.2.0-zh]# cat VERSION 12.2.0 #停止gitlab服务 [root@git ~]# gitlab-ctl stop #中文版覆盖英文版 [root@git ~]# cp -r gitlab-v12.2.0-zh/* /opt/gitlab/embedded/service/gitlab-rails/ #可能会出现log、tmp两个错误 忽略就可以 [root@git ~]# gitlab-ctl start #立即刷新页面会502,因为代理的nginx启动了后端还没有,过一会儿就可以了 #页面修改字符集为简体中文就OK,汉化完成
7、用户、组、项目
-
- 创建组
- 创建项目------>项目隶属于某个组
- 创建用户设定密码,为用户分配组
注意,公司中一般要关闭用户注册。禁止用户自己注册账号
8、gitlab备份与恢复
vim /etc/gitlab/gitlab.rb 默认存放备份站点目录 # gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" 默认保存时间 # gitlab_rails['backup_keep_time'] = 604800 手动备份命令 [root@git csms_project]# gitlab-rake gitlab:backup:create 备份在了自己设置的目录 [root@git ~]# cd /var/opt/gitlab/backups/ [root@git backups]# ls 1595490539_2020_06_23_12.2.0_gitlab_backup.tar 数据恢复 #停止数据写入 [root@git csms_project]# gitlab-ctl stop unicorn [root@git csms_project]# gitlab-ctl stop sidekiq #恢复数据 [root@git csms_project]# gitlab-rake gitlab:backup:restore BACKUP=1595490539_2020_06_23_12.2.0 备份成功的包名称 #### ps:BACKUP=时间戳加版本号 后缀不用写 #### gitlab tail 看所有日志
-
jenkins
-
jenkins是做什么的
- Jenkins是一个持续集成的工具,是由Java开发而成
- Jenkins就是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作
-
Jenkins能将各种开源的软件进行集成
-
-
jenkins安装
#安装jdk yum -y install java 安装参考官网 yum localinstall jenkins-2.222.3-1.1.noarch.rpm //下载好包使用yum安装 systemctl start jenkins 修改Jenkins启动用户,保证有使用各插件的权限 vim /etc/sysconfig/jenkins JENKINS_USER="root" // /var/lib/jenkins/plugins/ #此目录为Jenkins插件目录
-
Jenkins汉化
-
Jenkins插件 加速插件 安装插件 导入已有的插件
-
1、加速插件(国外的源替换成国内的源–>系统管理—>插件管理----->高级—>升级站点—>修改url)
https://mirror.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json //清华源插件url
-
-
- 2、手动上传.hpi的插件
-
-
3、导入本地已安装的插件(版本一致)
-
-
Jenkins集成gitlab
- 下载gitlab相关插件
插件名称 | 插件作用 |
---|---|
Credentials Plugin | 允许在Jenkins中存储认证得凭据 |
Git Client Plugin | 允许Jenkins使用Git |
Git Plugin | 允许Jenkins集成Git |
Gitlab Plugin | 允许Gitlab触发Jenkins构建并在Gitlab中显示 |
Gitlab Hook | 允许Gitlab自动触发Jenkins构建项目 |
Gitlab Authentication Plugin | Gitlab身份验证插件 |
-
创建任务—源码管理—选择git—添加密钥
-
手动搭建一套集群环境,实现代码上线 nginx代理两个后端
-
maven 将Java的源代码—编译成 war包 手动部署上线
maven编译时候会下载一堆jar包,可以指定国内源会比较快
vim /usr/share/maven/conf/settings.xml 159 <mirror> 160 <id>alimaven</id> 161 <name>aliyun maven</name> 162 <url>http://maven.aliyun.com/nexus/content/groups/public/</utl> 163 <mirror0f>central</mirror0f> 164 </mirror>
手动部署maven
# git clone git@gitlab.test.com:dev-test/profit-test.git # cd profit-test/ # mvn package -Dmaven.test.skip=true #跳过测试用例编译成war包
-
构建java项目 源码包 jar war
-
jenkins集成maven 下载插件 maven integration plugin
配置maven安装位置,JDK位置等
PS:红框中得参数有时候开发会给
-
Jenkins自由风格项目 shell
-
Jenkins构建项目
-
上线脚本 (粗糙)
-
优化脚本,让其支持传参 git tag
-
优化脚本让其支持回退功能
-
优化脚本让其无法实现重复构建一个
-
使用tag方式发布 Git Parameter
-
-
重复部署怎么办(脚本为html前端项目)
-
#!/bin/env bash DATE=$(date +%Y-%m-%d-%H-%M-%S) web_server="192.168.53.7 192.168.53.8" Sdir=/opt Ddir=/code Name=${DATE}-${git_version} #1、进去项目目录,将内容进行打包 get_code(){ cd ${WORKSPACE} && tar czf ${Sdir}/web-${Name}.tar.gz ./* } #2、将内容scp拷贝至web集群组 scp_web_server(){ for host in $web_server do scp ${Sdir}/web-${Name}.tar.gz root@$host:${Sdir} ssh root@$host "mkdir -p ${Ddir}/web-${Name} && tar xf ${Sdir}/web-${Name}.tar.gz -C ${Ddir}/web-${Name} rm -rf ${Ddir}/web && ln -s ${Ddir}/web-${Name} ${Ddir}/web" done } back(){ back_file=(ssh root@${host} "find /code/ -maxdepth 1 -type d -name "web-*-${git_version}"") for host in $web_server do ssh root@$host "rm -rf ${Ddir}/web && ln -s ${back_file} ${Ddir}/web" done } deploy(){ get_code scp_web_server } #判断之前是否部署过该版本得commit,如果没有则部署,如果有则提示,然后退出 #如果是回退,则不受限制 Jenkins任务里需要配置选项参数 deploy_env if [ $deploy_env == "deploy" ];then if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then echo "你已经部署过该${git_version} 版本" exit 1 else deploy elif [ $deploy_env == "rollback" ];then back fi
-
构建项目 html php
-
完整上线的脚本 部署和回滚(后端java项目脚本)
-
#!/bin/env bash DATE=$(date +%Y-%m-%d-%H-%M-%S) web_server="192.168.53.7 192.168.53.8" Sdir=/opt Ddir=/soft/tomcat/webapps Name=${DATE}-${git_version} #1、进去项目目录,将内容进行打包 get_code(){ cd ${WORKSPACE} } #2、将内容scp拷贝至web集群组 scp_web_server(){ for host in $web_server do scp /target/*.war root@$host:/opt/ROOT-${Name}.war ssh root@$host "mkdir -p ${Ddir}/ROOT-${Name} && unzip /opt/ROOT-${Name}.war -d ${Ddir}/ROOT-${Name} rm -rf ${Ddir}/ROOT && ln -s ${Ddir}/ROOT-${Name} ${Ddir}/ROOT" done } back(){ back_file=(ssh root@${host} "find ${Ddir} -maxdepth 1 -type d -name "ROOT-*-${git_version}"") for host in $web_server do ssh root@$host "rm -rf ${Ddir}/ROOT && ln -s ${back_file} ${Ddir}/ROOT" done } deploy(){ get_code scp_web_server } if [ $deploy_env == "deploy" ];then if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then echo "你已经部署过该${git_version} 版本" exit 1 else deploy fi elif [ $deploy_env == "rollback" ];then back fi
-
Jenkins通知机制
- 邮件
- 钉钉
-
拿到源代码后需要进行质量扫描
-
sonarqube
-
安装sonarqube
依赖于Java首先安装jdk1.8以上
安装数据库 MySQL得话需要5.6版本以上
#数据库安装完成之后 msyql -uroot -p123123 -e "crecte databases sonar default charecter set utf8;"
-
-
下载好sonarqube,并解压到/usr/local/下
##官方地址 注意 sonarqube7.9以后不支持MySQL数据库,所以项目暂时使用7.0版本 https://www.sonarqube.org/downloads/
[root@sonar ~]# unzip sonarqube-7.0/.zip -d /usr/local/ [root@sonar ~]# useradd sonar [root@sonar ~]# chown -R sonar.sonar /usr/local/sonarqube-7.0/ [root@sonar ~]# ln -s /usr/local/sonarqube-7.0/ /usr/local/sonarqube [root@sonar ~]# chown -R sonar.sonar /usr/local/sonarqube
-
修改sonarqube连接数据库配置文件
[root@sonar ~]# vim /usr/local/sonarqube/conf/sonar.properties 18 sonar.jdbc.username=root 19 sonar.jdbc.password=123123 26 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=m axPerformance&useSSL=false
-
启动sonarqube 注意需要普通用户启动
su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start" [root@sonar ~]# netstat -anpt |grep 9000 tcp6 0 0 :::9000 :::* LISTEN 2692/java
登录,账号/密码 默认:admin/admin
-
安装汉化插件
1、页面找到Administration–》Marketplace–》搜索框chinese,出现一个chinses pack。然后点击install
2、页面会提示reset重启 sonarqube,重启再次打开则为汉化
-
所需插件都可在此安装
```shell
/usr/local/sonarqube/extensions/plugins/ //sonarqube插件目录
```
客户端工具sonar-scanner
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/
maven项目 //登录时生成
mvn sonar:sonar
-Dsonar.host.url=http://sonar.test.com:9000
-Dsonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4 //Jenkins toCken令牌,登录时生成
php
sonar-scanner
-Dsonar.projectKey=php
-Dsonar.sources=.
-Dsonar.host.url=http://sonar.test.com:9000
-Dsonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4
sonar-scanner
-Dsonar.projectKey=html
-Dsonar.sources=.
-Dsonar.host.url=http://sonar.test.com:9000
-Dsonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4
-
jenkins服务器安装sonar-scannerc
unzip sonar-scanner-cli-4.0.0.1744-linux.zip -d /usr/local/ ln -s /usr/local/sonar-scanner-4.0.0.1744-linux/ /usr/local/sonar-scanner cd /usr/local/sonar-scanner vim conf/sonar-scanner.properties sonar.host.url=http://sonar.test.com:9000 //指定服务端 sonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4 //toCken 默认服务端不开启验证,需手动开启 sonar.sourceEncoding=UTF-8 //字符集
手动开启认证:配置–》权限–》开启并保存
手动扫描
[root@jenkins maven]# #cd /var/lib/jenkins/workspace/项目目录(这里假如是html项目,执行如下) /usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=html -Dsonar.sources=. maven项目扫描 [root@jenkins maven-tom]#cd /var/lib/jenkins/workspace/maven-tom [root@jenkins maven-tom]# mvn sonar:sonar -Dsonar.host.url=http://sonar.test.com:9000 -Dsonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4 使用sonar工具扫描java项目 [root@jenkins maven-tom]#cd /var/lib/jenkins/workspace/maven-tom [root@jenkins maven-tom]# /usr/local/sonar-scanner/bin/sonar-scanner > -Dsonar.projectKey=java > -Dsonar.sources=.
-
手动将代码推送至sonarqube测试
-
Jenkins集成sonarqube
下载插件----系统配置-----配置----添加Jenkins-tocken
插件SonarQube Scanner for Jenkins
a:Name随便填写
b:URL添加sonarqube得地址
c:token添加Secret text 填写之前安装sonarqube得token
-
同时还需要再Jenkins上配置Sonar-scanner工具路径
系统管理---全局工具配置(告诉Jenkins sonarscanner在哪个路径)
a:Name可以随便填写,但最好规范
b:SONAR_RUNNER_HOME填写sonar-scanner本地路径 //如果不配置则无法进行扫描
- Jenkins流水线pipeline
- pipeline基本语法
-
所有代码包裹在pipeliine{}层内
-
agent{}定义任务在那台主机上运行,可以是any、none等
-
environment{}变量名称=变量值,用于定义环境变量,比如PATH路径等
-
stages{}类似一个大项目的集合,主要用来包含所有stage子任务
-
stage{}类似于一个项目中的单个任务,主要用来包含setup{}子层
-
setps{}用来实现具体执行的动作
pipeline { agent any //agent { label 'slave1' } 指定某个从节点运行job //任务集合 stages { stage('代码获取') { steps { echo "get code is ok" } } stage('代码质检') { steps { echo "check code is ok" } } stage('代码构建') { steps { echo "build is ok" } } stage('代码部署') { steps { echo "deploy is ok" } } } }
构建测试
-
-
pipeline实现html项目流水线部署
-
pipeline实现Java流水线部署
-
jenkins分布式构建
-
系统管理–》节点管理–》新建节点
注意Jenkins master节点有的工具slave也得有当然包括部署脚本域名解析、密钥等,除了Jenkins
-
下面工具配置
-
Jenkins权限控制