Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CloudBuildで docker-composeとansibleを使っている話
Search
Ikuo Kumagai
October 01, 2019
Technology
1
1.5k
CloudBuildで docker-composeとansibleを使っている話
Google Cloud Build Day で発表
https://gcpug-tokyo.connpass.com/event/143453/
Ikuo Kumagai
October 01, 2019
Tweet
Share
More Decks by Ikuo Kumagai
See All by Ikuo Kumagai
プロダクト運用のCloudOps化に伴うジレンマ
kumagai19o
0
240
Ansible から Docker への実践記
kumagai19o
0
130
Other Decks in Technology
See All in Technology
2.5Dモデルのすべて
yu4u
2
610
これからSREになる人と、これからもSREをやっていく人へ
masayoshi
6
4.1k
自動テストの世界に、この5年間で起きたこと
autifyhq
10
7.1k
技術負債の「予兆検知」と「状況異変」のススメ / Technology Dept
i35_267
1
1k
バックエンドエンジニアのためのフロントエンド入門 #devsumiC
panda_program
16
6.5k
Kubernetes x k6 で負荷試験基盤を開発して 負荷試験を民主化した話 / Kubernetes x k6
sansan_randd
2
730
30分でわかる『アジャイルデータモデリング』
hanon52_
9
2.2k
スタートアップ1人目QAエンジニアが QAチームを立ち上げ、“個”からチーム、 そして“組織”に成長するまで / How to set up QA team at reiwatravel
mii3king
1
1.1k
ハッキングの世界に迫る~攻撃者の思考で考えるセキュリティ~
nomizone
12
4.5k
PL900試験から学ぶ Power Platform 基礎知識講座
kumikeyy
0
110
AWSでRAGを実現する上で感じた3つの大事なこと
ymae
3
1k
5分で紹介する生成AIエージェントとAmazon Bedrock Agents / 5-minutes introduction to generative AI agents and Amazon Bedrock Agents
hideakiaoyagi
0
220
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Producing Creativity
orderedlist
PRO
343
39k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
Making the Leap to Tech Lead
cromwellryan
133
9.1k
Code Review Best Practice
trishagee
66
17k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
The Invisible Side of Design
smashingmag
299
50k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Documentation Writing (for coders)
carmenintech
67
4.6k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
Transcript
CloudBuild 内で docker-composeと ansibleで buildとCIしている話 1
AXLBIT Inc. • 開発環境でのみGCPを利⽤しています。 • 先⽉のBuild Timeは24,871.67 minutes です 弊社の状況
2
AXLBIT Inc. • Ansible playbookで環境構築が⾃動化されている既存の 運⽤プロセスがあった。 背景(Cloud Build 以前 )
3 Deploy anywhere! No problem!
AXLBIT Inc. • Ansible で DockerコンテナにDeployして commit • OS初期状態のコンテナにAnsible で
Deploy • できたコンテナをイメージ化 Step1 Docker Image Build 4 デプロイ via Docker イメージ化 動作環境 コンテナ docker commit
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"]
AXLBIT Inc. • AnsibleでDockerにDeployするからといって、初期イ メージにSSHをインストールしなくて良い。 } Hosts で ansible_connection=docker とすればDockerコマンド
でデプロイ Ansible Docker Connection 6 [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 イメージ 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"]
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"
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/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
AXLBIT Inc. • ⾃動テスト実⾏のためのベースイメージとして • 開発者にGCEのテンプレート共に渡す • 社内のデモ環境としてGKE上で起動 作ったイメージを何に使っているのか 13
AXLBIT Inc. • Cloudbuild.yamlをリポジトリの外に置きたい。 } Buildやテストのプロセス修正時に本筋の commit log が汚れる }
実⾏プロセスは極⼒別リポジトリのShellにおいて、都度pull • プルリクがあるときだけ実⾏したい } Envファイルにマージターゲットのブランチを記載しGithub API でプルリクの存在チェック。あるときだけ実⾏ ▪ -> いまは プルリク連携できるらしいと。。 • これまでの最⻑Buildは13時間、、 } かなり無駄遣いしている感 悩んだことと対応してきたこと 14