Jenkins三大概念:

  • Job:即为任务
  • 插件:maven构建项目、git拉取代码、ssh插件
  • 工作空间:任务的存储空间,即为git代码的存储空间
  1. 开发者在本地开发,然后提交到 Source Respository【比如Gitee】 中,
  2. 触发GitHub或者 GitLab 配置的钩子函数程序,继而通知 Jenkins
  3. Jenkins 收到通知,会通过 Git/SVN 插件,重新从项目配置中的代码仓库中拉取最新代码,放置于 Workspace (Jenkins 存放任务的目录)
  4. 之后重新触发构建任务,Jenkins 有很多的构建的插件,Java常用的 Maven 、Gradle,前端的 Node 等
  5. 如果有安装发送邮件的插件并且进行了配置,那么可以在项目中进行配置,构建失败或者成功都可以选择是否给开发者发送邮件
  6. 构建成功后,会使用ssh插件登录目标部署服务器的ssh server,一般是将jar包复制到目标服务器上,文件传输完毕之后执行shell命令,此时的命令执行初始位置在服务器上的登录用户目录下。

git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP

            ---docker run -d -p 8080:8080 -v /jenkins/jenkins_data:/var/jenkins_home -e TZ=Asia/Shanghai jenkins/jenkins:lts

            ---启动Jenkins容器,挂载Jenkins目录,映射宿主机端口和Jenkins容器端口为8080,设置时区。

            ---访问宿主机IP:8080,拿到管理员账户密码之后进行环境配置:
  1. 配置jdk,【jdk可以使用Jenkins容器默认安装的。在容器中使用which java或者echo &JAVA_HOME查找默认安装的java】。Git使用默认的,maven配置一个最新的版本3.9.1
  2. ssh-keygen -t rsa -C "jenkins" 【Jenkins容器和宿主机不一样,不能共享gitee密钥,所以要分别配置gitee的key,注意生成key 的用户是root还是jenkins,要与运行Jenkins的进程用户一样才行。Jenkins服务作为中间服务器使用ssh连接从git拉取数据和连接目标部署服务器,当Jenkins连接目标服务器的ssh server时,运行的命令如同在目标服务器上身临其境一样。】
  3. cat /var/jenkins_home/.ssh/id_rsa.pub
  4. 复制公钥到gitee
  5. 在有用户权限的目录:var/Jenkins_home下测试git clone
  6. git clone https://toscode.gitee.com/chenshobo/book.git

            Username for 'https://toscode.gitee.com': chenshobo

            Password for 'https://[email protected]':xxxxxxx

         7.在Available plugins中安装maven integretion,安装后重启。

         8.安装ssh,publish over ssh,nodejs,yarn

         9.添加creaditial凭据,添加目标服务器的用户密码和gitee用户名密码

        10. 3.3系统配置参考 其中ssh server 的remote directory可以是目标服务器的任意路径。当Jenkins服务使用ssh连接到目标服务器时,会在此路径下创建‘构建任务’中remote directory 中的文件夹,所以在目标服务器上传输的文件路径就是系统配置中的sshserver的路径+构建任务中的路径+传输的文件名称。但是注意下面的Exec command中的命令是在/~目录中执行。【注意 其实在这里输入的命令,就是在服务器上的命令,我们所处于的位置就是当前登录用户的根目录下就是root用户就是/~目录。】【不发送文件只ssh远程服务器执行命令就选另一个选项Execute shell script on remote host using ssh

下图是post steps

git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP

  1. 新建任务,源码管理中如果没有git,就去已安装插件查询git,这样就是对的。git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP
  2. git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP
  3. ROOT POM可以填这个:jeecg-boot-center/pom.xml,相对于根目录的的相对路径。一个任务的工作空间的容器地址是 /var/jenkins_home/workspace
  4. 构建环境选Add timestamps to the Console Output和with ant(选择配置的jdk)。
  5. Build:ROOT POM可以填这个:jeecg-boot-center/pom.xml,相对于根目录的的相对路径。项目情况是:https://toscode.gitee.com/chenshobo/traffic-project.git。一个任务的工作空间的容器地址是 /var/jenkins_home/workspace

git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP

第一种方式: 39.105.133.99:8080/job/jeecg-boot-center/build?token=kongzhi

git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP

任务选项如此选择的时候,访问以上路径即可触发构建。其中IP+端口是Jenkins_URL,可在浏览器前端界面的全局配置中查到。

第二种方式就是gitee的钩子函数。

踩坑:Generic Webhook Trigger插件,此插件不知道原因没用,也许是因为插件说明文档本就没有明确支持gitee。注意点:如果有多个任务时,发送这样一个请求会触发所有任务的构建,所以必须要指定token来指定触发指定的job进行构建。

使用Gitee plugin 1.2.7有用。与gitee项目的webhook的默认一样就行哈哈哈。

git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP

下图全是默认的

git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP

分支指定还是有用的。密码点击“生成即可“:

git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP

ssh之后需要执行的命令:

Exec command:

  • cd /csb_docker
  • docker rm -f jeecg-boot-system
  • docker rmi jeecg-boot-system
  • docker build -t jeecg-boot-system /jenkins/jenkins_data/workspace/jeecg-boot-center/jeecg-module-system/jeecg-system-start/
  • docker-compose up -d jeecg-boot-system

Vue项目的构建【主要写与maven项目的不同点】

  1. node的安装:系统管理 -》全局工具配置:选择版本号,自动安装即可。使用Jenkins前端任务配置自动安装node,会下载node软件文件夹,但是不会配置环境变量,所以我们要自己配置环境变量。Node_home目录下都是CHANGELOG.md LICENSE README.md bin include lib share。然后执行
  • npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
  • npm install --registry=https://registry.npm.taobao.org
  • npm install -g yarn

(194条消息) npm,yarn使用以及更换国内镜像源_yarn 国内源_Raliam的博客-CSDN博客

Yarn根据yarn.lock文件中的地址来下载包,如果一直显示国外源连不上而无法切换国内源就把此文件删除,可以使用设置的新的源自动重新生成yarn.lock文件。

git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程-LMLPHP

  1. 构建自由风格任务。(若是任务差不多就可以用下面的copy from 已有任务)
  2. 设置构建环境,选择 Provide Node & npm bin/ folder to PATH 然后选择之前安装插件时候配置的node版本
  3. Build Steps选择Excute shell (打包后的前端文件可以打包传输到目标服务器上,然后再解压,不过此处我不需要打包因为我的宿主机就是我的目标服务器)【在此处执行的命令就是在Jenkins的docker容器中执行的命令】,再增加一个命令脚本(只在ssh远程服务器上执行命令不发送文件Execute shell script on remote host using ssh)

Build Steps的配置:

第一个脚本,执行 shell,运行在Jenkins容器中的命令:

  • export NODE_OPTIONS=--openssl-legacy-provider
  • cd /var/jenkins_home/workspace/ant-design-vue-jeecg-center
  • yarn install
  • yarn run build

第二个脚本,Execute shell script on remote host using ssh,运行在部署目标服务器上:

         docker rm -f jeecg-boot-nginx

         docker rmi jeecg-boot-nginx

        docker build -t jeecg-boot-nginx /jenkins/jenkins_data/workspace/ant-design-vue-jeecg-center

        cd /csb_docker

        docker-compose up -d jeecg-boot-nginx

在Jenkins使用中遇到的问题

1、误删了Jenkins容器,但是保留了挂载出来的Jenkins目录,如何恢复Jenkins容器?
1)、先把旧挂载目录改个名字,确保使用docker run生成Jenkins容器的时候旧目录不会被新目录直接覆盖。使用docker run指令重新生成一个容器,修改挂载目录的权限确保挂载成功新目录。使用docker logs Jenkins容器id查找初始密码,进入Jenkins浏览器界面,安装插件,生成管理员账户,管理员账户要与之前的一模一样确保恢复成功。然后正常进入Jenkins浏览器界面
2)、在宿主机中,先stop新Jenkins容器,把旧挂载目录中的内容复制或者移动到新挂载目录,覆盖新挂载目录的所有内容,mv /旧目录名称/ /新目录名称/ 这样移动可以将文件夹中的隐藏文件夹一同复制。然后启动Jenkins容器并打开Jenkins发现成功,构建任务也成功恢复。完美!!!
2、Jenkins 忘记登录密码解决办法
3、jenkins拉取项目返回128问题
4、登录容器的root用户
docker exec -u -0 -it 1a bash
5、使用Jenkins镜像创建容器默认创建一个Jenkins用户运行Jenkins服务,使用
ssh-keygen -t rsa -C "Jenkins"
给Jenkins生成公钥,找到公钥给gitee。
此用户权限较低,只能在指定目录比如var/jenkin_home目录中有权限
6、Jenkins构建时出现报错ERROR: Failed to install JDK. Exit code=2
是因为jdk已有默认安装版本:
1)、在宿主机进入Jenkins容器执行echo $JAVA_HOME,将此路径输入到全局工具配置中的jdk路径中,关闭自动安装。
2)、插件管理-》已安装-》卸载oracle java SE JDK插件
7、docker 运行后, 执行docker logs -f ecf时报错:
touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
需要修改下目录权限, 因为当映射本地数据卷时,/home/docker/jenkins目录的拥有者为root用户,而容器中jenkins user的uid为1000
执行如下命令即可:
chown -R 1000:1000 /home/docker/jenkins
8、构建任务时如何执行使用prod配置文件打包SpringBoot?
build选项填写 “clean install -P prod”,意为使用mvn clean install -P prod
9、测试环境如何提升部署效率呢?当打出来的jar包比较大的时候,传输到服务器比较慢,怎么处理呢?(尽可能的考虑局域网内传输):我的情况特殊,我的Jenkins运行在docker中,将Jenkins_home目录进行挂载到宿主机,而宿主机就是我的目标部署服务器,所以我完全可以在构建完成后,不需要传输jar包直接使用挂载到宿主机上的Jenkins目录中的工作空间中的项目的jar包来生成镜像。甚至完全可以替换jar包或者静态资源然后重启jar、重启容器。分离jar包依赖也是一个方法,不过不适应我的项目
10、Jenkins连接ssh服务器传输文件之后如何删掉旧版本,使用新版本:
1)、首先传输文件过来【此项目可以不用传送直接使用挂载目录的工作空间中的包】,然后删除容器删除镜像,使用传输的文件构建镜像构建容器重启。
2)、把容器内的包的存放目录挂载出来,直接在目录中进行文件更换,然后重启
3) 、直接使用docker exec 命令删除打包文件,然后在宿主机执行docker cp命令把文件放置进去,然后重新启动容器。“docker exec

09-11 21:46