Slide 1

Slide 1 text

!LHNZTIJO %.."OESPJEษڧձ ৽نνʔϜͰ৽ن։ൃΛ࢝ΊΔ࣌ʹ΍Δ͜ͱ

Slide 2

Slide 2 text

X © DMM.com ࣗݾ঺հ

Slide 3

Slide 3 text

X © DMM.com ࣗݾ঺հ w LHNZTIJOఝٶʢ͗͘Έ΍ʣ w "OESPJEΤϯδχΞ w $50ࣨॴଐ

Slide 4

Slide 4 text

X © DMM.com ಥવͰ͕͢ɺ ৽نҊ݅ͷ։ൃΛਐΊ͍ͯ͘தͰ ͜Μͳܦݧ͋Γ·ͤΜ͔ʁ

Slide 5

Slide 5 text

X © DMM.com $*Λಋೖ͍ͯ͠ͳ͍ w ͦ΋ͦ΋#VJME௨ͬͯͳ͍ w NBTUFS΋#VJME͕௨ͬͯͳ͍ w ͍͔ͭΒ௨ͬͯͳ͍ͷ͔Θ͔Βͳ͍ w νʔϜ͕ΪεΪε͢Δ

Slide 6

Slide 6 text

X © DMM.com -JOUΛಋೖ͍ͯ͠ͳ͍ w Πϯσϯτ͕ w ϨϏϡʔ಺༰ͷ΄ͱΜͲ͕ʮϑΥʔϚοτ͔͚ͯʯͰࡁΉ w νʔϜ͕ΪεΪε͢Δ

Slide 7

Slide 7 text

X © DMM.com $%Λಋೖ͍ͯ͠ͳ͍ w ඇ։ൃऀҎ֎ͷਓ͕ɺ։ൃதͷΞϓϦΛ͞ΘΕͳͯ͘ෆ҆ w ඇ։ൃऀͷਓͨͪ޲͚ʹɺQSPEʹ͍ۙ΍ͭΛ৮Ζ͏ͱͯ͠΋Βͬͯ QSPHVSBEʹ͸·Δ w QSPHVBSE͸௨͚ͬͨͲɺHTPO͋ͨΓͷLFFQOBNFTͷઃఆΛ๨Εͯɺ "1*ίʔϧ͕શ໓͢Δ w νʔϜ͕ΪεΪε͢Δ

Slide 8

Slide 8 text

X © DMM.com ςετΛॻ͍ͯͳ͍ w ϦϑΝΫλͰ͖ͳ͍ w มߋޙͷίʔυͱมߋલͷίʔυ͕ಉ͡ಈ͖Λ͢Δͱ͍͏อূ͕ Ͱ͖ͳ͍ w Ͳ͏͍͏ಈ࡞Λਖ਼ͱͨ͠ϩδοΫͳͷ͔Θ͔Βͳ͍ͷͰɺϨϏϡʔ͸ͳ Μͱͳ͘େৎ෉΍ΖͰBQQSPWF w ͦ΋ͦ΋΄΅΄΅ಈ͍ͯͳ͍ʢಈ࡞֬ೝ͞Εͯͳ͍ʣ w νʔϜ͕ΪεΪε͢Δ

Slide 9

Slide 9 text

X © DMM.com ઃܭํ਑ΛܾΊͯͳ͍ w ਓʹΑͬͯॻ͖ํ͕શ͘ҧ͏ w ʮ๻ͷॻ͍ͯΔ7JFX.PEFM͸999͍ͬͯ͏੹຿͚ͩͲɺ͋ͳͨͷ ॻ͍ͯΔ7JFX.PEFM͸ͳΜ͔ҧ͍·ͤΜ͔ʁʯ w νʔϜ͕ΪεΪε͢Δ w ʮΈΜͳ͸.71͚ͩͲɺ๻͸.77.Ͱॻ͖·͢Ͷʯ

Slide 10

Slide 10 text

X © DMM.com ৽ن։ൃ࣌ʹɺ·ͣ͸։ൃपΓͷ੔උΛ͢Δ͜ͱ͕ॏཁ w ෺ʹΑͬͯ͸ɺ్த͔Βͷಋೖ͕೉͍͠΋ͷɺίετ͕େ͖͍΋ͷ͕͋ Δ w ઃܭํ਑ w ಛʹ৽نνʔϜͰ͸ॏཁ w ςετํ਑ w ஌Βͳ͍ਓɺ஌ͬͯΔ͚Ͳಇ͍ͨ͜ͱͳ͍ਓͱɺԿ΋޻෉΋ͳ͘ େ͖ͳ΋ͷΛ࡞Γ্͛Δͷ͸ࠔ೉ɻԿ͔͠Βͷτϥϒϧ͸͋Γ͑ ΔͷͰɺ͋Β͔͡Ί૝ఆͰ͖Δ΋ͷΛରॲ͓ͯ͜͠͏ɻ

Slide 11

Slide 11 text

X © DMM.com ৽ن։ൃΛ࢝ΊΔͱ͖༻ νΣοΫϦετ

Slide 12

Slide 12 text

X © DMM.com νΣοΫϦετ <>ϑΥʔϚολ <>$* <>$% <>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷ੔ཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 13

Slide 13 text

X © DMM.com ࣮ࡍʹ΍͖ͬͯ·͠ΐ͏

Slide 14

Slide 14 text

X © DMM.com IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM ελΠϧɾϑΥʔϚοτͷઃఆ ΍Δ͜ͱ "4ͷઃఆ͔ΒɺͦΕͧΕͷελΠϧΛઃఆ͢Δ FEJUPSDPOpHΛઃఆ͢Δ ϑΥʔϚολҎ֎ͷίʔσΟϯάن໿͸EPDVNFOUͳͲʹ·ͱΊ͓ͯ͘ TIBQF΍TFMFDUPSͳͲͷϑΝΠϧ໊ͷ໋໊نଇͳͲ

Slide 15

Slide 15 text

X © DMM.com <ࣗ෼ͷ৔߹>ελΠϧɾϑΥʔϚοτͷઃఆ 1SFGFSFODFT&EJUPS$PEF4UZMF͔Β+BWB,PUMJO9.-ͦΕͧΕΛ ઃఆͯ͠ɺԼهϑΝΠϧΛίϛοτ

Slide 16

Slide 16 text

X © DMM.com <ࣗ෼ͷ৔߹>ελΠϧɾϑΥʔϚοτͷઃఆ FEJUPSDPOpH΋ઃఆ͠Α͏ root = true [*] insert_final_newline=true indent_size = 2 continuation_indent_size = 2 IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM

Slide 17

Slide 17 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ <>$* <>$% <>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷ੔ཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 18

Slide 18 text

X © DMM.com HJUIVCͰϓϩδΣΫτΛ࡞ͬͨΒɺ·ͣਅͬઌʹಋೖ͢΂͠ w DJSDMFDJ w 5SBWJT$* w #JUSJTF w +FOLJOT $*ͷಋೖ

Slide 19

Slide 19 text

X © DMM.com IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM <ࣗ෼ͷ৔߹>$*ͷಋೖ DJSDMFDJΛ࢖༻ ͻͱ·ͣMJOUͱUFTU͚ͩ૸Β͓ͤͯ͘ ./gradlew lint test DJSDMFDJCBEHF΋ઃఆ͓ͯ͘͠

Slide 20

Slide 20 text

X © DMM.com <ࣗ෼ͷ৔߹>$*ͷಋೖ HJUIVCͷઃఆ΋๨Εͣʹ

Slide 21

Slide 21 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ $* <>$% <>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷ੔ཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 22

Slide 22 text

X © DMM.com ඇ։ൃऀͷํʹ޲͚ͯɺಛʹσβΠφʔ͞Μ͕৮ΕΔΑ͏ʹॳΊ͔Β༻ҙ ͓ͯ͘͠ͷ͕٢ɻ πʔϧ͸༧ࢉ΍࢖͍উखͰબΜͰ͍ͩ͘͞ɻ EFQMPZHBUF 'BCSJDCFUB ʢࣗ࡞ʣ $%ͷಋೖ

Slide 23

Slide 23 text

X © DMM.com <ࣗ෼ͷ৔߹>$%ͷಋೖ

Slide 24

Slide 24 text

X © DMM.com <ࣗ෼ͷ৔߹>$%ͷಋೖ - run: | GIT_HASH=$(git rev-parse --short HEAD) GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) curl \ -F "token=$DEPLOY_GATE_API_KEY" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git:$GIT_HASH" \ -F "distribution_name=$GIT_BRANCH" \ https://deploygate.com/api/users/kgmyshin/apps IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEDPNNJUGGEGFBEGCDEBED $*ʹઃఆ

Slide 25

Slide 25 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ $* $% <>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷ੔ཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 26

Slide 26 text

X © DMM.com -JOU ΍Δ͜ͱ BOESPJEMJOUͷϧʔϧͷݟ௚͠ LUMJOUPSEFUFLUͷಋೖ

Slide 27

Slide 27 text

X © DMM.com <ࣗ෼ͷ৔߹>-JOUͷઃఆBOESPJEMJOU ઃఆϑΝΠϧΛͭ͘Δ

Slide 28

Slide 28 text

X © DMM.com android { ... lintOptions { ... lintConfig file("${rootDir.absolutePath}/lint/lint.xml") } } HSBMEFʹઃఆ͢Δɻ <ࣗ෼ͷ৔߹>-JOUͷઃఆBOESPJEMJOU

Slide 29

Slide 29 text

X © DMM.com <ࣗ෼ͷ৔߹>-JOUͷઃఆLUMJOU buildscript { repositories { … maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "org.jmailen.gradle:kotlinter-gradle:1.22.0" … } } 5PQMFWFMͷCVJMEHSBMEFʹઃఆ͢Δɻ ˞LPUMJOUFSHSBEMFΛ࢖ͬͯ·͕͢ɺଞͷ෺Ͱ΋͍͍Ͱ͢ɻ·ͨLUMJOU͡Όͳͯ͘΋EFUFLUͰ΋0,Ͱ͢

Slide 30

Slide 30 text

X © DMM.com <ࣗ෼ͷ৔߹>-JOUͷઃఆLUMJOU NPEVMFͷCVJMEHSBMEFʹઃఆ͢Δɻ apply plugin: "org.jmailen.kotlinter" kotlinter { ignoreFailures = true reporters = ['checkstyle', 'plain'] indentSize = 2 continuationIndentSize = 2 }

Slide 31

Slide 31 text

X © DMM.com <ࣗ෼ͷ৔߹>-JOUͷઃఆ ./gradlew lint lintKotlin $*Ͱ࣍ͷίϚϯυΛୟ͘Α͏ʹͯ͠ɺઃఆ׬ྃ IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM

Slide 32

Slide 32 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ $* $% -JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷ੔ཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 33

Slide 33 text

X © DMM.com HSBEMFपΓͷ੔ཧ ϚϧνϞδϡʔϧͳϓϩδΣΫτͰ΍Δ৔߹͸͍Δ͚ͲɺγϯάϧϞδϡʔ ϧͳϓϩδΣΫτͰ͸ෆཁ͔΋ɻ ΍Δ͜ͱ όʔδϣϯͳͲΛҰݩ؅ཧ

Slide 34

Slide 34 text

X © DMM.com <ࣗ෼ͷ৔߹>HSBEMFपΓͷ੔ཧ ext.kotlin_version = '1.3.21' ext.versions = [ compileSdk: 28, minSdk : 21, targetSdk : 28, code : 1, name : "0.9.0" ] ext.deps = [ kotlin : [ core : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", reflect: "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" ], 7FSTJPOܥΛ·ͱΊͯ͠·͏

Slide 35

Slide 35 text

X © DMM.com <ࣗ෼ͷ৔߹>HSBEMFपΓͷ੔ཧ android { compileSdkVersion versions.compileSdk defaultConfig { minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk versionCode versions.code versionName versions.name ... } ... } dependencies { implementation deps.kotlin.core implementation deps.androidx.appcompat implementation deps.androidx.constraintlayout implementation deps.androidx.lifecycle implementation deps.androidx.recyclerview ... ͜Μͳײ͡Ͱ͔͚Δ

Slide 36

Slide 36 text

X © DMM.com <ࣗ෼ͷ৔߹>HSBEMFपΓͷ੔ཧ apply plugin: 'com.android.library' apply from: "${rootDir.absolutePath}/modules/android_partial.gradle" dependencies { … } apply from: "${rootDir.absolutePath}/modules/ktlint_partial.gradle" BOESPJEͰͷઃఆ΍ɺLUMJOUपΓ΋·ͱΊͯ͠·͑͹ɺ ֤ϞδϡʔϧͷCVJMEHSBEMFΛ͜Μͳײ͡ʹ͢Δ͜ͱ΋Ͱ͖Δ IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM

Slide 37

Slide 37 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ $* $% -JOU BOESPJEMJOU LUMJOUPSEFUFLU HSBEMFपΓͷ੔ཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 38

Slide 38 text

X © DMM.com %BOHFSͷઃఆ $PQZSJHIU D 0SUB5IFSPY 3FMFBTFEVOEFSUIF.*5MJDFOTF IUUQTHJUIVCDPNEBOHFSEFTJHOCMPCNBTUFS-*$&/4& IUUQTEBOHFSTZTUFNTHVJEFTHFUUJOH@TUBSUFEIUNM ΍Δ͜ͱ͸ɺHFUUJOH@TUBSUFEϖʔδΛݟͳ͕ΒηοτΞοϓ͢Δ͚ͩ

Slide 39

Slide 39 text

X © DMM.com %BOHFSͷઃఆ # Warn when there is a big PR warn("a large PR") if git.lines_of_code > 1000 ### lint ### Dir.glob("**/lint-results.xml").each { |report| android_lint.filtering = true android_lint.report_file = report.to_s android_lint.lint(inline_mode: true) } զ͕Ոͷ%BOHFSpMFʢͷҰ෦ʣɻ ϚϧνϞδϡʔϧʹΑΔରԠ͕ೖΓ·͢ɻ IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM

Slide 40

Slide 40 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ $* $% -JOU BOESPJEMJOU LUMJOUPSEFUFLU HSBEMFपΓͷ੔ཧ %BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 41

Slide 41 text

X © DMM.com ϝοηʔδςϯϓϨʔτ ΍Δ͜ͱ HJUIVCܥͷςϯϓϨʔτΛ༻ҙ͢Δ PQU ίϛοτϝοηʔδͷςϯϓϨʔτΛ༻ҙͯ͠΋͍͍͔΋

Slide 42

Slide 42 text

X © DMM.com ϝοηʔδςϯϓϨʔτ IUUQTIFMQHJUIVCDPNFOBSUJDMFTBCPVUJTTVFBOEQVMMSFRVFTUUFNQMBUFT

Slide 43

Slide 43 text

X © DMM.com ίϛοτϝοηʔδͷ౷Ұ

Slide 44

Slide 44 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ $* $% -JOU BOESPJEMJOU LUMJOUPSEFUFLU HSBEMFपΓͷ੔ཧ %BOHFS ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 45

Slide 45 text

X © DMM.com ઃܭํ਑ ΍Δ͜ͱ ઃܭํ਑ΛΈΜͳͰڞ༗Ͱ͖ΔΑ͏EPDVNFOUͳͲʹॻ͖ى͜͢

Slide 46

Slide 46 text

X © DMM.com ઃܭํ਑

Slide 47

Slide 47 text

X © DMM.com ઃܭํ਑

Slide 48

Slide 48 text

X © DMM.com ઃܭํ਑

Slide 49

Slide 49 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ $* $% -JOU BOESPJEMJOU LUMJOUPSEFUFLU HSBEMFपΓͷ੔ཧ %BOHFS ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 50

Slide 50 text

X © DMM.com ςετํ਑ ΍Δ͜ͱ ԼهΛEPDVNFOUʹى͜͢ ͲͷϑϨʔϜϫʔΫΛ࢖͏ͷ͔ Ͳ͜ʹͲΜͳςετΛॻ͘ͷ͔ ͦͷςετ͸ԿΛอূ͢Δͷ͔ ॻ͖ํ͕Θ͔Δαϯϓϧ

Slide 51

Slide 51 text

X © DMM.com ςετํ਑

Slide 52

Slide 52 text

X © DMM.com νΣοΫϦετ ϑΥʔϚολ $* $% -JOU BOESPJEMJOU LUMJOUPSEFUFLU HSBEMFपΓͷ੔ཧ %BOHFS ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ ઃܭํ਑ ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 53

Slide 53 text

X © DMM.com ։ൃϑϩʔ ΍Δ͜ͱ HJUqPX HJUIVCqPX TQSJOUͷྲྀΕΛͲ͏࢖͏ʁ

Slide 54

Slide 54 text

X © DMM.com ։ൃϑϩʔ TQSJOUͷྲྀΕ ϓϥϯχϯάͷ೔ ϓϥϯχϯά͕ऴΘͬͨΒͦͷ··ू·ͬͯશͯͷλεΫͷΫϥεਤ Λख෼͚ͯ͠ॻ͘ 6TF$BTF͚ͩγʔέϯεਤ΋ॻ͘ ͦΕҎ֎ͷ೔͸ΫϥεਤɺγʔέϯεਤΛݩʹΨϦΨϦίʔσΟϯά͢ Δ͚ͩ

Slide 55

Slide 55 text

X © DMM.com ։ൃϑϩʔ UBTLͷྲྀΕʢઃܭํ਑͕ೃછΉ·Ͱ͸ࡉ͔͘΍ͬͯͨʣ ػೳ࣮૷ϒϥϯν࡞੒ ೿ੜͤͯ͞EPNBJO࣮૷Ͱ13ͭ JOGSB࣮૷Ͱ13ͭ 7JFX.PEFM -JWF%BUBΛ࣮૷ͯ͠13ͭ 'SBHNFOUʢओʹσβΠϯʣΛ࣮૷ͯ͠13ͭ 6TF$BTFΛ࣮૷ͯ͠13̍ͭ ࠷ޙʹ%*Ͱܨ͛ͯಈ࡞֬ೝ·Ͱ΍ͬͯ13ͭ

Slide 56

Slide 56 text

X © DMM.com ·ͱΊ

Slide 57

Slide 57 text

X © DMM.com νΣοΫϦετ <>ϑΥʔϚολ <>$* <>$% <>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷ੔ཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ਑ <>ςετํ਑ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ

Slide 58

Slide 58 text

X © DMM.com ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ ଞʹ΋͜͏͍͏ͷ΍ͬͨΒ͍͍ͱࢥ͏ʂͬͯͷ͕͋Ε͹ɺͥͻڭ͑ͯ͘ ͍ͩ͞ʂ