前端自动化构建部署工具 - Jenkins

237 阅读5分钟

Jenkins 自动化部署

Jenkins 安装

1 宝塔面板安装

==注:==从宝塔安装 tomcat 会自动安装 jdk8,但是 jenkins 仅支持 jdk11 及以上,推荐安装 ==jdk17==

1.1 安装 JDK17
# 下载 JDK17(海外服务器稍快,国内云先可从他处下载后上传)
cd /usr/java
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
# 解压
tar -zxvf jdk-17_linux-x64_bin.tar.gz
1.2 配置环境变量
# 编辑 /etc/profile  在文件尾部添加如下代码
export JAVA_HOME=/usr/java/jdk-17.0.7
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
1.3 在网站→Java项目当中,添加JDK17

xxxxxxxxxx3 1//2@RestController3​java

1.3 新建 Java 项目,导入 jenkins war 包
  1. jenkins github 地址下载 war 包

  2. war.jpg

  3. /usr/java/jdk-17.0.7/bin/java -jar # JDK 的路径

    -Xmx1024M -Xms256M # 限制最大内存为1024M, 最小内存256M

    --server.port=5813 # 启动端口(==注:jenkins 不支持 server.port 改用 httpPort==)

2 linux直链安装

# 下载 Jenkins 资源
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo

# 获取并导入信任的包制作者的秘钥
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key

# 升级 yum 源中的所有包
sudo yum update
# Jenkins 依赖于 java 所以需要安装 JDK
sudo yum install java-17-openjdk # 此步可省略
# 安装 Jenkins,默认端口为 8080
sudo yum install jenkins

systemctl 命令管理 jenkins

# 启动 Jenkins 服务
systemctl start jenkins
# 重启 Jenkins 服务
systemctl restart jenkins
# 停止 Jenkins 服务
systemctl stop jenkins
# 查看 Jenkins 服务状态
systemctl status jenkins

3 Jenkins 的使用以及 Freestyle 任务的构建

Jenkins.jpg

​ 首次进入使用 cat /root/.jenkins/secrets/initialAdminPassword 查看并复制粘贴密码到前台

随后进入插件安装页面,安装==系统推荐插件==即可,然后会进入创建用户界面,个人项目使用 admin 即管理员身份登录即可

3.1 创建任务→自动拉取 Github/Gitee 代码
3.1.1点击 新建 Item 创建一个 Freestyle Project

item.jpg

3.1.2在 源码管理 处选择 git ,输入仓库 ssh 地址,点击添加,并修改相应的分支

ae9b10383df6228898efee9c1add35ef.jpg

3.1.3点击添加 Jenkins ,勾选 ssh key 按照下方补充,最后选择新创建的密钥即可(密钥配置正确上步红字将自动消失==^1^==)

jenkins.jpg

3.1.4在 github/gitee 项目设置中添加与上步 私钥 为一对的 ==公钥==

一个公钥对应一个私钥,也就是一个密钥=私钥+公钥,私钥一般存留在自己本机,而公钥则保存在其他 Server 上

  1. 以下是 .ssh 文件夹下常见的文件格式

  • id_rsa:保存的私钥

  • id_rsa.pub:保存的公钥(==后缀为pub==)

  • authorized_keys:保存已授权的客户端公钥

  • known_hosts:保存已认证的远程主机ID

  1. 以下是常见的 ssh-keygen 工具命令
# 新建一个名为“id_rsa”的私钥文件,与执行`ssh-keygen -t rsa`然后一路回车结果一致
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥添加到 authorized_keys 当中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 将 authorized_keys 文件权限设置为仅 root 可读写
chmod 0600 ~/.ssh/authorized_keys

# 其他命令详解
-t:指定生成密钥类型(rsa、dsa、ecdsa等)
-P:指定私钥password,用于确保私钥的安全
-f:指定存放密钥的文件

307187d27c36204d9f1495f9ed7d0bb2.jpg

3.2 构建项目→部署到本机
  1. 可选用 nginx 托管的静态目录文件 ···/nginx/html/dist

  2. 可选用宝塔创建 php 项目站点

3.2.1回到 Jenkins 首页,添加 node 依赖环境

Manage Jenkins→Manage Plugins 在可选插件中搜索 nodejs 选择对应插件进行安装,安装完后需重启jenkins才生效。

node.jpg

3.2.2紧接着回到 Jenkins 首页,系统管理→全局工具配置(NodeJS)

node.jpg

3.2.3返回创建的任务,配置构建触发器和构建环境以及构建步骤

构建触发器

  • GitHub hook trigger for GITScm polling

构建环境 会中会多出一个选项 Provide Node & npm bin/ folder to PATH

  • Provide Node & npm bin/ folder to PATH

然后选择 增加构建步骤→执行 shell 输入项目初始化及打包发布的相关命令。Jenkins 会逐一执行

# 测试 node 环境
node -v
npm -v

sudo rm -rf dist.tar.gz      				# 删除压缩包

# 项目初始化及构建打包
npm install
npm run build

tar -zcvf dist.tar.gz dist/  				# 移动 build 后的压缩包到托管目录下。
rm -rf dist/				 				# 删除 build 后的文件
sudo cp -rf dist.tar.gz /www/jenkins_guet	# 强复制(覆盖)压缩包到部署目录
cd /www/jenkins_guet		 				# 进入托管目录下
sudo tar -zxvf dist.tar.gz   				# 解压
sudo rm -rf dist.tar.gz      				# 删除压缩包

由于项目构建时是在 Jenkins 的工作目录下执行脚本,会出现权限问题。导致即使使用了 sudo 还会出现类似以下错误。

We trust you have received the usual lecture from the local SystemAdministrator. It usually boils down to these three things: #1)Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility.

解决方案: 在 ==/etc/sudoers==文件中增加 ==jenkins ALL=(ALL) NOPASSWD:ALL== 表示在 jenkins 执行 sudo 时不需要输入密码。

3.3 监听→ git 分支实现自动构建
3.3.1回到 Jenkins 首页,系统管理→系统配置→复制 Jenkins URL
3.3.2在 github/gitee 项目设置中添加 webhook

webhooks.jpg

3.4 远程构建→部署到目标主机
3.4.1系统管理 -> 插件管理 搜索 Publish Over SSH 进行安装

Jenkins-ssh.jpg

3.4.2返回首页,在 系统管理→系统配置中找到 Publish over SSH 点击新增,再点击高级,然后选中 Use password authentication, or use a different key

jenkinsssh.jpg

3.4.3随后回到任务识图→重新配置,增加构建后的操作步骤→选择 Send build artifacts over SSH

43af51f53f9681219a1e147ff8add2b0.jpg

  • Transfer Set Source files:要上传到目标服务器的文件。它是一个相对路径,相对于 Jenkins 的工作目录,由于部署到本机时,是将 dist.tar.gz 复制到指定的目录的,所以 Jenkins 相应的 workspace 目录下仍有此压缩包,so 直接写一个文件名即可;

  • Remove prefix:去前缀。假设此时打包文件在 ~/.jenkins/workspace/GUET-PDK/dist.tar.gz,那么 Transfer Set Source files 则应该为 GUET-PDK/dist.tar.gz,此时 Remove prefix 配置为 GUET-PDK/ 则可以去除这个前缀,否则会在目标服务中创建 GUET-PDK;

  • Remote directory:远程的静态资源托管目录。由于配置服务器默认为 /,所以 www/UCloud-Jenkins/pdk-vue3 不用以 / 开头;

  • Exec command:远程主机执行 shell,由于配置服务器默认为 /, 因此工作目录也是以 / 开始,故需先转到目标目录下执行。

# Jenkins 构建后 连接远程主机时的控制台输出
SSH: Connecting from host [10-60-255-38]
SSH: Connecting with configuration [Google-HK] ...
SSH: EXEC: completed after 1,202 ms
SSH: Disconnecting configuration [Google-HK] ...
# 如果 Transferred 0 file 表示文件并没有被移动到远程主机中,
# 需要查看 Transfer Set Source files 填写的源文件 路径或名称 是否正确。
SSH: Transferred 1 file(s)
Finished: SUCCESS