Google Cloud Build Day で発表 https://gcpug-tokyo.connpass.com/event/143453/
CloudBuild 内でdocker-composeとansibleでbuildとCIしている話1
View Slide
AXLBIT Inc.• 開発環境でのみGCPを利⽤しています。• 先⽉のBuild Timeは24,871.67 minutes です弊社の状況2
AXLBIT Inc.• Ansible playbookで環境構築が⾃動化されている既存の運⽤プロセスがあった。背景(Cloud Build 以前 )3Deploy anywhere!No problem!
AXLBIT Inc.• Ansible で DockerコンテナにDeployして commit• OS初期状態のコンテナにAnsible で Deploy• できたコンテナをイメージ化Step1 Docker Image Build4デプロイvia Docker イメージ化動作環境コンテナdockercommit
AXLBIT Inc.• 最初はAnsible実⾏時のOSの初期状態だけを作成• AnsibleからOSの初期設定をしている部分などはここにいれる}Yum update & reboot -> 最新のOSイメージを使ってリビルド}タイムゾーンの設定、localeの設定 …Base のDockerfileには最低限だけ5FROM centos:7RUN 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-8RUN unlink /etc/localtimeRUN ln -s /usr/share/zoneinfo/Japan /etc/localtimeWORKDIR /root/deployENTRYPOINT ["/root/deploy/init.sh"]
AXLBIT Inc.• AnsibleでDockerにDeployするからといって、初期イメージにSSHをインストールしなくて良い。}Hosts で ansible_connection=docker とすればDockerコマンドでデプロイAnsible Docker Connection6[axlgear]axlgear ansible_connection=docker#Ansible 実⾏環境でDockerコマンドを実⾏した時に接続される環境のdockerコンテナを指定
AXLBIT Inc.• VM内でAnsible 実⾏をコンテナで実⾏}-> イメージ作成docker-composeでansible実⾏7デプロイvia docker動作環境コンテナ動作環境コンテナVM
AXLBIT Inc.• Docker composeと ansibleが実⾏できるイメージ作成}CloudBuildersイメージには Ansible⼊っていないので⾃作⾃作 docker-compose & ansible イメージ8FROM centos:7RUN 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-composeRUN localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8; echo "";env LANG=ja_JP.UTF-8RUN unlink /etc/localtimeRUN ln -s /usr/share/zoneinfo/Japan /etc/localtimeVOLUME /var/lib/dockerEXPOSE 2375WORKDIR /root/deployENTRYPOINT ["/root/deploy/init.sh"]
AXLBIT Inc.• docker-compose.yml[Tips] イメージ作成の⾃動化9version: '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.confenvironment:- 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/:Zgear-body:#image: ${GEAR_BASE}#volumes:# - ../opt:/opt/:Zimage: ${DEPLOYED_GEAR} #デプロイ済みイメージを使う場合volumes:- ../work:/root/container #デプロイ済みイメージを使う場合のファイル共有⽤ports:- "443"
AXLBIT Inc.ここでCloudBuildとかやってた。10
AXLBIT Inc.• VM内でAnsible 実⾏をコンテナで実⾏}-> イメージ作成docker-composeでansible実⾏11デプロイvia docker動作環境コンテナ動作環境コンテナCloudBuild
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/makeimagedocker-compose up -d geardocker-compose up --exit-code-from deploy deployvolumes:- 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 $$_imagetagdocker push $$_imagetag
AXLBIT Inc.• ⾃動テスト実⾏のためのベースイメージとして• 開発者にGCEのテンプレート共に渡す• 社内のデモ環境としてGKE上で起動作ったイメージを何に使っているのか13
AXLBIT Inc.• Cloudbuild.yamlをリポジトリの外に置きたい。}Buildやテストのプロセス修正時に本筋の commit log が汚れる}実⾏プロセスは極⼒別リポジトリのShellにおいて、都度pull• プルリクがあるときだけ実⾏したい}Envファイルにマージターゲットのブランチを記載しGithub APIでプルリクの存在チェック。あるときだけ実⾏▪ -> いまは プルリク連携できるらしいと。。• これまでの最⻑Buildは13時間、、}かなり無駄遣いしている感悩んだことと対応してきたこと14