下記Laravelアプリケーションのデプロイ例:
ざっくり下記の手順
1、githubActionsのIPアドレス取得
2、Azureへログイン(Credentials使用)
3、デプロイ先マシンのセキュリティグループルールを作成してgithubActionsマシンからSSH接続できるようにする
4、SSH接続
5、githubに接続してチェックアウトしてくる
6、Laravelアプリケーション起動用のコマンドを実行する
7、3で作成したデプロイ先マシンのセキュリティグループルールを削除する
name: deploy
on:
# developブランチプッシュ時
push:
branches: [develop]
workflow_dispatch:
jobs:
deploy:
# ubuntu-latestで
runs-on: ubuntu-latest
steps:
# githubActions実行マシンのIP取得
- name: Public IP
id: ip
uses: haythem/public-ip@v1.2
# Azureのログイン
- name: Azure Login
uses: azure/login@v1
with:
creds: ${{ secrets.CREDENTIALS }}
- uses: actions/checkout@v2
# デプロイ
- name: Deploy
# 環境変数系のセット、secretsから
env:
HOST_NAME: ${{ secrets.HOST_NAME }}
SSH_KEY: ${{ secrets.SSH_KEY }}
SSH_PORT: ${{ secrets.SSH_PORT }}
USER_NAME: ${{ secrets.SSH_USER_NAME }}
SUBSCRIPTION_NAME: ${{ secrets.SUBSCRIPTION_NAME }}
RESOURCE_GROUP_NAME: ${{ secrets.RESOURCE_GROUP_NAME }}
SECURITY_GROUP_NAME: ${{ secrets.SECURITY_GROUP_NAME }}
SECURITY_GROUP_RULE_NAME: ${{ secrets.SECURITY_GROUP_RULE_NAME }}
run: |
# GitHubのパブリックIPを取得
IP_ADDRESS=`echo ${{ steps.ip.outputs.ipv4 }}`
# セキュリティーグループにGitHubのパブリックIPを割り当てSSH通信を許可する
az network nsg rule create -g ${RESOURCE_GROUP_NAME} -n ${SECURITY_GROUP_RULE_NAME} \
--subscription "${SUBSCRIPTION_NAME}" \
--nsg-name ${SECURITY_GROUP_NAME} \
--priority 999 \
--source-address-prefixes ${IP_ADDRESS}/32 \
--destination-address-prefixes '*' \
--destination-port-ranges ${SSH_PORT} \
--access Allow \
--description "allow ssh from github"
# SSH接続、デプロイ、一度src下でクローンし、GitHubとの接続情報を保持ている必要がある
# Laravelアプリケーションのため下三行は起動用のコマンド(とマイグレーション実行)
echo "$SSH_KEY" > private_key && chmod 600 private_key
ssh -p ${SSH_PORT} -o StrictHostKeyChecking=no -i private_key ${USER_NAME}@${HOST_NAME} '
cd /var/www/src &&
git checkout develop &&
git pull &&
composer install &&
composer dump-autoload &&
php artisan migrate
'
# セキュリティーグループにGitHubのパブリックIPを割り当て解除(作成したルールを削除)
az network nsg rule delete -g ${RESOURCE_GROUP_NAME} -n ${SECURITY_GROUP_RULE_NAME} \
--subscription "${SUBSCRIPTION_NAME}" \
--nsg-name ${SECURITY_GROUP_NAME}