Compare commits

..
Author SHA1 Message Date
Quinlan Jung ca3a118d43 debug msg 2019-07-01 14:21:37 -07:00
Quinlan Jung 1fca07d58b schema change 2019-07-01 14:21:36 -07:00
73 changed files with 1908 additions and 3085 deletions

No files matched your search

-67
View File
@@ -137,23 +137,6 @@ commands:
paths:
- "<< parameters.workingdir >>/<< parameters.platform >>/<< parameters.sdk_version >>"
deploy_turtle:
parameters:
platform:
type: string
env:
type: string
steps:
- checkout
- run:
name: Install curl & jq
command: nix-env -iA nixpkgs.curl nixpkgs.jq
- run:
name: Schedule a Turtle deploy
command: |
echo "We're going to deploy << parameters.platform >> Turtles to << parameters.env >>"
./scripts/deploy.sh "<< parameters.platform >>" "<< parameters.env >>"
jobs:
build:
executor: nix
@@ -220,34 +203,6 @@ jobs:
sdk_version: sdk32
platform: android
android_staging_deploy:
executor: nix
steps:
- deploy_turtle:
platform: android
env: staging
android_production_deploy:
executor: nix
steps:
- deploy_turtle:
platform: android
env: production
ios_staging_deploy:
executor: nix
steps:
- deploy_turtle:
platform: ios
env: staging
ios_production_deploy:
executor: nix
steps:
- deploy_turtle:
platform: ios
env: production
workflows:
checks:
jobs:
@@ -257,25 +212,3 @@ workflows:
- unit_tests
- ios_smoke_tests
- android_smoke_tests
deploy:
jobs:
- android_staging_approve_deploy:
type: approval
- android_staging_deploy:
requires:
- android_staging_approve_deploy
- android_production_approve_deploy:
type: approval
- android_production_deploy:
requires:
- android_production_approve_deploy
- ios_staging_approve_deploy:
type: approval
- ios_staging_deploy:
requires:
- ios_staging_approve_deploy
- ios_production_approve_deploy:
type: approval
- ios_production_deploy:
requires:
- ios_production_approve_deploy
+6 -10
View File
@@ -8,20 +8,16 @@ source_local() {
watch_file $file
}
source_up || true
source_local
if [[ "$CI" != "true" && (-z "$GITHUB_TOKEN" || -z "$CIRCLE_API_USER_TOKEN") ]]; then
yellow=`tput setaf 3`
reset=`tput sgr0`
echo "${yellow}please set GITHUB_TOKEN and CIRCLE_API_USER_TOKEN env variables in .envrc.local file if you wish to release turtle-cli"
echo "run 'cp .envrc.local.example .envrc.local' if you don't have one yet and edit the new file${reset}"
fi
export NODE_ENV=development
export EXPO_TURTLE_TOOLS_DIR="$(pwd)/tools"
PATH_add $EXPO_TURTLE_TOOLS_DIR/bin
if [ "$CI" = "true" ]; then
PATH_add $EXPO_TURTLE_TOOLS_DIR/ci/bin
if [ -z "$EXPO_UNIVERSE_DIR" ]; then
PATH_add $EXPO_TURTLE_TOOLS_DIR/bin
if [ "$CI" = "true" ]; then
PATH_add $EXPO_TURTLE_TOOLS_DIR/ci/bin
fi
fi
-2
View File
@@ -1,2 +0,0 @@
export GITHUB_TOKEN=__PUT_YOUR_GITHUB_TOKEN_HERE__ # follow the guide to create one: https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line
export CIRCLE_API_USER_TOKEN=__PUT_YOUR_CIRCLECI_API_TOKEN_HERE__ # create one here: https://circleci.com/account/api
-38
View File
@@ -1,38 +0,0 @@
---
name: "\U0001F41B Bug Report"
about: You want to report a reproducible bug or regression in turtle-cli.
title: ''
labels: 'bug'
assignees: ''
---
<!-- Thanks for helping expo! Before you submit your issue, please make sure you followed our checklist and check the appropriate boxes by putting an x in the [ ]: [x] -->
### New Issue Checklist
- [ ] Updated turtle-cli to the latest version (`yarn global add turtle-cli` or `npm install --global turtle-cli`).
- [ ] I read the [Contribution Guidelines](https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [ ] I read [docs.expo.io](https://docs.expo.io) (Managed Workflow > Distributing Your App).
- [ ] I searched for [existing GitHub issues](https://github.com/expo/turtle/issues).
- [ ] **I enclosed the complete output when running turtle, including the stack trace and command used.**
### Issue Description
<!-- Please include what's happening, expected behavior, and any relevant code samples -->
##### Command executed
<!-- The command you executed on the command line that resulted in an error -->
##### Complete output when running turtle, including the stack trace and command used
<details>
<pre> [PUT LOGS HERE] </pre>
</details>
### Environment
<!-- Please run `expo diagnostics` and copy the output below. This will help us help you. -->
<details>
<pre> [PUT OUTPUT HERE] </pre>
</details>
-22
View File
@@ -1,22 +0,0 @@
---
name: "\U0001F64B Feature Request"
about: Want us to add something to turtle-cli?
title: ''
labels: 'enhancement'
assignees: ''
---
### Feature Request
#### Motivation Behind Feature
<!-- Why should this feature be implemented? What problem does it solve? -->
#### Feature Description
<!-- Describe your feature request in detail -->
<!-- Please provide any code examples or screenshots of what this feature would look like -->
<!-- Are there any drawbacks? Will this break anything for existing users? -->
#### Alternatives or Workarounds
<!-- Describe alternatives or workarounds you are currently using -->
<!-- Are there ways to do this with existing commands? -->
-21
View File
@@ -1,21 +0,0 @@
---
name: "\U00002753 Questions and discussions"
about: You have a question about turtle-cli or want to discuss some aspects of turtle-cli.
title: ''
labels: 'question'
assignees: ''
---
### Question Checklist
- [ ] I read the [Contribution Guidelines](https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [ ] I read [docs.expo.io](https://docs.expo.io) (Managed Workflow > Distributing Your App).
- [ ] I searched for [existing GitHub issues](https://github.com/expo/turtle/issues).
### Question Subject
<!-- What command do you have a question about? -->
<!-- Is this a question about documentation? -->
#### Question Description
<!-- Please include expected behavior and any relevant code samples with your question if possible -->
+11
View File
@@ -0,0 +1,11 @@
# Why
Please describe the motivation for this PR, and link to relevant GitHub issues, forums posts, or feature requests.
# How
How did you build this feature or fix this bug and why?
# Test Plan
Please describe how you tested this change and how a reviewer could reproduce your test, especially if this PR does not include automated tests! If possible, please also provide terminal output and/or screenshots demonstrating your test/reproduction.
-15
View File
@@ -1,15 +0,0 @@
<!-- Thanks for contributing to _turtle_! Before you submit your pull request, please make sure to check the following boxes by putting an x in the [ ] (don't: [x ], [ x], do: [x]) -->
### Checklist
- [ ] I've read the [Contribution Guidelines](https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [ ] I've updated the [CHANGELOG](https://github.com/expo/turtle/blob/master/CHANGELOG.md) if necessary.
- [ ] I've ensured the unit and smoke tests are still passing - either by running `yarn test:unit` and `yarn test:smoke:[ios|android]` or by checking the appropriate CircleCI builds' statuses.
- [ ] **I've manually tested whether the changes I made work as expected.**
### Motivation and Context
<!-- Why is this change required? What problem does it solve? -->
<!-- If it fixes an open issue, please link to the issue here. -->
### Description
<!-- Describe your changes in detail -->
<!-- Please describe in detail how you tested your changes. -->
-2
View File
@@ -12,5 +12,3 @@ shell.apk
*.swp
*.swo
.envrc.local
-3
View File
@@ -8,8 +8,5 @@
},
"github": {
"release": true
},
"hooks": {
"after:release": "yarn release:update:turtle-cli-example"
}
}
-1
View File
@@ -6,4 +6,3 @@ SENTRY_DSN=""
ENVIRONMENT="development"
REDIS_URL="redis://localhost:6379/0"
REDIS_CONFIG_URL="redis://localhost:6379/0"
TURTLE_SDK_VERSIONS_SECRET_TOKEN="xeiw7yigha<a_r5aich!oW9Ik2eish8the9Na6Jae-ghoo5ua/t8nu5AeheiTew4"
+4 -245
View File
@@ -1,426 +1,185 @@
# Changelog
All notable changes to this project will be documented in this file.
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
## [0.12.9] - 2019-11-14
## [Unreleased]
### Added
- Support for customizing Facebook SDK behavior at buildtime (autoinitialization, logging app events, logging Advertiser ID) (https://github.com/expo/expo/pull/5924)
## [0.12.8] - 2019-10-29
### Changed
- Updated Android shell app for SDK 35 to fix `Linking.openUrl` not opening app if it's already foregrounded (https://github.com/expo/expo/issues/6058)
- Enforce Java 8 when using turtle-cli.
## [0.12.7] - 2019-10-25
### Changed
- Updated Android shell app for SDK 35 to fix occasional crash in background due to GCM registration service (https://github.com/expo/expo/issues/4207)
## [0.12.5] - 2019-10-18
### Changed
- Updated iOS shell app for SDK 35 to fix crash when calling `WebBrowser.dismissBrowser` on iOS 13 (https://github.com/expo/expo/issues/5742)
## [0.12.4] - 2019-10-11
### Changed
- Updated Android shell app for SDK 35 to fix occasional crash on launch (https://github.com/expo/expo/issues/5917)
## [0.12.3] - 2019-10-09
### Changed
- Updated iOS client shell app for SDK 35 to fix it from crashing on startup due to having an incomplete GoogleService-Info.plist file.
## [0.12.2] - 2019-09-27
### Changed
- Updated Android shell app for SDK 35 to fix crash on Android <=7 due to battery module
## [0.12.1] - 2019-09-20
### Changed
- Updated iOS shell apps for SDK 33 and 34 to fix iOS 13 issues with fishhook, notification tokens, and ShareSheet
- Updated iOS shell app for SDK 35 with a minor fix
## [0.12.0] - 2019-09-19
### Added
- Support for SDK 35 iOS and Android builds.
### Removed
- Support for SDK 27-30 iOS and Android builds.
## [0.11.3] - 2019-09-19
### Changed
- Updated SDK34 Android shell app with `expo-branch` fixes.
## [0.11.2] - 2019-08-21
### Added
- Support for GoogleService-Info.plist (>=34.0.0).
## [0.11.1] - 2019-08-08
### Changed
- Updated iOS client shell app with the latest fixes (up to 2.12.3).
## [0.11.0] - 2019-08-07
### Changed
- Enabled back optional modules support, but only for specific unimodules.
- Updated SDK34 Android shell app with the latest fixes (up to 2.12.2).
- Updated SDK34 iOS shell app with the latest fixes (up to 2.12.3).
## [0.10.0] - 2019-08-01
### Changed
- Fully disabled optional modules on Android for now.
- Updated iOS shell apps for SDK 33 and 34 to fix scoped permissions issue.
- Updated Android shell app for SDK 34 to work after disabling optional modules.
## [0.9.1] - 2019-07-29
### Changed
- `release-it` version to `12.3.4`.
## [0.9.0] - 2019-07-29
### Added
- Android, iOS standalone shell apps and iOS Expo client shell app for SDK34.
- Xcode license check for iOS builds.
### Fixed
- Setting `Constants.nativeAppVersion` for Android standalone builds (actually fixed in [expo/expo-cli#878](https://github.com/expo/expo-cli/pull/878)).
- Passing `expo.android.config` object from `app.json` to the Android builder.
- Fixed crash on launch for iOS standalone apps on iOS 13 (all SDK versions).
- Fixed occasional issue on iOS (SDK 33) where the JS bundle cannot be found ("No cache exists for this resource: shell-app.bundle") and a reload would be required.
## [0.8.11] - 2019-07-16
### Fixed
- Android debug builds.
## [0.8.10] - 2019-07-16
### Fixed
- iOS simulator builds.
## [0.8.9] - 2019-07-15
### Fixed
- User authentication.
## [0.8.8] - 2019-07-11
### Fixed
- LocalAuthentication module on iOS (fixes [expo/expo#663](https://github.com/expo/expo/issues/663)).
## [0.8.7] - 2019-07-05
### Added
- Adhoc Builds: use provisioningProfileId if specified.
- Registering supported SDK versions in Redis.
- Support for 64 bit builds in SDK33.
## [0.8.6] - 2019-06-25
### 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.
- Schema for `buildModes`.
- Updated @expo/xdl to 55.0.7 (fixed reading from binary plist).
## [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
- Running Android Turtle process with `supervisor` (pod is restarted if there were 5 failures in the last 10 minutes).
### Changed
- `turtle-cli` is now fetching the app manifest before running the build.
## [0.8.2] - 2019-06-11
### Changed
- Updated Android shell app for SDK33 to remove `expo-face-detector` and `expo-payments-stripe` from standalone builds.
- Updated Android shell app for SDK33 to get rid of `node_modules` for `tools-public`.
- From now on, `turtle-cli` installs dependencies for `tools-public` in shell apps for SDK versions < 33.
### Fixed
- Android builds with turtle-cli by installing all unmodules if `dependencies` is empty.
## [0.8.1] - 2019-06-10
### Changed
- Add expo dependencies when resolving unimodules.
### Fixed
- Support for Android tarballs without `universe-package.json`.
## [0.8.0] - 2019-06-07
### Added
- Turtle CLI logo to the project (created by [@zularizal](https://github.com/zularizal))!
- Shell apps for SDK 33.
- Support for Android App Bundles (App bundles are built by default, use `-t apk` to build apk).
### Changed
- Updated Android shell app for SDK 32 to fix AppAuth issue (https://github.com/expo/expo/pull/4115) and to fix a newer than expected JSC version.
- Default value for build timeout to 15 minutes.
- Added filtering of logs (strips out download progress) when downloading SDK tools.
- `xdl` -> `@expo/xdl`, updated `@expo/xdl`.
### Fixed
- Generating Android keystore in turtle when one is not passed to turtle-cli (https://github.com/expo/turtle/pull/65).
- Upload logs to s3 if build has been canceled or timed out.
- Unhandled exception on asset download (xdl).
## [0.7.2] - 2019-05-09
### Added
- Support for Android tarballs without `universe-package.json`.
### Changed
- Upgraded `@expo/traveling-fastlane-darwin` to 1.9.4 (fixes issues with generating provisioning profiles for ad-hoc builds).
### Removed
- Support for `CLIENT_LOGGER_LEVEL` env variable.
## [0.7.1] - 2019-05-06
### Fixed
- Resolving `fastlane` version when `LC_ALL` is not set.
## [0.7.0] - 2019-05-06
### Added
- Support for custom Android builds.
### Changed
- Refactored logger.
### Fixed
- `platform` log field wrongly set to `ios` for Android builds (when using `turtle-cli`).
- Brought back `jobID` and `experienceName` fields to Android logs.
## [0.6.1] - 2019-04-23
### Added
- Checking fastlane version before running build (turtle-cli).
### Changed
- Updated iOS shell app for SDK 32 to fix AppAuth issue.
- Babel replaced by ttypescript.
- Updated xdl to 53.5.3 and @expo/spawn-async to 1.4.2, so that error stack traces should be more informative now.
### Fixed
- Brought back `jobID` and `experienceName` fields to GCloud logs.
### Removed
- `buidAndroidTarballLocally.sh` script (it has been moved to expo repository - [expo/expo#4022](https://github.com/expo/expo/pull/4022)).
## [0.6.0] - 2019-04-09
### Changed
- Removed Branch module from Android shell apps for all SDK versions.
## [0.5.15] - 2019-04-03
### Added
- Turtle smoke tests are now being executed on CircleCI from the context of this repository.
### Changed
- Updated iOS shell app for SDK 32 (fixes [this loading issue for slow connections](https://github.com/expo/expo/issues/3574)).
- Minor infra changes (doesn't affect users).
- Error logs format - error objects are now passed in an object being passed as the first argument to logger function.
### Removed
- Sending logs to loggly.
## [0.5.14] - 2019-03-22
### Added
- `--config` parameter for turtle-cli commands, which allows to specify a custom path to app.json file
### Changed
- Updated iOS shell app for SDK 32 (fixes [this notifications issue](https://github.com/expo/expo/issues/3663)).
## [0.5.13] - 2019-03-12
### Added
- Android SDK version support validation.
### Changed
- iOS Enterprise builds don't compile bitcode now.
## [0.5.12] - 2019-02-26
### Added
- Google Cloud logger (as a bunyan stream).
### Changed
- Android builder passes the manifest from a build job message if it's available.
## [0.5.11] - 2019-02-22
### Added
- Builder for iOS client apps.
## [0.5.10] - 2019-02-19
### Added
- Registering Turtle version in Redis.
### Changed
- Update Android shell app for SDK 32 to fix [update](https://github.com/expo/expo/issues/3504) and [back button](https://github.com/expo/expo/issues/1786) issues.
## [0.5.9] - 2019-02-06
- Update iOS shell app for SDK 32 (fixes bare notifications [issue](https://github.com/expo/expo/issues/3223)).
## [0.5.7] - 2019-01-31
- Update Android shell app for SDK 32 to fix bundled assets issue.
## [0.5.6] - 2019-01-25
- Update iOS shell app for SDK 30, 31 and 32 (built with xcode 10.1).
## [0.5.5] - 2019-01-24
### Added
- Sending build duration in AWS SQS messages (of `FINISHED` and `ERRORED` types).
## [0.5.4] - 2019-01-22
### Changed
- Update iOS shell app for SDK32 to [`expo/expo#0847c10`](https://github.com/expo/expo/commit/0847c1073d38c366866f3d9279ddd662da47dc9b), i.e. v2.10.3 with fixed WebView navigation scheme and upgraded Facebook SDK.
## [0.5.3] - 2019-01-21
### Fixed
- Building Android standalone apps ([not accepted license issue](https://github.com/expo/expo/issues/3266)) - updated Android build tools (`build-tools;28.0.3`, `platforms;android-28`).
## [0.5.2] - 2019-01-18
### Added
- The link (in README) to the repository containing `turtle-cli` usage example.
- [Contributing guide](CONTRIBUTING.md).
- [Code of Conduct](CODE_OF_CONDUCT.md).
### Removed
- `eslint`
### Changed
- Fix all `tslint` errors.
## [0.5.1] - 2019-01-16
### Changed
- Update Android shell app for SDK32 that includes `[email protected]`.
## [0.5.0] - 2019-01-16
### Added
- Turtle version is added to the `onFinish` and `onError` build messages.
### Changed
- A version property value being sent to the queue. It's now the version number
from `package.json` instead of `new`/`old` indicator.
from `package.json` instead of `new`/`old` indicator.
### Removed
- `--push-p12-path` parameter for `turtle build:ios` command,
a Push Notifications Certificate is no longer required to perform a successful
iOS standalone app build.
a Push Notifications Certificate is no longer required to perform a successful
iOS standalone app build.
## [0.4.3] - 2019-01-09
### Changed
- Update iOS shell app for SDK32.
- Update Android shell app for SDK32.
+5 -2
View File
@@ -16,6 +16,9 @@ This repository contains the codebase for the `turtle-cli` NPM package. The same
### Branches
The `master` branch of the repository should be kept releasable at any time. This way we can continuously release fixes and improvements without costly managing of different branches and issues will be noticed and fixed quickly. This also ensures other contributors can check out the latest version from GitHub and work on it with minimal disruption from other features in progress.
## Setting up the repository for development
*TODO*
## Submitting a pull request
To submit a pull request:
1. Fork the [repository](https://github.com/expo/turtle) and create a feature branch. (Existing contributors can create feature branches without forking. Prefix the branch name with `@your-github-username/`.)
@@ -24,7 +27,7 @@ To submit a pull request:
4. Wait for a review and adjust the code if necessary.
## Publishing a release
- Make sure you have set `GITHUB_TOKEN` and `CIRCLE_API_USER_TOKEN` environment variables in `.envrc.local` file. If you don't have the file, run `cp .envrc.local.example .envrc.local` and edit the file.
- To release a new version of `turtle-cli`, run `yarn release` command.
- If you wish to release a new *beta* version of `turtle-cli`, run `yarn release:beta` instead.
- Update the [changelog](CHANGELOG.md).
- Update [Changelog](CHANGELOG.md).
- In a terminal, `cd` into [expo/turtle-cli-example](https://github.com/expo/turtle-cli-example) repository, run `yarn update-turtle-cli-version` (this script updates `turtle-cli` version number in CI configuration files and commits the changes) and then run `git push`. Thanks!
-35
View File
@@ -1,35 +0,0 @@
# Turtle Development
## Prerequisites
- Working `www` service, see [this README](https://github.com/expo/universe/tree/master/server/www/README.md) for more details.
- Own AWS SQS queues. See [this README](https://github.com/expo/universe/tree/master/terraform/turtle-queues/README.md) to learn more.
## Setup
- Run `update-local-secrets` to populate the `.secrets*` files. You'll need to run this any time any secret changes (it shouldn't be very often).
- Run `EXPO_UNIVERSE_DIR=/path/to/universe/dir yarn secrets:init-private YOUR_SQS_NICKNAME`. Alternatively, you can create `.secrets.local-queue` file with the SQS queues' urls yourself (`AWS_SQS_OUT_QUEUE_URL`, `AWS_SQS_ANDROID_QUEUE_URL`, `AWS_SQS_ANDROID_PRIORITY_QUEUE_URL`, `AWS_SQS_IOS_QUEUE_URL`, `AWS_SQS_IOS_PRIORITY_QUEUE_URL`)
- Run `yarn set-workingdir:local` or `yarn set-workingdir:remote`:
- `:local` creates symlinks to the shell apps in `expo` repository (_unfortunately this is currently broken_)
- `:remote` downloads precompiled shell apps
- Run `yarn` to install node modules.
- Run `yarn start:ios` or `yarn start:android` to run Turtle.
## Updating shell apps
_TODO_
## Generating recording files for smoke tests
Smoke tests are powered by [Nock](https://www.npmjs.com/package/nock) which uses JSON files containing responses to the HTTP requests fired by the build process.
To record new responses remove old `recording.json` and run tests and then manually schedule a build with `expo-cli` tool.
As a precaution, the file with HTTP requests/responses contains, among other things, iOS certificates used for the test build, is
encrypted with `git-crypt`. Remember not to revoke them, because then the tests will fail.
## Other notes
Turtle uses Redis to get notifications (from www) about builds cancellations. To make this feature working, you have to use the same Redis instance as www. Therefore, you need to remember about starting www before starting Turtle. If you forget about it, don't worry, Turtle will remind you to run `yarn start-docker` in `server/www` directory.
Turtle uploads build artifacts to S3. This could take some time if you have a poor internet connection. To facilitate local development, there is a feature which allows Turtle to fake artifacts upload. `secrets:init-private` script, which you should have run while setting up Turtle, sets fake upload directory to your user's default `Downloads` directory (we're assuming you're using Mac). If you need to test uploading artifacts to S3, you have to edit `.secrets.local` file and comment or remove `TURTLE_FAKE_UPLOAD` and `TURTLE_FAKE_UPLOAD_DIR` environment variables.
+90 -2
View File
@@ -1,5 +1,93 @@
# see docker-base/Dockerfile to learn what's installed in the turtle-android-base image
FROM gcr.io/exponentjs/turtle-android-base:0.1.0
FROM openjdk:8u141
ENV DEBIAN_FRONTEND noninteractive
# https://github.com/yarnpkg/yarn/issues/2821
RUN apt-get update && apt-get install apt-transport-https
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
# Install dependencies
RUN dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -yq \
ant\
build-essential\
bzip2:i386\
file\
lib32ncurses5\
lib32z1\
libc6:i386\
libncurses5:i386\
libstdc++6:i386\
rsync\
unzip\
yarn\
zlib1g:i386\
supervisor\
--no-install-recommends && \
apt-get clean
ENV NPM_CONFIG_LOGLEVEL warn
ENV NODE_VERSION 8.12.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
# Download and untar SDK
ENV ANDROID_HOME /usr/local/android-sdk-linux
ENV ANDROID_SDK /usr/local/android-sdk-linux
ENV ANDROID_SDK_URL https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
RUN mkdir -p ${ANDROID_HOME} && \
curl -L "${ANDROID_SDK_URL}" > ${ANDROID_HOME}/sdk.zip && \
cd ${ANDROID_HOME} && \
unzip -qq sdk.zip && \
rm sdk.zip && \
mkdir -p ${HOME}/.android && \
touch ${HOME}/.android/repositories.cfg
ENV PATH ${ANDROID_HOME}/platform-tools:${PATH}
ENV PATH ${ANDROID_HOME}/tools:${PATH}
ENV PATH ${ANDROID_HOME}/tools/bin:${PATH}
ENV PATH ${ANDROID_HOME}/build-tools/28.0.3/:${PATH}
ADD scripts/android/configureAndroidSdk.sh /tmp/configureAndroidSdk.sh
RUN /tmp/configureAndroidSdk.sh --install-all-platforms
# Install Android NDK
ENV ANDROID_NDK_VERSION android-ndk-r10e
ENV ANDROID_NDK_FILE ${ANDROID_NDK_VERSION}-linux-x86_64.bin
ENV ANDROID_NDK_URL https://dl.google.com/android/ndk/${ANDROID_NDK_FILE}
ENV ANDROID_NDK /opt/${ANDROID_NDK_VERSION}
ENV PATH $ANDROID_NDK:$PATH
# i have no clue why some of this is here, but it's working elsewhere
# it appears to install the NDK version expo needs, so that's cool
RUN mkdir /ndk_setup && cd /ndk_setup && \
curl -L ${ANDROID_NDK_URL} > ${ANDROID_NDK_FILE} && \
chmod +x ${ANDROID_NDK_FILE} && \
sync && \
./${ANDROID_NDK_FILE} && \
mv ./${ANDROID_NDK_VERSION} ${ANDROID_NDK} && \
cp -R \
${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 \
${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86 && \
cp -R \
${ANDROID_NDK}/toolchains/x86-4.8/prebuilt/linux-x86_64 \
${ANDROID_NDK}/toolchains/x86-4.8/prebuilt/linux-x86 && \
cd && rm -rf /ndk_setup
# Support Gradle
ENV TERM dumb
# Install gradle
RUN wget https://services.gradle.org/distributions/gradle-4.4-all.zip
RUN unzip -qq gradle-4.4-all.zip
RUN mv gradle-4.4 /usr/local
RUN rm gradle-4.4-all.zip
ENV GRADLE_HOME /usr/local/gradle-4.4
ENV PATH ${GRADLE_HOME}/bin:$PATH
ADD . /app/turtle
+6 -6
View File
@@ -15,20 +15,21 @@ Turtle CLI is a command line interface for building Expo standalone apps.
You can use it both on your CI and your private computer.
- [Changelog](CHANGELOG.md)
- [Contributing](CONTRIBUTING.md)
- [Development](DEVELOPMENT.md)
- [Contributing to Turtle CLI](CONTRIBUTING.md)
- [Code of Conduct](CODE_OF_CONDUCT.md)
## Installation
## Glossary
- **Turtle** - script which takes a shell app, fills it with user's code and produces a standalone app
- **Shell app** — precompiled (in case of iOS builds) Expo app which doesn't have user's code
- **Standalone app** - .ipa/.apk file, a user uploads standalone apps to the Google Play Store/Apple App Store
## Installation
[Installation instructions and documentation here.](https://docs.expo.io/versions/latest/distribution/turtle-cli)
## Usage example
See the [expo/turtle-cli-example](https://github.com/expo/turtle-cli-example) repository to learn how to use Turtle CLI in order to build Expo standalone apps on your CI.
## Do you need help?
- Make sure you've read [the Expo Docs](https://docs.expo.io/), especially [Building Standalone Apps on Your CI
](https://docs.expo.io/versions/latest/distribution/turtle-cli) and [Building Standalone Apps](https://docs.expo.io/versions/latest/distribution/building-standalone-apps) guides.
- Search for existing GitHub issues [in this repository](https://github.com/expo/turtle/issues) and in [expo/expo](https://github.com/expo/expo/issues) repository.
@@ -38,6 +39,5 @@ See the [expo/turtle-cli-example](https://github.com/expo/turtle-cli-example) re
* ask a question on [Expo Developers Slack](http://slack.expo.io).
## License
The Turtle CLI source code is made available under the [MIT license](LICENSE).
Some of the dependencies are licensed differently, with the BSD license, for example.
-92
View File
@@ -1,92 +0,0 @@
# If you ever need to rebuild this, run:
# yarn docker:build-and-push:android-base-image NEW_IMAGE_SEMVER
FROM openjdk:8u141
ENV DEBIAN_FRONTEND noninteractive
# https://github.com/yarnpkg/yarn/issues/2821
RUN apt-get update && apt-get install apt-transport-https
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
# Install dependencies
RUN dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -yq \
ant\
build-essential\
bzip2:i386\
file\
lib32ncurses5\
lib32z1\
libc6:i386\
libncurses5:i386\
libstdc++6:i386\
rsync\
unzip\
yarn\
zlib1g:i386\
supervisor\
--no-install-recommends && \
apt-get clean
ENV NPM_CONFIG_LOGLEVEL warn
ENV NODE_VERSION 8.12.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
# Download and untar SDK
ENV ANDROID_HOME /usr/local/android-sdk-linux
ENV ANDROID_SDK /usr/local/android-sdk-linux
ENV ANDROID_SDK_URL https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
RUN mkdir -p ${ANDROID_HOME} && \
curl -L "${ANDROID_SDK_URL}" > ${ANDROID_HOME}/sdk.zip && \
cd ${ANDROID_HOME} && \
unzip -qq sdk.zip && \
rm sdk.zip && \
mkdir -p ${HOME}/.android && \
touch ${HOME}/.android/repositories.cfg
ENV PATH ${ANDROID_HOME}/platform-tools:${PATH}
ENV PATH ${ANDROID_HOME}/tools:${PATH}
ENV PATH ${ANDROID_HOME}/tools/bin:${PATH}
ENV PATH ${ANDROID_HOME}/build-tools/28.0.3/:${PATH}
ADD scripts/android/configureAndroidSdk.sh /tmp/configureAndroidSdk.sh
RUN /tmp/configureAndroidSdk.sh --install-all-platforms
# Install Android NDK
ENV ANDROID_NDK_VERSION android-ndk-r10e
ENV ANDROID_NDK_FILE ${ANDROID_NDK_VERSION}-linux-x86_64.bin
ENV ANDROID_NDK_URL https://dl.google.com/android/ndk/${ANDROID_NDK_FILE}
ENV ANDROID_NDK /opt/${ANDROID_NDK_VERSION}
ENV PATH $ANDROID_NDK:$PATH
# i have no clue why some of this is here, but it's working elsewhere
# it appears to install the NDK version expo needs, so that's cool
RUN mkdir /ndk_setup && cd /ndk_setup && \
curl -L ${ANDROID_NDK_URL} > ${ANDROID_NDK_FILE} && \
chmod +x ${ANDROID_NDK_FILE} && \
sync && \
./${ANDROID_NDK_FILE} && \
mv ./${ANDROID_NDK_VERSION} ${ANDROID_NDK} && \
cp -R \
${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 \
${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86 && \
cp -R \
${ANDROID_NDK}/toolchains/x86-4.8/prebuilt/linux-x86_64 \
${ANDROID_NDK}/toolchains/x86-4.8/prebuilt/linux-x86 && \
cd && rm -rf /ndk_setup
# Support Gradle
ENV TERM dumb
# Install gradle
RUN wget https://services.gradle.org/distributions/gradle-4.4-all.zip
RUN unzip -qq gradle-4.4-all.zip
RUN mv gradle-4.4 /usr/local
RUN rm gradle-4.4-all.zip
ENV GRADLE_HOME /usr/local/gradle-4.4
ENV PATH ${GRADLE_HOME}/bin:$PATH
@@ -138,11 +138,6 @@ spec:
secretKeyRef:
name: turtle-js-config
key: datadog_app_key
- name: TURTLE_SDK_VERSIONS_SECRET_TOKEN
valueFrom:
secretKeyRef:
name: turtle-js-config
key: turtle_sdk_versions_secret_token
# other vars
- name: GRADLE_DAEMON_DISABLED
value: "1"
+21 -12
View File
@@ -1,6 +1,6 @@
{
"name": "turtle-cli",
"version": "0.12.9",
"version": "0.8.6",
"description": "The command-line tool for building standalone Expo apps",
"preferGlobal": true,
"scripts": {
@@ -17,6 +17,11 @@
"secrets:init-private": "./scripts/initPrivateSecrets.sh",
"set-workingdir:remote": "./scripts/setWorkingdirMode.sh remote",
"set-workingdir:local": "./scripts/setWorkingdirMode.sh local",
"docker:pull": "retry5 gcloud docker -- pull gcr.io/exponentjs/turtle-android:latest",
"docker:pull:tag": "retry5 gcloud docker -- pull gcr.io/exponentjs/turtle-android:${TAG}",
"docker:build": "yarn build:production android && gcloud docker -- build -t gcr.io/exponentjs/turtle-android:latest -t gcr.io/exponentjs/turtle-android:${TAG} .",
"docker:push": "retry5 gcloud docker -- push gcr.io/exponentjs/turtle-android:${TAG} && retry5 gcloud docker -- push gcr.io/exponentjs/turtle-android:latest",
"deploy:android": "./scripts/android/deploy.sh",
"test": "yarn jest",
"test:integration": "yarn test --config jest/integration-config.json",
"test:unit": "yarn test --config jest/unit-config.json",
@@ -25,8 +30,18 @@
"test:smoke:ios": "PLATFORM=ios yarn test:smoke --testNamePattern=iOS",
"release": "./scripts/release.sh",
"release:beta": "./scripts/releaseBeta.sh",
"release:update:turtle-cli-example": "./scripts/updateTurtleCliExampleRepo.sh",
"docker:build-and-push:android-base-image": "./scripts/android/buildAndPushAndroidBaseImage.sh"
"ssh:android:pods-names": "./scripts/ssh/findAndroidPods.sh",
"ssh:android:connect": "./scripts/ssh/connectToAndroidPod.sh",
"ssh:ios:ips": "./scripts/ssh/findIosIps.sh",
"set-priorities": "yarn set-priorities:local",
"set-priorities:default": "expenv ts-node -r tsconfig-paths/register --files src/scripts/setConfigurations.ts",
"set-priorities:local": "EXPENV_OVERRIDES=local-common,local,local-queue yarn set-priorities:default",
"set-priorities:staging": "yarn set-priorities:default",
"set-priorities:production": "EXPENV_OVERRIDES=prod yarn set-priorities:default",
"set-replica-count:default": "expenv ts-node -r tsconfig-paths/register --files src/scripts/setReplicaCount.ts | bunyan -o short -l debug",
"set-replica-count:local": "EXPENV_OVERRIDES=local-common,local,local-queue yarn set-replica-count:default",
"set-replica-count:staging": "yarn set-replica-count:default",
"set-replica-count:production": "EXPENV_OVERRIDES=prod yarn set-replica-count:default"
},
"husky": {
"hooks": {
@@ -65,30 +80,25 @@
"registry": "https://registry.npmjs.org/"
},
"devDependencies": {
"@expo/babel-preset-cli": "^0.1.3",
"@types/decompress": "^4.2.3",
"@types/fs-extra": "^5.0.4",
"@types/jest": "^23.3.9",
"@types/joi": "^13.4.3",
"@types/lodash": "^4.14.129",
"@types/npm-package-arg": "^6.1.0",
"@types/progress": "^2.0.1",
"@types/raven": "^2.5.1",
"@types/request": "^2.47.1",
"@types/request-promise": "^4.1.44",
"@types/semver": "^6.0.0",
"@types/sharp": "^0.17.8",
"@types/tar": "^4.0.0",
"@types/uuid": "^3.4.3",
"@types/webpack": "^4.32.1",
"@types/webpack-dev-server": "^3.1.7",
"@types/which": "^1.3.1",
"husky": "^1.3.1",
"jest": "^23.6.0",
"lint-staged": "^8.1.5",
"nock": "^10.0.1",
"nodemon": "^1.18.11",
"release-it": "^12.3.4",
"release-it": "^10.0.0",
"rimraf": "^2.6.2",
"ts-jest": "^23.10.4",
"ts-node": "^8.0.3",
@@ -101,7 +111,7 @@
},
"dependencies": {
"@expo/spawn-async": "^1.4.2",
"@expo/xdl": "56.5.0",
"@expo/xdl": "55.0.7",
"@google-cloud/logging-bunyan": "^0.9.5",
"async-retry": "^1.2.1",
"aws-sdk": "^2.226.1",
@@ -121,7 +131,6 @@
"raven": "^2.6.2",
"request": "^2.88.0",
"request-progress": "^3.0.0",
"request-promise": "^4.2.5",
"semver": "^6.0.0",
"sharp": "0.22.1",
"source-map-support": "^0.5.6",
@@ -130,6 +139,6 @@
"which": "^1.3.1"
},
"optionalDependencies": {
"@expo/traveling-fastlane-darwin": "1.9.9"
"@expo/traveling-fastlane-darwin": "1.9.4"
}
}
@@ -1,22 +0,0 @@
#!/usr/bin/env bash
set -eo pipefail
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../.. && pwd )"
IMAGE_TAG="$1"
if [[ -z "$IMAGE_TAG" ]]; then
echo "usage: yarn docker:build:android-base-image IMAGE_SEMVER"
exit 1
fi
IMAGE_VERSION_FULL_NAME="gcr.io/exponentjs/turtle-android-base:$IMAGE_TAG"
IMAGE_LATEST_FULL_NAME="gcr.io/exponentjs/turtle-android-base:latest"
pushd $ROOT_DIR > /dev/null
echo docker build -f docker-base/Dockerfile -t "$IMAGE_VERSION_FULL_NAME" -t "$IMAGE_LATEST_FULL_NAME" .
echo "Successfully built $IMAGE_VERSION_FULL_NAME Docker image"
echo gcloud docker -- push "$IMAGE_VERSION_FULL_NAME"
echo gcloud docker -- push "$IMAGE_LATEST_FULL_NAME"
echo "Successfully pushed $IMAGE_VERSION_FULL_NAME Docker image to GCloud"
popd > /dev/null
-76
View File
@@ -1,76 +0,0 @@
#!/usr/bin/env bash
set -eo pipefail
SCRIPT_NAME=`basename "$0"`
DEPLOY_ENDPOINT_URL="https://circleci.com/api/v1.1/project/github/expo/turtle-deploy/tree/master"
if [[ -z "$1" || -z "$2" ]]; then
echo "usage: ${bold}$SCRIPT_NAME PLATFORM ENVIRONMENT [FORCE]${normal}"
exit 1
fi
PLATFORM="$1"
ENVIRONMENT="$2"
if [[ "$3" = "--force" ]]; then
FORCE_DEPLOY="true"
fi
if [[ "$PLATFORM" != "android" && "$PLATFORM" != "ios" ]]; then
echo "unsupported PLATFORM passed: ${bold}$PLATFORM${normal}"
echo "valid values are: ${bold}android${normal}, ${bold}ios${normal}"
exit 1
fi
if [[ "$ENVIRONMENT" != "staging" && "$ENVIRONMENT" != "production" ]]; then
echo "unsupported ENVIRONMENT passed: ${bold}$ENVIRONMENT${normal}"
echo "valid values are: ${bold}staging${normal}, ${bold}production${normal}"
exit 1
fi
if [[ ! -z "$CIRCLE_SHA1" ]]; then
TURTLE_COMMIT="$CIRCLE_SHA1"
elif [[ -z "$FORCE_DEPLOY" ]]; then
read -p "You're about to schedule a deploy, are you sure you want to deploy the current commit? (y/n) " -n 1 -r
echo # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "exiting..."
exit 0
else
TURTLE_COMMIT=`git log --pretty=format:%H -1`
fi
fi
if [[ -z "$TURTLE_BOT_CIRCLE_API_USER_TOKEN" ]]; then
echo "Please set the TURTLE_BOT_CIRCLE_API_USER_TOKEN env variable."
exit 1
fi
if [[ $FORCE_DEPLOY = "true" ]]; then
curl -X POST \
--header "Content-Type: application/json" \
-u $TURTLE_BOT_CIRCLE_API_USER_TOKEN: \
-d '
{
"build_parameters": {
"CIRCLE_JOB": "deploy_'$PLATFORM'",
"TURTLE_ENV": "'$ENVIRONMENT'",
"TURTLE_FORCE_DEPLOY": "true"
}
}' \
$DEPLOY_ENDPOINT_URL | jq -r .build_url
else
curl -X POST \
--header "Content-Type: application/json" \
-u $TURTLE_BOT_CIRCLE_API_USER_TOKEN: \
-d '
{
"build_parameters": {
"CIRCLE_JOB": "deploy_'$PLATFORM'",
"TURTLE_ENV": "'$ENVIRONMENT'",
"TURTLE_COMMIT": "'$TURTLE_COMMIT'"
}
}' \
$DEPLOY_ENDPOINT_URL | jq -r .build_url
fi
+4 -8
View File
@@ -13,17 +13,13 @@ fi
TURTLE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/.. && pwd )"
TERRAFORM_DIR="${EXPO_UNIVERSE_DIR}/terraform"
ANDROID_NORMAL=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_local_$1.aws_sqs_queue.jobs_android_in | head -1 | cut -d"=" -f2 | xargs`
ANDROID_PRIORITY=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_local_$1.aws_sqs_queue.jobs_android_in_priority | head -1 | cut -d"=" -f2 | xargs`
IOS_NORMAL=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_local_$1.aws_sqs_queue.jobs_ios_in | head -1 | cut -d"=" -f2 | xargs`
IOS_PRIORITY=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_local_$1.aws_sqs_queue.jobs_ios_in_priority | head -1 | cut -d"=" -f2 | xargs`
ANDROID=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_local_$1.aws_sqs_queue.jobs_android_in | head -1 | cut -d"=" -f2 | xargs`
IOS=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_local_$1.aws_sqs_queue.jobs_ios_in | head -1 | cut -d"=" -f2 | xargs`
OUT=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_local_$1.aws_sqs_queue.jobs_out | head -1 | cut -d"=" -f2 | xargs`
cat << EOF > $TURTLE_DIR/.secrets.local-queue
AWS_SQS_ANDROID_QUEUE_URL="$ANDROID_NORMAL"
AWS_SQS_ANDROID_PRIORITY_QUEUE_URL="$ANDROID_PRIORITY"
AWS_SQS_IOS_QUEUE_URL="$IOS_NORMAL"
AWS_SQS_IOS_PRIORITY_QUEUE_URL="$IOS_PRIORITY"
AWS_SQS_ANDROID_QUEUE_URL="$ANDROID"
AWS_SQS_IOS_QUEUE_URL="$IOS"
AWS_SQS_OUT_QUEUE_URL="$OUT"
EOF
-8
View File
@@ -4,14 +4,6 @@ set -eo pipefail
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/.. && pwd )"
if [[ -z "$GITHUB_TOKEN" || -z "$CIRCLE_API_USER_TOKEN" ]]; then
yellow=`tput setaf 3`
reset=`tput sgr0`
echo "${yellow}please set GITHUB_TOKEN and CIRCLE_API_USER_TOKEN env variables in .envrc.local file if you wish to release turtle-cli"
echo "run 'cp .envrc.local.example .envrc.local' if you don't have one yet and edit the new file${reset}"
exit 1
fi
$ROOT_DIR/node_modules/.bin/release-it
echo
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+36 -40
View File
@@ -6,44 +6,42 @@ DOWNLOAD_DIR="${EXPO_DOWNLOAD_DIR:-$HOME/Downloads}"
mkdir -p $DOWNLOAD_DIR
if [ ! -f "$ROOT_DIR/.secrets.local-queue" ]; then
echo "You need to run \"yarn secrets:init-private [SQS_NAME]\" or create the .secrets.local-queue file yourself with AWS_SQS_ANDROID_QUEUE_URL, AWS_SQS_ANDROID_PRIORITY_QUEUE_URL, AWS_SQS_IOS_QUEUE_URL, AWS_SQS_IOS_PRIORITY_QUEUE_URL and AWS_SQS_OUT_QUEUE_URL variables."
if [ ! -f "$ROOT_DIR/.secrets.local-queue" ]; then
echo "You need to run \"yarn secrets:init-private [SQS_NAME]\" or create .secrets.local-queue file yourself with AWS_SQS_ANDROID_QUEUE_URL, AWS_SQS_IOS_QUEUE_URL and AWS_SQS_OUT_QUEUE_URL variables."
exit 1
fi
# @dsokal: this is currently broken
#
# setup_local() {
# ensure_link_exists() {
# if [ ! -L "$2" ]; then
# ln -s $1 $2
# echo "$2 link created"
# fi
# }
# WORKINGDIR="$ROOT_DIR/workingdir/local"
#
# if [[ -d $WORKINGDIR ]]; then
# echo "Local workingdir already prepared"
# return
# fi
#
# if [[ -z "$EXPO_UNIVERSE_DIR" ]]; then
# echo "EXPO_UNIVERSE_DIR needs to be set"
# exit -1
# fi
#
# cd $EXPO_UNIVERSE_DIR/exponent && yarn
# cd $EXPO_UNIVERSE_DIR/exponent/tools-public && yarn && ./generate-dynamic-macros-android.sh
#
# mkdir -p $WORKINGDIR
# echo "$WORKINGDIR directory created"
#
# LINKS=("template-files" "package.json" "android" "expokit-npm-package" "packages" "client-builds" "cpp" "exponent-view-template" "ios" "shellAppBase-builds" "shellAppWorkspaces" "node_modules")
#
# for LINKNAME in ${LINKS[@]}; do
# ensure_link_exists "$EXPO_UNIVERSE_DIR/exponent/$LINKNAME" "$WORKINGDIR/$LINKNAME"
# done
# }
setup_local() {
ensure_link_exists() {
if [ ! -L "$2" ]; then
ln -s $1 $2
echo "$2 link created"
fi
}
WORKINGDIR="$ROOT_DIR/workingdir/local"
if [[ -d $WORKINGDIR ]]; then
echo "Local workingdir already prepared"
return
fi
if [[ -z "$EXPO_UNIVERSE_DIR" ]]; then
echo "EXPO_UNIVERSE_DIR needs to be set"
exit -1
fi
cd $EXPO_UNIVERSE_DIR/exponent && yarn
cd $EXPO_UNIVERSE_DIR/exponent/tools-public && yarn && ./generate-dynamic-macros-android.sh
mkdir -p $WORKINGDIR
echo "$WORKINGDIR directory created"
LINKS=("template-files" "package.json" "android" "expokit-npm-package" "packages" "client-builds" "cpp" "exponent-view-template" "ios" "shellAppBase-builds" "shellAppWorkspaces" "node_modules")
for LINKNAME in ${LINKS[@]}; do
ensure_link_exists "$EXPO_UNIVERSE_DIR/exponent/$LINKNAME" "$WORKINGDIR/$LINKNAME"
done
}
setup_remote() {
if [[ -d $ROOT_DIR/workingdir/android && -d $ROOT_DIR/workingdir/ios ]]; then
@@ -57,7 +55,7 @@ setup_remote() {
$ROOT_DIR/scripts/ios/fetchRemoteIosTarball.sh
fi
fi
for sdk in $ROOT_DIR/workingdir/android/* ; do
if [[ -f "$sdk/universe-package.json" ]]; then
mv $sdk/package.json $sdk/exponent-package.json
@@ -89,10 +87,8 @@ EOF
}
if [ "$1" == "local" ]; then
# setup_local
# switch_local
echo "Setting local workingdir is currently broken, sorry :("
exit -1
setup_local
switch_local
elif [ "$1" == "remote" ]; then
setup_remote
switch_remote
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
if [ -z "$1" ]; then
echo "Please provide an environment name as a first argument"
exit 1
fi
if [ -z "$2" ]; then
echo "Please provide a pod name as a second argument"
exit 1
fi
kubectl --namespace $1 exec -it $2 -- /bin/bash
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
ENVIRONMENT=${1:-production}
kubectl get pods --namespace $ENVIRONMENT | grep "turtle-android-" | sed -e "s/ */ /g" | cut -d" " -f1
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
ENVIRONMENT=${1:-production}
govc vm.ip -wait 5s turtle-js-"${ENVIRONMENT}"-*
-1
View File
@@ -22,6 +22,5 @@ export API_PORT="443"
export REDIS_URL="noop"
export REDIS_CONFIG_URL="noop"
export DATADOG_DISABLED="true"
export TURTLE_SDK_VERSIONS_SECRET_TOKEN="noop"
yarn test:smoke:android
-1
View File
@@ -20,7 +20,6 @@ export API_PORT="443"
export REDIS_URL="noop"
export REDIS_CONFIG_URL="noop"
export DATADOG_DISABLED="true"
export TURTLE_SDK_VERSIONS_SECRET_TOKEN="noop"
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../.. && pwd )"
SDK_VERSION=sdk32 $ROOT_DIR/scripts/ios/fetchRemoteIosTarball.sh
-1
View File
@@ -22,6 +22,5 @@ export API_PORT="443"
export REDIS_URL="noop"
export REDIS_CONFIG_URL="noop"
export DATADOG_DISABLED="true"
export TURTLE_SDK_VERSIONS_SECRET_TOKEN="noop"
yarn test:unit
-17
View File
@@ -1,17 +0,0 @@
#!/usr/bin/env bash
set -eo pipefail
DEPLOY_ENDPOINT_URL="https://circleci.com/api/v1.1/project/github/expo/turtle-cli-example/tree/updates-do-not-remove-me"
curl -X POST \
--header "Content-Type: application/json" \
-u $CIRCLE_API_USER_TOKEN: \
-d '
{
"build_parameters": {
"CIRCLE_JOB": "update",
"TURTLE_TAG": "latest"
}
}' \
$DEPLOY_ENDPOINT_URL 2>/dev/null | jq -r .build_url
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-c19ce0d88a153f481fd790e23bdcd6f2d5ea7fd6.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-c19ce0d88a153f481fd790e23bdcd6f2d5ea7fd6.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-c19ce0d88a153f481fd790e23bdcd6f2d5ea7fd6.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-c19ce0d88a153f481fd790e23bdcd6f2d5ea7fd6.tar.gz
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/android-shell-builder-aebd669d6573b0b3c802871d94cdb8b4116678d2.tar.gz
s3://exp-artifacts/android-shell-builder-5090aab941f92c912c6643a1e25cc69f9f67d8e6.tar.gz
-1
View File
@@ -1 +0,0 @@
s3://exp-artifacts/android-shell-builder-a8e204610e5712391336b378f47962bbb0c04164.tar.gz
-1
View File
@@ -1 +0,0 @@
s3://exp-artifacts/android-shell-builder-7ce098f40cc82a2f61fed9f1f515d695a83c55b2.tar.gz
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/ios-expo-client-d31aaf53daca6aa65d8cb1090fb60c73a9c47075.tar.gz
s3://exp-artifacts/ios-expo-client-a2b1e16f330b36fa0dc627a76caabe4d2ff45f77.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-27-db356a09877642d64023af98e4e2e1e632fbe4df.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-28-db356a09877642d64023af98e4e2e1e632fbe4df.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-29-db356a09877642d64023af98e4e2e1e632fbe4df.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-30-6863276e6b9605e31228c845a047387571959e9b.tar.gz
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-55848298c7332f7586c4281fa691a4ca31548532.tar.gz
s3://exp-artifacts/ios-shell-builder-sdk-latest-e1a8bd0ab2e1eba546792c0ffc282b5b202ccc39.tar.gz
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-edd02214dd84368c197df32a2d30a901d6c766ff.tar.gz
s3://exp-artifacts/ios-shell-builder-sdk-latest-dc981c7110b7d508de8e9c352064dc3d745c9f72.tar.gz
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-36b57e8ebb96aa8dce286c89bd56e8708eca819d.tar.gz
s3://exp-artifacts/ios-shell-builder-sdk-latest-a2b1e16f330b36fa0dc627a76caabe4d2ff45f77.tar.gz
-1
View File
@@ -1 +0,0 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-651588ff3445a5d87b3a5b81ec2977c02b22f3a2.tar.gz
-1
View File
@@ -1 +0,0 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-0115c48ddac4f63e5215541dff804871ef8c1e03.tar.gz
+3 -15
View File
@@ -15,7 +15,6 @@ import { PLATFORMS } from 'turtle/constants';
import logger from 'turtle/logger';
const which = util.promisify(_which);
const JAVA_REQUIRED_VERSION = 8;
const REQUIRED_TOOLS: IToolDefinition[] = [
{
command: 'bash',
@@ -23,27 +22,16 @@ const REQUIRED_TOOLS: IToolDefinition[] = [
},
{
command: 'javac',
missingDescription: `Please install JDK (version ${JAVA_REQUIRED_VERSION}) - check https://jdk.java.net/`,
missingDescription: 'Please install JDK (version 8 or newer) - check https://jdk.java.net/',
testFn: async () => {
const { status, stdout, stderr } = await ExponentTools.spawnAsyncThrowError(
'java',
const { status, stdout } = await ExponentTools.spawnAsyncThrowError(
'javac',
['-version'],
{ stdio: 'pipe' },
);
if (stdout.match(/no java runtime present/i)) {
return false;
}
const matchResult = stderr.match(/.*version ".*\.(.*)\..*"/);
if (matchResult) {
const [, currentJavaVersion] = matchResult;
if (Number(currentJavaVersion) !== JAVA_REQUIRED_VERSION) {
throw new Error(`You're using a wrong Java version, please install version ${JAVA_REQUIRED_VERSION}`);
}
} else {
logger.warn(`Couldn't find Java version number, assuming you're on Java ${JAVA_REQUIRED_VERSION}...`);
}
return status === 0;
},
},
+2 -26
View File
@@ -10,7 +10,6 @@ import { IToolDefinition } from 'turtle/bin/setup/utils/toolsDetector';
import { formatShellAppDirectory } from 'turtle/builders/utils/ios/workingdir';
import config from 'turtle/config';
import { PLATFORMS } from 'turtle/constants';
import logger from 'turtle/logger';
const REQUIRED_TOOLS: IToolDefinition[] = [
{
@@ -31,7 +30,7 @@ const REQUIRED_TOOLS: IToolDefinition[] = [
const fastlaneVersion = parseFastlaneVersion(stdout);
if (fastlaneVersion && !semver.satisfies(fastlaneVersion, `>= ${MINIMAL_VERSION}`)) {
throw new Error(
`Your fastlane is on version ${fastlaneVersion}. Please upgrade it to at least ${MINIMAL_VERSION}.`,
`Your fastlane on version ${fastlaneVersion}. Please upgrade it to at least ${MINIMAL_VERSION}.`,
);
}
},
@@ -48,30 +47,7 @@ const REQUIRED_TOOLS: IToolDefinition[] = [
if (stdout.match(/requires xcode/i)) {
return false;
}
if (status !== 0) {
return false;
}
try {
await ExponentTools.spawnAsyncThrowError('ibtool', ['--version'], { stdio: 'pipe' });
} catch (err) {
if (err.stderr) {
const stderr = err.stderr.trim();
if (stderr.match(/Agreeing to the Xcode\/iOS license/)) {
logger.error('You have not accepted the Xcode license. Run \'sudo xcodebuild -runFirstLaunch\' to do so.');
return false;
}
if (stderr.match(/The bundle is damaged or missing necessary resources/)) {
logger.error(
'Make sure to install additional required components. Run \'sudo xcodebuild -runFirstLaunch\' to do so.',
);
return false;
}
}
}
return true;
return status === 0;
},
},
];
+1 -1
View File
@@ -19,7 +19,7 @@ export async function ensureToolsAreInstalled(tools: IToolDefinition[]) {
try {
if (testFn) {
if (!await testFn()) {
throw new Error('Required tool is not properly installed');
throw new Error('Required tool doesn\'t exist');
}
} else {
await which(command);
+1 -1
View File
@@ -94,7 +94,7 @@ const buildJobObject = async (
) => {
const job = {
config: {
..._.get(appJSON, `expo.${platform}.config`, {}),
..._.get(appJSON, 'expo.ios.config', {}),
buildType,
...(platform === 'android' ? { buildMode } : {}),
releaseChannel,
+1 -1
View File
@@ -1,4 +1,4 @@
import { UserManager } from '@expo/xdl';
import { User as UserManager } from '@expo/xdl';
import { ErrorWithProgramHelp } from 'turtle/bin/commands/ErrorWithProgramHelp';
+2 -7
View File
@@ -11,7 +11,7 @@ import getOrCreateCredentials from 'turtle/builders/utils/android/credentials';
import { formatShellAppDirectory } from 'turtle/builders/utils/android/workingdir';
import * as commonUtils from 'turtle/builders/utils/common';
import * as imageHelpers from 'turtle/builders/utils/image';
import { resolveExplicitOptIn } from 'turtle/builders/utils/unimodules';
import { resolveNativeModules } from 'turtle/builders/utils/unimodules';
import { uploadBuildToS3 } from 'turtle/builders/utils/uploader';
import { ensureCanBuildSdkVersion } from 'turtle/builders/utils/version';
import config from 'turtle/config';
@@ -73,14 +73,9 @@ async function runShellAppBuilder(
const sdkVersion = _.get(manifest, 'sdkVersion', sdkVersionFromJob);
const workingDir = formatShellAppDirectory({ sdkVersion });
// (2019-07-31) We are explicitly choosing to disable this option until we have more
// infrastructure/tooling built around optional modules and OTA updates, as right now it's
// very easy for developers to break apps in production with optional modules.
//
// to enable full resolver switch resolveExplicitOptIn to resolveNativeModules
logger.info({ buildPhase: 'resolve native modules' }, 'Resolving universal modules dependencies');
const enabledModules = semver.satisfies(sdkVersion, '>= 33.0.0')
? await resolveExplicitOptIn(workingDir, _.get(manifest, 'dependencies'))
? await resolveNativeModules(workingDir, _.get(manifest, 'dependencies'))
: null;
try {
+8 -20
View File
@@ -1,6 +1,6 @@
import * as path from 'path';
import { ExponentTools, IosShellApp } from '@expo/xdl';
import { IosShellApp } from '@expo/xdl';
import { v4 as uuidv4 } from 'uuid';
import { formatShellAppDirectory } from 'turtle/builders/utils/ios/workingdir';
@@ -41,7 +41,6 @@ export function createBuilderContext(job: IJob): IContext {
const sdkVersion = sdkVersionFromJob || sdkVersionFromManifest;
const workingDir = formatShellAppDirectory({ sdkVersion, buildType: buildType! });
const majorSdkVersion = ExponentTools.parseSdkMajorVersion(sdkVersion);
const context: any = {
appDir: join(config.directories.temporaryFilesRoot, appUUID),
@@ -85,24 +84,13 @@ export function createBuilderContext(job: IJob): IContext {
'Applications',
`${EXPOKIT_APP}.app`,
);
if (majorSdkVersion >= 33) {
context.workspacePath = path.join(
workingDir,
'shellAppWorkspaces',
'default',
'ios',
`${EXPOKIT_APP}.xcworkspace`,
);
} else {
context.workspacePath = path.join(
workingDir,
'shellAppWorkspaces',
'ios',
'default',
`${EXPOKIT_APP}.xcworkspace`,
);
}
context.workspacePath = path.join(
workingDir,
'shellAppWorkspaces',
'ios',
'default',
`${EXPOKIT_APP}.xcworkspace`,
);
} else if (buildType === IOS_BUILD_TYPES.CLIENT) {
context.outputPath = join(context.appDir, 'archive.xcarchive');
context.uploadPath = join(context.buildDir, 'archive.ipa');
+1 -1
View File
@@ -61,4 +61,4 @@ async function cleanup(ctx: IContext) {
}
const getTemporaryDirs = (ctx: IContext) =>
Object.values(pick(ctx, ['appDir', 'provisioningProfileDir'])) as string[];
Object.values(pick(ctx, ['appDir', 'provisioningProfileDir']));
+2 -2
View File
@@ -1,6 +1,6 @@
import path from 'path';
import { AndroidCredentials } from '@expo/xdl';
import { Credentials } from '@expo/xdl';
import fs from 'fs-extra';
import get from 'lodash/get';
import uuidv4 from 'uuid/v4';
@@ -29,7 +29,7 @@ async function getOrCreateCredentials(jobData: IJob): Promise<IAndroidCredential
);
}
await AndroidCredentials.createKeystore(
await Credentials.Android.createKeystore(
{
keystorePath: keystoreFilename,
keystorePassword: credentials.keystorePassword,
@@ -36,7 +36,6 @@ export default async function runShellAppBuilder(ctx: IContext, job: IJob): Prom
manifest,
output: ctx.outputPath,
verbose: true,
shellAppSdkVersion: sdkVersion,
};
if (buildType === IOS_BUILD_TYPES.CLIENT) {
Object.assign(shellAppParams, {
+3 -17
View File
@@ -19,20 +19,6 @@ interface IPackageInfo {
dependencies: string[];
}
export async function resolveExplicitOptIn(workingdir: string, packages?: string[]): Promise<IUnimoduleEntry[]> {
const resolver = new Resolver(workingdir);
await resolver.init();
const optionalModules = ['expo-branch'];
resolver.addAll();
const modules = packages
? resolver.getModules().filter((mod) => !optionalModules.includes(mod.name) || packages.includes(mod.name))
: resolver.getModules().filter((mod) => !optionalModules.includes(mod.name));
modules.forEach(({ name, version }) => { logger.info(`Adding ${name}:${version}`); });
return modules;
}
export async function resolveNativeModules(workingdir: string, packages?: string[]): Promise<IUnimoduleEntry[]> {
const resolver = new Resolver(workingdir);
await resolver.init();
@@ -52,9 +38,8 @@ export async function resolveNativeModules(workingdir: string, packages?: string
}
}
}
const modules = resolver.getModules();
modules.forEach(({ name, version }) => { logger.info(`Adding ${name}:${version}`); });
return modules;
return resolver.getModules();
}
async function readCorePackages(workingdir: string) {
@@ -116,6 +101,7 @@ class Resolver {
return;
}
const pkg = this.dependencyMap[moduleName];
logger.info(`Adding ${moduleName}:${pkg.version}`);
this.modulesMap[moduleName] = {
name: pkg.name,
dirname: pkg.dirname,
-3
View File
@@ -89,7 +89,4 @@ export default {
path.join(os.platform() === 'darwin' ? '/private' : '/', 'tmp', 'turtle'),
),
},
www: {
sdkVersionsSecretToken: env('TURTLE_SDK_VERSIONS_SECRET_TOKEN'),
},
};
+9 -23
View File
@@ -55,34 +55,20 @@ export async function getJob() {
async function processJob(jobData: any) {
const receiptHandle = jobData.ReceiptHandle;
const { priority } = jobData;
let timeoutId;
try {
let rawJob;
let job;
try {
rawJob = JSON.parse(jobData.Body);
timeoutId = failAfterMaxJobTime(priority, receiptHandle, rawJob);
logger.info(
{ buildJobId: rawJob.id, messageId: jobData.MessageId },
`Processing job with priority=${priority.slice(0, priority.length - 8)} timestamp=${Date.now()}`,
);
job = await sanitizeJob(rawJob);
} catch (err) {
logger.error({ err, ...rawJob && { buildJobId: rawJob.id } }, 'The build job is invalid');
// send message only if we've managed to parse the job json
if (rawJob) {
await sqs.sendMessage(rawJob.id, BUILD.JOB_STATES.ERRORED, {
turtleVersion,
buildDuration: 0,
reason: 'The build job is invalid',
});
}
throw err;
}
const rawJob = JSON.parse(jobData.Body);
timeoutId = failAfterMaxJobTime(priority, receiptHandle, rawJob);
const job = await sanitizeJob(rawJob);
setCurrentJobId(job.id);
const pingerHandle = sqs.changeMessageVisibilityRecurring(priority, jobData.ReceiptHandle, job.id);
logger.info(
`Doing job MessageId=${jobData.MessageId} BuildId=${job.id} `
+ `Priority=${priority.slice(0, priority.length - 8)} ${Date.now()}`,
);
const cancelled = await redis.checkIfCancelled(job.id);
if (cancelled) {
logger.info('The job has been cancelled');
+1
View File
@@ -1,3 +1,4 @@
import EventEmitter from 'events';
import path from 'path';
+1 -8
View File
@@ -12,14 +12,7 @@ const createModeMetricName = (mode: TurtleModeLabels) => `${createMetricName()}.
const createModeTag = (mode: TurtleModeLabels) => `mode:${mode}`;
export default async function sendConfigToDatadog() {
let configuration;
try {
configuration = await getLabeledConfiguration();
} catch (err) {
logger.warn('Failed to send the builders configuration to Datadog because it couldn\'t be fetched from Redis');
return;
}
const configuration = await getLabeledConfiguration();
const replicaCount = await getReplicaCount();
const currentReplicaCount = replicaCount === null ? configuration.length : replicaCount;
+80
View File
@@ -0,0 +1,80 @@
import { PLATFORMS } from 'turtle/constants';
import logger from 'turtle/logger';
import {
createConfigurationsKey,
createDefaultConfigurationKey,
HIGH_CONFIGURATION,
HIGH_ONLY_CONFIGURATION,
} from 'turtle/utils/priorities';
import { connect, RedisClient } from 'turtle/utils/redis';
const TIMEOUT = 3000;
// Turtle before doing anything (and after every build) checks for the first config
// (an element in config table with key=i) that is not taken (config.i is null/outdated)
// or is taken by this process itself.
// If Turtle dies unexpectedly the configuration will become free after TTL expires,
// so the state (number of HP/NP turtles) should come back to normal soon.
// For example, if a configuration table looks like this:
// [ HIGH_CONFIGURATION, NORMAL_CONFIGURATION, HIGH_CONFIGURATION ]
// If there is one turtle it runs with High Priority first.
// If there are two turtles, one runs with High Priority first, the second one with Normal Priority first.
// If the first dies, and the third is started in his place, it gets 3rd config (again HP-first),
// but after some time, because of TTL for config reservations,
// they should come back to using configurations no. 1 and 2.
// If there are no more available configurations from the table, the default configuration is used.
const AVAILABLE_CONFIGURATIONS_IOS = [
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_ONLY_CONFIGURATION,
HIGH_ONLY_CONFIGURATION,
HIGH_ONLY_CONFIGURATION,
// there are 5 iOS builders at the moment
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
];
const AVAILABLE_CONFIGURATIONS_ANDROID = [
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
// there are 15 Android builders at the moment
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
HIGH_CONFIGURATION,
];
const DEFAULT_CONFIGURATION = HIGH_CONFIGURATION;
async function run() {
const redis = await connect(TIMEOUT, RedisClient.Configuration);
await redis.set(createConfigurationsKey(PLATFORMS.IOS), JSON.stringify(AVAILABLE_CONFIGURATIONS_IOS));
await redis.set(createConfigurationsKey(PLATFORMS.ANDROID), JSON.stringify(AVAILABLE_CONFIGURATIONS_ANDROID));
await redis.set(createDefaultConfigurationKey(PLATFORMS.IOS), JSON.stringify(DEFAULT_CONFIGURATION));
await redis.set(createDefaultConfigurationKey(PLATFORMS.ANDROID), JSON.stringify(DEFAULT_CONFIGURATION));
redis.disconnect();
}
if (require.main === module) {
run()
.then(() => logger.info('All done'))
.catch((err) => logger.error('Error:', err));
}
+38
View File
@@ -0,0 +1,38 @@
import isNaN from 'lodash/isNaN';
import { PLATFORMS } from 'turtle/constants';
import logger from 'turtle/logger';
import { setReplicaCount } from 'turtle/utils/metadata';
import { getRedisClient, RedisClient } from 'turtle/utils/redis';
async function run() {
const platform = process.env.SCRIPT_PLATFORM;
const replicaCountRaw = process.env.SCRIPT_REPLICA_COUNT;
const replicaCount = Number(replicaCountRaw);
if (!platform || !replicaCountRaw) {
throw new Error('You must set both SCRIPT_PLATFORM and SCRIPT_REPLICA_COUNT env variables.');
}
if (!Object.values(PLATFORMS).includes(platform)) {
throw new Error(`Unsupported platform: ${platform}`);
}
if (isNaN(replicaCount)) {
throw new Error(`Wrong value for replica count: ${replicaCountRaw}`);
}
const redis = await getRedisClient(RedisClient.Configuration);
logger.info(`[${platform}] Setting replica count in redis to ${replicaCount}`);
await setReplicaCount(platform as PLATFORMS, replicaCount);
redis.disconnect();
}
if (require.main === module) {
run()
.then(() => logger.info('All done'))
.catch((err) => {
logger.error('Error:', err);
process.exit(1);
});
}
+12 -8
View File
@@ -6,7 +6,10 @@ import { doJob } from 'turtle/jobManager';
import logger from 'turtle/logger';
import setup from 'turtle/setup';
import { checkShouldExit, setShouldExit, turtleVersion } from 'turtle/turtleContext';
import { setSupportedSdkVersions, setTurtleVersion } from 'turtle/utils/versions';
import { getRedisClient } from 'turtle/utils/redis';
const REDIS_TURTLE_VERSION_KEY = 'turtle:version';
const REDIS_TURTLE_SUPPORTED_SDK_VERSIONS_KEY = `turtle:${config.platform}:sdkVersions`;
process.on('unhandledRejection', (err) => logger.error({ err }, 'Unhandled promise rejection'));
@@ -34,20 +37,21 @@ async function main() {
}
try {
await setTurtleVersion(turtleVersion);
logger.info(`Registered Turtle version (${turtleVersion}) in www`);
const sdkVersions = (await findSupportedSdkVersions(config.platform)).map((version) => `${version}.0.0`);
await setSupportedSdkVersions(config.platform, sdkVersions);
logger.info(`Registered supported SDK versions (${sdkVersions}) in www`);
const redis = await getRedisClient();
await redis.set(REDIS_TURTLE_VERSION_KEY, turtleVersion);
logger.info(`Registered Turtle version (${turtleVersion}) in Redis`);
const sdkVersions = (await findSupportedSdkVersions(config.platform)).join(',');
await redis.set(REDIS_TURTLE_SUPPORTED_SDK_VERSIONS_KEY, sdkVersions);
logger.info(`Registered supported SDK versions (${sdkVersions}) in Redis`);
} catch (err) {
logger.error({ err }, 'Failed to register versions in www');
logger.error({ err }, 'Failed to set versions in Redis');
}
while (true) {
try {
await doJob();
} catch (err) {
logger.error({ err }, 'Failed to process a job');
logger.error({ err }, 'Failed to do a job');
}
}
}
+8
View File
@@ -5,6 +5,14 @@ import { getRedisClient, RedisClient } from 'turtle/utils/redis';
const createKeyPrefix = (platform: PLATFORMS) => `${config.deploymentEnv}:${platform}`;
const createReplicaCountKey = (platform: PLATFORMS) => `${createKeyPrefix(platform)}:replicaCount`;
export async function setReplicaCount(platform: PLATFORMS, replicaCount: number) {
const redis = await getRedisClient(RedisClient.Configuration);
await redis.set(
createReplicaCountKey(platform),
replicaCount,
);
}
export async function getReplicaCount(maybePlatform?: PLATFORMS) {
const platform = maybePlatform || config.platform;
const redis = await getRedisClient(RedisClient.Configuration);
+2 -2
View File
@@ -49,7 +49,7 @@ export function createDefaultConfigurationKey(platform = config.platform) {
}
export async function getPriorities() {
if (config.env === 'test' || config.deploymentEnv === 'development') {
if (config.env === 'test') {
return NORMAL_CONFIGURATION;
}
@@ -93,7 +93,7 @@ export async function getPriorities() {
}
}
async function getConfiguration(currentRedisClient: any) {
export async function getConfiguration(currentRedisClient: any) {
const redis = currentRedisClient || await getRedisClient(RedisClient.Configuration);
return JSON.parse(await redis.get(createConfigurationsKey()));
}
+1 -1
View File
@@ -64,7 +64,7 @@ export async function checkIfCancelled(jobId: string) {
return await redis.get(`jobs:cancelled:${jobId}`);
} catch (err) {
if (config.deploymentEnv === 'development') {
logger.warn('Did you turn on redis server? Run `yarn start-docker` in $EXPO_UNIVERSE_DIR/server/www');
logger.warn('Did you turn on redis server? Run `yarn start-docker` in server/www');
}
logger.error({ err });
return false;
-49
View File
@@ -1,49 +0,0 @@
import { URL } from 'url';
import request from 'request-promise';
import config from 'turtle/config';
async function setSupportedSdkVersions(platform: string, sdkVersions: string[]) {
const { href } = new URL('/--/api/v2/standalone-build/setSupportedSDKVersions', resolveWWWEndpoint());
await request({
method: 'POST',
uri: href,
headers: {
'secret-token': config.www.sdkVersionsSecretToken,
},
body: {
platform,
sdkVersions,
},
json: true,
});
}
async function setTurtleVersion(version: string) {
const { href } = new URL('/--/api/v2/standalone-build/setTurtleVersion', resolveWWWEndpoint());
await request({
method: 'POST',
uri: href,
headers: {
'secret-token': config.www.sdkVersionsSecretToken,
},
body: {
version,
},
json: true,
});
}
function resolveWWWEndpoint() {
const currentEnv = config.deploymentEnv;
if (currentEnv === 'production') {
return 'https://expo.io';
} else if (currentEnv === 'staging') {
return 'https://staging.expo.io';
} else {
return 'http://127.0.0.1:3000';
}
}
export { setSupportedSdkVersions, setTurtleVersion };
-3
View File
@@ -2,9 +2,6 @@ import * as schemas from 'turtle/jobsSchemas';
export async function sanitizeJob(job: any) {
const schema = (schemas as any)[job.platform];
if (!schema) {
throw new Error(`Unsupported platform: ${job.platform}`);
}
const { error, value } = schema.validate(job, { stripUnknown: true });
if (error) {
throw error;
+1 -2
View File
@@ -18,8 +18,7 @@
"allowJs": true,
"plugins": [
{ "transform": "ts-transformer-imports" }
],
"typeRoots": ["node_modules/@expo/babel-preset-cli/ts-declarations", "node_modules/@types"]
]
},
"include": ["src"],
"exclude": ["node_modules", "build", "workingdir"]
+1512 -2131
View File
File diff suppressed because it is too large. Load diff