Slide 1

Slide 1 text

GitHub Actions CI Yoshihiro Wada / @e10dokup 2023/04/29 @ DroidKaigi.collect { #2@Fukuoka }

Slide 2

Slide 2 text

{ “id”: “@e10dokup”, “name”: “Yoshihiro Wada”, “affiliations”: [ “CyberAgent Inc, / Ameba” ], “interested”: [ “camera”, “gadget”, “driving”, “motorsports” ] }

Slide 3

Slide 3 text

GitHub Actions CI 3

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

APK AAB AAB APK 
 Google Play Play App Signing Android 6

Slide 7

Slide 7 text

7 Android Google 3.0

Slide 8

Slide 8 text

Play Store / 8 Android Google 3.0

Slide 9

Slide 9 text

Android Studio Android SDK PC 9

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

keystore jks 1 
 
 11 keystore

Slide 12

Slide 12 text

build.gradle signingCon fi g 1 12 signingConfigs { val releaseKeystore = file("release.keystore") if (releaseKeystore.exists()) { getByName("release") { storeFile = releaseKeystore storePassword = "my keystore password" keyAlias = "release" keyPassword = "my release key password" } } } buildTypes { getByName("release") { signingConfig = signingConfigs.getByName("release") } }

Slide 13

Slide 13 text

apksigner/jarsigner apksigner Android SDK Build Tools ANDROID_HOME 2 13 // apkΛϦϦʔε伴Ͱॺ໊͢Δ࣌ apksigner sign --ks release.keystore unsigned.apk // aabΛΞοϓϩʔυ伴Ͱॺ໊͢Δ࣌ jarsigner -verbose \ -sigalg SHA256withRSA \ -digestalg SHA-256 \ -keystore upload.keystore \ unsigned.aab upload

Slide 14

Slide 14 text

GitHub Actions

Slide 15

Slide 15 text

GitHub Actions secrets GitHub Actions APK AAB 15

Slide 16

Slide 16 text

Base64 secrets 1 16 openssl base64 < release.keystore | tr -d '\n' | tee keystore_encoded.txt - name: Decode Keystore id: decode_keystore uses: timheuer/base64-to-file@v1 with: fileName: 'release.keystore' encodedString: ${{ secrets.KEYSTORE }}

Slide 17

Slide 17 text

pem Base64 cert.pem /privatekey.pem secrets 2 1 17 # keystore͔Βp12ΩʔετΞͱͯ͠伴ΛऔΓग़͢ 
 keytool -importkeystore -srckeystore release.keystore -srcstoretype JKS \ -srcalias hogehoge -srcstorepass hogehoge -srckeypass hogehoge \ -destkeystore keystore.p12 -deststoretype PKCS12 -deststorepass hogehoge # p12ΩʔετΞ͔ΒpemܗࣜͰূ໌ॻΛऔΓग़͢ 
 openssl pkcs12 -in keystore.p12 -out cert.pem # p12ΩʔετΞ͔ΒpemܗࣜͰൿີ伴ΛऔΓग़͢ 
 openssl pkcs12 -in keystore.p12 -nodes -nocerts -out privatekey.pem

Slide 18

Slide 18 text

pem keystore CI CI 
 OK 2 2 18 # p12ΩʔετΞΛੜ੒͢Δ openssl pkcs12 -export -in cert.pem -name hogehoge -inkey privatekey.pem \ -passin pass:hogehoge -out keystore.p12 -passout pass:hogehoge # p12ΩʔετΞ͔ΒkeystoreʢjksϑΝΠϧʣʹม׵͢Δ༷ࢠ 
 keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 \ -srcstorepass hogehoge -destkeystore keystore.jks -deststoretype JKS \ -deststorepass hogehoge -destkeypass hogehoge -destalias hogehoge

Slide 19

Slide 19 text

secrets pem pem 2 3 19 - name: echo key pem files env: CERT_PEM: ${{ secrets.CERT_PEM }} PRIVATE_KEY_PEM: ${{ secrets.PRIVATE_KEY_PEM }} run: | echo “%CERT_PEM%“ > cert.pem echo “%CERT_PRIVATE_KEY%” > privatekey.pem - name: echo key pem files env: KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} run: | ʻP18ͷ಺༰Λ͜͜ʹຒΊΔʼ

Slide 20

Slide 20 text

build.gradle signingCon fi g 1) 20 signingConfigs { val releaseKeystore = file("release.keystore") if (releaseKeystore.exists()) { getByName("release") { storeFile = releaseKeystore storePassword = System.getenv('KEYSTORE_PASSWORD') keyAlias = System.getenv('KEY_ALIAS') keyPassword = System.getenv('KEY_PASSWORD') } } }

Slide 21

Slide 21 text

GitHub Actions 2) 21 # APKΛ࡞Δ࣌ - name: Build release apk run: ./gradlew app:assembleRelease env: KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} # AABΛ࡞Δ࣌ - name: Build release app-bundle run: ./gradlew app:bundleRelease env: KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}

Slide 22

Slide 22 text


 Play App Signing AAB Play App Signing 22