【Jenkins】シングルクォート変数展開
シングルクォートは通常だと変数展開できないが、
withEnvでを使うことで環境変数として定義することができる。
外部プログラムや秘密テキスト類を使うときに利用する。
withEnvを利用する
withEnv(["hoge=${params.BRANCH}", "fuga=user/home/fuga"]) { sh 'echo $hoge $fuga' }
{name}={value}の形式で指定し、複数指定することが可能です。
Credentialsのテキストをダブルクォートで展開しようとすると以下の警告が表示されます。
The following steps that have been detected may have insecure interpolation of sensitive variables (click here for an explanation):
そういう際にwithEnvを使うようにしましょう。
pipeline {
agent any
parameters {
string defaultValue: 'develop', name: 'BRANCH'
}
stages {
stage("hoge") {
steps {
withCredentials([usernamePassword(credentialsId: "my_account", usernameVariable: 'ID', passwordVariable: 'PW')]) {
withEnv(["_branch=${params.BRANCH}"]) {
sh 'hoge.sh $_branch $ID $PW'
}
}
}
}
}
}
【Jenkins】Pipelineの[Lightweight checkout]が機能しないブランチ指定
要約
refs/heads/ブランチ名で指定しましょう。
なぜなのか
Lightweight checkoutとskipDefaultCheckoutをONにしているのにスクリプトがcloneされて困りました。
調べるとこちらのIssuesで同じような事例があがっておりました。
記載通りにデフォルトのブランチを指定すると問題なく動作しました。
また、refs/heads/ブランチ名でも同様です。
そもそもブランチ名の指定はrefs/heads/*が推奨されていました。
git-plugin Documentation。
以上、説明はちゃんと読みましょうでした。
UnityでAndroid App Bundleが150MBを超えた時の対応
2021年8月より、Google Playでの新規アプリの公開はAndroid App Bundleで行う必要があります。 新規アプリのサイズが 150 MB を超える場合は、 Play Asset Delivery または Play Feature Delivery のいずれかを使用する必要があります。
apkならobbで楽に行えるのですがaabはobbが使えないのでそう簡単にはいきません。
未対応で150MB超えていると、PlayConsoleアップ時に以下のエラーとなります。
App Bundle に含まれている設定(ARM64_V8A)で、初期インストールのサイズは 150 MB 以下である必要があります。
Play Asset Deliveryを利用することで、アプリ内包(BuiltIn)しているAssetBundleをAsset Packとして扱うようにします。
そのAssetBundleはサイズから除外してくれるので150MBを超えててもOKになります。
StreamingAssetsにおいてたものをAssetPackに移動させるイメージです。
このために実装を切り分けないといけないのは辛い所です。
非対応な構成
公式だと現時点ではAddressablesは非対応です。
対応されている方もいらっしゃるので以下参考にどうぞ。
Android App Bundle with Addressable #14
また、Gradleプロジェクトを出力してのビルドも非対応です。
Build app bundle in android studio with asset packs of Unity project #31
その場合はJavaネイティブアプリとして対応すれば可能なのか?
https://developer.android.com/guide/app-bundle/asset-delivery/build-native-java?hl=ja
環境
Unity: 2019.4.21f1
Android: Pixel 4a(11)
Google Play Asset Delivery: 1.3.0
Google Play Common: 1.3.0
Google Play Core: 1.3.0
Google Android App Bundle: 1.3.0
対応
公式ドキュメントはこちらです。
読み進めれば問題なく対応できました。
https://developer.android.com/guide/app-bundle/asset-delivery?hl=ja
プラグインをインストールする
unitypackageでインポートすることもできますが、管理しやすいUPMでインストールします。
Packages/manifest.jsonにGoogleのレジストリを追加します。
"scopedRegistries": [ { "name": "Game Package Registry by Google", "url": "https://unityregistry-pa.googleapis.com", "scopes": [ "com.google" ] } ]
Unityが2018の方は利用できないので以下からpackageを入手しましょう。
https://github.com/google/play-unity-plugins
必要なパッケージは以下です。
Google Play Asset Delivery
Google Play Common
Google Play Core
Google Android App Bundle
AssetBundleをAssetPackに含めるよう設定する
UIでの設定もできますが使いづらいのでスクリプトで行います。
UIからだとAssetBundleManifestがないとエラーになります。
依存が関係ないようなAssetBundleであればスクリプトで設定しましょう。
異なるAssetPackに同じファイルが存在するとビルドエラーになります。
今回はBuiltInなアセットなのでDelivery ModeはすべてInstall Timeにします。
using Google.Android.AppBundle.Editor;
using Google.Android.AppBundle.Editor.AssetPacks;
private static void AssetDeliverySettings()
{
var assetPackConfig = new AssetPackConfig();
// AssetBundle以外のものをAssetPackに含めたい場合はこちら
// ひとつのAssetPackに指定フォルダ以下にあるファイル全てを含めます
assetPackConfig.AddAssetsFolder("{AssetPack名}", "{対象フォルダ相対パス}", AssetPackDeliveryMode.InstallTime);
// AssetBundleを個別に追加する場合はこちら
// AssetPack名=AssetBundle名になる
assetPackConfig.AddAssetBundle("{AssetBundle相対パス}", AssetPackDeliveryMode.InstallTime);
// 設定を保存
AssetPackConfigSerializer.SaveConfig(assetPackConfig);
}
設定ファイルはLibrary/PlayAssetPackConfig.jsonに保存されます。
AssetPackからロードするように実装する
AssetPackとAssetBundleを指定してAssetBundleを取得し、Assetをロードします。
AssetPack名を設定した場合はpackとbundleの両方名が必要です。
// AssetPack名とAssetBundle名が同じ場合はAssetPack指定を省略できる
private void LoadAsset1(string assetBundleName, string fileName)
{
var bundleRequest = PlayAssetDelivery.RetrieveAssetBundleAsync(assetBundleName);
bundleRequest.Completed += request => {
if(request.Status == AssetDeliveryStatus.Loaded ||
request.Status == AssetDeliveryStatus.Available) {
var prefab = request.AssetBundle.LoadAsset<GameObject>(fileName);
Instantiate(prefab);
}
};
}
// 異なる場合は別途指定
private void LoadAsset2(string assetPackName, string assetBundlePath, string fileName)
{
var packRequest = PlayAssetDelivery.RetrieveAssetPackAsync(assetPackName);
packRequest.Completed += request => {
if(request.Status == AssetDeliveryStatus.Loaded ||
request.Status == AssetDeliveryStatus.Available) {
var bundleCreateRequest = packRequest.LoadAssetBundleAsync(assetBundlePath);
bundleCreateRequest.completed += _ => {
var prefab = bundleCreateRequest.assetBundle.LoadAsset<GameObject>(fileName);
Instantiate(prefab);
};
};
};
}
Android App Bundleをビルドする
設定をロードしてaabをビルドします。
Unityのメニューから[Google]->[Build Android App Bundle...]でビルドできます。
aabが150MBを超える場合は警告が表示されます。
[PlayerSettings]->[Warm about App Bundle size]で非表示にできます。
スクリプトで行う場合はこちら。
private static void BuildAndroidAppBundle()
{
var assetPackConfig = AssetPackConfigSerializer.LoadConfig();
// 良しなに設定する
var options = new BuildPlayerOptions(){
locationPathName = "application.aab",
target = BuildTarget.Android,
targetGroup = BuildTargetGroup.Android
};
Bundletool.BuildBundle(options, assetPackConfig);
}
動作確認する
端末を繋いでいれば、Unityのメニューから[Google]->[Build and Run]でaabのビルドとAssetPackのインストールが行えます。
ビルドしたaabをコマンドラインからインストールするにはこちらからどうぞ。
developer.android.com
参考ページ
Mac x Unity x VScodeでデバッグ
新しいPCで環境構築した時にUnityへAttachできなかったのでメモ。
Mono Developのバージョンが良くなかった。
環境
Mac: Catalina 10.15.6
VSCode: 1.49.0
Unity: 2019.4.5f1
必要なもの
手順
Unityはとくに何もする必要ありません。
Debugger for UnityをVSCodeにインストール
.Net Coreをインストール
Mono Developeをインストール
www.mono-project.com
previewではなくstableを使うのが良いです。
現時点でpreviewの6.12.xはAttachできませんでした。
UnityへのAttach
VSCodeの[実行]からlaunch.jsonを作成する。
(ない状態で[Unity Attach Debuger]してもコマンドがないと怒られる)
再生ボタンを押下して終わり。
Androidの共有機能で特定アプリだけに共有する
ゲーム内で撮ったSSを、特定SNS以外に投稿したかったメモです。
C#(Unity)だけだと厳しく、事例みてもうまくいかなかったのでまとめました。
共有はAndroid Sharesheetを使います。
developer.android.com
除外の必要がなければShareCompatを使うのが楽です。
(ShareCompatは中でIntent.createChooserをラップしているだけです)
環境
Android Studio: 4.0.1
Android: 4.4.1、9
Compile SDK: 30
Build Tools: 30.0.1
実装
プラグインを作成する
こちらを参考に特定Activityは除外するようにします。
ただしAPI.24前は除外ではなく、表示するアプリを制限するようにします。
yuki312.blogspot.com
除外を判定する部分はやりたいことに合わせて実装してください。
プラグイン化(aar)はこちらを参考にしました。
sites.google.com
FileProviderの実装についてはこちらを参考にしました。
developer.android.com
Unity 2018/2019 AndroidXに移行する
Unity 2018/2019でAndroidXへの移行メモです。
2019.3.7からgradle.properties、build.gradleもGUIで選択できる。
AndroidStudioでAndroidXへの移行を自動的にやってくれるそうですが、
No Usages Found in the Projectとエラーになりました。
環境
Unity: 2018.4.29f1、2019.4.5f1
テンプレートに書き加える
2019.4なら[Player Settings] -> [Publishing Settings] -> [Build]で
カスタムしたいファイルにチェックを入れるとAssets/Plugins/Androidにテンプレートが生成されます。
今回はCustom Main Gradle TemplateとCustom Gradle Properties Templateをカスタムします。
2018.4はCustom Gradle Properties TemplateがないのでAssets/Plugins/AndroidにgradleTemplate.propertiesを自作する。
Custom Main Gradle Template
dependenciesにandroidx.coreを追加します。
利用するバージョンは必要に応じて変更してください。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.core:core:1.3.1' // add
**DEPS**}
Custom Gradle Properties Template
プロパティを2つ追加します。
android.useAndroidX=true // add android.enableJetifier=true // add
実装時の注意点
MinifyがProguardだとAndroidJavaClassでクラスが見つからないエラーになる。
サポートライブラリは除外するようにしておきましょう。
参考
Ad-hocのProvisioningProfileではTestFlightが使えない?
久しぶりにTestFlightでAd-hocのアプリを配布しようとしたら詰まったメモ
いつの間にかTestFlightはApp-storeのProfileじゃないと使えなくなってる?
環境
Xcode 11.2.1
Build Version 11B500
調査
Ad-hocのProfileを使い、
XcodeのOrganizerで作成したipaではとくに警告が表示されませんでしたが、
xcodebuildでexportしたipaではValidateで以下の警告が表示されます。
WARNING ITMS-90191: "Missing beta entitlement. Your app does not include the beta-reports-active entitlement. If you intend to distribute this build via TestFlight for beta testing, please re-build this app with an App Store Distribution provisioning profile. Do not use ad-hoc profiles."
どちらのアプリをアップロードしても、ステータスが[処理中]から変化ありません。
半年ほど前はAd-hocでもTestFlightが使えたと思うのですが、何か変わったのでしょうか?
このipaを再署名でbeta-reports-active = 1に書き換えると以下のエラーになります。
※exportOptionsでbeta-reports-activeを設定しても効果ありません。
ERROR ITMS-90163: "Invalid Code Signing Entitlements. The entitlements in your app bundle signature do not match the ones that are contained in the provisioning profile. The bundle contains a key that is not included in the provisioning profile: 'beta-reports-active' in 'Payload/hoge.app/hoge'."
再署名についてはこちら
https://shashikantjagtap.net/ios-code-signing-4-provisioning-profiles/shashikantjagtap.net
Entitlementsについてはこちら Apple Developer Documentation - Entitlements
Entitlements | Apple Developer Documentation
App-storeのProfileでexportしたアプリは問題なくテスト可能な状態になりました。
AppStoreConnectから配信だからApp-storeのProfileじゃないとダメという事なのでしょうか。