web-dev-qa-db-ja.com

Jenkinsからリモートホストにノードアプリをデプロイする方法は?

これは、ノードアプリディレクトリのルートにある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を実行しているサーバーに秘密鍵/公開鍵のペアを設定する必要がありますか?

11
ace

この場合は 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
  • NodeJSアプリのリモート環境を管理できます:開発、ステージング、本番(config.phpファイル)
  • Gitlabで最新のソースコードを取得し、Capistranoremote.phpファイル)のようなリリースバージョンを保持します
  • 最新のソースコードをデプロイした後、pm2 command lineを実行できます(hooks.phpファイルにあります)
  • npm install NodeJSパッケージの実行に既に役立ちます。

これが私のJenkinsジョブ設定です:

ソースコード管理

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"

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' => [],
],

これがあなたを助けることを願っています!!

6

ここで実行すること(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など)

4
VonC

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

最も簡単な解決策

1.Jenkinsファイルの使用

パイプラインプロジェクトを使用している場合は、パイプライン構文オプションが表示されます。sshパブリッシャーを選択するだけです。SSH経由でアーティファクトを送信します(プラグインはSSHプラグイン経由で公開する必要があります)。

enter image description here SSHサーバーを追加

  • ソースファイル:転送するファイルのメンション(**/*。warはWARファイルのみを受け取ります)
  • 接頭辞を削除:ターゲット(WARファイルは通常、ターゲットフォルダーに配置されるため、ターゲットフォルダーを自分のWARだけにコピーしたくない)
  • リモートディレクトリ:空白のままにします(プロジェクトから取得するため)
  • 実行コマンド:ファイルをコピーした後に実行するコマンド(Tomcatを起動したり、プロパティファイルを解凍して特定の場所に配置したりする場合-サーバーからノードを起動するコマンド)

最後に、[Generate Pipeline Script and BOOM]をクリックするだけで、スクリプトが取得され(内部的にscpが実行されます)、コピーしてパイプラインファイルに貼り付けるだけで完了です。

enter image description here

2.SSH経由で公開

パイプラインプロジェクトがない場合は、ビルド後のアクションの通常の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の[Manage Jenkins]、[Configure Jenkins Under SSH over SSH]で詳細を追加して、接続をテストできます。

enter image description here

これがお役に立てば幸いです:)

4
rohit thomas

これをansibleで行うことを検討し、次の場所からansibleプレイブックを呼び出すだけです:ビルド->シェルの実行

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

すべてのリモート環境を管理できます。

1
runwuf