git経由でサーバーにファイルをアップする

Pythonのファイルをいじっていて毎回思う事があります。SFTPでアップロードが面倒だ・・・ってかなんでSFTPでアップロードしなければいけないのか? と真剣に考えた事があります。本気で面倒だなと

時間の無駄ではないか?

そもそも、SFTPでテストサーバーにアップして、クライアントソフトでgithubにプッシュするって凄い時間の無駄な気がしています。1ファイルアップするとかなのでそんなに時間がかかるわけではないですが、何回かやっていると非常に 自分は何をしているんだろう? という虚無感に襲われます

アップロード後コマンド実行

HTMLならアップロードしてブラウザで確認とかでできます。自分がやっているのはPythonファイルでAPIを使っているのでブラウザというよりは正直コマンドでテストのために python ●●.py と実行します。

  1. SFTPでアップ
  2. SSHに切り替え
  3. コマンド実行
  4. githubにアップ

なんだこの無駄!!!と思います。

Windowsで開発すれば起きない問題?

そういうわけではないです。最終的にサーバーにアップしないといけないので、ローカルで開発すればおきないというわけではないです。というか回数はへるかもしれないですが全然減る問題ではないです

考えて見る

githubにアップするのも、サーバーにアップするのも同じファイルです。なので2つの場所にアップすればいいかなーと思ったのでやってみました

さくらのクラウドにgitをインストールしておく

さくらのクラウドにgitをインストールして実行します。今回自分はbuildreeでPythonの環境を構築したのでgitは一緒にインストールされております。

centosユーザーで行う

環境としては、centosユーザーでプッシュするというのを目標にしておきます。

理想的な状態

  • centosユーザーでプッシュ
  • centosユーザーはgitグループに所属
  • リポジトリの場所は/home/centos/gitremote/の中に作成する
  • gitリポジトリをcloneする場所は/home/centos/の中
  • ローカルでプッシュしたらサーバー側でも反映
  • githubにもプッシュをする。リポジトリはプライベートリポジトリ or パブリックリポジトリ

これができるようにしたいと思います。centosは鍵認証としています

ローカル環境

  • Windows10 64bit
  • クライアントツール:ソースツリー

やってみる

とりあえずやってみます。サーバー側ですが、既にPythonの環境が整っている(gitもインストール済み)の前提となります。buildreeでインストールした直後となります。

リポジトリの作成

まずはリポジトリの作成をしていきます

[centos@localhost ~]$ mkdir /home/centos/gitremote
[centos@localhost ~]$ cd gitremote/
[centos@localhost gitremote]$ pwd
/home/centos/gitremote
[centos@localhost gitremote]$

gitremoteというディレクトリに tw_api.git というリポジトリを作成します。TwitterAPIを使うので、tw_apiとしているだけになります。

[centos@localhost gitremote]$ git init --bare tw_api.git

gitグループを作成

絶対作成する必要はないですが、作っておいたほうが複数人で共有するときに便利かなーと思ったり、なんとなくgitというグループがあればわかりやすい?かなと思うので作りました。centosユーザーをgitグループにいれます

[centos@localhost gitremote]$ sudo gpasswd -a centos git

#centosが所属しているグループを確認します
[centos@localhost gitremote]$ groups centos
centos : centos wheel nobody git

centosのデイレクトリのグループをgitに変更

[centos@localhost gitremote]$ chown -R centos:git /home/centos/

ローカルにクローンしてみる

ソースツリーの設定をしてみます

カット
カット
カット
カット

エラーが出る場合

もし fatal: Couldn't find remote ref master というエラーがでたら、プッシュしてみてください。おそらくそれで成功します

サーバー側でクローンしてみる

ローカルからプッシュできたら、サーバーに反映するようにしたいのでクローンをまずしてみたいと思います

git cloneをする

[centos@localhost ~]$ git clone file:///home/centos/gitremote/tw_api.git

[centos@localhost ~]$ ll

drwxrwxr-x 4 centos centos 4096  7月  2 14:34 tw_api

無事にできました。グループがcentosのままですね。これはどこかのタイミングで直しておいた方が良いかな・・・

反映させる

ローカルでREADMEを更新してプッシュしてみます。↑の状態だとプッシュしてもリモートサーバーでは反映されておりません。そこで設定を変えます。

ローカルでプッシュしても反映されるようにする

リモートサーバー側の設定を少し変更します。

pushを検知してpullをする

自動でプッシュを検知して、pullするようにします。設定するには hooksフォルダの中にpost-receive というのを定義します

[centos@localhost tw_api]$ vi /home/centos/gitremote/tw_api.git/hooks/post-receive
#!/bin/sh

cd /home/centos/tw_api
git --git-dir=.git pull

実行権限を追加

実行権限を追加してあげます

chmod a+x post-receive

これを保存すればプッシュしたら反映されるようになります。リモートサーバー側はこれで完成です

githubにもプッシュする

githubにもプッシュします。

  • リポジトリは作成済み
  • SSHによるログイン

がされている状態となります

設定ファイルを変更する

設定ファイルを追加します

[remote "original"]
	url = git@github.com:xxxxxx/tw_api.git ←追加
	url = centos@xxx.xxx.xxx.xxx:gitremote/tw_api.git
	pushurl = git@github.com:xxxxxx/tw_api.git ←追加
	pushurl = centos@xxx.xxx.xxx.xxx:gitremote/tw_api.git

URLを2つにすればOKですこれで両方とも使えるようになります

個人支援・寄付について

サイトラボでは個人支援・寄付を受けております。ご協力いただける方はお願いいたします。当サイトではビットコインで受け付けております。

  • ビットコイン:3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS