日に何度も繰り返しているローカルでビルドしたファイルのテストサーバーへのアップロードの一連の処理をPythonを使って自動化してみた。
環境
- macOS HighSierra 10.13.3
- Python3.6.4
やりたい事
- ファイルの確認
- ファイルのコピー
- ファイル名の変更
- テストサーバーへのファイルのアップロード
ファイルの確認
処理を実行する前に対象となるファイルの存在を確認する。
os.path.isfile()
指定のパスのファイルが存在すればtrueを返す
import os
src = './app.war'
if os.path.isfile(src):
ファイルのコピー
ファイルの存在が確認出来たらファイルをコピーする。
shutil.copy()
ファイルをコピーする
import shutil
src = './app.war'
copy = './dest/app.war'
shutil.copyfile(src,copy)
ファイル名の変更
テストサーバーの環境に合わせてファイル名を変更する。
os.rename()
ファイル名を変更する
import os
copy = './dest/app.war'
dest = "./dest/change.war"
os.rename(copy,dest)
ただしshutil.copy()の実行時に出力先のpathを変更後のファイル名にしておけばリネームも同時に行ってくれる。
import shutil
src = './app.war'
dest = "./dest/change.war"
shutil.copy(src,dest)
参照: [Python]ファイル/ディレクトリ操作/Qiita
テストサーバーへファイルをアップロード
Paramikoを使いsftpでテストサーバーへファイルをアップロードする。
Paramiko
SSHv2プロトコルライブラリ
インストール
$ pip install paramiko
sftpによるアップロード
import paramiko
dest = './dest/change.war'
HOST = 'testserver.com'
PORT = 22
USER = 'user'
KEY = 'private/key/path'
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(HOST,PORT,USER,key_filename=KEY)
sftp = client.open_sftp()
sftp.put(dest,'remote/path')
sftp.close()
client.close()
コード全文
upload.py
import os
import shutil
import paramiko
src = './app.war'
copy = './dest/app.war'
dest = './dest/change.war'
if os.path.isfile(src):
shutil.copyfile(src,copy)
os.rename(copy,dest)
HOST = 'testserver.com'
PORT = 22
USER = 'user'
KEY = 'private/key/path'
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(HOST, PORT, USER, key_filename=KEY)
sftp = client.open_sftp()
sftp.put(dest,'remote/path')
sftp.close()
client.close()
upload.py作成後はアップロード時にファイルを実行するだけで済む
$ python3 upload.py
その他の手段
subprocessモジュールを使えばPythonでコマンドを実行する事が出来るので同様の処理が行える。
app.py
import subprocess
src = './app.war'
copy = './dest/app.war'
subprocess.run(["cp",src,copy])
あれこれ調べずにとにかくコマンドが実行出来るのでいざという時便利かもしれない。