手作業でdeployするのがイヤになったのでいい加減、時代の波に乗りました。
状況としてはこんな感じです。
- ファイルをアップしたいサーバが踏み台経由
- fabric を使ってアップするコマンドを作る(今回これの詳細は説明しません)
- circleCI の deployment を使って自動化
やったこと
- circleCIの設定
- fabricの設定
- ssh_config
- サーバ側の設定
ぐらいで出来ました。世界はカンタンになっているようです。
circleCIの設定
- Project Setting > SSH Permissions に秘密鍵をアップする
- この時 hostname は決まっていれば入力していいですが、空白だと全部に使ってくれる
- リポジトリの
circle.yml
をいじる
machine:
python:
version: 2.7.12
dependencies:
pre:
- pip install -r ./requirements.txt
- cat ~/repos_name/circleci_ssh_config >> ~/.ssh/config
deployment:
staging:
branch: master
commands:
- fab deploy_from_circleci
僕が書いたのはこんな感じ
次から branch:
に設定したブランチにpushすると自動で fab コマンド動きます。
(当たり前ですが requirements.txt
にFabricないとダメっす)
別のSSH_CONFIGを作成して、fabricから読む方法はダメだった
fabricではsshで使うSSH_CONFIGファイルを指定出来る機能があります
(超メモ)fabric で ssh の config ファイルを指定する、利用する - ようへいの日々精進XP
はじめはこれでやっていたのですが、元々の~/.ssh/config
を読み込まないとidentifier系が原因でSSHがコケます。
苦肉の策で、独自SSH_CONFIGを~/.ssh/config
に付け足して解決しました(´・ω・`)
どなたか env.ssh_config_path
で解決出来た方いらっしゃいましたら教えてくださいm(__)m
fabricの設定
from fabric.tasks import Task
class DeplyFromCircleCI(Task):
"""
鯖に現在のlocal状態をupする
"""
name = "up"
def run(self):
self.__set_env()
self.__up_server()
print blue(u"done")
@classmethod
def __set_env(cls):
env.use_ssh_config = True
env.user = "deployer"
env.host_string = "deploy_server_hostname"
@classmethod
def __up_server(cls):
project.rsync_project(
"/path-to-remoteserver/",
local_dir="./path-to-local/"
exclude=[".DS_Store"], delete=True, default_opts="-cropgtvz --progress"
)
deploy_from_circleci = DeplyFromCircleCI()
特別な事はしてないですね。rsyncしてるだけです。
ssh_config の書き方
ForwardAgent yes
Host fumidai
User circleci
HostName 1.1.1.1
Port 22
Host deploy_server_hostname
HostName 2.2.2.2
ProxyCommand ssh fumidai -W %h:%p
ProxyCommand
で踏み台経由に設定してるだけです。IPは適当です。
サーバ側の設定
fumidai
にあたるサーバ
circleci
ユーザーを作って、circleCIに登録した鍵でSSHログイン出来るようにしておきます。 authorized_keys
登録すればよさそう。
deploy_server_hostname
にあたるサーバ
deployer
ユーザーを作って、circleCIに登録した鍵でSSHログイン出来るようにしておきます。 authorized_keys
登録すればよさそう。
ForwardAgent yes
してるのでいけそう
これでいけるはず
超カンタンですね。
これからmasterにpushする度に自動でdeployしてくれます。
3回以上同じ事するぐらいなら自動化しましょう。(ってどこかのスゴイエンジニアの人がおっしゃってました)