Compare commits

..
Author SHA1 Message Date
Dominik Sokal 287d5f88e5 [turtle-cli] don't require gulp-cli installed globally 2019-06-14 10:43:47 +02:00
16 changed files with 537 additions and 196 deletions

No files matched your search

-6
View File
@@ -5,16 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- Added support for Android build modes: debug or release.
### Fixed
- Upgrading the shell app for a given SDK version when the previous version is already downloaded (bug in `turtle-cli`).
- Updated Android shell app for SDK33 to include `[email protected]` which fixes crashes on Android 9.0 when showing some Lottie animations.
## [0.8.4] - 2019-06-13
### Changed
- Upgraded `sharp` from `0.21.3` to `0.22.1`.
- `gulp-cli` is no longer required to build an app with `turtle-cli`.
## [0.8.3] - 2019-06-13
### Added
+2 -3
View File
@@ -1,6 +1,6 @@
{
"name": "turtle-cli",
"version": "0.8.5",
"version": "0.8.4",
"description": "The command-line tool for building standalone Expo apps",
"preferGlobal": true,
"scripts": {
@@ -13,7 +13,6 @@
"prepare": "rimraf ./build && yarn build",
"build": "ttsc",
"build:production": "./scripts/build.sh",
"watch": "ttsc --watch",
"secrets:init-private": "./scripts/initPrivateSecrets.sh",
"set-workingdir:remote": "./scripts/setWorkingdirMode.sh remote",
"set-workingdir:local": "./scripts/setWorkingdirMode.sh local",
@@ -111,7 +110,7 @@
},
"dependencies": {
"@expo/spawn-async": "^1.4.2",
"@expo/xdl": "55.0.2",
"@expo/xdl": "54.1.4",
"@google-cloud/logging-bunyan": "^0.9.5",
"async-retry": "^1.2.1",
"aws-sdk": "^2.226.1",
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/android-shell-builder-5090aab941f92c912c6643a1e25cc69f9f67d8e6.tar.gz
s3://exp-artifacts/android-shell-builder-e244e865ed8cb8e20d29ea00b6373845d1c61068.tar.gz
+2 -8
View File
@@ -23,15 +23,9 @@ export default (program: any, setCommonCommandOptions: any) => {
/^(app-bundle|apk)$/i,
'app-bundle',
)
.option(
'-m --mode <build>',
'type of build: debug|release',
/^(debug|release)$/i,
'release',
)
.description(
'Build a standalone APK or App Bundle for your project, either signed and ready for submission to'
+ ' the Google Play Store or in debug mode.',
'Build a standalone APK or App Bundle for your project, signed and ready for submission to the Google Play'
+ ' Store.',
)
.asyncAction(
createBuilderAction({
+2 -4
View File
@@ -4,7 +4,7 @@ import path from 'path';
import decompress from 'decompress';
import fs from 'fs-extra';
import * as utils from 'turtle/bin/setup/utils/common';
import { formatArtifactDownloadPath } from 'turtle/bin/setup/utils/common';
import download from 'turtle/bin/setup/utils/downloader';
import config from 'turtle/config';
import logger from 'turtle/logger';
@@ -16,10 +16,9 @@ const l = logger.child(LOGGER_FIELDS);
export default async function ensureAndroidNDKIsPresent() {
const androidNdkDir = path.join(config.directories.androidDependenciesDir, 'ndk');
await utils.removeDirectoryUnlessReady(androidNdkDir);
if (!(await fs.pathExists(androidNdkDir))) {
await fs.ensureDir(androidNdkDir);
const androidNdkDownloadPath = utils.formatArtifactDownloadPath(ANDROID_NDK_URL);
const androidNdkDownloadPath = formatArtifactDownloadPath(ANDROID_NDK_URL);
try {
l.info('Downloading Android NDK');
@@ -27,7 +26,6 @@ export default async function ensureAndroidNDKIsPresent() {
await download(ANDROID_NDK_URL, androidNdkDownloadPath);
l.info('Decompressing Android NDK');
await decompress(androidNdkDownloadPath, androidNdkDir, { strip: 1 });
await utils.markDirectoryAsReady(androidNdkDir);
l.info('Android NDK installed successfully');
} catch (err) {
await fs.remove(androidNdkDir);
+2 -4
View File
@@ -5,7 +5,7 @@ import { ExponentTools } from '@expo/xdl';
import decompress from 'decompress';
import fs from 'fs-extra';
import * as utils from 'turtle/bin/setup/utils/common';
import { formatArtifactDownloadPath } from 'turtle/bin/setup/utils/common';
import download from 'turtle/bin/setup/utils/downloader';
import config from 'turtle/config';
import logger from 'turtle/logger';
@@ -17,10 +17,9 @@ const l = logger.child(LOGGER_FIELDS);
export default async function ensureAndroidSDKIsPresent() {
const androidSdkDir = path.join(config.directories.androidDependenciesDir, 'sdk');
await utils.removeDirectoryUnlessReady(androidSdkDir);
if (!(await fs.pathExists(androidSdkDir))) {
await fs.ensureDir(androidSdkDir);
const androidSdkDownloadPath = utils.formatArtifactDownloadPath(ANDROID_SDK_URL);
const androidSdkDownloadPath = formatArtifactDownloadPath(ANDROID_SDK_URL);
try {
l.info('Downloading Android SDK');
@@ -32,7 +31,6 @@ export default async function ensureAndroidSDKIsPresent() {
await fs.remove(androidSdkDownloadPath);
l.info('Configuring Android SDK, this may take a while');
await _configureSdk(androidSdkDir);
await utils.markDirectoryAsReady(androidSdkDir);
l.info('Android SDK installed and configured successfully');
} catch (err) {
await fs.remove(androidSdkDir);
-31
View File
@@ -29,8 +29,6 @@ export async function ensureShellAppIsPresent(
postDownloadAction?: PostDownloadAction,
) {
const workingdir = formatters.formatShellAppDirectory({ sdkVersion });
const shellAppMetadata = await _readShellAppTarballS3Uri(sdkVersion, formatters);
await removeDirectoryUnlessReady(workingdir, shellAppMetadata);
if (await fs.pathExists(workingdir)) {
return;
}
@@ -39,7 +37,6 @@ export async function ensureShellAppIsPresent(
if (postDownloadAction) {
await postDownloadAction(sdkVersion, workingdir);
}
await markDirectoryAsReady(workingdir, shellAppMetadata);
}
async function _downloadShellApp(sdkVersion: string, targetDirectory: string, formatters: IShellAppFormaters) {
@@ -68,31 +65,3 @@ async function _readShellAppTarballS3Uri(sdkVersion: string, formatters: IShellA
const data = await fs.readFile(filePath, 'utf8');
return data.trim();
}
export async function removeDirectoryUnlessReady(dir: string, metadata?: string) {
const readyFilePath = path.join(dir, '.ready');
const readyFileExists = await fs.pathExists(readyFilePath);
let shouldRemove = false;
if (readyFileExists) {
if (metadata !== undefined) {
const readyFileContents = (await fs.readFile(readyFilePath, 'utf-8')).trim();
if (readyFileContents !== metadata) {
shouldRemove = true;
}
}
} else {
shouldRemove = true;
}
if (shouldRemove) {
await fs.remove(dir);
}
}
export async function markDirectoryAsReady(dir: string, metadata?: string) {
const readyFilePath = path.join(dir, '.ready');
if (metadata === undefined) {
await fs.open(readyFilePath, 'w');
} else {
await fs.writeFile(readyFilePath, metadata);
}
}
+1 -3
View File
@@ -57,7 +57,6 @@ export function createBuilderAction({
const args = {
releaseChannel: cmd.releaseChannel || 'default',
buildType: cmd.type,
buildMode: cmd.mode,
username: userData.username || 'anonymous',
projectDir: ProjectUtils.resolveAbsoluteDir(projectDirArg),
publicUrl: cmd.publicUrl,
@@ -89,14 +88,13 @@ export function createBuilderAction({
const buildJobObject = async (
platform: 'android' | 'ios',
appJSON: any,
{ releaseChannel, buildType, buildMode, username, publicUrl, projectDir }: any,
{ releaseChannel, buildType, username, publicUrl, projectDir }: any,
credentials: any,
) => {
const job = {
config: {
..._.get(appJSON, 'expo.ios.config', {}),
buildType,
...(platform === 'android' ? { buildMode } : {}),
releaseChannel,
...(platform === 'ios' ? { bundleIdentifier: _.get(appJSON, 'expo.ios.bundleIdentifier') } : {}),
...(platform === 'android' ? { androidPackage: _.get(appJSON, 'expo.android.package') } : {}),
-1
View File
@@ -93,7 +93,6 @@ async function runShellAppBuilder(
outputFile: outputFilePath,
modules: enabledModules,
buildType: jobData.config.buildType,
buildMode: jobData.config.buildMode,
});
} catch (err) {
commonUtils.logErrorOnce(err);
+1 -2
View File
@@ -1,7 +1,6 @@
import { ANDROID_BUILD_MODES, ANDROID_BUILD_TYPES, IOS_BUILD_TYPES } from 'turtle/constants';
import { ANDROID_BUILD_TYPES, IOS_BUILD_TYPES } from 'turtle/constants';
export interface IShellAppDirectoryConfig {
sdkVersion: string;
buildType?: IOS_BUILD_TYPES & ANDROID_BUILD_TYPES;
buildMode?: ANDROID_BUILD_MODES;
}
-5
View File
@@ -16,9 +16,4 @@ export enum ANDROID_BUILD_TYPES {
APP_BUNDLE = 'app-bundle',
}
export enum ANDROID_BUILD_MODES {
DEBUG = 'debug',
RELEASE = 'release',
}
export { BUILD };
+1 -2
View File
@@ -1,4 +1,4 @@
import { ANDROID_BUILD_MODES, ANDROID_BUILD_TYPES, IOS_BUILD_TYPES } from 'turtle/constants';
import { ANDROID_BUILD_TYPES, IOS_BUILD_TYPES } from 'turtle/constants';
export interface IJob {
platform: 'android' | 'ios';
@@ -14,7 +14,6 @@ export interface IJob {
bundleIdentifier?: string;
// android
androidPackage?: string;
buildMode?: ANDROID_BUILD_MODES;
};
credentials: {
// android
+1 -4
View File
@@ -1,6 +1,6 @@
import Joi from 'joi';
import { ANDROID_BUILD_MODES, PLATFORMS } from 'turtle/constants';
import { PLATFORMS } from 'turtle/constants';
import baseJobSchema from 'turtle/jobsSchemas/base';
export default baseJobSchema.concat(
@@ -12,8 +12,5 @@ export default baseJobSchema.concat(
keystoreAlias: Joi.string(),
keystore: Joi.string(),
}),
config: Joi.object().keys({
buildType: Joi.string().valid(Object.values(ANDROID_BUILD_MODES)).default(ANDROID_BUILD_MODES.RELEASE),
}),
}),
);
-1
View File
@@ -17,7 +17,6 @@ class Logger {
name: 'turtle',
level: config.logger.level,
platform: config.platform,
serializers: bunyan.stdSerializers,
...config.deploymentEnv && { environment: config.deploymentEnv },
streams: Object.values(streams),
});
-4
View File
@@ -7,10 +7,6 @@ command=node ./build/server.js
autorestart=true
startretries=5
startsecs=600
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
[eventlistener:turtle_failure]
events=PROCESS_STATE_FATAL
+524 -117
View File
File diff suppressed because it is too large. Load diff