BitriseでOutOfMemoryErrorが発生してビルドが失敗する場合

f:id:Keisuke69:20210302154651p:plain

備忘録です。

最近、React Nativeで作ったアプリをBitriseでビルドするのを試しています。

Bitrise - Mobile Continuous Integration and Delivery

このBitriseというプラットフォームはとても使いやすくて、ビルドのためのワークフローの定義も直感的にできました。

ところがAndroidのビルドに失敗してしまうんですよね。以下のような感じでOutOfMemoryErrorが出ています。

> Task :app:mergeExtDexDebug FAILED
D8: java.lang.OutOfMemoryError: Java heap space
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
    at com.android.builder.dexing.D8DexArchiveMerger.getExceptionToRethrow(D8DexArchiveMerger.java:132)
    at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:119)
    at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:102)
    at com.android.build.gradle.internal.tasks.DexMergingTaskRunnable.run(DexMergingTask.kt:432)
    at com.android.build.gradle.internal.tasks.Workers$ActionFacade.run(Workers.kt:242)
  ...

というわけでヒープサイズを増やしたりしてみるなどします。

Workflow EditerのEnv Varsタブを開き、

f:id:Keisuke69:20210302153212p:plain

以下の2つをセットします。

GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"'
JAVA_OPTS: "-Xms512m -Xmx1024m"

ところが、これで解決かと思いきや自分の環境では別のエラーが出るようになってしまいました。

しかもこれまでOOMが発生していたStepとは別のStepです。OOMが発生していたStepより前のStepのInstall missing Android SDK componentsで以下のようなエラーが出ました。

Failed to ensure android components, error: output: Invalid initial heap size: -Xms512m -Xmx1024m
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
error: exit status 1

ヒープサイズ周りのエラーってことなので明らかに前の設定が影響してるんだと思います。ということで今度は先ほどの設定を削除してgradle.propertiesに以下の内容を追加します。

org.gradle.daemon=true
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

これはgradleの実行環境をデーモン化するものです。通常はビルド時間短縮のために使ったりするオプションですね。加えて、org.gradle.jvmargsで実行時のJVM引数を指定してメモリ足らなくなるのを防いでます。

というわけで無事にビルドできました。

Monthly AWS Serverless Update 202102

2021年2月のサーバーレス関連まとめです。こちらのイベントで取り上げる内容です。

serverless-newworld.connpass.com

2021年2月のリリース

1月に引き続き2月もあまりアップデートはなかったです。逆にその分Lambdaなんかはre:Inventでお腹いっぱいになった機能追加にキャッチアップするいいタイミングかもですね。

タイトルだけで内容がわかるようなものは特にコメントしていません。

AWS Lambda が Node.js 14 のサポートを開始

  • Top Level AwaitってことはNode.jsのv14.3以降ってことですね、きっと
  • でもLambdaで利用するにはフラグなしじゃないとダメだと思うのでv14.8以降ですかね

AWS Amplify ホスティングが Amazon CloudWatch の統合でモニタリング機能を追加

AWS ソリューション実装 - AWS Data Streaming Solution for Amazon MSK がストリーミングアプリケーションからイベントを読み取ってデータを Amazon S3 に保存するテンプレートを追加

PartiQL を DynamoDB ローカルで使用して、Amazon DynamoDB のテーブルデータの照会、挿入、更新、削除が可能に

  • PartiQL
  • SQL互換のクエリ言語
  • RDB以外にKVSやJSONとかCSVファイルといった半構造化データや入れ子形式のいろんなデータソースに対して横断的に検索できるクエリ言語
  • このPartiQLによるDynamoDBのテーブルデータのクエリ、挿入、更新、削除ができるようになった

新しいデータと認証のサポートを備えた Amplify Flutter の一般提供を発表

  • 猫も杓子もFlutter

Amazon DynamoDB Accelerator (DAX) が次世代のバースト可能な汎用 Amazon EC2 T3 インスタンスタイプのサポートを開始

Amazon SNS で 10 桁のコードと無料電話番号を使用しながら SMS メッセージを米国内の宛先に送信できるようになりました

Amazon CloudWatch Contributor Insights for Amazon DynamoDB が AWS CloudFormation のサポートを開始

その他ブログなど

Operating Lambda: イベント駆動型アーキテクチャを理解する – Part 1 | Amazon Web Services ブログ

  • Operation Lambdaシリーズ第一弾
  • イベントドリブンアーキテクチャについて利点とかどういう課題を解決するかなど

Docker コンテナイメージを使用した PHP Lambda 関数の構築 | Amazon Web Services ブログ

  • LambdaでPHPを使う方法
  • 以前はカスタムランタイムでやるしかなかったが、コンテナサポートされたのでやりやすくなったと思う

Building a serverless multi-player game that scales | AWS Compute Blog

サーバーレス「AWS Lambda」のコストが9割減も、新課金ルールが生きる使い方 | 日経クロステック(xTECH)

  • 課金単位が1msになった件について
  • コストが5分の1から10分の1になった例も

Lambdaのテスト領域に関する技術共有会を開催しました | DevelopersIO * Lambdaのテストに関するまとめ * Lambdaに限らずテストというものに対する考え方を包括的に * サンプルはTSとJest

TypeScriptフルスタックフレームワークのfrourioをAWSのサーバレスな環境で動かす

www.buzzsprout.com

【Golang】で【Amazon API Gateway Lambda オーソライザー】と【FirebaseAuth】を利用しての認証をやってみた - カミナシ開発者ブログ

Vercel以外でNext.jsのISRをできるのか問題

  • サーバーレスとは直接関係ないかもだけどNext.jsのISRをVercel以外で
  • 僕も以前に書きましたが現状コンテナとか使うしかない → キャッシュにつらみ

CircleCI OrbsでAWS SAM CLIを超簡単に導入して使ってみる | DevelopersIO

  • CircleCIでSAM CLI使いたい人向け

DynamoDB + Lambda + CloudFront + S3でシンプルなウェブサービスを作る話

初心者向け! こんなときどうする⁉︎ GitのTips31選!

2021/03/01に数年ぶりに更新しつつ書き直しました!オリジナルはこのブログで7年前に書いたもので、途中からはQiitaで更新していたのですが今後はこちらを更新します。

自分用のメモですが、Gitを使って開発してる場合によくあることを簡単にまとめました。 特に使い始めの頃とか初心者の人が困ったときの手助けになれば。 なお、自己責任でお願いします。 ※間違いあったら指摘してください


変更確認系

変更箇所を直前のコミットタイミングと比較したい

git diff HEAD~1

差分のサマリを見たい

git diff --stat <source> <target>

スペースの変更を無視してdiffしたい

これをしないと全体をインデントしたときとかに悲惨です。

git diff --ignore-space-change <source> <target>

自分のリポジトリをフォークして作られた他人のリポジトリを比較

git remote add <name> <フォーク元もしくは比較したいリポジトリ>
git fetch <name> #先ほど追加したリモートをfetch 
git diff FETCH_HEAD

フォーク元との比較にもどうぞ。

あれこれ修正したい

直前のコミットメッセージを変更したい

git commit --amend -m "new comment"

コミットをまとめたい

git rebase -i HEAD~5

エディタが開くのでpickなりrewordなりfixupなりを行う。 上記はHEADから5個前までのコミットを対象に作業している。

直前以前のコミットメッセージを変更したい

「コミットをまとめたい」とやり方は同じ。変更したい箇所までのHEADを指定してrebaseを実行する。 あとは変更したい箇所でpickなりをする。

コミッタ名やメールアドレスを変更したい

通常は以下の2コマンドで名前とメールアドレスを設定しておけば問題ない。

git config --global user.name "Your Name"
git config --global user.email you@example.com

が、既に異なる名前でコミットされているものを後から変更したい場合は以下のような処理を実行すればよい

git filter-branch --commit-filter '
    GIT_AUTHOR_NAME="New Name"
    GIT_AUTHOR_EMAIL="new@example.com"
    GIT_COMMITTER_NAME="New Name"
    GIT_COMMITTER_EMAIL="new@example.com"
    git commit-tree "$@"
' HEAD

commit-filterの後にシェルスクリプトを記述する。 上記の場合は、全てのコミットログに対して名前とアドレスを変更する処理を行っているが特定のコミッタだけ変更したい場合などはシェルのif文なりで引っ掛ければよい

取り消し系

githubにpushしたcommitの取り消し

githubにpushして後にcommitが間違っていたことに気づいた場合など。 ただし、以下の手順を実施するとcommitだけでなく変更も失われるので注意。ローカルのソースツリーは残された最後のcommitに戻されます。変更を保存したい場合は使わないように。

git rebase -i HEAD~2 #エディタが開くので二行目を削除して保存する
git push origin +master

github側だけcommitの取り消し

commitの取り消しをgithub側だけで行う場合。ローカルは同期されない。

git push -f origin HEAD^:master

ローカルだけcommitの取り消し

git reset HEAD^

git addの取り消し

git rm --cached <取り消したいファイル>

いろいろやり直したい(間違ってreset --hardした時とか)

git reflog

でHEADの変遷を表示して戻したい位置を指定してresetする。ちなみにHEAD@[0}が現在のHEAD位置。

git reset --hard HEAD@{1}

みたいな感じで。

間違って削除したファイルを元に戻したい

git checkout -f <対象ファイル>

ただし、変更も戻る。
ファイルを指定しない場合は全体が戻ります。

その他いろいろ

他人のリポジトリをローカルの別ブランチにチェックアウトしたい

git remote add <name> <フォーク元もしくは比較したいリポジトリ>
git fetch <name>
git checkout -b <branch_name> remotes/<remote_name>/<remote_branch_name>

github上でforkしたリポジトリの最新化

forkしたリポジトリをcloneした上でfork元のリポジトリをpullするだけ。 pullするにあたってはfork元をremoteに追加しておいてもいいし直接URL指定でもいい。

指定のタグをチェックアウトしてブランチ作成

git checkout -b <ブランチ名> refs/tags/<タグ名>
#ブランチ作らないなら-b不要

タグとタグの間のコミットログを表示

git log v1.0..v1.1 --pretty=format:"%ci [%h]%s"
#タグの代わりにハッシュ値を指定することもできる

タグの一覧表示

git tag -l

タグがリンクしているコミットのハッシュ値を確認

git rev-parse <タグ名>

特定のハッシュ値のコミットログを確認

git log ハッシュ値

リモートリポジトリのタグを削除

まずローカルでタグを削除してリモートを空のタグで上書きする

git tag -d <タグ名>
git push origin :refs/tags/<タグ名>

特定ファイルのブランチによる違いの比較

git diff branch1 branch2 filepath

リモートブランチをトラッキング先に設定

git branch --set-upstream work remotes/origin/work 

リモートブランチを削除したい

git push [remotename] :[branch] 

強制的にpushする

リモート側のツリーを強制的に上書きしてローカルの内容でpushしたい場合

git push <リモート名> <ローカルブランチ> --force

特定のコミットだけをマージしたい

git log等で対象コミットのハッシュ値を確認した上でcherry-pickを実行する。

git cherry-pick <ハッシュ値>

gitignoreで指定する前にaddしてしまった場合

インデックスから削除すると同時にファイルも削除する場合

$ git rm -f hogehoge~

インデックスからだけ削除する場合 ※つまりファイルはそのまま

$ git rm --cached -f hogehoge~

gitの設定を確認したい

git config --list

ユーザ名とメールアドレスを設定したい

システム上の特定ユーザすべてのリポジトリで設定するには--globalオプションを指定する。

$ git config --global user.name "foo bar"
$ git config --global user.email foo@example.com

普通にrmしたファイルをまとめてgit rmしたい

OS上でrmで削除してしまったものをgit上でも削除したいがうっかりフォルダごと、しかも複数消してしまって大量にある場合など

$ git rm $(git ls-files --deleted)

最後に

とりあえずこんなところで。 今後も自分で躓いたりして新しいネタ見つけたらちょいちょい気まぐれに追加していきます。

©Keisuke Nishitani, 2020   プライバシーポリシー