首页 文章

如何从Jenkins将节点应用程序部署到远程主机?

提问于
浏览
10

这是节点app目录的根目录中的Jenkins文件:

pipeline {
    agent any
    triggers {
        pollSCM('* * * * *')
    }
    stages {
        stage("deploy") {
            steps {
            sh "scp"
            }
        }
    } 
}

我将Jenkins配置为连接到远程gitlab节点proj repo以与Jenkinsfile一起检出节点项目并运行项目的Jenkinsfile . 这部分工作正常,但现在要做什么(注意Jenkins服务器和运行节点js的服务器以及gitlab repo彼此都是远程的):

run these commands on remote server on which node app is running

cd ~/mynodeproj 

pm2 stop mynodeproj 

copy project source files from Jenkins server to remote server where 
node app is running 

npm install 

export NODE_ENV=production 

pm2 start mynodeproj

怎么做到这一点?

我是否需要在运行jenkins的服务器上设置私有/公共密钥对,以便jenkins服务器可以执行scp将文件复制到运行节点应用程序的远程服务器?

4 回答

  • 5

    我建议我们可以在这种情况下使用Rocketeer .

    这是我的Jenkins Server for NodeJS App上的 Rocketeer

    $ tree .rocketeer/
    .rocketeer/
    ├── config.php
    ├── hooks.php
    ├── logs
    │   ├── develop--20170613.log
    │   ├── develop--20170614.log
    │   ├── develop--20170616.log
    │   ├── staging--20180323.log
    │   ├── staging--20180324.log
    │   ├── staging--20180326.log
    │   ├── production--20180223.log
    │   ├── production--20180226.log
    │   ├── production--20180227.log
    │   ├── production--20180227.log
    │   └── custom-environment--20180328.log
    ├── paths.php
    ├── remote.php
    ├── scm.php
    ├── stages.php
    └── strategies.php
    
    • 您可以管理NodeJS App的远程环境:开发,分段, 生产环境 (在 config.php 文件中)

    • 它将在您的Gitlab上提取最新的源代码,并保留发布版本,如 Capistrano (在 remote.php 文件中)

    • 在部署最新源代码后可以运行 pm2 command line (在 hooks.php 文件中)

    • 已经帮助运行 npm install NodeJS包 .


    所以这是我的詹金斯工作设置:

    Source Code Management

    Build Triggers

    Build

    #!/bin/bash -el
    cd $JENKINS_HOME/app-deploy/app-socketio
    rocketeer deploy --on="develop"
    

    develop 表示连接到开发远程服务器(在 .rocketeer\config.php 文件中)

    'connections'      => [
        'develop' => [
            'host'      => '35.xx.xx.xx',
            'username'  => 'ec2-user',
            'password'  => '',
            'key'       => '/var/lib/jenkins/.ssh/foo.pem',
            'keyphrase' => '',
            'agent'     => '',
            'db_role'   => true,
        ],
        'staging' => [
            'host'      => '34.xx.xx.xx',
            'username'  => 'ec2-user',
            'password'  => '',
            'key'       => '/var/lib/jenkins/.ssh/bar.pem',
            'keyphrase' => '',
            'agent'     => '',
            'db_role'   => true,
    
        ],
        'production' => [
            'host'      => '18.xx.xx.xx:63612',
            'username'  => 'ec2-user',
            'password'  => '',
            'key'       => '/var/lib/jenkins/.ssh/woot.pem',
            'keyphrase' => '',
            'agent'     => '',
            'db_role'   => true,
        ],
        'custom-environment' => [
            'host'      => '13.xx.xx.xx:63612',
            'username'  => 'ec2-user',
            'password'  => '',
            'key'       => '/var/lib/jenkins/.ssh/test.pem',
            'keyphrase' => '',
            'agent'     => '',
            'db_role'   => true,
        ],
    ],
    

    并在 hooks.php 文件中运行 pm2 命令行configure

    'after'  => [
        'setup'   => [],
        'deploy'  => [
                "pm2 delete mynodeproj", //Delete old pm2 task
                "pm2 start src/mynodeproj.js", //Start new mynodeproj
        ],
        'cleanup' => [],
    ],
    

    希望这可以帮到你!!

  • 3

    现在要做什么(请注意,Jenkins服务器和运行节点js的服务器以及gitlab repo都彼此远程):

    这些命令应该在Git仓库的文件中,这意味着在管道使用的工作空间中检出 .

    从那里,您可以将该脚本scp到服务器:

    sh 'scp -r script user@server:/path/server'
    

    如果远程用户的私钥/公钥部署在代理上(或通过ssh-agent plugin传递),则通过ssh执行:

    sh 'ssh user@server /path/server/script'
    

    但是,作为mentioned here,诀窍是ssh会话的PATH相当有限,如果节点没有安装在像 /usr/bin 这样的标准路径中,则可能不包括节点 .
    因此,您可能希望修改脚本以便为可执行文件使用绝对路径(如 /absolute/path/to/node

  • 3

    Your question is how to deploy your application to remote host from jenkins

    最简单的解决方案

    1.using Jenkins File

    如果你使用管道项目,那么你会注意到一个Pipeline Syntax选项,只需选择ssh Publisher:通过SSH发送工件(你需要通过SSH插件发布插件)

    添加SSH服务器

    • 源文件:提及您要传输的文件(** / * .war仅接受WAR文件)

    • 删除前缀:target(WAR文件通常位于目标文件夹中,因此我希望目标文件夹只能复制到我的WAR)

    • 远程目录:将其留空(因为您从项目中获取)

    • Exec命令:复制文件后要执行的命令(如启动tomcat或解压缩任何属性文件并放置在特定位置 - 在您的情况下是从服务器启动节点的命令)

    最后只需单击Generate Pipeline Script和BOOM,即可获得脚本(内部执行scp),只需将其复制并粘贴到Pipeline文件中即可完成:)

    2.Publish over SSH

    您可以在Post Build Action中的普通Jenkins项目中执行相同的操作(仅按照上述步骤添加详细信息)如果您没有管道项目(如果您没有/知道管道项目,则有帮助)

    Do I need to setup private/public keypair on server running jenkins so that jenkins server can do scp to copy file to remote server running node app?

    是必需的(推荐)您可以在管理Jenkins下的Jenkins中添加如下所示的deatils,通过SSH在Publish上配置Jenkins,您可以测试您的连接 .

    希望这很有用:)

  • 1

    您可能需要考虑使用ansible执行此操作,并从以下位置调用您的ansible playbook:Build - > Execute Shell

    https://dzone.com/articles/running-ansible-playbooks-from-jenkins

    您可以使用ansible管理所有远程环境 .

相关问题