アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

circleCIとgithubを連携して、簡単にコードをGCRにpushできるようにしてみた

コードとかの管理ツールとして、circleCIを使っている。

というのもcircleCIを使えば、コードを書き換えて、githubにuploadすれば、circleCI経由で勝手にGCRにDocker imageがpushされるから。

簡単に言うと便利すぎるから使ってる感じ。

今回、githubとcircleCIを連携して、GCRにdocker pushするまでの過程をまとめた。

目次
・circleCIの何が美味しいの?

1.githubとcircleCIを連携させる

2.Cloud SDKやprojectの設定

3.GCRのAPIを有効にし、発行したJSONキーをcircleCIの環境変数に登録

4.発行したJSONキーをcircleCIに登録

5.githubに.circleci/config.ymlファイルを作成

6.コードをgithubにuploadして、GCRにPushする

circleCIの何が美味しいの?

circleCIを使えば、各APIを利用し、コード管理、自動化とかデプロイまでの作業を簡単にしたりと、いろんなことができる。

circleCIの自動化の利点は図で表すとこんな感じ

circleCI導入前
sshでログインしてデプロイコマンドを叩く必要あり
f:id:trafalbad:20190531141822j:plain


circleCI導入後
デプロイコマンド1つでデプロイが完了
f:id:trafalbad:20190531141451j:plain

個人的にTerraform+github+circleCI+atlasでのインフラ管理(記事)がとても便利で好き。

自分はコードを変更するたびにdocker imageを作成してdocker pushするのが面倒すぎたので、
github+circleCI+GCRで連携
→変更したコードをgithubにあげる
→GCRにdocker pushされる

使い方をした。以下ではそのやり方を書いてく。



1.githubとcircleCIを連携させる

circleCIのサイトに行き、githubアカウントで連携

f:id:trafalbad:20190531141342j:plain

連携方法はこのサイトを参考にした。

主にgithubの連携したいレポジトリを選択して、プランを決めれる。
普通に使うなら、プランはフリーでOK。


2.Cloud SDKやprojectの設定

自分はローカルから使う環境だったので、cloud SDK(gcloudコマンド)をinstallして、GCPのprojectを指定した。

# gcloudコマンド のインストール 
$ curl https://sdk.cloud.google.com | bash
$ exec -l $SHELL

# 認証
$ gcloud init

# 権限承認
$ gcloud auth login

# project認証
$ gcloud config set project PROJECT_ID


3.GCRのAPIを有効にし、発行したJSONキーをcircleCIの環境変数に登録

GCPのコンソール画面から、左の「IAMと管理」→「サービスアカウント」を選択し、アカウント作成。

IAMサービスの「サービスアカウント作成」をクリックして(名前・パスワードは適当)→役割を「ストレージ」にして作成→JSONキーを発行。

左の項目のStorageから、「artifacts.[プロジェクト名].appspot.com」のバケットを選択して、権限ボタンをクリック。

さっき作成したIAMサービスアカウントにそのバケットの「ストレージオブジェクト閲覧者」の権限を付与する。





4.発行したJSONキーをcircleCIに登録

circleCIにアクセスし、左の"ADD PROJECTS"ボタンから連携したgithubのレポジトリを選択し、"Set Up Project"をクリック

f:id:trafalbad:20190531141913j:plain



そのあと、Environment Valiableの「Add variable」をクリック。
f:id:trafalbad:20190531141929j:plain



NAMEは"GCLOUD_SERVICE_KEY"と入力、VALUEにさっき発行したJSONキーの文字列をコピペ。

f:id:trafalbad:20190531141948j:plain




5.githubに.circleci/config.ymlファイルを作成

githubで直接「Create new file」で選択して、githubに".circleci/config.yml"ファイルを作成。

config.ymlのコード内容はこのサイトを参考にした。


自分のconfig.yml

version: 2
jobs:
  build:
    docker:
      - image: google/cloud-sdk
      
    working_directory: /go/src/github.com/[githubのアカウント名]/[対象レポジトリ名]
    steps:
      - checkout
      - setup_remote_docker:
          version: 18.06.0-ce
      - run:
          name: Setup CLOUD SDK
          command: |
            echo $GCLOUD_SERVICE_KEY | gcloud auth activate-service-account --key-file=-
            gcloud --quiet config set project [PROJECT_ID]
            gcloud --quiet config set compute/zone asia-east1-b
            gcloud --quiet auth configure-docker
      - run:
          name: Push docker image
          command: |
            docker build -t go-web-server .
            LATEST_TAG=gcr.io/[PROJECT_ID]/go-web-server:latest
            docker tag go-web-server $LATEST_TAG
            docker push $LATEST_TAG            

6.コードをgithubにuploadして、GCRにPushする

今回はGoの簡単なアプリ用コードをgithubにupload。

Dockerfile

FROM golang:1.11-alpine
WORKDIR /go/src/github.com/naoty/go-web-server
COPY . .
RUN go install github.com/naoty/go-web-server
CMD ["go-web-server"]

main.go

package main
import (
  "fmt"
  "net/http"
)

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello")
  })
  http.ListenAndServe(":8080", nil)
}


このコードをgit pushでアップロード

$ git add .
$ git commit -m “コメント”
$ git push origin master

git pushコマンドとcircleCIが連動して、GCRにdocker pushされんのかな。

circleCIで”SUCCESS”が出て、
f:id:trafalbad:20190531142018p:plain



GCRにちゃんとdocker imageがpushされてる。
f:id:trafalbad:20190531142035p:plain


circleCIはECRとかいろんなデプロイツールとして連携できるので、おすすめ。