質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

CI(継続的インテグレーション)

CI(継続的インテグレーション)は、アプリ開発においてビルドとテストを繰り返すことで品質改善と納期短縮を図る手法です。JenkinsやTravis CIなどの専用ツールを利用してプロセスを自動化・半自動化して効率的に実施します。

Q&A

解決済

1回答

740閲覧

GitHubにPushされたタイミングで、サーバ側でPullを実行する方法について

januarycom

総合スコア18

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

CI(継続的インテグレーション)

CI(継続的インテグレーション)は、アプリ開発においてビルドとテストを繰り返すことで品質改善と納期短縮を図る手法です。JenkinsやTravis CIなどの専用ツールを利用してプロセスを自動化・半自動化して効率的に実施します。

0グッド

1クリップ

投稿2019/03/27 18:32

サーバ側のソースとリモートリポジトリのソースを同期したいと思い、下記の手順で試しましたがことごくうまくいかず、知恵をお貸しいただけると助かります。

環境: EC2 (AMI: Kusanagi)

  1. GithubにソースがPushされたタイミングでサーバにWebHookを飛ばすようにし、デプロイ処理が動作するようにように設定しました。WebHookが受信できていることは確認しております。

補足:サーバのドメインはxxxx.comとなっており、xxxx.com/deploy.php にWebHookを飛ばすようにGithub側で設定しました。

  1. deploy.phpのコードはこのようになっています。(簡略して書いています)

php

1<?php 2・・・中略 3//deploy.shはdeploy.phpと同階層にあります。 4exec('sh ./deploy.sh'); 5?>

deploy.sh

shell

1#!/bin/sh 2 3#デプロイしたいリポジトリのフォルダ 4cd git.test 5 6#デプロイ 7GIT_WORK_TREE=/home/kusanagi/xxx.com/DocumentRoot/dist /bin/git checkout -f master 8 9# httpdと出る 10# whoami 11 12# /bin/git --versionは正常に動作する。

実行ユーザが違っていたり、鍵周りで準備不足なところがあるのではないか思っております。

また、今までサーバ側でgit pull する際にはパスフレーズ付きの秘密鍵を使っておりました。
自動デプロイを行う際に用いる鍵も同じものを使用したいと考えています。
恐縮ですが、ご教示いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Twitter でも回答したのでメモ書き程度に雑回答失礼します。

  • 要点としては,そもそもパスフレーズつきの鍵を使う場合, macOS 以外で恒久的に自動化するのは不可能。パスフレーズ無しの鍵を使うべき。

他に気になる点としては,

  • deploy.sh は public 階層よりも上に置くべき(セキュリティ的に危険)
  • deploy.php ももっと分かりにくい名前にするか,GitHub からの IP レンジに制限すべき(両方やってもいい)

IPレンジを制限する場合は https://api.github.com/meta に都度アクセスして判定。

Laravel のミドルウェアっぽく書く実装例↓

php

1<?php 2 3declare(strict_types=1); 4 5namespace App\Http\Middleware; 6 7use Closure; 8use GuzzleHttp\Client as Guzzle; 9use GuzzleHttp\Exception\GuzzleException; 10use Illuminate\Http\Request; 11use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; 12 13class AcceptOnlyGitHubHooksIpAddrs 14{ 15 /** 16 * @param Guzzle 17 */ 18 protected $guzzle; 19 20 /** 21 * AcceptOnlyGitHubIpAddrs constructor. 22 */ 23 public function __construct(Guzzle $guzzle) 24 { 25 $this->guzzle = $guzzle; 26 } 27 28 /** 29 * Handles request. 30 * 31 * @param Request $request 32 * @param Closure $next 33 * @return mixed 34 * @throws AccessDeniedHttpException 35 */ 36 public function handle(Request $request, Closure $next) 37 { 38 if (!$this->ipInRanges((string)$request->ip(), $this->possibleIpRanges())) { 39 throw new AccessDeniedHttpException(); 40 } 41 return $next($request); 42 } 43 44 /** 45 * Fetch possible IP ranges from GitHub API. 46 * 47 * @return string[] 48 * @throws GuzzleException 49 */ 50 protected function possibleIpRanges(): array 51 { 52 return json_decode((string)$this->guzzle->get('https://api.github.com/meta')->getBody())->hooks ?? []; 53 } 54 55 /** 56 * Check if a given ip is in networks. 57 * 58 * @param string $ip 59 * @param string[] $ranges 60 * @return bool 61 */ 62 protected function ipInRanges(string $ip, array $ranges): bool 63 { 64 foreach ($ranges as $range) { 65 if ($this->ipInRange($ip, $range)) { 66 return true; 67 } 68 } 69 return false; 70 } 71 72 /** 73 * Check if a given ip is in a network. 74 * 75 * @param string $ip IP to check in IPV4 format eg. 127.0.0.1 76 * @param string $range IP/CIDR netmask eg. 127.0.0.0/24, also 127.0.0.1 is accepted and /32 assumed 77 * @return bool true if the ip is in this range / false if not. 78 */ 79 protected function ipInRange(string $ip, string $range): bool 80 { 81 if (strpos($range, '/') === false) { 82 $range .= '/32'; 83 } 84 85 [$range, $netmask] = explode('/', $range, 2); 86 87 $ipDecimal = ip2long($ip); 88 $rangeDecimal = ip2long($range); 89 90 return $ipDecimal !== false && $rangeDecimal !== false && ctype_digit($netmask) 91 ? $this->ipInRangeDecimal($ipDecimal, $rangeDecimal, (int)$netmask) 92 : false; 93 } 94 95 /** 96 * @param int $ip 97 * @param int $range 98 * @param int $netmask 99 * @return bool 100 */ 101 protected function ipInRangeDecimal(int $ip, int $range, int $netmask): bool 102 { 103 $netmask = ~(2 ** (32 - $netmask) - 1); 104 return ($ip & $netmask) === ($range & $netmask); 105 } 106}

投稿2019/03/27 18:57

編集2019/03/27 19:11
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2019/03/27 18:59

IPv6 には対応していないので,将来 GitHub がそうなることも考慮して万全を期しておくのであれば対応頑張ってくださいw
mpyw

2019/03/27 19:33

もう1点。何かの事情で master に force push する事があった場合 pull に失敗してしまうので, git fetch && git reset --hard origin/master を実行させたほうが無難です。こっちだと確実に成功します。 この後に composer install も一緒に実行かな?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問