GitHub Actionsを使ってWordPressテーマを更新する[第2回]の続きになります。

前回はGitHub Actionsの仕組みとワークフローについての紹介をしました。今回は、ワークフローファイルを編集してGitの特定ブランチが更新されたらSSHを使ってWordPressが入っているサーバーに向けてWordPressテーマを更新するワークフローを作成する方法を紹介します。

前々回に作成したGitHub Actionsのワークフローファイルがこんな感じでした。

main.yml
# ワークフロー
name: CI

# イベント 
on:
  # GitHubにプッシュされた時
  push:
    branches: [ main ]
  # GitHubでプルリクエストが作られた時
  pull_request:
    branches: [ main ]
  # 手動実行
  workflow_dispatch:

# ジョブ
jobs:
  # ジョブ名
  build:
    # ランナー
    runs-on: ubuntu-latest

    # ステップ
    steps:
      # アクション1。リポジトリのソースをチェックアウトする
      - uses: actions/checkout@v2

      # アクション2。コマンドラインの出力
      - name: Run a one-line script
        run: echo Hello, world!

      # アクション3。複数行にわたるコマンドラインの出力
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.

このファイルをベースにステップを編集していきます。

ワークフロー名を変更する

まずはワークフロー名を変えてみましょう。必ず変更するものではないですが、複数のワークフローを作りたい場合や初期で作ったワークフロー名がわかりにくいのでわかりやすい名前に変更します。

# ワークフロー
name: Server Deploy

ビルドを変更する

次にビルド名も変更します。こちらもワークフローと同じく必ず変更するものではないですが、初期で作ったビルド名も「build」になっているので目的に合わせて変更します。

jobs:
  # ビルド
  deploy:

アクションを変更する

そしてアクションを変更します。

まずは変更内容はこんな感じです。

# ステップ
steps:
  # アクション1。リポジトリのソースをチェックアウトする
  - name: checkout
    uses: actions/checkout@v2

  # アクション2。サーバーアップロード
  - name: deploy
    uses: easingthemes/ssh-deploy@v2.1.6
    env:
      SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}  # サーバーの秘密鍵
      ARGS: "-rltgoDzvO"                                                        # rsyncのオプション
      SOURCE: theme                                                             # アップロードするディレクトリ
      REMOTE_HOST: ${{ secrets.REMOTE_HOST }}            # アップロード先のサーバーホスト
      REMOTE_USER: ${{ secrets.REMOTE_USER }}            # アップロード先のサーバーユーザ
      REMOTE_PORT: ${{ secrets.REMOTE_PORT }}             # アップロード先のサーバーポート
      TARGET: ${{ secrets.REMOTE_TARGET }}                      # アップロード先のサーバーディレクトリ

アクション2にeasingthemes/ssh-deployというmarketplaceにあるアクションに変更しています。ssh-deployにはenvで環境変数を設定しないと動きません。

marketplaceやアクションの環境変数が出てきたので説明します。

GitHub Marketplaceとは

GitHubがよく使われるようになったのは、使いやすいUIであることやオープンソースプロジェクトだと無料で使えることが大きいですが、企業からも使われるようになった一つにGitHub Marketplaceがあると思います。

MarketplaceはGitHub自身やそれ以外の企業が提供するGitHubの拡張・開発ツールを提供できる場所して提供されています。例えばCIサービスへのつなぎこみ、SlackなどのチャットサービスでのGitHubのステータスの通知、ZenHubなどのタスク管理ツールなどです。

これらはMarketplaceがないときはそれぞれのサービス提供元で決済などをしないといけなかったのですが、それらが全てGitHub上で行うことができるようになりました。

そのMarketplaceにはGitHub Actions用のアクションも提供されています。GitHub Marketplaceにあるアクションは、3rdパーティで作られた外部アクションを自身のリポジトリにあるアクションで使うことができるようになります。

アクション2を変更する際にでたeasingthemes/ssh-deployも外部アクションですが、アクション1のactions/checkoutも外部アクションです。

GitHub Marketplaceにある外部アクションを利用する方法

GitHub Marketplaceにある外部アクションを自身のワークフローに利用するには、アクションでusesを指定して外部アクション名を書けば利用されます。

steps:
  - uses: actions/checkout@v2

これでactions/checkoutのv2のタグがついているコミットのアクションが実行されます。信頼できる外部アクションであれば、これでもよいですが、できればコミットのGit refやSHAを指定したほうがいいです。

steps:
  - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f

なぜかといいますとタグで指定している場合だとタグの付け替えができるのでコードの仕様が変わって期待する動作をアクションがしてくれなくなる場合や最悪、悪意のある動作をするタグに付け替えをされる可能性があります。

コミットを指定すればタグの付け替えに影響は受けませんし、動作確認が取れるコミットなので仕様が変わってもアクションへの影響は受けないです。

公式のドキュメントにもGit refやSHAを指定するように書かれています。

GitHub Actionsのワークフロー構文

アクションの環境変数を設定する

easingthemes/ssh-deployでは環境変数を設定しないといけません。GitHub Actionsの通常の環境変数は以下の3種類があります。

  • ワークフロー全体で使用できる環境変数
  • ジョブ内全体で使用できる環境変数
  • アクション内でのみ使用できる環境変数

GitHub Actionsで利用できる環境変数はDocker周りを含めるともう少しありますが、基本的には3種類です。

ワークフローファイルでの設定方法は以下の通りになります。

# ワークフロー全体で使用できる環境変数
env:
  ENV_WORKFLOW: env_workflow

job:
  build:
    # buildジョブ内で使用できる環境変数
    env:
      ENV_JOB: env_job
    step:
      - name: env test
        uses: test/test
        # env testアクション内で使用できる環境変数
        env:
          ENV_ACTION: env-action

アクションで利用する環境変数のシークレットキーとは

easingthemes/ssh-deployで設定した環境変数の値は以下のように設定していました。

env:
  SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}  # サーバーの秘密鍵
  ARGS: "-rltgoDzvO"                                                        # rsyncのオプション
  SOURCE: theme                                                             # アップロードするディレクトリ
  REMOTE_HOST: ${{ secrets.REMOTE_HOST }}            # アップロード先のサーバーホスト
  REMOTE_USER: ${{ secrets.REMOTE_USER }}            # アップロード先のサーバーユーザ
  REMOTE_PORT: ${{ secrets.REMOTE_PORT }}             # アップロード先のサーバーポート
  TARGET: ${{ secrets.REMOTE_TARGET }}                      # アップロード先のサーバーディレクトリ

この中で「ARGS」「SOURCE」以外はすべてActions secretsというところから取得するように設定してあります。

Actions secretsはGitHub Actionsでの秘密情報を安全に設定するための機能でパブリックリポジトリでも安全にGitHub Actionsを利用するための機能です。

easingthemes/ssh-deployではSSHを利用してサーバーへファイルをアップロードするのでサーバーホスト、ユーザなどはもちろんのこと秘密鍵も利用するのでシークレットキーの設定方法を紹介します。

シークレットキーの設定方法

  1. ワークフローがあるGitHubリポジトリの「settings」をクリック
  2. 「Secrets」をクリック
  3. 右上にある「New repository secrets」ボタンをクリック
  4. NameとValueを入力し「Add Secrets」ボタンをクイック
シークレットキーの入力
入力されたシークレットキーの一覧

ssh-deployの設定をする

環境変数とシークレットキーを理解したところで再度easingthemes/ssh-deployについて説明します。

easingthemes/ssh-deployはSSHが使えるサーバだったら動作するのでVPSみたいな仮想専用サーバだけではなくSSHに対応しているレンタルサーバーでも使えると思います。

アクションで変更した部分でssh-deployの箇所はこんな感じでした。

# アクション2。サーバーアップロード
- name: deploy
  uses: easingthemes/ssh-deploy@v2.1.6
  env:
    SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}  # サーバーの秘密鍵
    ARGS: "-rltgoDzvO"                                                        # rsyncのオプション
    SOURCE: theme                                                             # アップロードするディレクトリ
    REMOTE_HOST: ${{ secrets.REMOTE_HOST }}            # アップロード先のサーバーホスト
    REMOTE_USER: ${{ secrets.REMOTE_USER }}            # アップロード先のサーバーユーザ
    REMOTE_PORT: ${{ secrets.REMOTE_PORT }}             # アップロード先のサーバーポート
    TARGET: ${{ secrets.REMOTE_TARGET }}                      # アップロード先のサーバーディレクトリ

この中で必須になっている項目は以下の3つです。

  • SSH_PRIVATE_KEY (サーバーの秘密鍵)
  • REMOTE_HOST (アップロード先のサーバーホスト)
  • REMOTE_USER (アップロード先のサーバーユーザ)

これら3つはどこにアップロードするのかを設定するので必須なのは当然です。REMOTE_HOSTやREMOTE_USERに関しては使っているサーバーのホストやユーザ情報を元にシークレットキーを設定してください。

NameValue入力する内容
REMOTE_HOSTssh.example.comサーバーホスト
レンタルサーバーなどだとSSHの接続先
REMOTE_USERexampleサーバーユーザー
GitHub Actions Secretsで入力する内容

SSH_PRIVATE_KEYはデプロイ用に新しく作ったほうがいいです。

特にレンタルサーバーでSSHの設定でもらう鍵では公開鍵で使えないことがあったりするので自身のPCでキーを作成し秘密鍵をシークレットキーに設定し、公開鍵をSSHの接続先のauthorized_keysに追記します。

$ ssh-keygen -m PEM -t rsa -b 4096 # 公開鍵作成

それ以外のオプションも必要に応じて設定してください。SOURCE・TARGETは設定しておかないとアップロードしたくないファイルが上がったり変なディレクトリに上がったりすることになります。

REMOTE_PORTもSSHのポートが違ったりする場合は当然あるのでサーバーの設定に合わせて変更してください。

上記の設定でワークフローファイルとシークレットキーを設定すればGitHub ActionsでWordPressテーマを更新するができます。

まとめ

紹介したワークフローの変更をまとめるとこんな感じになります。

main.yml
# ワークフロー
name: ServerDeploy

# イベント
on:
  # GitHubにプッシュされた時
  push:
    branches: [ main ]
  # GitHubでプルリクエストが作られた時
  pull_request:
    branches: [ main ]
  # 手動実行
  workflow_dispatch:

# ジョブ
jobs:
  # ジョブ名
  deploy:
    # ランナー
    runs-on: ubuntu-latest

    # ステップ
    steps:
      # アクション1。リポジトリのソースをチェックアウトする
      - name: git checkout
        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f

      # アクション2。サーバーデプロイ
      - name: deploy
        uses: easingthemes/ssh-deploy@9ab39935552e9fe6706e9c9bf2a70a3328a4a5e6
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}  # サーバーの秘密鍵
          ARGS: "-rltgoDzvO"                              # rsyncのオプション
          SOURCE: theme                                   # アップロードするディレクトリ
          REMOTE_HOST: ${{ secrets.REMOTE_HOST }}         # アップロード先のサーバーホスト
          REMOTE_USER: ${{ secrets.REMOTE_USER }}         # アップロード先のサーバーユーザ
          REMOTE_PORT: ${{ secrets.REMOTE_PORT }}         # アップロード先のサーバーポート
          TARGET: ${{ secrets.REMOTE_TARGET }}            # アップロード先のサーバーディレクトリ

3回に渡って紹介しましたGitHub Actionsを使ったWordPressテーマの更新する方法をですが、ほぼGitHub Actionsを中心に紹介したのでWordPressテーマの更新については少なく感じたかもしれません。

ただ自動化することでGitHubで管理している場合のWordPressテーマのアップロード忘れをすることがなくなります。

3回に渡って紹介したものについてGitHubにサンプルを作ってみたので是非参考にしてみてください。

サンプルリポジトリ

GitHub Actionsシリーズ