2019 年 4 月 18 日に行われた CircleCI Meetup Fukuoka #1 でお話させて頂いた死霊です.
CircleCI ݕఆ 9 ڃ͔Β8 ڃʹͳΓ·ͨ͠ʙ ֎ෆग़ͷݕఆࢼݧରࡦ ʙCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1@inokappaCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 1
View Slide
ࣗݾհ• ͔ͬͺ (@inokappa)• גࣜձࣾ YAMAP (2019 1 ݄ೖࣾ,·ͩࢼ༻ظؒத)• ΠϯϑϥΤϯδχΞͰ͢• ͖ͳ͏ͲΜ͝΅ఱ͏ͲΜͰ͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 2
ͪΐͬͱRubyKaigi2019 ߦ͖ͬͯ·ͨ͠CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 3
YAMAP ʹ͍ͭͯCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 4
CircleCI ͱ YAMAP• શͯͷγεςϜ͓͍ͯ, ςετσϓϩΠͰ CircleCI ͕ϑϧʹ׆༻͞Ε͍ͯ·͢• ࣾΤϰΝϯδΣϦετͷ @morygonzalez ͞Μ (Γ͝Μ͞Μ) ͷೖࣾͱڞʹಋೖ͞Ε·ͨ͠• ͕ࣗೖࣾͨ࣌͠ʹطʹ YAMAP ͷ։ൃγεςϜͷதͰͳͯ͘ͳΒͳ͍ଘࡏʹͳ͍ͬͯ·ͨ͠CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 5
CircleCI ͱࢲ• YAMAP ʹೖࣾ͢Δલ Hello World ϨϕϧͰͨ͠• YAMAP ͷ ϑΟʔνϟʔڥ (QA ϨϏϡʔ, ৽ػೳͷ͓ࢼ͠Ͱར༻) ͷཧΛ͞Εͨ͜ͱΛػձʹ, վΊͯ CircleCI Λษڧ͢͠Α͏ʹCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 6
ͯ͞, ຊCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 7
CircleCI ݕఆͱCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 8
CircleCI ݕఆͱ (1)• CircleCI ͷεΩϧΛূ໌͢ΔҝͷՍۭͷೝఆࢼݧ੍Ͱ͢• डݧྉແྉ (CircleCI ʹແྉϓϥϯ͕͋Γ·͢)• ͍ͭͰ, Ͳ͜Ͱ, Πϯλʔωοτ͕ແͯ͘डݧग़དྷ·͢(CircleCI ϩʔΧϧ PC Ͱ࣮ߦग़དྷ·͢)• ӳޠ, ຊޠ, YAML Ͱडݧ͢Δ͜ͱ͕ग़དྷ·͢ (ຊޠͷυΩϡϝϯτ͋Γ·͢)CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 9
CircleCI ݕఆͱ (2)11 CircleCI ݕఆެࣜαΠτ (Ծ) ΑΓҾ༻CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 10
CircleCI ݕఆͱ (3)• 1 ڃશੈքͰ 40 ਓڧ (CircleCI ͷࣾһͱಉ)2• 2 ڃҎԼ 10 ສਓڧ (CircleCI ͷϢʔβʔͱಉ)22 2018 10 ݄ௐ, CircleCI ݕఆެࣜαΠτ (Ծ) ΑΓҾ༻CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 11
CircleCI ݕఆͱ (4)• ݕఆࢼݧͷग़ൣғ CircleCI 2.0 ͱ 2.1CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 12
ͱ͍͏͜ͱͰ...֎ෆग़ͷݕఆࢼݧରࡦCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 13
ҙʂʂ͔͜͜Β֎ෆग़ͳ༰͕ଓ͖·͢ͷͰ, εϥΠυͷࣸਅࡱӨ͓͢Δ༰ͷ SNS ͷߘʮ͝ԕྀ͠ͳ͍ͰʯԼ͍͞.ୠ͠, શͯͷ༰͕ެࣜυΩϡϝϯτΠϯλʔωοτ্ʹଘࡏ͓ͯ͠Γ·͢ͷͰ͝ҙԼ͍͞!CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 14
CircleCI Λ࢝ΊΔ (9 ڃ)ઃ 1. ҎԼͷ ( ) ͷதʹͯ·Δݴ༿ΛຒΊͳ͍͞.3• CircleCI Λ࢝ΊΔʹ, ( (1) ) ຢ ( (2) ) ͷΞΧϯτ͕ඞཁʹͳΓ·͢• ϦϙδτϦͱ CircleCI ͷ ( (3) ) Λ࿈ܞͤ͞Δඞཁ͕͋Γ·͢3 (1)Github, (2)BitBucket, (3)࿈ܞCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 15
CircleCI Λ࢝ΊΔ (ղઆ)CircleCI Λ࢝ΊΔʹ, Github ຢ BitBucket ͷΞΧϯτ͕ඞཁʹͳΓ·͢ͷͰ, Github BitBucket ͷΞΧϯτऔಘ͓͖ͯ͠·͠ΐ͏. CircleCI ݕఆࢼݧΛडݧ͢Δҝʹઈରʹඞཁͳ४උͰ͢. Εͳ͍Α͏ʹ͠·͠ΐ͏.ΞΧϯτΛऔಘͨ͠Β, ϦϙδτϦΛ CircleCI ϓϩδΣΫτͱ࿈ܞͤ͞·͠ΐ͏. શͯͷϦϙδτϦͱϓϩδΣΫτ͕࿈ܞग़དྷΔͱݶΓ·ͤΜͷͰҙ͕ඞཁͰ͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 16
ॳΊͯͷ .circleci/config.yml (9 ڃ)ઃ 2. ҎԼ, ੈքͰ࠷γϯϓϧͳ .circleci/config.yml Ͱ͢.( ) ͷதʹೖΔΩʔϫʔυΛ͑ͳ͍͞.4version: ( (1) )jobs:( (2) ):docker:- image: docker:18.06.0-ce-git( (3) ):- run:name: Hello worldcommand: |echo "Hello CircleCI!!"4 (1)2, (2)jobs, (3)stepsCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 17
ॳΊͯͷ .circleci/config.yml (ղઆ)ϦϙδτϦʹ .circleci/config.yml ͱ͍͏ YAML ϑΥʔϚοτͷઃఆϑΝΠϧΛՃ͢Δඞཁ͕͋Γ·͢. ओཁͳΩʔ, ҎԼͷ௨ΓͰ͢.• version• jobs• stepsCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 18
ϩʔΧϧϚγϯͰϏϧυΛ࣮ߦ͢Δ (8 ڃ)ઃ 3. ઃ 2 ͷ .circleci/config.yml Λ༻͍ͯ, ϩʔΧϧϚγϯ্ͰߏจͷνΣοΫͱϏϧυΛ࣮ߦ͠ͳ͍͞.• CircleCI Ͱ, circleci ͱ͍͏ίϚϯυϥΠϯπʔϧΛఏڙ͍ͯ͠·͢• macOS Ͱ, Homebrew ΛͬͯΠϯετʔϧ͢Δͱྑ͍Ͱ͠ΐ͏CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 19
ϩʔΧϧϚγϯͰϏϧυΛ࣮ߦ͢Δ (σϞ 1)• config validate ΦϓγϣϯͰߏจͷνΣοΫ$ circleci config validateConfig file at .circleci/config.yml is valid.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 20
ϩʔΧϧϚγϯͰϏϧυΛ࣮ߦ͢Δ (σϞ 2)• local execute ΦϓγϣϯͰϏϧυΛ࣮ߦ$ circleci local executeDocker image digest: sha256:5eb8cb710920f567403cc4cbd2de16d5ab8fc9a1b4c6357d2e7137fa5f1a4f62====>> Spin up Environment... தུ ...====>> Hello world#!/bin/sh -eo pipefailecho "Hello CircleCI!!"Hello CircleCI!!Success!CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 21
CircleCI ͰϏϧυΛ࣮ߦ͢Δ (8 ڃ)ઃ 4. ઃ 3 Ͱ֬ೝͨ͠ .circleci/config.yml Λ༻͍ͯ, CircleCI্ͰϏϧυΛ࣮ߦ͠ͳ͍͞.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 22
CircleCI ͰϏϧυΛ࣮ߦ͢Δ (ղઆ)ϦϙδτϦͱͷ࿈ܞ͕ਖ਼͘͠ߦΘΕ͍ͯΔ߹, ϦϙδτϦʹpush ͢ΔͱϏϧυ͕࣮ߦ͞Ε·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 23
Ϗϧυڥʹ SSH ϩάΠϯ͢Δ (8 ڃ)ઃ 5. Ϗϧυڥʹ SSH ΛͬͯϩάΠϯ͠ͳ͍͞. ϩάΠϯͨ͠Β, hello.txt ͕࡞͞Ε͍ͯΔ͜ͱΛ֬ೝ͠ͳ͍͞.• Ϗϧυڥʹ SSH ϩάΠϯ͢Δ͜ͱͰ, Ϗϧυͷσόοά͕ߦ͑·͢• ࣄલʹ Github ্ʹ SSH ͷެ։伴Λొ͓͖ͯ͠·͠ΐ͏CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 24
Ϗϧυڥʹ SSH ϩάΠϯ͢Δ (8 ڃ)ࣄલʹ, .circleci/config.yml ΛҎԼͷΑ͏ʹमਖ਼͓͖ͯ͠·͢.version: 2jobs:build:docker:- image: docker:18.06.0-ce-gitsteps:- run:name: Hello worldcommand: |echo "Hello CircleCI!!" > hello.txtCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 25
Ϗϧυڥʹ SSH ϩάΠϯ͢Δ (σϞ)δϣϒը໘ͷ Rerun workflow ͔Β Rerun job with SSH Λબͯ͠δϣϒΛ࠶࣮ߦ͠·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 26
Ϗϧυڥʹ SSH ϩάΠϯ͢Δ (σϞ)$ ssh -p 64536 xxx.xxx.xxx.xxx... ུ ...~ # ls -altotal 16drwx------ 3 root root 4096 Apr 16 22:02 .drwxr-xr-x 43 root root 4096 Apr 16 22:01 ..-rw------- 1 root root 7 Apr 16 22:02 .ash_historydrwxr-xr-x 2 root root 4096 Apr 16 22:01 project~ # cd project/~/project # lshello.txt~/project # cat hello.txtHello CircleCI!!~/project #CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 27
ͪΐͬͱϒϨΠΫCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 28
CALLING MOUNTAINCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 29
CALLING MOUNTAINCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 30
workflows Λ͏ (7 ڃ)ઃ 6. workflows Λͬͯ, master ϒϥϯνҎ֎Ͱ build ͕࣮ߦ͞ΕΔΑ͏ʹ͠ͳ͍͞.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 31
workflows Λ͏ (ղઆ)• workflows Ͱ, ֤εςοϓΛδϣϒͱ͍͏୯ҐͰѻ͍·͢• workflows Λ͏͜ͱͰ, ྻͳεςοϓ࣮ߦ͚ͩͰͳ͘, ݅ʹԠͯ͡δϣϒΛ࣮ߦͤ͞Δ͜ͱ͕ग़དྷ·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 32
workflows Λ͏ (ղઆ)͜Ε·Ͱͷ .circleci/config.yml ʹ workflows ͱ͍͏ηΫγϣϯΛՃ͠·͠ΐ͏.... ུ ...workflows:version: 2pr-build:jobs:- build:filters:branches:ignore:- masterCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 33
workflows Λ͏ (ղઆ)ผͷϒϥϯνΛ্ͬͨͰ commit, push ͯ͠Έ·͠ΐ͏.(master)$ git checkout -b development/demo01Switched to a new branch 'development/demo01'(development/demo01)$ echo 'test' >> README.md(development/demo01)$ git add README.md(development/demo01)$ git commit -m 'demo'[development/demo01 6ef698f] demo1 file changed, 1 insertion(+)(development/demo01)$ git push -u origin development/demo01...Branch 'development/demo01' set up to track remote branch 'development/demo01' from 'origin'.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 34
workflows Λ͏ (ղઆ)development/demo01 ϒϥϯνͰ, build ͕࣮ߦ͞Ε͍ͯ·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 35
ϏϧυͷޮԽ (7 ڃ)ઃ 7. ΩϟογϡΛ༻͍ͯ, Ϗϧυ࣌ؒͷॖΛݕ౼͠ͳ͍͞.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 36
ϏϧυͷޮԽ (ղઆ)• save_cache εςοϓΛར༻͢Δ͜ͱͰ, ϥΠϒϥϦιʔείʔυͷΩϟογϡΛอ࣋ग़དྷ·͢• restore_cache ʹͯ key Ͱࢦఆͨ͠ΩϟογϡΛ෮ݩ͠·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 37
ϏϧυͷޮԽ (ղઆ)ҎԼͷΑ͏ʹ .circleci/config.yml Λमਖ਼͠·͠ΐ͏.steps:- restore_cache:key: cache-data-{{ .Branch }}... தུ ...echo $n >> data.txtsleep 0.3donefi- save_cache:key: cache-data-{{ .Branch }}paths:- data.txt... ࣍ͷϖʔδ ...CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 38
ϏϧυͷޮԽ (ղઆ)ҎԼͷΑ͏ʹ .circleci/config.yml Λमਖ਼͠·͠ΐ͏.... લͷϖʔδΑΓ ...- run:name: Remove data.txtcommand: |rm -rf data.txt && sleep 5 && ls -al- restore_cache:key: cache-data-{{ .Branch }}- run:name: Restore datacommand: |cat data.txtCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 39
ϏϧυͷޮԽ (ղઆ)• key ʹ {{ .Branch }} {{ .Revision }} ͷςϯϓϨʔτ͕ࢦఆՄೳͰ͢• paths ʹϑΝΠϧ໊σΟϨΫτϦͷύεΛࢦఆ͠·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 40
ϏϧυͷޮԽ (σϞ 1)ΩϟογϡΛࠐΜͩ͜ͱͰ, ҎԼͷΑ͏ʹॳճͷϏϧυҎ߱Ͱܶతʹॲཧ͕࣌ؒॖ͞Ε͍ͯ·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 41
ϏϧυͷޮԽ (ࢼݧʹग़Δ)restore_cache Ͱ keys ͰෳͷΩϟογϡΩʔΛࢦఆՄೳͰ͢.- restore_cache:keys:- cache-data-{{ .Branch }}- cache-dataCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 42
ϏϧυͷޮԽ (σϞ 2)ҎԼͷΑ͏ʹ, ࢦఆͨ͠ΩʔͷΩϟογϡ͕ଘࡏ͍ͯ͠ͳ͍߹ʹ, restore_cache εΩοϓ͞Ε, طʹΩϟογϡΩʔ͕ଘࡏ͍ͯ͠Δ߹ʹ save_cache εΩοϓ͞Ε·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 43
ϏϧυͷޮԽ (ࢼݧʹग़Δ)ࠓͷͱ͜Ζ, ΩϟογϡΛফ͢ज़͕͋Γ·ͤΜʂCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 44
ςετͷޮԽ (7 ڃ)ઃ 8. ύϥϨϧςετΛར༻ͯ͠ςετ࣌ؒͷॖΛݕ౼͠ͳ͍͞.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 45
ςετͷޮԽ (ղઆ)• ςετΛϑΝΠϧ୯ҐͰׂ͢Δ͜ͱͰ, ฒߦͯ͠ςετΛ࣮ߦ͢Δ͜ͱ͕ՄೳͰ͢• ׂ circleci ίϚϯυΛར༻͠·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 46
ςετͷޮԽ (ղઆ)ҎԼͷΑ͏ʹ .circleci/config.yml ʹςετΛՃ͠·ͨ͠.test:parallelism: 2docker:- image: docker:18.06.0-ce-gitsteps:- checkout- run:name: Paralell Testcommand: |echo $(circleci tests glob "tests/*" | circleci tests split) | xargs -n 1 shCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 47
ςετͷޮԽ (ղઆ)ςετͱݴ͍ͬͯ·͕͢, ҎԼͷΑ͏ͳγϯϓϧͳγΣϧεΫϦϓτͰ͢.sleep 5echo "01"CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 48
ςετͷޮԽ (σϞ 1)γϦΞϧʹςετΛ࣮ߦͨ͠߹, ҎԼͷΑ͏ʹ 26 ඵֻ͔͍ͬͯ·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 49
ςετͷޮԽ (σϞ 2)ύϥϨϧʹςετΛ࣮ߦͨ͠߹, ҎԼͷΑ͏ʹ 16 ඵ·Ͱʹॖ͍ͯ͠·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 50
ͯ͞CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 51
͍͔͕ͩͬͨͰ͠ΐ͏͔• CircleCI ݕఆͰࢼݧʹඞͣग़ͦ͏ͳϙΠϯτΛૡ͍ఠΜͰ͓͠·ͨ͠• ·ͩ, CircleCI Λ৮ͬͨ͜ͱ͕ແ͍ํੋඇαΠϯΞοϓͯͬͯ͠Έ·͠ΐ͏• υΩϡϝϯτେมॆ࣮͍ͯ͠ΔͷͰ, υΩϡϝϯτੋඇ,Λ௨͠·͠ΐ͏CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 52
͍͞͝ʹ• CircleCI ৮͍ͬͯΔͱ, ͳΜͰ CircleCI Ͱॲཧ͍ͨ͠ͱ͍͏ཉ͕༙͍͖ͯ·͢ΑͶ• Բͤͣ৮Γଓ͚Δ͜ͱ͕ঢڃ (্ୡ) ͷۙಓͩͱࢥ͍·͢• օ͞Μੋඇ, ݕఆΛडݧ͠·͠ΐ͏CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 53
͓ΘΓCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #1 54