Docker 搭建 Jenkins 持续集成自动化构建环境

1、Docker镜像拉取 Jenkins 环境命令

docker pull jenkins/jenkins:lts

查看下拉取的镜像

docker images

2、通过容器编排方式构建 Jenkins 容器

创建对应目录

# 创建对应目录
mkdir -p /data/jenkins/jenkins_home/
chown -R 1000:1000 /data/jenkins/jenkins_home/
 
+ data
- docker-compose.yml  // docker-compose执行文件
+ /data/jenkins
- jenkins_home       // Jenkins挂载卷

docker-compose.yml文件配置

version: "3"
services:
  jenkins:
  	user: root
  	restart: "always"
    image: jenkins/jenkins:lts
    container_name: jenkins
    privileged: true
    ports:
      - 8080:8080
      - 50000:50000    
    environment:
      JAVA_OPTS: -Duser.timezone=Asia/Shanghai
    volumes:
      - /data/jenkins/jenkins\_home/:/var/jenkins\_home
      - /data/jenkins/workspace/:/root/.jenkins/workspace \
      - /usr/local/apache-maven-3.6.0:/usr/local/maven
      - /usr/local/maven/maven-3.6.0/repository:/usr/local/maven/repository
      - /usr/local/jdk1.8.0_211:/usr/local/jdk
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /etc/localtime:/etc/localtime
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
      - /usr/lib/x86\_64-linux-gnu/libltdl.so.7:/usr/lib/x86\_64-linux-gnu/libltdl.so.7
      - /root/.ssh:/root/.ssh # (可选)免密配置时,公钥可以直接在本地配置

3、启动容器环境

需要进入 compose 目录下面输入以下命令,进行环境的启动

docker-compose up -d

4、docker-compose 其它操作

镜像内容器进行操作后可以保存成新的镜像,比如容器内安装了jdk、配置了环境变量可以保存为新的镜像

# 找出当前运行的容器ID
docker ps
 
# 根据containerId,创建新镜像
docker commit 5d81d56b18b6 jenkins/jenkins:centos.v1

修改 docker-compose 可以对创建的容器根据新镜像进行修改

version: "3"
services:
  jenkins:
  	user: root
    image: jenkins/jenkins:lts
    ports:
      - 8080:8080
      - 50000:50000
    restart: "always"
    container_name: jenkins
    environment:
      JAVA_OPTS: -Duser.timezone=Asia/Shanghai
      #比如新增环境变量
      java_home = xxx 仅做举例
    volumes:
      - /home/jenkins/jenkins\_home/:/var/jenkins\_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
    privileged: true

删除之前的容器

docker-compose down

重启成新的容器

docker-compose up -d

5、配置 Jenkins

前提,Jenkins 部署应用到远程服务器上,必须要实现 Jenkins 服务器免密登录到远程服务器上,同时远程服务器也要免密登录到 Jenkins 服务器上拷贝对应的jar包。所以,配置 Jenkins 前保证两台服务器互相免密登录。这块配置,可以查看我之前写的文字 [ Linux系统两台机器互免密登录 ],很简单。

5.1首先配置 ssh 插件

1、安装 ssh 相关的插件,直接在插件中心搜索 ssh 然后按装如下两个插件

①插件,主要用于链接远程服务器全局配置(公共配置);

②插件,主要用于链接远程服务器传文件配置,在项目里配置。

2、全局配置 Publish over SSH,系统管理->系统配置,下拉找到即可

第1个标注的地方,如果生成私钥的时候,没设置密码,不用填写任何内容留空即可;

第2个标注的地方,远程服务器的别名,随意起;

第3个标注的地方,远程服务器的地址;

第4个标注的地方,远程服务器的账号名称(登录名);

第5个标注的地方,远程服务器上要放置应用的目录,这里需要注意,后期项目配置的时候填写的目录跟这个是拼接的。

第6个标注的地方,点击高级后,展开下面的填入项。

第1个标注的地方,远程服务器的密码

第2个标注的地方,远程服务器的私钥。

3、项目(job)配置 ssh 插件相关的内容-前端VUE

新建一个job,输入名称,选择流水线项目,点击确定。

这里只演示,构建这个步骤的配置,其它配置很简单,自己网上一搜就可以。

上面的截图①,对应截图下面①、②两个步骤。

构建配置第一步,Jenkins 打包项目前端应用:

上图第1个标注地方,shell脚本如下。

#!/bin/bash
cd /data/jenkins/jenkins_home/workspace/data/xxx-all/xxx-admin 
#这个目录也可写成如下这样,不同Jenkins版本可能有所不同,相对与打包工程的下一级目录开始。
./dev-xxx
npm install
npm run build
cd dist
tar -cvf dev-xxx.tar *

脚本,

第2行表示,Jenkins 服务期切换目录到 Jenkins 配置的 workspace 目录下的项目工程目录下。

第5、6行,前端应用打包命令。

第7行,切换到 dist 目录,(Jenkins打包前端应用后自动生成这个目录,打包的结果都在这个目录下)

第8行,将 dist 目录下的所有内容打包(*很重要),方便传输到远程服务器(部署服务器)。

构建配置第二步,将打包结果上传到远程服务器;

上面5个配置,逐一解释如下,这里如果配置不好,项目根本无法部署到远程服务器上。

①,远程服务器的名称(别名),前面全局配置的时候已经设置过了,这里下拉选择。

②,打包结果(源文件)的目录地址,即,Jenkins 上打包后产生的内容放置的地方,这个目录很容易填错,会把你搞死。该目录是Jenkins主目录下的工程目录开始的,即工程目录下一级开始填写。

③,删除前缀,要不然你的远程服务器又会创建dist这个目录。

④,远端目录,这里需要注意,我上面配置全局(公共配置)ssh的时候,已经填写了应用部署的远端目录,https://www.yuque.com/u21187464/cf/bo7lzr#GsmxQ 这里的第5个标记,此处是基于全局公共配置的目录的拼接。

⑤,将远程服务器执行的命令,如果是前端VUE项目,就是解压上面打包的项目,脚本如下。

脚本写法一:
# cd /data/xxx-all/xxx-admin/dev-xx.tar
# tar -zxvf dev-xx.tar 
 
脚本写二(理论上面的写法没问题,我验证Jenkins会报错):
tar -xvf /data/xxx-all/xxx-admin/dev-xx.tar -C /data/xxx-all/xxx-admin/

脚本说明,

第一行,切换目录到远程服务器部署应用的目录,

第二行,解压应用包。

这里总结下上面配置的源文件(Sourec files)这个目录,很多坑。

Jenkins 构建后会在其工作空间 workspace 目录下产生对应项目的文件夹(这个文件夹名字是创建项目时命名的项目名,如下图),此时 workspace 目录下就会有api-dev这样的文件夹,

所以,源文件目录里填写的是这个文件夹之后的目录,不要把这个文件夹也填写

4、项目(job)配置 ssh 插件相关的内容-java-jar包

因为上面讲过了,这里直接截图展示下,

Jenkins 构建后其工作目录产生的 api 项目目录如下。

①标识的地方,意思是先构建运行完成后,再传输jar包到远程服务器,我这里构建指 maven 构建后在传输。

②标识的地方,源文件目录,上面讲过了,api项目名称后面的目录开始填写。

③标识的地方,删除前缀,jar包前面的目录都删除,要不然远程服务器上会创建这个目录。

6、总结

1、Jenkins 编译构建后,需要将应用包(jar包、war包等)部署到远程服务器上,所以,必须保证 Jenkins 服务器和远程服务器互相免密访问,配置上面已经说过了。

2、如果你的 Jenkins 服务器和应用服务器部署在 docker 容器里的话,需要保证两个容器互相免密登录,具体配置跟上面提到的配置一样,只是需要在容器里操作而已。

3、上面 Jenkins 打包配置我举例的是前端 vue 打包的结果,压缩成压缩包和上传部署到远程服务器的过程,如果api部署的话,流程大概一样,只是不需要压缩和解压而已。


读后感

来这里找我交流

posted @ 2021-11-03 17:40  西边人  阅读(1495)  评论(2编辑  收藏  举报