Skip to content

自動デプロイ

mild (Kohei Arai) edited this page Sep 2, 2018 · 2 revisions

サーバーへの自動デプロイ

特に何も考えずにサイト開発をする場合、

  • masterへmerge・push
  • サーバーにログイン
  • git pull することでサイトを更新できますが、毎回サーバーにログインするのも面倒ですし、緊急時にログインできる人がいなければ即効性が失われる可能性もあります。そこで、masterへpushされたら自動的にサーバーにデプロイする設定をしましょう。この自動デプロイのことをContinuous Deploymentと言います。

CircleCIの設定

CircleCIとはCI(Continuous Integration)サービスの一つです。CIとは、自動でテスト・ビルドなどを行うことでミスを早期発見してソフトの品質を高めることです。CIとCDは概念が違いますので注意してください。理工展のサイトではテストを行うほど大きなものを作っているわけではないので、めんどくさいのでCIはやらずにCDのみを行っています。
CIサービスなのにCDもできるのか?と思うかもしれませんが、できます。

CircleCIにログインする

まずはログインしましょう。GitHubのアカウントがあれば、簡単にログインすることができます。
CircleCI
login

対象のリポジトリを選ぶ

CircleCIでは、GitHub上の1つのリポジトリならプライベートでも無料で使うことができます。CDしたいリポジトリで右側の「Set Up Project」ボタンを押します。 projects

環境変数・ssh鍵の設定

次にOSやら言語を選ぶ画面が出てきますが、これを選ぶとそれに合った設定ファイルをcircleCI側が提示してくれます。しかしそれはCI用のファイルなので今回は無視して、「Starg building」ボタンを押します。何も書いていないので当然CIには失敗します。なので設定ファイルを作ってコミットしましょう。
その前に準備をします。一度ビルドを走らせると、JOBSにリポジトリとビルドの詳細が表示されるようになります。対象のリポジトリの名前の右に設定アイコンが表示されるので、それをクリックします。一番左のsettingsを押すと違うものに飛ばされるので間違えないように注意してください!
setting

表示された一覧から「BUILD SETTINGS」->「Environment Variables」を選択します。ここで環境変数の設定をします。これを設定することで、設定ファイルに重要な情報を直書きすることを防ぐことができます。以下の設定をします。

  • GCP_COMPUTE_ZONE
    サーバーが動いているゾーンです
  • GCP_PROJECT_ID GCPのプロジェクトIDです。
  • GCP_SERVICE_ACCOUNT サービスアカウントキーのjsonファイルをbase64でエンコードしたものです。
  • HOST_NAME 対象サーバーのホスト名です。IPかドメインを記述します。
  • INSTANCE_NAME サーバーのインスタンス名です。
  • PORT SSH接続する際のポート番号です。22番から変えているので環境変数に設定します。
  • USER_NAME 接続先サーバーでのユーザー名です。 但し毎回これを設定する必要はなく、右上の「Import Variables」ボタンから、別のプロジェクトより環境変数をコピーしてくることができます。困ったらsite2018の環境変数から全部コピーしてくれば大丈夫です。
    サービスアカウントについて軽く説明します。GCPにCircleCIなどの外部サービスを経由してアクセスする場合、サービスアカウントを利用してアクセス権限を取得する必要があります。今回はGCEへのデプロイなので、GCEアクセス権などを取得しています。詳しくはドキュメントを参考にしてください。
    次にssh通信するためにRSA秘密鍵を登録しましょう。今度は「PERMISSIONS」->「SSH Permissions」を選択します。
    ssh
    残念ながら別プロジェクトからの秘密鍵のインポートはできないので、毎回作るか何らかの方法をとる必要があります。右上の「Add SSH Key」を押し、ホスト名と秘密鍵を入力したら画像のようにfinger printが表示されます。これは鍵が正しいことを照明するためのもので、あとで使います。

設定ファイルを書く

ここまで出来たらあとはファイルを書くだけです。対象のディレクトリ直下に.circleciフォルダを作ります。頭に.をつけるのを忘れないように注意!そのフォルダの中にconfig.ymlファイルを作成し、以下の内容を書きます。

version: 2

jobs:
  deploy:
    docker:
      # only 5MB Linux!
      - image: alpine:latest
    steps:
      # default directory /root/project
      - checkout
      - add_ssh_keys:
          fingerprints:
            - "ba:a2:14:b0:cd:84:37:4c:64:8d:95:f0:48:00:27:37"
      - run:
          name: Get rsync Command
          command: |
            apk update
            apk add rsync openssh
      - run:
          name: Set Known Host
          command: ssh-keyscan -p ${PORT} ${HOST_NAME} >> ~/.ssh/known_hosts
      - run:
          name: List up Excluding Files
          command: |
            touch excludes.txt
            echo "./.git/" > excludes.txt
            echo "./.gitignore" > excludes.txt
            echo "./.circleci/" > excludes.txt
            echo "./sass/" > excludes.txt
            echo "./package.json" > excludes.txt
            echo "./*.lock" > excludes.txt
            echo "./excludes.txt" > excludes.txt
      - run:
          name: Create Directory for Deploy
          command: mkdir -p /tmp/site2018
      - run:
          name: Copy Files for Deploy
          command: rsync -rva --delete --exclude-from=excludes.txt ./ /tmp/site2018

      - run:
          name: Deploy
          command: |
            rsync -avr --delete -e "ssh -p ${PORT}" /tmp/site2018 ${USER_NAME}@${HOST_NAME}:/var/www/rikoten.com
workflows:
  version: 2
  deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only: master

ymlはインデントで区別します。スペース一個でエラー吐かれるので注意してください。
全部を説明すると疲れるのでそこそこ省きますが、jobsではcircleCIが行うべきことを羅列しています。stepsブロック以下では、上から順に定義したコマンドを実行していきます。簡単に説明すると、リポジトリに移動し先ほど設定したssh鍵を読み込み、/tmp/site2018にデプロイしたいファイルをコピーし、rsyncでサーバーにアップロードしています。さらにこのコマンドはmasterブランチにpushされた場合のみに起動します。
設定ファイルが書けたらコミットしてpushしましょう。実際に起動するためにはmasterブランチへマージします。