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
Introduction to CircleCI
Search
yubessy
August 09, 2018
Programming
130
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.6k
Docker Hands-on
yubessy
0
130
Resource Polymorphism
yubessy
0
310
不動点コンビネータ?
yubessy
0
330
とりあえず機械学習したかった
yubessy
0
350
Scala Native
yubessy
0
240
Type Erasure と Reflection のはなし
yubessy
1
490
量子暗号
yubessy
0
250
5分ちょいでわかった気になるラムダアーキテクチャ
yubessy
0
2.3k
Other Decks in Programming
See All in Programming
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
130
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
230
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
550
不幸な GC
chencmd
0
820
高専、大学編入、そして未踏へ〜プロダクト開発とキャリアの歩み - Technical College, University Transfer, and On to “Mitou” / My Journey in Product Development and Career
pkmiya
0
100
My Marp Sample
sinoue0108
0
130
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
240
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
650
Go 1.27 における memory allocation の高速化
andpad
0
350
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
400
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
200
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
BBQ
matthewcrist
89
10k
New Earth Scene 8
popppiees
3
2.5k
Speed Design
sergeychernyshev
33
2k
Code Reviewing Like a Champion
maltzj
528
40k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Faster Mobile Websites
deanohume
310
32k
Google's AI Overviews - The New Search
badams
0
1.6k
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Ͱಈ͔͢