SlideShare a Scribd company logo
1 of 95
Download to read offline
Google Container Builder と
友だちになるまで
GCPUG Tokyo Container Builder Day
February2018
Daisuke Maki @lestrrat (HDE inc)
• @lestrrat
• Perl/Go hacker, author, father
• Author of github.com/peco/peco
• Organizer for builderscon
<宣伝>
http://blog.builderscon.io/entry/call-for-sponsors-2018
スポンサー募集中!!!
Google Container Builder(GCB)
Google Cloud Container Builder を使用すると、Google
Cloud Storage、Google Cloud Source Repositories、
GitHub、BitBucket にあるアプリケーション ソースコード
から Docker コンテナ イメージを作成できます。
Container Builder で作成したコンテナ イメージは Google
Container Registry に自動的に格納されます
「なるほどわからん」
GCBとは?
ソースコード step 1
step 2
…
step N
Google Container Registry
Google Source Repository その他
…
GCBとは?
• ソースコードを送る
• 指定された「ステップ」実行する
• ステップから成果物をどこか(例:gcr.io)に送る
「これ知ってる」
CIサービスだ!
補足
• GCP的にはCIサービスではない
• やろうと思えばテストもある程度できる
• あくまで「構造が似ている」という意味
Should I Use GCB
いきなりですが…
GCBを使うべき理由
• コンテナイメージをビルドしたい
• GCP上にリソースが全部ある
• もうリモートデバッグしたくない
(後述)
GCBを使わない理由
• コンテナを使ってない
• テストを(真面目に)走らせたい
• GCPのサービスを使っていない
実践!GCB
背景
• ソースコードはGitlabにあるmonorepo
• テストは別で行う
• イメージデプロイ先はasia.gcr.io
GCBリクエスト
gcloud container builds submit …
GCBビルドは「リクエスト」から始まる
GCBリクエスト
• docker buildコマンドのようにコンテキストを受け取る
gcloud container builds submit source
GCBリクエスト
• コンテキストはGoogle Storageに保存される
• GSRからのキックの場合は、clone結果が保存
される?(試してない)
ソースコード step 1
step 2
…
step N
Google Container Registry
Google Source Repository
…
GitlabはGSRでサポートされない…
ソースコード step 1
step 2
…
step N
Google Container Registry
Google Source Repository
…
GitlabはGSRでサポートされない…
GCBリクエスト
• 毎回monorepoを全部Google Storageに保存す
るの… 嫌だ…
• → 後述
ステップ
• リクエストを受け取った後、cloudbuild.yaml
内のステップを順番に実行する
ステップ
https://cloud.google.com/container-builder/docs/api/build-steps
https://cloud.google.com/container-builder/docs/how-to/writing-build-requests
ステップ
https://cloud.google.com/container-builder/docs/api/build-steps
https://cloud.google.com/container-builder/docs/how-to/writing-build-requests
「わかるよーな…わからんよーな…」
ステップ
• CIサービスでは「コマンド」を指定していく
スタイルが多い
• GCBは「コンテナ」を指定してく
GCBステップの「原理」
for step in config.steps
docker run step.image step.args
done
ステップ実行のイメージ
• git clone コンテナ
• go build コンテナ
• docker push コンテナ
ステップのコンテナイメージ
• よく使うものについてはGoogleが用
意してくれている → https://github.com/
GoogleCloudPlatform/cloud-builders
• gcloud, git, go等
ステップ詳細
ソースの取得
• Gitlabからプライベートなレポジトリを
クローンする(コードをアップロードしない)
• Gitlabの認証を行う必要がある
認証
• 認証トークンのようなデータはレポジト
リに入れたくない
• Google Key Management Services (KMS)
• KMSについては… 詳しくはWebで!
KMSからキーを得る
- name: 'gcr.io/cloud-builders/gcloud'
args:
- kms
- decrypt
- --ciphertext-file=gitlab-deploy.enc
- --plaintext-file=/root/.ssh/id_ed25519
- --location=global
- --keyring=cloudbuild
- --key=gitlab
volumes:
- name: 'ssh'
path: /root/.ssh
KMSからキーを得る
- name: 'gcr.io/cloud-builders/gcloud'
args:
- kms
- decrypt
- --ciphertext-file=gitlab-deploy.enc
- --plaintext-file=/root/.ssh/id_ed25519
- --location=global
- --keyring=cloudbuild
- --key=gitlab
volumes:
- name: 'ssh'
path: /root/.ssh
gcloudを使うための
コンテナを指定じゃ
KMSからキーを得る
- name: 'gcr.io/cloud-builders/gcloud'
args:
- kms
- decrypt
- --ciphertext-file=gitlab-deploy.enc
- --plaintext-file=/root/.ssh/id_ed25519
- --location=global
- --keyring=cloudbuild
- --key=gitlab
volumes:
- name: 'ssh'
path: /root/.ssh
gcloudコマンドの引数
じゃ。/root/.ssh以下
に解読結果を残すぞ!
KMSからキーを得る
- name: 'gcr.io/cloud-builders/gcloud'
args:
- kms
- decrypt
- --ciphertext-file=gitlab-deploy.enc
- --plaintext-file=/root/.ssh/id_ed25519
- --location=global
- --keyring=cloudbuild
- --key=gitlab
volumes:
- name: 'ssh'
path: /root/.ssh
解読結果を残すためのスト
レージじゃ。あとでマウン
トして読み込めるぞい
.ssh/configを設定する
• .ssh/configで gitlab.comで使うキーを
設定する
• 諸事情により、後ほど説明
キーを使ってgit cloneする
- name: 'gcr.io/cloud-builders/git'
args:
- clone
- —depth=1
- —branch=master
- --single-branch
- git@gitlab.com:myaccount/myrepo.git
volumes:
- name: 'ssh'
path: /root/.ssh
キーを使ってgit cloneする
- name: 'gcr.io/cloud-builders/git'
args:
- clone
- —depth=1
- —branch=master
- --single-branch
- git@gitlab.com:myaccount/myrepo.git
volumes:
- name: 'ssh'
path: /root/.ssh
gitを使うためのコ
ンテナじゃ
キーを使ってgit cloneする
- name: 'gcr.io/cloud-builders/git'
args:
- clone
- —depth=1
- —branch=master
- --single-branch
- git@gitlab.com:myaccount/myrepo.git
volumes:
- name: 'ssh'
path: /root/.ssh 前のステップで作ったキー
を読み込むためにボリュー
ムをマウントするぞ
キーを使ってgit cloneする
- name: 'gcr.io/cloud-builders/git'
args:
- clone
- —depth=1
- —branch=master
- --single-branch
- git@gitlab.com:myaccount/myrepo.git
volumes:
- name: 'ssh'
path: /root/.ssh
git コマンドの引数
じゃ。~/.sshのキーを
勝手に使ってくれるぞ
依存関係
• まだ glide
•
公式イメージ
- name: gcr.io/cloud-builders/glide
id: glide:myrepo
waitFor:
- checkout-done
env:
- PROJECT_ROOT=myproject/myrepo # おまじない
args:
- install
注:公式イメージからコミュニティレポジトリに移動されているので、
多分イメージはそのうちなくなる
公式イメージ使えば簡単だと思った?
残念でした!
問題
• 我々はmonorepoを使っている
• つまり、ワークスペース直下にglide.yamlがあるわけで
はない)
• オフィシャルのステップは、コマンドそ
のものではなく、ラッパースクリプトをかま
している
問題
• 正しいディレクトリにcdできれば…
• あれ、どうやって任意のコマンドを実行
するの?
• まさか… イメージをそのために作る?
そもそも…
デバッグどうするの
• lsしたりenvしたり、環境を確認したい
• 適時echoをはさんだりしたい
• 主コマンド以外どうやって実行するの?
entrypoint
- name: gcr.io/cloud-builders/glide
entrypoint: …
entrypoint
- name: gcr.io/cloud-builders/glide
entrypoint: …
entrypoint
docker run —entrypoint=… image
entrypoint
docker run —entrypoint=… image
愚痴
• entrypointについて、ビルドステップの
ドキュメントに一切説明がない (https://
cloud.google.com/container-builder/docs/build-config)
• APIの説明まで行くと解説がある (https://
cloud.google.com/container-builder/docs/api/reference/
rest/v1/projects.builds#Build)
entrypoint=bash
- name: gcr.io/cloud-builders/glide
entrypoint: bash
args:
— -c
— |
echo “Hello, World!”
entrypoint=bash
- name: gcr.io/cloud-builders/glide
entrypoint: bash
args:
— -c
— |
echo “Hello, World!”
bash -cを通して任意
のスクリプトを実行で
きるのじゃ!
cd && glide installでいいと思った?
残念でした!
問題
• cd … && glide install はだめ
• 「正しいGoのファイル配置」をゴニョゴニョして
あげる必要がある
OSS FTW
glide Dockerfile
FROM gcr.io/cloud-builders/go:debian
RUN GOPATH=/go && curl https://glide.sh/get | sh
COPY glide.bash /builder/bin/
ENV PATH=/builder/bin:$PATH
ENTRYPOINT ["glide.bash"]
glide Dockerfile
FROM gcr.io/cloud-builders/go:debian
RUN GOPATH=/go && curl https://glide.sh/get | sh
COPY glide.bash /builder/bin/
ENV PATH=/builder/bin:$PATH
ENTRYPOINT ["glide.bash"]
glide Dockerfile
. /builder/prepare_workspace.inc
prepare_workspace || exit
/go/bin/glide "$@"
glide Dockerfile
. /builder/prepare_workspace.inc
prepare_workspace || exit
/go/bin/glide "$@"
問題
• cd … && glide.bashもだめ
• /workspace直下にいる事を前提としたスクリプト
になっている…
正解
- name: gcr.io/cloud-builders/glide
id: glide:myrep
env:
- PROJECT_ROOT=myproject/myrepo
entrypoint: bash
args:
- '-c'
- |
. /builder/prepare_workspace.inc
prepare_workspace || exit
cd subdirectory
/go/bin/glide install
正解
- name: gcr.io/cloud-builders/glide
id: glide:myrep
env:
- PROJECT_ROOT=myproject/myrepo
entrypoint: bash
args:
- '-c'
- |
. /builder/prepare_workspace.inc
prepare_workspace || exit
cd subdirectory
/go/bin/glide install
glide.bashをバラして
自分で記述したの
じゃ!
ここまでのおさらい
• ステップはイメージ
• 認証関連は KMS 使おう
• イメージの中では主コマンド実行以外にも色々やっている
• デバッグはentrypoint=bash
• 主コマンド以外色々やりたかったらentrypoint=bash
これだけでやりたい事は
ほぼ全てできるはずです
その他細かいこと
変数
• 全てのユーザ変数は “_”で始まる必要がある
• 展開がわかりにくいので、「なるたけ使わな
い」が吉と見た。
.ssh/configを設定する
- name: 'gcr.io/cloud-builders/git'
entrypoint: bash
args:
- '-c'
- |
chmod 600 /root/.ssh/id_ed25519
cat <<EOF >/root/.ssh/config
Hostname gitlab.com
IdentityFile /root/.ssh/id_ed25519
EOF
mv known_hosts /root/.ssh/known_hosts
volumes:
- name: 'ssh'
path: /root/.ssh
.ssh/configを設定する
- name: 'gcr.io/cloud-builders/git'
entrypoint: bash
args:
- '-c'
- |
chmod 600 /root/.ssh/id_ed25519
cat <<EOF >/root/.ssh/config
Hostname gitlab.com
IdentityFile /root/.ssh/id_ed25519
EOF
mv known_hosts /root/.ssh/known_hosts
volumes:
- name: 'ssh'
path: /root/.ssh
このコンテナを使う
意味は特にないぞ
い。
.ssh/configを設定する
- name: 'gcr.io/cloud-builders/git'
entrypoint: bash
args:
- '-c'
- |
chmod 600 /root/.ssh/id_ed25519
cat <<EOF >/root/.ssh/config
Hostname gitlab.com
IdentityFile /root/.ssh/id_ed25519
EOF
mv known_hosts /root/.ssh/known_hosts
volumes:
- name: 'ssh'
path: /root/.ssh
よくあるヤツじゃ。
.ssh/configを設定する
- name: 'gcr.io/cloud-builders/git'
entrypoint: bash
args:
- '-c'
- |
chmod 600 /root/.ssh/id_ed25519
cat <<EOF >/root/.ssh/config
Hostname gitlab.com
IdentityFile /root/.ssh/id_ed25519
EOF
mv known_hosts /root/.ssh/known_hosts
volumes:
- name: 'ssh'
path: /root/.ssh このファイルも/root/.ssh
で後ほど使うのでマウント
じゃ。
スクリプトで複数ステップ
• デプロイは gcloud, gsutil, helm, kubectlをいっぺんに
使ったスクリプトを使いたい
• GCBには個別のイメージはあるが、全部一緒のものはない
自分で作ればよし!
スクリプト実行
- name: asia.gcr.io/$PROJECT_ID/cloud-sdk
entrypoint: bash
args:
- -c
- |
cd myrepo
./deploy/scripts/deploy.sh
スクリプト実行
- name: asia.gcr.io/$PROJECT_ID/cloud-sdk
entrypoint: bash
args:
- -c
- |
cd myrepo
./deploy/scripts/deploy.sh
自分で作ったイメー
ジじゃ
スクリプト実行
- name: asia.gcr.io/$PROJECT_ID/cloud-sdk
entrypoint: bash
args:
- -c
- |
cd myrepo
./deploy/scripts/deploy.sh
この中で色々使うの
じゃ。
イメージの準備
FROM alpine:3.6 AS helm
RUN apk add --update --no-cache ca-certificates git
ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz
RUN apk add --update -t deps curl tar gzip
RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar
zxv -C /tmp
FROM google/cloud-sdk:alpine
COPY --from=helm /tmp/linux-amd64/helm /bin/helm
RUN gcloud components install kubectl docker-credential-gcr gsutil
イメージの準備
FROM alpine:3.6 AS helm
RUN apk add --update --no-cache ca-certificates git
ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz
RUN apk add --update -t deps curl tar gzip
RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar
zxv -C /tmp
FROM google/cloud-sdk:alpine
COPY --from=helm /tmp/linux-amd64/helm /bin/helm
RUN gcloud components install kubectl docker-credential-gcr gsutil
マルチステージDockerfile
でまずhelmを取得しておい
て、あとでコピーじゃ
イメージの準備
FROM alpine:3.6 AS helm
RUN apk add --update --no-cache ca-certificates git
ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz
RUN apk add --update -t deps curl tar gzip
RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar
zxv -C /tmp
FROM google/cloud-sdk:alpine
COPY --from=helm /tmp/linux-amd64/helm /bin/helm
RUN gcloud components install kubectl docker-credential-gcr gsutil
こちらではすでにビル
ドされているcloud-
sdkをまるっと使うぞ
イメージの準備
FROM alpine:3.6 AS helm
RUN apk add --update --no-cache ca-certificates git
ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz
RUN apk add --update -t deps curl tar gzip
RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar
zxv -C /tmp
FROM google/cloud-sdk:alpine
COPY --from=helm /tmp/linux-amd64/helm /bin/helm
RUN gcloud components install kubectl docker-credential-gcr gsutil
kubectl等もこのタイ
ミングでgcloudからイ
ンストールじゃ
イメージの準備
FROM alpine:3.6 AS helm
RUN apk add --update --no-cache ca-certificates git
ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz
RUN apk add --update -t deps curl tar gzip
RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar
zxv -C /tmp
FROM google/cloud-sdk:alpine
COPY --from=helm /tmp/linux-amd64/helm /bin/helm
RUN gcloud components install kubectl docker-credential-gcr gsutil
gcr.ioにpushするなら
これをいれておくとよ
いぞ!
GCB奥義
ローカル環境で実行
CIで開発の憂鬱
• ジョブを送る → 待つ
• 失敗する
• 手元に環境がないので適当にあたりをつ
けてデバッグ用コードをしこむ
• 最初に戻る
待つの辛い
(一度gitlabで10時間待たされた…)
GCB
• ほとんど待ち時間はない
• が、リソースを消費する
• デバッグならローカルでてきたほうが嬉しい
ローカルで動くGCB
gcloud components install container-builder-local
ここまで説明してきた事が
全部ローカルで実行可能!
最高です
まとめ
The Good Parts
• ローカル環境で爆速で開発できる
• ローカル環境で爆速で開発できる(2回目)
• 下手にCIサービスのキャッシュとかに振り
回されるより効率的な環境を作れる
• Googleのサービスと絡めやすい
The Bad Parts
• Moving Partsが増える
• コンテナイメージの管理等
• UIとはなんだったのか
• ドキュメントとはなんだったのか
• entrypointのトリックを知らないとデバッグ
が無理
Questions?
参考
• https://medium.com/@lestrrat/taming-google-
container-builder-22a6dded155c

More Related Content

What's hot

Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cythonAtsuo Ishimoto
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門Tomoya Kawanishi
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerlcharsbar
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼうDaiki Ichinose
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.specKent Ohashi
 
Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)Teloo
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜Sotaro Omura
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014Rui Hirokawa
 
about Thrift
about Thriftabout Thrift
about ThriftNaoya Ito
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium MobileNaoya Ito
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyYuya Takeyama
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るMasahiro Wakame
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...Yoshifumi Kawai
 

What's hot (20)

Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerl
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼう
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.spec
 
Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
 
about Thrift
about Thriftabout Thrift
about Thrift
 
Rake
RakeRake
Rake
 
PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium Mobile
 
GraphQL入門
GraphQL入門GraphQL入門
GraphQL入門
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
 
URLで遊ぼう
URLで遊ぼうURLで遊ぼう
URLで遊ぼう
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
 

Similar to Google container builderと友だちになるまで

GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境Kazuhiro Nishiyama
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
Debianを用いたCortex-M3マイコン開発事例のご紹介
Debianを用いたCortex-M3マイコン開発事例のご紹介Debianを用いたCortex-M3マイコン開発事例のご紹介
Debianを用いたCortex-M3マイコン開発事例のご紹介Kiwamu Okabe
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションKazuhiro Hara
 
mbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングmbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングKiwamu Okabe
 
いいこんぶGitマニュアル
いいこんぶGitマニュアルいいこんぶGitマニュアル
いいこんぶGitマニュアルKaito Yuuki
 
Playbay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイPlaybay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイKazuhiro Hara
 
Goで作って配布するAzureコマンドラインユーティリティ
Goで作って配布するAzureコマンドラインユーティリティGoで作って配布するAzureコマンドラインユーティリティ
Goで作って配布するAzureコマンドラインユーティリティyaegashi
 
Chef+serverspec+werckerでインフラCIする話
Chef+serverspec+werckerでインフラCIする話Chef+serverspec+werckerでインフラCIする話
Chef+serverspec+werckerでインフラCIする話Masayuki Morita
 
Metahub for github
Metahub for githubMetahub for github
Metahub for githubSuguru Oho
 
GitHub Actions + Cloudflare API
GitHub Actions + Cloudflare APIGitHub Actions + Cloudflare API
GitHub Actions + Cloudflare APITakahiro Kudo
 
GitHub最新情報キャッチアップ 2023年6月
GitHub最新情報キャッチアップ 2023年6月GitHub最新情報キャッチアップ 2023年6月
GitHub最新情報キャッチアップ 2023年6月Kazumi IWANAGA
 
コンテナ時代だからこそ要注目! Cloud Foundry
コンテナ時代だからこそ要注目! Cloud Foundryコンテナ時代だからこそ要注目! Cloud Foundry
コンテナ時代だからこそ要注目! Cloud FoundryKazuto Kusama
 

Similar to Google container builderと友だちになるまで (20)

GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
Debianを用いたCortex-M3マイコン開発事例のご紹介
Debianを用いたCortex-M3マイコン開発事例のご紹介Debianを用いたCortex-M3マイコン開発事例のご紹介
Debianを用いたCortex-M3マイコン開発事例のご紹介
 
Gitの紹介
Gitの紹介Gitの紹介
Gitの紹介
 
Vyatta 改造入門
Vyatta 改造入門Vyatta 改造入門
Vyatta 改造入門
 
Capistrano
CapistranoCapistrano
Capistrano
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
 
mbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングmbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミング
 
GitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼうGitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼう
 
いいこんぶGitマニュアル
いいこんぶGitマニュアルいいこんぶGitマニュアル
いいこんぶGitマニュアル
 
Dockerと継続的インテグレーション
Dockerと継続的インテグレーションDockerと継続的インテグレーション
Dockerと継続的インテグレーション
 
Playbay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイPlaybay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイ
 
Goで作って配布するAzureコマンドラインユーティリティ
Goで作って配布するAzureコマンドラインユーティリティGoで作って配布するAzureコマンドラインユーティリティ
Goで作って配布するAzureコマンドラインユーティリティ
 
Chef+serverspec+werckerでインフラCIする話
Chef+serverspec+werckerでインフラCIする話Chef+serverspec+werckerでインフラCIする話
Chef+serverspec+werckerでインフラCIする話
 
Git (運用編)
Git (運用編)Git (運用編)
Git (運用編)
 
Metahub for github
Metahub for githubMetahub for github
Metahub for github
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
GitHub Actions + Cloudflare API
GitHub Actions + Cloudflare APIGitHub Actions + Cloudflare API
GitHub Actions + Cloudflare API
 
GitHub最新情報キャッチアップ 2023年6月
GitHub最新情報キャッチアップ 2023年6月GitHub最新情報キャッチアップ 2023年6月
GitHub最新情報キャッチアップ 2023年6月
 
コンテナ時代だからこそ要注目! Cloud Foundry
コンテナ時代だからこそ要注目! Cloud Foundryコンテナ時代だからこそ要注目! Cloud Foundry
コンテナ時代だからこそ要注目! Cloud Foundry
 

More from lestrrat

Future of Tech "Conferences"
Future of Tech "Conferences"Future of Tech "Conferences"
Future of Tech "Conferences"lestrrat
 
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 WinterONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winterlestrrat
 
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPISlicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPIlestrrat
 
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由lestrrat
 
Rejectcon 2018
Rejectcon 2018Rejectcon 2018
Rejectcon 2018lestrrat
 
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinnerBuilderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinnerlestrrat
 
筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーションlestrrat
 
iosdc 2017
iosdc 2017iosdc 2017
iosdc 2017lestrrat
 
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門シュラスコの食べ方 超入門
シュラスコの食べ方 超入門lestrrat
 
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃないOSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃないlestrrat
 
Coding in the context era
Coding in the context eraCoding in the context era
Coding in the context eralestrrat
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)lestrrat
 
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016lestrrat
 
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24lestrrat
 
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016lestrrat
 
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれいまさら聞けないselectあれこれ
いまさら聞けないselectあれこれlestrrat
 
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016lestrrat
 
How To Think In Go
How To Think In GoHow To Think In Go
How To Think In Golestrrat
 
On internationalcommunityrelations
On internationalcommunityrelationsOn internationalcommunityrelations
On internationalcommunityrelationslestrrat
 
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)lestrrat
 

More from lestrrat (20)

Future of Tech "Conferences"
Future of Tech "Conferences"Future of Tech "Conferences"
Future of Tech "Conferences"
 
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 WinterONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winter
 
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPISlicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPI
 
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由
 
Rejectcon 2018
Rejectcon 2018Rejectcon 2018
Rejectcon 2018
 
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinnerBuilderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinner
 
筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション
 
iosdc 2017
iosdc 2017iosdc 2017
iosdc 2017
 
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門シュラスコの食べ方 超入門
シュラスコの食べ方 超入門
 
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃないOSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃない
 
Coding in the context era
Coding in the context eraCoding in the context era
Coding in the context era
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
 
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016
 
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
 
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016
 
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれいまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
 
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016
 
How To Think In Go
How To Think In GoHow To Think In Go
How To Think In Go
 
On internationalcommunityrelations
On internationalcommunityrelationsOn internationalcommunityrelations
On internationalcommunityrelations
 
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
 

Google container builderと友だちになるまで