Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CloudBuildで docker-composeとansibleを使っている話

Ikuo Kumagai
October 01, 2019

CloudBuildで docker-composeとansibleを使っている話

Google Cloud Build Day で発表
https://gcpug-tokyo.connpass.com/event/143453/

Ikuo Kumagai

October 01, 2019
Tweet

More Decks by Ikuo Kumagai

Other Decks in Technology

Transcript

  1. CloudBuild 内で
    docker-composeと
    ansibleで
    buildとCIしている話
    1

    View Slide

  2. AXLBIT Inc.
    • 開発環境でのみGCPを利⽤しています。
    • 先⽉のBuild Timeは24,871.67 minutes です
    弊社の状況
    2

    View Slide

  3. AXLBIT Inc.
    • Ansible playbookで環境構築が⾃動化されている既存の
    運⽤プロセスがあった。
    背景(Cloud Build 以前 )
    3
    Deploy anywhere!
    No problem!

    View Slide

  4. AXLBIT Inc.
    • Ansible で DockerコンテナにDeployして commit
    • OS初期状態のコンテナにAnsible で Deploy
    • できたコンテナをイメージ化
    Step1 Docker Image Build
    4
    デプロイ
    via Docker イメージ化
    動作環境
    コンテナ
    docker
    commit

    View Slide

  5. AXLBIT Inc.
    • 最初はAnsible実⾏時のOSの初期状態だけを作成
    • AnsibleからOSの初期設定をしている部分などはここに
    いれる
    }
    Yum update & reboot -> 最新のOSイメージを使ってリビルド
    }
    タイムゾーンの設定、localeの設定 …
    Base のDockerfileには最低限だけ
    5
    FROM centos:7
    RUN yum -y update ¥
    && yum -y install epel-release ¥
    && yum -y update ¥
    && yum -y install initscripts MAKEDEV git bc ansible syslog¥
    && yum install -y yum-utils device-mapper-persistent-data lvm2 ¥
    RUN localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8; echo "";
    env LANG=ja_JP.UTF-8
    RUN unlink /etc/localtime
    RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime
    WORKDIR /root/deploy
    ENTRYPOINT ["/root/deploy/init.sh"]

    View Slide

  6. AXLBIT Inc.
    • AnsibleでDockerにDeployするからといって、初期イ
    メージにSSHをインストールしなくて良い。
    }
    Hosts で ansible_connection=docker とすればDockerコマンド
    でデプロイ
    Ansible Docker Connection
    6
    [axlgear]
    axlgear ansible_connection=docker
    #Ansible 実⾏環境でDockerコマンドを実⾏した時に接続される環境のdockerコンテナを指定

    View Slide

  7. AXLBIT Inc.
    • VM内でAnsible 実⾏をコンテナで実⾏
    }
    -> イメージ作成
    docker-composeでansible実⾏
    7
    デプロイ
    via docker
    動作環境
    コンテナ
    動作環境
    コンテナ
    VM

    View Slide

  8. AXLBIT Inc.
    • Docker composeと ansibleが実⾏できるイメージ作成
    }
    CloudBuildersイメージには Ansible⼊っていないので⾃作
    ⾃作 docker-compose & ansible イメージ
    8
    FROM centos:7
    RUN yum -y update ¥
    && yum -y install epel-release ¥
    && yum -y update ¥
    && yum -y install initscripts MAKEDEV git bc ansible syslog¥
    && yum install -y yum-utils device-mapper-persistent-data lvm2 ¥
    && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ¥
    && yum install -y docker-ce ¥
    && yum check ¥
    && curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -
    o /usr/local/bin/docker-compose ¥
    && chmod +x /usr/local/bin/docker-compose
    RUN localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8; echo "";
    env LANG=ja_JP.UTF-8
    RUN unlink /etc/localtime
    RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime
    VOLUME /var/lib/docker
    EXPOSE 2375
    WORKDIR /root/deploy
    ENTRYPOINT ["/root/deploy/init.sh"]

    View Slide

  9. AXLBIT Inc.
    • docker-compose.yml
    [Tips] イメージ作成の⾃動化
    9
    version: '3'
    services:
    deploy:
    # default global_env link to .env
    # if you change local_env 'ln -s local_env .env'
    image: ${DEPLOY_BASE}
    command: ./${DEPLOY_COMMAND} common.conf difference-gear-base.conf
    environment:
    - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME}
    - DAEMON=${DAEMON_FLG}
    volumes:
    - ./:/root/deploy:z
    - /var/run/docker.sock:/var/run/docker.sock
    - ~/.ssh:/root/host_keys:ro
    - ../settings:/root/work/:Z
    - ../dep-opt:/opt/:Z
    gear-body:
    #image: ${GEAR_BASE}
    #volumes:
    # - ../opt:/opt/:Z
    image: ${DEPLOYED_GEAR} #デプロイ済みイメージを使う場合
    volumes:
    - ../work:/root/container #デプロイ済みイメージを使う場合のファイル共有⽤
    ports:
    - "443"

    View Slide

  10. AXLBIT Inc.
    ここでCloudBuild
    とかやってた。
    10

    View Slide

  11. AXLBIT Inc.
    • VM内でAnsible 実⾏をコンテナで実⾏
    }
    -> イメージ作成
    docker-composeでansible実⾏
    11
    デプロイ
    via docker
    動作環境
    コンテナ
    動作環境
    コンテナ
    CloudBuild

    View Slide

  12. AXLBIT Inc.
    • docker-composeで構築対象イメージを起動
    }
    -> その後 ansibleイメージを実⾏
    とりあえず構築をCloudBuild化
    12
    - name: 'gcr.io/sixth-hash-162208/deploy-base'
    env:
    - 'COMPOSE_PROJECT_NAME=buildimage'
    - 'BRANCH_NAME=$BRANCH_NAME'
    entrypoint: 'bash'
    args:
    - '-c'
    - |
    set -xe
    #これは各test-addon側のファイルを置く
    cp /root/.ssh/* $_CLOUD_BUILD_DIR/.ssh/
    cd $_CLOUD_BUILD_DIR/makeimage
    docker-compose up -d gear
    docker-compose up --exit-code-from deploy deploy
    volumes:
    - name: 'ssh'
    path: /root/.ssh
    - name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'bash'
    args:
    - '-c'
    - |
    _imagetag=$$(echo gcr.io/${PROJECT_ID}/gear_$$_localrepo:$$_branch)
    echo "tag: $$_imagetag"
    docker commit buildimage_gear_1 $$_imagetag
    docker push $$_imagetag

    View Slide

  13. AXLBIT Inc.
    • ⾃動テスト実⾏のためのベースイメージとして
    • 開発者にGCEのテンプレート共に渡す
    • 社内のデモ環境としてGKE上で起動
    作ったイメージを何に使っているのか
    13

    View Slide

  14. AXLBIT Inc.
    • Cloudbuild.yamlをリポジトリの外に置きたい。
    }
    Buildやテストのプロセス修正時に本筋の commit log が汚れる
    }
    実⾏プロセスは極⼒別リポジトリのShellにおいて、都度pull
    • プルリクがあるときだけ実⾏したい
    }
    Envファイルにマージターゲットのブランチを記載しGithub API
    でプルリクの存在チェック。あるときだけ実⾏
    ▪ -> いまは プルリク連携できるらしいと。。
    • これまでの最⻑Buildは13時間、、
    }
    かなり無駄遣いしている感
    悩んだことと対応してきたこと
    14

    View Slide