1、安装配置gitlab服务,在gitlab新建一个仓库,配置本地密钥,并通过ssh方式拉取gitlab仓库代码
https://packages.gitlab.com/gitlab/gitlab-ce?page=1 gitlab包下载地址
wget https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.3.4-ce.0.el7.x86_64.rpm/download.rpm
修改配置文件,并启动服务
root@gitlab:~# grep "^[a-Z]" /etc/gitlab/gitlab.rb
external_url 'http://192.168.1.196.3'
#可选邮件通知设置
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "961161266@qq.com"
gitlab_rails['smtp_password'] = "授权码"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = :login
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = "961161266@qq.com"
user["git_user_email"] = "961161266@qq.com"
执行配置并启动服务:
gitlab-ctl reconfigure #修改完配置文件要执行此操作
# gitlab-rails #用于启动控制台进行特殊操作,比如修改管理员密码、打开数据库控制
台( gitlab-rails dbconsole)等
# gitlab-psql #数据库命令行
root@s1:~# gitlab-psql
psql (9.6.11)
Type "help" for help.
gitlabhq_production=# \db
List of tablespaces
Name | Owner | Location
------------+-------------+----------
pg_default | gitlab-psql |
pg_global | gitlab-psql |
(2 rows)
# gitlab-rake #数据备份恢复等数据操作
# gitlab-ctl #客户端命令行操作行
# gitlab-ctl stop #停止 gitlab
# gitlab-ctl start #启动 gitlab
# gitlab-ctl restar #重启 gitlab
# gitlab-ctl status #查看组件运行状态
# gitlab-ctl tail nginx #查看某个组件的日志
设置密码。
默认用户为root,口令没有第一次登陆时需要设置口令
使用管理员 root 创建组,一个组里面可以有多个项目分支,可以将开发添加到组里
面进行设置权限,不同的组就是公司不同的开发项目或者服务模块,不同的组添加不
同的开发即可实现对开发设置权限的管理。
git 客户端测试 clone 项目:
编辑文件并测试提交:root@jenkins:/source
# cd test-project/
# git config --global user.name #配置一个用户名
# git config --global user.email 2973707860@qq.com #配置一个邮箱
# vim index.html
cat index.html
11111111111
22222222222
# git add index.html #添加至本地
# git commit -m "v1"#将代码打上标签
git config --global user.name “name“ #设置全局用户名
git config --global user.email xxx@xx.com #设置全局邮箱
git config --global --list #列出用户全局设置
git add index.html / . #添加指定文件、目录或当前目录下所有数据到暂存区
git commit -m “11“ #提交文件到工作区
git status #查看工作区的状态
git push #提交代码到服务器
git pull #获取代码到本地
git log #查看操作日志
vim .gitignore #定义忽略文件
git reset --hard HEAD^^ #git 版本回滚, HEAD 为当前版本,加一个^为上一个,^^为上上一个版本
git reflog # #获取每次提交的 ID,可以使用--hard 根据提交的 ID 进行版本回退
git reset --hard 5ae4b06 #回退到指定 id 的版本
# git branch #查看当前所处的分支
#git checkout -b develop #创建并切换到一个新分支
2、安装配置jenkins,并实现jenkins和gitlab集成,实现jenkins自动化更新回滚
配置 java 环境并部署 jenkins:
https://jenkins.io/zh/download/下载地址
vim /etc/sysconfig/jenkins #修改配置文件,为了后面的权限设置问题,将用户改为root
JENKINS_USER="root"
systemctl start jenkins #启动服务
tail -f /var/log/jenkins/jenkins.log
查看日志,在第一次启动jenkins时,会生成一串秘钥。后面安装时需要提供
/var/lib/jenkins/secrets/initialAdminPassword #在此文件中也会生成字符串
4.1.11:jenkins 插件管理及安装:
4.1.11.1:插件安装目录:
插件下载地址:http://updates.jenkins-ci.org/download/plugins/
4.1.12:配置 jenkins 权限管理:
基于角色的权限管理,先创建角色和用户,给角色授权,然后把用户管理到角色。
4.1.12.3:更改认证方式:
Jenkins—系统管理—全局安全配置
默认创建的用户登录后可以做任何操作,取决于默认的认证授权方式。
在系统配置中可以添加邮箱认证
新建*风格项目
在凭据中添加私钥,用于链接gitlab仓库
在项目中可以添加gitlab仓库。使用ssh秘钥认证
启动tomcat 使用jenkins自动部署代码至tomcat
yum install java-1.8.0-openjdk-devel #安装devel版本,会自动解决其他依赖关系
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.45/bin/apache-tomcat-8.5.45.tar.gz #下载tomcat二进制安装包
tar xf apache-tomcat-8.5.45.tar.gz -C /usr/local/ #解压至usr/local目录中
ln -s apache-tomcat-8.5.45.tar.gz tomcat #创建软连接方便以后修改
useradd tomcat #添加用户,修改属组 ,tomcat默认以普通身份运行,需要修改文件权限
chown -R .tomcat .
chmod g+r conf/*
chmod g+rx conf/
chown -R tomcat logs/ temp/ work/
vim /etc/profile.d/cols.sh #修改tomcat命令行配置。
PS1='[\e[32;40m\u@\h \W\e[m]$ '
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/tomcat/bin
更好一下tomcat中的appbase目录
启动catalina.sh start
配置gitlab仓库地址,使用秘钥认证连过去
使用shell执行命令
进入jenkins中。系统自带目录(默认创建项目时会创建根项目同名的目录在/var/lib/jenkins/workspace中)
拉取代码至本地。远程停止tomcat服务。在将文件替换至目标目录,之后启动服务
输出信息
添加slave节点
4.3:pipline:
官方介绍;https://jenkins.io/2.0/
pipline 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核
心插件,简单来说 Pipline 就是一套运行于 Jenkins 上的工作流框架,将原本独立运行
于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而
实现单个任务很难实现的复杂流程编排和任务可视化,Pipeline 的实现方式是一套
Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本。
4.3.2:pipline 语法:
Stage:阶段,一个 pipline 可以划分为若干个 stage,每个 stage 都是一个操作,比如
clone 代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多个 node
执行。
Node:节点,每个 node 都是一个 jenkins 节点,可以是 jenkins master 也可以是
jenkins agent,node 是执行 step 的具体服务器。
Step:步骤,step 是 jenkins pipline 最基本的操作单元,从在服务器创建目录到构建容
4.3.2.2:测试简单 pipline job 运行:
node {
stage("clone 代码"){
echo "代码 clone"
}
stage("代码构建"){
echo "代码构建"
}
stage("代码测试"){
echo "代码测试"
}
stage("代码部署"){
echo "代码部署"
}
}
5.1:代码测试工具 SonarQube:
官方网站:http://www.sonarqube.org/
SonarQube 是一个用于代码质量管理的开放平台,通过插件机制,SonarQube可以
集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如
Hudson/Jenkins 等)不同,SonarQube 并不是简单地把不同的代码检查工具结果(例
如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再
加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种
类的工程进行代码质量管理。在对其他工具的支持方面,Sonar不仅提供了对 IDE的支
持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持
续集成工具提供了接口支持,可以很方便地在持续集成中使用 SonarQube,此外,
SonarQube 的插件还可以对 Java以外的其他编程语言提供支持,对国际化以及报告
文档化也有良好的支持。
5.2.1:编辑配置文件:
https://www.sonarqube.org/downloads/下载地址
sonar 依赖于 java 环境,而且 java 版本必须是 1.8 版本或更高,否则 sonar 启动失败
6.7.X 版本的 sonar 需要调用 elasticsearch,而且默认需要使用普通用户启动
$ unzip sonarqube-6.7.6.zip
$ln -sv /usr/local/src/sonarqube-6.7.6 /usr/local/sonarqube
$grep "^[za-Z]" /usr/local/sonarqube/conf/sonar.properties
[root@s1 local]# grep "^[za-Z]" /usr/local/sonarqube/conf/sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://192.168.7.106:3306/sonar?useUnicode=true&characterEncodi
ng=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.host=0.0.0.0
sonar.web.port=9000
5.2.2:启动 sonarqube:
# /usr/local/sonarqube/bin/linux-x86-64/sonar.sh start
默认登录名及密码为admin
5.1.2:Mysql 数据库创建及授权:
#yum install vim gcc gcc-c++ wget autoconf net-tools lrzsz iotop lsof iotop bash-completion
curl policycoreutils openssh-server openssh-clients postfix -y
#cd mysql-5.6.42-linux-glibc2.12-x86_64
#ln -sv /usr/local/src/mysql-5.6.42-linux-glibc2.12-x86_64 /usr/local/mysql
#useradd mysql -s /sbin/nologin
#chown mysql.mysql /usr/local/mysql/ -R
#/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --
basedir=/usr/local/mysql/
#cp /usr/local/src/mysql-5.6.42-linux-glibc2.12-x86_64/support-files/mysql.server
/etc/init.d/mysqld
#cp my.cnf /etc/my.cnf
#chmod a+x /etc/init.d/mysqld
#/etc/init.d/mysqld start
#ln -sv /usr/local/mysql/bin/* /usr/bin/
#mkdir /var/lib/mysql
#ln -sv /data/mysql/mysql.sock /var/lib/mysql/
5.3:部署扫描器 sonar-scanner:
5.3.1:部署 sonar-scanner:
sonarqube 通过调用扫描器 sonar-scanner 进行代码质量分析,即扫描器的具体工作就
是扫描代码:
#下载地址:http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
# unzip sonar-scanner-2.6.1.zip
# ln -sv /usr/local/src/sonar-scanner-2.6.1 /usr/local/sonar-scanner
# cd /usr/local/sonar-scanner/
# grep "^[a-Z]" conf/sonar-scanner.properties
sonar.host.url=http://localhost:8800
sonar.sourceEncoding=UTF-8
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://192.168.1.195:3306/sonar?useUnicode=true&character
Encoding=utf8
5.3.4:jenkins 关联到 SonarQube :
首先安装插件,在 jenkins 插件安装界面安装 Sonar 插件 SonarQubePlugin
其次配置 SonarQube server,系统管理-系统设置
5.3.5:让 jenkins 关联到 Sonarscanner
添加扫描器:
系统管理-Global Tool Configuration
5.3.6:配置扫描:
选择自己的项目(demo)-构建-execute sonarqube scanner,将配置文件的内容修改成如
下格式填写完成后点保存:
sonar.projectKey=test-demo1
sonar.projectName=test-demo1
sonar.projectVersion=1.0
sonar.sources=./
sonar.language=php
sonar.sourceEncoding=UTF-8
5.3.6:配置扫描:
选择自己的项目(demo)-构建-execute sonarqube scanner,将配置文件的内容修改成如
下格式填写完成后点保存:
sonar.projectKey=test-demo1
sonar.projectName=test-demo1
sonar.projectVersion=1.0
sonar.sources=./
sonar.language=php
sonar.sourceEncoding=UTF-8
使用脚本自动更新,需要传递参数,
#!/bin/bash
DATE=`date +%Y-%m-%d_%H-%M-%S`
GROUP_LIST=$2
function IP_list(){
if [[ ${GROUP_LIST} == "online-group1" ]];then
Server_IP="192.168.8.4"
echo ${Server_IP}
elif [[ ${GROUP_LIST} == "online-group2" ]];then
Server_IP="192.168.8.5"
ssh root@192.168.8.2 ""echo enable server web_port/192.168.8.4" | socat stdio /var/lib/haproxy/haproxy.sock"
ssh root@192.168.8.6 ""echo enable server web_port/192.168.8.5" | socat stdio /var/lib/haproxy/haproxy.sock"
echo ${Server_IP}
elif [[ ${GROUP_LIST} == "online-all" ]];then
Server_IP="192.168.8.4 192.168.8.5"
echo ${Server_IP}
fi
}
#function pull_code(){
# rm -rf /home/tomcat/.jenkins/workspace/testweb
# cd /home/tomcat/.jenkins/workspace
# git clone git@192.168.7.202:testgroup/testweb.git
#}
function make_zip(){
cd /var/lib/jenkins/workspace/test-demo1 && zip testweb.war.zip ./*
}
function down_node(){
for node in ${Server_IP};do
echo ${node}
ssh root@192.168.8.2 ""echo disable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
ssh root@192.168.8.6 ""echo disable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
echo "${node} 关闭成功!"
done
}
function stop_tomcat(){
for node in ${Server_IP};do
ssh tomcat@${node} "/etc/init.d/tomcat stop"
echo "${node} 关闭成功!"
done
}
function start_tomcat(){
for node in ${Server_IP};do
ssh tomcat@${node} "/etc/init.d/tomcat start"
echo "${node} 关闭成功!"
done
}
function scp_codefile(){
cd /var/lib/jenkins/workspace/test-demo1
for node in ${Server_IP};do
scp testweb.war.zip tomcat@${node}:/apps/tomcat_appdir
ssh tomcat@${node} "cd /apps/tomcat_appdir && unzip testweb.war.zip -d /apps/tomcat_webdir/testweb-${DATE} && rm -rf /data/tomcat_webdir/testweb && ln -sv /apps/tomcat_webdir/testweb-${DATE} /data/tomcat_webdir/testweb"
done
}
function web_test(){
#sleep 30
for node in ${Server_IP};do
NUM=`curl -s -I -m 10 -o /dev/null -w %{http_code} http://${node}:8080/testweb/index.html`
if [[ ${NUM} -eq 200 ]];then
echo "${node} 测试通过,即将添加到负载"
add_node ${node}
else
echo "${node} 测试失败,请检查该服务器是否成功启动tomcat"
fi
done
}
function add_node(){
node=$1
echo ${node},"----->"
if [ ${node} == "192.168.8.100" ];then
echo "192.168.8.100部署完毕,请进行代码测试!"
else
ssh root@192.168.8.2 ""echo enable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
ssh root@192.168.8.6 ""echo enable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
fi
}
function rollback_last_version(){
for node in ${Server_IP};do
NOW_VERSION=`ssh tomcat@${node} ""/bin/ls -l -rt /data/tomcat_webdir/ | awk -F"->" '{print $2}' | tail -n1 | awk -F"/apps/tomcat_webdir/" '{print $2}'""`
NAME=`ssh tomcat@${node} ""/bin/ls -l -rt -d /apps/tomcat_webdir/testweb* | grep -B 1 ${NOW_VERSION} | head -n1 | awk '{print $9}'""`
ssh tomcat@${node} "rm -rf /data/tomcat_webdir/testweb && ln -sv ${NAME} /data/tomcat_webdir/testweb"
done
}
main(){
case $1 in
deploy)
IP_list;
#pull_code;
make_zip;
down_node;
stop_tomcat;
scp_codefile;
start_tomcat;
web_test;
;;
rollback_last_version)
IP_list;
echo ${Server_IP}
down_node;
stop_tomcat;
rollback_last_version;
start_tomcat;
web_test;
;;
esac
}
main $1 $2
#需要自建两个参数