なんかいろいろと書いてくブログ

関東のどこかで働く、一般人

Azure PiplineでReact NativeのAPKファイルをビルド

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に直接投げるところまでやりたいが、
まだリリース予定が立っていないのでまた今度

参考

blog.logrocket.com