1. 介绍
什么是持续集成?
经常频繁的代码合并, 持续集成跟运维有关的工作,提供一个代码仓库,版本控制系统(备份,迁移)
什么是持续交付?
开发团队---测试团队---运维上线
开发团对,单元测试,---测试-- 代码质量检测--- 测试, sonarqube
什么是持续部署?
频繁的代码上线,持续部署
2. 持续集成
什么是版本控制系统
每一次提交或修改都看作是一个版本
版本控制系统解决了什么问题?
快速回滚到指定的版本,只保留变化的内容
常见版本控制系统svn与git区别?
svn: 中心化的代码仓库
git: 分布式的代码仓库
安装和配置git
#git的安装
yum install git -y
git --version
git config --global user.name "xxxx"
git config --global user.email "xxxx@qq.com"
git config --global color.ui "true"
创建版本库
mkdir test
cd test
git init
git仓库添加文件
git add . #添加文件到缓冲区
git commit -m 'add three file'
git修改文件名称并提交
git mv file1 file4
git commit -m 'change file name'
git的文件对比
git diff file3 #本地目录和缓冲区文件对比
git diff --cached file3 #缓冲区文件和仓库文件对比
实现回退功能
查看当前的历史版本
git log --oneline
git reset --hard 942bdf3
查看所有的历史版本
git reflog --oneline
git reset --hard 942bdf3
撤销修改的文件
提交到缓冲的区文件撤回
git reset HEAD file3(文件名)
git checkout -- file3(文件名)
未add到缓冲区的文件撤回
git checkout -- file3(文件名)
git分支管理
#增加一个新分支
git branch dev01
#切换分支
git checkout dev01
#在开发分支上合并主分支
git merge master -m '注释'
#切回主分支
git checkout master
#在主分支合并开发
git merge dev01 -m '注释'
git标签管理
#查看当前标签
git tag
#给当前版本打标签
git tag v1.2
#删除标签
git tag -d v1.2
#给任意版本打标签
git tag -a v1.0 -m '优化了1111 修复bug' a119962
git远程仓库gitee
#从远程仓库克隆到本地
git clone git@gitee.com:yu_hong_lei/linux63.git
#讲本地推到远程
git push origin master
#远程更新到本地
git pull origin master
gitlab仓库搭建
`安装`
#上传gitlab-ce-11.9.11-ce.0.el7.x86_64.rpm到当前目录
yum localinstall gitlab-ce-11.9.11-ce.0.el7.x86_64.rpm -y
vim /etc/gitlab/gitlab.rb
#设置访问url和关闭prometheus
external_url 'http://10.0.0.100'
prometheus_monitoring['enable'] = false
#配置gitlab通过smtp发送邮件
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'xxxxxx@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxxxxx@qq.com"
gitlab_rails['smtp_password'] = "xxxxxx"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
#初始化
gitlab-ctl reconfigure
`gitlab汉化`
#下载汉化包https://gitlab.com/xhang/gitlab
tar xf gitlab-11-9-stable-zh.tar.gz
gitlab-ctl stop
\cp -a gitlab-11-9-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/
gitlab-ctl start
`gitlab备份和恢复`
#备份
gitlab-rake gitlab:backup:create
#恢复
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
gitlab-rake gitlab:backup:restore BACKUP=1510472027_2017_11_12_9.4.5
gitlab-ctl start unicorn
gitlab-ctl start sidekiq
#备份路径
vim /etc/gitlab/gitlab.rb
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_keep_time'] = 604800
#迁移云主机
先备份,云主机安装相同版本,恢复
`gitlab版本升级`
gitlab升级, 10-->11-->12
gitlab升级不能跨大版本
上传需要升级的rpm包
yum localinstall -y gitlab-ce-12.3.6-ce.0.el7.x86_64.rpm
3. jenkins介绍
Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要
Jenkins是一个调度平台
4. 安装jenkins
安装方式:
1.yum方式 或 rpm包
2.直接部署war包
3.使用docker安装
#部署tomcat
rpm -ivh jdk-8u102-linux-x64.rpm
mkdir /app
tar xf apache-tomcat-8.0.27.tar.gz -C /app
cd /app/apache-tomcat-8.0.27/webapps/
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war
mv jenkins.war ROOT.war
/app/apache-tomcat-8.0.27/bin/startup.sh
#打开浏览器访问http://10.0.0.15:8080安装Jenkins
5. Jenkins插件的安装
6. 创建一个job
一个代码上线的流程 | |
---|---|
通用 | 配置参数化构建 |
源码管理 | 拉取git仓库 |
构建触发器 | gitlab自动触发Jenkins远程构建 |
构建环境 | 删除workspace |
构建 | html 远程上线, java maven编译 部署 |
构建后 | 通知 邮件通知,钉钉通知** |
7. Jenkins拉取gitlab的代码
8. 实现html自动化代码上线
#!/bin/bash
project=$1
tag=$2
tarname="${project}_${tag}.tar.gz"
web_ip="10.0.0.101 10.0.0.102"
tar zcf /opt/$tarname *
for n in $web_ip;
do
scp -rp /opt/$tarname root@${n}:/tmp/
ssh root@${n} "mkdir /html/${project}_$tag && \
tar xf /tmp/$tarname -C /html/${project}_$tag && \
rm -fr /html/web && \
ln -s /html/${project}_$tag /html/web"
done
9. 使用gitlab自动触发构建项目(适用于测试环境)
10. 使用参数化构建完成版本回退
#!/bin/bash
project=$1
tag=$2
web_ip="10.0.0.101 10.0.0.102"
for n in $web_ip;
do
ssh root@${n} "rm -fr /html/web && \
ln -s /html/${project}_$tag /html/web"
done
11. 实现java项目自动化代码上线
Jenkins安装maven插件及javadoc插件
##jenkins安装maven
wget https://mirror.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
tar xf apache-maven-3.6.1-bin.tar.gz -C /usr/local/
ln -s /usr/local/apache-maven-3.6.1/ /usr/local/maven
##配置环境变量
vim /etc/profile
export M2_HOME=/usr/local/maven
export PATH=${M2_HOME}/bin:$PATH
. /etc/profile
##测试安装成功
mvn -v
##maven配置加速
vim /usr/local/maven/conf/settings.xml
...在mirros下面添加
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
<mirrorOf>central</mirrorOf>
</mirror>
...
#!/bin/bash
project=$1
tag=$2
tar_path=$(find `pwd` -name "*.war")
tarname=`basename $tar_path`
web_ip="10.0.0.100 10.0.0.101"
#打包
for n in $web_ip;
do
scp -rp $tar_path root@${n}:/tmp/
ssh root@${n} "rm -rf /html/${project}_$tag && \
mkdir /html/${project}_$tag && \
unzip -d /html/${project}_$tag /tmp/$tarname && \
rm -fr /app/apache-tomcat-8.0.27/webapps/ROOT && \
ln -s /html/${project}_$tag /app/apache-tomcat-8.0.27/webapps/ROOT && \
pkill java && \
source /etc/profile && /app/apache-tomcat-8.0.27/bin/startup.sh && \
sleep 10"
done
- 标签取值
- 版本回退
#!/bin/bash
project=$1
tag=$2
web_ip="10.0.0.100 10.0.0.101"
for n in $web_ip;
do
ssh root@${n} "rm -fr /app/apache-tomcat-8.0.27/webapps/ROOT && \
ln -s /html/${project}_$tag /app/apache-tomcat-8.0.27/webapps/ROOT && \
pkill java && \
source /etc/profile && /app/apache-tomcat-8.0.27/bin/startup.sh && \
sleep 10"
done
12. sonarqube实现代码质量检测
sonarqube服务端安装
#上传mysql和sonarqube镜像
#docker启动sonarqube
docker run --name mysql-sonar -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_DATABASE=sonar -e MYSQL_USER=sonar -e MYSQL_PASSWORD=sonar -v /data/mysql:/var/lib/mysql -p 33066:3306 -d mysql:5.7
docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 --link=mysql-sonar:mysql -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL="jdbc:mysql://mysql:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" sonarqube:7.0
#浏览器访问http://10.0.0.15:9000
默认用户密码:admin
#进行汉化
docker cp sonar-l10n-zh-plugin-1.20.jar sonarqube:/opt/sonarqube/extensions/plugins/sonar-l10n-zh-plugin-1.20.jar
docker restart sonarqube
sonarqube客户端安装
#上传sonarqube包解压
unzip sonar-scanner-cli-4.0.0.1744-linux.zip
#设置软连接
mv sonar-scanner-4.0.0.1744-linux /usr/local/
ln -s /usr/local/sonar-scanner-4.0.0.1744-linux /usr/local/sonar-scanner
ln -s /usr/local/sonar-scanner/bin/sonar-scanner /usr/bin
#测试是否成功
sonar-scanner
- 手动实现
sonar-scanner \
-Dsonar.projectKey=linux \
-Dsonar.sources=. \
-Dsonar.host.url=http://10.0.0.15:9000 \
-Dsonar.login=595ec7db02faba4738b9cf789cf9d261fae1416e
- 集中到Jenkins
sonar.projectKey= ##项目key,随意输入(必填)
sonar.projectName= ##项目名称和版本(必填)
sonar.sources=. ##源码位置(必填)
sonar.java.binaries=target/classes ##编译后的class位置(必填)
13. 配置钉钉通知
14. Jenkins分布式构建
15. Jenkins的用户权限
建议先备份配置文件
cp .jenkins/config.xml /opt
注:这时候千万别点注销.否则永远登不上了