git push(GitHubとnode.js)の後にアプリを自動的にデプロイするにはどうすればよいですか?


92

アプリケーション(node.js)をVPS(linux)にデプロイしました。リポジトリとしてgit hubを使用しています。git pushでアプリケーションを自動的にデプロイするにはどうすればよいですか?


4
gitフックprogit.org/book/ch7-3.htmlを確認しました。また、github help.github.com/test-webhooks
Pawel Dubiel

1
上記のprogitリンクの更新:git-scm.com/book/en/Customizing-Git-Git-Hooks
Code Novitiate

Git 2.10は興味深い機能を追加します:プッシュオプションstackoverflow.com/a/38770670/6309
VonC

回答:


63

PHPの例:

githubリポジトリに移動してgithubリポジトリに移動し、[管理]をクリックします。

「サービスフック」タブをクリックします=>「WebHook URL」

そして追加

http://your-domain-name/git_test.php

次にgit_test.phpを作成します

<?php 
try
{
  $payload = json_decode($_REQUEST['payload']);
}
catch(Exception $e)
{
  exit(0);
}

//log the request
file_put_contents('logs/github.txt', print_r($payload, TRUE), FILE_APPEND);


if ($payload->ref === 'refs/heads/master')
{
  // path to your site deployment script
  exec('./build.sh');
}

build.shには、githubからサイトを取得するための通常のコマンドを配置する必要があります


6
こんにちは、どうもありがとうございました。Bobが配置スクリプトを実行できないのはなぜですか?
高度

16
@Advanced 1多分スクリプトの権限、実行フラグ... 2 PHPで終了タグを追加することは悪い習慣です。
Pawel Dubiel 2013年

3
Bobがスクリプトを実行しないようにする@Advanced Oneの手法は、POSTリクエストがGithubのサーバーからのものであることを確認することです。リクエストを行うときに送信するHTTPヘッダーを確認してください。また、推測できない「秘密の」URLを作成することもできます。
jyap 2014年


1
@ Arius2038「あなたは毎日何か新しいことを学ぶ」と聞いたことがありますか?これは今日の私の「何か新しいもの」です。共有してくれてありがとう!
Purefan

23

回答/コメントとしてのGitフックについての言及がいくつかありましたが、これは過去に私のために機能しました。

私はgit post-receiveフックnode-supervisorの組み合わせを使用して、単純な自動デプロイメントを実現しています(そのマシンでgitリモートリポジトリを使用していると想定しています)。


受信後フックをセットアップする

リポジトリで: sudo vi hooks/post-receive

そしてそれは次のようになります:

#!/bin/sh
GIT_WORK_TREE=/home/path/to/your/www
export GIT_WORK_TREE
git checkout -f

ファイルの権限を設定します。 chmod +x hooks/post-receive

Gitは、リポジトリへのプッシュ後にアプリディレクトリ内のファイルを更新します。


ノードスーパーバイザーでノードを実行する

マシンにグローバルノードモジュールとしてNode-Supervisorをインストールする必要があります。 sudo npm install supervisor -g

次に、node-supervisorを使用してノードアプリを実行するだけで、作業ディレクトリ内のファイルへの変更を監視します。

supervisor /home/path/to/your/www/server.js(のsupervisor代わりに注意してくださいnode)。


これは問題ありませんが、ローカルアプリに新しいnpmを追加する場合は、サーバー上のそのモジュールのnpmインストールも行う必要があることに注意してください。そうしないと、おそらくアプリがクラッシュするでしょう。
k00k

2
いいえ。ローカルアプリが依存するノードモジュールは、プロジェクトのnode_modulesサブディレクトリにインストールされています。これはローカルGITリポジトリです。したがって、追加、コミット、リモートサーバーにプッシュすると、コピーされます。
ウェスジョンソン

8
そうですが、つまり、これらのモジュールのいずれかにコンパイルされたコード(mhashなど)が含まれている場合、そのモジュールは、OSやアーキテクチャが異なる別のサーバーでは実行されない可能性があります。package.jsonを使用して依存関係を追跡npm install -lし、リモートサーバー上で実行するデプロイ戦略が賢明です。もちろん、これはpost-receiveフックを使用してメソッドと組み合わせることができます。
k00k 2012

1
Gitワークツリーをgit checkoutコマンドに直接追加するだけです:git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f(作成するのではなく)変数とスクリプトでのエクスポート
JasonB

問題はGithubです。
ノア

18

おそらくここで返信するのが非常に遅い。しかし、私はgithubでこのプロジェクトを見つけて、あなたがやりたいことをしているように見えますが、はるかにきれいな方法です。

https://github.com/logsol/Github-Auto-Deploy

見てみな。コメントや賛成票の観点から、他の人がこれについてどう思っているかを知ることにも興味があります。

乾杯、
S


15
「おそらくここで返信するには非常に遅い」遅すぎることはありません。:)あなたは実際にコミュニティ全体に貢献しています(私たちのほとんどはグーグルです。うわー、2万回のビューを見ているだけです!)。時間自体は無関係です。問題のテクノロジーが関連している限り、あなたの答えも同様です。(ヒントをありがとう、BTW、チェックアウト...)
Sz。

1
あなたのヘッドアップをありがとう!;)当時はそれでうまくいきました。今、私は自動化されたデプロイメントのために(可能な限り)travis(travis-ci.org)を使用することを好みます。@lunakid
Saurabh Kumar

8

現在開発中のプロジェクトでは、Jez Humbleの素晴らしい本「Continuous Delivery」(よく読む価値があります)に記載されているガイドラインに従います。

これは、何らかの形の継続的インテグレーションサーバー(私はGoの Thoughtworks無料コミュニティエディションを使用しています)を使用してデプロイメントパイプラインを作成することを意味します。その後、デプロイメントパイプラインをたどることができ、本番サーバーにプッシュされます。

これは非常に複雑に聞こえますが、そうである必要はありません。コードを記述するプロセス全体を行い、本番環境に安全に導入して心配する必要がありません(怖いリリース日はありません!)。

私は、ライブシステムの完全な展開パイプラインと、私が作成するnpmモジュールの削減バージョンを使用しており、どちらも同じ1クリックの展開手法を共有しています。


&本の推薦のための別の+1!CIにさりげなくアプローチしないでください。
Merrick、2013年

まあ、人々は簡単な質問をします、あなたは完全な解決策を与えます:)。これはやりすぎだと言わざるを得ません。しかし、すでに継続的デリバリーを使用している場合は、おそらくこれが進むべき道です。
windmaomao 2015年

8

私はあなたの問題に対するノードベースのソリューションを公開しました:node-cd

Vit上で実行されるシンプルなノードアプリで構成され、Github受信後フック受け取り、必要なスクリプトを実行します(たとえば、アプリを強制終了し、Gitプルして再起動するシェルスクリプトなど)。


+1は純粋なnode.jsであるため、投稿者はスタックに何も追加したり、使い慣れていない言語を使用したりする必要がありません。また、非常にうまくレイアウトされたコード
code_monk 14

3

次に、単純なnodeJSの実装を示します。

これは、設定したホスト名とポートで実行される非常にシンプルなノードサーバーであり、GitHubポスト受信Webフックを処理するように設定できます。また、実際のプル/テスト/デプロイアクションは、必要に応じてカスタマイズできます。現在の実装では、nodeJSサーバースクリプトでインラインで指定されているのはシェルコマンドです。また、非常にシンプルなsecret_keyベースのセキュリティスキームも導入されています。

https://github.com/shyam-habarakada/rscds

私のステージングサーバーには既にノードがインストールされて実行されているため、これをすばやく簡単に作成できました。


" yourdomain.com:8088/…"-本当に?!「秘密の」鍵がURLで平文で渡されました!!!! 誰もそれを使うべきではありません。
ジュリアンナイト

1
アスピリンを飲んでジュリアンに落ち着く。httpsを使用する場合、取得パラメーターは暗号化されます。
Gavin

3

配置が簡単なプロジェクトはgitを使用していることがわかりました。

git-play

それはあなたにとって適切な方法だと思います。

見てみな。


2

python / tornadoベースのソリューションが必要な場合は、GithubのWebhook ServicesからのPOSTリクエストを処理するスクリプトを作成しましたhttps://github.com/Akobi/ops/tree/master/autodeployで見つけることができます

基本的には、JSON構成ファイルを使用して、プッシュが予想されるリポジトリ、デプロイで実行するコマンド、コマンドを実行する必要があるディレクトリをリストします。必要なのは、構成ファイルを好みに合わせて変更することだけです。スクリプト!

さらに、Nginxをリバースプロキシとして使用して、これらのPOSTをスクリプトに転送します。Nginx設定は、同じGithubリポジトリの「nginx」フォルダの下にあります。

ハッピープッシュ!



1

リポジトリから新しい更新を自動的にプルダウンする独自の基本的な展開ツールを作成しました-https ://github.com/jesalg/SlimJim-基本的にそれはgithub post-receive-hookをリッスンし、プロキシを使用してトリガーします更新スクリプト。


1

私はhttps://commando.ioの創設者です最近、サービスを介したGitHubとの統合を発表しました。統合により、GitHubリポジトリにpushするときにサーバーで実行を実行できます。これは、コードをプッシュしたときにデプロイメントスクリプトを自動的に実行する絶好の機会です。

実行とは、Commando.io内で記述するスクリプトで、bash、perl、python、ruby、go、またはnode.jsで記述できます。詳細を確認し、runningの実行スクリプトの例を確認するgit pullには、ブログ投稿のアナウンスを参照してください:http : //blog.commando.io/run-executions-via-github-push/


1

Deepl.ioは、この分野で新しく有望な候補者のようです。

機能(そのWebサイトから取得):

  • GitLabとGitHubからwebhookをキャッチ
  • 複数のリポジトリを構成する
  • リポジトリごとに複数のブランチを構成する
  • PHP、シェル、またはその両方の独自のデプロイスクリプトを使用する
  • 確認メールを送信します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.