这是节点应用程序目录的根目录中的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将文件复制到运行节点应用程序的远程服务器?
答案 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
config.php
文件)Capistrano
的版本(remote.php
文件)pm2 command line
文件)之后,它可以运行您的hooks.php
npm install
NodeJS软件包。所以这是我的詹金斯工作设置:
源代码管理
构建触发器
<强>构建强>
#!/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插件发布插件)
最后,只需单击Generate Pipeline Script和BOOM,即可获得脚本(内部执行scp),只需将其复制并粘贴到Pipeline文件中即可完成:)
2.通过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配置Jenkins Under Publish,你可以测试你的连接。
希望这很有用:)
答案 3 :(得分:1)
您可能需要考虑使用ansible执行此操作,然后从以下位置调用您的ansible playbook:Build - &gt;执行Shell
https://dzone.com/articles/running-ansible-playbooks-from-jenkins
您可以使用ansible管理所有远程环境。