Help us understand the problem. What is going on with this article?

GithubのActionsでRsyncを利用したデプロイ

前提条件

  • 簡単なPhpやHtmlで構成されたプロジェクト
  • composerを利用してないプロジェクト
  • Rsyncが利用出来るサーバー

やりたいの

  • Rsyncでgitのソースをサーバーにアップ
  • ソースのデプロイした後に簡単にサーバーでコンマンドを実行
  • Staging・本番環境の関係なくデプロイはbranchのpushで自動デプロイ

環境周りの設定

利用するレポジトリの「Settings > Secrets」に入って、サーバーへ接続情報を登録します。
img4.png

SSH用の鍵を登録

  • Name:SSH_PRIVATE_KEY
  • Value:ローカルのDeployerで使用している鍵(.pubでない方)の中身をコピーして入れる

SSH用のユーザー名を登録

  • Name:SSH_USERNAME
  • Value:ログインID

SSH用のHostを登録

  • Name:SSH_HOSTNAME
  • Value:サーバーIDかドメイン

Actionsのworkflowを作成

対象リポジトリの「Actions」に入って新しくTempleteを利用して作成しても良いです。

トリガーの部分

要求内容にも書いてますが、簡単なプロジェクトを想定しているのでStaging・本番環境の関係なくデプロイはbranchのpushで自動デプロイします。

name: deploy dev

on:
  push:
    branches:
      - deploy/*

もし本番を手動でしたい場合は「GithubのActionsでLaravelのデプロイ」をご参考してください。

環境変数の定義の部分

二つのブランチ(Staging、Production)についての変数を設定します。

  steps:
      - uses: actions/checkout@v2
      - name: Set staging env
        if: github.ref == 'refs/heads/deploy/staging'
        run: |
          echo ::set-env name=RSYNC_SOURCE::/
          echo ::set-env name=RSYNC_TARGET::Staging用のDirecotry

      - name: Set production env
        if: github.ref == 'refs/heads/deploy/pro'
        run: |
          echo ::set-env name=RSYNC_SOURCE::/
          echo ::set-env name=RSYNC_TARGET::本番用のDirecotry

Rsyncでソースのアップ

今回は「trendyminds/github-actions-rsync」を利用しますが、「ubuntu-latest」を利用するので直接に書いても大丈夫です。

      - name: Deploy by rsync
        uses: trendyminds/github-actions-rsync@master
        with:
          RSYNC_OPTIONS: -avzr --delete --exclude-from=.rsyncignore
          RSYNC_TARGET: $RSYNC_TARGET
          RSYNC_SOURCE: $RSYNC_SOURCE
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
          SSH_HOSTNAME: ${{ secrets.SSH_HOSTNAME }}

「.rsyncignore」のファイルで対象外のファイルを定義して利用しています。

SSH接続情報の設定の部分

速度の改善するためにCacheをする方法を入れました。情報の設定はCacheがない場合のみに作成する感じです。

      - name: Cache ssh config
        id: cache-ssh-config
        uses: actions/cache@v1
        with:
          path: /home/runner/.ssh
          key: ${{ runner.os }}-ssh-config-${{ hashFiles('/home/runner/.ssh/private-key-for-deploy') }}
          restore-keys: |
            ${{ runner.os }}-ssh-config-

      - name: Make ssh config
        if: steps.cache-ssh-config.outputs.cache-hit != 'true'
        run: |
          mkdir -p /home/runner/.ssh
          touch /home/runner/.ssh/private-key-for-deploy
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > /home/runner/.ssh/private-key-for-deploy
          chmod 600 /home/runner/.ssh/private-key-for-deploy
          ssh-keyscan ${{ secrets.SSH_HOSTNAME }} >> ~/.ssh/known_hosts

SSHを利用してサーバーでコマンドを実行

こちらについては「appleboy/ssh-action」を使うかと思いましたが、Actionsの環境変数をscript設定に反映するのが上手く行かなかったので直接書くことにしました。

上手く行かなかった定義です。

      - name: Multiple command
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOSTNAME }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          envs: RSYNC_TARGET
          script_stop: false
          script: |
            cd $RSYNC_TARGET
            ls -al

こちらが直接書いた内容です。

      - name: Make shell
        run: |
          touch ./ssh-script.sh
          echo "cd $RSYNC_TARGET" >> ssh-script.sh
          echo "ls -al" >> ssh-script.sh
          cat ssh-script.sh

      - name: Excute shell
        run: |
          ssh -i ~/.ssh/private-key-for-deploy ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOSTNAME }} 'bash -s' < ./ssh-script.sh

完成された定義

name: deploy dev

on:
  push:
    branches:
      - deploy/*

jobs:

  deploy:
    name: deploy
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set staging env
        if: github.ref == 'refs/heads/deploy/staging'
        run: |
          echo ::set-env name=RSYNC_SOURCE::/
          echo ::set-env name=RSYNC_TARGET::Staging用のDirectory

      - name: Set production env
        if: github.ref == 'refs/heads/deploy/pro'
        run: |
          echo ::set-env name=RSYNC_SOURCE::/
          echo ::set-env name=RSYNC_TARGET::本番用のDirectory

      - name: Deploy by rsync
        uses: trendyminds/github-actions-rsync@master
        with:
          RSYNC_OPTIONS: -avzr --delete --exclude-from=.rsyncignore
          RSYNC_TARGET: $RSYNC_TARGET
          RSYNC_SOURCE: $RSYNC_SOURCE
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
          SSH_HOSTNAME: ${{ secrets.SSH_HOSTNAME }}

      - name: Cache ssh config
        id: cache-ssh-config
        uses: actions/cache@v1
        with:
          path: /home/runner/.ssh
          key: ${{ runner.os }}-ssh-config-${{ hashFiles('/home/runner/.ssh/private-key-for-deploy') }}
          restore-keys: |
            ${{ runner.os }}-ssh-config-

      - name: Make ssh config
        if: steps.cache-ssh-config.outputs.cache-hit != 'true'
        run: |
          mkdir -p /home/runner/.ssh
          touch /home/runner/.ssh/private-key-for-deploy
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > /home/runner/.ssh/private-key-for-deploy
          chmod 600 /home/runner/.ssh/private-key-for-deploy
          ssh-keyscan ${{ secrets.SSH_HOSTNAME }} >> ~/.ssh/known_hosts

      - name: Make shell
        run: |
          touch ./ssh-script.sh
          echo "cd $RSYNC_TARGET" >> ssh-script.sh
          echo "ls -al" >> ssh-script.sh
          cat ssh-script.sh

      - name: Excute shell
        run: |
          ssh -i ~/.ssh/private-key-for-deploy ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOSTNAME }} 'bash -s' < ./ssh-script.sh

同じ記事:https://fatty-rabbit.tistory.com/13

FattyRabbit
韓国から1999年日本にきて色んなプロジェクトに参加しております。アンドロイドの画像編集・本作成プロジェクトで開発レーダー・メインエンジニアとして仕事して個人的にもアプリを開発・公開しています、仕事のほとんどウェブプロジェックトです。 Java、PHP、Spring Boot、Struts、Laravel、Google、Twitter、Facebook、Api
https://fatty-rabbit.tistory.com/
wiz_inc
Wizは、最新のIoTやICTサービスをお客様に届ける「ITの総合商社」です
http://012grp.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした