Jenkins

提交文档后,可以自动发布到服务器上。这时候,使用到了 jenkins。

1. 安装 Jenkins

1.1 推荐安装方法

使用 docker-compose 来安装,将接口映射到宿主机上的 8090,然后通过 nginx 进行跳转。

version: '3.7'
services:
#jenkins
jenkins:
hostname: jenkins
image: jenkins/jenkins:lts
user: root
ports:
- 8089:8080
restart: always
# privileged: true
environment:
- TZ=Asiz/Shanghai
volumes:
- ${DATA_PATH}/jenkins:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- ${HOME}:/home
- /usr/bin/docker:/usr/bin/docker
- /etc/localtime:/etc/localtime:ro

安装说明

  • 为了让容器可以利用宿主机的 docker,所以下面是必须的。

  • /var/run/docker.sock:/var/run/docker.sock
    /usr/bin/docker:/usr/bin/docker
  • 为了避免容器用户的权限问题,这里使用了

  • user: root

启动

docker-compose up --build -d

进入容器

docker-compose exec jenkins bash

在安装过程中遇到的问题:

  • 过几年不主动更新宿主机的镜像image: jenkins/jenkins:lts ,那么还是使用现在的镜像。
  • 有时候因为编译错误,那么宿主机的 docker 不能自动删除,所以会占用端口,这时候要到服务器上删除那些临时的容器。

1.2 不建议

3 年前用 jenkinsci/blueocean,但是在使用过程中发现这不是最优的选择,因为 jenkinsci/blueocean 版本总是不能正常更新。

执行下面的命令,就可以了。

docker run \
--rm \
-d \
--name jenkins \
-u root \
-p 8089:8080 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME":/home \
-v /etc/localtime:/etc/localtime:ro \
jenkinsci/blueocean

安装完毕后,可以这么来访问。

# 访问 Jenkins/Blue Ocean Docker 容器
docker exec -it jenkins bash

2. 初始化配置

开打http://localhost:8089 打开服务器,如果是用 nginx 进行转发,那么就通过域名访问,例如:jenkins.redhtc.com

2.1 获取密码

第一次登录,需要输入密码,密码这么得到。

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

然后设置管理员密码,密码一定要设置的长一点。

2.2 安装插件

安装的插件有这些,在安装插件中,搜索下面关键词

  • Docker Pipeline
  • publish
    • publish Over SSH
  • Gitee

安装完毕后重启

docker-compose restart

2.3 注意事项

系统提示方向代理有问题

主要是 nginx 配置的有问题,修改一下 nginx 的配置就可以了。

具体修改方法

2.4 配置 SSH

主要的目的是将编译好的程序,通过 SSH 部署到服务器上。

在这个菜单中配置:系统管理>配置管理> ,可以配置多个,这里说明要配置的主要内容,下面是例子:

  • 名称:myserver
  • 服务器地址:192.168.1.123
  • 登录用户名:admin
  • 密码:123456
  • 服务器目录:这个目录一定要填写(例如 Nginx 的www目录)

3. Gitee 工程示例

这里有一个示例项目,一旦有代码提交,就自动进行编译,并且部署到服务器上。

3.1 添加 Jenkins 脚本

在工程的根目录下创建Jenkins文件,并且创建jenkins/scripts目录,在目录中放置编译、测试、发布的脚本。

脚本的主要工作是:

  • 生成一个 Docker 容器
  • 编译代码
  • 将代码部署到宿主机上。

这个脚本参考了 Jenkins 官网的例子,实际上里面包含了测试于中断两个服务,但是这两个服务被我给注释掉了,有兴趣可以具体看一下相关的内容。

小技巧

当有些语法不会写时,可以在Jenkins的某个 Job 中,点击菜单流水线语法,通过向导撰写语法,例如要写 SHH 的语法,可以这么来做。

3.2 新建一个 Job

在 Jenkins 中新建立一个 Job

3.3 配置构建触发器

按照提示,进行配置就可以了,在配置的过程中,需要在gitee上做相应的内容。

gitee上要做的内容有

  • Gitee webhook上填写:本地Jenkins回调的地址,见下图的说明
  • Gitee webhook上得到Gitee WebHook 密码

更详细的配置,见gitee 官网的说明

3.4 配置流水线

输入要下载的路径,并且配置路径脚本的名称,就是根目录下的文件。

3.5 gitee配置说明

担心找不到 gitee 如何配置,这里放了图片,实际上按照 gitee 的文档,一步一步配置就可以了。

3.6 测试

在本地编辑文件后,进行git push ,然后到Jenkins发现已经进行编译了。

4. Gitlab 工程示例

这个例子与上面的 Gitee 的区别如下:

  • Gitlab 必须通过密码才能下载
  • 不用自动进行部署,部署是通过手工部署的
  • 部署在不同的目录下
  • 这个程序连接着后台程序,而后台分为测试服务器与正式服务器

参考文档

4.1 添加 Jenkins 脚本

添加 Jenkins 脚本

在工程的根目录下创建Jenkins文件,并且创建jenkins/scripts目录,在目录中放置编译、测试、发布的脚本。

sshPublisher 脚本的具体变量

  • 服务器名称:malladmin
  • 要复制的目录:disk

4.2 Gitlab 配置(可以省略)

登录 Gitlab 得到一个要访问的 Token,详细步骤见 Gitlab 官方文档

4.3 Jenkins 配置

① 添加 SSH 服务器

编译后要上传文件,所以在系统管理>系统配置中添加一个新的目标服务器malladmin

配置完毕用户名与密码后,要进行一下测试,是否可行。

② 添加 Gitlab 插件

参考文档

安装插件

搜下面关键词安装插件

配置 gitlab 服务器

在这个菜单中配置:系统管理>配置管理> ,要在添加下拉框,选择第一个,会弹出第二图的对话框

这里是要弹出的对话框

③ 配置 Job

这里没有使用上面两步添加的 token 也可以用了

4.4 疑问

如果在代码中进行这么配置:

  • 本地开发,使用的是本地开发的配置参数
  • 在服务器打包的时候,用的是服务器的配置参数

4.5 遇到的问题

① sh 权限不足

这个是在 windows 环境下写 sh 脚本产生的问题。

可以在 Jenkins 中添加下面的脚本。

stage('Deliver') {
steps {
sh 'chmod 777 ./jenkins/scripts/deliver.sh'
sh './jenkins/scripts/deliver.sh'
sh 'ls'
}
}

我是怎么发现这个问题的?

设置一个input断点。
然后登录到docker 容器中。进入alpine容器
docker exec -it 容器id /bin/sh
通过ls -l 查看是否可执行,发现没有可执行的状态

② Build 错误

虽然现实编译成功,但是看日志后,发现编译错误。没有生成错误。 今后需要查查,如果编译不成功,怎么能提示错误。

记录当前容器配置的内容

adminpro https://gitlab.redhtc.com/wukong/wukong-mall-admin.git
antLearning https://gitee.com/fanhualei/wukong-mall-learn.git
GiteeTest
keycloak https://gitee.com/fanhualei/keycloak-doc.git
littlefish-dolphin https://gitee.com/littlefishcode/3d-printer.git
littlefish-www https://gitee.com/littlefishcode/littlefish.git
wukongDoc https://gitee.com/fanhualei/wukong-doc.git
wwwRedhtc https://gitee.com/fanhualei/redhtc-web.git
malladmin /root/000
myserver /data/my-nginx/nginx/ant-learning
myserverKeycloak /data/my-nginx/nginx/keycloak
myserverLittlefish-dolphin /data/my-nginx/nginx/littlefish-dolphin
myserverLittlefish-www /data/my-nginx/nginx/littlefish-www
myserverWukongDoc /data/my-nginx/nginx/wukong-doc
myserverWwwRedhtc /data/my-nginx/nginx/www-redhtc

5. 待解决问题

在使用 jenkins 中,还有以下问题,想着去解决。