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

时间:2018-04-12 16:18:40

标签: node.js jenkins deployment gitlab

这是节点应用程序目录的根目录中的Jenkins文件:

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

我将Jenkins配置为连接到远程gitlab节点proj repo以与Jenkinsfile一起检出节点项目并运行项目的Jenkins文件。这部分工作正常,但现在要做什么(请注意,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 个答案:

答案 0 :(得分:6)

我建议我们可以在这种情况下使用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软件包。

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

源代码管理

enter image description here

构建触发器

enter image description here

<强>构建

enter image description here

#!/bin/bash -el
cd $JENKINS_HOME/app-deploy/app-socketio
rocketeer deploy --on="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,
    ],
],

pm2 file

运行hooks.php命令行configure
'after'  => [
    'setup'   => [],
    'deploy'  => [
            "pm2 delete mynodeproj", //Delete old pm2 task
            "pm2 start src/mynodeproj.js", //Start new mynodeproj
    ],
    'cleanup' => [],
],

希望这可以帮到你!!

答案 1 :(得分:4)

  

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

这些命令应该位于Git仓库的文件部分,这意味着在管道使用的工作区中检出。

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

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

并通过ssh执行它,前提是远程用户的私钥/公钥部署在代理上(或通过ssh-agent plugin传递):

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

然而,作为mentioned here,诀窍是ssh会话的PATH相当有限,如果节点安装在标准路径中,则可能不包括节点{ {1}}。
因此,您可能希望修改脚本,以便为可执行文件使用绝对路径(如/usr/bin

答案 2 :(得分:4)

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

最简单的解决方案

1.使用Jenkins文件

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

enter image description here 添加SSH服务器

  • 源文件:提及您要传输的文件(** / * .war take 仅限WAR文件)
  • 删除前缀:target(WAR文件通常是 位于目标文件夹中,所以我告诉我不想要目标 文件夹只能复制我的WAR)
  • 远程目录:留空( 因为你从你的项目中获取它)
  • 执行命令:复制文件后执行的命令(如启动tomcat或解压缩任何属性文件并放置在特定位置 - 在您的情况下是从服务器启动节点的命令)

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

enter image description here

2.通过SSH发布

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

enter image description here

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配置Jenkins Under Publish,你可以测试你的连接。

enter image description here

希望这很有用:)

答案 3 :(得分:1)

您可能需要考虑使用ansible执行此操作,然后从以下位置调用您的ansible playbook:Build - &gt;执行Shell

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

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