Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Introduction to CircleCI
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yubessy
August 09, 2018
Programming
140
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduction to CircleCI
社内勉強会用資料です
yubessy
August 09, 2018
More Decks by yubessy
See All by yubessy
DDIA (Designing Data-Intensive Applications) はいいぞ
yubessy
0
1.7k
Docker Hands-on
yubessy
0
130
Resource Polymorphism
yubessy
0
320
不動点コンビネータ?
yubessy
0
330
とりあえず機械学習したかった
yubessy
0
350
Scala Native
yubessy
0
250
Type Erasure と Reflection のはなし
yubessy
1
500
量子暗号
yubessy
0
270
5分ちょいでわかった気になるラムダアーキテクチャ
yubessy
0
2.3k
Other Decks in Programming
See All in Programming
wkhtmltopdfの次どうするか問題2026
willnet
2
1.9k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
190
Jetpack Compose Mechanisms
skydoves
2
570
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8k
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
360
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
400
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
110
Are APIs Still Relevant in the AI Era?
soyuka
0
440
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
470
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
140
Featured
See All Featured
Scaling GitHub
holman
464
140k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The SEO Collaboration Effect
kristinabergwall1
1
590
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Accessibility Awareness
sabderemane
1
240
How to Think Like a Performance Engineer
csswizardry
28
2.9k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
From π to Pie charts
rasagy
1
390
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
550
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
Building AI with AI
inesmontani
PRO
1
1.3k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Transcript
Introduction to CircleCI
Agenda • جૅฤ • CI, CD ͱ • Circle CI
ͷߏཁૉ • جຊతͳ Job, Step ͷ͍ํ • ൃలฤ • ߴͳ Job, Step ͷ͍ํ • ߴͳ Workflow ͷ͍ํ
త ࢦ͢͜ͱ • CI, CD ͱ CircleCI ͷجຊతͳ֓೦Λཧղ͢Δ • CircleCI
2.0 ͷ Job, Step Λ͍͜ͳͤΔΑ͏ʹͳΔ ѻΘͳ͍͜ͱ • CircleCI 1.0 • ݸผͷݴޠɾϑϨʔϜϫʔΫಛ༗ͷ
جૅฤ
Agenda • جૅฤ • CI, CD ͱ • Circle CI
ͷߏཁૉ • جຊతͳ Job, Step ͷ͍ํ • ൃలฤ
CI, CD ͱʁ ιϑτΣΞ։ൃʹ͓͚ΔɺϏϧυɾςετɾϦϦʔεͷΑ͏ͳ Ұ࿈ͷఆܕॲཧΛࣗಈԽʹΑΓܧଓతʹ܁ΓฦͤΔΑ͏ʹ͢Δ͜ͱ • CI = Continuous Integration
= ܧଓతΠϯςάϨʔγϣϯ • ϦϦʔεʹࢸΔ·ͰͷϏϧυɾςετͳͲΛओʹѻ͏ • CD = Continuous Delivery = ܧଓతσϦόϦ • ϦϦʔεͦͷͷʢσϓϩΠɾϚΠάϨʔγϣϯͳͲʣΛओʹѻ͏
CI, CD ͕͋ΔͱԿ͕خ͍͠ʁ CI, CD ͕ͳ͔ͬͨࠒ • Ϗϧυ: Ϗϧυ৬ਓʹຖճґଘؔͷղܾ͔Βґཔ •
ςετ: ςελʔ͕ඦͷखॱͱࢹ֬ೝΛखಈͰ࣮ࢪ • ϦϦʔε: ΠϯϑϥΤϯδχΞ͕ຊ൪ڥͰेͷίϚϯυΛ࣮ߦ CI, CD Λ͏·͘Εɾɾɾ • Ϗϧυɾςετ: ίʔυΛ push ͢Δͱશ෦ࣗಈͰ࣮ߦ • ϦϦʔε: ४උ͕Ͱ͖ͨΒঝೝϘλϯΛԡ͚ͩ͢
CircleCI ͱʁ Ϛωʔδυͷ CI, CD αʔϏε ಛ: • Github ͷ
branch, tag ͷ push ΛىʹҙͷॲཧΛ࣮ߦ • 1.0 -> 2.0 Ͱେ෯ͳΞοϓσʔτ͕͋Γ΄ͱΜͲผ • ݪଇͱͯ͠ίϯςφΛར༻ (VM͑ͳ͍͜ͱͳ͍) • ॲཧݴޠϑϨʔϜϫʔΫʹґଘͤͣࣗͰॻ͘
Agenda • جૅฤ • CI, CD ͱ • Circle CI
ͷߏཁૉ • جຊతͳ Job, Step ͷ͍ํ • ൃలฤ
Workflow, Job, Step: ॲཧͷ֊Λ͢ཁૉ Ұ࿈ͷॲཧ Workflow, Job, Step ͷॱʹ֊Խ͞ΕΔ workflows:
main: jobs: - test: ... - deploy: ... jobs: test: docker: - image: circleci/python:3 steps: - checkout - run: python -m unittest deploy: ...
Workflow ॲཧΛ·ͱΊΔ࠷େ͖ͳ୯ҐͰɺͻͱͭҎ্ͷ Job Ͱߏ͞ΕΔ workflows: main: jobs: - test: ...
- deploy: ... ଟ͘ͷ߹ 1 ϨϙδτϦʹ͖ͭ 1 Workflow & 1 Job ͱͳΔ ࣮ྻɾฒྻɾذͳͲ͔ͳΓॊೈͳॲཧ͕Ͱ͖Δ (ൃలฤͰհ)
Job ॱ൪ʹ࣮ߦ͞ΕΔॲཧΛ·ͱΊΔ୯ҐͰɺͻͱͭҎ্ͷ Step Ͱߏ͞ΕΔ jobs: test: docker: - image: circleci/python:3
steps: - checkout - run: python -m unittest - ... ॲཧͷ࣮ߦڥجຊతʹ Docker ίϯςφͰఆٛ͢Δ
Step ॲཧͷ࠷খ͞ͳ୯ҐͰɺ࣍ͷΑ͏ͳ͍͔ͭ͘ͷछྨ͕͋Δ (ൃలฤͰհ) # ϨϙδτϦ͔ΒίʔυΛऔಘ - checkout # ίϚϯυΛ࣮ߦ -
run: <command> # ίϚϯυΛ࣮ߦ (͜ͷΑ͏ʹॻ͘͜ͱͰ͖Δ) - run: name: <name> command: <command> # ίϚϯυΛ࣮ߦ (run ͱ΄΅ಉ͕ͩ͡ฒྻ࣮ߦ͞Εͳ͍) - deploy: <command>
Agenda • جૅฤ • CI, CD ͱ • Circle CI
ͷߏཁૉ • جຊతͳ Job, Step ͷ͍ํ • ൃలฤ
Job Λॻ͖࢝ΊΔલʹ ʮԿ͕ʯࣗಈԽʹඞཁ͔ΛௐΔ • ඞཁͳϥΠϒϥϦͲ͏Πϯετʔϧ͢Δʁ • DBϚΠάϨʔγϣϯ͕ผͰཧ͞Ε͍ͯΔͳΒςετDBΛͲ͏ཱͯΔʁ • ίʔυཧͰ͖ͳ͍ΫϨσϯγϟϧͲ͏ͬͯ͢ʁ ʮຊʹʯࣗಈԽ͖͔͢Λߟ͑Δ
• ϦϦʔε·ͰࣗಈԽ͠ͳ͍ͱ͍͚ͳ͍ͷ͔ʁϏϧυɾςετͰे͔ʁ • ϓϧϦΫϚʔδͰࣗಈϦϦʔε͞Εͯେৎ͔ʁࣦഊ࣌ʹΓͤΔ͔ʁ • ຊ൪ڥʹSSH͢Δඞཁ͕͋Δ͔ʁΫϥυඪ४ͷσϓϩΠαʔϏεΛ͑ͳ͍͔ʁ
͡ΊͷҰา ࠷ॳ 1 Job Ͱ Workflow লུͯ͠Α͍ (͜ΕͰ Job ࣮ߦ͞ΕΔ)
version: 2 jobs: build: docker: - image: circleci/ruby:2.4.1-jessie steps: - checkout - run: echo "A first hello"
Docker ΠϝʔδΛબͿ ࣮ߦڥͱͯ͠͏ Docker ΠϝʔδΑ͘ߟ͑ͯબͿ ֤ Step ͷίϚϯυͻͱͭΊͷίϯςφͰ࣮ߦ͞ΕΔ͜ͱʹҙ docker: #
ެࣜͷ `circleci/ruby` `circleci/mysql` ͳͲΛͳΔ͘͏ - image: circleci/python:3.6.2 # ຊ൪ڥͱόʔδϣϯΛἧ͑Δ - image: circleci/mysql:5.7 # (ಉ্)
Step Λదͳ·ͱ·ΓͰ۠Δ # ͻͱ·ͱ·Γͷॲཧ͝ͱʹ Step Λ࡞໊ͬͯલΛ͚ͭΔ - run: name: ڥߏங
command: | python -m venv .venv source .venv/bin/activate pip install -r requirements.txt - run: name: ίʔυͷ੩తղੳ command: | source .venv/bin/activate pep8 . pyflakes . - run: name: ςετ command: | source .venv/bin/activate unittest . # test
Step Λదͳ·ͱ·ΓͰ۠Δ # ྑ͘ͳ͍ྫ: શ෦·ͱΊΔ - run: name: CI command:
| python -m venv .venv source .venv/bin/activate pip install -r requirements.txt pep8 . pyflakes . unittest . # ྑ͘ͳ͍ྫ: 1ίϚϯυͣͭશ෦͚Δ - run: pip install -r requirements.txt - run: pep8 . - run: pyflakes . - run: unittest .
Cache Λదٓར༻͢Δ ϥΠϒϥϦͷΠϯετʔϧύεͳͲΛΩϟογϡ͓ͯ͘͠ͱศར (ൃలฤͰհ) - restore_cache: # Ωϟογϡ͋Ε͔ͦ͜ΒσΟϨΫτϦͷ༰Λ෮ݩ key: requirements-{{
checksum "requirements.txt" }} - run: # ࣮ߦ͞ΕΔ͕σΟϨΫτϦ͕෮ݩ͞Ε͍ͯΕ࣮࣭తʹԿى͖ͳ͍ name: setup venv and pip install command: | python -m venv .venv source .venv/bin/activate pip install -r requirements.txt - save_cache: # σΟϨΫτϦͷ༰ΛΩϟογϡͱͯ͠อଘ key: requirements-{{ checksum "requirements.txt" }} paths: - .venv
جૅฤ͜͜·Ͱ ۙͳ circle.yml ΛಡΜͰΈΑ͏
ൃలฤ
Agenda • جૅฤ • ൃలฤ • ߴͳ Job, Step ͷ͍ํ
• ߴͳ Workflow ͷ͍ํ
Workflow, Job, Step ʹ͍ͭͯͷ͓͞Β͍ • Circle CI ͷॲཧ Workflow >
Job > Step ʹ֊Խ͞ΕΔ • Workflow: 1ͭҎ্ͷ Job Λྻɾฒྻɾબɾذ࣮ͯ͠ߦ • Job: 1ͭҎ্ͷ Step Λྻ࣮ߦ • Step: ॲཧͷ࠷খ͍͞୯Ґ • checkout: ίʔυΛϨϙδτϦ͔ΒऔΓग़͢ • run, deploy: ίϚϯυ (γΣϧεΫϦϓτ) Λ࣮ߦ • savecache, restorecache: σΟϨΫτϦΛΩϟογϡͱͯ͠อଘɾಡࠐ
Job: ઃఆ߲Ұཡ jobs: build: docker: # ༻͢Δ Docker Πϝʔδ -
image: circleci/ruby:2.4.1 environment: # ڥม FOO: bar parallelism: 2 # ฒྻ resource_class: medium # CPU, RAM ͷεϖοΫ working_directory: /my-app # ϫʔΩϯάσΟϨΫτϦ branches: # ϒϥϯνϑΟϧλ only: - master steps: ...
Job: parallelism ʹΑΔฒྻԽ 1. parallelism Λ 2 Ҏ্ʹ͢Δ 2. ฒྻ࣮ߦ͍ͨ͠ॲཧΛ
circleci tests ίϚϯυͰฒྻԽ͢Δ parallelism: 2 steps: - run: command: | circleci tests glob "spec/**/*_spec.rb" > list.txt circleci tests split list.txt | xargs bundle exec rspec
Job: circleci tests ͷղઆ جຊతʹϑΝΠϧͷϦετͷऩूͱׂΛ͢Δ͚ͩͷίϚϯυ $ circleci tests glob "spec/**/*_spec.rb"
> list.txt $ cat list.txt spec/test1_spec.rb spec/test2_spec.rb spec/test3_spec.rb spec/test4_spec.rb $ circleci tests split list.txt spec/test1_spec.rb spec/test2_spec.rb spec/test3_spec.rb spec/test4_spec.rb
Step: run ͷઃఆ߲ run: name: rspec # Webίϯιʔϧʹදࣔ͞ΕΔεςοϓ໊ command: bundle
exec rspec # ίϚϯυ༰ shell: bash -lc # ίϚϯυΛ࣮ߦ͢ΔγΣϧ environment: # ڥม FOO: bar working_directory: /my-app # ϫʔΩϯάσΟϨΫτϦ background: false # όοΫάϥϯυ࣮ߦ͢Δ͔൱͔ no_output_timeout: 1m # Ұఆ࣌ؒԿग़ྗ͕ͳ͚ΕλΠϜΞτ when: # (always, on_success, on_fail) Ͳ͏͍͏߹ʹ࣮ߦ͢Δ͔
Step: save_cache, restore_cache (࠶ܝ) ϥΠϒϥϦͷΠϯετʔϧͳͲͷ࣌ؒΛॖ - restore_cache: # Ωϟογϡ͋Ε͔ͦ͜ΒσΟϨΫτϦͷ༰Λ෮ݩ key:
requirements-{{ checksum "requirements.txt" }} - run: # ࣮ߦ͞ΕΔ͕σΟϨΫτϦ͕෮ݩ͞Ε͍ͯΕ࣮࣭తʹԿى͖ͳ͍ name: setup venv and pip install command: | python -m venv .venv source .venv/bin/activate pip install -r requirements.txt - save_cache: # σΟϨΫτϦͷ༰ΛΩϟογϡͱͯ͠อଘ key: requirements-{{ checksum "requirements.txt" }} paths: - .venv
Step: store_artifacts ϏϧυͷՌͳͲΛอଘ͢Δ (ίϯύΠϧݴޠͰ͏) - store_artifacts: path: build/results destination: build-results
Step: persist_to_workspace, attach_workspace ͋Δ Job ͷՌΛޙଓͷผͷ Job Ͱར༻͢Δ persist_to_workspace: root:
dist paths: '*.tar.gz' attach_workspace: at: dist Workflow Ͱෳͷ Job ΛΈ߹ΘͤΔ߹ʹ͏
Agenda • جૅฤ • ൃలฤ • ߴͳ Job, Step ͷ͍ํ
• ߴͳ Workflow ͷ͍ํ
Workflow ͱʁ ෳͷ Job ΛΈ߹ΘͤͯෳࡶͳॲཧϑϩʔΛ࣮ݱ͢Δػೳ • ྻ࣮ߦɾฒྻ࣮ߦ • લͷ Job
ͷՌΛར༻ • Git ͷ branch, tag ʹΑΔϑΟϧλϦϯά • Manual Approval (ਓʹΑΔঝೝ) • Nightly Scheduling (git push ʹΑΒͳ͍ఆظ࣮ߦ)
Workflow: ෳͷ Job ͷఆٛ version: 2 jobs: build: docker: ...
steps: ... test: docker: ... steps: ... workflows: version: 2 build-and-test: jobs: # ͜ͷ··ͩͱ build ͱ test ฒྻ࣮ߦ͞ΕΔ - build - test
Workflow: Job ͷྻ࣮ߦ requires Ͱґଘ͢Δ Job Λࢦఆ͢Δ͜ͱͰྻ࣮ߦͰ͖Δ workflows: version: 2
build-and-test: jobs: - build - test: requires: # build ͕ऴΘ͔ͬͯΒ test Λ࣮ߦ - build
Workflow: લͷ Job ͷՌΛར༻ build ͷՌΛ test Ͱ͏ = persist_to_workspace,
attach_workspace jobs: build: steps: - persist_to_workspace: # dist/ ҎԼͷ *.tar.gz ϑΝΠϧΛอଘ root: dist paths: '*.tar.gz' test: steps: - attach_workspace: # อଘ͞Εͨ dist/ ҎԼͷϑΝΠϧΛಡࠐ at: dist
Workflow: Git ͷ branch, tag ʹΑΔϑΟϧλϦϯά ಛఆͷ໊લͷ branch tag
ͷ߹͚ͩ Job Λ࣮ߦ͍ͨ͠߹ workflows: version: 2 test-and-deploy: jobs: - test - deploy: requires: # test ͕ऴΘ͔ͬͯΒ deploy Λ࣮ߦ - test filters: branches: # master ͷ߹ͷΈ deploy Λ࣮ߦ only: /^master$/ # ਖ਼نදݱ
Workflow: Manual Approval ਓʹΑΔঝೝεςοϓΛڬΉ workflows: version: 2 lint-and-test: jobs: -
lint # lint ຖճ࣮ߦ - approve-test: # test ʹਐΉ͜ͱΛखಈͰঝೝ type: approval requires: - lint - test: # test ͕͔͔࣌ؒΔͷͰঝೝΛඞཁʹ͢Δ requires: - approve-test
Workflow: Nightly Scheduling ಛఆͷ Workflow Λఆظతʹ࣮ߦ workflows: version: 2 health:
triggers: - schedule: # ຖ 00:00 ʹ࣮ߦ cron: "0 0 * * *" jobs: # ੬ऑੑͷνΣοΫͳͲ - check-vulnerability
·ͱΊ Workflow Λ͏ͱͱʹ͔͘৭ʑͳ͜ͱ͕Ͱ͖Δ͕... Workflow ࣗମͷಈ࡞ࣗಈςετͰ͖ͳ͍ͷͰɺෳࡶͳͷΛ࡞Γ͗͢ͳ͍͜ͱ ࢀߟʹͳΔ Workflow Λ୳ͯ͠ΈΑ͏
ࢀߟʹͳΔࢿྉ • CircleCI2.0ͷWorkflowΛࢼͯ͠ΈΔ • CircleCI 2.0Ͱͷεϩʔςετʢςετ͍ʣରॲ๏Λࢥ͍͚ͭͩ͘ॻ͖ग़ ͢ • CircleCI 2.0
ΛlocalͰಈ͔͢