【福岡】CircleCI ユーザーコミュニティミートアップ#2 にてお話させていただく予定の資料です.
CircleCI ݕఆϓϨΠόοΫʙ CircleCI ݕఆͷͦͷޙ ʙCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2@inokappaCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 1
View Slide
ࣗݾհ• ͔ͬͺ (@inokappa)• גࣜձࣾ YAMAP• ΠϯϑϥΤϯδχΞͰ͢• ࠓͷܕ, DA PUMP ͷ ISSA ͞ΜͷΛഈआ͓ͯ͠Γ·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 2
YAMAP ʹ͍ͭͯCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 3
YAMAP ʹ͍ͭͯ ʙΈ·Γػೳʙ11 ࢁͰ“ਓͱ͢Εҧ͏”͜ͱͰɺ୭͔ͷ໋Λٹ͑Δ͔͠Εͳ͍ػೳΛͭ͘Γ·ͨ͠ (https://note.yamap.com/n/ndbe23b7e7bf0)ΑΓҾ༻CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 4
CircleCI ͱ YAMAP• શͯͷγεςϜ͓͍ͯ, ςετσϓϩΠͰ CircleCI ͕ϑϧʹ׆༻͞Ε͍ͯ·͢• ࣾΤϰΝϯδΣϦετͷ @morygonzalez ͞Μ (Γ͝Μ͞Μ) ͷೖࣾͱڞʹಋೖ͞Ε·ͨ͠• ͕ࣗೖࣾͨ࣌͠ʹطʹ YAMAP ͷ։ൃγεςϜͷதͰͳͯ͘ͳΒͳ͍ଘࡏʹͳ͍ͬͯ·ͨ͠CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 5
CircleCI ͱࢲ• YAMAP ʹೖࣾ͢Δલ Hello World ϨϕϧͰͨ͠• YAMAP ͷ QA ڥͷཧΛ͞Εͨ͜ͱΛػձʹ, վΊͯCircleCI Λษڧ͢͠Α͏ʹ• ࠓͰॳ৺ऀͷ··Ͱ͕͢...CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 6
ͯ͞, ຊCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 7
CircleCI ݕఆͱCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 8
CircleCI ݕఆͱ (1)• CircleCI ͷεΩϧΛূ໌͢ΔՍۭͷೝఆࢼݧ੍Ͱ͢• डݧྉແྉ (CircleCI ʹແྉϓϥϯ͕͋Γ·͢)• ͍ͭͰ, Ͳ͜Ͱ, Πϯλʔωοτ͕ແͯ͘डݧग़དྷ·͢(CircleCI ϩʔΧϧ PC Ͱ࣮ߦग़དྷ·͢)• ӳޠ, ຊޠ, YAML Ͱडݧ͢Δ͜ͱ͕ग़དྷ·͢ (ຊޠͷυΩϡϝϯτ͕ॆ࣮͍ͯ͠·͢)CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 9
CircleCI ݕఆͱ (2)22 CircleCI ݕఆެࣜαΠτ (https://kentei.circleci.com/ja/ ※ ࣮ࡏ͍ͯ͠·ͤΜ) ΑΓҾ༻CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 10
CircleCI ݕఆͱ (3)• 1 ڃશੈքͰ 40 ਓڧ (CircleCI ͷࣾһͱಉ)3• 2 ڃҎԼ 10 ສਓڧ (CircleCI ͷϢʔβʔͱಉ)33 2018 10 ݄ௐ, CircleCI ݕఆެࣜαΠτ (Ծ) ΑΓҾ༻, ͔ͳΓใ͕ݹ͍Ͱ͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 11
CircleCI ݕఆͱ (4)• ݕఆࢼݧͷग़ൣғ CircleCI 2.0 ͱ 2.1CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 12
ͱ͍͏͜ͱͰ...֎ෆग़ͷݕఆࢼݧରࡦCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 13
ҙʂʂ͔͜͜Β֎ෆग़ͳ༰͕ଓ͖·͢ͷͰ, εϥΠυͷࣸਅࡱӨ͓͢Δ༰ͷ SNS ͷߘʮ͝ԕྀ͠ͳ͍ͰʯԼ͍͞.ୠ͠, શͯͷ༰͕ެࣜυΩϡϝϯτΠϯλʔωοτ্ʹଘࡏ͓ͯ͠Γ·͢ͷͰ͝ҙԼ͍͞!CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 14
CircleCI Λ࢝ΊΔ (9 ڃ)ઃ 1. ҎԼͷ ( ) ͷதʹͯ·Δݴ༿ΛຒΊͳ͍͞.4• CircleCI Λ࢝ΊΔʹ, ( (1) ) ຢ ( (2) ) ͷΞΧϯτ͕ඞཁʹͳΓ·͢• ϦϙδτϦͱ CircleCI ͷ ( (3) ) Λ࿈ܞͤ͞Δඞཁ͕͋Γ·͢4 (1)Github, (2)BitBucket, (3)࿈ܞCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 15
CircleCI Λ࢝ΊΔ (ղઆ)CircleCI Λ࢝ΊΔʹ, Github ຢ BitBucket ͷΞΧϯτ͕ඞཁʹͳΓ·͢ͷͰ, Github BitBucket ͷΞΧϯτऔಘ͓͖ͯ͠·͠ΐ͏. CircleCI ݕఆࢼݧΛडݧ͢Δҝʹઈରʹඞཁͳ४උͰ͢. Εͳ͍Α͏ʹ͠·͠ΐ͏.ΞΧϯτΛऔಘͨ͠Β, ϦϙδτϦΛ CircleCI ϓϩδΣΫτͱ࿈ܞͤ͞·͠ΐ͏. શͯͷϦϙδτϦͱϓϩδΣΫτ͕࿈ܞग़དྷΔͱݶΓ·ͤΜͷͰҙ͕ඞཁͰ͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 16
ॳΊͯͷ .circleci/config.yml (9 ڃ)ઃ 2. ҎԼ, ੈքͰ࠷γϯϓϧͳ .circleci/config.yml Ͱ͢.( ) ͷதʹೖΔΩʔϫʔυΛ͑ͳ͍͞.5version: ( (1) )jobs:( (2) ):docker:- image: docker:18.06.0-ce-git( (3) ):- run:name: Hello worldcommand: |echo "Hello CircleCI!!"5 (1)2, (2)jobs, (3)stepsCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 17
ॳΊͯͷ .circleci/config.yml (ղઆ)ϦϙδτϦʹ .circleci/config.yml ͱ͍͏ YAML ϑΥʔϚοτͷઃఆϑΝΠϧΛՃ͢Δඞཁ͕͋Γ·͢. ओཁͳΩʔ, ҎԼͷ௨ΓͰ͢.• version• jobs• stepsCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 18
ϩʔΧϧϚγϯͰϏϧυΛ࣮ߦ͢Δ (8 ڃ)ઃ 3. ઃ 2 ͷ .circleci/config.yml Λ༻͍ͯ, ϩʔΧϧϚγϯ্ͰߏจͷνΣοΫͱϏϧυΛ࣮ߦ͠ͳ͍͞.• CircleCI Ͱ, circleci ͱ͍͏ίϚϯυϥΠϯπʔϧΛఏڙ͍ͯ͠·͢• macOS Ͱ, Homebrew ΛͬͯΠϯετʔϧ͢Δͱྑ͍Ͱ͠ΐ͏CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 19
ϩʔΧϧϚγϯͰϏϧυΛ࣮ߦ͢Δ (σϞ 1)• config validate ΦϓγϣϯͰߏจͷνΣοΫ$ circleci config validateConfig file at .circleci/config.yml is valid.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 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 ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 21
CircleCI ͰϏϧυΛ࣮ߦ͢Δ (8 ڃ)ઃ 4. ઃ 3 Ͱ֬ೝͨ͠ .circleci/config.yml Λ༻͍ͯ, CircleCI্ͰϏϧυΛ࣮ߦ͠ͳ͍͞.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 22
CircleCI ͰϏϧυΛ࣮ߦ͢Δ (ղઆ)ϦϙδτϦͱͷ࿈ܞ͕ਖ਼͘͠ߦΘΕ͍ͯΔ߹, ϦϙδτϦʹpush ͢ΔͱϏϧυ͕࣮ߦ͞Ε·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 23
Ϗϧυڥʹ SSH ϩάΠϯ͢Δ (8 ڃ)ઃ 5. Ϗϧυڥʹ SSH ΛͬͯϩάΠϯ͠ͳ͍͞. ϩάΠϯͨ͠Β, hello.txt ͕࡞͞Ε͍ͯΔ͜ͱΛ֬ೝ͠ͳ͍͞.• Ϗϧυڥʹ SSH ϩάΠϯ͢Δ͜ͱͰ, Ϗϧυͷσόοά͕ߦ͑·͢• ࣄલʹ Github ্ʹ SSH ͷެ։伴Λొ͓͖ͯ͠·͠ΐ͏CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 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 ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 25
Ϗϧυڥʹ SSH ϩάΠϯ͢Δ (σϞ)δϣϒը໘ͷ Rerun workflow ͔Β Rerun job with SSH Λબͯ͠δϣϒΛ࠶࣮ߦ͠·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 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 ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 27
ͪΐͬͱϒϨΠΫʙᕒͷϞϊϚωʙCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 28
ϞϊϚω A ͞ΜϏϏοτͷऴྃΛελοϓʹࠂ͛ΒΕͯ...CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 29
ϞϊϚω B ͞Μੈք্ͷ MC ͷҝ, υʔϋʹ౸ணͯ͠Ұݴ...CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 30
workflows Λ͏ (7 ڃ)ઃ 6. workflows Λͬͯ, master ϒϥϯνҎ֎Ͱ build ͕࣮ߦ͞ΕΔΑ͏ʹ͠ͳ͍͞.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 31
workflows Λ͏ (ղઆ)• workflows Ͱ, ֤εςοϓΛδϣϒͱ͍͏୯ҐͰѻ͍·͢• workflows Λ͏͜ͱͰ, ྻͳεςοϓ࣮ߦ͚ͩͰͳ͘, ݅ʹԠͯ͡δϣϒΛ࣮ߦͤ͞Δ͜ͱ͕ग़དྷ·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 32
workflows Λ͏ (ղઆ)͜Ε·Ͱͷ .circleci/config.yml ʹ workflows ͱ͍͏ηΫγϣϯΛՃ͠·͠ΐ͏.... ུ ...workflows:version: 2pr-build:jobs:- build:filters:branches:ignore:- masterCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 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 ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 34
workflows Λ͏ (ղઆ)development/demo01 ϒϥϯνͰ, build ͕࣮ߦ͞Ε͍ͯ·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 35
ϏϧυͷޮԽ (7 ڃ)ઃ 7. ΩϟογϡΛ༻͍ͯ, Ϗϧυ࣌ؒͷॖΛݕ౼͠ͳ͍͞.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 36
ϏϧυͷޮԽ (ղઆ)• save_cache εςοϓΛར༻͢Δ͜ͱͰ, ϥΠϒϥϦιʔείʔυͷΩϟογϡΛอ࣋ग़དྷ·͢• restore_cache ʹͯ key Ͱࢦఆͨ͠ΩϟογϡΛ෮ݩ͠·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 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 ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 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 ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 39
ϏϧυͷޮԽ (ղઆ)• key ʹ {{ .Branch }} {{ .Revision }} ͷςϯϓϨʔτ͕ࢦఆՄೳͰ͢• paths ʹϑΝΠϧ໊σΟϨΫτϦͷύεΛࢦఆ͠·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 40
ϏϧυͷޮԽ (σϞ 1)ΩϟογϡΛࠐΜͩ͜ͱͰ, ҎԼͷΑ͏ʹॳճͷϏϧυҎ߱Ͱܶతʹॲཧ͕࣌ؒॖ͞Ε͍ͯ·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 41
ϏϧυͷޮԽ (ࢼݧʹग़Δ)restore_cache Ͱ keys ͰෳͷΩϟογϡΩʔΛࢦఆՄೳͰ͢.- restore_cache:keys:- cache-data-{{ .Branch }}- cache-dataCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 42
ϏϧυͷޮԽ (σϞ 2)ҎԼͷΑ͏ʹ, ࢦఆͨ͠ΩʔͷΩϟογϡ͕ଘࡏ͍ͯ͠ͳ͍߹ʹ, restore_cache εΩοϓ͞Ε, طʹΩϟογϡΩʔ͕ଘࡏ͍ͯ͠Δ߹ʹ save_cache εΩοϓ͞Ε·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 43
ϏϧυͷޮԽ (ࢼݧʹग़Δ)ࠓͷͱ͜Ζ, ΩϟογϡΛফ͢ज़͕͋Γ·ͤΜʂCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 44
ςετͷޮԽ (7 ڃ)ઃ 8. ύϥϨϧςετΛར༻ͯ͠ςετ࣌ؒͷॖΛݕ౼͠ͳ͍͞.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 45
ςετͷޮԽ (ղઆ)• ςετΛϑΝΠϧ୯ҐͰׂ͢Δ͜ͱͰ, ฒߦͯ͠ςετΛ࣮ߦ͢Δ͜ͱ͕ՄೳͰ͢• ׂ circleci ίϚϯυΛར༻͠·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 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 ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 47
ςετͷޮԽ (ղઆ)ςετͱݴ͍ͬͯ·͕͢, ҎԼͷΑ͏ͳγϯϓϧͳγΣϧεΫϦϓτͰ͢.sleep 5echo "01"CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 48
ςετͷޮԽ (σϞ 1)ී௨ʹςετΛ࣮ߦͨ͠߹, ҎԼͷΑ͏ʹ 27 ඵֻ͔͍ͬͯ·͢.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 49
ςετͷޮԽ (σϞ 2)ύϥϨϧʹςετΛ࣮ߦͨ͠߹, ҎԼͷΑ͏ʹ 16 ඵ·Ͱʹॖ͍ͯ͠·͢CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 50
ͯ͞CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 51
͜͜ͰԠ༻CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 52
cron ͍ͨ͘...ਓྨόονॲཧ͔ΒಀΕΒΕͳ͍.scheduled-build:triggers:- schedule:cron: "0 23 * * *" # UTC Ͱࢦఆ͢Δඞཁ͕͋Δfilters:branches:only:- deployment/packerCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 53
sls deploy CircleCI ͰServerless Framework ฏ, ྩ࢈ۀֵ໋Ͱ͢....- run:name: Deploycommand: |serverless deploy --concealCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 54
packer CircleCI Ͱpacker ͰύΧοͱ AMI ࡞....- run:name: build imagecommand: packer build build.jsonno_output_timeout: 120mCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 55
EC2 ηΩϡϦςΟάϧʔϓΛ։์ (1)• CircleCI Ͱ EC2 ʹ SSH ΞΫηε͍ͨ͠߹ʹආ͚ͯ௨Εͳ͍• Job ͷதͰࣗલ࣮͚ͨ͠Ͳ...CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 56
EC2 ηΩϡϦςΟάϧʔϓΛ։์ (2)Orbs Ͱఏڙ͞Ε͍ͯͨ͜ͱΛΓ·ͨ͠.CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 57
EC2 ηΩϡϦςΟάϧʔϓΛ։์ (3)͔͠͠, ԶόʔδϣϯͰ...- run:name: build specfile for awspeccommand: |bundle exec rake aws:security_group:build_specwhen: always- run:name: check security group ingresscommand: |bundle exec rake aws:security_group:specwhen: alwaysCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 58
ϫϯόΠφϦ (1)command ࠷ߴೋߦ͘Β͍Ͱ͍͑ͨͰ͢.- run:name: execute remove old amiscommand: |# ݹ͍ AMI Λআ͢ΔϫϯόΠφϦίϚϯυ./tools/amiCtrl --delete --days=3 -batchCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 59
ϫϯόΠφϦ (2)- run:name: execute remove old amiscommand: |# ͜ͷίʔυ͋͘·ͰαϯϓϧͰ͢, ಈ͖·ͤΜAMI_ID=$(aws ec2 describe-images ....) && \aws ec2 deregister-image --image-id ${AMI_ID} && \aws ec2 delete-snapshot --snapshot-id ${SNAPSHOT_ID}CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 60
ͦΖͦΖ͓࣌ؒͰ͢...CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 61
ͳͥ, CircleCI Λ͏ͷ͔• खॱ͕ݟ͍͑ͯΔ• ࣮ߦ݁Ռ͕ݟ͍͑ͯΔ• ͕ͯ͢ YAML ͰޠΕΔΜ͡Όͳ͍͔ͬͯࢥ͑ΔCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 62
Let's CircleCI ݕఆ• CircleCI ݕఆͰࢼݧʹඞͣग़ͦ͏ͳϙΠϯτΛૡ͍ఠΜͰ͓͠·ͨ͠• ·ͩ, CircleCI Λ৮ͬͨ͜ͱ͕ແ͍ํੋඇαΠϯΞοϓͯͬͯ͠Έ·͠ΐ͏• υΩϡϝϯτେมॆ࣮͍ͯ͠ΔͷͰ, υΩϡϝϯτੋඇ,Λ௨͠·͠ΐ͏CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 63
͍͞͝ʹ• CircleCI ৮͍ͬͯΔͱ, ͳΜͰ CircleCI Ͱॲཧ͍ͨ͠ͱ͍͏ཉ͕༙͍͖ͯ·͢ΑͶ• Բͤͣ৮Γଓ͚Δ͜ͱ͕ঢڃ (্ୡ) ͷۙಓͩͱࢥ͍·͢• օ͞Μੋඇ, ݕఆΛडݧ͠·͠ΐ͏CircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 64
͓ΘΓCircleCI ϢʔβʔίϛϡχςΟϛʔτΞοϓ #2 65