1. React Native 프로젝트에서 Fastlane을 사용하기(Android 편)
이제 ios를 모두 구성하였으니, android를 구성해보자.
Android의 경우는 beta 배포로서 Beta ? Fabric도 가능하지만, 이 가이드에서는 간편함을 위해 AWS S3를 사용해본다.
DevOpsForRN/android/fastlane/Fastfile 경로에 다음과 같이 작성한다.
아래 내용은 Setup - fastlane docs 가이드를 따라 하면 동일하게 구성할 수 있다.
# This file contains the fastlane.tools configuration # You can find the documentation at https://docs.fastlane.tools # # For a list of all available actions, check out # # https://docs.fastlane.tools/actions # # Uncomment the line if you want fastlane to automatically update itself # update_fastlane default_platform(:android) platform :android do desc 'Runs all the tests' lane :test do gradle(task: 'test', flags: '--no-daemon -x bundleReleaseJsAndAssets') end desc 'Submit a new Beta Build to Crashlytics Beta' lane :beta do gradle(task: 'assembleRelease', flags: '--no-daemon -x bundleReleaseJsAndAssets') # crashlytics # sh 'your_script.sh' # You can also use other beta testing services here end desc 'Deploy a new version to the Google Play' lane :deploy do gradle(task: 'assembleRelease') upload_to_play_store end end
마찬가지로 DevOpsForRN/android/fastlane/Appfile 의 경로에도 다음과 같이 작성한다. 이 부분도 fastlane android 공식 가이드 문서에 따르면 동일하다.
json_key_file '' # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one package_name 'com.devopsforrn' # e.g. com.krausefx.app
Android의 경우에는 release apk를 만드는데 Code Signing 필요하다. 다음의 링크를 참조하여 Code Signing을 진행한다.
android - How to create a release signed apk file using Gradle? - Stack Overflow
2. Gradle 시간별로 빌드
추후에, 빌드된 apk가 S3에 쌓이는데, 모두 같은 이름이라면 덮어씌워 질 수 있으므로 Gradle이 빌드되었을때 apk의 시간대별로 생성되도록 하면 구별하는데 동무을 줄 수 있다. 이와같은 기능을 사용하려면 다음의 내용을 따라해보자.
DevOpsForRN/app/build.gradle 파일의 내용을 다음의 내용으로 수정한다.
... ... applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits def versionCodes = ['armeabi-v7a':1, 'x86':2] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } // 시간별로 빌드하는 부분을 추가 def formattedDate = new Date().format('yyyy-MM-dd-HH-mm-ss') def newName = output.outputFile.name newName = newName.replace('-release', '-release' + formattedDate) output.outputFile = new File(output.outputFile.parent, newName) } } ... ...
위와같이 작성하면 ./gradlew assembleRelease 와 같은 커맨드를 입력했을때
app-release2018-02-15-12-26-58-signed.apk 의 파일을 얻을 수 있으므로 시간대별로 apk를 언제 빌드했는지 알 수 있다.
3. AWS의 devops-react-native Bucket 만들기
다음의 문서를 따라하여 devops-react-native라는 이름의 버킷을 만든다.
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/gsg/CreatingABucket.html
4. AWS CLI 설치후 aws s3 sync
기본적으로 CircleCI가 실행하는 Docker Image인 circleci/node:8 에는 awscli가 설치되어 있지 않다. 따라서 아래 내용 중 beta-deploy-android에 반드시 awscli를 설치하는 내용이 들어가야 한다.
DevOpsForRN/.circleci/config.yml
# .circleci/config.yml # To Validate your config.yml then use this cli. # `$ circleci config validate -c .circleci/config.yml` version: 2 jobs: build: working_directory: ~/project docker: - image: circleci/node:8 steps: - checkout - run: yarn - run: yarn run test - persist_to_workspace: root: ~/project paths: - node_modules - store_test_results: path: ~/project/junit.xml beta-deploy-ios: working_directory: ~/project/ios macos: xcode: '9.0' steps: - checkout: path: ~/project - attach_workspace: at: ~/project - run: bundle update fastlane - run: bundle exec fastlane beta beta-deploy-android: working_directory: ~/project/android docker: - image: circleci/android:api-27-node8-alpha steps: - checkout: path: ~/project - attach_workspace: at: ~/project - run: bundle update fastlane - run: bundle exec fastlane beta - run: sudo apt-get update && sudo apt-get install -y awscli # AWS CLI Install - run: aws s3 sync app/build/outputs s3://devops-react-native/ android: working_directory: ~/project/android docker: - image: circleci/android:api-27-node8-alpha steps: - checkout: path: ~/project - attach_workspace: at: ~/project - run: bundle install --path vendor/bundle - persist_to_workspace: root: ~/project paths: - android - run: bundle exec fastlane test - store_test_results: path: ~/project/android/reports ios: macos: xcode: '9.0' working_directory: ~/project/ios environment: FL_OUTPUT_DIR: ~/project/output shell: /bin/bash --login -o pipefail steps: - checkout: path: ~/project - run: name: Set Ruby Version command: echo 'ruby-2.4' > ~/.ruby-version # Not using a workspace here as Node and Yarn versions # differ between the macOS image and the Docker containers above. - run: yarn - run: bundle install --path vendor/bundle - persist_to_workspace: root: ~/project paths: - ios - run: bundle exec fastlane test - store_artifacts: path: ~/project/output - store_test_results: path: ~/project/output/scan workflows: version: 2 node-android-ios: jobs: - build - android: requires: - build - beta-deploy-android: filters: branches: only: - beta requires: - android - ios: requires: - build - beta-deploy-ios: filters: branches: only: - beta requires: - ios
5. CircleCI Env Variable
* AWS Permisson 설정
AWS CLI가 실행되기 위해서는 권한과 인증이 필요하다.
AWS IAM 의 Access-Key와 Secret-Key를 아래와 같이 설정한다.
*AWS Region 설정
AWS CLI가 실행되기 위해서는 기본적으로 region이 설정되어 있어야 한다.
AWS_DEFAULT_REGION를 ap-northeast-2로 설정이 필요하다.
6. 작성한 내용 검증하기
* Fastlane, CircleCI를 이용하여 React Native DevOps 도입기 (4)