GitHub Actionsでサーバからファイルを差分があったときだけ更新して取得
以下の要求をみたすGitHub Actionsを書いたので備忘でメモ
- 取得したいファイルは各サーバのローカルに保存される
- ファイルをサーバ名ごとのディレクトリの下へ取得し、GitHubのプライベートリポジトリにプッシュ
- そのファイルは不定期に更新される
- 取得を定期的に行うが、更新が行われていない場合はファイルを取得しない
- サーバ名は 固定文字 + 2桁の連番
そしてActions用のコードが以下です。
ポイントは
- サーバへssh(rsync)するため
self-hostedランナーを利用 - ログ名をつけるときに
dateコマンドを使うのでTZ: "Asia/Tokyo"を指定 - SSH秘密鍵はGitHubのシークレットに設定
- 仮にサーバが10台あるとして、 for へ
seq -f '%02g' 1 10で数字を0埋めしつつ渡す git diff --exit-codeで差分があった場合のリターンコードを変更1- 差分があった場合にHEADから
git showを利用してファイルを取り出し
name: get_file
on:
schedule:
- cron: '0 * * * *'
workflow_dispatch:
jobs:
build:
runs-on: self-hosted
steps:
- uses: actions/checkout@v2
- name: Deploy
env:
servername: "target"
domain: "morihaya.local"
sshuser: "github-actions"
TZ: "Asia/Tokyo"
run: |
hostname
date
pwd
ls -l
# RSYNCの準備
sudo apt-get install -y rsync
echo "${{secrets.SSH_PRIVATE_KEY_ANSIBLE}}" > /tmp/sshkey
chmod 400 /tmp/sshkey
# 高速化のためにstrategy matrixを利用しない
for number in $(seq -f '%02g' 1 10)
do
echo "# ${servername}${number}.${domain}"
[[ ! -d ${servername}${number}.${domain} ]] && mkdir ${servername}${number}.${domain}
rsync --rsync-path="sudo rsync" -e "ssh -i /tmp/sshkey -o StrictHostKeyChecking=no" -av \
${sshuser}@${servername}${number}.${domain}:/var/log/hoge.log \
${servername}${number}.${domain}/
# ファイルの更新が発生した場合、HEADから別名として取り出す
git diff --exit-code || git show HEAD:${servername}${number}.${domain}/hoge.log > ${servername}${number}.${domain}/hoge-$(date +%Y%m%d-%H%M).log
ls -l ${servername}${number}.${domain}/*
done
ls -l
- name: Commit files
run: |
git config --local user.email "morihaya@localhost"
git config --local user.name "github-actions"
git add .
git commit -m "Add changes" -a
- name: Push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ github.ref }}
今回は特定ファイルが対象でしたが、ディレクトリ配下まるごとを取得対象にし、その中で差分があったファイルのみ更新とかだともう少し複雑になりそうです。
これをしないと基本的に 0 がリターンされる ↩︎