ユニットテストが入れられないレガシーなソースでCIが回せるようになった

D5ff2f38821d8441a8ff0ab6879cf77a?s=47 MiuraKatsu
December 15, 2018

 ユニットテストが入れられないレガシーなソースでCIが回せるようになった

D5ff2f38821d8441a8ff0ab6879cf77a?s=128

MiuraKatsu

December 15, 2018
Tweet

Transcript

  1. Ϣχοτςετ͕ೖΕΒΕͳ͍ ϨΨγʔͳιʔεͰ $*͕ճͤΔΑ͏ʹͳͬͨ PHP ΧϯϑΝϨϯε 2018 2018/12/15 ΫʔίϜגࣜձࣾ ࡾӜɹࠀߒ

  2. ࣗݾ঺հ •໊લɿࡾӜ ࠀߒ •Twitter IDɿ@MiuraKatsu •࢓ࣄɿCTOతͳ •޷͖ͳϑϨʔϜϫʔΫɿ LaravelɺSails.js • ॕӜ࿨Ϩοζఱߖഋ༏উɿ

  3. ձһ੍॓ധɾϨϯλΧʔ༧໿αΠτ ʮ50$00ʂʯ IUUQTXXXUPDPPKQ

  4. w Ұൠతͳ॓ധ༧໿αΠτɿ॓ധඅʴࢪઃ͔Βख਺ྉ w 50$00ɿ॓ധඅͷΈɻख਺ྉͳ͠ͷԷ஋ w ͦͷ͔ΘΓɿϢʔβ͕༗ྉ೥ձඅ w .8$ .FNCFSTIJQ8IPMFTBMF$MVC Ϟσϧ

    w αϒεΫϦϓγϣϯϞσϧ 50$00ͷϏδωεϞσϧ
  5. ख਺ྉ ॓ധඅʢؚख਺ྉ ॓ധඅʢؚख਺ྉ ख਺ྉ ॓ധඅʢؚख਺ྉ ॓ധඅʢؚख਺ྉ ख਺ྉ ॓ധඅʢؚख਺ྉ ॓ധඅʢؚख਺ྉ Ұൠతͳ॓ധ༧໿αΠτ

  6. ೥ձඅ ॓ധඅͷΈ ॓ധඅͷΈ 5PDPP ॓ധඅͷΈ ॓ധඅͷΈ ॓ധඅͷΈ ॓ധඅͷΈ

  7. w Πϯϑϥ؀ڥ͕ΦϯϓϨϛεɻ w ೥݄Ͱσʔλɾηϯλʔͷܖ໿ຬྃɻ w ߋ৽ͤͣʹ"84΁ͷҠߦΛܾஅɻ w Ϋϥεϝιου͞ΜʹɺΠϯϑϥߏஙίϯαϧґཔ w ࣗ෼ͨͪ͸ΞϓϦͷվमʹूத

    ϨΨγʔ୤٫ͷ͖͔͚ͬ IUUQTDMBTTNFUIPEKQDBTFTDPPDPN Πϯϑϥଆͷࣄྫ঺հˠ
  8. w ιʔε؅ཧɿHJUMBCɺTWOɺHJUIVCೖΓཚΕΔ w ੈ୅؅ཧɿσΟϨΫτϦؙ͝ͱ w ؀ڥ؅ཧɿσΟϨΫτϦΛ෼͚ͯ w σϓϩΠɿGUQͰαʔό୆ͮͭखಈσϓϩΠ ΞϓϦέʔγϣϯଆͷ՝୊

  9. ϨΨγʔΏ͑ʹͰ͖͍ͯͨ w %FW؀ڥɿෳࡶͳσΟϨΫτϦߏ଄ w ̍αʔόʹෳ਺؀ڥ͕όʔδϣϯҧ͍ͰଘࡏͰ͖͍ͯͨ w ख࡞ۀͷ഑ஔͳͷͰɺࣗ༝౓͕ߴ͍

  10. ϨΨγʔ୤٫΁ͷୈҰา w ιʔε؅ཧΛ(JUIVCʹू໿ɺϒϥϯνӡ༻ w ෳ਺%FW؀ڥ΋༻ҙɿ%FWʙ%FW·Ͱ४උ w +FOLJOTʹΑΔࣗಈ%FQMPZͷಋೖ w %FQMPZFS QIQ

    $BQJTUSBOPΈ͍ͨͳ΍ͭͷ1)1൛ w %FWʙ%FWʹͦΕͧΕϒϥϯνࢦఆͰ%FQMPZՄೳ w 7BHSBOUͰͷ-PDBM؀ڥɿݸਓͷ։ൃ؀ڥ͸͜͜ɻ
  11. ։ൃͷखॱͷมԽ w (JUIVCͰϒϥϯνӡ༻ɿϓϧϦΫͱϨϏϡʔͷಋೖ w +FOLJOTɺຊ൪%FQMPZ+PC͸NBTUFSϒϥϯν͚ͩ w (JUIVCɺϨϏϡʔ௨Βͳ͍ͱNBTUFSʹ.FSHFͰ͖ͳ͍ઃఆ w ࢓૊Έͷಋೖɹˠɹ͜ͷจԽʹ׳ΕΔ

  12. w (JUIVCͰ13ͷ$IFDL͕(SFF͡Όͳ͍ͱ.FSHFͰ͖ͳ͘ ͯɺ+FOLJOTͰࢦఆͨ͠؀ڥʹ#SBODIΛબΜͰ%FQMPZͰ ͖Δ༻ʹͳͬͨΒɾɾɾ w $*Λճ͍ͨ͠ΑͶɻ w Ͱ΋Ϣχοτςετ͸ͱͯ΋ೖΕΒΕͳ͍ɿιʔεతʹ ࣍ͷ45&1

  13. $PEFDFQUJPO IUUQTDPEFDFQUJPODPN

  14. $PEFDFQUJPO w ςετϑϨʔϜϫʔΫ w l୯ମςετɺػೳςετɺड͚ೖΕςετΛͭͷํ๏Ͱ ͙͢ʹॻ͚ΔΑ͏ʹͳΔͨΊͷπʔϧͳͷͰ͢ɻz IUUQTQJDDBHMJBOJHJUIVCJP$PEFDFQUJPOEPDTKB@+1

  15. ड͚ೖΕςετ ʢBDDFQUBODFUFTUʣ w ϢʔβςετɺΞΫηϓλϯεςετ w ϒϥ΢βΛ࣮ࡍʹಈ͔͢&&ͷςετ w ϑϨʔϜϫʔΫɺݴޠɺσʔλϕʔεʹΑΒͳ͍ w ϒϥοΫϘοΫεςετ

  16. ̎छྨͷϒϥ΢β w 1)1#SPXTFS1)1ͱD63-͚ͩͰͲΜͳ؀ڥͰ΋࣮ߦ Ͱ͖Δɻ+BWBTDSJQU͕࣮ߦͰ͖ͳ͍ɻ w 4FMFOJVN8FC%SJWFS4FMFOJVN4FSWFS͕ඞཁɻ .PCJMF&NVMBUF͕Ͱ͖ͳ͍ɻʢ8FC%SJWFSͷ໰୊ʁʣ

  17. w 4FMFOJVNͰςετ͍͚ͨ͠Ͳɺ4FMFOJVNαʔόཱͯΔͷΊΜͲ͍͘͞ w %PDLFS)VCʹ͋ͬͨɻIUUQTIVCEPDLFSDPNVTFMFOJVN w $PEFDFQUJPOͷ࣮ߦ؀ڥߏங͠ͳ͍ͱ͚ͩͲɺαʔόཱͯΔͷΊΜͲ͍͘͞ w %PDLFS)VCʹ͋ͬͨɻIUUQTIVCEPDLFSDPNSDPEFDFQUJPO DPEFDFQUJPO w

    %PDLFSDPNQPTFͰ࡞Εͦ͏ɻ %PDLFS)VCʹ͋ͬͨɻ
  18. EPDLFSDPNQPTFZNM version: '2' services: codecept: image: codeception/codeception depends_on: - chrome

    - firefox volumes: - './tests:/project/tests' - './codeception.yml:/project/codeception.yml' chrome: image: 'selenium/standalone-chrome-debug:2.53.1' ports: - '5901:5900' firefox: image: 'selenium/standalone-firefox-debug:2.53.1' ports: - '5902:5900'
  19. ίϚϯυ w TFMFOJVNαʔό্ཱͪ͛ >docker-compose up -d chrome firefox w EPDLFS಺ͷCSPXTFSͷڍಈ֬ೝ

    7/$  >open vnc://x:secret@127.0.0.1:5901 w $PEFDFQUJPOͰͷςετ࣮ߦ >docker-compose run codecept run -x optional -vv -- html=_report.html --env firefox --env chrome --env phpbrowser -g all
  20. .BLFpMF .PHONY: all DOCKER_COMPOSE ?= docker-compose GROUP ?= all all:

    ##@test [TEST] shorthand for $(MAKE) up run-tests up: ##@development start stack $(DOCKER_COMPOSE) up -d chrome firefox run-tests: ##@test run tests $(DOCKER_COMPOSE) run codecept run -x optional -vv -- html=_report.html --env firefox --env chrome --env phpbrowser -g ${GROUP}
  21. %PDLFSͱ$PEFDFQUJPOΛ࢖ͬͯ&&ςετ Λ؆୯ʹ࣮ߦ΋$*΋Ͱ͖Δ؀ڥΛ࡞ͬͯΈͨɻ w IUUQTRJJUBDPN.JVSB,BUTVJUFNT EBBEC w IUUQTHJUIVCDPN.JVSB,BUTV DPEFDFQUJPO@FBTZ@BDDFQUBODF

  22. σϞ ͕࣌ؒ͋Ε͹ɾɾɾ

  23. $JSDMF$* w $*͸$JSDMF$*Ͱճ͢ɻ+FOLJOT͸%FQMPZʹઐ೦ɻ w $JSDMF$*Ͱ΋ಉ͡EPDLFSDPNQPTFΛ࢖͍͍ͨ w ࣮ߦλΠϓ͸EPDLFS͡Όͳͯ͘ɺNBDIJOF w DJSDMFDJDPOpHZNM಺ʹಉ͡EPDLFSDPNQPTFίϚϯυ

  24. $*ͷྲྀΕ w (JUIVCͰNBTUFSʹ13 w ˠ+FOLJOTͰ%FW؀ڥʹ%FQMPZ w ˠ$JSDMF$*Ͱ$PEFDFQUJPOͰ"DDFQUBODF5FTUΛ%FW̌؀ڥͰ࣮ߦ 1VMM3FRVFTU 8FCIPPL %FQMPZ

    "DDFQUBODF5FTU %FW̌؀ڥ
  25. ޻෉ w ౎౓%PDLFS*NBHFΛ1VMM͢Δͱ͕͔͔࣌ؒΔ w %PDLFS*NBHFͷ$BDIF࡞͓ͬͯ͘ w ࢀߟɹ$JSDMF$JͰ%PDLFSΠϝʔδΛΩϟογϡ͠Ϗ ϧυΛര଎Ͱߦ͏IUUQTRJJUBDPNUBLFDPSF!HJUIVC JUFNTBCFC

  26. ޻෉̎ w EFW؀ڥͳͷͰIUUQͷΞΫηε΋*1ߜͬͯΔ w ςετͷ౎౓ηΩϡϦςΟάϧʔϓʹ௥Ճɾ࡟আ #!/bin/sh export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}

    export AWS_DEFAULT_REGION="ap-northeast-1" #dev-circleci-codeception-sg COMSECURITYGROUP=“sg-yoursecuritygroupid“ MYIP=`curl -s ifconfig.me` aws ec2 authorize-security-group-ingress --group-id ${COMSECURITYGROUP} -- protocol tcp --port 443 --cidr ${MYIP}/32 aws ec2 revoke-security-group-ingress --group-id ${COMSECURITYGROUP} -- protocol tcp --port 443 --cidr ${MYIP}/32
  27. ॻ͍͍ͯΔςετ w ࠷௿ݶͷػೳ τοϓϖʔδͷදࣔɺӳ೔தؖ੾Γସ͑ɺ ݕࡧɺϩάΠϯ౳ʣͷςετ͚ͩ࡞੒ w $*ͷ໨తɿσάϨɾطଘ΁ͷӨڹ͕ͳ͍͔ͷνΣοΫɻ

  28. ͪΐͬͱ͚ͩ ϨΨγʔ͔Β୤٫

  29. ·ͱΊ w ϨΨγʔ؀ڥͰ͸ɺແཧʹϢχοτςετ͡Όͳͯ͘΋ &&ͷड͚ೖΕςετ͔Β͸͡Ίͯ͸Ͳ͏ͩΖ͏͔ɻ w &&Ͱͷ$*ɺࣗಈ%FQMPZͷ࢓૊Έ͑͞੔͑ΒΕΕ͹ɺͳ Μͱ͔ͳΔɻ w ϨΨγʔͰ΋$*͸ճͤΔɻ

  30. ຊ֨తʹϨΨγʔ͔Βͷ୤٫ w ൈຊతվमɻͱ͍͏͔࡞Γସ͑ɻ w 1)1 $BLF1)1 "VSPSB .ZTRM "NB[PO-JOVY w

    Ϣχοτςετ΋ಋೖ༧ఆ w ΋ͪΖΜड͚ೖΕςετ΋
  31. ΤϯδχΞืूத IUUQTXXXXBOUFEMZDPNDPNQBOJFTUPDPP