Docker集成Jenkins实现CICD

12

说一下使用Jenkins实现CICD主要来做什么的:

  • 1.先本地代码push代码至git仓库
  • 2.Jenkins自动拉取git仓库中的代码,打成war包后扔到测试服务器,自动创建docker容器并运行容器
  • 3.可按git仓库标签快速构建自动部署

开始想着一台本地虚拟机和一台云服务器搭建Jenkins,进行CI部分的测试。弄了半天ping对方的地址ping不通,一通百度之后,有让设置的,有说不行的。云服务器无法ping通本地的问题_wyffeige的博客-CSDN博客。最后看了看服务器厂商有咩有白嫖的果然有,所以最后使用了一台阿里云和一台腾讯云的服务器搭建了Jenkins。当然两台本地虚拟机同样可以搭建。

首先两台云服务器都安装了宝塔面板,可有可无,主要是方便查看修改文件,本地虚拟机使用SmarTTY或者MobaXterm连接同样可以方便的查看修改文件等。下面我就一云服务器的内容为主,本地虚拟机安装的同学,要是某一步骤不明确可以本页面留言。

给这两台云服务器取个名:

  • 阿里云的那一台主要作为测试服务器,接收git上面修改的代码。就叫A
  • 腾讯云的那一台作为Jenkins搭建运行的服务器,负责调度git与发送测试服务器。就叫B
  • 两个服务器都是CentOS7、后台管理面板都是宝塔。

如何购买服务器,修改服务器密码,安装宝塔,开放安全组等一些小步骤我暂时都掠过,被这些步骤卡住的可以留言。

第一次登录宝塔的时候,会让你登录账号,然后二选一一个服务器环境,直接叉掉就可以,占用内存太多。

宝塔安装docker

软件商店 - 搜索docker管理器 - 安装。

安装完成,服务器就有docker了。B上必须安装、A上不需要安装。

之后我们需要使用容器编排工具docker-compose,如何安装?只要将docker-compose文件上传至环境目录下就可以使用命令了。

文件扔到了百度网盘如下,自行下载,密码 6666

[download]https://pan.baidu.com/s/18iO-cfE4G4_k5dvlsBXZ3w[/download]

将docker-compose文件扔到服务器上的cd ~所在目录下,管理员的话就是在根目录下的root文件夹。

默认docker-compose文件没有执行权限,需要修改文件权限。chmod 777 docker-compose

服务器远程连接,命令行下输入:echo $PATH

[wppay]

(宝塔终端输入,终端第一次连接要用服务器密码,服务器密码第一次使用要在服务器厂商管理端进行重置)

可以看到上面显示了很多路径地址,以冒号分隔。随便将docker-compose文件扔到任意一个里面就可以。

这里我扔到了/usr/loacl/bin文件夹里面。mv docker-compose /usr/local/bin

返回用户目录 cd ~ ,输入命令 docker-compose 当有提示你命令选择的时候成功。

使用宝塔的终端拉取Jenkins,注意拉取得版本,我们要拉取这个东西。docker pull jenkins/jenkins  默认拉取最新版本就可以

在B上搭建Jenkins

首先为Jenkins挑选一个好地方建个文件夹,因为我们要使用数据卷的映射,将容器的内容映射到宿主机,是双向映射,一方改变另一方发生相同改变。地方任意,看你心情。在文件夹里面放上docker-compose.yml文件。

准备docker-compose.yml文件

version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins:latest
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/

可以看到这里我们使用了8080和50000端口,记得在服务器安全组和宝塔安全里面进行放行。

50000这个端口最好不要改变,8080宿主机端口映射可以改变,如改成8083,则替换成 - 8083:8080

直接启动Jenkins容器 docker-compose up -d

第一次启动失败,查看日志:

可以看到是因为写入日志没有权限。

还记得我们上面让你任意创建得文件夹吗?就是那个文件夹得权限不足导致得错误。给那个文件夹设置权限,进入那个文件夹所在目录下 chmod -R 777 文件夹名称

重启Jenkins容器 docker restart jenkins

由于进入和Jenkins后需要下载插件,所以我们先修改下源。那个源在hudson.model.UpdateCenter.xml中进行设置。这个文件就在你创建的文件夹中。

<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
 <id>default</id>
 <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>

主要是改以下链接地址为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

重启Jenkins容器 docker restart jenkins

欧德k,现在打开浏览器我们将要进入Jenkins了。网址的形式为:公网IP:8080。

初始化Jenkins

这里让输入密码,密码存在与Jenkins运行日志里面,我们回到命令行,进入到jenkins的docker-compose.yml所在目录,运行docker-compose up -d,如下图获取密码。

接下来是安装插件,选择手动安装插件:

  • publish over SSH:为了让Jenkins可以将打好包的内容发布到其他服务器。
  • Git Parameter:为了实现CD,可以根据tag拉取Git仓库版本。
  • Persistent Parameter:无法在当前页面选择,必须在进入到Jenkins的首页后才可以选择。

之后进入安装,安装可能失败,多次尝试或者选择继续进入内部也可安装软件,建议把失败的插件全部安装成功后再进行操作。

之后创建管理员用户:

进入到首页,插件失败的继续安装插件:系统管理 - 插件管理。还是英文的是汉化插件下载不完全。

新建任务

配置publish over SSH

为了保证Jenkins所在服务器可以将内容发布到测试/生产服务器上,需要设置publish over SSH

系统管理 ----- 系统配置 ----- 拉动滚动条到最下面 ----- Publish over SSH

配置Git的SSH无密码连接

为了保证Jenkins可以从Git服务中拉取下来私有仓库内容,要么输入用户名和密码,要么实现无密码的SSH链接。

需要在Gitee仓库中找到设置公钥的位置,在具体服务器生成公钥和私钥,并且将公钥复制到Gitee仓库。

进入docker的Jenkins容器中docker exec -it jenkins bash,通过ssh-keygen -t rsa -C "xxxxx@xxxxx.com" 生成公钥和私钥到.ssh隐藏目录中(cd ~  , ls -a 就可以看到.ssh目录了 ),需要复制id_rsa.pub内容到Gitee的公钥中(可以直接查看cat id_rsa.pub,然后复制)。

还是进入docker的Jenkins容器内部docker exec -it jenkins bash,这次进入到用户目录 cd ~,通过Git目录拉取一次远程仓库代码,因为第一次拉取会询问你是否确认,需要输入yes。之后再去拉去就不要点yes了。

配置Jenkins的JDK&Maven

因为Jenkins会从Git仓库中拉取到项目的源代码,部署需要的是war包,需要在Jenkins内部将源码进行打包,需要Maven的package命令。必须在Jenkins内部安装好JDK和Maven。

在宿主机的数据卷目录下(就是你挑选的映射目录),安装JDK和Maven,并且给Maven配置阿里云私服以及JDK1.8编译插件。

很简单,下载JDK1.8与maven的linux版本上传到数据卷,使用宝塔图形化界面就可以。默认是上传的压缩包解压出来,名字会很长改的短一些,如jdk、maven。安装包安排,密码 6666:

[download]https://pan.baidu.com/s/1XLoRbcZNwZExkcAxy8X9Zw[/download]

然后再配置下maven镜像源,给下载加个速,进入到maven/conf/settings.xml文件中,看父标签塞对应的内容:

<mirrors>
<mirror>
        <id>huaweicloud</id>
        <mirrorOf>*</mirrorOf>
        <url>https://repo.huaweicloud.com/repository/maven/</url>
    </mirror>
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>       
    </mirror>
  </mirrors>
<profiles>
 <profile>
      <id>jdk</id>
      <activation>
         <activeByDefault>true</activeByDefault>
         <jdk>1.8</jdk>
      </activation>
      <properties>
          <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
         <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        <tomcatPath></tomcatPath>
      </properties>
    </profile>
  </profiles>
  <settings>
<activeProfiles>
    <activeProfile>jdk</activeProfile>
  </activeProfiles>
</settings>

通过Jenkins的全局配置,配置JDK和Maven

系统管理 ---- 全局工具配置 ---- 配置JDK和Maven

Maven的配置在页面的最下面:

实现CI操作

测试代码:GP7_4_jenkins: jenkins实现CICD (gitee.com)

最终实现:实现Jenkins拉取Gitee上的代码到Jenkins本地,并且打包。且将war包发布到测试环境中并运行,希望测试环境可以采用docker的形式运行war包。

在项目中添加了Dockerfiledocker-compose.yml文件

Dockerfile:

FROM tomcat:latest
WORKDIR /usr/local/tomcat/webapps
RUN mkdir ROOT
COPY jenkins-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/ROOT/air.war
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN jar -xvf air.war

docker-compose.yml

version: '3.1'
services:
  jenkins:
    build:
      context: ./
      dockerfile: Dockerfile
    image: air:v1.0
    container_name: air
    ports:
      - 8083:8080

为了让Jenkins完成CI操作,需要配置两个内容

1.构建(将项目打包)

进入你创建的任务,配置,构建

2.构建后操作(发布内容到测试环境,并运行项目)

cd /usr/local/test/cicd/docker
mv ../target/cicd-1.0-SNAPSHOT.war ./
dc down
dc up -d --build
docker image prune -f

到这里你本地编写代码提交到Git,Jenkins就会实现CI操作了。

配置Git的参数

为了让当前Jenkins的任务可以根据仓库中的标签进行发布指定版本的代码

配置Git Parameter

接下来就可以构建了。

实现CD操作

完成第上步的操作后,可以在构建项目时,选择仓库中的指定标签进行发布。

因为Jenkins的任务在默认情况下,只会拉取Git中最新提交点的代码,如果需要根据标签进行发布,需要将之前采用Maven构建项目的方式,修改为手动Shell命令的形式

Jenkins通过标签拉取代码并打包

在构建项目时,选择指定标签构建,即可看到效果。

[/wppay]