Skip to content

快速搭建 Jenkins 平台

一、所需环境

我的是 轻应用服务器(CPU - 4 核 内存 - 16GB) -

你学习用途可以不用那么高, 轻应用服务器 2 核 内存 4GB 基本可以

Jenkins 官网-系统要求 https://www.jenkins.io/zh/doc/book/installing/

最低推荐配置:

256MB可用内存

1GB可用磁盘空间(作为一个Docker容器运行jenkins的话推荐10GB)

为小团队推荐的硬件配置:

1GB+可用内存

50 GB+ 可用磁盘空间
  1. 云服务 CentOS 操作系统

要查看您的 CentOS 版本,使用 cat 命令查看 /etc/centos-release 文件:

你的 CentOS 版本可以比我这个更高

bash
[root@VM-20-6-centos home]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
  1. 云服务器 CentOS 安装 dockerdocker compose, 版本信息如下

当然可以比我的版本更高

安装 dockerdocker compose 的官方文档地址 https://docs.docker.com/engine/install/centos/

bash
[root@VM-20-6-centos home]# docker --version
Docker version 20.10.21, build baeda1f
[root@VM-20-6-centos home]# docker compose version
Docker Compose version v2.12.2
[root@VM-20-6-centos home]#

二、使用 docker 运行 Jenkins

Jenkins 官网 https://www.jenkins.io/zh/doc/book/installing/

  1. 创建 Jenkins 目录
bash
mkdir -p /home/jenkins
  1. docker run 的方式 - 运行 Jenkins
bash
docker network create jenkins_net
docker run -d \
  --name aly_jenkins \
  --network jenkins_net \
  -p 8080:8080 \
  -p 50000:50000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /home/jenkins/jenkins_home:/var/jenkins_home \
  -e VIRTUAL_HOST=jenkins.ffffee.com \
  -e VIRTUAL_PORT=8080 \
  -e aly_username=root \
  -e txy_server_ip=101.42.150.216 \
  jenkins/jenkins

这个命令的解析如下:

  • docker run -d:使用 Docker 运行一个新的容器,-d 参数表示容器在后台运行,并返回容器 ID。
  • --name aly_jenkins:设置容器的名字为 aly_jenkins
  • --network jenkins_net:指定容器连接到 jenkins_net 网络。
  • -p 8080:8080 -p 50000:50000:映射宿主机与容器的端口,格式为 -p <宿主机端口>:<容器内端口>
  • -v /var/run/docker.sock:/var/run/docker.sock -v /home/jenkins/jenkins_home:/var/jenkins_home:挂载宿主机的目录到容器内的目录,格式为 -v <宿主机目录>:<容器内目录>
  • -e VIRTUAL_HOST=jenkins.ffffee.com -e VIRTUAL_PORT=8080 -e aly_username=root -e txy_server_ip=101.42.150.216:设置环境变量,格式为 -e <环境变量名>=<环境变量值>
  • jenkins/jenkins:要运行的 Docker 镜像。

这个 docker run 命令的作用和你的 docker-compose.yml 文件是相同的。

  1. docker-compose.yml - 运行 Jenkins
yml
services:
  aly_jenkins:
    image: jenkins/jenkins
    container_name: aly_jenkins
    user: root
    networks:
      - jenkins_net
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/jenkins/jenkins_home:/var/jenkins_home
    environment:
      - VIRTUAL_HOST=jenkins.ffffee.com
      - VIRTUAL_PORT=8080
      - aly_username=root
      - txy_server_ip=101.42.150.216
networks:
  jenkins_net:

这个文件是一个 Docker Compose 配置文件,用于定义和配置一个或多个 Docker 容器。

下面将会逐行解析这个文件:

yaml
services:

services: 开始定义了你希望 Docker Compose 运行的服务列表。在 Docker Compose 中,一个“服务”基本上就是一个运行特定镜像的容器。

yaml
aly_jenkins:

aly_jenkins: 是这个服务的名字。你可以自由地给它命名,只需要这个名字在这个文件中是唯一的即可。

yaml
image: jenkins/jenkins

image: jenkins/jenkins 指定了这个服务应该使用哪个 Docker 镜像。在这个例子中,它使用的是公开的 Jenkins 镜像。

yaml
container_name: aly_jenkins

container_name: aly_jenkins 设置了 Docker 容器的名字。这个名字在你的 Docker 主机上必须是唯一的。

yaml
user: root

user: root 设置了在容器内部运行进程的用户身份。在这个例子中,所有的进程都会以 root 用户身份运行。

yaml
networks:
  - jenkins_net

networks: 定义了这个服务应该连接到哪些网络。在这个例子中,它连接到一个名为 jenkins_net 的网络。

yaml
ports:
  - 8080:8080
  - 50000:50000

ports: 映射容器的端口到宿主机的端口。在这个例子中,容器的 8080 端口映射到宿主机的 8080 端口,容器的 50000 端口映射到宿主机的 50000 端口。

yaml
volumes:
  - /var/run/docker.sock:/var/run/docker.sock
  - /home/jenkins/jenkins_home:/var/jenkins_home

volumes: 挂载宿主机的目录或文件到容器中。在这个例子中,宿主机的 /var/run/docker.sock 文件被挂载到容器的同一位置,宿主机的 /home/jenkins/jenkins_home 目录被挂载到容器的 /var/jenkins_home 目录。

yaml
environment:
  - VIRTUAL_HOST=jenkins.ffffee.com
  - VIRTUAL_PORT=8080
  - aly_username=root
  - txy_server_ip=101.42.150.216

environment: 设置环境变量。在这个例子中,设置了四个环境变量:VIRTUAL_HOSTVIRTUAL_PORTaly_usernametxy_server_ip

yaml
networks:
  jenkins_net:

networks: 定义了 Docker Compose 应该创建的网络。在这个例子中,它创建了一个名为 jenkins_net 的网络。

  1. 进入 Jenkins 目录
bash
cd /home/jenkins/
  1. 创建 docker-compose.yml
bash
touch docker-compose.yml
  1. 写入 docker-compose.yml 内容
bash
vim docker-compose.yml

CTEL + V 或者 Windows 鼠标右键,把剪切板内容粘贴上去

英文状态下

  • ESC 键
  • Ctrl + : 键 - 输入 wq
  • 回车
  1. 查看是否写入 docker-compose.yml
bash
cat docker-compose.yml
  1. 使用 docker compose 启动 Jenkins
bash
docker compose up -d
bash
[root@VM-20-6-centos jenkins]# docker compose up -d
[+] Running 14/14
 aly_jenkins Pulled
 34df401c391c Pull complete
 77112ac9b508 Pull complete
 9523019861c2 Pull complete
 8f223c71f218 Pull complete
 4e1229fae46c Pull complete
 3b06bbef91e1 Pull complete
 06e9e0811252 Pull complete
 5600a22169a2 Pull complete
 161df662cb15 Pull complete
 99ac35e9b178 Pull complete
 1a672221424a Pull complete
 be697b0f60e7 Pull complete
 3f4ea89b49ee Pull complete
[+] Running 2/2
 Network jenkins_jenkins_net  Created 0.0s
 Container aly_jenkins        Started 3.1s
  1. docker ps -a

正常的情况如下

bash
[root@VM-20-6-centos jenkins]# docker ps -a
CONTAINER ID   IMAGE                                  COMMAND                  CREATED         STATUS                     PORTS
                                                   NAMES
18c22eca7e9a   jenkins/jenkins                        "/usr/bin/tini -- /u…"   9 seconds ago   Up 8 seconds               0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp                   aly_jenkins

失败状态如下

如果状态 是 Exited (143) 就是失败的

失败的 需要查看 日志

bash
docker logs c39c94ee5328

c39c94ee5328 是 CONTAINER ID 值

bash
[root@VM-20-6-centos jenkins]# docker logs c39c94ee5328
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?

你遇到的问题是关于 Docker 容器中的权限问题。容器试图在 /var/jenkins_home/ 目录下创建文件,但是由于权限不足,导致失败。

下面是解决此问题的一种可能方法:

改变主机上挂载目录的所有者

在你的主机上,将 /home/jenkins/jenkins_home 的所有者改为 Jenkins 用户。

Jenkins 默认的用户 ID 和组 ID 是 1000。

所以你可以使用如下命令:

bash
sudo chown -R 1000:1000 /home/jenkins/jenkins_home

然后,你应该能够再次启动你的 Jenkins 容器,而不会出现权限问题。

这种方法的优点是简单直接。然而,它可能不适用于所有情况,特别是当你的主机上已经有其他服务正在使用 /home/jenkins/jenkins_home 目录时,更改所有者可能会影响这些服务。

配置 docker-compose.yml user 为 root

docker-compose.yml

yaml
user: root

user: root 设置了在容器内部运行进程的用户身份。在这个例子中,所有的进程都会以 root 用户身份运行。

三、端口放行 - 访问 Jenkins 界面

访问的云服务器的 IP + 8080 端口,比如:101.42.150.216:8080

此时你会访问不到,需要配置防火墙

这里以腾讯云为例子

云服务器实例 - 防火墙 - 添加规则 - 端口字段 - 输入 8080 - 备注写上 Jenkins - 确定

重新访问 101.42.150.216:8080

四、获取密码

  1. 使用 docker exec 进入容器
  2. 输入 cat /var/jenkins_home/secrets/initialAdminPassword 获取第一次加载的密码
  3. 把密码拷贝,粘贴到刚刚浏览器的地方就可以
  4. 会到 刚刚的容器 输入 exit 退出容器
bash
[root@VM-20-6-centos ~]# docker exec -it aly_jenkins bash
root@18c22eca7e9a:/# cat /var/jenkins_home/secrets/initialAdminPassword
5a96b68310b04754b5744446db88251d
root@18c22eca7e9a:/# exit
exit
[root@VM-20-6-centos ~]#

五、自定义 Jenkins - 选择插件来安装

进去后 - 点击 无 - 滚动到底部 - 选择Localization: Chinese (Simplified) - 安装

只安装一个插件 Localization: Chinese (Simplified)

六、出现这个-新手入门-和一个插件正在安装

七、创建第一个管理员用户

输入用户名、密码、确认密码 - 点击 保存并完成

八、实例配置

点击 保存并完成

点击 - 开始使用Jenkins

九、创建 hello world 任务

  1. 点击 新建Item
  1. 输入任务名称 - 选中 Freestyle project - 点击确定
  1. 回到页面 首页 - 点击 hello world

  2. 点击左侧的 立即构建

十、配置插件源

修改插件源步骤:

  • Dashboard
  • Manage Jenkins
  • 插件管理
  • Advanced settings
  • 升级站点

URL 由 https://updates.jenkins.io/update-center.json 改成 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

以下是一些较为常见的国内 Jenkins 插件镜像源:

  1. 清华大学开源软件镜像站:Jenkins 插件镜像地址为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  2. 阿里云镜像站:Jenkins 插件镜像地址为 https://mirrors.aliyun.com/jenkins/updates/update-center.json
  3. 网易镜像站:Jenkins 插件镜像地址为 https://mirrors.163.com/jenkins/updates/update-center.json
  4. 中科大镜像站:Jenkins 插件镜像地址为 https://mirrors.ustc.edu.cn/jenkins/updates/update-center.json。

步骤:

点击管理 Jenkins-插件管理

选择-Advanced-settings

滚动到底部 - 升级站点-修改成清华大学的源

十一、重启 Jenkins

  1. docker ps
bash
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE                                  COMMAND                  CREATED         STATUS         PORTS
                                                            NAMES
18c22eca7e9a   jenkins/jenkins                        "/usr/bin/tini -- /u…"   2 hours ago     Up 3 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp                   aly_jenkins
  1. docker restart
bash
docker restart 18c22eca7e9a
  1. 重新访问或者刷新浏览器

http://101.42.150.216:8080

使用一开始设置的管理员 用户名和密码登录

十二、远程触发构建

Jenkins 官网 - 跨站请求伪造保护:https://www.jenkins.io/doc/book/security/csrf-protection/

Jenkins 远程触发 403 No valid crumb was included in the request https://www.jianshu.com/p/00fcfa4a53b5

1. 禁用 CSRF 跨站伪造请求攻击保护

系统管理 - 脚本命令行

输入下面脚本 - 点击运行

Groovy
hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION = true

2. 勾选-匿名用户具有可读写权限

3. 配置-触发远程构建.png

进入项目 - 配置 - 触发远程构建

4. 远程触发构建

浏览器 输入 JENKINS_URL/job/hello%20world/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME

比如我的是: http://101.42.150.216:8080/job/hello world/build?token=ed82049b-57b0-402a-b00a-ec10da4f3efc

十三、Jenkins 拉取远程代码 - 构建任务 - 查看日志

1. 创建一个自由风格的项目 - 项目名称 为 node-express-sequelize-mysql

项目地址 https://gitee.com/fe521/node-express-sequelize-mysql

2. 创建完成后 - 如何拉取源码?

3. 安装 Git 插件 - 系统管理 - 插件管理 - Available Plugins

输入 Git 选择第一个

  1. 插件安装进度-勾选-安装完成后重启 Jenkins

如果这一步没有自动重启 安装完成后手动重启

bash
docker ps
bash
docker restart [container_id]

5. 重启 Jenkins 后 - 重新进入 刚刚创建的 Jenkins 任务

源码管理 的地方 将会多出一个 Git - 选中它

6. 拷贝项目地址-https-复制

https://gitee.com/fe521/node-express-sequelize-mysql

https://gitee.com/fe521/node-express-sequelize-mysql.git

7. 保存任务

8. 点击 立即构建

9. 查看控制台输出-日志信息

十四、Jenkins 拉取私有仓库 - 凭据配置

1. 创建一个私有仓库 - vite + vue3 项目

alt text

alt text

2. 拉取代码 - 失败

dashborad -> 新建任务

alt text

创建任务

alt text

源码管理 - 点击 Git

alt text

alt text

3. 配置凭据 - 用户名和密码的方式

alt text

alt text

alt text

alt text

十五、配置 Node.js 环境 - 打包 vite + vue3 项目

1. 安装 Node.js 插件

  1. 系统管理
  2. 插件管理
  3. Available plugins
  4. 输入“nodejs”
  5. 选中 checkbox
  6. 右上角 点击 “安装”

alt text

  1. 安装完成 - 重新启动 docker Jenkins

alt text

2. 全局配置 Node.js 版本

  1. 系统管理

  2. 全局工具配置

alt text

  1. 往下滚动 找到 “NodeJS 安装”

alt text

https://registry.npmmirror.com/binary.html?path=node/

alt text

3. Jenkins 任务 - 配置 Node.js 环境

  1. 构建环境

  2. 勾选 Provide Node & npm bin/ folder to PATH

alt text

  1. 测试 nodejs 环境是否生效

alt text

  1. 查看日志

alt text

4. 执行打包命令 - npm run build

alt text

5. 使用 tar 命令压缩 ./dist 目录

  1. 把 ./dist 文件夹压缩为 dist.tar.gz
bash
tar zcvf dist.tar.gz ./dist
  1. 把 dist.tar.gz 文件夹解压到 ./rtd 文件夹中
bash
tar zxvf dist.tar.gz -C ./dist

十六、把打包好的文件 - 使用 ssh 拷贝到远程服务器

1. 介绍本地如何拷贝一个文件到远程服务器

拷贝文件到远程服务器通常涉及使用网络传输协议,如 SSH(Secure Shell)的 SCP(Secure Copy Protocol)或者 SFTP(SSH File Transfer Protocol)。对于 Windows PowerShell 和 Mac 终端,方法略有不同,以下是每个平台的基本步骤。

在 Windows PowerShell 中使用 SCP

在 Windows 上,如果你没有内置的 SCP 命令,你可能需要安装一个像是 PuTTY 或 WinSCP 的第三方程序来提供 SCP 功能。

从 Windows 10 版本 1809 开始,你可以安装并使用 Windows 的 OpenSSH 客户端,这将提供 SCP 功能。

以下是使用 Windows PowerShell 通过 SCP 拷贝文件的步骤:

  1. 安装 OpenSSH 客户端(如果尚未安装,一把现在的电脑都安装了,所以这步骤可以忽略):

    • 打开“设置” > “应用” > “应用和功能” > “可选功能”。
    • 点击“添加功能”,然后选择“OpenSSH 客户端”,点击“安装”。
  2. 使用 SCP 命令拷贝文件:

    • 打开 PowerShell。
    • 使用以下命令格式拷贝文件:
      bash
      scp C:\path\to\local\file.txt username@remotehost:/path/to/remote/directory
    • 替换 C:\path\to\local\file.txt 为本地文件路径,username@remotehost 为你的用户名和服务器地址,/path/to/remote/directory 为服务器上的目标路径。

在 Mac 终端中使用 SCP

Mac OS 自带了 SCP 工具,因此你可以直接在终端使用它来拷贝文件到远程服务器。以下是步骤:

  1. 打开终端

  2. 使用 SCP 命令拷贝文件:

    • 输入以下命令:
      bash
      scp /path/to/local/file.txt username@remotehost:/path/to/remote/directory
    • 替换 /path/to/local/file.txt 为你的本地文件路径,username@remotehost 为你的用户名和服务器地址,/path/to/remote/directory 为服务器上的目标路径。

注意

  • 在使用 SCP 命令时,你可能需要输入远程服务器的密码,除非你已经设置了 SSH 密钥认证。
  • 确保远程服务器的 SSH 服务已经启动,并且你有权限访问该服务。
  • 你可以通过添加 -P port_number 来指定 SSH 服务使用的非默认端口,如:scp -P 2222 /path/to/file.txt username@remotehost:/remote/path

2. 安装 ssh-agent 插件

  1. Dashboard - 系统管理 - 插件管理

alt text

  1. 安装完成后 记得重启 Jenkins

3. Jenkins 任务中 - 配置 - ssh agent 插件

  1. 本地生成密钥对

输入下面命令 连续多次回车即可

bash
ssh-keygen -o -f ./id_rsa
powershell
PS C:\Users\Administrator\Documents\mycode\aly_jenkins> ssh-keygen -o -f ./id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./id_rsa
Your public key has been saved in ./id_rsa.pub
The key fingerprint is:
SHA256:6fhGKlzOR8kkJXfKgoHnoZC2mZ9/nW/SQ0J+j7nRHqU administrator@DESKTOP-O05GRPI
The key's randomart image is:
+---[RSA 3072]----+
| . .             |
|o.. + . o .      |
|..++ + = o       |
| +. o o +o       |
|  . .  =S.     . |
|   o  .o=o o. o  |
|   ..+.+o *.+E   |
|    o.+oo+ *o..  |
|     ..o. +oo.   |
+----[SHA256]-----+
PS C:\Users\Administrator\Documents\mycode\aly_jenkins>
PS C:\Users\Administrator\Documents\mycode\aly_jenkins>

alt text

  1. 把公钥(id_rsa.pub)拷贝到远程服务器中
bash
scp ./id_rsa.pub root@remotehost:~
bash
# 登录云服务器
PS C:\Users\Administrator\Documents\mycode\aly_jenkins> ssh root@remotehost
The authenticity of host 'wx.mrlishaohai.com (101.42.150.216)' can't be established.
ECDSA key fingerprint is SHA256:UZ+XBZmUmvcuyzbKyKhlDLucZMb7ktr4GdAbGMhJ4oA.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'wx.mrlishaohai.com,101.42.150.216' (ECDSA) to the list of known hosts.
root@remotehost's password:
Last login: Wed Jun  1 19:19:58 2022 from 114.241.244.79
# 查看是否有刚刚复制过来的文件
[root@VM-20-6-centos ~]# ls
id_rsa.pub
# 查看 ~/.ssh/ 目录下是否有 authorized_keys 文件
[root@VM-20-6-centos ~]# ls ~/.ssh/
id_rsa  id_rsa.pub  known_hosts
# 把刚刚 scp 拷贝到云服务器上的公钥 追加 到 当前服务器的 ~/.ssh/authorized_keys 文件上
[root@VM-20-6-centos ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys
# 查看是否追加成功
[root@VM-20-6-centos ~]# cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAA....
# 退出云服务器
[root@VM-20-6-centos ~]# exit
logout
  1. 把私钥拷贝粘贴到凭据中, ssh 凭据

alt text

alt text

4. 修复-执行 ssh 不同主机 - 导致拷贝失败

scp 和 ssh 失败的命令

shell
# 检查Node.js的版本
node -v

# 检查npm的版本
npm -v

# 安装项目依赖
npm install

# 构建项目,通常是编译代码、打包等
npm run build

# 列出当前目录的文件,以确认构建结果
ls

# 将dist目录打包成dist.tar.gz压缩文件
tar zcvf dist.tar.gz ./dist

# 再次列出当前目录的文件,确认压缩文件已创建
ls

# 启动ssh-agent,这个代理会管理SSH私钥,用于无密码登录
eval $(ssh-agent -s)

# 添加私钥到 ssh-agent
ssh-add /ssh-agent/id_rsa

# 将dist.tar.gz文件复制到远端服务器的主目录
# -v 选项提供详细的输出,方便调试
scp -v dist.tar.gz root@ffffee.com:~

# 连接到远程服务器,执行一系列命令,并在完成后退出连接
# "cd ~" 切换到用户的主目录
# "rm -rf dist" 删除dist目录及其内容,确保无旧数据干扰
# "tar zxvf dist.tar.gz -C ./" 解压dist.tar.gz到当前目录,会生成dist目录
# "exit" 退出SSH会话
ssh -v root@ffffee.com "cd ~; rm -rf dist; tar zxvf dist.tar.gz -C ./; exit"

# 结束 ssh-agent 会话
ssh-agent -k

scp 命令介绍

bash
# 使用scp命令将dist.tar.gz文件传输到ffffee.com主机的家目录下,
# 并启用了StrictHostKeyChecking选项进行主机密钥检查,且输出详细调试信息。
scp -o StrictHostKeyChecking=yes -v dist.tar.gz root@ffffee.com:~

# 使用scp命令将dist.tar.gz文件传输到ffffee.com主机的家目录下,
# 并禁用了StrictHostKeyChecking选项进行主机密钥检查,但缺少了空格导致了参数错误。
scp -o StrictHostKeyChecking=no -v dist.tar.gz root@ffffee.com:~

5. 拷贝压缩压缩好的文件到远程服务器

alt text

shell
# 检查Node.js的版本
node -v

# 检查npm的版本
npm -v

# 安装项目依赖
npm install

# 构建项目,通常是编译代码、打包等
npm run build

# 列出当前目录的文件,以确认构建结果
ls

# 将dist目录打包成dist.tar.gz压缩文件
tar zcvf dist.tar.gz ./dist

# 再次列出当前目录的文件,确认压缩文件已创建
ls

# 启动ssh-agent,这个代理会管理SSH私钥,用于无密码登录
eval $(ssh-agent -s)

# 添加私钥到 ssh-agent
ssh-add /ssh-agent/id_rsa

# 将dist.tar.gz文件复制到远端服务器的主目录
# -o StrictHostKeyChecking=yes 选项确保在第一次连接时验证主机的密钥
# -v 选项提供详细的输出,方便调试
scp -o StrictHostKeyChecking=yes -v dist.tar.gz root@ffffee.com:~

# 连接到远程服务器,执行一系列命令,并在完成后退出连接
# "cd ~" 切换到用户的主目录
# "rm -rf dist" 删除dist目录及其内容,确保无旧数据干扰
# "tar zxvf dist.tar.gz -C ./" 解压dist.tar.gz到当前目录,会生成dist目录
# "exit" 退出SSH会话
ssh -o StrictHostKeyChecking=yes -v root@ffffee.com "cd ~; rm -rf dist; tar zxvf dist.tar.gz -C ./; exit"

# 结束 ssh-agent 会话
ssh-agent -k

alt text

远程服务器效果

alt text

6. 执行 docker 命令-自动化部署

十七、Gitee Webhook 自动化部署

1. 什么是 Git Webhook

Git Webhook 是一种自动化机制,用于在 Git 仓库发生特定事件(如代码提交、分支合并等)时触发自定义的 HTTP 回调。这些 Webhook 可以配置为向外部系统或服务发送通知,从而自动启动一系列响应动作,例如自动部署、持续集成、测试或其他自定义的脚本任务。

2. 配置 Webhook

Gitee 如何配置 webhook

在 Gitee(一个基于 Git 的代码托管平台)配置 webhook 的步骤如下:

  1. 登录并选择项目: 首先,你需要登录到 Gitee 平台并选择你想要配置 webhook 的项目。

  2. 进入项目设置: 在项目主页上,找到并点击“设置”选项。

  3. 管理 Webhooks: 在设置菜单中,选择“Webhooks”选项,这将带你到 webhook 管理页面。

  4. 添加 Webhook: 点击“增加 Webhook”按钮来创建一个新的 webhook。

  5. 配置 Webhook: 在添加 webhook 的页面,你需要填写一些必要的信息:

    • URL: 输入接收 webhook HTTP 请求的服务器地址。
    • 触发事件: 选择你希望触发 webhook 的事件类型,例如推送(push)、合并请求(merge request)等。
    • 密钥(可选): 如果需要,你可以设置一个密钥,以便接收方验证接收到的 HTTP 请求的真实性。
    • 推送类型: 通常可以选择 JSON 或者 Form 格式。
  6. 保存并测试: 完成配置后,保存设置。Gitee 允许你发送测试钩子来验证配置是否正确。

Jenkins 配置 webhook

3. git push 提交代码 -实现自动化部署

十八、Jenkins 流水线配置

1. 安装 PipelineJenkins Pipeline 插件

alt text

alt text

2. 安装 Pipeline Stage view 插件 (阶段视图)

alt text

3. 三个插件安装完成

alt text

alt text

4. 重启 Jenkins

alt text

5. 配置流水线任务

alt text

6. Jenkinsfile

一个基本的 Jenkinsfile 结构,它包括环境设置、阶段定义和执行 Shell 脚本命令的步骤。

groovy
pipeline {
    agent any // 定义在任何可用的代理上执行

    // tools {
    //     nodejs 'node-configured-in-jenkins'
    // }
    tools {
        // 名称一定要和
        nodejs 'NodeJS 中国镜像'
    }
    environment {
        SSH_CREDENTIALS_ID = '41083f70-508d-42d2-822e-4fb406c060e4' // 定义SSH凭证的ID
    }

    stages {


        stage('Checkout') {
            steps {
                // 从 Git 获取源代码
                checkout scm
            }
        }
        stage('Prepare') {
            steps {
                // 检查Node.js和npm的版本,安装依赖,构建项目
                script {
                    sh 'node -v'
                    sh 'npm -v'
                    sh 'npm install'
                    sh 'npm run build'
                    sh 'ls' // 列出文件确认构建结果
                }
            }
        }
        stage('Package') {
            steps {
                // 打包构建结果
                sh 'tar zcvf dist.tar.gz ./dist'
                sh 'ls' // 再次列出文件确认压缩文件已创建
            }
        }
        stage('Deploy') {
            steps {
                // 使用ssh-agent插件自动处理SSH密钥
                sshagent(credentials: [env.SSH_CREDENTIALS_ID]) {
                    // 复制文件到远端服务器并执行远程命令
                    sh 'scp -o StrictHostKeyChecking=yes -v dist.tar.gz root@ffffee.com:~'
                    sh '''
                        ssh -o StrictHostKeyChecking=yes -v root@ffffee.com "cd ~; rm -rf dist; tar zxvf dist.tar.gz -C ./; exit"
                    '''
                }
            }
        }
    }

    post {
        always {
            // 构建完成后的清理工作
            echo 'Cleaning up...'
        }
    }
}

解释:

  1. agent any - 指示 Jenkins 在任何可用的代理上执行这个 Pipeline。
  2. environment - 定义环境变量,例如 SSH 凭证的 ID。
  3. stage('Prepare') - 准备阶段,运行 Node.js 相关命令,包括版本检查、依赖安装和项目构建。
  4. stage('Package') - 打包阶段,将构建结果打包成 tar.gz 文件。
  5. stage('Deploy') - 部署阶段,使用 ssh-agent 和 scp 命令将包传输到远程服务器并执行相关命令。
  6. post { always { ... }} - 不论构建成功还是失败,总会执行的步骤,用于执行清理任务。

注意事项:

  • 确保 Jenkins 有安装和配置必需的插件,如 SSH Agent 插件。
  • 确保已经在 Jenkins 的凭证系统中正确配置了 SSH 密钥,并正确设置了环境变量 SSH_CREDENTIALS_ID
  • 在实际部署之前,检查远程服务器的权限和路径设置,确保 Jenkins 用户有权限执行这些操作。

alt text

7. 项目中如何配置 Jenkinsfile

alt text