Ubuntu Jenkins 构建后把已打包项目 发送到服务器

641 阅读7分钟

在 Ubuntu 系统上使用 Jenkins 构建和打包后的 dist 文件发布到服务器指定目录,可以通过以下步骤实现。我们将使用 Jenkins 自带的构建后操作(Post-build Actions)来实现这个功能,或者使用脚本进行发布。

步骤 1: 安装 Jenkins 和配置工作空间

首先,确保 Jenkins 已安装并能够正确构建项目。你可以在 Jenkins 中使用 PipelineFreestyle Project 构建任务。

  • 在 Jenkins 中创建一个新的任务(例如:Freestyle ProjectPipeline)。
  • 配置源代码管理,拉取代码,执行构建步骤并生成 dist 文件(例如,通过运行 npm run buildmvn package,具体取决于你使用的构建工具)。

步骤 2: 配置 Jenkins 构建后操作

方法 1: 使用 Post-build Actions(推荐)

  1. 在 Jenkins 项目配置页面中,找到 Post-build Actions 部分。
  2. 点击 Add post-build action,选择 Send build artifacts over SSH(如果安装了该插件)或者选择 Execute shell 来使用脚本发布文件。
选项 1:使用 SSH 插件

你可以使用 Jenkins 的 Publish Over SSH 插件将文件发布到远程服务器指定目录。

  1. 安装 Publish Over SSH 插件:

    • 在 Jenkins 中,点击 Manage Jenkins > Manage Plugins,在 Available 标签页中搜索 Publish Over SSH,然后安装它。
  2. 配置 SSH 连接:

    • 在 Jenkins 配置页面,点击 Manage Jenkins > Configure System,找到 Publish over SSH 部分,配置远程服务器的 SSH 连接信息(例如,主机、用户名、密码或密钥文件)。

在 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 密钥对,或者你想创建一个新的密钥对,可以通过以下步骤生成:

  1. 打开终端,并运行以下命令生成一个新的密钥对:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    
  2. 在提示下,选择文件保存位置,通常是默认的 ~/.ssh/id_rsa。如果你不想覆盖现有的密钥,可以选择一个不同的文件名。

  3. 系统会要求你输入 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

  1. 在 Jenkins 上,进入 Manage Jenkins > Configure System
  2. Publish over SSH 配置部分:
    • Key:将复制的私钥内容粘贴到此文本框中。
    • Passphrase:如果你的私钥设置了密码短语,输入密码短语。如果没有密码短语,可以留空。
  3. 保存设置。

3.3 配置远程主机

  1. Publish Over SSH 插件的配置页面中,添加远程服务器的 SSH 连接信息:

    • Name:给你的远程主机起个名字。
    • Hostname:远程服务器的 IP 地址或主机名。
    • Username:远程服务器的 SSH 用户名。
    • Remote Directory:你希望将文件发布到的目标目录路径。
  2. 确保你能从 Jenkins 机器上通过 SSH 连接到目标服务器。可以在 Jenkins 服务器上通过以下命令测试连接:

    ssh username@server_ip
    

    如果你可以成功连接,说明 SSH 配置正确。

4. 将 SSH 公钥添加到远程服务器

Jenkins 使用私钥连接远程服务器时,需要在远程服务器上配置公钥。假设你使用的是默认的 id_rsa 密钥对,则公钥通常是 ~/.ssh/id_rsa.pub 文件。

  1. 获取公钥

    cat ~/.ssh/id_rsa.pub
    
  2. 将公钥添加到远程服务器

    在远程服务器上,打开 ~/.ssh/authorized_keys 文件(如果没有该文件,可以创建一个):

    nano ~/.ssh/authorized_keys
    

    将公钥粘贴到文件中并保存。

  3. 设置适当的权限:

    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 成功连接到远程服务器。

  1. 配置发布文件:

    • 在构建后操作中选择 Send build artifacts over SSH,配置以下选项:
      • Source files: 输入你要发布的文件路径,例如:dist/**/*,表示发布所有 dist 目录下的文件。
      • Remote directory: 输入目标服务器上的目录路径,例如:/var/www/myapp
      • Exec command: 可以在发布后执行额外的命令,如重启服务等(如果需要的话)。
  2. 保存 Jenkins 配置,运行构建任务。构建完成后,dist 文件将通过 SSH 被复制到远程服务器。

选项 2:使用 Execute shell 脚本

如果你希望手动控制发布过程,可以使用 shell 脚本。

  1. Post-build Actions 中选择 Execute shell

  2. 编写脚本来将构建产物复制到目标服务器,例如使用 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"
    

    这里,scpdist 目录中的所有文件上传到目标服务器,ssh 用于重启服务(如果需要的话)。

  3. 保存配置并运行构建。

方法 2: 使用 Jenkins Pipeline(更灵活)

如果你使用 Pipeline,可以在 Pipeline 脚本中直接执行文件传输操作。

  1. 在 Jenkins 中创建一个 Pipeline 项目。

  2. 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 目录下的文件上传到远程服务器。

  3. 保存 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 文件发布到远程服务器上。