これは、ノードアプリディレクトリのルートにあるJenkinsファイルです。
pipeline {
agent any
triggers {
pollSCM('* * * * *')
}
stages {
stage("deploy") {
steps {
sh "scp"
}
}
}
}
リモートのgitlabノードprojリポジトリに接続してJenkinsfileとともにノードプロジェクトをチェックアウトし、プロジェクトのJenkinsfileを実行するようにJenkinsを構成しました。この部分は問題なく機能しますが、次に実行すること(Jenkinsサーバーとノードjsが実行されているサーバー、およびgitlabリポジトリはすべて互いにリモートであることに注意してください):
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サーバーがscpを実行してノードアプリを実行しているリモートサーバーにファイルをコピーできるように、jenkinsを実行しているサーバーに秘密鍵/公開鍵のペアを設定する必要がありますか?
この場合は Rocketeer を使用できることをお勧めします。
これが私のJenkins Server for NodeJSアプリの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パッケージの実行に既に役立ちます。これが私のJenkinsジョブ設定です:
ソースコード管理
ビルドトリガー
ビルド
#!/bin/bash -el
cd $JENKINS_HOME/app-deploy/app-socketio
rocketeer deploy --on="develop"
developは、Develop Remote Server(at .rocketeer\config.php
file)に接続することを意味します
'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
コマンドライン設定をhooks.php
ファイルで実行します
'after' => [
'setup' => [],
'deploy' => [
"pm2 delete mynodeproj", //Delete old pm2 task
"pm2 start src/mynodeproj.js", //Start new mynodeproj
],
'cleanup' => [],
],
これがあなたを助けることを願っています!!
ここで実行すること(Jenkinsサーバーとノードjsが実行されているサーバー、およびgitlabリポジトリはすべて互いにリモートであることに注意してください):
これらのコマンドは、Gitリポジトリのファイル部分にある必要があります。つまり、パイプラインで使用されるワークスペースでチェックアウトされます。
そこから、そのスクリプトをサーバーにscpできます。
sh 'scp -r script user@server:/path/server'
リモートユーザーの秘密鍵/公開鍵がエージェントにデプロイされている(または ssh-agentプラグイン で渡されている)場合は、sshを使用して実行します。
sh 'ssh user@server /path/server/script'
ただし、トリックは ここで説明 のように、sshセッションのPATHはかなり制限されており、ノードがでない場合、ノードが含まれていない可能性があります/usr/bin
などの標準パスにインストールされます。
そのため、実行可能ファイルにabsoluteパスを使用するためにスクリプトを変更することができます(/absolute/path/to/node
など)
Your question is how to deploy your application to remote Host from jenkins
最も簡単な解決策
1.Jenkinsファイルの使用
パイプラインプロジェクトを使用している場合は、パイプライン構文オプションが表示されます。sshパブリッシャーを選択するだけです。SSH経由でアーティファクトを送信します(プラグインはSSHプラグイン経由で公開する必要があります)。
最後に、[Generate Pipeline Script and BOOM]をクリックするだけで、スクリプトが取得され(内部的にscpが実行されます)、コピーしてパイプラインファイルに貼り付けるだけで完了です。
2.SSH経由で公開
パイプラインプロジェクトがない場合は、ビルド後のアクションの通常の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の[Manage Jenkins]、[Configure Jenkins Under SSH over SSH]で詳細を追加して、接続をテストできます。
これがお役に立てば幸いです:)
これをansibleで行うことを検討し、次の場所からansibleプレイブックを呼び出すだけです:ビルド->シェルの実行
https://dzone.com/articles/running-ansible-playbooks-from-jenkins
すべてのリモート環境を管理できます。