Compare commits

..
Author SHA1 Message Date
Brent Vatne fdd76085c1 Release 0.22.3 2021-07-02 10:44:08 -07:00
Brent Vatne daedefbca8 Update tarball for SDK 42 2021-07-02 10:43:43 -07:00
Brent Vatne e7da1a0193 Update changelog 2021-06-29 19:42:37 -07:00
Brent Vatne 85cc6d1b9f Release 0.22.2 2021-06-29 19:41:48 -07:00
Brent Vatne 07679dfbdc [ios] Update tarball again for SDK 42 2021-06-29 19:41:15 -07:00
Brent Vatne 070485dd09 Update changelog 2021-06-29 14:06:50 -07:00
Brent Vatne bf3e1feac9 Release 0.22.1 2021-06-29 14:05:58 -07:00
Brent Vatne fcba536698 [ios][android] Update tarballs for SDK 42 2021-06-29 14:03:10 -07:00
dependabot[bot] e77f05ea1d Bump set-getter from 0.1.0 to 0.1.1 (#320)
Bumps [set-getter](https://github.com/doowb/set-getter) from 0.1.0 to 0.1.1.
- [Release notes](https://github.com/doowb/set-getter/releases)
- [Commits](https://github.com/doowb/set-getter/commits/0.1.1)

---
updated-dependencies:
- dependency-name: set-getter
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-25 15:10:02 +02:00
Brent Vatne 819be0056c Update changelog 2021-06-22 19:34:11 -07:00
Brent Vatne 0a3faaf975 Release 0.22.0 2021-06-22 19:33:09 -07:00
Brent Vatne c38b1b4089 Update SDK 42 beta tarballs 2021-06-22 17:50:13 -07:00
Brent Vatne 5c5de300a6 Add iOS and Android beta tarballs for SDK 42 2021-06-21 18:37:40 -07:00
Wojciech Kozyra 6efa267a1f Update CHANGELOG 2021-06-15 14:14:41 +02:00
Wojciech Kozyra 81b7d8d911 Release 0.21.9 2021-06-15 14:13:17 +02:00
Wojciech Kozyra 95a48861e0 update sharp and skip NDK install on M1 (#319) 2021-06-15 14:12:02 +02:00
dependabot[bot] 2bb14a67b6 Bump url-parse from 1.4.4 to 1.5.1 (#310)
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.4 to 1.5.1.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.4.4...1.5.1)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-07 17:15:37 +02:00
dependabot[bot] 5a1f48335f Bump lodash from 4.17.19 to 4.17.21 (#311)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.19 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.19...4.17.21)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-07 17:15:28 +02:00
dependabot[bot] 2dd89d2c08 Bump hosted-git-info from 2.7.1 to 2.8.9 (#312)
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.7.1 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.7.1...v2.8.9)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-07 17:15:18 +02:00
dependabot[bot] 5f9d98b1dc Bump dns-packet from 1.3.1 to 1.3.4 (#318)
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-07 17:14:53 +02:00
cruzach 02833e211d update changelog 2021-05-25 10:36:38 -04:00
cruzach ba4f2cc05a Release 0.21.8 2021-05-25 10:35:28 -04:00
cruzach 7f9b7a17d4 update android tarball for SDK 41 2021-05-24 16:49:34 -04:00
cruzach 821e648d67 update changelog 2021-05-21 10:32:45 -04:00
cruzach 54a6e1910c Release 0.21.7 2021-05-21 10:31:15 -04:00
cruzach 688f970a1a Update android and ios tarballs for SDK 41 2021-05-20 17:04:38 -04:00
Brent Vatne 9c666d90b4 Update CHANGELOG 2021-04-22 14:24:09 -07:00
Brent Vatne 4f351a047f Release 0.21.6 2021-04-22 14:21:25 -07:00
Brent Vatne 7caa13bdda Update Android SDK41 tarball. 2021-04-22 14:19:41 -07:00
Tomasz Sapeta 1f266f7b72 Update iOS SDK41 shell tarball 2021-04-22 15:25:11 +02:00
Wojciech Kozyra edfa2dbb94 increase android worker memory and cpu limits - (12GB, 3CPU) 2021-04-20 11:24:19 +02:00
Wojciech Kozyra 1d5075d898 increase android worker memory and cpu limits (#307) 2021-04-20 10:56:01 +02:00
dependabot[bot] 64147f0cf7 Bump ssri from 6.0.1 to 6.0.2 (#308)
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-20 10:10:58 +02:00
Brent Vatne 688a961513 Update CHANGELOG 2021-04-15 17:44:15 -07:00
Brent Vatne 19ed88150a Release 0.21.5 2021-04-15 15:27:48 -07:00
Brent Vatne e988fb282e Update iOS client and Android SDK 41 tarballs 2021-04-15 15:26:57 -07:00
Brent Vatne 16103cebf9 Release 0.21.4 2021-04-13 18:47:35 -07:00
Brent Vatne be14dca375 Update iOS client tarball 2021-04-13 18:47:10 -07:00
Brent Vatne bf24c86399 Update CHANGELOG 2021-04-13 15:53:51 -07:00
Brent Vatne 7fb1e57a40 Release 0.21.3 2021-04-13 15:52:59 -07:00
Brent Vatne d6fcc6d881 Update SDK 41 taralls for iOS and Android 2021-04-13 15:51:38 -07:00
cruzach 525ddf6f04 update changelog 2021-04-07 18:20:29 -04:00
cruzach f0416d131d Release 0.21.2 2021-04-07 18:18:31 -04:00
cruzach 2fdeea268c Update Android SDK 41 beta tarball 2021-04-07 17:37:52 -04:00
Brent Vatne a11ed9198c Update CHANGELOG 2021-04-01 15:46:52 -07:00
Brent Vatne 2da016e4ce Release 0.21.1 2021-04-01 15:45:11 -07:00
Brent Vatne 8278520474 Update SDK 41 beta tarball 2021-04-01 14:54:34 -07:00
dependabot[bot] 6ab9d99d7c Bump y18n from 4.0.0 to 4.0.1 (#304)
Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/yargs/y18n/releases)
- [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/y18n/commits)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-30 15:54:20 +02:00
dependabot[bot] c8ad765d5d Bump react-dev-utils from 11.0.1 to 11.0.4 (#299)
Bumps [react-dev-utils](https://github.com/facebook/create-react-app/tree/HEAD/packages/react-dev-utils) from 11.0.1 to 11.0.4.
- [Release notes](https://github.com/facebook/create-react-app/releases)
- [Changelog](https://github.com/facebook/create-react-app/blob/master/CHANGELOG-1.x.md)
- [Commits](https://github.com/facebook/create-react-app/commits/HEAD/packages/react-dev-utils)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-30 15:52:51 +02:00
Brent Vatne 1834f323ce Update CHANGELOG 2021-03-29 18:05:39 -07:00
Brent Vatne 8e261a8827 Release 0.21.0 2021-03-29 18:04:47 -07:00
Brent Vatne d0033c2df1 Bump xdl 2021-03-29 16:29:56 -07:00
Brent Vatne 63b7879608 Add beta tarballs for SDK 41 2021-03-29 15:32:08 -07:00
Brent Vatne cf57eceb6e Add entry for 0.20.7 to CHANGELOG 2021-03-29 15:31:45 -07:00
dependabot[bot] 5058cbe8e5 Bump elliptic from 6.5.3 to 6.5.4 (#297)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-29 13:00:01 +02:00
dependabot[bot] 4804a3453c Bump ini from 1.3.5 to 1.3.8 (#293)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-29 12:59:08 +02:00
Wojciech Kozyra 1d773f35cf Release 0.20.7 2021-01-26 14:49:57 +01:00
Wojciech Kozyra 3daa678540 [android] remove Go suffix from android app name (#292) 2021-01-26 14:20:33 +01:00
Brent Vatne 616331b47b update changelog 2021-01-25 11:39:45 -08:00
Brent Vatne 0b9ab78453 Release 0.20.6 2021-01-25 11:36:30 -08:00
Brent Vatne 3e345ddaf8 [ios][android] Update tarballs for SDK 40 patch release 2021-01-21 20:40:43 -08:00
Cedric van Putten 4866c06a02 update changelog 2020-12-23 18:28:28 +01:00
Cedric van Putten c36723d96c Release 0.20.5 2020-12-23 18:25:36 +01:00
Cedric van Putten 28b0266ba2 [android] Upgrade to client 2.18.5 with background permission fix (#287) 2020-12-23 15:07:09 +01:00
Stanisław Chmiela 84a19ee261 Release 0.20.4 2020-12-17 15:57:42 +01:00
Stanisław Chmiela 8f3be65326 [ios] Fix expo-notifications initial notification not being delivered… (#285)
to expo-notifications

<!-- 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
- [x] I've read the [Contribution Guidelines](https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [x] I've updated the [CHANGELOG](https://github.com/expo/turtle/blob/master/CHANGELOG.md) if necessary.
- [x] 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.
- [x] **I've manually tested whether the changes I made work as expected.**

### Motivation and Context
Adds https://github.com/expo/expo/commit/0e0bbdd7b45b3e8f8725bcd831263f049c0aa16a and https://github.com/expo/expo/commit/c49a0464aef589dc9dd691cea78313d91959d64c fixing long-standing notifications bug.
2020-12-17 15:56:39 +01:00
Wojciech Kozyra 5d539a1bb2 update CHANGELOG 2020-12-10 12:11:09 +01:00
Wojciech Kozyra 833c9c1de5 Release 0.20.3 2020-12-10 12:09:10 +01:00
Eric Gonzalez ce74ab3161 Fixed the iOS build when user does not have elevated permissions (#283)
* Removed unnecessary sudo usage for ios buildsudo does not appear to be necessary to execute 'xcrun simctl list'

* Conditionally sudo-ing xcrun when building online
2020-12-10 10:47:25 +01:00
Brent Vatne 62df247645 [scripts] Verify jq installation before proceeding (#281) 2020-12-09 20:57:57 -08:00
Stanisław Chmiela 9bc4d75e9b Cut 0.20.2 version in changelog 2020-12-09 16:45:33 +01:00
Stanisław Chmiela b4d4b8a6c3 Release 0.20.2 2020-12-09 16:39:20 +01:00
Stanisław Chmiela 88d75c7581 Add changelog entry 2020-12-09 16:38:07 +01:00
Stanisław Chmiela 03be505cd0 [android] Upgrade SDK40 tarball with expo-notifications installation identifier fix 2020-12-09 15:58:41 +01:00
Eric Samelson 05568676ee update CHANGELOG 2020-12-08 18:54:00 -08:00
Eric Samelson 903e44bd29 Release 0.20.1 2020-12-08 18:51:55 -08:00
Brent Vatne 7697542b44 Update iOS client tarball 2020-12-08 18:44:45 -08:00
Eric Samelson 3baf4bcade [android] update SDK 40 shell tarball for release 2020-12-08 17:34:44 -08:00
Brent Vatne c7e98c5858 [ios] Update SDK 40 tarball for release 2020-12-08 13:12:26 -08:00
Dominik Sokal fc48d27e42 fix android smoke tests 2020-12-01 14:12:33 +01:00
Brent Vatne fdc702f273 Update CHANGELOG 2020-11-30 13:37:03 -08:00
Brent Vatne 9fda74dfa4 Release 0.20.0 2020-11-30 13:26:37 -08:00
Brent Vatne 6bab5f71ef [README] Update link to installation docs 2020-11-30 11:02:28 -08:00
Brent Vatne 3f1e9ce910 [android] Update sdk40 tarball 2020-11-30 11:01:37 -08:00
Brent Vatne 8fb54f3f27 Add iOS and Android SDK 40 tarballs 2020-11-27 11:53:29 -08:00
Bartłomiej Bukowski 069ef7e1c9 Update CHANGELOG.md 2020-11-19 21:23:53 +01:00
Bartłomiej Bukowski c0a742fa21 Release 0.19.1 2020-11-19 21:13:23 +01:00
Bartłomiej Bukowski fca72875dc [iOS] Rebuild shell tarballs (#278)
### Motivation and Context

- Accommodate https://github.com/expo/expo/pull/11052 in all shellApps.
- Rebuild iOS shellApps using Xcode 12.1 containing the iOS 14 image fix.
2020-11-19 21:02:25 +01:00
Bartłomiej Bukowski 15ed26d4cd [iOS] Run 'xcrun simctl list' before build to prevent ibtool crash (#279)
* [iOS] Run 'xcrun simctl list' before build to prevent ibtool crash

* Update CHANGELOG
2020-11-18 11:15:42 +01:00
Wojciech Kozyra 4c7af801f1 Revert "[ios][shellApps] Rebuild all supported shellApps with Xcode 12.1 (#273)"
This reverts commit c6946eca25.
2020-11-16 18:16:31 +01:00
Wojciech Kozyra 5012ec669d update CHANGELOG.md 2020-11-13 13:12:27 +01:00
Wojciech Kozyra 8b77a48b82 Release 0.19.0 2020-11-13 13:10:36 +01:00
Bartłomiej BukowskiandWojciech Kozyra c6946eca25 [ios][shellApps] Rebuild all supported shellApps with Xcode 12.1 (#273)
Co-authored-by: Wojciech Kozyra <[email protected]>
2020-11-11 12:08:25 +01:00
Eric Samelson 9627ecb80c Update CHANGELOG for 0.18.9 2020-11-09 16:24:03 -08:00
Eric Samelson 48c78f386a Release 0.18.9 2020-11-09 16:22:05 -08:00
Eric Samelson 0dc251e023 bump xdl to 58.0.20 2020-11-09 16:11:26 -08:00
Stanisław Chmiela d984061134 Update changelog for 0.18.8 2020-10-27 13:00:10 +01:00
Stanisław Chmiela ff6401ba6b Release 0.18.8 2020-10-27 12:59:02 +01:00
Stanisław Chmiela b443760699 Fix Reanimated v2 not being configured in production mode (#270)
<!-- 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
- [x] I've read the [Contribution Guidelines](https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [x] I've updated the [CHANGELOG](https://github.com/expo/turtle/blob/master/CHANGELOG.md) if necessary.
- [x] 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.
- [x] **I've manually tested whether the changes I made work as expected.**

### Motivation and Context

Apply https://github.com/expo/expo/pull/10807.

### Description
Fixes app crashing when using Reanimated v2.
2020-10-27 12:57:06 +01:00
Eric Samelson 0f0e86d17f Release 0.18.7 2020-10-23 15:28:41 -07:00
Eric Samelson f6697c0029 update CHANGELOG 2020-10-23 15:28:14 -07:00
Eric Samelson 22f802164d update android sdk 39 tarball 2020-10-23 14:53:13 -07:00
Charlie Cruzan aaa6e61061 Update CHANGELOG.md 2020-10-22 17:17:43 -04:00
cruzach e532e0270c Release 0.18.6 2020-10-22 17:13:42 -04:00
Charlie Cruzan bc0718ca7d [android] update sdk 39 tarball with notifications fixes
the following fixes are added in this update:

- https://github.com/expo/expo/commit/6ffe64f4a75f75edfdae226574842e97fd63d523

- https://github.com/expo/expo/commit/fa659fd3f74c32e989db5920a3e004bee58a931c

- https://github.com/expo/expo/commit/0faa400c630a5f88a029fe87c84cfa9e684e800a
2020-10-22 13:54:30 -04:00
Brent Vatne bf63dcea70 Update CHANGELOG 2020-10-07 12:34:43 -07:00
Brent Vatne 9551c8773d Release 0.18.5 2020-10-07 12:33:14 -07:00
Brent Vatne 470ff609fd [android] Always add expo-notifications for SDK >= 39 projects with android.enableDangerousExperimentalLeanBuilds enabled (#267) 2020-10-07 10:29:50 -07:00
Eric Samelson addba74b9d Release 0.18.4 2020-10-06 18:38:53 -07:00
Eric Samelson b63e9e3f34 update CHANGELOG 2020-10-06 18:37:48 -07:00
Eric Samelson 25aaa849f1 [android] update sdk 39 tarball for android notifications/updates fix 2020-10-06 18:36:22 -07:00
Brent Vatne edc712d820 update CHANGELOG 2020-10-03 22:51:11 -07:00
Brent Vatne 23c3e3509c Release 0.18.3 2020-10-03 22:48:52 -07:00
Brent Vatne 406a3be4f1 Update @expo/xdl to fix regression in SDK <= 39 splash 2020-10-03 22:15:55 -07:00
Eric Samelson dd60721270 update CHANGELOG 2020-10-03 15:19:38 -07:00
Eric Samelson 469ead8df8 Release 0.18.2 2020-10-03 15:18:25 -07:00
Brent Vatne aa0ce81e98 [ios] Update client tarball 2020-10-03 15:15:47 -07:00
Eric Samelson dccccb7716 [android] update SDK 39 tarball with linking fix 2020-10-03 15:10:09 -07:00
Brent Vatne 57f8404b6d [ios] update sdk39 tarball 2020-10-02 22:09:09 -07:00
Brent Vatne ba7309bc4b Update @expo/config and @expo/xdl. Temporarily bring in type definitions for color-string and xcode. 2020-10-02 20:58:39 -07:00
Brent Vatne 4aec3d5ba7 Update CHANGELOG 2020-10-02 18:40:08 -07:00
Brent Vatne d2eb447ebc [android] update sdk39 tarball 2020-10-02 18:16:21 -07:00
Dominik Sokal f177cf4d7f update ios smoke tests recordings (#264) 2020-09-29 15:31:52 +02:00
Dominik Sokal 59a181dee0 update CHANGELOG 2020-09-23 12:16:02 +02:00
Dominik Sokal f4bf860a9a Release 0.18.1 2020-09-23 12:12:59 +02:00
Dominik Sokal 932958ad46 fix building expo sdk 39 with turtle-cli 2020-09-23 12:09:45 +02:00
Eric Samelson 2a54b4578a update CHANGELOG 2020-09-21 15:08:37 -07:00
Eric Samelson 7e234d09a3 Release 0.18.0 2020-09-21 15:07:47 -07:00
Eric Samelson 5b22c351bf update CHANGELOG 2020-09-21 13:20:39 -07:00
Stanisław Chmiela e2020f1ab4 Add SDK39 iOS tarballs (#257) 2020-09-21 13:19:47 -07:00
Eric Samelson c935e53e50 [android][ios] remove SDK 35 tarballs 2020-09-18 15:14:20 -07:00
Eric Samelson 14e681f35f [android] add SDK 39 tarball (#260) 2020-09-18 15:13:32 -07:00
Wojciech Kozyra d3a7ccb582 force image rebuild 2020-09-18 12:34:14 +02:00
Wojciech Kozyra 62478de14a update CHANGELOG.md 2020-09-14 14:22:07 +02:00
Wojciech Kozyra 6594089779 Release 0.17.3 2020-09-14 14:19:59 +02:00
dependabot[bot] 11c5d3ee02 Bump http-proxy from 1.17.0 to 1.18.1 (#256)
Bumps [http-proxy](https://github.com/http-party/node-http-proxy) from 1.17.0 to 1.18.1.
- [Release notes](https://github.com/http-party/node-http-proxy/releases)
- [Changelog](https://github.com/http-party/node-http-proxy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/http-party/node-http-proxy/compare/1.17.0...1.18.1)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-11 12:21:47 +02:00
dependabot[bot] 99b7ac6660 Bump node-fetch from 2.3.0 to 2.6.1 (#259)
Bumps [node-fetch](https://github.com/bitinn/node-fetch) from 2.3.0 to 2.6.1.
- [Release notes](https://github.com/bitinn/node-fetch/releases)
- [Changelog](https://github.com/node-fetch/node-fetch/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/bitinn/node-fetch/compare/v2.3.0...v2.6.1)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-11 12:21:26 +02:00
Stanisław Chmiela 46fe34ed9c Hardcode maximum heap size (#255)
<!-- 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
- [x] 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.
- [x] 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.
- [x] **I've manually tested whether the changes I made work as expected.**

### Motivation and Context

Builds started to fail with

```
Error occurred during initialization of VM
Initial heap size set to a larger value than the maximum heap size
Error: ./gradlew exited with non-zero code: 1
    at ChildProcess.completionListener (/app/turtle/node_modules/@expo/xdl/node_modules/@expo/spawn-async/build/spawnAsync.js:52:23)
    at Object.onceWrapper (events.js:418:26)
    at ChildProcess.emit (events.js:311:20)
    at ChildProcess.EventEmitter.emit (domain.js:482:12)
    at maybeClose (internal/child_process.js:1021:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:286:5)
    ...
    at spawnAsync (/app/turtle/node_modules/@expo/xdl/node_modules/@expo/spawn-async/build/spawnAsync.js:17:21)
    at spawnAsyncThrowError (/app/turtle/node_modules/@expo/xdl/build/detach/ExponentTools.js:201:45)
    at buildShellAppAsync (/app/turtle/node_modules/@expo/xdl/build/detach/AndroidShellApp.js:940:11)
    at async Object.createAndroidShellAppAsync (/app/turtle/node_modules/@expo/xdl/build/detach/AndroidShellApp.js:386:5)
    at async runShellAppBuilder (/app/turtle/build/builders/android.js:95:9)
    at async Object.buildAndroid [as android] (/app/turtle/build/builders/android.js:43:28)
    at async build (/app/turtle/build/jobManager.js:181:33)
    at async processJob (/app/turtle/build/jobManager.js:118:32)
    at async Object.doJob (/app/turtle/build/jobManager.js:49:5)
    at async main (/app/turtle/build/server.js:66:13)
```

### Description

Consulted and helped with by @wkozyra95 — removed experimental options that made maximum heap size being set to a low value. Hardcoded proper value.
2020-09-07 14:05:02 +02:00
Stanisław Chmiela 423fc8bbf5 Upgrade XDL so it processes root build.gradle too (#254)
<!-- 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
- [x] I've read the [Contribution Guidelines](https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [x] I've updated the [CHANGELOG](https://github.com/expo/turtle/blob/master/CHANGELOG.md) if necessary.
- [x] 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.
- [x] **I've manually tested whether the changes I made work as expected.**

### Motivation and Context

Lands https://github.com/expo/expo-cli/pull/2547 in Turtle. This is a prerequisite for https://github.com/expo/expo/pull/10059 to be able to land (otherwise Turtle would end up with the offending block in root `build.gradle` which would fail the builds since there is no `:ReactAndroid` project in Turtle workspace).

### Description

Upgrades XDL.
2020-09-04 13:02:32 +02:00
Wojciech Kozyra 4c8408a46b [docker-base] add gradle 6.2 and set ANDROID_NDK_HOME (#251)
* [docker-base] add gradle 6.2 and set ANDROID_NDK_HOME

* update CHANGELOG
2020-09-04 11:19:08 +02:00
dependabot[bot] 032d7c8b1f Bump decompress from 4.2.0 to 4.2.1 (#252)
Bumps [decompress](https://github.com/kevva/decompress) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/kevva/decompress/releases)
- [Commits](https://github.com/kevva/decompress/compare/v4.2.0...v4.2.1)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-04 09:36:01 +02:00
Dominik Sokal b2a0b3ce14 use http endpoints for status updates (#249)
* use http endpoints for status updates

* resend updates if www failed to process them

* make leader responsible for synchronizing build updates

* fix tests
2020-08-24 10:13:43 +02:00
Dominik Sokal 1ee922763e send logs url with finished and errored messages (#248) 2020-08-17 13:43:40 +02:00
Wojciech Kozyra c31cd379c1 update CHANGELOG.md 2020-08-06 18:00:17 +02:00
Wojciech Kozyra 67754eba2a Release 0.17.2 2020-08-06 17:57:15 +02:00
Wojciech Kozyra 351fed00df Updated iOS shell app for SDK 38 with fixed integer tagging in expo-gl for iOS 14. (#245) 2020-08-06 17:51:49 +02:00
Stanisław Chmiela 487032b11d Update version manually as release-it broke 2020-08-05 18:07:03 +02:00
Stanisław Chmiela 042dd2ccab Add CHANGELOG entry 2020-08-05 16:12:55 +02:00
Stanisław Chmiela 99ae0d1cea Update Android shell tarball for SDK38 with targetSdkVersion bumped to 29 (#244)
<!-- 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
- [x] I've read the [Contribution Guidelines](https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [x] I've updated the [CHANGELOG](https://github.com/expo/turtle/blob/master/CHANGELOG.md) if necessary.
- [x] 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.
- [x] **I've manually tested whether the changes I made work as expected.**

### Motivation and Context

See https://github.com/expo/expo/pull/9446 and https://forums.expo.io/t/google-api-level-29/41231.

### Description

Updated Android SDK38 tarball with project with updated `targetSdkVersion`.
2020-08-05 16:06:46 +02:00
dependabot[bot] ad2c87163b Bump elliptic from 6.4.1 to 6.5.3 (#243)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.4.1 to 6.5.3.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.4.1...v6.5.3)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-31 12:12:03 +02:00
dependabot[bot] b4b9cf362e Bump lodash from 4.17.11 to 4.17.19 (#242)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.19)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-17 09:08:55 +02:00
Dominik Sokal 7ea4dac986 upgrade jest and ts-jest to fix smoke tests (#241) 2020-07-16 14:44:59 +02:00
Dominik Sokal cd8da71711 update CHANGELOG 2020-07-16 08:54:06 +02:00
Dominik Sokal 2a2a0f39e0 Release 0.17.0 2020-07-16 08:51:04 +02:00
Dominik Sokal fbabcdf521 build:android - allow for passing custom gradle args (#239)
* build:android - allow for passing custom gradle args

* update CHANGELOG

* upgrade @expo/xdl to 57.9.25-alpha.1
2020-07-15 11:50:21 +02:00
Dominik Sokal 0803811226 update @expo/xdl to 57.9.25-alpha.0 to get rid of dots when downloading gradle 2020-07-15 10:21:45 +02:00
dependabot[bot] 0976a642e1 Bump npm-registry-fetch from 8.0.0 to 8.1.1 (#238)
Bumps [npm-registry-fetch](https://github.com/npm/registry-fetch) from 8.0.0 to 8.1.1.
- [Release notes](https://github.com/npm/registry-fetch/releases)
- [Changelog](https://github.com/npm/npm-registry-fetch/blob/latest/CHANGELOG.md)
- [Commits](https://github.com/npm/registry-fetch/compare/v8.0.0...v8.1.1)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-08 10:00:37 +02:00
Dominik Sokal 16bd4fe7b6 run yarn before release 2020-07-01 09:38:08 +02:00
Dominik Sokal 3ccd705943 Release 0.16.2 2020-07-01 09:35:06 +02:00
Dominik Sokal 11cc4421dd Release 0.16.1 2020-07-01 09:32:42 +02:00
Wojciech Kozyra 32f5a0bb37 use @expo/config to read project config (#237)
* use @expo/config to read info about project

* update CHANGELOG.md
2020-07-01 09:20:36 +02:00
jameswilddev 61a1906e01 Allow override of protocol validation in--public-url (#235)
* Allow override of protocol validation (https://github.com/expo/turtle/issues/210).

* Fix lint.
2020-06-29 10:01:15 +02:00
Eric Samelson 19a17231b3 update CHANGELOG 2020-06-25 09:31:08 -07:00
Eric Samelson 98c03bc8a2 Release 0.16.0 2020-06-25 09:29:20 -07:00
Eric Samelson 83ab2539c1 [ios][android] remove SDK 34 shell apps 2020-06-23 14:07:24 -07:00
Eric Samelson 064619e1ae [android] add SDK 38 shell tarball (#233) 2020-06-23 14:06:37 -07:00
Tomasz Sapeta b7fe01b758 [ios] Add shell tarballs for SDK38 (#231) 2020-06-23 14:08:43 +02:00
Dominik Sokal 6583b1a1db upgrade ioredis to 4.17.3 2020-06-22 15:00:42 +02:00
Dominik Sokal f24081cb91 Release 0.15.1 2020-06-22 13:45:27 +02:00
Dominik Sokal 4e719a200b update CHANGLEOG 2020-06-22 13:44:51 +02:00
Dominik Sokal 0b13494402 configure turtle to use the redis ca certificate (#232)
* add .vscode to gitignore

* configure turtle to use the redis ca certificate
2020-06-22 13:42:07 +02:00
Dominik Sokal 0ca26a40aa fix announcing supported sdk versions 2020-06-22 12:26:06 +02:00
Dominik Sokal f171913bac [circleci] bump yarn cache key 2020-06-18 15:32:41 +02:00
Dominik Sokal b47ee91117 update CHANGELOG.md 2020-06-02 14:06:05 +02:00
Dominik Sokal 77cb28ce66 Release 0.15.0 2020-06-02 14:04:22 +02:00
Dominik Sokal 7a2453cf53 upgrade @expo/xdl to 57.9.13 (to remove *.bak files from .ipa) 2020-06-02 14:01:11 +02:00
Charlie Cruzan 924908905f Update CHANGELOG.md 2020-05-14 10:17:23 -04:00
cruzach 798b4acca6 Release 0.14.12 2020-05-14 10:15:22 -04:00
cruzach 2303b44dd2 [ios] Update iOS custom client shell app 2020-05-13 09:27:17 -04:00
cruzach c204e0bef2 update CHANGELOG 2020-05-04 15:34:30 -04:00
cruzach 0918d8299e Release 0.14.11 2020-05-04 15:28:22 -04:00
cruzach 3543acfb26 [ios] Update sdk-37 shell app for 2.15.5 release 2020-05-04 14:49:41 -04:00
Wojciech Kozyra 42b6ff634c Release 0.14.10 2020-05-01 17:54:45 +02:00
Wojciech Kozyra fcd42b272f Update CHANGELOG 2020-05-01 17:54:09 +02:00
Wojciech Kozyra ecaef3a91d enable lean builds (#217) 2020-05-01 17:51:19 +02:00
Stanisław Chmiela 413e6a564d Cut 0.14.9 in CHANGELOG 2020-04-21 11:13:40 +02:00
Stanisław Chmiela ac27332151 Release 0.14.9 2020-04-21 11:12:24 +02:00
Stanisław Chmiela 72744f58ec [android] Build only the app artifact and not all available libraries (#214)
### Motivation and Context

I have noticed that not only the `app` project is being built on Turtle, but all the projects. (cross-posting from https://github.com/expo/expo-cli/pull/1937)

### Description

I've scoped the Gradle command to only build/assemble the `:app` project. It should be safe to do for all SDKs, since on all SDKs the app project was called `app`.

Published an alpha version of XDL to NPM, upgraded Turtle to it, deployed to staging and ran the build. It was over a minute faster than without this change ([new](https://staging.expo.io/dashboard/sjchmiela/builds/5c386cef-e808-49d3-91d8-9ce42af77c36) vs [old](https://staging.expo.io/dashboard/sjchmiela/builds/3d36340e-6ae1-4476-91cb-07d81f1edd1e)). (cross-posting from https://github.com/expo/expo-cli/pull/1937)
2020-04-21 11:11:52 +02:00
Stanisław Chmiela 96af4f753d Cut 0.14.8 in CHANGELOG 2020-04-20 16:48:54 +02:00
Stanisław Chmiela 4059c6f354 Release 0.14.8 2020-04-20 16:47:22 +02:00
Stanisław Chmiela b48f89054b Update XDL to remove check-dynamic-macros call (#212)
### Motivation and Context

See https://github.com/expo/expo-cli/pull/1933 and https://github.com/expo/expo/pull/7919.

### Description

Updates XDL so it includes change introduced in https://github.com/expo/expo-cli/pull/1933.
2020-04-20 16:46:35 +02:00
Stanisław Chmiela 7361f4af52 [changelog] Update changelog with 0.14.7 2020-04-20 12:40:16 +02:00
Stanisław Chmiela 41b48f0c66 Release 0.14.7 2020-04-20 12:39:17 +02:00
Stanisław Chmiela 56b3011d25 Remove secrets from SDK37 shell app, fix google-services.json handling (#209)
<!-- 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
- [x] I've read the [Contribution Guidelines] (https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [x] I've updated the [CHANGELOG](https://github.com/expo/turtle/blob/master/CHANGELOG.md) if necessary.
- [x] 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.
- [x] **I've manually tested whether the changes I made work as expected.**

### Motivation and Context

- `google-services.json` was being handled unintuitively, fixed with https://github.com/expo/expo-cli/pull/1897
- Expo Client's secrets were leaking in shell apps, fixed with https://github.com/expo/expo/pull/7768
- When deployed, fixes https://github.com/expo/expo/issues/7727.

### Description

XDL was modifying `google-services.json`, removing valid keys if the user doesn't provide the same, removed key in _some other place_ (see https://github.com/expo/expo/issues/7727#issuecomment-611544439). Fixed the change in XDL, upgraded to the fixed version here. Also removed secrets from the shell app.
2020-04-20 12:38:27 +02:00
Stanisław Chmiela ef6f9e3c5d Install only production dependencies in shell apps (#211)
<!-- 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
- [x] I've read the [Contribution Guidelines](https://github.com/expo/turtle/blob/master/CONTRIBUTING.md).
- [x] I've updated the [CHANGELOG](https://github.com/expo/turtle/blob/master/CHANGELOG.md) if necessary.
- [x] 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.
- [x] **I've manually tested whether the changes I made work as expected.**

### Motivation and Context

The build process doesn't use any of the `devDependencies` of shell apps and installing them makes the process slower and using more memory.

### Description

Added the `--production` flag to dependencies installer happening inside shell apps so it installs only the real dependencies of the project. This omits dependencies like:
- `babel-core`, `prettier`, `eslint` — we won't transpile, analyze, prettify JS when building the project,
- `expo-cli` — we could use `expo-cli` when building the project, but we don't (`expotools` are used and they are installed in the shell app)
- `expo-yarn-workspaces` — the `--ignore-scripts` removes the need for `expo-yarn-workspaces`

### Test plan

I have tested these changes as part of https://github.com/expo/turtle/pull/209. I have built two apps on SDK37 and both were built successfully.
2020-04-20 10:33:49 +02:00
Stanisław Chmiela 0302a5f71b Revert "Install only production dependencies in shell apps when setting up CLI too"
This reverts commit abb604b3b5.
2020-04-20 10:26:16 +02:00
Stanisław Chmiela abb604b3b5 Install only production dependencies in shell apps when setting up CLI too 2020-04-20 09:41:27 +02:00
Wojciech Kozyra f87dcc6972 add --ignore-scripts to yarn install in shellapp 2020-04-09 16:37:56 +02:00
Dominik Sokal fb27531805 Release 0.14.6 2020-04-09 15:14:53 +02:00
Dominik Sokal b307e0ed7f update CHANGELOG 2020-04-09 15:13:56 +02:00
Wojciech Kozyra 9bfa7c5674 improve deployment speed for android workers (#205)
improve deployment speed for android workers
2020-04-09 13:43:45 +02:00
Dominik Sokal 0fcade4a1f include turtle mode in in-progress message (#206)
* send turtle mode in in-progress message

* update smoke test recordings
2020-04-09 10:20:56 +02:00
Dominik Sokal df4b38711a upgrade @expo/xdl to 57.8.17 to fix downloading assets smaller than 10 bytes (fixes expo/expo#7701) 2020-04-08 15:48:19 +02:00
dependabot[bot] a2b5aa2934 Bump acorn from 6.1.0 to 6.4.1 (#202)
Bumps [acorn](https://github.com/acornjs/acorn) from 6.1.0 to 6.4.1.
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/6.1.0...6.4.1)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-04-08 10:13:07 +02:00
Dominik Sokal 556e0758e7 don't use nix for ios smoke tests 2020-04-07 10:22:28 +02:00
Dominik Sokal 762c6f0538 Release 0.14.5 2020-04-06 14:27:36 +02:00
Dominik Sokal f549695e07 [turtle-cli] make the @expo/config error more meaningful 2020-04-06 14:27:10 +02:00
Dominik Sokal 1e8868e190 Release 0.14.4 2020-04-06 13:25:00 +02:00
Dominik Sokal 93df019bbc update CHANGELOG 2020-04-06 13:24:20 +02:00
Dominik Sokal 5541daa6ec [turtle-cli] insatll @expo/config and use it for determining sdk version 2020-04-06 13:21:29 +02:00
Dominik Sokal 22d78bf6fc [circleci] update cache key for shell apps 2020-04-06 12:26:03 +02:00
Dominik Sokal 4c724289d7 install node deps in android shell app when running smoke tests 2020-04-06 12:25:46 +02:00
Dominik Sokal c5a44dfb67 [circleci] run ios smoke test for sdk37 2020-04-06 12:24:44 +02:00
Dominik Sokal 8bbdc55932 [android] update smoke tests recording file 2020-04-06 12:23:36 +02:00
Dominik Sokal 80233c5736 [ios] update smoke test recordings 2020-04-06 11:38:32 +02:00
Dominik Sokal 5a2b8c47f4 Release 0.14.3 2020-04-03 17:13:47 +02:00
Dominik Sokal ab9391d672 update CHANGELOG - change the version to 0.14.3 - I incidentally interrupted the release 2020-04-03 17:13:24 +02:00
Dominik Sokal e95a6f49ff Release 0.14.2 2020-04-03 17:11:15 +02:00
Dominik Sokal d662cd47b6 [android] update sdk37 tarball so it doesn't use jq internally (#201)
* [android] update sdk37 tarball so it doesn't use jq internally

* [android] update sdk37 tarball again

* update CHANGELOG
2020-04-03 17:10:19 +02:00
Eric Samelson ce5de0963b Release 0.14.1 2020-04-01 14:16:42 -07:00
Eric Samelson 8f717c6c2e update CHANGELOG 2020-04-01 14:16:29 -07:00
Eric Samelson 905b55b7a4 [ios] update SDK 37 shell tarball to properly exclude unnecessary unimodules 2020-04-01 12:21:38 -07:00
Eric Samelson 4588281ffa Update CHANGELOG 2020-03-31 14:42:25 -07:00
Eric Samelson bc13f12052 Release 0.14.0 2020-03-31 14:40:15 -07:00
Eric Samelson 63d3e82cd7 [ci] update android tests to use sdk 37 2020-03-31 12:30:21 -07:00
Eric Samelson b2f8fdd342 [ios][android] drop SDK 33 2020-03-30 21:53:42 -07:00
Eric Samelson 4d9b3bdee9 [android][sdk37] add SDK 37 shell tarball (#198) 2020-03-30 21:52:41 -07:00
Bartłomiej Bukowski 15c165be26 [ios][sdk37] Add SDK 37 shell app tarball (#194) 2020-03-30 21:51:32 -07:00
Dominik Sokal f63e34ace3 Upgrade node to v12 / Drop node v8 support / Drop SDK 31 and 32 (#186) 2020-03-23 16:17:18 -07:00
dependabot[bot] e4ec82d1db Bump acorn from 5.7.3 to 5.7.4 (#195)
Bumps [acorn](https://github.com/acornjs/acorn) from 5.7.3 to 5.7.4.
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/5.7.3...5.7.4)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-03-18 15:35:29 +01:00
Dominik Sokal 941a605591 [turtle-cli] print currently using java version (if other than 8) 2020-03-10 12:26:28 +01:00
Dominik Sokal 8b9ad9846b [turtle-cli] replace / with __ to fix a bug with selecting APK file in Android Studio 2020-03-10 10:46:23 +01:00
Charlie Cruzan d488177daa Update CHANGELOG.md 2020-03-09 14:47:59 -04:00
cruzach 1ef3564adf Release 0.13.10 2020-03-09 14:44:58 -04:00
Dominik Sokal 1e29177bd0 preinstall gradle 4.10.2 and 5.6.3 (#189) 2020-03-09 13:56:02 +01:00
cruzach aa1605a5db [ios][expo-ads-admob][expo-ads-facebook] Remove UIWebView refs 2020-03-08 11:18:27 -04:00
Dominik Sokal 2f628efda3 Upgrade NDK to 17c (#188)
* upgrade ndk

* fix Dockerfile

* update CHANGELOG
2020-03-06 12:06:52 +01:00
Dominik Sokal 7f95b533ad [turtle-cli] verify if --public-url is a https url 2020-03-05 12:44:54 +01:00
Dominik Sokal 478d9ebe2b Update CHANGELOG.md 2020-03-05 09:51:04 +01:00
cruzach 0d1366b180 [ios] remove UIWebView 2020-03-03 08:25:21 -08:00
Dominik Sokal 8615f2eb9b [turtle-cli] fix platform for logs when using shortcut commands 2020-03-03 11:06:43 +01:00
Dominik Sokal a3b7867f10 volta: pin [email protected] 2020-03-03 10:53:12 +01:00
Dominik Sokal 656c53dde6 add .history to .gitignore 2020-03-02 10:32:57 +01:00
Eric Samelson e1fed149be update CHANGELOG 2020-02-13 12:27:46 -08:00
Eric Samelson 752b767800 Release 0.13.9 2020-02-13 12:26:14 -08:00
Eric Samelson 4b2ff4fced [ios] fix Notifications.getDevicePushTokenAsync occasional errors 2020-02-13 12:04:49 -08:00
Dominik Sokal a6501db230 install jq on android builder (#178) 2020-02-04 12:53:33 +01:00
cruzach 73e249854a Update Changelog 2020-01-27 18:42:10 -05:00
cruzach 1fb5d448fb Release 0.13.8 2020-01-27 18:22:09 -05:00
cruzach f1e1ef782b [android] prevent apps from crashing on startup 2020-01-27 15:09:30 -05:00
cruzach 81c905ed95 [android] add MapsPackage handling for mapview 2020-01-27 11:21:21 -05:00
Dominik Sokal ecdc8486fe Release 0.13.7 2020-01-17 12:22:50 +01:00
Quinlan Jung 6adaaf5dd1 bump traveling-fastlane to 1.11.4 (#172)
* bump traveling-fastlane to 1.11.4

* its not 2029 yet
2020-01-17 12:10:18 +01:00
Dominik Sokal 57c7dbfb43 fix ios smoke tests (#173)
* fix ios smoke tests

* download sdk35 instead of sdk32
2020-01-17 12:09:27 +01:00
dependabot[bot] cee42b1d6c Bump handlebars from 4.1.0 to 4.5.3 (#171)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.0 to 4.5.3.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.0...v4.5.3)

Signed-off-by: dependabot[bot] <[email protected]>
2020-01-02 10:20:48 +01:00
Tomasz Sapeta 69905bd886 Release 0.13.6 2019-12-17 20:30:04 +01:00
Tomasz Sapeta 37a8cff615 Update changelog 2019-12-17 20:29:36 +01:00
Wojciech Kozyra c8992aa2f4 Release 0.13.5 2019-12-17 16:28:00 +01:00
Tomasz Sapeta 38e05bc20a Add missing RCTAssetsLibraryRequestHandler to iOS tarball for SDK36 (#170)
### Motivation and Context

Fixes https://github.com/expo/expo/issues/6524

### Description

Updating iOS shell tarball for SDK36.
2019-12-17 16:25:22 +01:00
Dominik Sokal 4a8e14fa8b Release 0.13.4 2019-12-13 10:15:37 +01:00
Dominik Sokal 77c7fce666 upgrade @expo/xdl to 57.4.0 2019-12-13 10:10:29 +01:00
Eric Samelson 7f6faecbd1 Release 0.13.3 2019-12-12 13:47:48 -08:00
Eric Samelson 718e3e9ab6 update CHANGELOG 2019-12-12 13:45:57 -08:00
Eric Samelson 2a120fa22c [ios] remove private API usage from SDK 36 tarball 2019-12-12 13:45:14 -08:00
Eric Samelson 1b6e482be5 Release 0.13.2 2019-12-10 21:47:03 -08:00
Eric Samelson 5072a98b50 update CHANGELOG 2019-12-10 21:46:45 -08:00
Eric Samelson 0584fd20fb [android] fix deps in SDK 36 tarball 2019-12-10 19:05:15 -08:00
Eric Samelson 701d6afcf7 [android] update SDK 36 shell tarball with rootview background color fix 2019-12-10 17:36:30 -08:00
Eric Samelson 87515eae23 bump xdl to 57.3.1 2019-12-10 17:32:51 -08:00
Brent Vatne 27de1abc09 Bump xdl (#167) 2019-12-10 14:18:59 -08:00
Eric Samelson f5fb3ae4b6 Release 0.13.1 2019-12-09 14:51:01 -08:00
Eric Samelson 9a4f97c4ed update CHANGELOG 2019-12-09 14:50:51 -08:00
Eric Samelson 1bbcd8f0cc [android] fix SDK 36 tarball 2019-12-09 14:38:39 -08:00
Eric Samelson 415f0dd2aa Release 0.13.0 2019-12-09 12:37:46 -08:00
Eric Samelson 86766ddfef update CHANGELOG 2019-12-09 12:37:31 -08:00
Eric Samelson e976e86607 [ios][android] add SDK 36 tarballs (#165) 2019-12-09 12:35:16 -08:00
Dominik Sokal 6399d64033 Release 0.12.12 2019-11-22 12:16:00 +01:00
Dominik Sokal 3d8dc3cab8 Fix expo.owner not being used (#163)
* [turtle-cli] use expo.owner if defined

* update CHANGELOG
2019-11-22 12:14:30 +01:00
Quinlan Jung ae1a6e8820 Release 0.12.11 2019-11-20 15:24:08 -08:00
Quinlan Jung 52eb27c7b8 Update CHANGELOG 2019-11-20 15:22:17 -08:00
Quinlan Jung 4b9d90544a bump traveling-fastlane to 1.11.0 2019-11-20 15:21:33 -08:00
Quinlan Jung 7871bb039a Release 0.12.10 2019-11-15 14:59:27 -08:00
Quinlan Jung 507102dfac Update CHANGELOG 2019-11-15 14:56:54 -08:00
Quinlan Jung d6dd722d8b add shellAppSdkVersion param to iosShellAppBuilder (#162) 2019-11-15 14:52:11 -08:00
Dominik Sokal b2aed931b5 Release 0.12.9 2019-11-14 10:26:07 +01:00
Dominik Sokal 4e6ffc1235 update CHANGELOG 2019-11-14 10:24:15 +01:00
Dominik Sokal 811cc433ca add updating turtle and supported sdk versions in www (#161) 2019-11-13 12:43:13 +01:00
Dominik Sokal 52cbd973b3 remove extra empty line 2019-11-04 09:43:06 +01:00
Stanisław Chmiela 397bd15203 Upgrade XDL to support Facebook autoinit-disabling features (#155)
* Upgrade XDL to support Facebook autoinit-disabling features

* Add changelog entry

* To Be Reverted: update SDK35 tarball with temporary Expo-master with required changes

* To Be Reverted: update SDK35 tarball with temporary Expo-master with required changes

* Revert "To Be Reverted: update SDK35 tarball with temporary Expo-master with required changes"

This reverts commit e9ca00faf3.

* Revert "To Be Reverted: update SDK35 tarball with temporary Expo-master with required changes"

This reverts commit beafc10133.
2019-10-30 18:24:25 +01:00
cruzach 1f6f6f7caf update CHANGELOG 2019-10-29 15:35:47 -04:00
cruzach 0e7b0633d5 Release 0.12.8 2019-10-29 15:31:37 -04:00
cruzach 2b890be48e [android] update SDK 35 shell tarball to fix Linking.openUrl 2019-10-29 13:45:14 -04:00
Dominik Sokal fac39ba644 [turtle-cli] enforce java 8 (#156)
* [turtle-cli] enforce java 8

* update CHANGELOG
2019-10-28 11:38:28 +01:00
Eric Samelson a28f407f03 update CHANGELOG 2019-10-25 12:15:01 -07:00
Eric Samelson eee18d2f18 Release 0.12.7 2019-10-25 12:13:22 -07:00
Eric Samelson 6457adba57 [android] update SDK 35 shell tarball to fix GCM crash 2019-10-25 12:13:08 -07:00
Eric Samelson 6ad71bd512 Release 0.12.6 2019-10-25 12:11:48 -07:00
Dominik Sokal 0ee897531f handle invalid build jobs in better way (#152) 2019-10-24 12:43:57 +02:00
cruzach 8c46d1c8bf update CHANGELOG 2019-10-18 19:34:26 -04:00
cruzach d87873637b Release 0.12.5 2019-10-18 19:20:37 -04:00
cruzach d6496996b6 update SDK 35 shell tarball with WebBrowser fix 2019-10-18 15:37:08 -04:00
Eric Samelson 2df39da2e6 Release 0.12.4 2019-10-11 16:08:23 -07:00
Eric Samelson 6925e290cc Update CHANGELOG 2019-10-11 16:08:14 -07:00
Eric Samelson 9e2557b6f4 [android] update SDK 35 shell tarball with OTA update fix 2019-10-11 14:45:51 -07:00
Quinlan Jung d743f8313e Release 0.12.3 2019-10-09 15:02:48 -07:00
Quinlan Jung 7df3f70e9c Update CHANGELOG 2019-10-09 14:52:26 -07:00
Quinlan Jung 34cf811fd7 update client shell tarball (#145) 2019-10-08 09:58:23 -07:00
Eric Samelson 1d825e6310 Release 0.12.2 2019-09-27 10:14:48 -07:00
Eric Samelson dd6c806e0f Update CHANGELOG 2019-09-27 10:14:36 -07:00
Eric Samelson ccbdf7418e [android] update sdk35 shell tarball with battery fix 2019-09-26 22:20:58 -07:00
Eric Samelson 552c1074c0 Release 0.12.1 2019-09-20 16:35:45 -07:00
Eric Samelson 18d35d7730 Update CHANGELOG 2019-09-20 16:35:21 -07:00
Eric Samelson 7aaac7b648 [ios] update sdk 35 shell app with notification token cleanup 2019-09-20 16:34:58 -07:00
Eric Samelson c472a5a6ea [ios] backport ios 13 fixes to SDK 33 and 34 2019-09-20 15:43:41 -07:00
Eric Samelson 527821ee50 Release 0.12.0 2019-09-19 15:02:17 -07:00
Eric Samelson d2bff1639c Update CHANGELOG 2019-09-19 15:00:25 -07:00
Eric Samelson 84cf930537 [ios][android] add sdk35 and remove sdk27-30 shell tarballs (#140) 2019-09-19 14:40:17 -07:00
Stanisław Chmiela 4c3582b8df [changelog] Update changelog entry 2019-09-19 07:24:46 +02:00
Stanisław Chmiela 52b029a5a9 Release 0.11.3 2019-09-19 07:23:32 +02:00
Stanisław Chmiela 86047db677 [expo-branch] Change package of vendored expo-branch (#138)
* [expo-branch] Change package of vendored expo-branch

* shell tarball with rebuilt expokit

* Update SDK34 Android tarball
2019-09-19 07:21:55 +02:00
186 changed files with 26370 additions and 1 deletions

No files matched your search

+333
View File
@@ -0,0 +1,333 @@
version: 2.1
executors:
nix: &nix
docker:
- image: lnl7/nix:2.2
# Symlink to the readline-enabled bash which is the default command of the container
shell: /run/current-system/sw/bin/bash -leo pipefail
working_directory: ~/turtle
mac:
macos: # https://circleci.com/docs/2.0/testing-ios/#supported-xcode-versions
xcode: "11.1.0"
working_directory: /Users/distiller/project
shell: /bin/bash -leo pipefail
android:
<<: *nix
resource_class: xlarge
commands:
install_nix:
steps:
- run:
name: Install nix
command: curl https://nixos.org/releases/nix/nix-2.2.1/install | bash -s -- --no-daemon
- run:
name: Add nix-initializing line to .bashrc
command: echo ". ~/.nix-profile/etc/profile.d/nix.sh" >> ~/.bashrc
setup:
steps:
- run:
name: Install common packages
command: |
nix-env -iA \
nixpkgs.binutils \
nixpkgs.curl \
nixpkgs.direnv \
nixpkgs.findutils \
nixpkgs.gawk \
nixpkgs.git \
nixpkgs.gnused \
nixpkgs.gnutar \
nixpkgs.gzip \
nixpkgs.openssh \
nixpkgs.python \
nixpkgs.xz
- run:
name: Configure direnv
command: |
mkdir -p ~/.config/direnv
echo -e "[whitelist]\nprefix = [ \"$HOME\" ]" > ~/.config/direnv/config.toml
echo 'eval "$(direnv export bash)"' >> ~/.bash_profile
- run:
name: Configure yarn
command: echo '--frozen-lockfile true' >> ~/.yarnrc
- checkout
- run:
name: Configure aws-cli
command: |
aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
setup_nix:
steps:
- run:
name: Add cp and rm stubs
command: |
cat \<< 'EOF' >> /bin/cp
#! /usr/bin/env bash
/usr/bin/env cp "$@"
EOF
chmod +x /bin/cp
cat \<< 'EOF' >> /bin/rm
#! /usr/bin/env bash
/usr/bin/env rm "$@"
EOF
chmod +x /bin/rm
install_nodejs_mac:
parameters:
nodejs_version:
type: string
default: 12.16.1
yarn_version:
type: string
default: 1.22.0
steps:
- restore_cache:
key: "node-js-v1-darwin-archive-<< parameters.nodejs_version >>"
- run:
name: Uninstall yarn with brew
command: brew uninstall --force yarn
- install_node_and_yarn:
platform: darwin
nodejs_version: "<< parameters.nodejs_version >>"
yarn_version: "<< parameters.yarn_version >>"
- save_cache:
key: "node-js-v1-darwin-archive-<< parameters.nodejs_version >>"
paths:
- /private/tmp/nodejs.tar.xz
install_node_and_yarn:
parameters:
platform:
type: string
nodejs_version:
type: string
yarn_version:
type: string
steps:
- run:
name: Install node & yarn
command: |
NODEJS_ARCHIVE="/tmp/nodejs.tar.xz"
if [ ! -f "$NODEJS_ARCHIVE" ]; then
curl -o $NODEJS_ARCHIVE -SL "https://nodejs.org/dist/v<< parameters.nodejs_version >>/node-v<< parameters.nodejs_version >>-<< parameters.platform >>-x64.tar.xz"
fi
tar -xJf $NODEJS_ARCHIVE -C /usr/local --strip-components=1 --exclude CHANGELOG.md --exclude README.md --exclude LICENSE
ln -s /usr/local/bin/node /usr/local/bin/nodejs
npm install --global yarn@<< parameters.yarn_version >>
decrypt_secrets_if_possible:
steps:
- run:
name: Decrypt secrets if possible
command: |
if [[ -z "$TURTLE_GIT_CRYPT_KEY_BASE64" ]]; then
echo 'git-crypt key not present in environment'
else
git crypt unlock <(echo $TURTLE_GIT_CRYPT_KEY_BASE64 | base64 --decode)
fi
restore_yarn_cache:
parameters:
workingdir:
type: string
default: .
platform:
type: string
default: linux
steps:
- restore_cache:
key: yarn-v3-<< parameters.platform >>-{{ checksum "<< parameters.workingdir >>/yarn.lock" }}
save_yarn_cache:
parameters:
workingdir:
type: string
default: .
platform:
type: string
default: linux
steps:
- save_cache:
key: yarn-v3-<< parameters.platform >>-{{ checksum "<< parameters.workingdir >>/yarn.lock" }}
paths:
- ~/.cache/yarn # `yarn cache dir`
restore_workingdir_cache:
parameters:
platform:
type: string
default: ios
sdk_version:
type: string
default: sdk39
steps:
- restore_cache:
key: "workingdir-v2-<< parameters.platform >>-<< parameters.sdk_version >>"
save_workingdir_cache:
parameters:
workingdir:
type: string
default: /Users/distiller/project/workingdir
platform:
type: string
default: ios
sdk_version:
type: string
default: sdk39
steps:
- save_cache:
key: "workingdir-v2-<< parameters.platform >>-<< parameters.sdk_version >>"
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
steps:
- setup
- restore_yarn_cache
- run: yarn
- save_yarn_cache
- run: yarn lint
- run: yarn build
unit_tests:
executor: nix
steps:
- setup
- restore_yarn_cache
- run: yarn
- save_yarn_cache
- run:
name: Run unit tests
command: ./scripts/tests/runUnitTestsCI.sh
ios_smoke_tests:
executor: mac
steps:
- install_nix
- install_nodejs_mac
- setup
- decrypt_secrets_if_possible
- restore_yarn_cache:
platform: darwin
- run: yarn
- save_yarn_cache:
platform: darwin
- restore_workingdir_cache:
sdk_version: sdk39
platform: ios
- run:
name: Run iOS smoke tests
command: SDK_VERSION=sdk39 ./scripts/tests/runIOSSmokeTestsCI.sh
- save_workingdir_cache:
workingdir: /Users/distiller/project/workingdir
sdk_version: sdk39
platform: ios
android_smoke_tests:
executor: android
steps:
- setup
- setup_nix
- restore_yarn_cache
- run: yarn
- save_yarn_cache
- restore_workingdir_cache:
sdk_version: sdk39
platform: android
- run:
name: Fetch Android shell app
command: SDK_VERSION=sdk39 ./scripts/android/fetchRemoteAndroidTarball.sh
- run:
name: Run Android smoke tests
command: |
nix-shell nix/android-shell.nix --pure \
--run "./scripts/tests/runAndroidSmokeTestsCI.sh"
- save_workingdir_cache:
workingdir: ~/turtle/workingdir
sdk_version: sdk39
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:
- build
tests:
jobs:
- 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
+27
View File
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
source_local() {
file=./.envrc.local
if [[ -f "$file" ]]; then
source_env $file
fi
watch_file $file
}
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" ] && [[ ! $OSTYPE =~ darwin.* ]]; then
PATH_add $EXPO_TURTLE_TOOLS_DIR/ci/bin
fi
+2
View File
@@ -0,0 +1,2 @@
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
@@ -0,0 +1,38 @@
---
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
@@ -0,0 +1,22 @@
---
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
@@ -0,0 +1,21 @@
---
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 -->
+15
View File
@@ -0,0 +1,15 @@
<!-- 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. -->
+17
View File
@@ -0,0 +1,17 @@
node_modules
yarn-error.log
google-cloud-credentials.json
/build/
/workingdir/*
/artifacts/*
.history
.vscode/
shell.apk
.secrets*
*.swp
*.swo
.envrc.local
+1
View File
@@ -0,0 +1 @@
fixtures/
+1
View File
@@ -0,0 +1 @@
v12.16.1
+9
View File
@@ -0,0 +1,9 @@
{
"git": {
"commit": false,
"tag": true,
"push": true,
"requireUpstream": false,
"tagName": "v${version}"
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"npm": {
"tag": "latest"
},
"git": {
"requireUpstream": false,
"tagName": "v${version}"
},
"github": {
"release": true
},
"hooks": {
"before:init": [
"yarn"
],
"after:release": "yarn release:update:turtle-cli-example"
}
}
+9
View File
@@ -0,0 +1,9 @@
LOGGER_LEVEL="debug"
API_PROTOCOL="http"
API_HOSTNAME="localhost"
API_PORT="3000"
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"
+858
View File
@@ -0,0 +1,858 @@
# 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
- Update Android tarball for SDK 42.
# [0.22.2] - 2021-06-29
- Update iOS tarball for SDK 42.
# [0.22.1] - 2021-06-29
- Update iOS and Android beta tarballs for SDK 42.
# [0.22.0] - 2021-06-22
- Add iOS and Android beta tarballs for SDK 42.
# [0.21.9] - 2021-06-15
- Update `sharp` package, fixes support for M1 macs.
# [0.21.8] - 2021-05-25
- Update Android SDK41 tarball.
# [0.21.7] - 2021-05-21
- Update iOS SDK41 tarball.
- Update Android SDK41 tarball.
# [0.21.6] - 2021-04-22
- Update iOS SDK41 tarball.
- Update Android SDK41 tarball.
# [0.21.5] - 2021-04-15
- Revert iOS client tarball for SDK 41, use the SDK 40 tarball. No longer supporting this feature in SDK 41+.
- Update Android SDK 41 tarball.
# [0.21.4] - 2021-04-13
- Update iOS client tarball for SDK 41.
# [0.21.3] - 2021-04-13
- Update SDK 41 tarball for iOS and Android.
# [0.21.2] - 2021-04-07
- Update SDK 41 beta tarball for Android.
# [0.21.1] - 2021-04-01
- Update SDK 41 beta tarball for iOS.
# [0.21.0] - 2021-03-29
- Add SDK 41 beta tarballs.
- Bump @expo/xdl to 59.1.0.
# [0.20.7] - 2021-01-26
- Remove Go suffix from android app name
# [0.20.6] - 2021-01-25
- Update tarballs for SDK 40 patch release (3e345dd)
# [0.20.5] - 2020-12-23
### Changed
- Updated SDK 40 Android tarball to fix `expo-location` background permissions on Android <9.
# [0.20.4] - 2020-12-17
### Changed
- Updated SDK 40 iOS tarball to fix `expo-notifications` not emitting initial notification response.
# [0.20.3] - 2020-12-10
### Fixed
- Verify jq installation before proceeding with release ([#281](https://github.com/expo/turtle/pull/281)).
- Fixed the iOS build when running offline and user lacks elevated permissions.
# [0.20.2] - 2020-12-09
### Changed
- Updated SDK 40 Android tarball to fix `expo-notifications` installation identifier changing as a bug.
# [0.20.1] - 2020-12-08
### Changed
- Update SDK 40 iOS and Android tarballs for release
# [0.20.0] - 2020-11-30
- Add SDK 40 tarballs in preparation for SDK 40 beta
# [0.19.1] - 2020-11-19
### Fixed
- Fixed the iOS build using Xcode 12.1 by runnig `xcrun simctl list` before the build phase.
- Rebuild iOS tarballs (SDK 36, 37, 38, 39, Ad-Hoc Client) with Xcode 12.1 containing iOS 14 image fix.
# [0.19.0] - 2020-11-13
### Changed
- Rebuild iOS tarballs (SDK 36, 37, 38, 39, Ad-Hoc Client) with Xcode 12.1.
# [0.18.9] - 2020-11-09
### Fixed
- Updated xdl to 58.0.20 to fix an issue with updates.checkAutomatically not being applied properly to SDK 39 Android apps.
# [0.18.8] - 2020-10-27
### Fixed
- Fix issues with Reanimated v2 in Android SDK 39 tarball.
# [0.18.7] - 2020-10-23
### Fixed
- Fix issue with updates in self-hosted Android apps ([#10746](https://github.com/expo/expo/issues/10746)) in the SDK 39 tarball
# [0.18.6] - 2020-10-22
### Fixed
- Fix issues with notifications ([10624](https://github.com/expo/expo/pull/10624) and [10608](https://github.com/expo/expo/pull/10608)) in the Android SDK 39 tarball.
# [0.18.5] - 2020-10-07
### Fixed
- Always add expo-notifications for SDK >= 39 projects with android.enableDangerousExperimentalLeanBuilds enabled.
# [0.18.4] - 2020-10-06
### Fixed
- Fixed an issue with notifications ([expo/expo#10562](https://github.com/expo/expo/issues/10562)) in the Android SDK 39 tarball.
# [0.18.3] - 2020-10-03
### Fixed
- Update @expo/xdl to fix regression in SDK <= 39 splash
# [0.18.2] - 2020-10-03
### Fixed
- Updated SDK 39 Android tarball.
- Updated SDK 39 iOS tarball.
- Updated iOS client tarball.
- Update @expo/config and @expo/xdl. Temporarily bring in type definitions for color-string and xcode.
## [0.18.1] - 2020-09-22
### Fixed
- Fix building apps using SDK 39 for Android.
## [0.18.0] - 2020-09-21
### Added
- Added iOS and Android shell apps for SDK 39.
### Removed
- Dropped support for SDK 35.
## [0.17.3] - 2020-09-14
### Added
- Added gradle 6.2 to `turtle-android-base`
- Added `ANDROID_NDK_HOME` in `turtle-android-base`
### Changed
- Upgraded XDL so it processes root `build.gradle` of Android shell apps too
## [0.17.2] - 2020-08-06
### Changed
- Updated iOS shell app for SDK 38 with fixed integer tagging in expo-gl for iOS 14. ([#245](https://github.com/expo/turtle/pull/245))
## [0.17.1] - 2020-08-05
### Changed
- Updated Android shell app for SDK 38 with `targetSdkVersion` bumped to 29. ([#244](https://github.com/expo/turtle/pull/244))
## [0.17.0] - 2020-07-16
### Added
- `--gradle-args` option for `turtle build:android` which makes it possible to specify custom Gradle arguments.
### Changed
- Gradle Wrapper doesn't print when dots when the appropriate version of Gradle is being downloaded.
## [0.16.2] - 2020-07-01
### Added
- Added `--allow-non-https-public-url` to allow bypass of protocol validation on `--public-url`.
- Added support for dynamic configs (`app.config.ts`, `app.config.js`).
## [0.16.0] - 2020-06-25
### Added
- Added iOS shell app for Expo SDK38.
- Added Android shell app for SDK 38.
### Removed
- Dropped support for SDK 34.
## [0.15.1] - 2020-06-22
### Changed
- Configure Turtle to use the Redis CA certificate.
### Fixed
- Fix announcing supported SDK versions.
## [0.15.0] - 2020-06-02
### Changed
- Updated `@expo/xdl` to 57.9.13 (added \*.bak files clean-up when building .ipa).
## [0.14.12] - 2020-05-14
### Changed
- Update iOS custom client shell app with various fixes.
## [0.14.11] - 2020-05-04
### Changed
- Update SDK 37 iOS shell app with various fixes.
## [0.14.10] - 2020-05-01
### Added
- support for "android.enableDangerousExperimentalLeanBuilds" in app.json.
## [0.14.9] - 2020-04-21
### Changed
- Updated `@expo/xdl` to 57.8.30 (scoped the build command so it only builds the `:app` Android sub-project and not all the sub-projects available, [PR](https://github.com/expo/expo-cli/pull/1937)).
## [0.14.8] - 2020-04-20
### Changed
- Updated `@expo/xdl` to 57.8.29 (removed call to `check-dynamic-macros-android.sh`, [PR](https://github.com/expo/expo-cli/pull/1933)).
## [0.14.7] - 2020-04-20
### Changed
- Turtle no longer installs all dependencies of shell apps projects — only the production dependencies are installed now.
- Updated `@expo/xdl` to 57.8.25 (fixed unintuitive `google-services.json` handling for SDK37+, [PR](https://github.com/expo/expo-cli/pull/1897)).
## [0.14.6] - 2020-04-09
### Changed
- Updated @expo/xdl to 57.8.17 (fixed downloading assets smaller than 10 bytes).
## [0.14.5] - 2020-04-06
### Changed
- Made @expo/config error more meaningful.
## [0.14.4] - 2020-04-06
### Fixed
- Determining SDK version for Expo apps using SDK >=37.
## [0.14.3] - 2020-04-03
### Fixed
- A fix for Android SDK 37 - `check-dynamic-macros-android.sh` doesn't use `jq` anymore.
## [0.14.1] - 2020-04-01
### Changed
- Updated iOS shell app for SDK 37 to remove unnecessary unimodules.
## [0.14.0] - 2020-03-31
### Added
- Added iOS shell app for SDK 37.
- Added Android shell app for SDK 37.
### Changed
- Updated iOS client shell app to support SDK 37.
- Replace `/` with `__` in the artifact filename to fix a strange bug with selecting APK file in Android Studio.
- Print currently using Java version if it's not 8.
### Removed
- Dropped support for SDK 33.
## [0.13.10] - 2020-03-09
### Added
- Added validation for `--public-url`.
### Changed
- Changed the way of installing NDK - it's installed with `sdkmanager` now.
- Upgraded NDK to 17.2.4988734.
- Upgraded Node.js version to 12.16.1.
### Fixed
- A bug where the `platform` field in logs wasn't set correctly when using a shortcut command.
- Removed all remaining instances of `UIWebView` in iOS app builds.
### Removed
- Dropped support for Node.js versions older than 10.
- Dropped support for building Expo SDK 31 and 32 apps.
## [0.13.9] - 2020-02-13
### Fixed
- Fixed Notifications.getDevicePushTokenAsync() erroring occasionally on iOS SDK 36.
## [0.13.8] - 2020-01-27
### Fixed
- Fixed `react-native-maps` native module not being properly initialized (https://github.com/expo/expo/pull/6844)
- Fixed Android standalone apps crashing on startup (https://github.com/expo/expo/pull/6825)
## [0.13.7] - 2020-01-15
### Added
- Bumped `traveling-fastlane` to 1.11.4 to update CA certs
## [0.13.6] - 2019-12-17
### Fixed
- Fixed issue with missing request handler for assets-library urls.
## [0.13.4] - 2019-12-13
### Added
- Support for building iOS apps with a wildcard provisioning profile.
## [0.13.3] - 2019-12-12
### Fixed
- Removed private API usage from iOS SDK 36 tarball
## [0.13.2] - 2019-12-10
### Fixed
- Fixed Android App Bundle builds
- Fixed issue with Root View Background Color and AppLoading on Android SDK 36 builds
## [0.13.1] - 2019-12-09
### Fixed
- Fixed Android shell app for SDK 36
## [0.13.0] - 2019-12-09
### Added
- Added iOS and Android shell apps for SDK 36
### Changed
- Updated iOS client shell app to support SDK 36
## [0.12.12] - 2019-11-22
### Fixed
- A bug that caused `expo.owner` value not to be used if defined.
## [0.12.11] - 2019-11-20
### Added
- Bumped `traveling-fastlane` to 1.11.0
## [0.12.10] - 2019-11-15
### Added
- Add `shellAppSdkVersion` param to `IOSShellAppBuilder` so entitlement keys get properly added in (https://github.com/expo/turtle/pull/162)
## [0.12.9] - 2019-11-14
### 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.
### 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.
## [0.4.3] - 2019-01-09
### Changed
- Update iOS shell app for SDK32.
- Update Android shell app for SDK32.
+7
View File
@@ -0,0 +1,7 @@
# Community Code of Conduct
The Expo team is committed to fostering an open and welcoming environment.
**Our Community Guidelines can be found here:**
https://expo.io/guidelines
+30
View File
@@ -0,0 +1,30 @@
# Contributing to Turtle CLI
## How to contribute
You can contribute to Turtle CLI in various ways, including:
- [Reporting bugs or issues](https://github.com/expo/turtle/issues/new) on GitHub. Please make sure to fill in all the details suggested by the template to make sure the issue can be addressed as quickly as possible.
- [Submitting improvements to the documentation](https://github.com/expo/expo/tree/master/docs). Updates, enhancements, new guides, spelling fixes…
- Helping other people on [Expo Forums](https://forums.expo.io/) and on [Expo Developers Slack](http://slack.expo.io).
- Looking at existing [issues](https://github.com/expo/turtle/issues) and adding more information, particularly helping to reproduce the issues.
- [Submitting a pull request](#submitting-a-pull-request) with a bug fix or an improvement.
## Turtle CLI repository
### Codebase
This repository contains the codebase for the `turtle-cli` NPM package. The same codebase is used to run standalone app builders on the Expo servers.
### 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.
## 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/`.)
2. Write the description of your pull request. Make sure to include a test plan and test your changes.
3. Make sure all tests pass on CircleCI.
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).
+35
View File
@@ -0,0 +1,35 @@
# 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_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.
+28
View File
@@ -0,0 +1,28 @@
# see docker-base/Dockerfile to learn what's installed in the turtle-android-base image
FROM gcr.io/exponentjs/turtle-android-base:0.5.0
ADD . /app/turtle
WORKDIR /app/turtle
RUN ./scripts/fetchRemoteTarballs.sh android
RUN ln -s /app/turtle/workingdir /app/workingdir && \
for SDK_VERSION in `ls /app/workingdir/android/`; do \
echo "preparing $SDK_VERSION shell app" && \
cd /app/workingdir/android/$SDK_VERSION && \
mv packages non-workspace-packages && \
# Keep in sync with src/bin/setup/android/index.ts#_installNodeModules
# --prod requires --ignore-scripts (otherwise
# expo-yarn-workspaces errors as missing)
yarn install --ignore-scripts --prod && \
mv non-workspace-packages packages ; \
done
ENV NODE_ENV "production"
ENV TURTLE_WORKING_DIR_PATH /app/turtle/workingdir/
ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf
ADD redislabs_ca.pem /var/run/config/redislabs-tls/redislabs_ca.pem
CMD ["/usr/bin/supervisord"]
+21
View File
@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+43 -1
View File
@@ -1 +1,43 @@
this commit is not really deployed to our builders :(
<h3 align=center>
<img src="logo/horizontal.png" width=50%>
</h3>
[![CircleCI](https://img.shields.io/circleci/project/github/expo/turtle/master.svg)](https://circleci.com/gh/expo/turtle)
[![NPM](https://img.shields.io/npm/v/turtle-cli/latest.svg)](https://npmjs.com/package/turtle-cli)
[![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/expo/turtle/blob/master/LICENSE)
[![Expo Developers Slack](https://img.shields.io/badge/Expo%20Developers-e01563.svg?logo=slack)](http://slack.expo.io)
[![Expo Forums](https://img.shields.io/badge/Expo%20Forums-blue.svg)](https://forums.expo.io/)
<hr />
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)
- [Code of Conduct](CODE_OF_CONDUCT.md)
## Installation
[Installation instructions and documentation here.](https://docs.expo.io/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.
- Ask for help in **one** of the following ways:
* create [a GitHub issue](https://github.com/expo/turtle/issues/new).
* create a new topic on [Expo Forums](https://forums.expo.io/).
* 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.
Executable
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env node
'use strict';
const subcommand = process.argv[2];
if (subcommand) {
let platform;
if (subcommand.length === 2) {
const letter = subcommand[1];
if (letter === 'a') {
platform = 'android';
} else if (letter === 'i') {
platform = 'ios';
}
} else {
const [, maybePlatform] = subcommand.split(':');
platform = maybePlatform;
}
if (platform === 'ios' || platform === 'android') {
// so that logs have correct platform set
process.env.PLATFORM = platform;
}
}
require('source-map-support').install();
require('../build/bin/env').initOfflineEnv();
require('../build/bin/index').run('turtle');
+1
View File
@@ -0,0 +1 @@
configureAndroidSdk.sh
+100
View File
@@ -0,0 +1,100 @@
# 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\
jq\
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 12.16.1
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 configureAndroidSdk.sh /tmp/configureAndroidSdk.sh
RUN /tmp/configureAndroidSdk.sh --install-all-platforms
ENV ANDROID_NDK_HOME /usr/local/android-sdk-linux/ndk/17.2.4988734
# Support Gradle
ENV TERM dumb
# Install gradle 6.2
RUN wget https://services.gradle.org/distributions/gradle-6.2-all.zip
RUN unzip -qq gradle-6.2-all.zip
RUN cp -r gradle-6.2 /usr/local
RUN mkdir -p /root/.gradle/wrapper/dists/gradle-6.2-all/dvufqs6kielxeao781pmk5huj
RUN mv gradle-6.2-all.zip /root/.gradle/wrapper/dists/gradle-6.2-all/dvufqs6kielxeao781pmk5huj
RUN mv gradle-6.2 /root/.gradle/wrapper/dists/gradle-6.2-all/dvufqs6kielxeao781pmk5huj
RUN touch /root/.gradle/wrapper/dists/gradle-6.2-all/dvufqs6kielxeao781pmk5huj/gradle-6.2-all.zip.ok
RUN touch /root/.gradle/wrapper/dists/gradle-6.2-all/dvufqs6kielxeao781pmk5huj/gradle-6.2-all.zip.lck
RUN chmod 755 /root/.gradle/wrapper/dists/gradle-6.2-all/dvufqs6kielxeao781pmk5huj/gradle-6.2/bin/gradle
# Install gradle 5.6.3
RUN wget https://services.gradle.org/distributions/gradle-5.6.3-all.zip
RUN unzip -qq gradle-5.6.3-all.zip
RUN cp -r gradle-5.6.3 /usr/local
RUN mkdir -p /root/.gradle/wrapper/dists/gradle-5.6.3-all/7wpcz6s7ut7bllr9k6e1hazxc
RUN mv gradle-5.6.3-all.zip /root/.gradle/wrapper/dists/gradle-5.6.3-all/7wpcz6s7ut7bllr9k6e1hazxc
RUN mv gradle-5.6.3 /root/.gradle/wrapper/dists/gradle-5.6.3-all/7wpcz6s7ut7bllr9k6e1hazxc
RUN touch /root/.gradle/wrapper/dists/gradle-5.6.3-all/7wpcz6s7ut7bllr9k6e1hazxc/gradle-5.6.3-all.zip.ok
RUN touch /root/.gradle/wrapper/dists/gradle-5.6.3-all/7wpcz6s7ut7bllr9k6e1hazxc/gradle-5.6.3-all.zip.lck
RUN chmod 755 /root/.gradle/wrapper/dists/gradle-5.6.3-all/7wpcz6s7ut7bllr9k6e1hazxc/gradle-5.6.3/bin/gradle
ENV GRADLE_HOME /usr/local/gradle-5.6.3
ENV PATH ${GRADLE_HOME}/bin:$PATH
# Install gradle 4.10.2
RUN wget https://services.gradle.org/distributions/gradle-4.10.2-all.zip
RUN mkdir -p /root/.gradle/wrapper/dists/gradle-4.10.2-all/9fahxiiecdb76a5g3aw9oi8rv
RUN unzip -qq gradle-4.10.2-all.zip
RUN mv gradle-4.10.2-all.zip /root/.gradle/wrapper/dists/gradle-4.10.2-all/9fahxiiecdb76a5g3aw9oi8rv
RUN mv gradle-4.10.2 /root/.gradle/wrapper/dists/gradle-4.10.2-all/9fahxiiecdb76a5g3aw9oi8rv
RUN touch /root/.gradle/wrapper/dists/gradle-4.10.2-all/9fahxiiecdb76a5g3aw9oi8rv/gradle-4.10.2-all.zip.ok
RUN touch /root/.gradle/wrapper/dists/gradle-4.10.2-all/9fahxiiecdb76a5g3aw9oi8rv/gradle-4.10.2-all.zip.lck
RUN chmod 755 /root/.gradle/wrapper/dists/gradle-4.10.2-all/9fahxiiecdb76a5g3aw9oi8rv/gradle-4.10.2/bin/gradle
+14
View File
@@ -0,0 +1,14 @@
{
"displayName": "turtle",
"testEnvironment": "node",
"rootDir": "../src",
"moduleNameMapper": {
"^turtle/(.*)$": "<rootDir>/$1"
},
"transform": {
"^.+\\.ts$": "ts-jest"
},
"testRegex": "(test|spec)\\.ts$",
"moduleFileExtensions": ["ts", "js", "json"],
"verbose": true
}
+14
View File
@@ -0,0 +1,14 @@
{
"displayName": "turtle",
"testEnvironment": "node",
"rootDir": "../src",
"moduleNameMapper": {
"^turtle/(.*)$": "<rootDir>/$1"
},
"transform": {
"^.+\\.ts$": "ts-jest"
},
"testMatch": [ "**/__smoke__/*.test.ts" ],
"moduleFileExtensions": ["ts", "js", "json"],
"verbose": true
}
+14
View File
@@ -0,0 +1,14 @@
{
"displayName": "turtle",
"testEnvironment": "node",
"rootDir": "../src",
"moduleNameMapper": {
"^turtle/(.*)$": "<rootDir>/$1"
},
"transform": {
"^.+\\.ts$": "ts-jest"
},
"testMatch": [ "**/__tests__/*.ts" ],
"moduleFileExtensions": ["ts", "js", "json"],
"verbose": true
}
+158
View File
@@ -0,0 +1,158 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: turtle-android
namespace: ${NAMESPACE}
spec:
replicas: ${REPLICAS}
minReadySeconds: 5
revisionHistoryLimit: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 5
selector:
matchLabels:
app: turtle-android
environment: ${NAMESPACE}
template:
metadata:
labels:
app: turtle-android
environment: ${NAMESPACE}
spec:
restartPolicy: Always
terminationGracePeriodSeconds: 1200 ## wait 20 minutes for any builds to complete
tolerations:
- key: dedicated
operator: Equal
value: jobs
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: dedicated
operator: In
values:
- jobs
containers:
- name: turtle-android
image: ${IMAGE}
env:
# static vars
- name: ENVIRONMENT
value: ${NAMESPACE}
- name: PLATFORM
value: android
- name: AWS_S3_BUCKET
value: exp-shell-app-assets
- name: AWS_S3_REGION
value: us-west-1
- name: TURTLE_TEMPORARY_FILES_DIR
value: /tmp/turtle
# vars from k8s secrets
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_access_key_id
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_secret_access_key
- name: AWS_SQS_REGION
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_sqs_region
- name: AWS_SQS_IOS_QUEUE_URL
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_sqs_ios_queue_url
- name: AWS_SQS_ANDROID_QUEUE_URL
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_sqs_android_queue_url
- name: AWS_SQS_IOS_PRIORITY_QUEUE_URL
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_sqs_ios_priority_queue_url
- name: AWS_SQS_ANDROID_PRIORITY_QUEUE_URL
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_sqs_android_priority_queue_url
- name: AWS_CLOUDWATCH_REGION
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_cloudwatch_region
- name: REDIS_URL
valueFrom:
secretKeyRef:
name: turtle-js-config
key: redis_url
- name: REDIS_CONFIG_URL
valueFrom:
secretKeyRef:
name: turtle-js-config
key: turtle_redis_url
- name: SENTRY_DSN
valueFrom:
secretKeyRef:
name: turtle-js-config
key: sentry_dsn
- name: API_PROTOCOL
valueFrom:
secretKeyRef:
name: turtle-js-config
key: api_protocol
- name: API_HOSTNAME
valueFrom:
secretKeyRef:
name: turtle-js-config
key: api_hostname
- name: API_PORT
valueFrom:
secretKeyRef:
name: turtle-js-config
key: api_port
- name: DATADOG_API_KEY
valueFrom:
secretKeyRef:
name: turtle-js-config
key: datadog_api_key
- name: DATADOG_APP_KEY
valueFrom:
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"
- name: DISABLE_DEX_MAX_HEAP
value: "true"
- name: JAVA_OPTS
value: '-Xms2048m -Xmx12g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC'
- name: GRADLE_OPTS
value: '-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xms2048m -Xmx12g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC"'
- name: REDIS_CA_CERTIFICATE
value: '/var/run/config/redislabs-tls/redislabs_ca.pem'
resources:
requests:
memory: "12Gi"
cpu: "3000m"
limits:
memory: "12Gi"
cpu: "3500m"
Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

+228
View File
@@ -0,0 +1,228 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="151.68256mm"
height="150.14914mm"
viewBox="0 0 151.68255 150.14914"
version="1.1"
id="svg8"
sodipodi:docname="logo-only.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath16">
<path
d="M 0,192 H 192 V 0 H 0 Z"
id="path18"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath26">
<path
d="M -4.88281e-4,192 H 192 V -4.88281e-4 H -4.88281e-4 Z"
id="path28"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath34">
<path
d="M -4.88281e-4,192 H 192 V -4.88281e-4 H -4.88281e-4 Z"
id="path36"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath38">
<path
d="M 0,192 H 192 V 0 H 0 Z"
id="path40"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath42">
<path
d="M 0,192 H 192 V 0 H 0 Z"
id="path44"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath116">
<path
d="M 0,192 H 192 V -4.88281e-4 H 0 Z"
id="path118"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath120">
<path
d="M 0,192 H 192 V 4.88281e-4 H 0 Z"
id="path122"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath124">
<path
d="M 192,192 H 0 V 0 h 192 z"
id="path126"
inkscape:connector-curvature="0" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#3d3d3d"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497474"
inkscape:cx="-192.6803"
inkscape:cy="237.87441"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
units="mm"
inkscape:showpageshadow="false"
inkscape:window-width="1366"
inkscape:window-height="705"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:object-paths="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2"
transform="translate(-29.1587,91.282943)">
<g
id="g6678"
transform="translate(792.65276,-237.50395)">
<path
inkscape:connector-curvature="0"
id="path6638"
d="m -687.31547,152.53653 -16.98554,9.86968 v 19.204 l 15.52774,-8.98033 a 2.9187589,2.9239263 0 0 1 1.52654,-0.38809 2.9187589,2.9239263 0 0 1 1.39009,0.38809 l 15.52721,8.98033 v -19.204 z"
style="opacity:1;fill:#00002f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
<path
inkscape:connector-curvature="0"
id="path6640"
d="m -687.3165,178.53959 -48.20947,27.88306 v 55.7661 l 48.20947,27.88306 48.20996,-27.88306 v -55.7661 z"
style="opacity:1;fill:#00002f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
<path
inkscape:connector-curvature="0"
id="path6642"
d="m -738.44361,184.99346 -16.985,9.86968 v 19.74092 l 14.06631,8.17418 v -18.04386 a 2.9187589,2.9239263 0 0 1 1.45986,-2.5337 l 15.57269,-9.00617 z"
style="opacity:1;fill:#00002f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
<path
inkscape:connector-curvature="0"
id="path6644"
d="m -634.61997,184.99346 -14.89522,8.65426 14.78772,8.55296 a 2.9187589,2.9239263 0 0 1 1.45986,2.5337 v 18.95491 l 15.63418,-9.08523 v -19.74092 z"
style="opacity:1;fill:#00002f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
<path
inkscape:connector-curvature="0"
id="path6646"
d="m -741.3623,245.97166 -16.30752,9.47642 v 19.74091 l 16.98398,9.87124 16.47753,-9.57513 -15.69413,-9.07748 a 2.9187589,2.9239263 0 0 1 -1.45986,-2.5306 z"
style="opacity:1;fill:#00002f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
<path
inkscape:connector-curvature="0"
id="path6648"
d="m -633.26761,247.66664 v 16.21038 a 2.9187589,2.9239263 0 0 1 -1.45986,2.5306 l -17.35915,10.0397 v 5.2e-4 l 0.20309,-0.11782 15.02182,8.73022 16.98655,-9.87124 v -19.74091 z"
style="opacity:1;fill:#00002f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
<g
id="g6654"
transform="translate(-172.35714,278.19048)">
<path
inkscape:connector-curvature="0"
id="path6650"
d="m -514.88984,-105.94886 a 2.918759,2.9239263 0 0 0 -1.52625,0.388 l -51.12915,29.57121 a 2.918759,2.9239263 0 0 0 -1.45977,2.5338 v 59.142302 a 2.918759,2.9239263 0 0 0 1.45977,2.530901 l 51.12915,29.571197 a 2.918759,2.9239263 0 0 0 2.91661,0 l 51.12917,-29.571197 a 2.918759,2.9239263 0 0 0 1.45977,-2.530901 V -73.45585 a 2.918759,2.9239263 0 0 0 -1.45977,-2.5338 l -51.12917,-29.57121 a 2.918759,2.9239263 0 0 0 -1.39036,-0.388 z m -0.0694,6.298204 48.20963,27.882906 v 55.766001 l -48.20963,27.883001 -48.20965,-27.883001 V -71.76775 Z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#21aba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17500019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
inkscape:connector-curvature="0"
id="path6652"
d="m -514.88885,-85.717946 a 2.9118515,2.9308623 0 0 0 -1.52531,0.3904 l -33.47339,19.451796 a 2.9118515,2.9308623 0 0 0 -1.45528,2.5391 v 38.903402 a 2.9118515,2.9308623 0 0 0 1.45528,2.537198 l 33.47339,19.4517023 a 2.9118515,2.9308623 0 0 0 2.91246,0 l 33.47151,-19.4517023 a 2.9118515,2.9308623 0 0 0 1.45528,-2.537198 V -63.33665 a 2.9118515,2.9308623 0 0 0 -1.45528,-2.5391 l -33.47151,-19.451796 a 2.9118515,2.9308623 0 0 0 -1.38715,-0.3904 z m -0.0699,6.312396 30.56093,17.760299 V -26.12465 L -514.95875,-8.3663467 -545.5197,-26.12665 v -35.518601 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#21aba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17500019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
<g
id="g6660"
transform="translate(-172.35714,278.19048)">
<path
id="path6656"
d="m -519.66912,-32.288849 -5.84307,5.844 h 25.07044 a 2.9220001,2.9220001 0 0 0 0,-5.844 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#45eba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17499971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path6658"
d="m -529.50808,-61.355249 a 2.9213416,2.9213416 0 0 0 -2.0341,5.017 l 12.45256,12.452501 -12.45256,12.452599 a 2.9213416,2.9213416 0 1 0 4.1329,4.129201 l 14.51539,-14.515401 a 2.9213416,2.9213416 0 0 0 0,-4.1328 l -14.51539,-14.515401 a 2.9213416,2.9213416 0 0 0 -2.0988,-0.887699 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#45eba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17500019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
<g
id="g6676"
transform="translate(-172.35714,278.19048)">
<g
id="g6672">
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#21aba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17499971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m -514.89008,-131.96866 a 2.9118515,2.9308623 0 0 0 -1.52426,0.3917 l -19.89585,11.5625 a 2.9118515,2.9308623 0 0 0 -1.45673,2.5388 v 23.125004 a 2.9118515,2.9308623 0 0 0 0.18924,1.02881 l 5.63388,-3.25861 v -19.203604 l 16.98527,-9.87 16.98619,9.87 v 19.203604 l 5.6348,3.25861 a 2.9118515,2.9308623 0 0 0 0.18734,-1.02881 v -23.125004 a 2.9118515,2.9308623 0 0 0 -1.4558,-2.5388 l -19.89678,-11.5625 a 2.9118515,2.9308623 0 0 0 -1.3873,-0.3917 z"
id="path6662" />
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#21aba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17499971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m -566.01799,-99.511956 a 2.9118515,2.9308623 0 0 0 -1.52421,0.3918 l -19.89585,11.56251 a 2.9118515,2.9308623 0 0 0 -1.45673,2.5387 v 23.124998 a 2.9118515,2.9308623 0 0 0 1.45673,2.537899 l 18.43343,10.7124 v -6.768201 l -14.06704,-8.174598 v -19.740898 l 16.98522,-9.8699 14.11368,8.2012 5.83733,-3.3766 -18.49521,-10.74751 a 2.9118515,2.9308623 0 0 0 -1.38735,-0.3918 z"
id="path6664" />
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#21aba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17499971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m -462.19425,-99.511956 a 2.9118515,2.9308623 0 0 0 -1.52421,0.3918 l -19.27591,11.20211 5.83641,3.3755 14.89526,-8.6547 16.98619,9.8699 v 19.740898 l -15.63409,9.085498 v 6.765401 a 2.9118515,2.9308623 0 0 0 0.10365,-0.058 l 19.89775,-11.5625 a 2.9118515,2.9308623 0 0 0 1.45483,-2.537801 v -23.124996 a 2.9118515,2.9308623 0 0 0 -1.45483,-2.5388 l -19.89775,-11.56251 a 2.9118515,2.9308623 0 0 0 -1.3873,-0.3918 z"
id="path6666" />
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#21aba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17499971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m -569.00462,-38.844049 a 2.9118515,2.9308623 0 0 0 -0.77875,0.308999 l -19.89683,11.562501 a 2.9118515,2.9308623 0 0 0 -1.45672,2.538801 v 23.1250003 a 2.9118515,2.9308623 0 0 0 1.45672,2.537801 l 19.89683,11.5624977 a 2.9118515,2.9308623 0 0 0 2.91058,0 l 19.89775,-11.5624977 a 2.9118515,2.9308623 0 0 0 0.77778,-0.66460201 l -5.65379,-3.26999799 -16.47749,9.575199 -16.98435,-9.8709 V -22.74215 l 16.30827,-9.477299 z"
id="path6668" />
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#21aba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17499971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m -460.9106,-37.293149 v 6.769201 l 13.39292,7.781798 v 19.7409023 l -16.9862,9.8709 -15.02174,-8.729901 -5.83733,3.375502 19.40327,11.2762977 a 2.9118515,2.9308623 0 0 0 2.91155,0 l 19.89678,-11.5624977 a 2.9118515,2.9308623 0 0 0 1.4558,-2.537801 V -24.433748 a 2.9118515,2.9308623 0 0 0 -1.4558,-2.538801 z"
id="path6670" />
</g>
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#21aba5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.17500019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m -531.46275,-116.06384 -0.48112,0.27957 v 5.56039 a 2.9213415,2.9213415 0 0 0 0.0171,0 h 33.93644 a 2.9213415,2.9213415 0 0 0 0.0181,-5.2e-4 v -5.55987 l -0.48109,-0.27957 z"
id="path6674"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

+5
View File
@@ -0,0 +1,5 @@
self: super:
{
nodejs = super.nodejs-12_x;
}
+116
View File
@@ -0,0 +1,116 @@
with (import ./default.nix {});
let
# These expressions can be deleted when react native depends on version of
# ndk present in nixpkgs.
os = if stdenv.system == "x86_64-linux" then "linux"
else if stdenv.system == "x86_64-darwin" then "macosx" else throw "unsupported system architecture: ${stdenv.system}";
ndk_17c_src = if stdenv.isDarwin then fetchurl {
url = http://dl.google.com/android/repository/android-ndk-r17c-darwin-x86_64.zip;
sha256 = "11iyxgqp017fchn54kkns9mrax73m73xm5wgis266dsq2g36dn73";
} else fetchurl {
url = https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip;
sha256 = "12b5h5p8b2ia38825dnnacn7b47c0inpys8jp82r42iks3dilm1z";
};
ndk_runtime_paths = lib.makeBinPath [ coreutils file findutils gawk gnugrep gnused jdk python3 which ]; #+ ":${platform-tools}/platform-tools";
ndk = stdenv.mkDerivation {
name = "ndk-17c";
src = ndk_17c_src;
buildInputs = [ unzip autoPatchelfHook makeWrapper python2 ] ++ lib.optional (os == "linux") [ glibc stdenv.cc.cc ncurses5 zlib libcxx.out ];
unpackPhase = ''
mkdir extractedzip
cd extractedzip
unpackFile "$src"
if [ "$(find . -mindepth 1 -maxdepth 1 -type d | wc -l)" -eq 1 ]
then
cd "$(find . -mindepth 1 -maxdepth 1 -type d)"
fi
sourceRoot="$PWD"
'';
installPhase = ''
packageBaseDir=$out/libexec/android-sdk/ndk-bundle
mkdir -p $packageBaseDir
cd $packageBaseDir
cp -av $sourceRoot/* .
'' + lib.optionalString (os == "linux") ''
patchShebangs .
wrapProgram $(pwd)/build/tools/make_standalone_toolchain.py --prefix PATH : "${ndk_runtime_paths}"
rm -rf docs tests
# Patch the executables of the toolchains, but not the libraries -- they are needed for crosscompiling
addAutoPatchelfSearchPath $out/libexec/android-sdk/ndk-bundle/toolchains/renderscript/prebuilt/linux-x86_64/lib64
find toolchains -type d -name bin | while read dir
do
autoPatchelf "$dir"
done
# fix ineffective PROGDIR / MYNDKDIR determination
for i in ndk-build
do
sed -i -e 's|^PROGDIR=`dirname $0`|PROGDIR=`dirname $(readlink -f $(which $0))`|' $i
done
# Patch executables
autoPatchelf prebuilt/linux-x86_64
# wrap
for i in ndk-build
do
wrapProgram "$(pwd)/$i" --prefix PATH : "${ndk_runtime_paths}"
done
# make some executables available in PATH
mkdir -p $out/bin
for i in ndk-build
do
ln -sf ../../libexec/android-sdk/ndk-bundle/$i $out/bin/$i
done
'';
dontStrip = true;
dontPatchELF = true;
dontAutoPatchelf = true;
noAuditTmpdir = true;
};
ndkRoot = "${ndk}/libexec/android-sdk/ndk-bundle";
sdk = androidenv.androidPkgs_9_0.androidsdk;
sdk_path = if stdenv.isDarwin
then "/Library/Android/sdk"
else "/Android/Sdk"; # intentional Capital S
in
mkShell rec {
LANG="en_US.UTF-8";
JAVA_HOME=openjdk8;
ANDROID_SDK_ROOT=builtins.getEnv("HOME") + sdk_path;
ANDROID_NDK_ROOT="${ANDROID_SDK_ROOT}/ndk-bundle";
ANDROID_HOME=ANDROID_SDK_ROOT;
ANDROID_NDK=ANDROID_NDK_ROOT;
nativeBuildInputs = [
awscli
curl
fastlane
git
nodejs
openjdk8
yarn
];
passthru = { inherit ndk ndkRoot; };
shellHook = ''
${./install-ndk-17c.sh} ${ndk} ${ndkRoot}
# grep -v = should clean up build logs, see https://stackoverflow.com/a/52464819/1123156
yes | ${sdk}/bin/sdkmanager --sdk_root="$ANDROID_SDK_ROOT" "build-tools;28.0.3" | grep -v =
'' + lib.optionalString stdenv.isLinux ''
for dep in lib lib64; do
if [ -L /$dep ] || [ ! -e /$dep ]; then
echo "Creating /$dep"
ln -s ${stdenv.cc.libc}/$dep /$dep
else
echo "Using existing /$dep"
fi
done
'';
}
+19
View File
@@ -0,0 +1,19 @@
let
pin = builtins.fromJSON (builtins.readFile ./nixpkgs.json);
nixpkgs = builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs-channels/archive/${pin.rev}.tar.gz";
inherit (pin) sha256;
};
in
{ ... } @ args:
import nixpkgs (args // {
config = {
allowUnfree = true;
android_sdk.accept_license = true;
};
overlays = [ (import ./all-packages.nix) ];
})
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -euo pipefail
scriptdir="$(dirname ${BASH_SOURCE[0]})"
shellnix="$scriptdir/android-shell.nix"
ndk=${1:-$(nix-build "$shellnix" -A ndk --no-out-link)}
ndkRoot=${2:-$(nix eval --file "$shellnix" --raw ANDROID_NDK_ROOT)}
mkdir -p "$ANDROID_NDK_ROOT" # Create full path if necessary
# Replace any existing link or directory with link
rm -r "$ANDROID_NDK_ROOT"
ln -sn "$ndkRoot" "$ANDROID_NDK_ROOT"
+7
View File
@@ -0,0 +1,7 @@
{
"url": "https://github.com/NixOS/nixpkgs-channels.git",
"rev": "42f0be81ae05a8fe6d6e8e7f1c28652e7746e046",
"date": "2020-03-01T07:21:40-03:00",
"sha256": "1rxb5kmghkzazqcv4d8yczdiv2srs4r7apx4idc276lcikm0hdmf",
"fetchSubmodules": false
}
+6
View File
@@ -0,0 +1,6 @@
{
"watch": ["src"],
"ext": "ts",
"ignore": ["src/**/*.test.ts"],
"exec": "ts-node -r tsconfig-paths/register --files src/server.ts"
}
+145
View File
@@ -0,0 +1,145 @@
{
"name": "turtle-cli",
"version": "0.22.3",
"description": "The command-line tool for building standalone Expo apps",
"preferGlobal": true,
"scripts": {
"start": "EXPENV_OVERRIDES=local-common,local,local-queue expenv nodemon | bunyan -o short -l debug --color",
"start:ios": "PLATFORM=ios yarn start",
"start:android": "PLATFORM=android yarn start",
"bin:turtle": "./bin/turtle.js",
"lint": "tslint -c tslint.json 'src/**/*.ts'",
"lint:fix": "yarn lint --fix",
"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",
"test": "yarn jest",
"test:integration": "yarn test --config jest/integration-config.json",
"test:unit": "yarn test --config jest/unit-config.json",
"test:smoke": "yarn test --config jest/smoke-config.json --forceExit",
"test:smoke:android": "PLATFORM=android yarn test:smoke --testNamePattern=android",
"test:smoke:android:record": "PLATFORM=android EXPENV_OVERRIDES=local-common,local,local-queue expenv yarn test:smoke --testNamePattern=android",
"test:smoke:ios": "PLATFORM=ios yarn test:smoke --testNamePattern=iOS",
"test:smoke:ios:record": "PLATFORM=ios EXPENV_OVERRIDES=local-common,local,local-queue expenv 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"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"src/**/*.ts": [
"yarn lint:fix",
"git add"
]
},
"bin": {
"turtle": "./bin/turtle.js"
},
"files": [
"bin",
"build",
"scripts/android/configureAndroidSdk.sh",
"shellTarballs"
],
"keywords": [
"expo",
"react-native"
],
"engines": {
"node": ">=10"
},
"author": "Expo <[email protected]>",
"license": "MIT",
"bugs": {
"url": "https://github.com/expo/turtle/issues"
},
"homepage": "https://github.com/expo/turtle#readme",
"publishConfig": {
"registry": "https://registry.npmjs.org/"
},
"devDependencies": {
"@expo/babel-preset-cli": "^0.1.3",
"@types/color-string": "^1.5.0",
"@types/decompress": "^4.2.3",
"@types/fs-extra": "^5.0.4",
"@types/ioredis": "^4.16.6",
"@types/jest": "^23.3.9",
"@types/joi": "^13.4.3",
"@types/lodash": "^4.14.129",
"@types/node-forge": "^0.9.7",
"@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.28.3",
"@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": "^26.1.0",
"lint-staged": "^8.1.5",
"nock": "^10.0.1",
"nodemon": "^2.0.2",
"release-it": "^12.3.4",
"rimraf": "^2.6.2",
"ts-jest": "^26.1.2",
"ts-node": "^8.0.3",
"ts-transformer-imports": "^0.4.1",
"tsconfig-paths": "^3.8.0",
"tslint": "^5.10.0",
"tslint-eslint-rules": "^5.4.0",
"ttypescript": "^1.5.6",
"typescript": "^3.9.5"
},
"dependencies": {
"@expo/config": "~3.3.9",
"@expo/spawn-async": "^1.4.2",
"@expo/xdl": "59.1.0",
"@google-cloud/logging-bunyan": "^2.0.3",
"async-retry": "^1.2.1",
"aws-sdk": "^2.226.1",
"bunyan": "^1.8.12",
"bunyan-debug-stream": "^1.0.8",
"bunyan-sentry-stream": "^1.2.1",
"commander": "^2.15.1",
"copy": "^0.3.1",
"decompress": "^4.2.0",
"dogapi": "^2.8.3",
"fs-extra": "^6.0.0",
"ioredis": "^4.17.3",
"is-semver": "^1.0.8",
"joi": "^13.2.0",
"lodash": "^4.17.11",
"progress": "^2.0.0",
"raven": "^2.6.2",
"request": "^2.88.0",
"request-progress": "^3.0.0",
"request-promise": "^4.2.5",
"semver": "^6.0.0",
"sharp": "0.28.3",
"source-map-support": "^0.5.6",
"tar": "^4.4.6",
"uuid": "^3.2.1",
"which": "^1.3.1"
},
"optionalDependencies": {
"@expo/traveling-fastlane-darwin": "1.11.4"
},
"volta": {
"node": "12.16.1",
"yarn": "1.22.0"
}
}
+1
View File
@@ -0,0 +1 @@
this is just a placeholder to simplify deployments
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -eo pipefail
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../.. && pwd )"
CONFIGURE_ANDROID_SDK_PATH="$ROOT_DIR/scripts/android/configureAndroidSdk.sh"
DOCKER_BASE_DIR="$ROOT_DIR/docker-base"
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 $DOCKER_BASE_DIR > /dev/null
cp $CONFIGURE_ANDROID_SDK_PATH .
docker build -t "$IMAGE_VERSION_FULL_NAME" -t "$IMAGE_LATEST_FULL_NAME" .
echo "Successfully built $IMAGE_VERSION_FULL_NAME Docker image"
gcloud docker -- push "$IMAGE_VERSION_FULL_NAME"
gcloud docker -- push "$IMAGE_LATEST_FULL_NAME"
echo "Successfully pushed $IMAGE_VERSION_FULL_NAME Docker image to GCloud"
rm -rf `basename $CONFIGURE_ANDROID_SDK_PATH`
popd > /dev/null
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
SDKMANAGER=$ANDROID_HOME/tools/bin/sdkmanager
yes | $SDKMANAGER --licenses > /dev/null
if [[ "$1" = "--install-all-platforms" ]]; then
yes | $SDKMANAGER \
"platforms;android-23" \
"platforms;android-24" \
"platforms;android-25" \
"platforms;android-26" \
"platforms;android-27" | grep -v '='; [[ ${PIPESTATUS[1]} = 0 ]]
fi
yes | $SDKMANAGER "platforms;android-28" | grep -v '='; [[ ${PIPESTATUS[1]} = 0 ]]
yes | $SDKMANAGER "platform-tools" | grep -v '='; [[ ${PIPESTATUS[1]} = 0 ]]
yes | $SDKMANAGER "build-tools;28.0.3" | grep -v '='; [[ ${PIPESTATUS[1]} = 0 ]]
yes | $SDKMANAGER \
"extras;android;m2repository" \
"extras;google;m2repository" \
"extras;google;google_play_services" | grep -v '='; [[ ${PIPESTATUS[1]} = 0 ]]
if [[ "$(uname -s)" == "Darwin" ]] && [[ "$(uname -m)" == "arm64" ]]; then
echo "Skipping NDK install on M1 macOS"
else
yes | $SDKMANAGER "ndk;17.2.4988734" | grep -v '='; [[ ${PIPESTATUS[1]} = 0 ]]
fi
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
set -xeuo pipefail
environment=$1
retry5 gcloud container images add-tag "${IMAGE}:${PREV_TAG}" "${IMAGE}:${CURRENT_TAG}"
export TAG="${CURRENT_TAG}"
nix run expo.k8s-services.turtle.${environment}.deploy --command deploy
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../.. && pwd )"
$ROOT_DIR/scripts/fetchRemoteTarballs.sh android
+8
View File
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
printf "READY\n"; # signal to superivsord that listener is ready
while read line; do
echo "[supervisord:eventlistener] Processing Event: $line" >&2;
kill -SIGQUIT $PPID
done < /dev/stdin
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env bash
set -xeo pipefail
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/.. && pwd )"
if [ -z "$1" ]; then
echo "Please specify a platform to build"
exit 1
fi
PLATFORM=$1
yarn
yarn run build
if [ "$PLATFORM" = "android" ]; then
echo "shell apps will be fetched when building a Docker image"
elif [ "$PLATFORM" = "ios" ]; then
$ROOT_DIR/scripts/ios/fetchRemoteIosTarball.sh
fi
if [[ -z "${TARBALL}" ]]; then
echo "TARBALL is not set, building tarball skipped"
else
tar zcf "$TARBALL" \
workingdir \
build \
scripts \
package.json \
node_modules \
yarn.lock \
tsconfig.json \
gulpfile.js
fi
+76
View File
@@ -0,0 +1,76 @@
#!/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
+38
View File
@@ -0,0 +1,38 @@
#!/usr/bin/env bash
set -xeo pipefail
PLATFORM=$1
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/.. && pwd )"
ARTIFACTS_DIR="$ROOT_DIR/artifacts"
WORKING_DIR="$ROOT_DIR/workingdir/$PLATFORM"
SHELL_TARBALLS_DIRECTORY="$ROOT_DIR/shellTarballs/$PLATFORM"
mkdir -p $ARTIFACTS_DIR
convert_s3_to_https() {
BUCKET=`echo $1 | sed 's/s3:\/\/\([^/]*\).*/\1/'`
KEY=`echo $1 | sed 's/s3:\/\/[^/]*\/\(.*\)/\1/'`
echo "https://s3.amazonaws.com/$BUCKET/$KEY"
}
download_shell_app() {
SDK_VERSION=$1
mkdir -p $WORKING_DIR/$SDK_VERSION
TARBALL_S3_URL=$(head -n 1 $SHELL_TARBALLS_DIRECTORY/$SDK_VERSION)
TARBALL_HTTPS_URL=$(convert_s3_to_https $TARBALL_S3_URL)
curl -s $TARBALL_HTTPS_URL -o $ARTIFACTS_DIR/$SDK_VERSION.tar.gz
tar zxf $ARTIFACTS_DIR/$SDK_VERSION.tar.gz -C $WORKING_DIR/$SDK_VERSION
rm -rf $ARTIFACTS_DIR/$SDK_VERSION.tar.gz
}
if [[ -z "$SDK_VERSION" ]]; then
for SDK_VERSION in `ls $SHELL_TARBALLS_DIRECTORY`; do
download_shell_app $SDK_VERSION
done
else
if [ ! -d "$WORKING_DIR/$SDK_VERSION" ]; then
download_shell_app $SDK_VERSION
fi
fi
+27
View File
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
if [ -z "$EXPO_UNIVERSE_DIR" ]; then
echo "You need to specify EXPO_UNIVERSE_DIR to use this script. Alternatively you can create .secrets.local-queue file yourself with AWS_SQS_ANDROID_QUEUE_URL and AWS_SQS_IOS_QUEUE_URL variables."
exit 1
fi
if [ -z "$1" ]; then
echo "Please specify a nickname you used to create AWS SQS queues"
exit 1
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`
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"
EOF
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../.. && pwd )"
$ROOT_DIR/scripts/fetchRemoteTarballs.sh ios
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -eo pipefail
if ! command -v jq &> /dev/null
then
echo "jq is not installed and is required by the release script. Install it through homebrew or your package manager of choice."
exit
fi
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 "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo "!!!! PLEASE REMEMBER TO UPDATE CHANGELOG !!!!"
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -eo pipefail
if ! command -v jq &> /dev/null
then
echo "jq is not installed and is required by the release script. Install it through homebrew or your package manager of choice."
exit
fi
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/.. && pwd )"
$ROOT_DIR/node_modules/.bin/release-it -c $ROOT_DIR/.release-it.beta.json --preRelease=beta
+102
View File
@@ -0,0 +1,102 @@
#!/usr/bin/env bash
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/.. && pwd )"
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, and AWS_SQS_IOS_PRIORITY_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_remote() {
if [[ -d $ROOT_DIR/workingdir/android && -d $ROOT_DIR/workingdir/ios ]]; then
echo "Shell apps already fetched"
else
echo "Fetching shell apps"
if [ "$PLATFORM" != 'ios' ]; then
$ROOT_DIR/scripts/android/fetchRemoteAndroidTarball.sh
fi
if [ "$PLATFORM" != 'android' ]; then
$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
mv $sdk/universe-package.json $sdk/package.json
cd $sdk && yarn
else
if [[ -f "$sdk/package.json" ]]; then
cd $sdk && yarn
fi
fi
done
}
switch_local() {
cat << EOF > $ROOT_DIR/.secrets.local
TURTLE_FAKE_UPLOAD="1"
TURTLE_FAKE_UPLOAD_DIR="$HOME/Downloads"
TURTLE_WORKING_DIR_PATH="$ROOT_DIR/workingdir"
TURTLE_USE_LOCAL_WORKING_DIR="1"
EOF
}
switch_remote() {
cat << EOF > $ROOT_DIR/.secrets.local
TURTLE_FAKE_UPLOAD="1"
TURTLE_FAKE_UPLOAD_DIR="$HOME/Downloads"
TURTLE_WORKING_DIR_PATH="$ROOT_DIR/workingdir"
EOF
}
if [ "$1" == "local" ]; then
# setup_local
# switch_local
echo "Setting local workingdir is currently broken, sorry :("
exit -1
elif [ "$1" == "remote" ]; then
setup_remote
switch_remote
else
echo "You need to pass remote or local as argument"
exit -1
fi
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -ueo pipefail
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../.. && pwd )"
export NODE_ENV=test
export ENVIRONMENT="development"
export AWS_ACCESS_KEY_ID="aws_id"
export AWS_SECRET_ACCESS_KEY="secret"
export AWS_SQS_ANDROID_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_android_in.fifo"
export AWS_SQS_ANDROID_PRIORITY_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_android_in_priority.fifo"
export AWS_SQS_IOS_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_ios_in.fifo"
export AWS_SQS_IOS_PRIORITY_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_ios_in_priority.fifo"
export AWS_SQS_REGION="aws.west2"
export AWS_S3_BUCKET="exp-shell-app-assets"
export AWS_S3_REGION="us-west-1"
export AWS_CLOUDWATCH_REGION="us-west-1"
export API_PROTOCOL="http"
export API_HOSTNAME="staging.expo.io"
export API_PORT="443"
export REDIS_URL="noop"
export REDIS_CONFIG_URL="noop"
export DATADOG_DISABLED="true"
export TURTLE_SDK_VERSIONS_SECRET_TOKEN="noop"
pushd $ROOT_DIR/workingdir/android/${SDK_VERSION:-sdk39} >/dev/null 2>&1
yarn
popd >/dev/null 2>&1
yarn test:smoke:android
+27
View File
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -ueo pipefail
export NODE_ENV=test
export ENVIRONMENT="development"
export AWS_SQS_ANDROID_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_android_in.fifo"
export AWS_SQS_ANDROID_PRIORITY_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_android_in_priority.fifo"
export AWS_SQS_IOS_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_ios_in.fifo"
export AWS_SQS_IOS_PRIORITY_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_ios_in_priority.fifo"
export AWS_SQS_REGION="aws.west2"
export AWS_S3_BUCKET="exp-shell-app-assets"
export AWS_S3_REGION="us-west-1"
export AWS_CLOUDWATCH_REGION="us-west-1"
export API_PROTOCOL="https"
export API_HOSTNAME="staging.expo.io"
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 )"
$ROOT_DIR/scripts/ios/fetchRemoteIosTarball.sh
yarn test:smoke:ios
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -ueo pipefail
export NODE_ENV=test
export ENVIRONMENT="development"
export AWS_SQS_IOS_QUEUE_URL="noop"
export AWS_SQS_ANDROID_QUEUE_URL="noop"
export AWS_SQS_IOS_PRIORITY_QUEUE_URL="noop"
export AWS_SQS_ANDROID_PRIORITY_QUEUE_URL="noop"
export AWS_ACCESS_KEY_ID="noop"
export AWS_SECRET_ACCESS_KEY="noop"
export AWS_SQS_REGION="noop"
export AWS_S3_BUCKET="noop"
export AWS_S3_REGION="noop"
export AWS_CLOUDWATCH_REGION="noop"
export API_PROTOCOL="https"
export API_HOSTNAME="noop"
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
+23
View File
@@ -0,0 +1,23 @@
#!/usr/bin/env bash
set -eo pipefail
if ! command -v jq &> /dev/null
then
echo "jq is not installed and is required by the release script. Install it through homebrew or your package manager of choice."
exit
fi
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-bb08bdc180fccd8f90e99dafb4e0ac456232531b.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-3cf3cf0707925322bcd667d5ba79120136f9afd8.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-6cde8e00cd7bdf7a933cd8aad7f8e86981ea68a2.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-d292dcd0cc277ab665957244a8b15b9981debd29.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-277393d97877f56ba3639ab153c69f109d248436.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-29840e62dc0626e5336397dc058ef26eabeffd18.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-ff452173c174914fba8387c5539d0ab222253f67.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-expo-client-dd6b6b4840c7a99725f1ec9a9a3970de91e90b1d.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-0983415327f49592d81f0bd3dc8c46a3572c19b0.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-df407aadb7208fc389564aed400c39263294eb76.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-ba6ec1974977bebf8fd2db22a1c87f6a0b36ffa5.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-4a9a038998f6be13e8a2900a95afbb9f96dd023d.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-dd6b6b4840c7a99725f1ec9a9a3970de91e90b1d.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-2b9ea15e13f36c120c257039cf76e14573760570.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-678da875791a43f2426813e922ec2051cd2a1e4c.tar.gz
@@ -0,0 +1 @@
[{"scope":"https://sqs.us-west-2.amazonaws.com:443","method":"POST","path":"/","body":"Action=ReceiveMessage&MaxNumberOfMessages=1&QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F274251141632%2Fturtle_jobs_local_dominik_android_in.fifo&Version=2012-11-05&VisibilityTimeout=30","status":200,"response":"<?xml version=\"1.0\"?><ReceiveMessageResponse xmlns=\"http://queue.amazonaws.com/doc/2012-11-05/\"><ReceiveMessageResult/><ResponseMetadata><RequestId>8de5bfc7-bc8e-5ee3-9e04-e787ff880c47</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","8de5bfc7-bc8e-5ee3-9e04-e787ff880c47","Date","Tue, 01 Dec 2020 13:10:35 GMT","Content-Type","text/xml","Content-Length","240"]},{"scope":"https://sqs.us-west-2.amazonaws.com:443","method":"POST","path":"/","body":"Action=ReceiveMessage&MaxNumberOfMessages=1&QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F274251141632%2Fturtle_jobs_local_dominik_android_in_priority.fifo&Version=2012-11-05&VisibilityTimeout=30","status":200,"response":"<?xml version=\"1.0\"?><ReceiveMessageResponse xmlns=\"http://queue.amazonaws.com/doc/2012-11-05/\"><ReceiveMessageResult/><ResponseMetadata><RequestId>0bb998bb-3156-5159-b16f-c0fb725a5d65</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","0bb998bb-3156-5159-b16f-c0fb725a5d65","Date","Tue, 01 Dec 2020 13:10:41 GMT","Content-Type","text/xml","Content-Length","240"]},{"scope":"https://sqs.us-west-2.amazonaws.com:443","method":"POST","path":"/","body":"Action=ReceiveMessage&MaxNumberOfMessages=1&QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F274251141632%2Fturtle_jobs_local_dominik_android_in.fifo&Version=2012-11-05&VisibilityTimeout=30","status":200,"response":"<?xml version=\"1.0\"?><ReceiveMessageResponse xmlns=\"http://queue.amazonaws.com/doc/2012-11-05/\"><ReceiveMessageResult/><ResponseMetadata><RequestId>feef69fc-27a3-5af5-83af-31bc64b1b9d7</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","feef69fc-27a3-5af5-83af-31bc64b1b9d7","Date","Tue, 01 Dec 2020 13:10:47 GMT","Content-Type","text/xml","Content-Length","240"]},{"scope":"https://sqs.us-west-2.amazonaws.com:443","method":"POST","path":"/","body":"Action=ReceiveMessage&MaxNumberOfMessages=1&QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F274251141632%2Fturtle_jobs_local_dominik_android_in_priority.fifo&Version=2012-11-05&VisibilityTimeout=30","status":200,"response":"<?xml version=\"1.0\"?><ReceiveMessageResponse xmlns=\"http://queue.amazonaws.com/doc/2012-11-05/\"><ReceiveMessageResult><Message><MessageId>f39aaec9-47e0-4d02-bdb7-cf467fe2ea19</MessageId><ReceiptHandle>AQEBBI8nzAywIPCH57h1Iptt39uq60E5dzlj+Er50gtGqH+esoJ6iFdxoPDxvtD0xfT0qlyKSqlmoBDkQwh36tqsfqdT5FcFF8ejmPMRVIE8hexofzEbacxxw+3cBfgra2EFAik49TJbMT5pwxyaf42y+qwyWKOZ5N62VzRgGtnpj5ilNw1dt0lUzCdsfhCu7sne+dfJ8oMpbuy6T+ttoEYUS6VVKmv8f1BzuujHoKMy0kJip8r3zFoaigWE2p1bpFby9b9oBFTFT1ycD618YTu+Un5S9Q7Q6/nqJ7RPM2BfK2iPxBMk+UWmGfJ/otX11Zc0p8qx/MyKuYY/480Zta//xQ==</ReceiptHandle><MD5OfBody>1942fb5be12b59fc93b8052cf960f7d8</MD5OfBody><Body>{&quot;id&quot;:&quot;686530e4-c025-4a01-b84b-041e6d4f7fb3&quot;,&quot;experienceId&quot;:&quot;4d928c1c-5be9-4380-8fd5-48a6a4805839&quot;,&quot;experienceName&quot;:&quot;@testtest2/sdk-39-test&quot;,&quot;platform&quot;:&quot;android&quot;,&quot;config&quot;:{&quot;releaseChannel&quot;:&quot;default&quot;,&quot;buildType&quot;:&quot;apk&quot;},&quot;status&quot;:&quot;sent-to-queue&quot;,&quot;sdkVersion&quot;:&quot;39.0.0&quot;,&quot;accountId&quot;:&quot;1ecd48ee-e393-4f6b-9f77-311f2e0d2b39&quot;,&quot;priority&quot;:&quot;high&quot;,&quot;credentials&quot;:{&quot;keystore&quot;:&quot;/u3+7QAAAAIAAAABAAAAAQAgcWhybGMzcjB6eG4wbWk5enpnc3Rtemt0ZGd2emRhPT0AAAF2HlYoCQAABQEwggT9MA4GCisGAQQBKgIRAQEFAASCBOmzIBnRnHGBLgRUOJ1GGYiLjktnTeq/GXR/h4KZSSQ67PoiJqJnhrHLvj35Sr1swSL78q4j52IRV/a1mFbqQT4JFFy1ZdH2XgKUptY+kVc+ZrBI/awC8akIeYofWmKTNcS0Bc9IDT1VwIzwxxRrlnK/36Gh2m1vRuwVUdBChHjB4SHgC91F8wB0opY+RmiRhZqQevd8PBvZyqKenR5IWgZDXhsUYvvby4U4zMzvEgV3zNv7YGYM1Bb2ehJ8HdsW6O/58zFL3ufJ3+H2VonLxSn9YayninHoqkyMP40/mmnaFPz5jNItDkCQIeuudgQc8mrZlv4X0lM2ZjT4ZJDLdN4FCXV5iYDe4hopF8iF+DZmhMaZ1xFJ57boEaZ+WUcwsTkKOawusOGqW2JsvZbDMehOYLc8aqM2t28PrdYf3c7zspJALi6+tar2mwN66TX/AteeJRAk3r7HAiYPyle5gOffGgpmy0klLb5MEStkLQNNNsVMLJ7XSYrewzI6jXyAbMVc6PzbiVnCRPtoSy0TMUD7qQWMUGdePL1jxDlwhOVS3jgwOwHIFhUaLBbQOPROm1bF4hY3p25+LHFu954aDsYC3JlT6k9EOKIacKbJThq14r2Lb4EekfQlYTO/yst6ncVJcawWHYS1f93xWUlIjcpFnqJrLq2QVQfhafPWJmTS3K0lcYgFpfxvoU8RVn+ySaLOiy9J86l5YPmtpH/nFqr6BkqROy6dXps5x+D9vi3jVfYlYHnmqHxq7vyX5X+IMIMLvJ28SviuMKWb8Ikqmm7FSzlewJfF4xy/NLgQrQY6VxUahy92PZf3uR02ENolnj5nPSnh/B1FnIfrG46xFqlPg8imzen7hjKk1yXrdUjOT4WcjLdD/K/heVVHKUnsn3QCBt6eOgB8MpG9XzGRD+PAwloklASQx8iVSD67EauU2y1yayf4lNaQzdfnF3iFXSF25BU9XLJIRTtdRsTwmLRuLTmQcctLYD8hQCDQ2/njZtTkdY/AJeVlm44CdDaTLJpP8mVVscAOgH/S0DPi/oGGie8AYeKr8ZmBO1lQSN6l2LBJcAq2fh6AaUF5By21lT9FfR9KQd5WM87iUZk41nBIHQXcQSSt7H+vETEfm/8T9tOOwY5dMyf5QAYNCZuBoIFNCr0MOxe/Dcrsvd46KVbftR4HsJsQl53MnZoh4eLine truncated
@@ -0,0 +1,2 @@
recording.json filter=git-crypt diff=git-crypt
.gitatrributes !filter !diff
@@ -0,0 +1 @@
[{"scope":"https://sqs.us-west-2.amazonaws.com:443","method":"POST","path":"/","body":"Action=ReceiveMessage&MaxNumberOfMessages=1&QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F274251141632%2Fturtle_jobs_local_dominik_ios_in.fifo&Version=2012-11-05&VisibilityTimeout=30","status":200,"response":"<?xml version=\"1.0\"?><ReceiveMessageResponse xmlns=\"http://queue.amazonaws.com/doc/2012-11-05/\"><ReceiveMessageResult><Message><MessageId>99e0e5ee-90ef-494e-a275-3c1d55b58d9c</MessageId><ReceiptHandle>AQEB73473140rmgRe58W4T81ev8RJFQ0PvS6vOcHcSVdAV9D+bmP66k8qIqGuc0LJqR4bE9GLWG+QnM7N8rRW1tjIB74Gt9Co3PD7KFwrdgjZ3eys3fjK9nMfOj7BI0DMIP2xWi3YC90300dr/tTgJhVxfDh+Y0nYWleN9qEmttJoRqlJdSMgokqBR5VBFbhAmoNfsbSQnLzwU7fe/g2gjarImBRaCYpNWHYmS9CLozP5RBGKCddzQLvaNxDwORZXzHbYPZha5eFIDfXa3ncBtK2XdbOiquCmEB1tMt9ziIEOObSt/Vu7CD+ANhRqdqEFL/x</ReceiptHandle><MD5OfBody>ebe1f299d094649b2f3857bbd6f380ec</MD5OfBody><Body>{&quot;id&quot;:&quot;883f68d1-398a-4327-83da-6de1f288456d&quot;,&quot;experienceId&quot;:&quot;2945b084-8989-4a02-b781-2a620034a172&quot;,&quot;experienceName&quot;:&quot;@dsokal/turtle-cli-example&quot;,&quot;platform&quot;:&quot;ios&quot;,&quot;config&quot;:{&quot;releaseChannel&quot;:&quot;default&quot;,&quot;usesNonExemptEncryption&quot;:false,&quot;buildType&quot;:&quot;archive&quot;,&quot;bundleIdentifier&quot;:&quot;com.expo.turtle.cli.example&quot;},&quot;status&quot;:&quot;sent-to-queue&quot;,&quot;sdkVersion&quot;:&quot;39.0.0&quot;,&quot;accountId&quot;:&quot;07eb1118-80a9-4769-a9b5-9f429cab29e2&quot;,&quot;priority&quot;:&quot;normal&quot;,&quot;credentials&quot;:{&quot;apnsKeyId&quot;:&quot;54G5NV49UY&quot;,&quot;apnsKeyP8&quot;:&quot;-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgBtkLIodAlsdUmV1L\\nxirn9Erof29278yzTaR/NNlvF0igCgYIKoZIzj0DAQehRANCAAS5jlfFX2KmTFi/\\ng+aohp77kCfYRZNYYmn4cgn4dKkXu5YOGbTJlzW6384xDpX6uWcXXytKD9cO00uN\\n8v9j4MT6\\n-----END PRIVATE KEY-----&quot;,&quot;teamId&quot;:&quot;QL76XYH73P&quot;,&quot;teamName&quot;:&quot;Alicja Warchał (Individual)&quot;,&quot;certP12&quot;:&quot;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 truncated
+105
View File
@@ -0,0 +1,105 @@
import fs from 'fs-extra';
import nock from 'nock';
import config from 'turtle/config';
import { PLATFORMS } from 'turtle/constants';
import * as jobManager from 'turtle/jobManager';
import logger from 'turtle/logger';
jest.mock('../builders/utils/uploader.ts', () => ({
uploadBuildToS3: jest.fn(() => {
logger.debug('Faking uploading build');
return 'legit_path';
}),
}));
async function performSmokeTest(recording: string) {
jest.setTimeout(60 * 60 * 1000);
const fixtureExists = await fs.pathExists(recording);
if (fixtureExists) {
logger.info('Fixture exists, test will use existing one.');
nock.load(recording);
mockLogs();
mockSQS();
logger.info('Loading fixture');
} else {
nock.recorder.rec({
dont_print: true,
output_objects: true,
enable_reqheaders_recording: false,
});
}
await jobManager.doJob();
if (!fixtureExists) {
await fs.writeFile(recording, JSON.stringify(nock.recorder.play()));
}
}
function mockLogs() {
/*
Match log push messages. Seperate matcher, because it needs `persist` option
due to fact that it's being called variable amount times.
*/
return nock('https://exp-shell-app-assets.s3.us-west-1.amazonaws.com')
.persist()
.put((uri: string) => {
return uri.indexOf('/logs') >= 0;
})
.reply(200);
}
function mockSQS() {
return nock('https://sqs.us-west-2.amazonaws.com')
.persist()
.post(() => true)
.reply(200);
}
function mockFinish() {
// A separate matcher for the final request to ensure build was completed successfully
return nock('https://sqs.us-west-2.amazonaws.com:443')
.post('/', (body: any) => {
const keys = Object.keys(body);
if (keys.includes('MessageBody')) {
const mb = JSON.parse(body.MessageBody);
if (mb.status === 'finished') {
return true;
} else if (mb.status === 'errored') {
fail('Build ended with error');
}
}
return false;
})
.reply(200);
}
async function testPlatform(platform: string) {
process.env.PLATFORM = platform;
const utils = require('turtle/aws/utils');
utils.QUEUE_URL = jest.fn((priority) => {
return (config.sqs.queues as any)[priority][platform];
});
nock.cleanAll();
nock.enableNetConnect();
const finishMock = mockFinish();
const fixtureLocation = `src/__smoke__/fixtures/${platform}/recording.json`;
await performSmokeTest(fixtureLocation);
expect(finishMock.isDone());
nock.disableNetConnect();
}
test('Android builds', async () => {
await testPlatform(PLATFORMS.ANDROID);
});
test('iOS builds', async () => {
await testPlatform(PLATFORMS.IOS);
});
+1
View File
@@ -0,0 +1 @@
declare module 'nock';
+90
View File
@@ -0,0 +1,90 @@
{
"id":"5980f894-d403-4909-a5e5-375eac188ff8",
"experienceId":"2c8d6f90-d05e-11e8-b439-fbdd43a1c21e",
"experienceName":"@admin/testApp",
"platform":"android",
"config":{
"releaseChannel":"default"
},
"status":"sent-to-queue",
"credentials":{
"keystore":"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",
"keyPassword":"9f47f3284e2a461eba7bc6cff302035d",
"keystoreAlias":"QGFkbWluL3Rlc3RBcHA=",
"keystorePassword":"aadb0c482eb340c0aee02b525460c576"
},
"manifest":{
"android":{
"package":"com.yourcompany.yourappname"
},
"bundledAssets":[
"asset_744ce60078c17d86006dd0edabcd59a7.ttf",
"asset_5221f35630f5b71e53c3196d3ff681a1.ttf",
"asset_517bb9a13989451be6623299153f503f.ttf",
"asset_b06871f281fee6b241d60582ae9369b9.ttf",
"asset_e20945d7c929279ef7a6f1db184a4470.ttf",
"asset_74c652671225d6ded874a648502e5f0a.ttf",
"asset_1eccbc4c41d49fd81840aef3eaabe862.ttf",
"asset_a37b0c01c0baf1888ca812cc0508f6e2.ttf",
"asset_9e9dbe78c20054a6d71d9c10c939ba68.ttf",
"asset_d2285965fe34b05465047401b8595dd0.ttf",
"asset_5cdf883b18a5651a29a4d1ef276d2457.ttf",
"asset_7d40544b395c5949f4646f5e150fe020.png",
"asset_cdd04e13d4ec83ff0cd13ec8dabdc341.png",
"asset_a132ecc4ba5c1517ff83c0fb321bc7fc.png",
"asset_0ea69b5077e7c4696db85dbcba75b0e1.png",
"asset_f5b790e2ac193b3d41015edb3551f9b8.png",
"asset_755fce460f64aed4d3f3ac1a6249ceea.png",
"asset_45a8ce76165dcaec1c5e39be15478e53.png",
"asset_2d8deea13c41b52b04442d91fb31c2c5.png",
"asset_5c36108361d0a750fd25533356f80245.png",
"asset_af47141a24eb8e5751dfd034159479bd.png",
"asset_ad107d1ca027259ca50ce0f432293e6c.png",
"asset_a30cd76fa74ee5a0bab5aba37c101416.png",
"asset_49a79d66bdea2debf1832bf4d7aca127.ttf",
"asset_778ffc9fe8773a878e9c30a6304784de.png",
"asset_376d6a4c7f622917c39feb23671ef71d.png",
"asset_c79c3606a1cf168006ad3979763c7e0c.png",
"asset_02bc1fa7c0313217bde2d65ccbff40c9.png",
"asset_35ba0eaec5a4f5ed12ca16fabeae451d.png"
],
"description":"A very interesting project.",
"icon":"./assets/images/icon.png",
"iconUrl":"https://d1wp6m56sqw74a.cloudfront.net/~assets/fa6577fecc0a7838f15a254577639984",
"ios":{
"bundleIdentifier":"com.niech.to.zadziala",
"supportsTablet":true
},
"locales":{
},
"name":"testApp",
"orientation":"portrait",
"platforms":[
"ios",
"android"
],
"privacy":"public",
"sdkVersion":"29.0.0",
"slug":"testApp",
"splash":{
"backgroundColor":"#ffffff",
"image":"./assets/images/splash.png",
"imageUrl":"https://d1wp6m56sqw74a.cloudfront.net/~assets/43ec0dcbe5a156bf9e650bb8c15e7af6",
"resizeMode":"contain"
},
"updates":{
"fallbackToCacheTimeout":0
},
"version":"1.0.0",
"id":"@admin/testApp",
"revisionId":"1.0.0-r.8wVOKbq7RP",
"publishedTime":"2018-10-15T09:39:12.773Z",
"commitTime":"2018-10-15T09:39:12.824Z",
"bundleUrl":"https://d1wp6m56sqw74a.cloudfront.net/%40admin%2FtestApp%2F1.0.0%2Ffa27a628bfe715851c97f32868948509-29.0.0-android.js",
"releaseChannel":"default",
"hostUri":"exp.host/@admin/testApp"
},
"sdkVersion":"29.0.0",
"messageCreatedTimestamp":1539596354060
}
+121
View File
@@ -0,0 +1,121 @@
{
"id": "2d46d6c6-aedd-429c-b5f7-a3a0b96fc916",
"experienceId": "a3987870-d11f-11e8-b439-fbdd43a1c21e",
"experienceName": "@admin/testApp",
"platform": "ios",
"config": {
"releaseChannel": "default",
"bundleIdentifier": "com.niech.to.zadziala"
},
"status": "sent-to-queue",
"credentials": {
"appId": "342LFMU86M",
"pushId": "4VU5PQBGHM",
"teamId": "QL76XYH73P",
"pushP12": "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\nHNZoKAQIbBakg4AhjA4=\n",
"features": {
"push": true,
"inAppPurchase": true,
"gameCenter": true,
"passbook": false,
"dataProtection": "",
"homeKit": false,
"cloudKitVersion": 2,
"iCloud": false,
"LPLF93JG7M": false,
"IAD53UNK2F": false,
"V66P55NK2I": false,
"SKC3T5S89Y": false,
"APG3427HIY": false,
"HK421J6T7P": false,
"WC421J6T7P": false
},
"teamName": "Alicja Warchał (Individual)",
"pushPassword": "ddCtxuuRHJZVPtf8lv/n1g==",
"enabledFeatures": [
"gameCenter",
"inAppPurchase",
"push"
],
"enterpriseAccount": "false",
"provisioningProfile": "MIIdwAYJKoZIhvcNAQcCoIIdsTCCHa0CAQExCzAJBgUrDgMCGgUAMIINVAYJ\nKoZIhvcNAQcBoIINRQSCDUE8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5n\nPSJVVEYtOCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8v\nRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERz\nL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+\nCjxkaWN0PgoJPGtleT5BcHBJRE5hbWU8L2tleT4KCTxzdHJpbmc+YWRtaW50\nZXN0QXBwIGM0YThkZjNmMTZkNzg1OWIxODc0YWFlZWUzY2ZhZWUwPC9zdHJp\nbmc+Cgk8a2V5PkFwcGxpY2F0aW9uSWRlbnRpZmllclByZWZpeDwva2V5PgoJ\nPGFycmF5PgoJPHN0cmluZz5RTDc2WFlINzNQPC9zdHJpbmc+Cgk8L2FycmF5\nPgoJPGtleT5DcmVhdGlvbkRhdGU8L2tleT4KCTxkYXRlPjIwMTgtMTAtMDhU\nMTQ6MzA6NTBaPC9kYXRlPgoJPGtleT5QbGF0Zm9ybTwva2V5PgoJPGFycmF5\nPgoJCTxzdHJpbmc+aU9TPC9zdHJpbmc+Cgk8L2FycmF5PgogICAgPGtleT5J\nc1hjb2RlTWFuYWdlZDwva2V5PgogICAgPGZhbHNlLz4KCTxrZXk+RGV2ZWxv\ncGVyQ2VydGlmaWNhdGVzPC9rZXk+Cgk8YXJyYXk+CgkJPGRhdGE+TUlJRm9U\nQ0NCSW1nQXdJQkFnSUlmTnFoZUpOZndFOHdEUVlKS29aSWh2Y05BUUVMQlFB\nd2daWXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLREFwQmNIQnNaU0JK\nYm1NdU1Td3dLZ1lEVlFRTERDTkJjSEJzWlNCWGIzSnNaSGRwWkdVZ1JHVjJa\nV3h2Y0dWeUlGSmxiR0YwYVc5dWN6RkVNRUlHQTFVRUF3dzdRWEJ3YkdVZ1Yy\nOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTWdRMlZ5ZEds\nbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVGd4TURBNE1UUXlNRE01\nV2hjTk1Ua3hNREE0TVRReU1ETTVXakNCbERFYU1CZ0dDZ21TSm9tVDhpeGtB\nUUVNQ2xGTU56WllXVWczTTFBeE9qQTRCZ05WQkFNTU1XbFFhRzl1WlNCRWFY\nTjBjbWxpZFhScGIyNDZJRUZzYVdOcVlTQlhZWEpqYUdIRmdpQW9VVXczTmxo\nWlNEY3pVQ2t4RXpBUkJnTlZCQXNNQ2xGTU56WllXVWczTTFBeEdEQVdCZ05W\nQkFvTUQwRnNhV05xWVNCWFlYSmphR0hGZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXdn\nZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEa3Uy\nVHY4VmRCaERPY1E2ckQ3NFlON1UwNDZzRjQ5VTVHc2tPSUNidVY4cFE0YktP\nUTR4YmpNMXEreFhhMTJsRXUzdzBYc09KMHltemQ2OUdsdjhFVnNiT1JUcHkr\nTHVuLzVVRGpITXdpc1RNYjM1U3RWRi9XekV0TStWUFA2VGg0TGhmOHRYTGNi\nbVpxdi91M2d5eHBUc3NKb1VkenRyUko2bGczUStSbXM0RWFEekY0V2lnZDdo\nNVBmRFR5bEpJOFlEWlF3WEpxeTc4NG1pRmQ2eTVaM1dRZHhaaldMOHBGc0RT\nK1ZpZndLWUU0QU5tZHorZ2pEUEkrREJ0dHBrdDdZYWxVVmFLYkdBTW8zbjdV\nUkY4eEhkZm1yUk93MkJzd21WTnBDNkdMdFQzVVRpQVNKSjMxS0JVUmI1aWVI\nTTRKQTVLc2wxbk9yWkxSTXhtNjRxR0hBZ01CQUFHamdnSHhNSUlCN1RBTUJn\nTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRklnbkZ3bXB0aGhnaSt6\ncnV2WkhXY1ZTVktPM01EOEdDQ3NHQVFVRkJ3RUJCRE13TVRBdkJnZ3JCZ0VG\nQlFjd0FZWWphSFIwY0RvdkwyOWpjM0F1WVhCd2JHVXVZMjl0TDI5amMzQXdN\neTEzZDJSeU1URXdnZ0VkQmdOVkhTQUVnZ0VVTUlJQkVEQ0NBUXdHQ1NxR1NJ\nYjNZMlFGQVRDQi9qQ0J3d1lJS3dZQkJRVUhBZ0l3Z2JZTWdiTlNaV3hwWVc1\nalpTQnZiaUIwYUdseklHTmxjblJwWm1sallYUmxJR0o1SUdGdWVTQndZWEow\nZVNCaGMzTjFiV1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUhSb1pXNGdZ\nWEJ3YkdsallXSnNaU0J6ZEdGdVpHRnlaQ0IwWlhKdGN5QmhibVFnWTI5dVpH\nbDBhVzl1Y3lCdlppQjFjMlVzSUdObGNuUnBabWxqWVhSbElIQnZiR2xqZVNC\naGJtUWdZMlZ5ZEdsbWFXTmhkR2x2YmlCd2NtRmpkR2xqWlNCemRHRjBaVzFs\nYm5SekxqQTJCZ2dyQmdFRkJRY0NBUllxYUhSMGNEb3ZMM2QzZHk1aGNIQnNa\nUzVqYjIwdlkyVnlkR2xtYVdOaGRHVmhkWFJvYjNKcGRIa3ZNQllHQTFVZEpR\nRUIvd1FNTUFvR0NDc0dBUVVGQndNRE1CMEdBMVVkRGdRV0JCVFFBUi9uZXVa\nV1dzOEUvYXc3QWhoR1ZOZWdzVEFPQmdOVkhROEJBZjhFQkFNQ0I0QXdFd1lL\nS29aSWh2ZGpaQVlCQkFFQi93UUNCUUF3RFFZSktvWklodmNOQVFFTEJRQURn\nZ0VCQUhka2FJMzN2aVBGc2xIWXBXTi8wdVorZVpxWWpPMkE3QStCeGxqMnFh\nTEY5STI0dngwMzUyd1g1KzBXWUh2eGlTTzY2VXdSV04rek85eFZ4dnlqeEdI\naGdQbGJzMVlldmszdDBWYUc5WXM5TUw5RHVVNllxWEU2YWo1ZnNuVG5yOEcx\nUnZHYkFqM2d4ZXRKRzlxTDU3ODdBUGNuSnp6NzlVdVBkQVhlVThZNW0xSzZU\nT0FzM2IzdFJ1SE02U0JwM1lDMVhqNGZLVUxLdXRHV2lVdXFDQnFsUFgydmt6\nQUkxZnp1U0NPZ2pORGdKSFZBQnBEWlpzaUxETHczWjJ2RGh5YWtOdXB5UENZ\nRE92T2xZblkrU000d1Z4OTVncUtDVW5ZWDgwSSs4U3F6ZWg4QU9Ib3d2d0ZU\nMHIxSWowTkJSMnhKN0NlK3BETzlveUtGd2VFYVQwOD08L2RhdGE+Cgk8L2Fy\ncmF5PgoKCgk8a2V5PkVudGl0bGVtZW50czwva2V5PgoJPGRpY3Q+CgkJPGtl\neT5rZXljaGFpbi1hY2Nlc3MtZ3JvdXBzPC9rZXk+CgkJPGFycmF5PgoJCQk8\nc3RyaW5nPlFMNzZYWUg3M1AuKjwvc3RyaW5nPgkJCgkJPC9hcnJheT4KCQk8\na2V5PmdldC10YXNrLWFsbG93PC9rZXk+CgkJPGZhbHNlLz4KCQk8a2V5PmFw\ncGxpY2F0aW9uLWlkZW50aWZpZXI8L2tleT4KCQk8c3RyaW5nPlFMNzZYWUg3\nM1AuY29tLm5pZWNoLnRvLnphZHppYWxhPC9zdHJpbmc+CgkJPGtleT5jb20u\nYXBwbGUuZGV2ZWxvcGVyLnRlYW0taWRlbnRpZmllcjwva2V5PgoJCTxzdHJp\nbmc+UUw3NlhZSDczUDwvc3RyaW5nPgoJCTxrZXk+YXBzLWVudmlyb25tZW50\nPC9rZXk+CgkJPHN0cmluZz5wcm9kdWN0aW9uPC9zdHJpbmc+CgkJPGtleT5i\nZXRhLXJlcG9ydHMtYWN0aXZlPC9rZXk+CgkJPHRydWUvPgoKCTwvZGljdD4K\nCTxrZXk+RXhwaXJhdGlvbkRhdGU8L2tleT4KCTxkYXRlPjIwMTktMTAtMDhU\nMTQ6MjA6MzlaPC9kYXRlPgoJPGtleT5OYW1lPC9rZXk+Cgk8c3RyaW5nPmNv\nbS5uaWVjaC50by56YWR6aWFsYSBBcHBTdG9yZTwvc3RyaW5nPgoJPGtleT5U\nZWFtSWRlbnRpZmllcjwva2V5PgoJPGFycmF5PgoJCTxzdHJpbmc+UUw3NlhZ\nSDczUDwvc3RyaW5nPgoJPC9hcnJheT4KCTxrZXk+VGVhbU5hbWU8L2tleT4K\nCTxzdHJpbmc+QWxpY2phIFdhcmNoYSYjMzIyOzwvc3RyaW5nPgoJPGtleT5U\naW1lVG9MaXZlPC9rZXk+Cgk8aW50ZWdlcj4zNjQ8L2ludGVnZXI+Cgk8a2V5\nPlVVSUQ8L2tleT4KCTxzdHJpbmc+NjYyMmQ5ODgtYjQyOS00Nzk1LTlkY2It\nM2I5ZjY5YmYzNGE2PC9zdHJpbmc+Cgk8a2V5PlZlcnNpb248L2tleT4KCTxp\nbnRlZ2VyPjE8L2ludGVnZXI+CjwvZGljdD4KPC9wbGlzdD6ggg2xMIID8zCC\nAtugAwIBAgIBFzANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzETMBEG\nA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDcwNDEy\nMTc0MzI4Line truncated
"provisioningProfileId": "WX8B857VDM",
"pushPrivateSigningKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEAokW6QiqVOm0gXmyY2aBVRNxeVeSg5u1j0wYSbMc64F90UUlJ\nwVcqDxQdAqo7z1RHTsUAazLriY5cqle+ivxjNTqKmvpmUd85ajMTSG6GaQPG4RHw\nAkRY+d221HUV9L81R0RY9VrOEhzqtoUmDGiv5AWz88xcVnU/3R59LSGqiV9nerP9\nDRkUHoAlW7Ga6YUKXtqdhSOspSZq/plar3oogGQD4WFKr2j1B1R2t8xuZoe2H956\nHxTzb4Y2jRZNuqME4R5dgsHIxvhQbAVYQCVPYrsGa+74WsXFBa6/kVSrRuLbYYIa\nfrqw1hTy0ujzQzcmOBOpBAiJb4ZfCM60rHaYcwIDAQABAoIBABbFCfm21/G21k/p\nlRkUcmKTOXl790fwD43Q0E0LN6u8OSoeyoaioHg1Lkztbi8NeGQJKKHiJ0LKAx6z\n6Ty/ZXxWlpRghnL+i6PnPtFvENUzfnied7sZtBJ7legB9e691dAGOyVSdI/+FsE9\ntbUQC35HfpS7HEnVcfypBo+Kpc9YpnfsKPXfk4lZTHnuE9G0pDE9Nhz3MSHdG3uz\nTOuQa+aKKcek38Y7dPJuioG/ffqlhoCFBLTwR/owil8cWx3THX7yvYzTPCAbosiY\nZdzM/JYgpi0kSoV30pnT6EfBl/qMtgo6jV6wrZ5FL8lR6iW/RsTbb4CMznLXyuMF\newsTuaECgYEA1y59P0LEfsyuqF/7nXohyPu4ddmQsxLrb4hQFxznFwEKHvNW8P9c\n+soCp0DBNZHENZG3r3GHMmcKnmdgqFjFQESqEwzTHjLSD5bipFOXXkf8ILownVpp\nkYnJVBWEFGsinZOinkMKg1t0Cp0lAmKsEGC1PLrk1vRuoW8RWenFcfUCgYEAwQ3k\n+95b5LA44lXyZ+T2ojY4HAdnYKeMO3eoAgRzdYVrCJ+vgK+fbnBx2pedUw0Ct/O3\n9imSvUoqoBAkfcqWTGdxmsITYuLFaD64g+XLQjGmZCQlQTrd0FWFYAYQEVeq2GQu\nx5WarZBgJ2N76ReDDbV0y34igAw7/lRbTn8GF8cCgYEArdPiXc5ECeKzXVVcX9Sf\nokqmsp005VRtWMYXXPR+QfkXAfW10C2aIQY7qn0HF41Poa67YkEl5DOVQm1kidpc\nThSqB4WerpCDXRCYugLFDua76HxAdXzqNyXFu+U9s3jwl7cB8TNbNM4WKdTUZt7q\n/LgC8LJR1svS6xpcO/Q7ClkCgYEAipi5DgGjI1lIXWWqs9/zGJ2oRqciFofy6zaK\nTXh4k6SHJRfPXam34gekFXTHo7oxe3LjXTyXdoHqfCNar1xj7tJNAvfWByYa5y4w\nNbEh7ZHLjRVOEbh7Sng7Wqa/nlO7+cJiuzKya2y9O0n2yW7xzUO6Z+VUS219HKff\nLUmQTD0CgYEAydaBypz1wWD5qpQCP8u3kfkmmfRMi9fL+kdfb2ldUUo3JVl1ikpW\ntjhELvzjHVuI39lDI4gHRjoUPMvLwUxhF0zB6CCl6D6g67TfWKecLy/RgttnwLf5\nlAFa1fzYVS+Z54nreohgbq4qsFzq3p6NbPQIejBskaqtfQIVb2vSGs8=\n-----END RSA PRIVATE KEY-----\n",
"certId": "XLKCSBMJDV",
"certP12": "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\n1eOAa/1MCq2acE8AkzAUz+XABAiLGr17TUyqog==\n",
"certPassword": "AcovcuslT2sK2PNKxeK2Vw==",
"certPrivateSigningKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA5Ltk7/FXQYQznEOqw++GDe1NOOrBePVORrJDiAm7lfKUOGyj\nkOMW4zNavsV2tdpRLt8NF7DidMps3evRpb/BFbGzkU6cvi7p/+VA4xzMIrEzG9+U\nrVRf1sxLTPlTz+k4eC4X/LVy3G5mar/7t4MsaU7LCaFHc7a0SepYN0PkZrOBGg8x\neFooHe4eT3w08pSSPGA2UMFyasu/OJohXesuWd1kHcWY1i/KRbA0vlYn8CmBOADZ\nnc/oIwzyPgwbbaZLe2GpVFWimxgDKN5+1ERfMR3X5q0TsNgbMJlTaQuhi7U91E4g\nEiSd9SgVEW+YnhzOCQOSrJdZzq2S0TMZuuKhhwIDAQABAoIBADmfM9h2liK9KTtO\nmLBvoPfVNkUGbuMH+UY6FmUo/obR66EjTTls3BE0mMHCgRti+lyyeFvlhcciT7bA\nd7onyn6qm7AZe8c1jmGW4XfVg1+iAFwfQRdBUDuOj9G+ZezUthMgmY5iL6N0dHyk\nDMe4VfHZlbDBXny6JEUSslKJ2fo8+HcgR8/+UQD9LA1fITVsbn6/T0lQd8ZyoX4J\nJ6VVhwkWIQUuJ+Ff2O/ttQGFrqWPxcQc0H07MAW7QM3Tc5laGRcOBGCLFw+XhIla\nVsfuO4JF2Uzxpq3YkmpFdW60ZL00groySmjKqZfF8wJqnOyBltmlZDPJrwzxfkYn\nKmy+hCECgYEA8liKuG2PA8Gme7IDUvUlk+GKDTwnN4PMrwLvcRm+T/wzHjpuWelr\nmTeXPOAd6xg16YD2pxOCg7Rd1CC+LifMfnwZ+oKnobRYrZzyMwn8RfLEu7luBbSs\nSsXmkVgxt7H4Ctn3bthcYUNJBFw9MFSYZBiESbvXlWJihbVh2RRG9U8CgYEA8Z5+\ncSk2vItyEuY85cPJ66rpS0bIa5tyLdC22ZjZeRKhVwxR3Ubj2XtnMh6esnNvzdzl\nWK8GYzVqwo1Agf3YxUHoFU2sBmE739gqsGsXc0MaUYEWL/NQP6RZwndosvdlz0vC\nUucmoVIFmbYCUZm0fdxWAs4caqp+axwqzgie8kkCgYA972z8d1t+fUY8BKGe2PIS\nmih6+22WXYO5Eon5ILgnnu+9gPdk2Sfbj36CW1CqHZThqUjgKDdJy5XTOc8A4sD7\nbmIBSNTombu0GxE3BA1KHyIyS9CXerYxoeQsLxr9tGkM9OmslXT+koCdsakdqfEM\nW8urQGt3TR6ax2FLZkhANwKBgQDWSvjfymrWjGKvKm6GZcCXeO0Sq4OkFKkOw1b4\n5Jy0yfY4ax/MPkxlHhKnnAqqQMG/dpQetJTYto6qYHb/E7IHOW3qPwo8Wk6tOF6c\nO08AFlqoQPH5szXQTCaj2B4O5GbylMGTn5leaI25B3lFACrZmera8Ay5+d7HhqLc\nOz8lqQKBgQDGVYe+CxAQ+LaM9VG8endl9br0Heop0/yDVm01I1oVy+lcF5ySuZmj\nvvKJtS7Dfc9NHKz+tht88uznaD6E3Nh3fT6J9w1lKsdgLToDcCs1B9pWiMaQWhJR\n2uz9a4pCn5E96rihIHzS1+SjnEGNgIVEieT6uSlnEf1MXJ0e/oGFXQ==\n-----END RSA PRIVATE KEY-----\n"
},
"manifest": {
"android": {
"package": "com.yourcompany.yourappname"
},
"bundledAssets": [
"asset_744ce60078c17d86006dd0edabcd59a7.ttf",
"asset_5221f35630f5b71e53c3196d3ff681a1.ttf",
"asset_517bb9a13989451be6623299153f503f.ttf",
"asset_b06871f281fee6b241d60582ae9369b9.ttf",
"asset_e20945d7c929279ef7a6f1db184a4470.ttf",
"asset_74c652671225d6ded874a648502e5f0a.ttf",
"asset_1eccbc4c41d49fd81840aef3eaabe862.ttf",
"asset_a37b0c01c0baf1888ca812cc0508f6e2.ttf",
"asset_9e9dbe78c20054a6d71d9c10c939ba68.ttf",
"asset_d2285965fe34b05465047401b8595dd0.ttf",
"asset_5cdf883b18a5651a29a4d1ef276d2457.ttf",
"asset_7d40544b395c5949f4646f5e150fe020.png",
"asset_cdd04e13d4ec83ff0cd13ec8dabdc341.png",
"asset_a132ecc4ba5c1517ff83c0fb321bc7fc.png",
"asset_0ea69b5077e7c4696db85dbcba75b0e1.png",
"asset_f5b790e2ac193b3d41015edb3551f9b8.png",
"asset_755fce460f64aed4d3f3ac1a6249ceea.png",
"asset_45a8ce76165dcaec1c5e39be15478e53.png",
"asset_2d8deea13c41b52b04442d91fb31c2c5.png",
"asset_5c36108361d0a750fd25533356f80245.png",
"asset_af47141a24eb8e5751dfd034159479bd.png",
"asset_ad107d1ca027259ca50ce0f432293e6c.png",
"asset_a30cd76fa74ee5a0bab5aba37c101416.png",
"asset_49a79d66bdea2debf1832bf4d7aca127.ttf",
"asset_778ffc9fe8773a878e9c30a6304784de.png",
"asset_376d6a4c7f622917c39feb23671ef71d.png",
"asset_c79c3606a1cf168006ad3979763c7e0c.png",
"asset_02bc1fa7c0313217bde2d65ccbff40c9.png",
"asset_35ba0eaec5a4f5ed12ca16fabeae451d.png"
],
"description": "A very interesting project.",
"icon": "./assets/images/icon.png",
"iconUrl": "https://d1wp6m56sqw74a.cloudfront.net/~assets/fa6577fecc0a7838f15a254577639984",
"ios": {
"bundleIdentifier": "com.niech.to.zadziala",
"supportsTablet": true
},
"locales": {},
"name": "testApp",
"orientation": "portrait",
"platforms": [
"ios",
"android"
],
"privacy": "public",
"sdkVersion": "29.0.0",
"slug": "testApp",
"splash": {
"backgroundColor": "#ffffff",
"image": "./assets/images/splash.png",
"imageUrl": "https://d1wp6m56sqw74a.cloudfront.net/~assets/43ec0dcbe5a156bf9e650bb8c15e7af6",
"resizeMode": "contain"
},
"updates": {
"fallbackToCacheTimeout": 0
},
"version": "1.0.0",
"id": "@admin/testApp",
"revisionId": "1.0.0-r.zV1W89wn23",
"publishedTime": "2018-10-16T08:44:05.362Z",
"commitTime": "2018-10-16T08:44:05.403Z",
"bundleUrl": "https://d1wp6m56sqw74a.cloudfront.net/%40admin%2FtestApp%2F1.0.0%2Fb8678e2be7cd5bb9e240db0dd3c691c0-29.0.0-ios.js",
"releaseChannel": "default",
"hostUri": "exp.host/@admin/testApp"
},
"sdkVersion": "29.0.0",
"messageCreatedTimestamp": 1539679447643
}
+5
View File
@@ -0,0 +1,5 @@
import * as context from 'turtle/turtleContext';
test('Initially should not exit', () => {
expect(context.checkShouldExit()).toBe(false);
});
+14
View File
@@ -0,0 +1,14 @@
import * as validator from 'turtle/validator';
const testValidator = (fixturePath: string) => {
const data = require(fixturePath);
expect(() => validator.sanitizeJob(data)).not.toThrow();
};
test('Passes valid manifest for Android', () => {
testValidator('turtle/__tests__/fixtures/androidJob.json');
});
test('Passes valid manifest for ios', () => {
testValidator('turtle/__tests__/fixtures/iosJob.json');
});
+2
View File
@@ -0,0 +1,2 @@
export const EXTRA_DIMENSIONS = Symbol('Extra Dimensions');
export const GROUP_HASH = Symbol('Group Hash');
+40
View File
@@ -0,0 +1,40 @@
import config from 'turtle/config';
export const TYPE_DIMENSIONS = (type: string) => [
[
{ Name: 'env', Value: config.deploymentEnv },
{ Name: 'platform', Value: config.platform },
{ Name: 'type', Value: type },
],
[
{ Name: 'env', Value: config.deploymentEnv },
{ Name: 'platform', Value: config.platform },
{ Name: 'type', Value: type },
{ Name: 'host', Value: config.hostname },
],
];
export const PRIORITY_DIMENSIONS = (type: string, priority: string) => [
[
{ Name: 'env', Value: config.deploymentEnv },
{ Name: 'platform', Value: config.platform },
{ Name: 'priority', Value: priority },
],
[
{ Name: 'env', Value: config.deploymentEnv },
{ Name: 'platform', Value: config.platform },
{ Name: 'type', Value: type },
],
[
{ Name: 'env', Value: config.deploymentEnv },
{ Name: 'platform', Value: config.platform },
{ Name: 'type', Value: type },
{ Name: 'priority', Value: priority },
],
[
{ Name: 'env', Value: config.deploymentEnv },
{ Name: 'platform', Value: config.platform },
{ Name: 'type', Value: type },
{ Name: 'host', Value: config.hostname },
],
];
+186
View File
@@ -0,0 +1,186 @@
import aws from 'aws-sdk';
import _ from 'lodash';
import { EXTRA_DIMENSIONS, GROUP_HASH } from 'turtle/aws/cloudwatch/constants';
import calculateStatistics from 'turtle/aws/cloudwatch/statistics';
import {
IMetric,
IMetricConfiguration,
IMetricData,
IMetricsChunk,
MetricRegistrationObject,
} from 'turtle/aws/cloudwatch/types';
import config from 'turtle/config';
import logger from 'turtle/logger';
interface IState {
metrics: IMetric[];
registeredMetrics: {
[key: string]: IMetricConfiguration;
};
intervalId: NodeJS.Timer | null;
}
const SUCCESS_SUFFIX = '.success';
const FAIL_SUFFIX = '.fail';
const CHUNK_SIZE = 20;
const state: IState = {
metrics: [],
registeredMetrics: {},
intervalId: null,
};
const cloudWatch = new aws.CloudWatch({
apiVersion: '2010-08-01',
region: config.cloudwatch.region,
accessKeyId: config.aws.accessKeyId,
secretAccessKey: config.aws.secretAccessKey,
});
export function init() {
if (config.cloudwatch.disabled) {
return;
}
state.intervalId = setInterval(_dumpMetrics, config.cloudwatch.intervalMs);
}
export function addMetricData({
name,
value,
success = true,
explicitName = false,
extraDimensions = [],
}: IMetricData) {
if (config.cloudwatch.disabled) {
return;
}
const metricName = explicitName ? name : _createMetricName(name, success);
const registeredMetric = state.registeredMetrics[metricName];
if (!registeredMetric) {
return;
}
const { unit } = registeredMetric;
const metric: IMetric = {
MetricName: metricName,
Unit: unit,
Value: value,
Timestamp: new Date(),
[EXTRA_DIMENSIONS]: extraDimensions,
[GROUP_HASH]: _calculateGroupHash(metricName, extraDimensions),
};
state.metrics.push(metric);
}
export function registerMetric({
metricName,
unit,
reducer,
dimensions = [],
statistics = false,
addEmpty = true,
explicitName = false,
}: MetricRegistrationObject) {
if (config.cloudwatch.disabled) {
return;
}
const successMetricName = _createMetricName(metricName, true, explicitName);
state.registeredMetrics[successMetricName] = { unit, statistics, reducer, addEmpty, dimensions };
if (!explicitName) {
const failMetricName = _createMetricName(metricName, false);
state.registeredMetrics[failMetricName] = { unit, statistics, reducer, addEmpty, dimensions };
}
}
function _createMetricName(name: string, success: boolean, explicitName?: boolean) {
if (explicitName) {
return name;
} else {
const suffix = success ? SUCCESS_SUFFIX : FAIL_SUFFIX;
return `${name}${suffix}`;
}
}
function _calculateGroupHash(metricName: string, extraDimensions: any[]) {
const dimString = _.flatten(extraDimensions)
.map(({ Name, Value }) => `,${Name}:${Value}`)
.join('');
return `${metricName}${dimString}`;
}
function _dumpMetrics() {
if (!state.metrics.length && Object.keys(state.registeredMetrics).length < 0) {
// empty metrics list, skipping
return;
}
logger.trace(
'[cloudwatch] lenghts for state.metrics=%d, state.registeredMetrics=%d',
state.metrics.length,
Object.keys(state.registeredMetrics).length,
);
_addEmptyMetrics(state.metrics);
const formattedMetrics = _formatMetrics(state.metrics);
_pushMetrics(formattedMetrics);
state.metrics = [];
}
function _addEmptyMetrics(metrics: IMetric[]) {
const seenMetrics = metrics.reduce((acc, i) => {
if (!acc.has(i.MetricName)) {
acc.add(i.MetricName);
}
return acc;
}, new Set<string>());
const nonEmptyMetrics = _.omitBy(state.registeredMetrics, ({ addEmpty }) => !addEmpty);
const toAdd = _.difference(Object.keys(nonEmptyMetrics), Array.from(seenMetrics));
toAdd.forEach((name) => addMetricData({ name, value: 0, explicitName: true }));
}
function _formatMetrics(metrics: IMetric[]) {
const reducedMetrics = _reduceMetrics(metrics);
const metricsWithDimensions = reducedMetrics.map((metric) => {
const { dimensions } = state.registeredMetrics[metric.MetricName];
const joinedDimensions = [...dimensions, ...metric[EXTRA_DIMENSIONS]];
return joinedDimensions.map((i) => Object.assign({}, metric, { Dimensions: i }));
});
const metricData = _.flatten(metricsWithDimensions);
const chunks = _.chunk(metricData, CHUNK_SIZE);
return chunks.map((chunk) => ({
Namespace: config.cloudwatch.namespace,
MetricData: chunk,
}));
}
function _reduceMetrics(metrics: IMetric[]) {
const grouped = _.groupBy(metrics, GROUP_HASH);
return _.reduce(
grouped,
(acc: IMetric[], val: any) => {
const { MetricName: key } = val[0] as IMetric;
const { reducer, statistics } = state.registeredMetrics[key];
const reduced = reducer ? reducer(val) : val;
const withStats = statistics ? calculateStatistics(reduced) : reduced;
acc.push(...withStats);
return acc;
},
[],
);
}
function _pushMetrics(metrics: IMetricsChunk[]) {
logger.trace('[cloudwatch] pushing metrics', JSON.stringify(metrics, null, '\t'));
metrics.forEach((metricsChunk) => {
cloudWatch.putMetricData(metricsChunk, (err) => {
if (err) {
logger.warn({ err }, '[cloudwatch]');
}
});
});
}
+27
View File
@@ -0,0 +1,27 @@
import { IMetric } from 'turtle/aws/cloudwatch/types';
export function sum(metrics: IMetric[]) {
if (metrics.length === 0) {
return [];
}
const reduced = metrics.reduce((acc: IMetric | null, i: IMetric) => {
let result = acc;
if (!result) {
result = { ...i };
} else {
result.Value += i.Value;
}
return result;
}, null);
return [reduced];
}
export function avg(metrics: IMetric[]) {
if (!metrics.length) {
return [];
}
const metric = sum(metrics)[0] as IMetric;
metric.Value = metric.Value / metrics.length;
return [metric];
}
+29
View File
@@ -0,0 +1,29 @@
import { IMetric, MetricWithStats } from 'turtle/aws/cloudwatch/types';
export default function calculateStatistics(metrics: IMetric[]) {
if (!metrics.length) {
return [];
}
const reduced = metrics.reduce((acc: MetricWithStats | null, i: IMetric) => {
let result = acc;
if (!result) {
result = Object.assign({}, i, {
StatisticValues: {
Maximum: -Infinity,
Minimum: Infinity,
SampleCount: 0,
Sum: 0.0,
},
Value: undefined,
});
}
result!.StatisticValues.Maximum = Math.max(result!.StatisticValues.Maximum, i.Value);
result!.StatisticValues.Minimum = Math.min(result!.StatisticValues.Minimum, i.Value);
result!.StatisticValues.SampleCount += 1;
result!.StatisticValues.Sum += i.Value;
return result;
}, null);
return [reduced];
}
+48
View File
@@ -0,0 +1,48 @@
import { EXTRA_DIMENSIONS, GROUP_HASH } from 'turtle/aws/cloudwatch/constants';
export interface IMetric {
MetricName: string;
Unit: string;
Value: number;
Timestamp: Date;
StatisticValues?: {
Maximum: number;
Minimum: number;
SampleCount: number;
Sum: number;
};
[EXTRA_DIMENSIONS]: any;
[GROUP_HASH]: string;
}
export type MetricWithStats = {
StatisticValues: {
Maximum: number;
Minimum: number;
SampleCount: number;
Sum: number;
},
} & IMetric;
export interface IMetricData {
name: string;
value: number;
success?: boolean;
explicitName?: boolean;
extraDimensions?: any;
}
export interface IMetricConfiguration {
unit: string;
statistics?: boolean;
reducer?: any;
addEmpty?: boolean;
dimensions?: any;
}
export type MetricRegistrationObject = { metricName: string, explicitName?: boolean } & IMetricConfiguration;
export interface IMetricsChunk {
Namespace: string;
MetricData: IMetric[];
}
+28
View File
@@ -0,0 +1,28 @@
import AWS from 'aws-sdk';
import fs from 'fs-extra';
import _ from 'lodash';
import config from 'turtle/config';
interface IFileUploadParams {
bucketName?: string;
key: string;
srcPath: string;
}
const s3 = new AWS.S3({
..._.pick(config.aws, ['accessKeyId', 'secretAccessKey']),
..._.pick(config.s3, ['region']),
});
export default s3;
export async function uploadFile({ bucketName = config.s3.bucket, key, srcPath }: IFileUploadParams) {
return await s3
.upload({
Bucket: bucketName,
Key: key,
Body: fs.createReadStream(srcPath),
})
.promise();
}
+74
View File
@@ -0,0 +1,74 @@
import retry from 'async-retry';
import AWS from 'aws-sdk';
import _ from 'lodash';
import { QUEUE_URL } from 'turtle/aws/utils';
import config from 'turtle/config';
import logger from 'turtle/logger';
import { getCurrentJobId } from 'turtle/turtleContext';
const sqs = new AWS.SQS({
apiVersion: '2012-11-05',
..._.pick(config.aws, ['accessKeyId', 'secretAccessKey']),
..._.pick(config.sqs, ['region']),
});
const VISIBILITY_TIMEOUT_SEC = 30;
export async function receiveMessage(priority: string) {
const params = {
MaxNumberOfMessages: 1,
QueueUrl: QUEUE_URL(priority),
VisibilityTimeout: VISIBILITY_TIMEOUT_SEC,
};
return await retry(() => {
return sqs
.receiveMessage(params)
.promise()
.then((data) => {
if (data.Messages) {
logger.info(`Received a message`);
return data.Messages[0];
} else {
logger.debug(`No messages received [${priority}]`);
return null;
}
})
.catch((err) => {
logger.error({ err }, 'Receive error');
throw err;
});
});
}
export async function deleteMessage(priority: string, receiptHandle: string) {
const params = {
QueueUrl: QUEUE_URL(priority),
ReceiptHandle: receiptHandle,
};
return await retry(() => {
return sqs.deleteMessage(params).promise();
});
}
export async function changeMessageVisibility(priority: string, receiptHandle: string) {
const params = {
QueueUrl: QUEUE_URL(priority),
ReceiptHandle: receiptHandle,
VisibilityTimeout: VISIBILITY_TIMEOUT_SEC,
};
return sqs.changeMessageVisibility(params).promise();
}
// Every VISIBILITY_TIMEOUT_SEC / 3 seconds we are telling AWS SQS
// that we're still processing the message, so it does not
// send the build job to another turtle agent
export function changeMessageVisibilityRecurring(priority: string, receiptHandle: string, jobId: string) {
return setInterval(() => {
if (getCurrentJobId() === jobId) {
changeMessageVisibility(priority, receiptHandle).catch((err) => {
logger.warn({ err }, 'Error at change msg visibility');
});
}
}, (VISIBILITY_TIMEOUT_SEC * 1000) / 3);
}
+3
View File
@@ -0,0 +1,3 @@
import config from 'turtle/config';
export const QUEUE_URL = (priority: string) => (config.sqs.queues as any)[priority][config.platform];
+2
View File
@@ -0,0 +1,2 @@
export class ErrorWithCommandHelp extends Error {
}
+2
View File
@@ -0,0 +1,2 @@
export class ErrorWithProgramHelp extends Error {
}
+76
View File
@@ -0,0 +1,76 @@
import fs from 'fs-extra';
import _ from 'lodash';
import { ErrorWithCommandHelp } from 'turtle/bin/commands/ErrorWithCommandHelp';
import { createBuilderAction } from 'turtle/bin/utils/builder';
import builder from 'turtle/builders/android';
import { PLATFORMS } from 'turtle/constants';
export default (program: any, setCommonCommandOptions: any) => {
const command = program.command('build:android [project-dir]');
setCommonCommandOptions(command);
command
.alias('ba')
.option(
'--keystore-path <app.jks>',
'path to your Keystore (please provide Keystore password and Key password as EXPO_ANDROID_KEYSTORE_PASSWORD'
+ ' and EXPO_ANDROID_KEY_PASSWORD env variables)',
)
.option('--keystore-alias <alias>', 'keystore Alias')
.option(
'-t --type <build>',
'type of build: app-bundle|apk',
/^(app-bundle|apk)$/i,
'app-bundle',
)
.option(
'-m --mode <build>',
'type of build: debug|release',
/^(debug|release)$/i,
'release',
)
.option(
'--gradle-args <gradle-args>',
'optional arguments passed to gradle, make sure to surround them with double quotes'
+ ' (e.g.: --gradle-args "--stacktrace --debug")',
)
.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.',
)
.asyncAction(
createBuilderAction({
program,
command,
prepareCredentials,
builder,
platform: PLATFORMS.ANDROID,
os: ['darwin', 'linux'],
}),
);
};
const prepareCredentials = async (cmd: any) => {
const { keystorePath, keystoreAlias } = cmd;
const keystorePassword = process.env.EXPO_ANDROID_KEYSTORE_PASSWORD;
const keyPassword = process.env.EXPO_ANDROID_KEY_PASSWORD;
const someCredentialsExist = keystorePath || keystoreAlias || keystorePassword || keyPassword;
const credentialsExist = keystorePath && keystoreAlias && keystorePassword && keyPassword;
if (!credentialsExist) {
if (someCredentialsExist) {
throw new ErrorWithCommandHelp(
'Please provide all required credentials - Keystore (with password), Keystore alias and Key password',
);
} else {
return null;
}
} else {
return {
keystore: (await fs.readFile(keystorePath)).toString('base64'),
keystoreAlias,
keystorePassword,
keyPassword,
};
}
};
+35
View File
@@ -0,0 +1,35 @@
import { default as buildAndroid } from 'turtle/bin/commands/build/android';
import { default as buildIOS } from 'turtle/bin/commands/build/ios';
function createCommand(builder: any) {
return (program: any) => {
return builder(program, setCommonCommandOptions);
};
}
function setCommonCommandOptions(cmd: any) {
cmd
.option('-u --username <username>', 'username (you can also set EXPO_USERNAME env variable)')
.option('-p --password <password>', 'password (you can also set EXPO_PASSWORD env variable)')
.option('-d --build-dir <build-dir>', 'directory for build artifact (default: `~/expo-apps`)')
.option('-o --output <output-file-path>', 'output file path')
.option(
'--public-url <url>',
'the URL of an externally hosted manifest (for self-hosted apps), only HTTPS URLs are supported unless '
+ '--allow-non-https-public-url is also set!',
)
.option(
'--allow-non-https-public-url',
'allows non-HTTPS URLs in --public-url; this should only be used when building an unpublished application',
)
.option(
'--release-channel <channel-name>',
'pull from specified release channel (default: default)',
)
.option('-c --config <config-file>', 'specify a path to app.json');
}
export default {
ios: createCommand(buildIOS),
android: createCommand(buildAndroid),
};
+65
View File
@@ -0,0 +1,65 @@
import fs from 'fs-extra';
import _ from 'lodash';
import { ErrorWithCommandHelp } from 'turtle/bin/commands/ErrorWithCommandHelp';
import { createBuilderAction } from 'turtle/bin/utils/builder';
import builder from 'turtle/builders/ios';
import { IOS_BUILD_TYPES, PLATFORMS } from 'turtle/constants';
export default (program: any, setCommonCommandOptions: any) => {
const command = program.command('build:ios [project-dir]');
setCommonCommandOptions(command);
command
.alias('bi')
.option(
'-t --type <build>',
'type of build: archive|simulator',
/^(archive|simulator)$/i,
'archive',
)
.option('--team-id <apple-teamId>', 'Apple Team ID')
.option(
'--dist-p12-path <dist.p12>',
'path to your Distribution Certificate P12 (please provide password as EXPO_IOS_DIST_P12_PASSWORD env variable)',
)
.option('--provisioning-profile-path <.mobileprovision>', 'path to your Provisioning Profile')
.description(
'Build a standalone IPA for your project, signed and ready for submission to the Apple App Store.',
)
.asyncAction(
createBuilderAction({
program,
command,
prepareCredentials,
builder,
platform: PLATFORMS.IOS,
os: 'darwin',
}),
);
};
const prepareCredentials = async (cmd: any) => {
if (cmd.type !== IOS_BUILD_TYPES.ARCHIVE) {
return null;
}
const { teamId, distP12Path, provisioningProfilePath } = cmd;
const certPassword = process.env.EXPO_IOS_DIST_P12_PASSWORD;
const credentialsExist =
teamId && distP12Path && certPassword && provisioningProfilePath;
if (!credentialsExist) {
throw new ErrorWithCommandHelp(
'Please provide all required credentials'
+ '- Apple Team ID, Distribution Certificate P12 (with password) and Provisioning Profile',
);
}
return {
teamId,
certP12: (await fs.readFile(distP12Path)).toString('base64'),
certPassword,
provisioningProfile: (await fs.readFile(provisioningProfilePath)).toString('base64'),
};
};
+8
View File
@@ -0,0 +1,8 @@
import builders from 'turtle/bin/commands/build';
import setup from 'turtle/bin/commands/setup';
export const setupIOS = setup.ios;
export const setupAndroid = setup.android;
export const buildIOS = builders.ios;
export const buildAndroid = builders.android;
+49
View File
@@ -0,0 +1,49 @@
import _ from 'lodash';
import { ErrorWithCommandHelp } from 'turtle/bin/commands/ErrorWithCommandHelp';
import { ErrorWithProgramHelp } from 'turtle/bin/commands/ErrorWithProgramHelp';
import setup from 'turtle/bin/setup/setup';
import { PLATFORMS } from 'turtle/constants';
import logger from 'turtle/logger';
const l = logger.child({ buildPhase: 'setting up environment' });
function createSetupCommand(platform: string, os?: string) {
return (program: any) => {
const command = program.command(`setup:${platform}`);
const platformFirstLetter = platform[0];
command
.alias(`s${platformFirstLetter}`)
.description(`Setup environment for building ${_.capitalize(platform)} standalone apps.`)
.option(
'--sdk-version <sdk-version>',
'version of Expo SDK shell app to download (optional)',
)
.asyncAction(async (cmd: any) => await setupAction(program, cmd, platform, os));
};
}
async function setupAction(program: any, cmd: any, platform: string, os?: string) {
try {
if (os && process.platform !== os) {
throw new Error('We don\'t support running standalone app builds for this platform on your operating system');
}
const { sdkVersion } = cmd;
await setup(platform, sdkVersion);
l.info('it\'s all set!');
} catch (err) {
logger.error({ err }, `Failed to setup environment for ${platform} builds`);
if (err instanceof ErrorWithCommandHelp) {
cmd.help();
} else if (err instanceof ErrorWithProgramHelp) {
program.help();
}
process.exit(1);
}
}
export default {
ios: createSetupCommand(PLATFORMS.IOS, 'darwin'),
android: createSetupCommand(PLATFORMS.ANDROID),
};
+51
View File
@@ -0,0 +1,51 @@
import os from 'os';
import path from 'path';
import _ from 'lodash';
import { env } from 'turtle/utils/env';
const resolveEnv = () => {
if (env('EXPO_LOCAL', '0') === '1') {
return 'local';
} else if (env('EXPO_STAGING', '0') === '1') {
return 'staging';
} else {
return 'production';
}
};
const currentEnv = resolveEnv();
const isLocal = (envName: string) => envName === 'local';
const isStaging = (envName: string) => envName === 'staging';
const apiConfig = {
protocol: 'https',
hostname: 'exp.host',
port: 443,
};
if (isStaging(currentEnv)) {
apiConfig.hostname = 'staging.exp.host';
} else if (isLocal(currentEnv)) {
apiConfig.protocol = 'http';
apiConfig.hostname = 'localhost';
apiConfig.port = 3000;
}
const OFFLINE_ENV_VARS = {
TURTLE_MODE: 'offline',
API_PROTOCOL: apiConfig.protocol,
API_HOSTNAME: apiConfig.hostname,
API_PORT: apiConfig.port,
TURTLE_FAKE_UPLOAD: '1',
TURTLE_FAKE_UPLOAD_DIR: path.join(os.homedir(), 'expo-apps'),
TURTLE_WORKING_DIR_PATH: path.join(os.homedir(), '.turtle/workingdir'),
EXPO_SKIP_SOURCING: '1',
};
export function initOfflineEnv() {
_.map(OFFLINE_ENV_VARS, (val, key) => {
process.env[key] = String(val);
});
}
+70
View File
@@ -0,0 +1,70 @@
import path from 'path';
import { LoggerDetach, ModuleVersion } from '@expo/xdl';
import program, { Command } from 'commander';
import fs from 'fs-extra';
import * as commands from 'turtle/bin/commands';
import logger from 'turtle/logger';
const { name, version } = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8'));
const ModuleVersionChecker = ModuleVersion.createModuleVersionChecker(name, version);
LoggerDetach.configure(logger);
Command.prototype.asyncAction = function asyncAction(asyncFn: (...asyncFnArgs: any[]) => void): Command {
return this.action(async (...args) => {
try {
await checkForUpdateAsync();
} catch (err) {
logger.warn({ err }, 'Failed to check for turtle-cli update.');
}
return await asyncFn(...args);
});
};
export function run(programName: string) {
runAsync(programName).catch((err) => {
logger.error({ err }, 'Uncaught Error');
process.exit(1);
});
}
async function runAsync(programName: string) {
program.version(version);
Object.values(commands).forEach((command) => registerCommand(program, command));
program.parse(process.argv);
const subCommand = process.argv[2];
if (subCommand) {
const commandNames = program.commands.reduce((acc: string[], command: any) => {
acc.push(command._name);
const alias = command._alias;
if (alias) {
acc.push(alias);
}
return acc;
}, []);
if (!commandNames.includes(subCommand)) {
logger.error(
`"${subCommand}" is not an ${programName} command. See "${programName} --help" for the full list of commands.`,
);
}
} else {
program.help();
}
}
const registerCommand = (prog: any, command: any) => command(prog);
async function checkForUpdateAsync() {
const { updateIsAvailable, current, latest } = await ModuleVersionChecker.checkAsync();
if (updateIsAvailable) {
logger.warn(
`There is a new version of ${name} available (${latest}).
You are currently using ${name} ${current}
Run \`npm install -g ${name}\` to get the latest version`,
);
}
}
+133
View File
@@ -0,0 +1,133 @@
import path from 'path';
import util from 'util';
import { ExponentTools } from '@expo/xdl';
import fs from 'fs-extra';
import _which from 'which';
import ensureAndroidSDKIsPresent from 'turtle/bin/setup/android/sdk';
import { checkSystem, ensureShellAppIsPresent } from 'turtle/bin/setup/utils/common';
import { IToolDefinition } from 'turtle/bin/setup/utils/toolsDetector';
import { formatShellAppDirectory } from 'turtle/builders/utils/android/workingdir';
import config from 'turtle/config';
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',
missingDescription: 'Please install bash',
},
{
command: 'javac',
missingDescription:
`Please install JDK 8 - keep in mind that other versions are not supported by Android`,
testFn: async () => {
const { status, stdout, stderr } = await ExponentTools.spawnAsyncThrowError(
'java',
['-version'],
{ stdio: 'pipe' },
);
if (stdout.match(/no java runtime present/i)) {
return false;
}
const matchResult = stderr.match(/.*version "(.*)"/);
if (matchResult) {
const [, currentFullJavaVersion] = matchResult;
const javaMajorVersionPosition = currentFullJavaVersion.startsWith('1.') ? 1 : 0;
const javaMajorVersion = Number(currentFullJavaVersion.split('.')[javaMajorVersionPosition]);
if (javaMajorVersion !== JAVA_REQUIRED_VERSION) {
throw new Error(`You're on Java ${currentFullJavaVersion}, 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;
},
},
];
const LOGGER_FIELDS = { buildPhase: 'setting up environment' };
const l = logger.child(LOGGER_FIELDS);
export default async function setup(sdkVersion?: string) {
await checkSystem(REQUIRED_TOOLS);
await prepareAndroidEnv();
if (sdkVersion) {
await ensureShellAppIsPresent(
sdkVersion,
{ formatShellAppDirectory, formatShellAppTarballUriPath },
_shellAppPostDownloadAction,
);
}
}
async function prepareAndroidEnv() {
await fs.ensureDir(config.directories.androidDependenciesDir);
const sdkConfig = await ensureAndroidSDKIsPresent();
_setEnvVars(sdkConfig.envVars);
_alterPath(sdkConfig.path);
}
function formatShellAppTarballUriPath(sdkMajorVersion: string) {
return path.join(config.directories.shellTarballsDir, PLATFORMS.ANDROID, `sdk${sdkMajorVersion}`);
}
async function _shellAppPostDownloadAction(sdkVersion: string, workingdir: string) {
const inWorkingdir = (filename: string) => path.join(workingdir, filename);
if (await fs.pathExists(inWorkingdir('universe-package.json'))) {
// legacy shell app built from universe
await fs.move(inWorkingdir('package.json'), inWorkingdir('exponent-package.json'));
await fs.move(inWorkingdir('universe-package.json'), inWorkingdir('package.json'));
await _installNodeModules(workingdir);
await fs.move(inWorkingdir('package.json'), inWorkingdir('universe-package.json'));
await fs.move(inWorkingdir('exponent-package.json'), inWorkingdir('package.json'));
} else {
// new shell app built from expo or not
await _installNodeModules(workingdir);
}
// TODO: remove this after making sure that we don't need node_modules in tools-public for older sdks
if (ExponentTools.parseSdkMajorVersion(sdkVersion) < 33) {
const toolsPublicDir = path.join(workingdir, 'tools-public');
await _installNodeModules(toolsPublicDir);
}
}
async function _installNodeModules(cwd: string) {
l.info(`installing dependencies in ${cwd} directory...`);
const command = await _shouldUseYarnOrNpm();
// Keep in sync with /Dockerfile
// --prod requires --ignore-scripts (otherwise expo-yarn-workspaces errors as missing)
await ExponentTools.spawnAsyncThrowError(command, ['install', '--ignore-scripts', '--production'], {
pipeToLogger: true,
loggerFields: LOGGER_FIELDS,
cwd,
});
l.info('dependencies installed!');
}
async function _shouldUseYarnOrNpm() {
try {
await which('yarn');
return 'yarn';
} catch (err) {
return 'npm';
}
}
function _setEnvVars(envVars: object) {
Object
.entries(envVars)
.forEach(([key, value]) => process.env[key] = value);
}
function _alterPath(newPaths: string[]) {
const currentPaths = process.env.PATH ? process.env.PATH.split(':') : [];
const paths = [...newPaths, ...currentPaths];
process.env.PATH = paths.join(':');
}
+86
View File
@@ -0,0 +1,86 @@
import os from 'os';
import path from 'path';
import { ExponentTools } from '@expo/xdl';
import decompress from 'decompress';
import fs from 'fs-extra';
import * as utils from 'turtle/bin/setup/utils/common';
import download from 'turtle/bin/setup/utils/downloader';
import config from 'turtle/config';
import logger from 'turtle/logger';
const ANDROID_SDK_URL = 'https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip';
const LOGGER_FIELDS = { buildPhase: 'setting up environment' };
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);
try {
l.info('Downloading Android SDK');
await fs.ensureDir(config.directories.artifactsDir);
await download(ANDROID_SDK_URL, androidSdkDownloadPath);
await fs.ensureDir(androidSdkDir);
l.info('Decompressing Android SDK');
await decompress(androidSdkDownloadPath, androidSdkDir);
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);
throw err;
} finally {
await fs.remove(androidSdkDownloadPath);
}
}
return {
envVars: await _createEnvVars(androidSdkDir),
path: _createPaths(androidSdkDir),
};
}
async function _configureSdk(androidSdkDir: string) {
// prevents warnings about missing repo config
const androidRepositoriesCfgPath = path.join(os.homedir(), '.android/repositories.cfg');
await fs.ensureFile(androidRepositoriesCfgPath);
await ExponentTools.spawnAsyncThrowError('./configureAndroidSdk.sh', [], {
pipeToLogger: true,
loggerFields: LOGGER_FIELDS,
cwd: path.join(config.directories.rootDir, 'scripts/android'),
env: {
...process.env,
ANDROID_HOME: androidSdkDir,
ANDROID_SDK: androidSdkDir,
},
});
}
async function _createEnvVars(androidSdkDir: string) {
const ndkPath = path.join(androidSdkDir, 'ndk/17.2.4988734');
const ndkPathExists = await fs.pathExists(ndkPath);
if (!ndkPathExists) {
l.warn('Skipping NDK installation');
}
return {
ANDROID_HOME: androidSdkDir,
ANDROID_SDK: androidSdkDir,
...(ndkPathExists ? { ANDROID_NDK_HOME: ndkPath } : {}),
};
}
function _createPaths(androidSdkDir: string) {
return [
path.join(androidSdkDir, 'platform-tools'),
path.join(androidSdkDir, 'tools'),
path.join(androidSdkDir, 'tools/bin'),
path.join(androidSdkDir, 'build-tools/28.0.3'),
];
}
Loaded 100 of 186 files, more files were not shown because too many files have changed in this diff. Show more