详解:docker+harbor+gitlab+jenkins+sonarqube部署到项目发布
主机 | 服务 |
---|---|
192.168.137.2 (建议内存>=6G) | harbor+jenkins+sonarqurde |
92.168+d.137.3 (建议内存>=4G) | gitlab |
为节省资源,我用两台主机演示实现docker+harbor+jenkins+gitlab+sonarqurde
一.docker、docker-compose安装
服务器联网并配置yum源(这里用阿里yum源)
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum makecache
下面来安装docker,可以使用阿里的yum直接安装docker-ce,我使用脚本安装docker,并可以控制安装的docker版本
#!/bin/bash
# 设置 yum repository
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装并启动 docker
# 不指定版本号则默认安装最新版本
yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
systemctl enable docker
systemctl start docker
# 安装 nfs-utils
yum install -y nfs-utils
yum install -y wget
# 关闭 防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
# 修改 /etc/sysctl.conf
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
# 执行命令以应用
sysctl -p
# 设置 docker 镜像,提高 docker 镜像下载速度和稳定性
# 如果您访问 https://hub.docker.io 速度非常稳定,亦可以跳过这个步骤
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
docker version
docker-compose下载,命令如下👇:
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
因Github国内访问不太稳定所以使用DaoCloud提供加速:链接,你可以通过URL中的版本号,自定义下载你所需要的版本文件。
对命令进行一个授权
sudo chmod +x /usr/local/bin/docker-compose
查看compose版本命令
docker-compose --version
二.harbor安装(私有仓库)
若兼顾公有仓库,需申请下载域名证书,生成ssl密钥或采用http的访问方式
#下载harbor
wget https://github.com/goharbor/harbor/releases/download/v2.1.3/harbor-offline-installer-v2.1.3.tgz
#将下载的安装包解压到指定目录
tar zxf harbor-offline-installer-v2.1.3.tgz -C /usr/local
#切换至解压后的目录中
cd /usr/local/harbor/
#编辑这个配置文件
mv harbor.yml.tmpl harbor.yml
vim harbor.yml
修改harbor.yml配置
生成CA证书
创建key文件
[root@localhost harbor]# cd /data/cert/
[root@localhost cert]# openssl genrsa -out ca.key 4096
192.168.137.2这里是我harbor仓库的IP,即harbor配置文件中hostname的值,也可以写域名
[root@localhost cert]# openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/CN=192.168.137.2" -key ca.key -out ca.crt
[root@localhost cert]# ll
-rw-r--r-- 1 root root 1797 Sep 11 14:20 ca.crt
-rw-r--r-- 1 root root 3243 Sep 11 14:18 ca.key
生成服务器证书
创建私钥
[root@localhost cert]# openssl genrsa -out server.key 4096
[root@localhost cert]# openssl req -new -sha512 -subj "/CN=192.168.137.2" -key server.key -out server.csr
[root@localhost cert]# ll
total 16
-rw-r--r-- 1 root root 1797 Sep 11 14:20 ca.crt
-rw-r--r-- 1 root root 3243 Sep 11 14:18 ca.key
-rw-r--r-- 1 root root 1590 Sep 11 14:24 server.csr
-rw-r--r-- 1 root root 3243 Sep 11 14:20 server.key
[root@localhost cert]# cd /usr/local/harbor
[root@localhost harbor]# ./install
haobor仓库安装成功
docker镜像下载完毕
docker服务启动完毕
验证harbor仓库
user:admin
passwd:Harbor@123
三.gitlab安装
// 安装版本也可选gitlab-ce:latest最新版,不影响,此版本为中文社区版
[root@localhost ~]# docker run --detach \
--publish 8443:443 --publish 8090:80 \
--name gitlab \
--restart unless-stopped \
-v /mnt/gitlab/etc:/etc/gitlab \
-v /mnt/gitlab/log:/var/log/gitlab \
-v /mnt/gitlab/data:/var/opt/gitlab \
beginor/gitlab-ce:11.0.1-ce.0
等一等,吃点东西,再来看看gitlab运行情况
看的出来,gitlab正常运行,那我们打开网页界面看看
新建个2项目,名字自己取
1.我的html项目名为myselfe001
,自己简单放个html的网页,看看效果。
2.还有一个项目名为easy-springmvc-maven
,为jenkins的maven和流水线实验(重要
)
建好了通过git将项目上传到搭建的gitlab上
项目在百度网盘资源:
链接:https://pan.baidu.com/s/1et30EgsRJkwT7oFYNPcIXA
提取码:0x4w
linux主机上传:
cd 项目目录/
git init
git add .
git remote -v
git commit -m "v1"
git remote add origin http://192.168.137.100:8090/root/easy-springmvc-maven.git
git push origin master
输入gitlab账号密码OK
windows上传:
直接从gitlab本地上拉
四.jenkins安装
docker run -d --name jenkins -p 8040:8080 -p 50000:50000 -v /data/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
然后等等,等服务启动过来,登陆网页
访问地址http://IP:8040
查看日志获取初始密码
docker logs -f jenkins
如图所示,密码的存放文件路径:
进入容器:docker exec -it 容器 /bin/bash
cat /var/jenkins_home/secerts/initialAdminPassword
之后的引导就不说了,我们直接好家伙!!! 安装jenkins的必要插件
1.安装maven插件
2.安装gitlab插件
3.安装ssh插件
进入全局工具配置
1.设置JDK全局变量
2.设置gitlab全局变量
3.设置maven变量
五.构建一个自由项目/maven项目
1.构建一个自由项目
看看你gitlab的代码,复制到项目的配置上
好了,我们开康康效果
访问 http://192.168.137.2:83/
好了,到这里,我们一个简单的自由项目就构建完成了。
2.构建一个maven项目
在这儿之前,看看你的maven插件和maven工具再jenkins容器安装好了么
可以看看我的
#服务器上执行命令,查看容器maven工具位置
docker exec `docker ps -a|grep jenkins|awk '{print $1}'` find /var/jenkins_home/tools -name maven
OK,我的全局工具配置也有,maven可以正常运行
创建一个maven项目,去配置
shell脚本:
# Jenkins机器:编译完成后,build生成一个新版本的镜像,push到远程docker仓库
# Variables
JENKINS_WAR_HOME='/data/jenkins_home/workspace/easy-springmvc-maven/target'
HARBOR_IP='192.168.137.2'
REPOSITORIES='test/easy-springmvc-maven'
HARBOR_USER='admin'
HARBOR_USER_PASSWD='Harbor@123'
# Delete image early version.
docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}
# Stop container, and delete the container.
CONTAINER_ID=`docker ps | grep "easy-springmvc-maven" | awk '{print $1}'`
if [ -n "$CONTAINER_ID" ]; then
docker stop $CONTAINER_ID
docker rm $CONTAINER_ID
else #如果容器启动时失败了,就需要docker ps -a才能找到那个容器
CONTAINER_ID=`docker ps -a | grep "easy-springmvc-maven" | awk '{print $1}'`
if [ -n "$CONTAINER_ID" ]; then # 如果是第一次在这台机器上拉取运行容器,那么docker ps -a也是找不到这个容器的
docker rm $CONTAINER_ID
fi
fi
# Deleteeasy-springmvc-maven image early version.
IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ];then
sudo docker rmi ${IMAGE_ID}
fi
# Build image.
cd ${JENKINS_WAR_HOME}
cat >>dockerfile<<EOF
FROM tomcat:latest
ADD ./easy-springmvc-maven.war /usr/local/tomcat/webapps/
EOF
TAG=`date +%Y%m%d-%H%M%S`
docker build -f dockerfile -t ${HARBOR_IP}/${REPOSITORIES}:${TAG} .
docker push ${HARBOR_IP}/${REPOSITORIES}:${TAG}
docker run -d -p 8083:8080 ${HARBOR_IP}/${REPOSITORIES}:${TAG}
构建完成,点击查看看效果
访问 http://192.168.137.2:8083/easy-springmvc-maven/
如果你只是想先看看最终效果,暂时不上传镜像到harbor仓库,shell里简简单单一条命令,保存构建:
docker run -d -p 8083:8080 -v /data/jenkins_home/workspace/easy-springmvc-maven/target:/usr/local/tomcat/webapps
六.pipeline流水线上sonarqube代码质检
***容器化部署sonarqube(7.9版本以上不支持mysql,可安装postgres)
docker run \
--name DB \
-e POSTGRES_USER=sonar \
-e POSTGRES_PASSWORD=sonar \
-p 5432:5432 \
-v /data/postgresql/data:/var/lib/postgresql/data \
-d postgres
```#####################################################################```
mkdir -p /data/sonarqube/{conf,data,extensions,logs}
chmod 777 -R /data/sonarqube/
docker run \
--name sonarqube \
--link DB \
-e SONARQUBE_JDBC_USERNAME=sonar \
-e SONARQUBE_JDBC_PASSWORD=sonar \
-e SONARQUBE_JDBC_URL=jdbc:postgresql://pgdb:5432/sonar \
-p 19000:9000 \
-v /data/sonarqube/conf:/opt/sonarqube/conf \
-v /data/sonarqube/data:/opt/sonarqube/data \
-v /data/sonarqube/extensions:/opt/sonarqube/extensions \
-v /data/sonarqube/logs:/opt/sonarqube/logs \
-d sonarqube:8.3.1-community
先进入postgres数据库验证是否连接sonarqube
OK,数据连接正常!!!
登录sonarqube看看。
我的token: 26f4e2b98435d73252e811f8968072c0f9ea0c80 (你们也用不上)
sonarqube装俩自检的插件吧:(如CSS,html,go等插件,看着点容器资源,别装太多重启不成功)
转战到jenkins上
安装sonar插件和工具
不好意思,sonarqube插件装过了,不影响
OK,直接上项目
上配置
直接一个脚本,好家伙!(参考一下就得了,我有先做ssh免密)
pipeline{
agent any
environment {
registry = "192.168.137.2"
project = 'pipeline-test'
appname = 'test'
GitCode = 'http://192.168.137.100:8090/root/easy-springmvc-maven.git'
}
options {
timestamps() //设置在项目打印日志时带上对应时间
disableConcurrentBuilds() //不允许同时执行流水线,被用来防止同时访问共享资源等
timeout(time: 10, unit: 'MINUTES') //流水线运行超过n分钟,Jenkins将中止流水线
buildDiscarder(logRotator(numToKeepStr: '10')) // 表示保留n次构建历史
}
//gitlab webhook触发器
//triggers{
// gitlab( triggerOnPush: true, //代码有push动作就会触发job
// triggerOnMergeRequest: true, //代码有merge动作就会触发job
// branchFilterType: "NameBasedFilter", //只有符合条件的分支才会触发构建 “ALL/NameBasedFilter/RegexBasedFilter”
// includeBranchesSpec: "${JOB_BASE_NAME}") //基于branchFilterType值,输入期望包括的分支的规则
//}
stages{
stage('代码拉取'){
steps{
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '2', url: 'http://192.168.137.100:8090/root/easy-springmvc-maven.git']]])
}
}
stage('java代码质检'){
steps{
sh '/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven/bin/mvn sonar:sonar \
-Dsonar.projectKey=java \
-Dsonar.sources=. \
-Dsonar.host.url=http://192.168.137.2:19000 \
-Dsonar.projectName=${JOB_NAME}'
}
}
stage('代码编译'){
steps{
// Run Maven on a Unix agent.
sh "/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven/bin/mvn -Dmaven.test.failure.ignore=true clean package"
}
}
stage('制作镜像') {
steps {
sh '''
scp /var/jenkins_home/workspace/pipeline-test/target/easy-springmvc-maven.war root@192.168.137.2:/
ssh root@192.168.137.2 "{
mkdir /home/webfile
cp /easy-springmvc-maven.war /home/webfile
docker login -u admin -p Harbor@123 192.168.137.2
cd /home/webfile/
rm -rf dockerfile
cat >>dockerfile<<EOF
FROM tomcat:latest
ADD ./easy-springmvc-maven.war /usr/local/tomcat/webapps/
EOF
docker build -f dockerfile -t 192.168.137.2/test/springbook:`date +%F` .
docker push 192.168.137.2/test/springbook:`date +%F`
docker rmi 192.168.137.2/test/springbook:`date +%F`
//应用部署
docker run -d -p 8081:8080 192.168.137.2/test/springbook:`date +%F`
}"
'''
echo "It's release OK!"
}
}
}
}
很成功,就不截图了,太长了。算了,截一段sonarqube代码质检的吧
访问sonarqube
再看看项目 http://192.168.137.2:8081/easy-springmvc-maven/
好了,剩下的我也在悟,希望大家共同进步!
谢谢!!!