Skip to content

Jenkins部署

容器化部署

拉取镜像

jenkins/jenkins:2.440.2-lts

启动

shell
docker run -itd \
-uroot \
-p 80:8080 \
-p 50000:50000 \
--name jenkins \
--restart=always \
-v /data/jenkins_data:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
jenkins/jenkins:2.440.2-lts

注意/data/jenkins_data目录换成自己需要的目录

启动后浏览器访问:http://Jenkins服务器IP:暴露端口

初始化

容器化部署参考以下三种方式

非容器化部署可以根据实际目录调整,找到安装目录下的secrets/initialAdminPassword即可

注意initialAdminPassword初始化后就会被删除

首次访问会需要初始密码,密码可以在以下位置找到

法一:使用docker logs jenkins 中间的 32 位字符串就是了

bash
$ docker logs jenkins
*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

5306e7c366364bac9e9975979582009e

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

法二:

进入容器,查看文件/var/jenkins_home/secrets/initialAdminPassword

bash
$ docker exec -it jenkins bash
$ cat /var/jenkins_home/secrets/initialAdminPassword

法三:

直接通过映射出来的目录查看文件

bash
$ cat /data/jenkins_data/secrets/initialAdminPassword
# /data/jenkins_data : 映射的宿主机路径,具体看你映射的路径

image-20240622191302427

第一次使用可以使用“安装推荐的插件” 如果有使用经验可以考虑 “选择插件来安装

image-20240622192709913

这里以“安装推荐的插件” 为例,会进入插件安装

如果离线环境,可以在有网络的地方初始化完成后,再将数据目录拿过去/直接把插件目录拿过去

image-20240622192935603

根据提示创建第一个管理用户,点击保存并完成

image-20240622193310250

输入Jenkins资源的根地址,如果是域名,自己做好解析/代理,点击保存并完成

image-20240622193417245

点击,开始使用Jenkins

image-20240622193558019

此时就进入了Jenkins首页

如果重启时遇到下图的情况,别担心它只是没有重启好,重启好后会进入登录页面

image-20240622194722693

插件安装

【推荐安装第一次有安装汉化包,但是需要重启才会有,如有需要可以在安装完成后直接重启即可】

点击 Manage Jenkins ——> Plugins ——> Available plugins

搜索需要的插件,点击安装,然后根据需要重启Jenkins即可

NodeJS多版本

在Jenkins中找到 系统管理 --> 插件管理 --> 可选插件 中搜索 NodeJS,选择后点击安装,安装后重启

image-20240622194250126

在Jenkins中找到 系统管理 --> 全局工具配置 --> 在底部 选择具体版本安装

image-20240622111659786

配置项目nodejs

image-20240622112622017

其他步骤正常配置即可

git-parameter参数化构建过程

-> 可选插件

搜索git-parameter,安装完成后重新启动jenkins

image-20240622194851120

丢弃旧的构建,使用时一定要勾选。不勾选的话jenkins空间会占用巨大,访问速度也很受影响。 这里可以根据实际需求设置保留天数和构建保留最大数

源码管理:指定分支(为空时代表any):$branch,$开头,使用参数化构建过程中的名称

Publish Over SSH远程

在Jenkins中找到 Manage Jenkins -> Manage Plgins->可选插件中搜索Publish Over SSH 安装 重启Jenkins

image-20240622200324609

配置SSH秘钥

这一步是为了Jenkins所在的服务器通过SSH访问目标机器时获得免密授权 登录Jenkins所在的服务器,执行 ssh-keygen

将公钥拷贝到authorized_keys文件

bash
cat id_rsa.pub >> authorized_keys

执行完 会生成一个authorized_keys文件,将生成的authorized_keys拷贝至需要连接的linux机器上的对应用户或者直接root下的.ssh文件夹下

配置目标服务器路径

在服务器中配置完秘钥之后,接下来需要在Jenkins中做配置: Jenkins --> 系统管理 --> 系统配置,找到Publish over SSH

image-20240622113136349

Publish over SSH公共配置:

Passphrase : 在Jenkins服务生成秘钥时如果有输入密码 则填写 没有填写则空着

Path to key :秘钥的路径

Key :生成的私钥 也就是生成的id_rsa文件 可以在服务器上通过命令cat id_rsa获取到

SSH Server私有配置:

Name: 服务名称 自定义 方便区分即可

Hostname : 目标服务器的IP地址

Username : 目标服务器的用户名

Remote Directory : 目标服务器的目录名称 Jenkins推送过来的包会放在这个位置(注: 刚才填写的用户名需要有权限对此文件目录有读写权限)

其他的不必配置

注意Gitlab等SSH Keys使用的是公钥,如果是-----BEGIN OPENSSH PRIVATE KEY——开头的则需要重新生成,生成代码见:

ssh-keygen -m PEM -t rsa -b 4096

在使用时,选择 增加构建步骤--> Send files or execute commands over SSH

SSH Server配置:

Name : 选择服务名称 在Jenkins --> 系统管理 --> 系统设置中已经配置 下拉选择即可

Source files :源文件目录 这个目录对应的是仓库代码的根目录,这个地址必须是基于根目录的相对路径,不可以放到根目录外面的路径, 不可以用../../XXX这样的路径来访问 否则会出现SSH: Transferred 0 file(s)的问题,文件传送不过去! 【大坑大坑大坑大坑】

Remove prefix : 要去除的前缀 把Source files文件目录地址去掉即可 否则会在目标机器上创建对应的目录

Remote directory : 要传送文件到的目标机器的目录 即刚才在Jenkins -->系统管理-->系统设置中配置的目录,所以此处是相对于已经创建的目录作为根目录开始的, 填写 / 即可

Exec command : 传输代码完成后 执行的脚本 可以用来做对包的解压 重启Nginx等操作

此处可以验证下是否能传过去,再继续,配置

Exec command样例

shell
# 切换目录【这里是可以写对应服务器绝对路径的,从/开始】
cd /data/nginx/data
# 判断文件是否存在
if [ ! -f "dist.tar" ];then
	echo "文件不存在" >> ${log_file}
	exit 1
else
	echo "更新"
	tar -xf dist.tar.gz
	rm -rf dist.tar.gz
	echo "更新完成"
fi
# 正常更新前端不需要重启nginx,根据需要脚本自行调整

然后保存Jenkins配置,重新构建一下Jenkins任务,来看一下前端是否更新。

Maven插件

Maven是一个用于自动化构建项目的Java工具,可以帮助开发者管理和构建项目依赖、编译Java代码、运行测试等。Jenkins也支持Maven集成,通过安装Maven插件,Jenkins可以更好地与Maven项目配合使用。

在Jenkins中找到 系统管理 --> 插件管理 --> 可选插件 中搜索 Maven Integration,选择后点击安装,安装后重启

image-20240623184743870

在新建任务时能看见 构建一个maven项目 则表示安装成功了

image-20240623190530704

在Jenkins中找到 系统管理 --> 全局工具配置 --> 找到 JDK 安装 ,输入别名、点击自动安装 从java.sun.com安装【也可以选其他方式】,同意协议

第一次需要输入oracle.com的账号密码

image-20240623190425630

在Jenkins中找到 系统管理 --> 全局工具配置 --> 找到 Maven 安装 ,点击新增Maven,输入Name、勾选自动安装,选择自己需要的maven版本即可

image-20240623191119696

Build时填写

mvn package -Dmaven.test.skip=true

image-20240623192528677

流水线

构建前端【示例:Vue】

新建任务

在Jenkins首页点击“新建任务”,输入任务名称,选择自由风格的软件项目【也可以选择其他的,这里仅供参考】,点击确认

image-20240622200857375

参数化构建过程

选择 参数化构建过程 【可选】

image-20240622201357138

源代码管理

image-20240622212231330

凭据【Credentials】配置

在Gitee仓库对应的项目的配置里找到 “部署公钥管理” ,点击右上角的添加部署公钥

image-20240622205826393

填写标题和公钥

image-20240622211736627

公钥获取方式,在容器内生成,然后再将id_ed25519.pub内的容器粘贴过来,然后点击左下角添加

bash
# 进入容器
docker exec -it jenkins bash
# 生成密钥
ssh-keygen -t ed25519 -C "Gitee SSH Key"
# -t key 类型
# -C 注释

然后就能看到以下内容

image-20240622210012509

然后在Jenkins页面【Credentials】选择框下方点击【添加】配置,然后填写如下内容

image-20240622210541174

错误解决

image-20240622210639238

安全问题

bash
# 可能Jenkins容器/服务器生成密钥时使用的是
ssh-keygen -t rsa
# 换成再试试
ssh-keygen -t ed25519 -C "Gitee SSH Key"

如果还是有问题,可以参考下方配置试试:

系统管理 --> 全局安全配置,滑倒底部选择为:

image-20240622210819490

配置构建环境

如果jenkins容器/服务器没有安装node环境,可以参考插件安装部分 NodeJS多版本 安装

也可以自己封装/安装nodes环境

镜像封装方法:

在官网下载合适的二进制包,然后在Dockerfile同级目录解压,改名为node16

Dockerfile

dockerfile
FROM jenkins/jenkins:2.440.2-lts
COPY node16 /opt/node16/
ENV PATH="${PATH}:/opt/node16/bin"

重新构建镜像

bash
$ docker build -t jenkins/jenkins:2.440.2-lts-node16

将现有的容器直接删除,然后使用此镜像,并使用原来的数据目录再次运行新的容器,然后正常使用即可,如果自己构建对应版本的镜像忽略此步

选择对应版本的node,如果没有对应版本可以参考 NodeJS多版本 新增

image-20240622213334809

前端工程构建

选择增加构建步骤 ——> 执行 shell ,添加如下内容

shell
echo "========== 开始打包 =========="
# 安装依赖
npm install
# 删除旧的dist文件
rm -rf dist dist.tar
# Build代码
npm run build
# 将dist打包
tar -zcf dist.tar.gz dist
echo "========== 打包完毕 =========="

部署

选择增加构建步骤 ——> Send files or execute commands over SSHExec command添加如下内容,其他参考图片说明

bash
if [ ! -f "dist.tar" ];then
	echo "更新文件不存在"
	exit 1
else
	echo "更新"
	tar -xf dist.tar.gz
	rm -rf dist.tar.gz
	echo "更新完成"
fi

image-20240622222837790

如果Nginx代理了对应目录,可以尝试进行访问,看页面是否出来,亦或者直接在对应目录看是否有对应内容

Nginx代理vue前端参考:

nginx
server {
	listen 80;
	server_name docs.liulike.top;
	
	# 代理到后端
	location /api {
		proxy_pass http://127.0.0.1:8080;
		proxy_redirect off;
		proxy_http_version 1.1;
		proxy_set_header Connection "";
		proxy_set_header HOST $host:$server_port;
		proxy_set_header Cookie $http_cookie;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
	
	# 代理前端打包后的静态资源
    location / {
        root /data/doc/dist;
        try_files $uri $uri/ /index.html;
    }
 }