2014.04.19

git-ftp 鵜呑みにできない備忘録

先生、鯖がsshに対応してません! gitでサイト更新ができません!

お得なレンタルサーバーではssh使えないこと多いですよね。
gitのpost-updateを使ってサイトの更新をデプロイできたら、いちいち更新したファイルを覚えてなくてもいいし…あ、css上げるの忘れた!とかもなくなりますしいいですよね。いーなーいーなー。
しかし、鯖をクラスチェンジする金はない。

でも、知っていたんです。
なんか調べてる時に見つけたんですよ。
git-ftpとかいうアイテムを。https://github.com/git-ftp/git-ftp

リモートリポジトリがレンタルサーバーに置けないとしても、更新箇所だけでも手動でアップするよりかは格段に便利な予感。
Aptanaのftpもちょー便利なんですよ!FTPSもSFTPも使えますし、いちいち更新ファイルを覚えていなくても「同期」で一括アップできますし、同期でもファイルの一覧から更新するかしないかも選べます。ちょとした手直しの更新なんてエクスプローラから右クリ一発です。
そこで、どっちがいいか使ってみようと思ってやってみました。
ちょっと色んな事が難しかったんで備忘録つけときます。

この記事のいい加減さ

たぶんちゃんと説明できてません。当記事は参考になりません。ペコ
git-ftpご利用の際はgit-ftp公式の説明をよくお読みになられますよう。
https://github.com/git-ftp/git-ftp
または、こちら。すごく参考になりました。

参考サイト:
Qiita git-ftp インストールと設定(Windows)
インストール

公式のインストールの説明書
Macです。
gitとcurlが必要ですがcurlコマンドは標準で搭載されているらしい。というか、要ると意識しないでやっちゃってました。
SnowLeopardではMacPorts使ってたのでopt/local/binに居るんですよね。
何にも小細工してないMountainLionではusr/binに居ましたがpathが通ってない模様。
この辺よく分からんちんなので、curlはMacPortとかHomebrewとかで落としてきた方がいいのかなぁと。
Portsで落としてきた方には、opt/local/shareにcurl-ca-bundle.crtも入ってましたし…難しすぎ。

ターミナルを起動。ホームフォルダに居ると思うので、そのままgithub.comにある公式からクローンしてくる。

#の所は入れなくていいです。
クローンしてきたらgit-ftpに移動。最新のタグにチェックアウトのちsudoでインストール。
sudoって緊張します。求められるPasswordはrootのじゃなく自分のです。表示されないので正確にタッチしてリターン。

私は最初に古い方の公式からクローンしてきたんで、新しい公式からはアップデートをしました。1.0.0-rc.1が最新だったけど、-rc.1ってなにさ?と思って0.9.0のタグからしましま。(アップデートもありUpdating using git参照
homebrewからもインストールできるようなんで、homebrew入れてたら楽そうでいいです。

git-ftpの設定とイニシャライズ

恐ろしいのでレンタルサーバーにtest用サブドメインを立ち上げました。

ローカルで、テスト用にあらかじめ作って置いたディレクトリ(index.html入り)に移動してgit configに設定をする。

初めてUPする時はイニシャライズのコマンドを使います。

これでftpで繋がりアップロードが始まります。

やっぱりftpsで繋げたいわーという所でコケる

やっぱFTPはこわいわーという事でFTPSで繋がるようやってみたところ大はまりんぐ。

今までもaptanaやあひるで設定していたFTPSサーバーのアドレスを入れたのに

initすると、そんなホストねーし!と怒りのこもったエラー(妄想)が返ってくる。ログを見るとめちょめちょなアドレスが生成されてるわけで。

Aptanaのftpの設定を覗き見ると、SSL MethodのプルダウンでExplicit-AUTH TSL/SSLを選択してある。そういえば、そんな記憶もなきにしもあらずです。
公式のman pageを見るとURLの項目に

えっ!
どうやらcurl(なのか?)はプロトコルのとこ見て動くらしく、ftpsとftpesとで区別しているらしい。(そんならftps://はimplicitなんだろうか?)
試しに

としてみる。ポートはexplicitも同じ21を使う。

そしておもむろにイニシャライズ!init!
あっさりアップが始まりました。(∩・ω・)∩

ここまでの道のり実は相当長かったです…。
プロトコルの表記の仕方だのとは夢にも思わず、証明書のせいかと見当違いを疑ってみたり、知識がないので勉強になりました(´・ω・`)。
しかしAUTHコマンドのトラストストア?(勉強で仕入れた生半可な知識)って何を使ってるんですかね?←ォイ!
えーと、ログを見ると

あー、これ無いと自前で証明書とか鍵とかを用意しなきゃならないのかな?できんわーw
新しくセットアップする時はこれをチェックしてなかったら入れるようにしよう。

参考サイト:
MacPorts
MacPortsでvariants違いのパッケージをインストールする方法 | 富士山は世界遺産
homebrew
cURLのCA証明書 – There’s an echo in my head
手動
GITGITにしてやんよ | RONOR.org
決定版をアップロードしたい訳で。git hooks

いそいそと本番環境に適用しようとして気付いてしまいました。
うっかりdevelopとかの作業中のブランチに居るのに、masterに居る気まんまんでアップロードしたらいやだなぁ。
リモートリポジトリからpullだけをして来るgit-ftp専用のローカルリポジトリを用意したら安心なんじゃ?!ということで!!
そこで颯爽と登場するのがgitのフックであるpost-updateです。
.gitのhooksの中にあるpost-updateを使って、リモートリポジトリのmasterブランチにpushのタイミングで、git-ftp専用リポジトリからのpullを自動発火させます。

ほんとはこれ冒頭でうらやましがってたように、リモートリポジトリがレンタルサーバ上にあって、そのまま直に公開用リポジトリへ!だったら一番いいのですがねw
ま、贅沢は言いません。これでもかなり便利ですから。

参考サイト:
C-limber’s high: gitのブランチのpushで本番環境とテスト環境への反映を切り替える
gitでhookを使ってWebサイトの自動更新 | 半年前の私への教科書

最終データであるmasterブランチからgit-ftp専用ディレクトリへpullだけもよかったんですが、作業中debelopブランチのプレビュー用(ローカルサーバ上にview.local.com)もついでに作る事にしました。
まず、post-updateを作成。

中身。参考サイトさんを参照して、このような感じに分岐。書き方さっぱりわからん。まねっこ。

post-updateにリネームして保存。
post-updateに実行権限を付ける。

できた!これで安心git-ftp(∩・ω・)∩…でも、Lan上のサブマシーンからpushすると発火しない。
どこよ?ないよ?ftp_stagingとかに移動できないよ。と怒らりる。
うーんそうだよね。実行してるのは、別のマシーンでそのマシーンには/Users/ojiroないもんね。
否、プログラムを動かす実行権ないもんね…よく考えたらただのファイル共有でした。サーバもただのファイルサーバーだしw
ありゃーお手上げです。
masterとdevelopにpushするのは、メインマシーンからだけになっちゃいました。
いいんです…しばらく画面共有からpushしたいと思います。
もうちょっと勉強して、違うプロトコルから試してみようか否か( ´・ω・)。

追記:ローカルのマシン全部からpost-updateを発動させたい訳で…

#この記事を書いた人のリモートリポジトリはローカルのMac上にあるのです。
sshを使うことにしました。結局これが一番近道でした…orz

参考サイト:
Macにgitサーバーを構築してgit://(gitプロトコル)でアクセスできるようにする方法 | Macとかの雑記帳

↑こちらをすごく参考にしたらできました(∩・ω・)∩。ペコ

しかし、近道にもこんな障害が!
普段は文句言わないのにsshだと、git-receive-packが見つからないだとか→
~/bashrcで/opt/local/binへのpathを通す。(/opt/はMacPortsでgit-core入れた場合。)
私の環境の場合、~/.bash_profileで通してもダメで、~/.bashrcだと通る。
MacPortsを使ってインストールすると~/.profileにpathが自動で設定されるらしいんだけど、読み込み順位は~/.bash_profileより下。始めに見つけたやつだけ読み込まれるので.profileは読み込まれないことになる…色んなもののPathが切れちゃう。
それ以前に、sshでスクリプト経由の非対話モードだと~/.bash_profileが読み込まれないらすぃ…。
~/.bashrcで通ってるので現状これで好しとして、一応後学の為にenvironmentというキーワードをメモっておくだす。
pathを通すって人生で初めてやりますたよ。

参考サイト:
Mac を git の共有レポジトリにする — BONNOH FRACTION 14
Macで git push したら git-receive-pack: command not found のエラーが出たときの対処法 | わすれないように.
[ssh] ssh経由で他のサーバのスクリプトを実行するときに.bash_profileを読ませる方法 – It’s raining cats and dogs.

Permission denied (publickey,keyboard-interactive)だとか→
post-updateでpullする側のoriginのアドレスが間違うていたという凡ミスですた。
クライアント機とサーバ機を混同してssh経由のアドレスを設定してました。
私の場合はリモートリポジトリとローカルリポジトリが同機にあるので、/Users/ojiro/~ という素直なパスで良かったのでした。

webのみなさんありがとう〜

コメントをどうぞ



PageTop