Slide 1

Slide 1 text

ޮՌతͳ੩తղੳͷ CIಋೖύλʔϯΛٻΊͯ PHPConference 2020 αΠϘ΢ζגࣜձࣾɹਿࢁ ༞Ұ @oogFranz #phpcon #track2

Slide 2

Slide 2 text

Whoami • ਿࢁ ༞Ұ @oogFranz • αΠϘ΢ζ6೥໨ΤϯδχΞ • େاۀ޲͚άϧʔϓ΢ΣΞGaroon࡞ͬͯΔ • ෳۀδϟζϛϡʔδγϟϯ@MASHݭָஂ • ϦϞʔτϫʔΫͷӨڹͰ඘͕ੜ͑ͨ

Slide 3

Slide 3 text

MASH meets GHIBLI JAZZ • https://youtu.be/ZEtTwGen3fI • δϒϦۂͷδϓγʔδϟζΞϨϯδCD • ੋඇ͓ങ͍ٻΊ͍ͩ͘͞ʂ

Slide 4

Slide 4 text

αΠϘ΢ζ Garoon ͷද޲͖આ໌ • େن໛޲͚ͷάϧʔϓ΢ΣΞ • ੜ࢈ੑɾνʔϜϫʔΫ޲্ͷࢧԉ

Slide 5

Slide 5 text

αΠϘ΢ζ Garoon ͷཪଆઆ໌ • PHPͱMySQLͰͰ͖ͯΔWebΞϓϦέʔγϣϯ • ։ൃ19೥໨ • PHP͸ 4͔Β7.4ʹʢPHP 8.0Ҡߦ΋ਐΊͯͧ͘ʂʣ • PHPͷίʔυ͸180ສߦ͘Β͍

Slide 6

Slide 6 text

αΠϘ΢ζ Garoon ͷཪଆઆ໌ • PHPͱMySQLͰͰ͖ͯΔWebΞϓϦέʔγϣϯ • ։ൃ19೥໨ • PHP͸ 4͔Β7.4ʹʢPHP 8.0Ҡߦ΋ਐΊͯͧ͘ʂʣ • PHPͷίʔυ͸180ສߦ͘Β͍ ͳ͔ͳ͔ϨΨγʔʂ

Slide 7

Slide 7 text

ϨΨγʔʹཱͪ޲͔͓͏ʂ ϨΨγʔίʔυΛ៉ྷʹͯ͠΍Δʂ ·ͣ͸طଘ࣮૷ΛΑ͘ಡΜͰΈΑ͏ʂ

Slide 8

Slide 8 text

খੴʹͭ·ͣ͘ ܕએݴ΋ PHPDoc΋ͳͯ͘ίʔυ͕௥͑ͳ͍ɻɻɻ Ҿ਺ʹΑͬͯ͸յΕΔϝιου͕͋Δɻɻɻ ͜͜ͷίʔυͣͬͱಡΜͰ͚ͨͲɺ ͦ΋ͦ΋୭΋ݺͼग़ͯ͠ͳ͍ɻɻɻʁ

Slide 9

Slide 9 text

খੴʹͭ·ͣ͘ ܕએݴ΋ PHPDoc΋ͳͯ͘ίʔυ͕௥͑ͳ͍ɻɻɻ Ҿ਺ʹΑͬͯ͸յΕΔϝιου͕͋Δɻɻɻ ͜͜ͷίʔυͣͬͱಡΜͰ͚ͨͲɺ ͦ΋ͦ΋୭΋ݺͼग़ͯ͠ͳ͍ɻɻɻʁ ຊ࣭తͳ໰୊ʢઃܭͳͲʣʹͨͲΓண͘લʹɺ খ͞ͳ໰୊͕ؾʹͳͬͯίʔυϦʔσΟϯά͕ਐ·ͳ͍

Slide 10

Slide 10 text

ϨΨγʔʹཱͪ޲͔͏ɺͦͷؒʹ΋ • ৽͍͠ίʔυ͕ͲΜͲΜ૿͍͑ͯ͘ • طଘίʔυΛ౿ऻ͞ΕΔͷͰɺ ͭ·͖ͮ΍͍͢ίʔυ͕૿͑Δ • ϝϯόʔʹΑͬͯεΩϧࠩ΋͋Δ

Slide 11

Slide 11 text

ϨΨγʔʹཱͪ޲͔͏ɺͦͷؒʹ΋ • ৽͍͠ίʔυ͕ͲΜͲΜ૿͍͑ͯ͘ • طଘίʔυΛ౿ऻ͞ΕΔͷͰɺ ͭ·͖ͮ΍͍͢ίʔυ͕૿͑Δ • ϝϯόʔʹΑͬͯεΩϧࠩ΋͋Δ খੴ͕૿͑ͳ͍Α͏ʹɺͤΊͯ৽نίʔυ͸៉ྷʹ͍ͨ͠

Slide 12

Slide 12 text

খੴΛ·ͣर͏ɾখੴΛ૿΍͞ͳ͍ • খ͍͞໰୊͕ଟ͍ͱখ͍͞໰୊Ͱؾ͕ࢄΔ • খ͍͞໰୊Λ͋Β͔͡ΊݮΒ͢ɾ૿΍͞ͳ͍ ͜ͱͰΑΓॏେͳ໰୊ʹऔΓ૊Έ΍͘͢ͳΔ

Slide 13

Slide 13 text

খੴΛ·ͣर͏ɾখੴΛ૿΍͞ͳ͍ • খ͍͞໰୊͕ଟ͍ͱখ͍͞໰୊Ͱؾ͕ࢄΔ • খ͍͞໰୊Λ͋Β͔͡ΊݮΒ͢ɾ૿΍͞ͳ͍ ͜ͱͰΑΓॏେͳ໰୊ʹऔΓ૊Έ΍͘͢ͳΔ ੩తղੳπʔϧΛ$*ʹ૊ΈೖΕΑ͏ʂ

Slide 14

Slide 14 text

ࠓ೔ͷͬ͘͟Γ࿩ • ੩తղੳͷ CI ΛΑ͘͢Δ࿩ • CIࢹ఺த৺ • ੩తղੳࣗମΛΑ͘͢Δ࿩΋աڈʹ͠·ͨ͠ https://speakerdeck.com/oogfranz/how-to-make-your-static-analysis-strong

Slide 15

Slide 15 text

੩తղੳͱ͸ʁ • ίʔυΛ࣮ߦͤͣʹߦ͏ݕূ • ͭ·͖ͮͦ͏ͳখੴΛissueͱͯ͠ݟ͚ͭͯ͘ΕΔ • όάʹͳΓͦ͏ͳίʔυɺո͍͠ίʔυͷݕ஌ • ʢ͍͍ͩͨʣૣ͍ • ʢ͍͍ͩͨʣࣗಈԽ͕͠΍͍͢

Slide 16

Slide 16 text

ͲΜͳখੴɾissueΛݟ͚ͭͯ͘ΕΔʁ • ܕͷෆ੔߹ • ଘࡏ͠ͳ͍ϝιουͷݺͼग़͠ • ഑ྻͰͳ͍஋ʢboolean, nullͳͲʣ΁ͷ഑ྻΞΫηε • ෆཁίʔυ

Slide 17

Slide 17 text

ੲͷPHPʹ͋Γ͕ͪɺࣦഊͨ͠Βfalse

Slide 18

Slide 18 text

ੲͷPHPʹ͋Γ͕ͪɺࣦഊͨ͠Βfalse falseʹͳ͍ͬͯΔͱɺҙਤͤͣ΍ΒΕΔ

Slide 19

Slide 19 text

ੲͷPHPʹ͋Γ͕ͪɺࣦഊͨ͠Βfalse falseʹͳ͍ͬͯΔͱɺҙਤͤͣ΍ΒΕΔ ੩తղੳπʔϧ͕ڭ͑ͯ͘ΕΔʂ

Slide 20

Slide 20 text

ςετ͕ͳ͍ϨΨγʔͰ΋ • ੩తղੳπʔϧ͸ςετίʔυ͕ͳͯ͘΋ಋೖՄೳ • ϓϩμΫτʹʢ΄΅ʣΑΒͣɺಋೖՄೳ • ϨΨγʔϓϩμΫτ͸ԟʑʹͯ͠ςετίʔυ͕ͳ͍ • ςετίʔυ͕ͳͯ͘΋όά΍໰୊Λݟ͚ͭΒΕΔ

Slide 21

Slide 21 text

ςετ͕ͳ͍ϨΨγʔͰ΋ • ੩తղੳπʔϧ͸ςετίʔυ͕ͳͯ͘΋ಋೖՄೳ • ϓϩμΫτʹʢ΄΅ʣΑΒͣɺಋೖՄೳ • ϨΨγʔϓϩμΫτ͸ԟʑʹͯ͠ςετίʔυ͕ͳ͍ • ςετίʔυ͕ͳͯ͘΋όά΍໰୊Λݟ͚ͭΒΕΔ ੩తղੳπʔϧΛ$*ʹಋೖ͠Α͏ʂ

Slide 22

Slide 22 text

Q. CIಋೖ͕ͳͥେࣄ͔ʁ

Slide 23

Slide 23 text

Q. CIಋೖ͕ͳͥେࣄ͔ʁ • શϝϯόʔ͕࠷௿ݶͷΫΥϦςΟͰίʔυΛॻ͚Δ • ϑΟʔυόοΫϧʔϓ͕୹͘ͳΔ

Slide 24

Slide 24 text

ϑΟʔυόοΫϧʔϓͱ͸ʁ • ΤϯδχΞɾϓϩμΫτͷԿΒ͔ͷ׆ಈʹɺ ϑΟʔυόοΫΛಘͯɺ੡඼ʹ൓ө͢ΔαΠΫϧ • e.g. • ੡඼ΛϦϦʔεͯ͠ސ٬ͷ൓ԠΛݟΔ • ॻ͍ͨίʔυΛϚχϡΞϧςετ͢Δ • ίʔυϨϏϡʔΛ͢Δ

Slide 25

Slide 25 text

ϑΟʔυόοΫϧʔϓͷ֊૚ IUUQTXXXBHJMFDPOOFDUJPODPNBSUJDMFVTJOHGFFECBDLMPPQTCPPTUEFWFMPQNFOUMJGFDZDMFTΑΓҾ༻

Slide 26

Slide 26 text

ϑΟʔυόοΫϧʔϓͷ௕͞ • ϑΟʔυόοΫ͸ૣ͚Ε͹ૣ͍΄Ͳྑ͍ • ੩తղੳͷCI͸΋ͬͱ΋୹͍ϧʔϓͰ ϑΟʔυόοΫΛಘΒΕΔ • ίϛοτ୯ҐͰ੩తղੳͷ݁ՌΛϑΟʔυόοΫ͠Α͏

Slide 27

Slide 27 text

ϑΟʔυόοΫͷ࣭ • ͙͢ʹϑΟʔυόοΫ͕དྷΔͷͰϑΟʔυόοΫͷ࣭͕େࣄ • ཧղɺमਖ਼͸༰қʹ • ݟա͝͞Εͳ͍Α͏ʹ • ա৒ʹͳΒͳ͍Α͏ʹ • Ͱ΋ෆ଍͠ͳ͍Α͏ʹ

Slide 28

Slide 28 text

ϑΟʔυόοΫͷ࣭ • ͙͢ʹϑΟʔυόοΫ͕དྷΔͷͰϑΟʔυόοΫͷ࣭͕େࣄ • ཧղɺमਖ਼͸༰қʹ • ݟա͝͞Εͳ͍Α͏ʹ • ա৒ʹͳΒͳ͍Α͏ʹ • Ͱ΋ෆ଍͠ͳ͍Α͏ʹ $*ಋೖ͢Δ͚ͩͰ΋Ғ͍͕ɺ ϑΟʔυόοΫΛҙࣝͯ͠ಋೖ͠Α͏ʂ

Slide 29

Slide 29 text

΍ͬͯΈͨ

Slide 30

Slide 30 text

Psalm • https://psalm.dev/ • ʢͨͿΜʣαʔϜ /sάːm, sɑ:lm/ ͱൃԻ͢Δ • ࢍඒՎɺ੟Վɺࢻฤͱݴ͏ҙຯ • vimeo͕։ൃ • ઃఆϑΝΠϧ͸XML

Slide 31

Slide 31 text

ਘৗ͡Όͳ͍issue਺

Slide 32

Slide 32 text

ਘৗ͡Όͳ͍issue਺ ղੳ݁ՌΛॖখදࣔͨ͠΋ͷʢҰ෦ʣ

Slide 33

Slide 33 text

Phan • https://github.com/phan/phan • ʢͨͿΜʣϑΝϯ(/fan/)ͱൃԻ͢Δ • ར༻ʹphp-astͷ֦ு͕ඞཁ • ઃఆϑΝΠϧ͸PHPϑΝΠϧ • Etsyࣾͷ։ൃ͕ݩ

Slide 34

Slide 34 text

ਘৗ͡Όͳ͍issue਺

Slide 35

Slide 35 text

ਘৗ͡Όͳ͍issue਺ ղੳ݁ՌΛॖখදࣔͨ͠΋ͷʢҰ෦ʣ

Slide 36

Slide 36 text

ਘৗ͡Όͳ͍issue਺ • ͦΕ·Ͱ੩తղੳͰอޢ͞Ε͍ͯͳ͍ίʔυ͸ جຊతʹແ਺ͷissue͕ใࠂ͞ΕΔ • ·ͱ΋ʹऔΓ߹͏ͱ৺͕ંΕΔ

Slide 37

Slide 37 text

ਘৗ͡Όͳ͍issue਺ • ͦΕ·Ͱ੩తղੳͰอޢ͞Ε͍ͯͳ͍ίʔυ͸ جຊతʹແ਺ͷissue͕ใࠂ͞ΕΔ • ·ͱ΋ʹऔΓ߹͏ͱ৺͕ંΕΔ େྔͷJTTVFΛ͍ͳͭͭ͠ɺ ੩తղੳͷϝϦοτΛಘΔ࢓૊Έ͕ඞཁ

Slide 38

Slide 38 text

େྔͷissueʹཱͪ޲͔͏ • ੩తղੳπʔϧʹ͸ಛఆͷissueΛແࢹ͢Δɺ ઃఆʢignore, suppressʣ͕༻ҙ͞Ε͍ͯΔ • ͜ΕΛར༻ͯ͠ΈΔ

Slide 39

Slide 39 text

Psalm https://psalm.dev/docs/running_psalm/dealing_with_code_issues/#config-suppression

Slide 40

Slide 40 text

Psalm https://psalm.dev/docs/running_psalm/dealing_with_code_issues/#config-suppression type="suppress"Ͱ ཈੍ ϑΝΠϧ΍σΟϨΫτϦͱ͍ͬͨ୯ҐͰࢦఆՄೳ

Slide 41

Slide 41 text

Phan

Slide 42

Slide 42 text

Phan suppress_issue_typesͰࢦఆ

Slide 43

Slide 43 text

PHPStan

Slide 44

Slide 44 text

PHPStan • https://github.com/phpstan/phpstan • ݱঢ়ͰҰ൪ਓؾͷ੩తղੳπʔϧ • ઃఆϑΝΠϧ͸.neonͱ͍͏yamlͷΑ͏ͳϑΝΠϧ • pro൛͕͋ΔʢओʹWeb UIʣ

Slide 45

Slide 45 text

PHPStan ΤϥʔϝοηʔδΛਖ਼نදݱͰࢦఆ ϑΝΠϧɾσΟϨΫτϦͰର৅Λࢦఆ

Slide 46

Slide 46 text

ͻͱ·ͣsuppress • ੩తղੳͷCIΛಋೖ͢Δ͜ͱΛ࠷༏ઌ͢ΔͳΒ͋Γ • ͙͢ʹ࣏ͤͳ͍ΤϥʔΛ͢΂ͯಥͬࠐΊ͹ɺ CIͰΤϥʔʹͳΒͳ͘ͳΔ

Slide 47

Slide 47 text

suppressͷ໰୊఺ • suppressͷϧʔϧ͸େຯ͔ɺෳࡶʹͳΔɻ • େຯͳઃఆ͸ɺϓϩμΫτશମʹద༻͞ΕΔͨΊɺ ৽نͷίʔυͷ੩తղੳ͕ऑ·ͬͯ͠·͏ • ෳࡶͳϧʔϧ͸ద༻ൣғͷमਖ਼ͳͲ͕ඇৗʹେม

Slide 48

Slide 48 text

suppressϧʔϧͷϝϯςφϯε • suppress͞ΕΔൣғ͸গͳ͍ͨ͘͠ • suppressͷϧʔϧ͸γϯϓϧʹ͍ͨ͠ ʢର৅ϑΝΠϧɺσΟϨΫτϦɺͳͲʣ

Slide 49

Slide 49 text

suppressϧʔϧͷϝϯςφϯε • suppress͞ΕΔൣғ͸গͳ͍ͨ͘͠ • suppressͷϧʔϧ͸γϯϓϧʹ͍ͨ͠ ʢର৅ϑΝΠϧɺσΟϨΫτϦɺͳͲʣ ࣗಈͰTVQQSFTTϧʔϧ͕ߋ৽͞ΕΔͱخ͍͠

Slide 50

Slide 50 text

suppressϧʔϧͷϝϯςφϯε • suppress͞ΕΔൣғ͸গͳ͍ͨ͘͠ • suppressͷϧʔϧ͸γϯϓϧʹ͍ͨ͠ ʢର৅ϑΝΠϧɺσΟϨΫτϦɺͳͲʣ ࣗಈͰTVQQSFTTϧʔϧ͕ߋ৽͞ΕΔͱخ͍͠ ੩తղੳπʔϧͷCBTFMJOF $*πʔϧͷΩϟογϡ ͷ૊Έ߹ΘͤͰղܾʂ

Slide 51

Slide 51 text

baselineͷಋೖ • baseline: suppress ruleΛࣗಈੜ੒͢Δػೳ • طଘͷissueΛه࿥͠ɺ੩తղੳ࣌ʹ͸ ه࿥͞ΕͨissueΛແࢹ͢Δ • $ vendor/bin/psalm --save-baseline baseline.xml $ vendor/bin/phan --save-baseline baseline.php $ vendor/bin/phpstan analyse --generate-baseline phpstan-baseline.neon

Slide 52

Slide 52 text

CIͷΩϟογϡ • GitHub Actions, CircleCIͱ͍ͬͨCIπʔϧʹ͸ աڈͷδϣϒ΍ଞͷδϣϒͷσʔλΛΩϟογϡ͠ɺ ࠶ར༻͢Δ࢓૊Έ͕͋Δ • ΩʔͱϑΝΠϧΛࢦఆͯ͠อଘ • ΩʔΛ෦෼Ұகͯ͠औಘͤ͞Δ͜ͱͰɺ աڈͷδϣϒͷσʔλΛར༻Ͱ͖Δ

Slide 53

Slide 53 text

উखʹڧ͘ͳΔ੩తղੳ 1. ίϛοτͷͨͼʹɺbaselineΛར༻ͯ͠ ੩తղੳΛ࣮ߦ͢Δ 2. issue͕ͳ͚Ε͹ɺbaselineΛߋ৽͢Δ 3. ࣍ͷίϛοτͰ͸৽͍͠baselineΛར༻ͯ͠ɺ ੩తղੳΛߦ͏

Slide 54

Slide 54 text

উखʹڧ͘ͳΔ੩తղੳͷྫ • CircleCI + Phan ͷྫ • ଞͷCIπʔϧʢGitHub ActionsͳͲʣ΍ ଞͷ੩తղੳπʔϧʢPHPStan, PsalmͳͲʣͰ΋ Ԡ༻Մೳʢͷ͸ͣʣ

Slide 55

Slide 55 text

baselineΛར༻ͯ͠੩తղੳ phan-load-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - restore_cache: name: Restore baseline keys: - v1-phan-baseline-{{ .BRANCH }}- - v1-phan-baseline-develop- - run: name: Phan command: | if [[ -f ~/phan_baseline.php ]]; then phan ./ --load-baseline ~/phan_baseline.php fi

Slide 56

Slide 56 text

baselineΛར༻ͯ͠੩తղੳ phan-load-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - restore_cache: name: Restore baseline keys: - v1-phan-baseline-{{ .BRANCH }}- - v1-phan-baseline-develop- - run: name: Phan command: | if [[ -f ~/phan_baseline.php ]]; then phan ./ --load-baseline ~/phan_baseline.php fi CIʢCircleCIʣͷΩϟογϡ͔Β baselineΛऔಘ

Slide 57

Slide 57 text

baselineΛར༻ͯ͠੩తղੳ phan-load-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - restore_cache: name: Restore baseline keys: - v1-phan-baseline-{{ .BRANCH }}- - v1-phan-baseline-develop- - run: name: Phan command: | if [[ -f ~/phan_baseline.php ]]; then phan ./ --load-baseline ~/phan_baseline.php fi ։ൃதϒϥϯνʹbaseline͕ ͋Ε͹ͦΕΛར༻

Slide 58

Slide 58 text

baselineΛར༻ͯ͠੩తղੳ phan-load-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - restore_cache: name: Restore baseline keys: - v1-phan-baseline-{{ .BRANCH }}- - v1-phan-baseline-develop- - run: name: Phan command: | if [[ -f ~/phan_baseline.php ]]; then phan ./ --load-baseline ~/phan_baseline.php fi ։ൃதϒϥϯνʹbaseline͕ ͳ͚Ε͹developϒϥϯνΛར༻

Slide 59

Slide 59 text

baselineΛར༻ͯ͠੩తղੳ phan-load-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - restore_cache: name: Restore baseline keys: - v1-phan-baseline-{{ .BRANCH }}- - v1-phan-baseline-develop- - run: name: Phan command: | if [[ -f ~/phan_baseline.php ]]; then phan ./ --load-baseline ~/phan_baseline.php fi ੩తղੳΛ࣮ߦʢ͜͜Ͱ͸Phanʣ

Slide 60

Slide 60 text

baselineΛར༻ͯ͠੩తղੳ phan-load-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - restore_cache: name: Restore baseline keys: - v1-phan-baseline-{{ .BRANCH }}- - v1-phan-baseline-develop- - run: name: Phan command: | if [[ -f ~/phan_baseline.php ]]; then phan ./ --load-baseline ~/phan_baseline.php fi baseline͕ݟ͔ͭΒͳ͍࣌͸Skip

Slide 61

Slide 61 text

baselineΛར༻ͯ͠੩తղੳ phan-load-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - restore_cache: name: Restore baseline keys: - v1-phan-baseline-{{ .BRANCH }}- - v1-phan-baseline-develop- - run: name: Phan command: | if [[ -f ~/phan_baseline.php ]]; then phan ./ --load-baseline ~/phan_baseline.php fi Ωϟογϡʹอଘ͞Ε͍ͯͨbaselineΛ ར༻ͯ͠੩తղੳΛ࣮ߦ

Slide 62

Slide 62 text

baselineΛߋ৽͢Δ phan-save-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - run: name: Save Phan baseline command: | set +e phan ./ --save-baseline ~/phan_baseline.php exit 0 - save_cache: key: v1-phan-baseline-{{ .BRANCH }}-{{ .Revision }} paths: ~/phan_baseline.php

Slide 63

Slide 63 text

phan-save-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - run: name: Save Phan baseline command: | set +e phan ./ --save-baseline ~/phan_baseline.php exit 0 - save_cache: key: v1-phan-baseline-{{ .BRANCH }}-{{ .Revision }} paths: ~/phan_baseline.php baselineΛߋ৽͢Δ baselineΛ࡞੒

Slide 64

Slide 64 text

phan-save-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - run: name: Save Phan baseline command: | set +e phan ./ --save-baseline ~/phan_baseline.php exit 0 - save_cache: key: v1-phan-baseline-{{ .BRANCH }}-{{ .Revision }} paths: ~/phan_baseline.php baselineΛߋ৽͢Δ ੩తղੳπʔϧʹΑͬͯ͸issue͕ଘࡏ͢Δ ͱऴྃίʔυ͕1Λฦ͢ͷͰέΞ͕ඞཁ

Slide 65

Slide 65 text

phan-save-baseline: docker: - image: docker-registory.cybozu.private/phan:X.Y.Z steps: - checkout - run: name: Save Phan baseline command: | set +e phan ./ --save-baseline ~/phan_baseline.php exit 0 - save_cache: key: v1-phan-baseline-{{ .BRANCH }}-{{ .Revision }} paths: ~/phan_baseline.php baselineΛߋ৽͢Δ baselineΛΩϟογϡʹอଘ

Slide 66

Slide 66 text

baselineͷϦηοτ • ੩తղੳπʔϧͷόʔδϣϯΞοϓͳͲͰ baselineΛϦηοτ͍͕ͨ࣌͋͠Δ • ΩϟογϡͷΩʔ໊Λมߋ͢Δ - save_cache: key: v1-phan-baseline-{{ .BRANCH }}-{{ .Revision }} paths: ~/phan_baseline.php - save_cache: key: v2-phan-baseline-{{ .BRANCH }}-{{ .Revision }} paths: ~/phan_baseline.php ΩϟογϡΩʔ໊Λߋ৽͢Δ

Slide 67

Slide 67 text

੩తղੳ͕উखʹڧ͘ͳΔʂ

Slide 68

Slide 68 text

΋ͬͱ੩తղੳΛΑ͍ͨ͘͠ʂ

Slide 69

Slide 69 text

• ϑΟʔυόοΫΛվળ͢Δ ͞ΒʹνʔϜͷ੩తղੳମݧΛΑ͘͢ΔTips ཧղ༰қʹ͢Δ ϑΟʔυόοΫΛૣ͘͢Δ ݎ࿚ʹ͢Δ

Slide 70

Slide 70 text

• ϑΟʔυόοΫΛվળ͢Δ ͞ΒʹνʔϜͷ੩తղੳମݧΛΑ͘͢ΔTips ཧղ༰қʹ͢Δ ϑΟʔυόοΫΛૣ͘͢Δ ݎ࿚ʹ͢Δ

Slide 71

Slide 71 text

੩తղੳʹ͔͔Δ࣌ؒΛ୹͘͢Δ • CIͰ஗͍ͱ͜ΖʢϘτϧωοΫʣΛվળ͢Δ • ϑΟʔυόοΫϧʔϓ͸ૣ͚Ε͹ૣ͍΄Ͳྑ͍ • GaroonͰ͸ • git clone • ੩తղੳͷ࣮ߦ • ͕஗͔ͬͨ

Slide 72

Slide 72 text

git cloneΛૣ͘͢Δ • ௕͘։ൃ͍ͯ͠ΔϓϩμΫτͰ͸git clone͕஗͍ • →shallow cloneΛ͢Δʢ࠷৽ίϛοτ͚ͩऔಘ͢Δʣ • Garoonͩͱ໿6ഒૣ͘ͳΔʢ25.2 ඵ → 4.0 ඵʣ $ git clone --depth=1 --branch ${CIRCLE_BRANCH} \ --single-branch ${CIRCLE_REPOSITORY_URL}

Slide 73

Slide 73 text

੩తղੳʹ͔͔Δ࣌ؒΛ୹͘͢Δ • ࠩ෼ͷ͋ͬͨϑΝΠϧ͚ͩ੩తղੳΛ͔͚Δ • →shallow cloneΛ͍ͯ͠Δͱ git diff ͕Ͱ͖ͳ͍ • ผͷํ๏ͰdiffΛऔಘ͢Δ • →GitHub ͷϓϧϦΫऔಘ APIΛ࢖͏

Slide 74

Slide 74 text

ϓϧϦΫऔಘ GitHub API $curl -H "Authorization: token ${GITHUB_API_TOKEN}" \ -H 'Accept: application/vnd.github.v3.diff' \
 https://github.dev.cybozu.co.jp/api/v3/repos/garoon/garoon/pulls/14386 diff --git a/source/page/master/sample.php b/source/page/master/sample.php index b644b6edbf5..03624413a6a 100644 --- a/source/page/master/sample.php +++ b/source/page/master/sample.php @@ -1,3 +1,4 @@ +echo "diff test"

Slide 75

Slide 75 text

ϓϧϦΫऔಘ GitHub API $curl -H "Authorization: token ${GITHUB_API_TOKEN}" \ -H 'Accept: application/vnd.github.v3.diff' \
 https://github.dev.cybozu.co.jp/api/v3/repos/garoon/garoon/pulls/14386 diff --git a/source/page/master/sample.php b/source/page/master/sample.php index b644b6edbf5..03624413a6a 100644 --- a/source/page/master/sample.php +++ b/source/page/master/sample.php @@ -1,3 +1,4 @@ +echo "diff test" media typeͷࢦఆͰdiff͕औΕΔ https://docs.github.com/en/free-pro-team@latest/rest/overview/media-types#commits-commit-comparison-and-pull-requests

Slide 76

Slide 76 text

$curl -H "Authorization: token ${GITHUB_API_TOKEN}" \ -H 'Accept: application/vnd.github.v3.diff' \
 https://github.dev.cybozu.co.jp/api/v3/repos/garoon/garoon/pulls/14386 diff --git a/source/page/master/sample.php b/source/page/master/sample.php index b644b6edbf5..03624413a6a 100644 --- a/source/page/master/sample.php +++ b/source/page/master/sample.php @@ -1,3 +1,4 @@ +echo "diff test" ࡶʹ +++ ͱϑΝΠϧ֦ுࢠΛgrep͢Ε͹ɺ ੩తղੳର৅ͷϑΝΠϧ͕औಘͰ͖Δ https://docs.github.com/en/free-pro-team@latest/rest/overview/media-types#commits-commit-comparison-and-pull-requests ϓϧϦΫऔಘ GitHub API

Slide 77

Slide 77 text

੩తղੳʹ͔͔Δ࣌ؒΛ୹͘͢Δ • Phan͸ͦ΋ͦ΋ಛఆϑΝΠϧͷΈͷ෼ੳ͕Ͱ͖ͳ͍ • Psalm͸cacheDirectoryΛࢦఆͯ͠ɺ ࣮ߦ݁ՌΛΩϟογϡɺ--diff ΦϓγϣϯΛ࢖͏ํ͕ྑͦ͞͏ • PHPStan΍PHP Code Sniffer (ίʔσΟϯάن໿ͷνΣοΫ πʔϧ)Ͱ༗ޮ

Slide 78

Slide 78 text

• ϑΟʔυόοΫΛվળ͢Δ ͞ΒʹνʔϜͷ੩తղੳମݧΛΑ͘͢ΔTips ཧղ༰қʹ͢Δ ϑΟʔυόοΫΛૣ͘͢Δ ݎ࿚ʹ͢Δ

Slide 79

Slide 79 text

ൃੜͨ͠issueΛΘ͔Γ΍͘͢͢Δ • CIʹΤϥʔϝοηʔδΛಡΈʹ͍͘ͷ͸ΊΜͲ͍͘͞

Slide 80

Slide 80 text

reviewdog • issueͷग़ͨͱ͜ΖʹࣗಈͰίϝϯτΛ͚ͭͯ͘ΕΔ https://github.com/reviewdog/reviewdog

Slide 81

Slide 81 text

reviewdog • issueͷग़ͨͱ͜ΖʹࣗಈͰίϝϯτΛ͚ͭͯ͘ΕΔ https://github.com/reviewdog/reviewdog GitHub EnterpriseͰ͸API token͕ඞཁ APIൃߦऀͷΞΠίϯ͕ग़ΔͷͰ νʔϜϝϯόʔ͔ΒݏΘΕ΍͍͢

Slide 82

Slide 82 text

botΞΧ΢ϯτ • ਓʹ௚઀ౖΒΕΔΑΓ͸ɺbotʹౖΒΕΔํ͕·ͩϚγ • botΞΧ΢ϯτΛ࡞ͬͯӡ༻͍ͯ͠Δ • GitHubͩͱɺreviewdogͷΞΠίϯ͕ॻ͖ࠐΜͰ͘ΕΔͷͰ҆৺

Slide 83

Slide 83 text

• ϑΟʔυόοΫΛվળ͢Δ ͞ΒʹνʔϜͷ੩తղੳମݧΛΑ͘͢ΔTips ཧղ༰қʹ͢Δ ϑΟʔυόοΫΛૣ͘͢Δ ݎ࿚ʹ͢Δ

Slide 84

Slide 84 text

issueΛϝΠϯϒϥϯνʹऔΓࠐ·ͳ͍ • GitHub ͷ Branch protection rulesΛ͔ͭ͏

Slide 85

Slide 85 text

issueΛϝΠϯϒϥϯνʹऔΓࠐ·ͳ͍ • GitHub ͷ Branch protection rulesΛ͔ͭ͏ CIͷνΣοΫΛϚʔδલʹඞਢʹ͢Δ

Slide 86

Slide 86 text

issueΛϝΠϯϒϥϯνʹऔΓࠐ·ͳ͍ • GitHub ͷ Branch protection rulesΛ͔ͭ͏ ඞਢͷCIδϣϒΛબͿ

Slide 87

Slide 87 text

issueΛϝΠϯϒϥϯνʹऔΓࠐ·ͳ͍ • GitHub ͷ Branch protection rulesΛ͔ͭ͏ ඞਢͷCIδϣϒΛબͿ

Slide 88

Slide 88 text

issueΛϝΠϯϒϥϯνʹऔΓࠐ·ͳ͍ • GitHub ͷ Branch protection rulesΛ͔ͭ͏ ඞਢͷCIδϣϒΛબͿ $*͕௨Βͳ͍ͱϚʔδͰ͖ͳ͍ʂ

Slide 89

Slide 89 text

·ͱΊ • ੩తղੳͷCIಋೖͰϨΨγʔʹཱͪ޲͔͓͏ʂ • ϑΟʔυόοΫϧʔϓΛҙࣝͯ͠ɺCIΛಋೖ͠Α͏ʂ • baselineͰ੩తղੳͷϝϯςφϯείετΛԼ͛Α͏ʂ • খٕΛͨ͘͞Μ࢖ͬͯɺ੩తղੳͷମݧΛΑ͘͠Α͏ʂ