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 安装 docker、docker compose, 版本信息如下

当然可以比我的版本更高

安装 docker 、docker 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_HOST,VIRTUAL_PORT,aly_username,txy_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. 安装 Pipeline和Jenkins 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