Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゆめみの iOS プロジェクトが
取り入れてる自動化の試み / What YUMEMI did to try to automate the process of iOS project development

Elvis Shi
August 20, 2020

ゆめみの iOS プロジェクトが
取り入れてる自動化の試み / What YUMEMI did to try to automate the process of iOS project development

Elvis Shi

August 20, 2020
Tweet

More Decks by Elvis Shi

Other Decks in Programming

Transcript

  1. ΏΊΈͷJ04ϓϩδΣΫτ͕
    औΓೖΕͯΔࣗಈԽͷࢼΈ
    f o r : 6 . & . * T X J G U

    View Slide

  2. }
    var employedBy = "YUMEMI Inc."
    var job = "iOS Tech Lead"
    var favoriteLanguage = "Swift"
    var twitter = "@lovee"
    var qiita = "lovee"
    var github = "el-hoshino"
    var additionalInfo = """
    ࣗ୐ʹ௕ډ͗ͯ͢͠ମ͕ͩΔ͍…
    """
    final class Me: Developable, Talkable {

    View Slide

  3. ࣗಈԽΛܭΔϞνϕʔγϣϯ
    w ຊମίʔυҎ֎ͷ෦෼ʹແବͳ࿑ྗΛ͔͚ͳͯ͘ࡁΉ
    w ୯७Ͱॏෳͳ࡞ۀΛػցʹ೚ͤͯετϨεΛԼ͛Δ
    w ଐਓతͳ࡞ۀΛݮΒͯ͠୭Ͱ΋ࢀՃ͠΍͘͢Ͱ͖Δ
    w ࠷ऴతʹϓϩδΣΫτ඼্࣭͕͕Δ

    View Slide

  4. ΏΊΈͰ͸ࣗಈԽͷͨΊͷ༷ʑͳ؀ڥߏஙܥϑΝΠϧΛڞ௨Խ͍ͯ͠Δ

    View Slide

  5. ؀ڥߏங ϓϧϦΫ σϓϩΠ

    View Slide

  6. ؀ڥߏங ϓϧϦΫ σϓϩΠ
    w CPPUTUSBQTI w [email protected]&26&[email protected]
    &.1-"5&NE
    w CJUSJTFZNM
    w %BOHFSpMFTXJGU
    w CJUSJTFZNM
    w [email protected]

    View Slide

  7. CPPUTUSBQTIʢʣ
    install_prebuild_libraries() {
    # Gem BundleɺHomebrew ͱ Mint ΛඞཁʹԠͯ͡Πϯετʔϧ
    echo "Install Gems, Brews and Mints"
    if [ -e Gemfile ]; then
    bundle install
    fi
    if [ -e Brewfile ]; then
    brew bundle
    fi
    if [ -e Mintfile ]; then
    mint bootstrap
    fi
    }

    View Slide

  8. CPPUTUSBQTIʢʣ
    generate_xcode_project() {
    # XcodeGen Λಋೖͯ͠Δ৔߹͸ɺXcode ϓϩδΣΫτϑΝΠϧΛੜ੒
    echo "Generate .xcodeproj file"
    if [ -e project.yml ]; then
    mint run xcodegen
    fi
    }

    View Slide

  9. CPPUTUSBQTIʢʣ
    install_embeded_libraries() {
    # ඞཁʹԠͯ͡ CocoaPodsɺCarthage ͱ SwiftPM ͷϥΠϒϥϦʔΛಋೖ
    echo "Install dependencies via CocoaPods, Carthage and SwiftPM"
    if [ -e Podfile ]; then
    bundle exec pod install --repo-update
    fi
    if [ -e Cartfile ]; then
    carthage bootstrap --use-ssh --no-use-binaries --cache-
    builds --platform ios
    fi
    if [ $(find . -maxdepth 4 -name swiftpm | wc -l) -gt 0 ]; then
    workspace_file="$(ls | grep '.*\.xcworkspace$')"
    scheme="$(xcodebuild -workspace $workspace_file -list | sed
    -n -e '/Schemes:/,$p' | sed -n -e 2p | xargs echo)"
    xcodebuild -resolvePackageDependencies -workspace
    "$workspace_file" -scheme "$scheme"
    fi
    }

    View Slide

  10. CPPUTUSBQTIʢಋೖ݁Ռʣ
    w λʔϛφϧͰ./bootstrap.shίϚϯυͰҰൃͰ
    ؀ڥߏங͕Ͱ͖Δ
    w #VOEMFSͷόʔδϣϯ΍ɺ$PDPB1PET$BSUIBHF
    ౳ͷύοέʔδ؅ཧͷ༗ແΛҙࣝ͠ͳͯ͘ࡁΉ
    w ٸʹϓϩδΣΫτʹࢀՃͤ͞ΒΕͯ΋ɺ؀ڥߏஙʹ
    ೰·͞Εͣʹ։ൃʹऔΓֻ͔ΕΔ

    View Slide

  11. [email protected]&26&[email protected]&.1-"5&NEʢʣ
    ## ֓ཁ

    ## ϨϏϡʔ؍఺

    ## ϨϏϡʔϨϕϧ

    - ~~Lv0: ·ͬͨ͘ݟͳ͍ͰAccept͢Δ~~
    - ~~Lv1: ͺͬͱΈͯҧ࿨ײ͕ͳ͍͔νΣοΫͯ͠Accept͢Δ~~
    - ~~Lv2: ࢓༷Ϩϕϧ·Ͱཧղͯ͠ɺ࢓༷௨Γʹಈ͔͋͘Δఔ౓ݕূͯ͠Accept͢Δ~~
    - ~~Lv3: ࣮ࡍʹ؀ڥͰಈ࡞֬ೝͨ͠͏͑ͰAccept͢Δ~~

    View Slide

  12. [email protected]&26&[email protected]&.1-"5&NEʢʣ
    ## ը໘ઃܭॻ΁ͷϦϯΫ

    ## σβΠϯΨΠυ΁ͷϦϯΫ

    ## API࢓༷ॻ΁ͷϦϯΫ

    View Slide

  13. [email protected]&26&[email protected]&.1-"5&NEʢʣ
    ## εΫϦʔϯγϣοτ

    | before | after |
    |--------|-------|
    | XXXXXX | XXXXX |
    ## උߟ

    View Slide

  14. [email protected]&26&[email protected]&.1-"5&NEʢಋೖ݁Ռʣ
    w 13ग़͢ͱ͖ʹࣗಈతʹઆ໌จ͕࡞੒͞ΕΔͨΊɺ
    ΤϯδχΞͱͯ͠ରԠ͠΍͍͢
    w ඞཁͳ߲໨ͱͦΕʹ͍ͭͯͷ؆୯ͳઆ໌͕ςϯϓϨʹ
    ͋ΔͨΊɺࣄ߲ͷهೖ࿙Ε͕ൃੜ͠ʹ͍͘
    w ૢ࡞ಈըͷ(JGԽͳͲͷΑ͏ͳൺֱతʹෳࡶͳૢ࡞͕
    ςϯϓϨͷίϝϯτʹखॱॻ͔Ε͍ͯΔͨΊɺ୭Ͱ΋
    ͙͢ʹରԠͰ͖Δ

    View Slide

  15. #JUSJTFʢ֓ཁʣ
    IUUQTRJJUBDPNMPWFFJUFNTFBFGC

    View Slide

  16. #JUSJTFʢϓϧϦΫӡ༻ํ਑ʣ
    w EFWFMPQNBTUFSϒϥϯν΁ͷ13͕͋ͬͨΒɿ
    w 9DPEFςετΛ࣮ߦ
    w %BOHFSΛ࣮ߦ
    w ্ه݁ՌΛݩʹ13ʹϑΟʔυόοΫ

    View Slide

  17. #JUSJTFʢϓϧϦΫಋೖ݁Ռʣ
    w 13τϦΨʔʹΑΓ8PSLqPX͕ࣗಈతʹಈͨ͘Ίɺ
    13Λग़͚ͩ͢Ͱे෼Ͱ͋Γແବͳ࡞ۀ͕ൃੜ͠ͳ͍
    w ্هʹΑΓɺίʔυͷෆඋʹΑΔϓϩάϥϜͷόάΛ
    େ෯ʹ࡟ݮͰ͖ɺίʔυ඼࣭޲্ʹܨ͕ͬͨ

    View Slide

  18. %BOHFS4XJGUʢ֓ཁʣ
    IUUQTRJJUBDPNMPWFFJUFNTBEBFC

    View Slide

  19. %BOHFS4XJGUʢ֓ཁʣ
    IUUQTTQFBLFSEFDLDPNMPWFFQBUIUPJNQPSUEBOHFSTXJGU

    View Slide

  20. %BOHFS4XJGUʢӡ༻ํ਑ʣ
    w 13ͷIFBEͱCBTF͕ਖ਼͍͔͠Ͳ͏͔ΛνΣοΫ
    w มߋྔ΍ඞཁͳमਖ਼͕͋Δ͔Ͳ͏͔ΛνΣοΫ
    w 4XJGU-JOUͷ࣮ߦ݁ՌΛूܭ
    w 9DPEFͷ#VJME4VNNBSZΛूܭ
    w ςετΧόϨοδΛूܭ
    Ϗϧυϫʔχϯά΋
    ڭ͑ͯ͘ΕΔ!

    View Slide

  21. %BOHFS4XJGUʢಋೖ݁Ռʣ
    w ػցతͰݕग़Ͱ͖Δ໰୊఺͕૿͑ɺϨϏϡΞʔͷෛ୲
    ͕ݮͬͨ
    w ϨϏϡΞʔ͕ൺֱతʹΑΓຊ࣭ͷίʔυ΍ઃܭʹઐ೦
    Ͱ͖ͨ

    View Slide

  22. #JUSJTFʢ֓ཁʣ
    IUUQTRJJUBDPNMPWFFJUFNTFBFGC

    View Slide

  23. #JUSJTFʢσϓϩΠӡ༻ํ਑ʣ
    w #JUSJTFʹϏϧυ൪߸ͷมߋΛ೚ͤΔ
    w EFWFMPQϒϥϯν΁ͷ13͕͋ͬͨΒɿ
    w ։ൃऀ޲͚ʹ%FW؀ڥΛ#JUSJTFʹσϓϩΠ
    w EFWFMPQϒϥϯν͕.FSHF͞ΕͨΒɿ
    w ΫϥΠΞϯτ޲͚ʹ4UH؀ڥΛ#JUSJTFʹσϓϩΠ
    w NBTUFSϒϥϯν͕.FSHF͞ΕͨΒɿ
    w Ϣʔβ޲͚ʹຊ൪؀ڥΛ"QQ4UPSFʹσϓϩΠ
    w σϓϩΠ݁ՌΛ4MBDLʹ23ίʔυ෇͖Ͱ௨஌
    ɿ13ͷ৔߹͸ɺ13ͷϖʔδʹ΋σϓϩΠ݁ՌΛ23ίʔυ෇͖ͰίϝϯτΛೖΕΔ

    View Slide

  24. #JUSJTFʢσϓϩΠಋೖ݁Ռʣ
    w ඞཁͳλΠϛϯάͰඞཁͳλʔήοτʹϏϧυΛॻ͖
    ग़ͤɺಈ࡞֬ೝͷͨΊͷલ४උͷख͕ؒল͚ͨ
    w 23ίʔυΛεΩϟϯ͢Δ͚ͩͰΠϯετʔϧͰ͖Δ
    ͨΊɺಈ࡞֬ೝͷͨΊͷखؒ΋ඇৗʹ௿͍
    w "QQ4UPSF$POOFDUʹ΋௚઀*1"Λ্͛ΒΕΔͨΊɺ
    ৹ࠪʹग़͢खؒ΋ଟগվળͰ͖ͨ

    View Slide

  25. [email protected]ʢʣ
    development_release_action="development"
    development_bundle_id="DEVELOPMENT_BUNDLE_ID"
    development_team_id="DEVELOPMENT_TEAM_ID"
    staging_release_action="adhoc"
    staging_bundle_id="STAGING_BUNDLE_ID"
    staging_team_id="STAGING_TEAM_ID"
    production_release_action="appstore"
    production_bundle_id="PRODUCTION_BUNDLE_ID"
    production_team_id="PRODUCTION_TEAM_ID"

    View Slide

  26. [email protected]ʢʣ
    bootstrap() {
    fastlane match $development_release_action -a $development_bundle_id -b
    $development_team_id --git_branch $development_team_id --readonly
    fastlane match $staging_release_action -a $staging_bundle_id -b
    $staging_team_id --git_branch $staging_team_id --readonly
    fastlane match $production_release_action -a $production_bundle_id -b
    $production_team_id --git_branch $production_team_id --readonly
    }
    update() {
    echo "Please enter your Apple Developer Account ID to update the
    certificates:"
    read developer_id
    fastlane match $development_release_action -a $development_bundle_id -b
    $development_team_id -u $developer_id --git_branch $development_team_id
    fastlane match $staging_release_action -a $staging_bundle_id -b
    $staging_team_id -u $developer_id --git_branch $staging_team_id
    fastlane match $production_release_action -a $production_bundle_id -b
    $production_team_id -u $developer_id --git_branch $production_team_id
    }
    ౰વͳ͕ΒɺGBTUMBOFNBUDIΛར༻͍ͯ͠ΔͨΊɺূ໌ॻΛอ؅͢ΔHJUϦϙͷ63-ͳͲͷҰ෦ઃఆʹ.BUDIpMF΋ඞཁ

    View Slide

  27. [email protected]ʢʣ
    while getopts :-: OPT; do
    case $OPT in
    "-" )
    case $OPTARG in
    "update" )
    SHOULD_UPDATE="TRUE"
    ;;
    esac
    ;;
    esac
    done
    if ! type fastlane &> /dev/null; then
    echo "Fastlane is not installed. Please install Fastlane first"
    exit 1
    fi
    if [ "$SHOULD_UPDATE" = "TRUE" ]; then
    update
    else
    bootstrap
    fi

    View Slide

  28. [email protected]ʢಋೖ݁Ռʣ
    w λʔϛφϧͰ./release_codesign.shίϚϯυͰ
    ҰൃͰσϓϩΠ༻ϦϦʔεূ໌ॻ͕औಘͰ͖Δ
    w #JUSJTF͚ͩͰͳ͘ɺΤϯδχΞͰ΋౰વར༻Մೳ
    w ূ໌ॻͷߋ৽͕ඞཁͳͱ͖ʹɺݖݶ͑͋͞Ε͹୭Ͱ΋
    ./release_codesign.sh --updateͰ͙͢ߋ৽
    Ͱ͖ΔͨΊɺߋ৽͢Δख͚ؒͩͰͳ͘ɺ৽͍͠ূ໌ॻ
    Λ#JUSJTFʹ্͛Δखؒ΋ল͚Δ

    View Slide

  29. ࠓޙͷ໨ඪɿ
    ৽نϓϩδΣΫτ࡞੒ͷࣗಈԽ!

    View Slide

  30. ࢀߟࢿྉ
    w IUUQTTIFMMTDSJQUTVOPOFNFUVUPSJBMIUNM
    w IUUQTRJJUBDPNLBUTVLJJJUFNTCGFFBFF
    w IUUQTEPDTHJUIVCDPNKBHJUIVCCVJMEJOHBTUSPOHDPNNVOJUZ
    DPOpHVSJOHJTTVFUFNQMBUFTGPSZPVSSFQPTJUPSZ
    w IUUQTEFWDFOUFSCJUSJTFJP
    w IUUQTRJJUBDPNMPWFFJUFNTFBFGC
    w IUUQTEBOHFSTZTUFNTTXJGU
    w IUUQTRJJUBDPNMPWFFJUFNTBEBFC
    w IUUQTTQFBLFSEFDLDPNMPWFFQBUIUPJNQPSUEBOHFSTXJGU

    View Slide