在 Ubuntu 系统上使用 Jenkins 构建和打包后的 dist 文件发布到服务器指定目录,可以通过以下步骤实现。我们将使用 Jenkins 自带的构建后操作(Post-build Actions)来实现这个功能,或者使用脚本进行发布。
步骤 1: 安装 Jenkins 和配置工作空间
首先,确保 Jenkins 已安装并能够正确构建项目。你可以在 Jenkins 中使用 Pipeline 或 Freestyle Project 构建任务。
- 在 Jenkins 中创建一个新的任务(例如:
Freestyle Project或Pipeline)。 - 配置源代码管理,拉取代码,执行构建步骤并生成
dist文件(例如,通过运行npm run build或mvn package,具体取决于你使用的构建工具)。
步骤 2: 配置 Jenkins 构建后操作
方法 1: 使用 Post-build Actions(推荐)
- 在 Jenkins 项目配置页面中,找到 Post-build Actions 部分。
- 点击 Add post-build action,选择 Send build artifacts over SSH(如果安装了该插件)或者选择 Execute shell 来使用脚本发布文件。
选项 1:使用 SSH 插件
你可以使用 Jenkins 的 Publish Over SSH 插件将文件发布到远程服务器指定目录。
-
安装 Publish Over SSH 插件:
- 在 Jenkins 中,点击
Manage Jenkins>Manage Plugins,在 Available 标签页中搜索Publish Over SSH,然后安装它。
- 在 Jenkins 中,点击
-
配置 SSH 连接:
- 在 Jenkins 配置页面,点击
Manage Jenkins>Configure System,找到 Publish over SSH 部分,配置远程服务器的 SSH 连接信息(例如,主机、用户名、密码或密钥文件)。
- 在 Jenkins 配置页面,点击
在 Jenkins 的 Publish Over SSH 插件配置中,要求提供 SSH 密钥(Private Key)来连接远程服务器。如果你不确定自己的 SSH 密钥在哪里或如何生成,可以参考以下步骤来创建和使用 SSH 密钥:
1. 检查是否已有 SSH 密钥
首先,检查你的机器上是否已经有一个 SSH 密钥对。通常,SSH 密钥存储在你的 ~/.ssh/ 目录下。
-
打开终端,输入以下命令:
ls -al ~/.ssh/你应该能看到类似以下的文件:
id_rsa(私钥)id_rsa.pub(公钥)
如果这些文件已经存在,你可以使用这些密钥。如果没有密钥对,需要创建一个。
2. 生成新的 SSH 密钥对
如果你没有现有的 SSH 密钥对,或者你想创建一个新的密钥对,可以通过以下步骤生成:
-
打开终端,并运行以下命令生成一个新的密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -
在提示下,选择文件保存位置,通常是默认的
~/.ssh/id_rsa。如果你不想覆盖现有的密钥,可以选择一个不同的文件名。 -
系统会要求你输入 passphrase(密码短语),可以选择留空(即没有密码短语)或设置一个密码短语。这个密码短语是保护私钥的,但对于 Jenkins 来说,它是可选的。
3. 配置 Jenkins 使用 SSH 密钥
在生成或确认已有的 SSH 密钥对后,你可以将密钥配置到 Jenkins 中的 Publish Over SSH 插件中。
3.1 复制私钥
-
找到生成的私钥文件(默认是
~/.ssh/id_rsa)。 -
打开文件并复制其中的内容:
cat ~/.ssh/id_rsa复制输出的整个内容(包括
-----BEGIN OPENSSH PRIVATE KEY-----和-----END OPENSSH PRIVATE KEY-----)。
3.2 配置 Jenkins
- 在 Jenkins 上,进入 Manage Jenkins > Configure System。
- 在 Publish over SSH 配置部分:
- Key:将复制的私钥内容粘贴到此文本框中。
- Passphrase:如果你的私钥设置了密码短语,输入密码短语。如果没有密码短语,可以留空。
- 保存设置。
3.3 配置远程主机
-
在 Publish Over SSH 插件的配置页面中,添加远程服务器的 SSH 连接信息:
- Name:给你的远程主机起个名字。
- Hostname:远程服务器的 IP 地址或主机名。
- Username:远程服务器的 SSH 用户名。
- Remote Directory:你希望将文件发布到的目标目录路径。
-
确保你能从 Jenkins 机器上通过 SSH 连接到目标服务器。可以在 Jenkins 服务器上通过以下命令测试连接:
ssh username@server_ip如果你可以成功连接,说明 SSH 配置正确。
4. 将 SSH 公钥添加到远程服务器
Jenkins 使用私钥连接远程服务器时,需要在远程服务器上配置公钥。假设你使用的是默认的 id_rsa 密钥对,则公钥通常是 ~/.ssh/id_rsa.pub 文件。
-
获取公钥:
cat ~/.ssh/id_rsa.pub -
将公钥添加到远程服务器:
在远程服务器上,打开
~/.ssh/authorized_keys文件(如果没有该文件,可以创建一个):nano ~/.ssh/authorized_keys将公钥粘贴到文件中并保存。
-
设置适当的权限:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
5. 测试 Jenkins 配置
保存所有配置后,回到 Jenkins 项目配置页,在 Post-build Actions 部分添加 Send build artifacts over SSH,并设置好源文件和目标目录。然后运行构建任务,验证文件是否正确发布到远程服务器。
总结
- 私钥:你可以通过
~/.ssh/id_rsa找到或生成私钥。 - 公钥:你可以通过
~/.ssh/id_rsa.pub找到公钥,并将其添加到远程服务器的authorized_keys文件中。 - 在 Jenkins 配置中,将私钥粘贴到 Publish over SSH 插件的配置中,并确保 Jenkins 机器能够通过 SSH 成功连接到远程服务器。
-
配置发布文件:
- 在构建后操作中选择 Send build artifacts over SSH,配置以下选项:
- Source files: 输入你要发布的文件路径,例如:
dist/**/*,表示发布所有dist目录下的文件。 - Remote directory: 输入目标服务器上的目录路径,例如:
/var/www/myapp。 - Exec command: 可以在发布后执行额外的命令,如重启服务等(如果需要的话)。
- Source files: 输入你要发布的文件路径,例如:
- 在构建后操作中选择 Send build artifacts over SSH,配置以下选项:
-
保存 Jenkins 配置,运行构建任务。构建完成后,
dist文件将通过 SSH 被复制到远程服务器。
选项 2:使用 Execute shell 脚本
如果你希望手动控制发布过程,可以使用 shell 脚本。
-
在 Post-build Actions 中选择 Execute shell。
-
编写脚本来将构建产物复制到目标服务器,例如使用
scp命令:#!/bin/bash # 假设 dist 文件位于当前工作目录下 DIST_DIR=dist SERVER_USER=username SERVER_HOST=server_ip REMOTE_DIR=/var/www/myapp # 使用 SCP 上传文件到远程服务器 scp -r $DIST_DIR/* $SERVER_USER@$SERVER_HOST:$REMOTE_DIR # 可以选择重启服务器或相关服务 ssh $SERVER_USER@$SERVER_HOST "systemctl restart myapp"这里,
scp将dist目录中的所有文件上传到目标服务器,ssh用于重启服务(如果需要的话)。 -
保存配置并运行构建。
方法 2: 使用 Jenkins Pipeline(更灵活)
如果你使用 Pipeline,可以在 Pipeline 脚本中直接执行文件传输操作。
-
在 Jenkins 中创建一个 Pipeline 项目。
-
在
Jenkinsfile中,使用以下代码进行文件上传:pipeline { agent any stages { stage('Build') { steps { // 构建过程,生成 dist 文件 sh 'npm run build' } } stage('Deploy') { steps { script { // 使用 SCP 上传文件到远程服务器 sh ''' scp -r dist/* username@server_ip:/var/www/myapp ''' } } } } }在这个例子中,
scp命令被用来将dist目录下的文件上传到远程服务器。 -
保存
Jenkinsfile后,Jenkins 会根据这个脚本执行构建和部署操作。
步骤 3: 确认远程服务器上的文件
在部署后,你可以登录到远程服务器,确认 dist 文件是否已成功上传到指定目录。
cd /var/www/myapp
ls -l
如果文件在正确的目录下,说明部署成功。
其他方法
- FTP: 如果你使用的是 FTP 服务器,也可以通过 Jenkins 插件或脚本将文件上传到 FTP 服务器。
- Docker: 如果你的应用运行在 Docker 中,可以通过 Jenkins 构建 Docker 镜像并推送到 Docker Registry,然后在服务器上拉取并运行新镜像。
总结
根据你的需求,你可以选择 Publish Over SSH 插件或 Execute shell 脚本将 Jenkins 构建后的文件发布到指定目录。这两种方法都能有效地将 dist 文件发布到远程服务器上。