経理からエンジニア転向した人のメモ

元経理マンがエンジニアに転向して現在

GCPでCircleCI回して自動デプロイ

ざっくりメモ書き程度だが、、、

GCPVMインスタンスの生成

f:id:ryomoyr:20180831223612p:plain

お金がかからないようにmicroを選択

f:id:ryomoyr:20180831223628p:plain

ブラウザで表示確認

kusanagi環境でデプロイでもいいが、ここではテストなのでなし。

nginxのインストール

# yum install epel-release
# yum install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# yum install --enablerepo=nginx nginx
# systemctl start nginx
# systemctl enable nginx

ブラウザに「http://[外部IPアドレス]」を入力すればwelcomeが出てくる。

f:id:ryomoyr:20180831223826p:plain

Nginxのドキュメントルートを変更

/etc/nginx/cond.d/default.conf内に設定されているドキュメントルートを/home/[ユーザ名]/[index.htmlの親ディレクトリ]に設定する。

# vi /etc/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        #root   /usr/share/nginx/html;
        root   /home/[ユーザ名]/[index.htmlの親ディレクトリ];
        index  index.html index.htm;
    }

(略)

index.htmlを作成する。(適当にtestとか打つ)

ブラウザでIPアドレス打って先程の内容が出てくればOK

ドメイン取得している場合

今回は1円のキャンペーンでやっていたドメインを取得 f:id:ryomoyr:20180831224339p:plain

IPアドレスの固定

GCPメニュー > VPCネットワーク > 外部IPアドレスのタイプをエフェメラル→静的に変更してIPアドレスを固定する。

f:id:ryomoyr:20180831223852p:plain

GCPメニュー > ネットワークサービス > CloudDNSでタイプAでIPを入力。 ドメイン側でもネームサーバーを登録。

DNS設定

ドメインに設定するネームサーバーの情報を確認する。

f:id:ryomoyr:20180831223928p:plain

f:id:ryomoyr:20180831224002p:plain

データのところをドメイン側にネームサーバーの情報としてを入れる。

f:id:ryomoyr:20180831223918p:plain

また、AレコードとしてドメインのIPを追加する。

f:id:ryomoyr:20180831224020p:plain

ポート番号変更

セキュリティの問題からポート番号を22番から変える。 ※rootログイン禁止、パスワード認証禁止はデフォルトで設定されている。

# vi /etc/ssh/sshd_config

portのコメントアウトを外して番号を変える。

再起動する。

# systemctl restart sshd

ファイヤーウォールの設定

また、ファイヤーウォールでssh22番を閉じて、変更したポート番号のファイヤーウォールを開ける。 メニュー > VPCネットワーク > ファイヤーウォールルールから変更可能。

f:id:ryomoyr:20180831224053p:plain

リポジトリ作成

ローカルでリポジトリ作成し、gitで管理する。 リモートリポジトリ作成し、pushする。

CircleCI

CircleCIにGitHubアカウントでログインして連携させる。

CircleCIでメニューバーのAddProjectで先程作ったSetUpProjectをクリック

OSと言語を選ぶ(HTMLファイルだけなのでOtherを選択)

リポジトリ内で.circleciフォルダを作成。その中にconfig.ymlファイルを作成。

とりあえずCircleCIに表示されたサンプルをconfig.ymlに入れ込む。

config.yml

version: 2
jobs:
  build:
    docker:
      - image: debian:stretch
    steps:
      - checkout
      - run:
          name: Greeting
          command: echo Hello, world.
      - run:
          name: Print the Current Time
          command: date

一旦、startbuildingすれば連携できているはずなので、何か打ち込んでpushしてCircleCIで反応しているか確認。

できていればOKで、ymlファイルを書き換える。

version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.1-browsers
    steps:
      - checkout

      - add_ssh_keys:
          fingerprints:
            - "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"

      - run:
          name: Start ssh-keyscan
          command: |
            ssh-keyscan -p ${PORT} ${IP} >> ~/.ssh/known_hosts
            echo ${CIRCLE_BRANCH}

      # - deploy:
      #     name: Start develop deploy
      #     command: |
      #       if [ "${CIRCLE_BRANCH}" == "development" ]; then
      #         rsync -av --delete --rsh="ssh -p ${PORT}" --exclude='.git' --exclude='.circleci' ./ ${USER_NAME}@${IP}:[ユーザーのルートディレクトリからindex.htmlまでのpath]
      #       fi

      - deploy:
          name: Start master deploy
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              rsync -av --delete --rsh="ssh -p ${PORT}" --exclude='.git' --exclude='.circleci' ./ ${USER_NAME}@${IP}:[ユーザーのルートディレクトリからindex.htmlまでのpath]
            fi

fingerprintは後述。 Dockerの知識がないので、imageをどれにすればいいかわからない。

初期設定のDebian:strechではssh-keyscanができないのでとりあえずphp...

${}の中は環境変数が入るので、CircleCi上のEnvironment Variablesで後ほど登録

サーバーとCircleCIの連携。

サーバー上で公開鍵を生成。(既にあれば作ってもよい。)

$ ssh-keygen -t rsa

/home/[ユーザー]/.sshに作成されるので、公開鍵はauthorized_keysに名前を変更して、権限を600に変更

ここで作った秘密鍵をcircleciに入れる。

プロジェクトのセッティングからSSH Permissionsに秘密鍵を入力

入力してできたfingerprintをyamlに貼り付ける

ちなみにEnvironment Variablesに見せたくない情報を入れて、yamlで変数上でその変数を読み込む

CircleCIでpermission dienedにったときに確認すること

  • ユーザーフォルダ以下の所有者がユーザーになっているか。
  • ~/.ssh/authorized_keysのパーミッションが600になっているか。

Nginxでpermission dienedになったとき

メモ:
home   666
project   666 
index.html  644