gitlab+jenkins+docker+harbor实现自动化部署(第一版)

gitlab+jenkins+docker+harbor 自动化部署

一.概述

1.参考链接

CI/CD:

https://www.infoq.cn/article/wht0wfmdrrbu-dtkh1xp

docker:

https://blog.csdn.net/zhang__rong/article/details/88647197

harbor:

https://blog.csdn.net/qq_24095941/article/details/86063684

ssh:

https://www.cnblogs.com/architectforest/p/13707244.html

2.CI/CD流程

========== CI(Continuous Integration) ===========

1.拉取最新代码

2.用maven打包

3.前端打包,node.js

4.构建镜像(dockerfile)

5.上传仓库(Harbor)

============= CD(Continuous Delivery) ===========

6.拉取镜像(从Harbor)

7.启动容器

8.启动程序 (deploy脚本)
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第1张图片

二.环境安装过程

(一)Jenkins服务器

​ 服务器地址:192.168.34.99

1.Dcoker安装

tips:

报错1:There are no enabled repos. Run “yum repolist all” to see the repos you have.报错解决办法:

http://mirrors.163.com/.help/centos.html 下载对应版本repo文件, 放入/etc/yum.repos.d/里

报错2:

通过 uname -r 命令查看你当前的内核版本(在 CentOS 7安装docker要求系统为64位、系统内核版本为 3.10 以上)

uname -r

使用 root 权限登录 Centos。确保 yum 包更新到最新

yum update

卸载旧版本(如果安装过旧版本的话)

yum remove docker  docker-common docker-selinux docker-engine

安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

可以查看所有仓库中所有docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

安装docker

yum install docker-ce

启动并加入开机启动

systemctl start docker
systemctl enable docker

验证安装是否成功(有client和service两部分表示docker安装启动都成功了)

docker version

查看docker服务状态

systemctl status docker

安装Docker Compose

以前使用 Docker 的时候,需要定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。使用 Docker Compose 可以轻松、高效地管理容器,他是一个用于定义和运行多容器Docker的应用程序工具。

curl -L https://get.daocloud.io/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 

给执行文件添加执行权限

chmod +x /usr/local/bin/docker-compose

检查是否安装成功

docker-compose --version

如果是返回:docker-compose version 1.23.2, build 1110ad01

则代表docker compose 安装成功

配置docker国内镜像

vi /etc/docker/daemon.json

添加以下代码

{
"registry-mirrors": ["[https://registry.docker-cn.com](https://registry.docker-cn.com)"]
}

修改保存后重启 Docker 以使配置生效。

systemctl restart docker

至此docker环境搭建完毕!

注:或者执行docker安装脚本后

给脚本 install-docker.sh 增加可执行权限

$ chmod +x install-docker.sh

执行 install-docker.sh 脚本文件

$ ./install-docker.sh

即可自动完成 docker 及、docker-compose 的安装及Mirrors的配置!

2.jdk安装

1.下载

2.解压

3.配置环境

vim /etc/profile
export JAVA_HOME=/home/jdk1.8.0_251
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile

安装路径:/home/jdk1.8.0_251;

版本: 1.8.0_251

jdk1.8.0_181

3.Maven安装

1.下载

2.解压

3.配置环境

vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH 

source /etc/profile

安装路径:/usr/local/apache-maven-3.6.3;

版本:Apache Maven 3.6.3

3.git安装

yum install git

命令地址:/usr/bin/git;

版本:1.8.3.1

4.node.js安装

检查是否安装node

node --version

若未安装

cd /home
wget https://nodejs.org/dist/v14.0.0/node-v14.0.0-linux-x64.tar.gz

解压

tar xvzf node-v14.0.0-linux-x64.tar.gz

修改环境变量

vim /etc/profile
export PATH=/home/node-v14.0.0-linux-x64/bin:$PATH
source /etc/profile

5.Jenkins搭建

查看环境变量

java -version #没有的话dk1.8安装
mvn -v  #没有的话maven安装
git --version # 没有的话git安装
node -v # 没有的话node安装

添加Jenkins源

wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

安装

yum install jenkins

启动

service jenkins start

访问

http://ip:8080/        #jenkenis默认是8080

第一次密码在

vim /var/lib/jenkins/secrets/initialAdminPassword

点击安装推荐的插件

另必备:maven itegration plugin,git,gitlab plugin,nodejs,docker plugin,docker-bulid-step;

配置全局(Global Tool Configuration)jdk maven git node.js

1.maven配置:配置settings.xml地址

并且:替换掉原来的setting.xml,将本地仓库地址改为如下地址,

/var/lib/jenkins为jenkins中的主目录地址

<localRepository>/var/lib/jenkins/.m2/repository</localRepository>

2.配置jdk环境地址 (可以用echo $JAVA_HOME获取)
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第2张图片

3.git配置环境地址 可以用(which -a git查看)
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第3张图片

4.maven配置环境地址

gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第4张图片

需在maven安装文件所在目录输入,给jenkins添加权限

sudo chown -R jenkins:jenkins maven目录

5.node.js配置环境地址

安装nodojs插件

配置node环境

gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第5张图片

6.配置:全局属性

Environment variables
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第6张图片

//键
JAVA_HOME
//值
/home/jdk1.8.0_251
//键
M2_HOME
//值
/usr/local/apache-maven-3.6.3
//键
PATH+EXTRA
//值
$M2_HOME/bin

6.docker环境配置
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第7张图片
修改docker.service

vi /usr/lib/systemd/system/docker.service


将其中第11行的 ExecStart=/usr/bin/dockerd 替换为:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654
(此处默认2375为主管理端口,unix:///var/run/docker.sock用于本地管理,7654是备用的端口)
将管理地址写入 /etc/profile
echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile
使profile生效
source /etc/profile

*docker login 报【Error response from daemon: Get https://172.17.8.201:8002/v2/: http: server gave HTTP response to HTTPS client】

原因:docker镜像仓库暂不支持https

在”/etc/docker/“目录下,创建”daemon.json“文件(如果有的话直接覆盖)。在文件中写入

{ "insecure-registries":["172.17.8.201:8003"] }

然后重启docker服务

*修改/var/run/docker.sock的文件权限,普通用户是没有权限操作该文件的,执行之后,jenkins才有权限打包镜像

sudo chmod 666 /var/run/docker.sock

7.docker拉取mysql和openjdk镜像

docker search jdk
docker search mysql

选择需要的版本或最新的,如:

docker pull mysql:latest
docker pull openjdk:8-jdk-alpine
docker images //查看是否存在mysql或jdk镜像

如下载镜像太慢,替换为阿里云镜像加速器:

 vi /etc/docker/daemon.json
     
{
 "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}

{ “insecure-registries”:[“192.168.99.99:80”] }

8.ssh环境配置

(用以jenkins控制远程主机拉取镜像和自动发布应用)

1.安装Publish over SSH插件

2.jenkins主机生成ssh公钥复制到远程主机,实现免密登录

#切换到.ssh目录,没有就手动创建
 cd /root/.ssh/
#生成密钥,默认一直回车即可(可设置Passphrase,用于访问ssh key时输入)
 ssh-keygen -t rsa
#复制本地公钥到远程主机,输入yes,远程主机登录密码
ssh-copy-id  192.168.99.999   
#测试能否连接远程主机
ssh 192.168.99.999

连接成功后记得返回本机进行以下步骤:

3.在系统设置中配置
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第8张图片

两种方式:

1.Path to key 中填写 /root/.ssh/id_rsa 路径

2.将id_rsa中的密钥复制到key中

配置远程主机地址(测试显示success即ok):
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第9张图片

测试时可能会报错:

jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@60373f7]

原因是jenkins无法识别该类型的密钥,我们生成密钥的openssh的版本过高的原因

查看所生成私钥的格式:

more /root/.ssh/id_rsa

可以看到密钥的首行是:

-----BEGIN OPENSSH PRIVATE KEY——

解决方案:

ssh-keygen -m PEM -t rsa -b 4096
# -m 参数指定密钥的格式,PEM是rsa之前使用的旧格式
# -b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。

查看所生成私钥的格式:

more /root/.ssh/id_rsa

可以看到密钥的首行是:

-----BEGIN RSA PRIVATE KEY-----

重新测试,显示success即可。

9.编写DockerFile

FROM Openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 7109
ENTRYPOINT ["java","-jar","-Dspring.cloud.nacos.discovery.server-addr=192.168.99.999:8848","-Dspring.cloud.nacos.discovery.namespace=cd","-Dspring.cloud.nacos.config.server-addr=192.168.99.999:8848","-Dspring.cloud.nacos.config.namespace=cd","-Dspring.profiles.active=test","-Dspring.cloud.nacos.config.group=DEFAULT_GROUP","/app.jar"]

每个微服务放一个dockerfile;并且在pom.xml中添加插件

 <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <configuration>
                <repository>${project.artifactId}</repository>
                <buildArgs>
                    <JAR_FILE>/target/dvsc-cdsv-map-server-1.0.jar</JAR_FILE>
                </buildArgs>
            </configuration>
        </plugin>

10.编写Jenkinsfile-(后端流水线)

利用流水线语法生成流水线脚本,整理并编写在jenkinfile文件中,jenkinsfile放在项目代码中,编写完成后推送到gitlab,由Jenkins从gitlab中拉取Jenkinsfile并执行该脚本;( 每个微服务里理论上放一个固定的jenkinsfile,以下为测试dvsc-cdsv-map所涉及到的脚本代码)

def map_project_url="http://192.168.99.99:82/cdsv/map.git"
def gitlab_auth="998b09a8-9c67-4fb3-bb37"
//构建版本名称
def tag ="latest"
//harbor私服地址
def harbor_url="192.168.99.99:80"
//harbor的项目名称
def harbor_project_name="map"
project_name="map-server"
def habor_auth="1199675c-5981-4f47-b2e7"
def port="10001"
//定义镜像名称
def imageName="map-server:latest"
def username="admin"
def password="admin"

node {
    def mvnHome
    
    stage('拉取代码') { 
     checkout([$class: 'GitSCM', branches: [[name: '*/master']],
           doGenerateSubmoduleConfigurations: false, extensions: [],
           submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${gitlab_auth}",
           url: "${map_project_url}"]]])
      
    }
    
    
    stage('构建代码') { 
      
     //编译,构建本地镜像
      sh "mvn clean package"
      sh "mvn -f dvsc-cdsv-map-server dockerfile:build"
      
      
    //给镜像打标签
    sh "docker" tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}
      
    }
    
    
    stage('镜像上传') { 
    
withCredentials([usernamePassword(credentialsId: '1199675c-5981-4f47-b2e7',   passwordVariable: 'password', usernameVariable: 'username')]) {
    // 登陆
    sh "docker login -u ${username} -p ${password} ${harbor_url}"
    //上传镜像
    sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
    
    
}
        
    }
    

stage('删除本地镜像') {
      sh "docker rmi -f ${imageName}"
      sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
}



   
    //远程发布本质是镜像拉取
    //流水线语法;ssh--生成脚本;修改后放在下面 
   
     stage('远程发布') {
        
      sshPublisher(publishers: [sshPublisherDesc(
      configName: 'docker_client',
      transfers: 
      [sshTransfer(cleanRemote: false, excludes: '',
        execCommand: "/opt/jenkins_shell/map_image.sh $harbor_url $harbor_project_name $project_name $tag $port",
        exectTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false,
        patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: ''
          )], 
      usePromotionTimestamp: false,
      useWorkspaceInPromotion: false,
      verbose: false)])
        
    }
       ${harbor_url} ${harbor_project_name} ${project_name} ${tag} ${port}
    
}

11.前端项目自动化部署构建

1.构建项目

gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第10张图片

2.源码管理
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第11张图片

3.设置构建环境

gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第12张图片

4.配置项目自动化打包,选择 增加构建步骤 —Excute shell 这个是运行相关的sh命令
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第13张图片

5.把打包好的项目文件发布到远程服务器

选择“构建后操作步骤”—“Send build artifacts over SSH” 。

Name:创建的远程服务器名称(需要推送远程的服务器名称)

Source files:本地需要传输过去的文件(默认执行路径为Jenkins的工作路径,直接跟要传输的文件名称和相对路径)

Remove prefix:过滤掉的目录名(指过滤掉的source files路径)

Remote directory:远程服务器的保存路径(配置的根目录的路径下生成的路径)

Exec command:传输完成后在远程服务器执行的sh命令(默认执行路径为root家目录)

gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第14张图片

如有不全可参考:

gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第15张图片

保存后点击“立即构建”查看任务是否构建完成,Console Output 菜单可以查看构建日志。

具体可看:

https://www.cnblogs.com/djlsunshine/p/11059690.html

(二)Harbor私服仓库部署

服务器地址:192.168.34.32

1.安装并启动docker

见上文

2.安装并启动coker-compose

见上文

3.安装并启动harbor

mkdir -p /harbor
cd /harbor

在以下网址下载离线包,传到服务器 /harbor/

https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-offline-installer-v2.0.1.tgz

解压

tar -zxf harbor-online-installer-v2.0.1.tgz 

进入解压后的harbor

cd /harbor/harbor
ls   //查看

yml文件改名

cp harbor.yml.tmpl  harbor.yml

用于存放harbor的持久化数据

mkdir -p /opt/application/harbor

修改harbor安装的配置文件

vi harbor.yml
harbor.yml配置文件主要修改参数如下:
hostname: 192.168.34.32          //需要写IP地址或者域名

#http配置
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80   //端口冲突可修改                     

#https配置(如不需要可不配置,但需加上注释)

# https related config
#https:
#https port for harbor, default is 443
#port: 443
# The path of cert and key files for nginx
#certificate: /your/certificate/path
#private_key: /your/private/key/path

harbor_admin_password: admin         //admin密码

#数据库配置
database:
# The password for the root user of Harbor DB. Change this before any production use.
password: root123
# The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
max_idle_conns: 50
# The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
# Note: the default number of connections is 100 for postgres.
max_open_conns: 100

#持久化数据目录

data_volume: /opt/application/harbor

Harbor依赖的镜像及启动服务如下:

docker-compose ps 

查看正在运行的docker容器:

docker ps

访问harbor WEB界面(账号、密码:admin)

192.168.99.99:80 

4.Harbor的使用

1.登陆harbor

 docker login 192.168.99.99
 admin
 admin

输完账户、密码后,此时会报错,解决办法:

查找docker.service所在的位置

find / -name docker.service -type f

修改docker-service

在ExecStart之后添加--insecure-registry=http://192.168.34.32
//重启并重新加载配置文件
systemctl restart docker
systemctl daemon-reload
//重启
systemctl restart docker

再次登陆即可

2.在Harbor界面上创建新项目供上传使用

点击新建项目即可

3.给构建好的镜像打标签并上传到harbor

4.下载镜像

(注:第3,4步在Jenkinsfile中执行)

5.Harbor如何停止与启动

# cd harbor/harbor       //切换到harbor安装包目录
# docker-compose stop   //停止Harbor
# docker-compose start  //启动Harbor

修改配置文件后

docker-compose stop
./install.sh
docker-compose start 

6.Harbor添加用户

(三)应用服务器部署

服务器地址:192.168.34.999

1.安装docker

见上文

2.编写deploy.sh脚本

map_image.shhttp://192.168.99.99:82/cdsv

#! /bin/sh
#接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "$imageName"
#查询容器是否存在,存在则删除
containerId=docker ps -a | grep -w ${project_name}:{tag} | awk '{print $1}'
if [ "$containerId" != "" ] ; then
    #停掉容器
    docker stop $containerId
    #删除容器
    docker rm $containerId
      echo "成功删除容器"
fi 

#查询镜像是否存在,存在则删除
imageId= docker images | grep -w $project_name | awk '{print $3}'
if [ "$imageId" != "" ] ; then
    #删除镜像
    docker rmi -f $imageId
     echo "成功删除镜像"
fi

#登录Harbor
docker login -u admin -p admin $harbor_url

#下载镜像
docker pull $imageName

#启动容器
docker run -di -p $port:$port --net=host $imageName

echo "容器启动成功"

3.报【Error response from daemon: Get https://172.17.8.201:8002/v2/: http: server gave HTTP response to HTTPS client】

原因:docker镜像仓库暂不支持https

在”/etc/docker/“目录下,创建”daemon.json“文件(如果有的话直接覆盖)。在文件中写入

{ "insecure-registries":["172.17.8.201:8003"] }

然后重启docker服务

(四)k8s集群部署(暂未开发)

k8s全称kubernetes,这个名字大家应该都不陌生,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。

Docker是应用最为广泛的容器技术,通过打包镜像,启动容器来创建一个服务。但是随着应用越来越复杂,容器的数量也越来越多,由此衍生了管理运维容器的重大问题,而且随着云计算的发展,云端最大的挑战,容器在漂移。在此业务驱动下,k8s问世,提出了一套全新的基于容器技术的分布式架构领先方案,在整个容器技术领域的发展是一个重大突破与创新。

那么,K8S实现了什么?

具体来说,主要包括以下几点:

  1. 服务发现与调度
  2. 负载均衡
  3. 服务自愈
  4. 服务弹性扩容
  5. 横向扩容
  6. 存储卷挂载

k8s的架构:
gitlab+jenkins+docker+harbor实现自动化部署(第一版)_第16张图片

k8s集群由Master节点和Node(Worker)节点组成。

Master节点

Master节点指的是集群控制节点,管理和控制整个集群,基本上k8s的所有控制命令都发给它,它负责具体的执行过程。在Master上主要运行着:

  1. Kubernetes Controller Manager(kube-controller-manager):k8s中所有资源对象的自动化控制中心,维护管理集群的状态,比如故障检测,自动扩展,滚动更新等。
  2. Kubernetes Scheduler(kube-scheduler): 负责资源调度,按照预定的调度策略将Pod调度到相应的机器上。
  3. etcd:保存整个集群的状态。

Node节点

除了master以外的节点被称为Node或者Worker节点,可以在master中使用命令 kubectl get nodes查看集群中的node节点。每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,该节点上的工作负载就会被Master自动转移到其它节点上。在Node上主要运行着:

  1. kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master密切协作,实现集群管理的基本功能
  2. kube-proxy:实现service的通信与负载均衡
    k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。
  3. docker(Docker Engine):Docker引擎,负责本机的容器创建和管理

你可能感兴趣的:(工具,jenkins,gitlab,docker)