見出し画像

マネージドクラウドとGitHub Actionsを利用してデプロイを自動化しようぜ

こんにちは。マネクラチームエンジニアsangunです!
暖かい春の風が吹き続いています。皆さんの心にも春がきましたか?
私は1年ずっと春の気持ちで住んでいます。

今回の記事はGitHub Actionsを利用して、マネージドクラウドから生成したプロジェクトのデプロイを自動化するワークフローを作る方法に対して紹介したいと思います!

特にこういう方々にお勧めしております。
- GitHubを利用してマネージドクラウドのプロジェクトを管理をしたい
- GitHub Actionsに興味がある

まずGitHub Actionsってなに?

GitHub Actionは GitHubリポジトリをベースにしてソフトウェア開発のワークフローを自動化できる機能です。 

どうやってGitHub Actionsに適応していく?

詳しい内容に前にマネージドクラウドのビルドデプロイついて簡単に説明します。マネージドクラウドでプロジェクト(※)を作成しますと、対応しているプロジェクトの詳細画面でGitのリモートリポジトリのURLを確認いただけます。

※ Node.js / Ruby on Rails / Java / .NET Core / Python のみのプロジェクト

画像1

リモートリポジトリにpushすると、ビルドとデプロイが実施され、アプリケーションの更新ができます。

今回の記事では上記の機能をGitHub Actionsに実施することで自動的にビルドとデプロイができるように作ることが目標です。

開発環境の準備

まずは開発環境の準備です。本記事ではNode.jsのExpress.jsを利用デプロイの自動化を実装してみました。

- Node.js : 14.15.4
- Express.js: 4.17.1
- OS : macOS Mojave

もしNode.jsをインストールしていない場合は下のサイトを参考してNode.jsの設置をお願いします。

次はExpress.jsを準備します。基本的にはExpress.jsの公式サイトから紹介しているGetting startedをベースにしてアプリケーションを作っています。

今回の記事のため、Express.jsのテストアプリケーションのリポジトリを用意しております。開発環境の準備に参考してください。

引き続きExpress.jsの設置の説明していきます。

# アプリケーションインストールディレクトリ生成
$ mkdir myapp
$ cd myapp

# gitリポジトリとして初期化
git init

# .gitignore ファイルを作成
$ echo 'node_modules' >> .gitignore

# npm を初期化 (対話式に設定が行われますので必要に応じて入力してください)
$ npm init

# Express.jsをインストール
$ npm install express

次に下記コードを含むファイルを index.js として作成します。 マネージドクラウドの仕様として、アプリケーションはポート80にする必要があります。

const express = require('express')
const app = express()
const port = 80

app.get('/', (req, res) => {
 res.send('Hello World')
})

app.listen(port, () => {
 console.log(`Example app listening at http://localhost:${port}`)
})

続いてディレクトリに作成されている package.json を開いて scripts に start コマンドを追加しましょう。マネージドクラウドにおけるコンテナ起動処理のデフォルト設定ではこの記載によりアプリケーションが起動されます。

"scripts": {
    "start": "node ./index.js"
},

その後、ターミナルで作ったExpress.jsアプリを起動してみましょう。

$ npm start

> test@1.0.0 start
> node index.js

Example app listening at http://localhost:80

localhost:80 にアクセスした際に以下のような表示になるとOKです!

画像2

次はGitHub Actionsを利用するためにはGitHubリポジトリを生成する必要があります。GitHubリポジトリを生成し、作ったExpress.jsのアプリケーションをpushして置いてください。
※ GitHubリポジトリの生成方法などに関してはこの記事では説明しません。

GitHub Actionsでデプロイワークフローを作成する

Express.jsアプリケーション、Node.jsプロジェクト、GitHubリポジトリが準備できたら、GitHub Actionsを利用してデプロイワークフローを作ります。

GitHub Actionsのワークフローの設定はYAML形式で記述します。 YAMLファイルは、コードリポジトリの .github/workflows というディレクトリに保存する必要があります。

# ワークフローファイルを保存するディレクトリ生成
$ mkdir -p .github/workflows

workflowsフォルダの中に deploy.yml というファイルを追加して、以下のようなコードを作成します。

name: express.js deploy

on: 
 push:
   branches:
     - main

jobs:
 deploy:
   runs-on: ubuntu-latest
   steps:
   - uses: actions/checkout@v2
     with:
       fetch-depth: 0

   - name: add SSH key
     uses: shimataro/ssh-key-action@v2
     with:
       key: ${{ secrets.SSH_PRIVATE_KEY }}
       name: id_rsa
       known_hosts: ${{ secrets.KNOWN_HOSTS }}
   
   - name: add git remote
     run: git remote add lolipop ${{ secrets.MC_REPOSITORY_URL }}

   - name: deploy
     run: git push lolipop HEAD:master

このワークフローのステップの内容を説明しながら、実際にGitHub Actionsからデプロイするために必要な準備も一緒に紹介します。
今回紹介するステップ以外の項目については GitHub Actions 公式ガイドに詳細に記載されていますのでこちらも是非チェックしてみてください!

- actions/checkout@v2 : GitHub リポジトリのソースコードを取得する処理です。デフォルトでは fetch-depth: 1 が設定されていますが、今回はマネージドクラウドへのPushを行いますので、fetch-depth: 0 を指定しています。

add SSH key: SSH公開鍵の登録のために利用します。この記事では shimataro/ssh-key-actions@2 を利用します。GitHub Marketplace にSSH Keyとかで検索すると色んなSSH登録パッケージがありますが、私の場合、shimataro/ssh-key-actions@2 の使い方が直感的で分かりやすいと感じたため、 shimataro/ssh-key-actions@2 を利用しました。もし使いたいパッケージがあれば、他のパッケージを使っても問題ありません!

add git remote : アプリケーションをデプロイするNode.jsプロジェクトのリポート先を追加するステップです。

deploy : Node.jsプロジェクトにデプロイするステップです。

Actions secrets

上記のYAMLでは ${{ secrets.hoge }} のようにActions secretsに秘密の情報などを用意して使っています。secretsの設定はGithubリポジトリのメニューからSettingページに移動してSecrets項目の「New repository secret」ボタンをクリックして登録することができます。

画像3

今回の記事では3のsecretsが必要となります。
※ 命名は任意です。

SSH_PRIVATE_KEYSSH公開鍵、マネージドクラウドのプロジェクトのコンテナにSSH接続したり、デプロイするとき必要となります。マネージドクラウドで利用しているSSH公開鍵をsecrets登録してください。
また、マネージドクラウドのSSH公開鍵の管理ページにある「ワンクリック登録」機能を利用してダウンロードした公開鍵secretsに登録することも簡単なのでオススメします。

- KNOWS_HOSTS : Knows hostsは公開鍵認証のSSHでログインしたサーバのホスト鍵を記録し,次回からのホスト認証で利用されるデータです。SSH鍵の設定に利用する shimataro/ssh-key-action@v2 の場合、セキュリティー上の仕様としてKnows_hostsの設定を必須にしています。
マネージドクラウドに公開鍵を登録しているなら、以下のようなコマンドを入力してKnows_hostsデータを取得してsecretsに登録してください。

ssh-keyscan -p プロジェクトのポート番号 -H プロジェクトのホスト名

ポート番号やホスト名はプロジェクト詳細ページのSSH / SFTPにあります。

画像4

もし、上記のコマンドで以下のような文字列が出たら、SSHに一度直接ログインしてから、やり直してください。

xxxx.mc.lolipop.jp: Connection closed by remote host

- MC_REPOSITORY_URL : アプリケーションをデプロイするgitリポート先です。プロジェクト詳細ページのSSH / SFTP項目から確認できます。

画像1


GitHub Actionsを利用した初デプロイおよび更新

今まで以下のようなことをしました。ここまで問題なかったら準備OKです!

- Node.jsアプリケーション
- Node.jsプロジェクト
- アプリケーションのソースコードを保存するGitHubリポジトリ
- GitHub Actions ワークフローファイル
- GitHubリポジトリのSecrets

GitHubリポジトリにPushしてGitHub Actionsがどう動いているか確認してみましょう。

# mainブランチでpushした時に動くように設定したため、mainブランチにpush
$ git push origin main

GitHubのサイトにアクセスし、pushしたリポジトリのActionsページに入ってみると、ワークフローが実行されていることが確認できます。

画像9

頑張れ!

画像6

緑のチェックが表示され、ワークフローが成功したことが確認できました!ワイワイ!

画像8

各ステップをクリックしたら、ログも見ることができます。もしワークフローに失敗したら、ログをみてみましょう。

画像9

デプロイ先のプロジェクトのURLにアクセスしてデプロイが成功したことが確認できます。ワイワイ!

GitHub Actionsにデプロイのワークフローを追加することによって、GitHubのリポジトリにコードをpushするだけでマネージドクラウドのプロジェクトのデプロイができるようになりました。これは楽々!

最後に

今まで、GitHub Actionsを利用したデプロイの自動化に対して説明しました。読んでいただき、ありがとうございます!

自分も業務でGitHubを利用しており、普通なバージョン管理やソースコード管理以外にIssueを作成してチームメンバーとコミュニケーションをするなど、100%開発ではない部分にもGitHubをたくさん利用しています。

この記事ではデプロイだけを説明していますが、GitHub Actionsのドキュメントにも書いてあるように、テスト・ビルド・デプロイなど、様々なワークフローの自動化ができるので、GitHub Actionsのような機能をアプリケーションに導入することで開発や運用への生産性を上げれると思います。という理由で、マネージドクラウドをGitHubを一緒に利用したら楽なことが多くなるのではないかな?という思い込めて今回の記事を作成しました。

今回はマネージドクラウド自体に対する紹介ではなかったですが、これからも引き続き、お客様に「楽なWebアプリ・サイトの運用経験」を提供するためにこれからも色々なアップデートをしていきます!

マネージドクラウドではプロジェクト作成から10日間お試しでのご利用が可能となっております。ぜひお試しください。

★新規登録はこちらから!