ReactNativeでAPKファイルのビルドと署名、Artifactの公開までやった
Azure DevOps Library
シークレットキー
主に署名に必要
- Variable Group: LibrayGroup(任意のグループ)
Variable Group内に以下を定義
- KeyStorePassword: KeyStoreのパスワード
- ApkSignerKeyAlias: apksignerのAlias名
- ApkSignerKeyAliasPassword: apksignerのパスワード
セキュリティファイル
- Asignner.keystore: KeyStore
azure-pipline.yml
Piplineの流れ、処理はiosと並行処理したいので マルチステージで実装
諸々設定
- trigger
- variables: 変数グループ指定
- pool: linuxでもよいが、iosもビルドすることを考えてmacOSを指定
trigger: branches: include: - qa variables: - group: LibrayGroup - name: basePath value: . pool: vmImage: 'macos-latest'
ブランチのチェックアウトとNodeのインストール(Stage1)
versionSpecに使用するNodeバージョンを指定
- stage: Install_Node jobs: - job: Install_Node steps: - checkout: self persistCredentials: 'true' clean: 'true' - task: NodeTool@0 displayName: 'Install Node' inputs: versionSpec: '18.11.0'
NodeTool@0の詳細は下記参照
NodeTool@0 - Node.js tool installer v0 task | Microsoft Learn
APKファイルのビルド(Stage2)
最初にyarn --frozen-lockfile
でnode_moduleをインストールして、
GradleでBuildする
jdkVersionOptionは適切に指定する
- stage: Android_Build dependsOn: Install_Node jobs: - job: Build steps: - script: | yarn --frozen-lockfile - task: Gradle@3 displayName: 'Build APK' inputs: gradleWrapperFile: '$(basePath)/android/gradlew' workingDirectory: '$(basePath)/android/' tasks: 'assembleRelease' publishJUnitResults: false javaHomeOption: 'JDKVersion' jdkVersionOption: '1.11' sonarQubeRunAnalysis: false
Gradle@3の詳細は以下 Gradle@3 - Gradle v3 タスク | Microsoft Learn
署名(Stage2)
ここで設定した変数とセキュリティファイルを使用
- task: AndroidSigning@3 displayName: 'Sign APK' inputs: apkFiles: '$(basePath)/android/app/build/outputs/apk/release/*.apk' apksignerKeystoreFile: 'Asignner.keystore' apksignerKeystorePassword: '$(KeyStorePassword)' apksignerKeystoreAlias: '$(ApkSignerKeyAlias)' apksignerKeyPassword: '$(ApkSignerKeyAliasPassword)' zipalign: true
AndroidSigning@3の詳細は以下
AndroidSigning@3 - Android Signing v3 task | Microsoft Learn
Artifactの公開(Stage2)
このTaskが実行されるとPipline上からAPKファイルをダウンロードできるようになる
- task: PublishBuildArtifacts@1 displayName: 'Publish APK to artifacts' inputs: PathtoPublish: '$(basePath)/android/app/build/outputs/apk/release' ArtifactName: 'android' publishLocation: 'Container'
PublishBuildArtifacts@1 の詳細は以下
PublishBuildArtifacts@1 - ビルド成果物 v1 タスクを発行する | Microsoft Learn
全体
trigger: branches: include: - hogehoge variables: - group: LibrayGroup - name: basePath value: . pool: vmImage: 'macos-latest' stages: - stage: Install_Node jobs: - job: Install_Node steps: - checkout: self persistCredentials: 'true' clean: 'true' - task: NodeTool@0 displayName: 'Install Node' inputs: versionSpec: '18.11.0' - stage: Android_Build dependsOn: Install_Node jobs: - job: Build steps: - script: | yarn --frozen-lockfile - task: Gradle@2 displayName: 'Build APK' inputs: gradleWrapperFile: '$(basePath)/android/gradlew' workingDirectory: '$(basePath)/android/' tasks: 'assembleRelease' publishJUnitResults: false javaHomeOption: 'JDKVersion' jdkVersionOption: '1.11' sonarQubeRunAnalysis: false - task: AndroidSigning@3 displayName: 'Sign APK' inputs: apkFiles: '$(basePath)/android/app/build/outputs/apk/release/*.apk' apksignerKeystoreFile: 'Asignner.keystore' apksignerKeystorePassword: '$(KeyStorePassword)' apksignerKeystoreAlias: '$(ApkSignerKeyAlias)' apksignerKeyPassword: '$(ApkSignerKeyAliasPassword)' zipalign: true - task: PublishBuildArtifacts@1 displayName: 'Publish APK to artifacts' inputs: PathtoPublish: '$(basePath)/android/app/build/outputs/apk/release' ArtifactName: 'android' publishLocation: 'Container'
AzurePipelineで必要なTaskは大体持っているので
割と苦なく実装できた
本来なら、GoogleStoreに直接投げるところまでやりたいが、
まだリリース予定が立っていないのでまた今度