docker+harbor+gitlab+jenkins+sonarqube部署到项目发布

详解:docker+harbor+gitlab+jenkins+sonarqube部署到项目发布

  • 一.docker、docker-compose安装
  • 二.harbor安装(私有仓库)
  • 三.gitlab安装
  • 四.jenkins安装
  • 五.构建一个自由项目/maven项目
  • 1.构建一个自由项目
  • 2.构建一个maven项目
  • 六.pipeline流水线上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配置
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第1张图片

生成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+harbor+gitlab+jenkins+sonarqube部署到项目发布_第2张图片
docker镜像下载完毕
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第3张图片
docker服务启动完毕
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第4张图片
验证harbor仓库
user:admin
passwd:Harbor@123
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第5张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第6张图片

三.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正常运行,那我们打开网页界面看看
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第7张图片
新建个2项目,名字自己取
1.我的html项目名为myselfe001,自己简单放个html的网页,看看效果。
2.还有一个项目名为easy-springmvc-maven,为jenkins的maven和流水线实验(重要
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第8张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第9张图片

建好了通过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+harbor+gitlab+jenkins+sonarqube部署到项目发布_第10张图片
查看日志获取初始密码
docker logs -f jenkins
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第11张图片
如图所示,密码的存放文件路径:
进入容器:docker exec -it 容器 /bin/bash

cat /var/jenkins_home/secerts/initialAdminPassword

之后的引导就不说了,我们直接好家伙!!! 安装jenkins的必要插件

docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第12张图片
1.安装maven插件
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第13张图片
2.安装gitlab插件
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第14张图片
3.安装ssh插件
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第15张图片
进入全局工具配置
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第16张图片
1.设置JDK全局变量
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第17张图片
2.设置gitlab全局变量

docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第18张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第19张图片
3.设置maven变量
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第20张图片

五.构建一个自由项目/maven项目

1.构建一个自由项目

docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第21张图片
看看你gitlab的代码,复制到项目的配置上
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第22张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第23张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第24张图片

docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第25张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第26张图片

好了,我们开康康效果
访问 http://192.168.137.2:83/
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第27张图片
好了,到这里,我们一个简单的自由项目就构建完成了。

2.构建一个maven项目

在这儿之前,看看你的maven插件和maven工具再jenkins容器安装好了么
可以看看我的

#服务器上执行命令,查看容器maven工具位置
docker exec `docker ps -a|grep jenkins|awk '{print $1}'` find /var/jenkins_home/tools -name maven

在这里插入图片描述
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第28张图片

OK,我的全局工具配置也有,maven可以正常运行
创建一个maven项目,去配置
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第29张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第30张图片
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/
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第31张图片
如果你只是想先看看最终效果,暂时不上传镜像到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

docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第32张图片
先进入postgres数据库验证是否连接sonarqube
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第33张图片
OK,数据连接正常!!!
登录sonarqube看看。
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第34张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第35张图片
我的token: 26f4e2b98435d73252e811f8968072c0f9ea0c80 (你们也用不上)
sonarqube装俩自检的插件吧:(如CSS,html,go等插件,看着点容器资源,别装太多重启不成功)
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第36张图片
转战到jenkins上
安装sonar插件和工具
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第37张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第38张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第39张图片
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第40张图片

不好意思,sonarqube插件装过了,不影响
OK,直接上项目
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第41张图片
上配置
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第42张图片
直接一个脚本,好家伙!(参考一下就得了,我有先做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代码质检的吧
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第43张图片
访问sonarqube
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第44张图片
再看看项目 http://192.168.137.2:8081/easy-springmvc-maven/
docker+harbor+gitlab+jenkins+sonarqube部署到项目发布_第45张图片
好了,剩下的我也在悟,希望大家共同进步!
谢谢!!!

你可能感兴趣的:(docker运用)