Compare commits

...
Author SHA1 Message Date
Wojciech Kozyra 611fac9e96 update node 2021-10-15 13:48:20 +02:00
dependabot[bot] b307604177 Bump tmpl from 1.0.4 to 1.0.5 (#331)
Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

---
updated-dependencies:
- dependency-name: tmpl
  dependency-type: indirect
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-15 13:11:01 +02:00
dependabot[bot] 6bdcd744df Bump url-parse from 1.5.1 to 1.5.3 (#339)
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-15 10:38:03 +02:00
Wojciech Kozyra 9447341b84 increase memory limits (#344) 2021-10-08 14:50:30 +02:00
Brent Vatne 817653f01d Release 0.23.0 2021-10-07 11:58:46 -07:00
Brent Vatne eb0f2f5918 Update iOS SDK 43 tarball 2021-10-07 08:49:49 -07:00
Wojciech Kozyra ba4b53b41a Update Android SDK43 shell tarball (#343) 2021-10-07 16:50:48 +02:00
Wojciech Kozyra ba7b4a1968 remove workspaces from shellapp (#342) 2021-10-07 13:35:01 +02:00
Tomasz Sapeta 3cb449f7ff Update Android SDK43 tarball to fix missing expo and react-native-codegen packages 2021-10-06 17:09:28 +02:00
Brent Vatne b6ba977746 Udpate yarn.lock 2021-10-05 18:46:50 -07:00
Brent Vatne 1155e26727 Update xdl to fix Android shell app for SDK 43 2021-10-05 18:44:49 -07:00
Brent Vatne 75ead4d6a1 Add iOS beta tarball for SDK 43 2021-10-05 18:27:00 -07:00
Brent Vatne 7d5b092adc Add Android beta tarball for SDK 43 2021-10-05 17:34:36 -07:00
Wojciech Kozyra b644f15e43 Release 0.22.6 2021-10-01 15:56:13 +02:00
Wojciech Kozyra 18631f6482 Update CHANGELOG 2021-10-01 15:54:36 +02:00
Wojciech Kozyra 85e2408f0c disable ios tests 2021-10-01 15:52:23 +02:00
andy e9897054f3 update xdl to v59.1.5 (#337) 2021-10-01 15:50:00 +02:00
Wojciech Kozyra 6ae5eb1ab2 force rebuild (switch from catalina to big sur) (#334) 2021-09-30 14:21:49 +02:00
Cedric van Putten a32799a584 Update tarball to fix local assets on SDK 42 (#332)
* Update tarball to fix local assets on SDK 42

* Update changelog
2021-09-21 22:15:51 +02:00
Cedric van Putten 6f86b4ac57 Update CHANGELOG.md 2021-09-09 23:35:07 +02:00
Cedric van Putten 9f07dbedb5 Release 0.22.5 2021-09-09 23:21:59 +02:00
Cedric van Putten 3e579ceeba Update changelog with Android tarball bumps 2021-09-09 23:05:59 +02:00
Cedric van Putten a2913c28bf Update tarballs for Android location workaround (#330)
* Update tarball for Android SDK 39

* Update tarball for Android SDK 41

* Update tarball for Android SDK 42

* Update tarball for Android SDK 40
2021-09-09 21:46:44 +02:00
dependabot[bot] a0f9810320 Bump tar from 4.4.15 to 4.4.18 (#329)
Bumps [tar](https://github.com/npm/node-tar) from 4.4.15 to 4.4.18.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v4.4.15...v4.4.18)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: direct:production
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-09 16:16:05 +02:00
Will Schurman 74a3739b6e [logger] Fix s3 logger stream close crash (#326) 2021-08-31 10:16:33 -07:00
dependabot[bot] 2c36c89ed4 Bump tar from 4.4.8 to 4.4.15 (#321)
Bumps [tar](https://github.com/npm/node-tar) from 4.4.8 to 4.4.15.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v4.4.8...v4.4.15)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: direct:production
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-31 16:48:11 +02:00
dependabot[bot] 099afed72c Bump path-parse from 1.0.6 to 1.0.7 (#323)
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-31 14:28:59 +02:00
Wojciech Kozyra 36d1d75544 update to node-forge 0.10.0 (#328) 2021-08-31 12:03:04 +02:00
Juwan Wheatley 70eca74b9c update expo.io links to expo.dev/exp.host (#325) 2021-08-24 14:14:53 -04:00
Brent Vatne 01137526c4 Update CHANGELOG 2021-07-27 17:59:56 -07:00
Brent Vatne 4972744a87 Release 0.22.4 2021-07-27 17:58:47 -07:00
Brent Vatne cbd11f2f4e Update tarballs for SDK 42 2021-07-27 15:20:16 -07:00
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
77 changed files with 6769 additions and 3171 deletions

No files matched your search

+13 -15
View File
@@ -9,7 +9,7 @@ executors:
working_directory: ~/turtle
mac:
macos: # https://circleci.com/docs/2.0/testing-ios/#supported-xcode-versions
xcode: '11.1.0'
xcode: "11.1.0"
working_directory: /Users/distiller/project
shell: /bin/bash -leo pipefail
android:
@@ -57,8 +57,8 @@ commands:
- 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
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:
@@ -141,7 +141,7 @@ commands:
default: linux
steps:
- restore_cache:
key: yarn-v2-<< parameters.platform >>-{{ checksum "<< parameters.workingdir >>/yarn.lock" }}
key: yarn-v3-<< parameters.platform >>-{{ checksum "<< parameters.workingdir >>/yarn.lock" }}
save_yarn_cache:
parameters:
@@ -153,7 +153,7 @@ commands:
default: linux
steps:
- save_cache:
key: yarn-v2-<< parameters.platform >>-{{ checksum "<< parameters.workingdir >>/yarn.lock" }}
key: yarn-v3-<< parameters.platform >>-{{ checksum "<< parameters.workingdir >>/yarn.lock" }}
paths:
- ~/.cache/yarn # `yarn cache dir`
@@ -164,7 +164,7 @@ commands:
default: ios
sdk_version:
type: string
default: sdk37
default: sdk39
steps:
- restore_cache:
key: "workingdir-v2-<< parameters.platform >>-<< parameters.sdk_version >>"
@@ -179,7 +179,7 @@ commands:
default: ios
sdk_version:
type: string
default: sdk37
default: sdk39
steps:
- save_cache:
key: "workingdir-v2-<< parameters.platform >>-<< parameters.sdk_version >>"
@@ -238,14 +238,14 @@ jobs:
- save_yarn_cache:
platform: darwin
- restore_workingdir_cache:
sdk_version: sdk37
sdk_version: sdk39
platform: ios
- run:
name: Run iOS smoke tests
command: SDK_VERSION=sdk37 ./scripts/tests/runIOSSmokeTestsCI.sh
command: SDK_VERSION=sdk39 ./scripts/tests/runIOSSmokeTestsCI.sh
- save_workingdir_cache:
workingdir: /Users/distiller/project/workingdir
sdk_version: sdk37
sdk_version: sdk39
platform: ios
android_smoke_tests:
@@ -257,11 +257,11 @@ jobs:
- run: yarn
- save_yarn_cache
- restore_workingdir_cache:
sdk_version: sdk37
sdk_version: sdk39
platform: android
- run:
name: Fetch Android shell app
command: SDK_VERSION=sdk37 ./scripts/android/fetchRemoteAndroidTarball.sh
command: SDK_VERSION=sdk39 ./scripts/android/fetchRemoteAndroidTarball.sh
- run:
name: Run Android smoke tests
command: |
@@ -269,7 +269,7 @@ jobs:
--run "./scripts/tests/runAndroidSmokeTestsCI.sh"
- save_workingdir_cache:
workingdir: ~/turtle/workingdir
sdk_version: sdk37
sdk_version: sdk39
platform: android
android_staging_deploy:
@@ -307,8 +307,6 @@ workflows:
tests:
jobs:
- unit_tests
- ios_smoke_tests
- android_smoke_tests
deploy:
jobs:
- android_staging_approve_deploy:
+6 -5
View File
@@ -1,10 +1,9 @@
---
name: "\U0001F41B Bug Report"
about: You want to report a reproducible bug or regression in turtle-cli.
title: ''
labels: 'bug'
assignees: ''
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] -->
@@ -13,14 +12,16 @@ assignees: ''
- [ ] 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 read [docs.expo.dev](https://docs.expo.dev) (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
+6 -5
View File
@@ -1,21 +1,22 @@
---
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: ''
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 read [docs.expo.dev](https://docs.expo.dev) (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 -->
+1
View File
@@ -6,6 +6,7 @@ google-cloud-credentials.json
/workingdir/*
/artifacts/*
.history
.vscode/
shell.apk
.secrets*
+3
View File
@@ -10,6 +10,9 @@
"release": true
},
"hooks": {
"before:init": [
"yarn"
],
"after:release": "yarn release:update:turtle-cli-example"
}
}
+270 -3
View File
@@ -7,21 +7,288 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
- Add Android beta tarball for SDK 43
- Add iOS beta tarball for SDK 43
- Bump xdl to fix Android shell app for SDK 43
# [0.22.6] - 2021-10-01
- add `ACCESS_MEDIA_LOCATION` to blacklist for android permissions
- disable automatic versioning in Xcode 13
# [0.22.5] - 2021-09-09
- Fix s3 logger stream close crash.
- Update Android tarballs SDK 42, 41, 40, and 39 to include location workaround.
- Update Android tarball to include a local assets fix on SDK 42.
# [0.22.4] - 2021-07-27
- Update iOS and Android tarballs for SDK 42.
# [0.22.3] - 2021-07-02
- Update Android 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
- Update iOS custom client shell app with various fixes
- 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
- Update SDK 37 iOS shell app with various fixes.
## [0.14.10] - 2020-05-01
### Added
- support for "android.enableDangerousExperimentalLeanBuilds" in app.json
- support for "android.enableDangerousExperimentalLeanBuilds" in app.json.
## [0.14.9] - 2020-04-21
+1 -1
View File
@@ -4,4 +4,4 @@ The Expo team is committed to fostering an open and welcoming environment.
**Our Community Guidelines can be found here:**
https://expo.io/guidelines
https://expo.dev/guidelines
+9 -2
View File
@@ -1,30 +1,37 @@
# 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).
- Helping other people on [Expo Forums](https://forums.expo.dev/) and on [Expo Developers Discord](http://chat.expo.dev).
- 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.
- If you wish to release a new _beta_ version of `turtle-cli`, run `yarn release:beta` instead.
- Update the [changelog](CHANGELOG.md).
+1 -1
View File
@@ -8,7 +8,7 @@
## Setup
- Run `update-local-secrets` to populate the `.secrets*` files. You'll need to run this any time any secret changes (it shouldn't be very often).
- Run `EXPO_UNIVERSE_DIR=/path/to/universe/dir yarn secrets:init-private YOUR_SQS_NICKNAME`. Alternatively, you can create `.secrets.local-queue` file with the SQS queues' urls yourself (`AWS_SQS_OUT_QUEUE_URL`, `AWS_SQS_ANDROID_QUEUE_URL`, `AWS_SQS_ANDROID_PRIORITY_QUEUE_URL`, `AWS_SQS_IOS_QUEUE_URL`, `AWS_SQS_IOS_PRIORITY_QUEUE_URL`)
- Run `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
+13 -11
View File
@@ -1,5 +1,5 @@
# see docker-base/Dockerfile to learn what's installed in the turtle-android-base image
FROM gcr.io/exponentjs/turtle-android-base:0.4.0
FROM gcr.io/exponentjs/turtle-android-base:0.6.0
ADD . /app/turtle
@@ -8,20 +8,22 @@ 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
for SDK_VERSION in `ls /app/workingdir/android/`; do \
echo "preparing $SDK_VERSION shell app" && \
cd /app/workingdir/android/$SDK_VERSION && \
mv package.json copy_package.json && \
jq '.workspaces.packages = ["packages/expo", "packages/expo-modules-autolinking"]' copy_package.json > package.json && \
rm -f copy_package.json && \
# 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 ; \
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"]
+8 -8
View File
@@ -6,8 +6,8 @@
[![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/)
[![Expo Developers Discord](https://img.shields.io/discord/695411232856997968)](http://chat.expo.dev)
[![Expo Forums](https://img.shields.io/badge/Expo%20Forums-blue.svg)](https://forums.expo.dev/)
<hr />
@@ -21,7 +21,7 @@ You can use it both on your CI and your private computer.
## Installation
[Installation instructions and documentation here.](https://docs.expo.io/versions/latest/distribution/turtle-cli)
[Installation instructions and documentation here.](https://docs.expo.dev/distribution/turtle-cli/)
## Usage example
@@ -29,13 +29,13 @@ See the [expo/turtle-cli-example](https://github.com/expo/turtle-cli-example) re
## 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.
- Make sure you've read [the Expo Docs](https://docs.expo.dev/), especially [Building Standalone Apps on Your CI
](https://docs.expo.dev/versions/latest/distribution/turtle-cli) and [Building Standalone Apps](https://docs.expo.dev/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).
- create [a GitHub issue](https://github.com/expo/turtle/issues/new).
- create a new topic on the [Expo Forums](https://forums.expo.dev/).
- connect with the community on the [Expo Developers Discord](http://chat.expo.dev).
## License
+14 -1
View File
@@ -32,7 +32,7 @@ RUN dpkg --add-architecture i386 && \
apt-get clean
ENV NPM_CONFIG_LOGLEVEL warn
ENV NODE_VERSION 12.16.1
ENV NODE_VERSION 12.22.7
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 \
@@ -57,10 +57,23 @@ 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
+8 -11
View File
@@ -88,11 +88,6 @@ spec:
secretKeyRef:
name: turtle-js-config
key: aws_sqs_android_priority_queue_url
- name: AWS_SQS_OUT_QUEUE_URL
valueFrom:
secretKeyRef:
name: turtle-js-config
key: aws_sqs_out_queue_url
- name: AWS_CLOUDWATCH_REGION
valueFrom:
secretKeyRef:
@@ -149,13 +144,15 @@ spec:
- name: DISABLE_DEX_MAX_HEAP
value: "true"
- name: JAVA_OPTS
value: '-Xms2048m -XX:+HeapDumpOnOutOfMemoryError -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+UseG1GC'
value: '-Xms2048m -Xmx13g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC'
- name: GRADLE_OPTS
value: '-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xms2048m -XX:+HeapDumpOnOutOfMemoryError -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+UseG1GC"'
value: '-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xms2048m -Xmx13g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC"'
- name: REDIS_CA_CERTIFICATE
value: '/var/run/config/redislabs-tls/redislabs_ca.pem'
resources:
requests:
memory: "8192Mi"
cpu: "2000m"
memory: "12Gi"
cpu: "3000m"
limits:
memory: "8192Mi"
cpu: "2000m"
memory: "13Gi"
cpu: "3500m"
+14 -11
View File
@@ -1,6 +1,6 @@
{
"name": "turtle-cli",
"version": "0.14.12",
"version": "0.23.0",
"description": "The command-line tool for building standalone Expo apps",
"preferGlobal": true,
"scripts": {
@@ -57,7 +57,7 @@
"engines": {
"node": ">=10"
},
"author": "Expo <support@expo.io>",
"author": "Expo <support@expo.dev>",
"license": "MIT",
"bugs": {
"url": "https://github.com/expo/turtle/issues"
@@ -68,43 +68,46 @@
},
"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.10.0",
"@types/npm-package-arg": "^6.1.0",
"@types/progress": "^2.0.1",
"@types/raven": "^2.5.1",
"@types/request": "^2.47.1",
"@types/request-promise": "^4.1.44",
"@types/semver": "^6.0.0",
"@types/sharp": "^0.17.8",
"@types/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": "^25.1.0",
"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": "^25.2.1",
"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.4.2"
"typescript": "^3.9.5"
},
"dependencies": {
"@expo/config": "^3.0.5",
"@expo/config": "~3.3.9",
"@expo/spawn-async": "^1.4.2",
"@expo/xdl": "57.8.30",
"@expo/xdl": "59.1.7",
"@google-cloud/logging-bunyan": "^2.0.3",
"async-retry": "^1.2.1",
"aws-sdk": "^2.226.1",
@@ -116,7 +119,7 @@
"decompress": "^4.2.0",
"dogapi": "^2.8.3",
"fs-extra": "^6.0.0",
"ioredis": "^3.2.2",
"ioredis": "^4.17.3",
"is-semver": "^1.0.8",
"joi": "^13.2.0",
"lodash": "^4.17.11",
@@ -126,7 +129,7 @@
"request-progress": "^3.0.0",
"request-promise": "^4.2.5",
"semver": "^6.0.0",
"sharp": "0.24.1",
"sharp": "0.28.3",
"source-map-support": "^0.5.6",
"tar": "^4.4.6",
"uuid": "^3.2.1",
@@ -136,7 +139,7 @@
"@expo/traveling-fastlane-darwin": "1.11.4"
},
"volta": {
"node": "12.16.1",
"node": "12.22.7",
"yarn": "1.22.0"
}
}
+1
View File
@@ -0,0 +1 @@
this is just a placeholder to simplify deployments
+5 -1
View File
@@ -19,4 +19,8 @@ yes | $SDKMANAGER \
"extras;google;m2repository" \
"extras;google;google_play_services" | grep -v '='; [[ ${PIPESTATUS[1]} = 0 ]]
yes | $SDKMANAGER "ndk;17.2.4988734" | 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
+1 -3
View File
@@ -1,7 +1,7 @@
#!/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, AWS_SQS_IOS_QUEUE_URL and AWS_SQS_OUT_QUEUE_URL variables."
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
@@ -17,13 +17,11 @@ ANDROID_NORMAL=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_loc
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`
OUT=`cd $TERRAFORM_DIR; terraform state show module.turtle_queues_local_$1.aws_sqs_queue.jobs_out | head -1 | cut -d"=" -f2 | xargs`
cat << EOF > $TURTLE_DIR/.secrets.local-queue
AWS_SQS_ANDROID_QUEUE_URL="$ANDROID_NORMAL"
AWS_SQS_ANDROID_PRIORITY_QUEUE_URL="$ANDROID_PRIORITY"
AWS_SQS_IOS_QUEUE_URL="$IOS_NORMAL"
AWS_SQS_IOS_PRIORITY_QUEUE_URL="$IOS_PRIORITY"
AWS_SQS_OUT_QUEUE_URL="$OUT"
EOF
+6
View File
@@ -2,6 +2,12 @@
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
+6
View File
@@ -2,6 +2,12 @@
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
+1 -1
View File
@@ -7,7 +7,7 @@ DOWNLOAD_DIR="${EXPO_DOWNLOAD_DIR:-$HOME/Downloads}"
mkdir -p $DOWNLOAD_DIR
if [ ! -f "$ROOT_DIR/.secrets.local-queue" ]; then
echo "You need to run \"yarn secrets:init-private [SQS_NAME]\" or create the .secrets.local-queue file yourself with AWS_SQS_ANDROID_QUEUE_URL, AWS_SQS_ANDROID_PRIORITY_QUEUE_URL, AWS_SQS_IOS_QUEUE_URL, AWS_SQS_IOS_PRIORITY_QUEUE_URL and AWS_SQS_OUT_QUEUE_URL variables."
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
+2 -3
View File
@@ -13,20 +13,19 @@ export AWS_SQS_ANDROID_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/2742511416
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_OUT_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_out.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_HOSTNAME="staging.exp.host"
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:-sdk37} >/dev/null 2>&1
pushd $ROOT_DIR/workingdir/android/${SDK_VERSION:-sdk39} >/dev/null 2>&1
yarn
popd >/dev/null 2>&1
+1 -2
View File
@@ -9,13 +9,12 @@ export AWS_SQS_ANDROID_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/2742511416
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_OUT_QUEUE_URL="https://sqs.us-west-2.amazonaws.com/274251141632/turtle_jobs_local_dominik_out.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_HOSTNAME="staging.exp.host"
export API_PORT="443"
export REDIS_URL="noop"
export REDIS_CONFIG_URL="noop"
-1
View File
@@ -9,7 +9,6 @@ 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_SQS_OUT_QUEUE_URL="noop"
export AWS_ACCESS_KEY_ID="noop"
export AWS_SECRET_ACCESS_KEY="noop"
export AWS_SQS_REGION="noop"
+6
View File
@@ -2,6 +2,12 @@
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 \
-1
View File
@@ -1 +0,0 @@
s3://exp-artifacts/android-shell-builder-a8e204610e5712391336b378f47962bbb0c04164.tar.gz
-1
View File
@@ -1 +0,0 @@
s3://exp-artifacts/android-shell-builder-7ce098f40cc82a2f61fed9f1f515d695a83c55b2.tar.gz
+1
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-3fe600781956ce0823143d747a51afec5f9afe4f.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-b111c38c47a05d1c340c69e8744fe0832b05634b.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-ee6c4df8486ae4995e50e4d398ba0ef41a097cfe.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-52041fd6957e7f34d0d0b96e3790570f95de4bd7.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/android-shell-builder-f81705bedfb3436b9aeb026f138f7a70f7be6137.tar.gz
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/ios-expo-client-df59cf942685d6ae64d196cd7ba903aa958c31ec.tar.gz
s3://exp-artifacts/ios-expo-client-dd6b6b4840c7a99725f1ec9a9a3970de91e90b1d.tar.gz
-1
View File
@@ -1 +0,0 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-651588ff3445a5d87b3a5b81ec2977c02b22f3a2.tar.gz
-1
View File
@@ -1 +0,0 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-0115c48ddac4f63e5215541dff804871ef8c1e03.tar.gz
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-661a51216c2241dcfdd930517968cd1d0e0ee237.tar.gz
s3://exp-artifacts/ios-shell-builder-sdk-latest-0983415327f49592d81f0bd3dc8c46a3572c19b0.tar.gz
+1 -1
View File
@@ -1 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-30eb0558ff6a77acf56bb045e98b84f6a5e1478a.tar.gz
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-1bdbf48b083ef475c294128074a4149b276062ff.tar.gz
+1
View File
@@ -0,0 +1 @@
s3://exp-artifacts/ios-shell-builder-sdk-latest-f1812e55b13455b1a1e40dd9133174eda8a09edd.tar.gz
@@ -1 +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>2f9926f3-9db4-588e-a00a-71f445522996</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","2f9926f3-9db4-588e-a00a-71f445522996","Date","Wed, 08 Apr 2020 13:50: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>e42b6179-9846-5d83-9209-367e40aa9c02</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","e42b6179-9846-5d83-9209-367e40aa9c02","Date","Wed, 08 Apr 2020 13:50: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><Message><MessageId>093d5a52-932c-4141-958a-4ee8146dadab</MessageId><ReceiptHandle>AQEBq2BDKWkc+YFuyL+qBVQ6RCqne9ndyzDri6BeHTv+HhCU3kOlINEzzqbgrGJXh49AB6lVInGNsI+uc5uMhC61UscDKfFeqgfhDDUftovz6RXwiIj+xRalgP5fPZn94LbY4KmUoCuGCpXu9UlGxOoorYTkLft9AVY6kabCRlXA8SJzzYjUb1s+rtBoWS3Trj/AOIxOy0EqxeEWpBsNKc1yWc9RNbZ8/qABFLMjOzdmr5gaLEDoRJTUZZUEu9TVOxrC54ES+UaCmgVY17Ubmwo884GbHLoyUA+xqSD0Cvify5GCv3xzB+wjB4gGdGUFdOjj</ReceiptHandle><MD5OfBody>f0cb57fa399d2c8e81f8423e93127bdc</MD5OfBody><Body>{&quot;id&quot;:&quot;1b148a0a-4a5e-4572-b28a-c31aa018351a&quot;,&quot;experienceId&quot;:&quot;0128bca1-78cf-4cb8-ac00-c07600500254&quot;,&quot;experienceName&quot;:&quot;@dsokal-local/turtle-cli-example&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;37.0.0&quot;,&quot;accountId&quot;:&quot;9b473c78-6d0e-4b69-88a8-1c0960287b2f&quot;,&quot;priority&quot;:&quot;normal&quot;,&quot;credentials&quot;:{&quot;keystore&quot;:&quot;/u3+7QAAAAIAAAABAAAAAQAscWdyemIydGhiYzFzYjJuaGJjOTBkeGowYmd1dHkyeHBsd3Y0eXcxd2JndT0AAAFxTutg3AAABQEwggT9MA4GCisGAQQBKgIRAQEFAASCBOl0ClAt46XtKkD3OZ4KtYCfGvjcqn+NUvylgValp+eckKR3vpTdmzIJxCCPCPpVWUT9kssEpIWea1oyDbBoh01lSazoofkTt+QIkcnr2sOcWgoyywIH+jNH4CPDfycdjPBsy8IoFqSz5DSS9vWwdO8xw0uw/iBd0MmQUcdJANZb0HbvrOU9R1n8IeNeFZUS0nk8czYplz8e7+lWphAY1vA7oLKwYMvkPrHQSoHaXh7WqOyn3A31eQgTHZGW2vwSa7gUS+X1izYozAY5AaKrxwUYQ56dWMNnuufSGldj8KWIpdps1Bo1bN6bb/eDWiXbEGWXgwJOZxYs9OFiPPw296aBdtWpG3qu11Z+NQmr28ov0uqj9yWBX/+iO8TgyCEBPZHRnlVRvoRIvhXoZ2GYsLMvJsn7GrdPWHzzs1cKkg85Ffh7Tr1+32LkVHqHtuId/2hhC2HeP5Yzgkw45ty29H3SXWpydrDjLwQAtGYDnYxYplRxhSt+FXMsepuytDCHAjJ27Ers9mMOs8LriYznJcup32FSrdvAk8SXdrxIXmZ7q8dgmI0OD6tlS+cNGm9Y0e7kWbFbSXK72YViVWzAL/Rm0ecQPSnOaowpVsvU6vWHCdUxgwWGpJAXPPrVmvoTwzQQ4gjm6d4IvRzfW2pXMGvw+gr/19LicvUkhRLS7qKHaYS1QXss9rxWgE8SdFMJghFnwc2s+V4wDsf44aeX3/0mYegfijXI/2d6htQ4ouojQBmQlK7pKiUGjDepgT3S+G8XBSslBcTv0Vf5sudUcisXH8BQd015Sf5ruE7k0BLObfUWsJSd3b8uRjwAXkjCKILiUOckIuLwIiRNBj39u5HlrXZeuUiK736F9j9xPwVg5RGzW28gaLLSjZhJVogH6LA72aAEMbpt9155dkmzVa8RCk2P4axEknbL5V9Bq0L/7d2ouR+5MSGQf3lvxxd1qI9R+oTUDUwiJG4P/emjrJ+uXV6uBtz6fA9IrT3s8fWbBGcxToUPQCo2xfHp6VKzoV3wxelWq7LXDFHZWTw4WYbuStSBzdxNoRpmv9f+qBRA2hehildALE3Mib9zg5vPIU1byPuWNs6Tgca+Iolnkj/gCu69LbFWbcKsE34b+L840DHGFaYP455elIk3sQmYfQfP0KCqY1xmixPkT3bZQpRjWCGeemTY4hl+kGnVcvKWejOikWlAIoj3ZsjuEIxseIt3IUyLPpRFIqH1thODR+O/h3rutmWUknzvj+LlNJlDxI9heNm7i2toyY8QOvdZiUw0elS7yxL+MPTRfZfOLsV9glHYbivtwku5aRiG15DUPW+00fwOSQXq4x3D07z0QFmnoRl2IrW/113EkkJCtmNbLrWRXQkUaO5Rj4JYWIu9kc7w9GGMS3v1utQ2w8AicBqbYPMy7QnqSfok/FZVntBB/xQDoecXfMlA/G1x4WYe2/gaXjydSNSAx/ta7zbgVGU0SxNVbBs6vyuvlMqNpnHlS3wmlSkl0qGNqHuRvl1qfc5gJJ3eCTkZdqSMocVjHkutc0gja2gStLxdEGTxh12CvmSmn0vve5qWhuHi1xZxSLJutImspnXuLDKSu5tWPZsi38CAsxAR3sDZ6xe+0EuiJwK8w3R/r6Cz7rZRwYm/mg4x0BvDhkWeuvYJEtAZKCKLlumodK2gl7AAAAABAAVYLjUwOQAAA2EwggNdMIICRaADAgECAgQrux+aMA0GCSqGSIb3DQEBCwUAMF8xCzAJBgNVBAYTAlVTMQkwBwYDVQQIEwAxCTAHBgNVBAcTADEJMAcGA1UEChMAMQkwBwYDVQQLEwAxJDAiBgNVBAMTG2NvbS5leHBvLnR1cnRsZS5jbGkuZXhhbXBsZTAeFw0yMDA0MDYwOTU2MjBaFw00NzA4MjMwOTU2MLine truncated
[{"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
+1 -1
View File
@@ -1 +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/><ResponseMetadata><RequestId>8bea4e96-2dc5-572c-9898-1991f406b911</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","8bea4e96-2dc5-572c-9898-1991f406b911","Date","Wed, 08 Apr 2020 13:54:16 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_ios_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>a995b5e8-7f64-5567-baf9-e2efa6add8fe</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","a995b5e8-7f64-5567-baf9-e2efa6add8fe","Date","Wed, 08 Apr 2020 13:54:22 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_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/><ResponseMetadata><RequestId>8871c5eb-cb40-5a57-a611-92ec128fccd4</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","8871c5eb-cb40-5a57-a611-92ec128fccd4","Date","Wed, 08 Apr 2020 13:54:28 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_ios_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>5c49f623-617a-531c-bbf8-a124b8af2bfd</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","5c49f623-617a-531c-bbf8-a124b8af2bfd","Date","Wed, 08 Apr 2020 13:54:34 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_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/><ResponseMetadata><RequestId>68b706ef-2dce-505b-a0d6-51e8f412e6f9</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","68b706ef-2dce-505b-a0d6-51e8f412e6f9","Date","Wed, 08 Apr 2020 13:54: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_ios_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>c1e6a3e3-8d97-57cd-884c-f4e454757fcd</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","c1e6a3e3-8d97-57cd-884c-f4e454757fcd","Date","Wed, 08 Apr 2020 13:54: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_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/><ResponseMetadata><RequestId>a68dea4b-2de4-5000-b718-bd4cf40ca8fa</RequestId></ResponseMetadata></ReceiveMessageResponse>","rawHeaders":["x-amzn-RequestId","a68dea4b-2de4-5000-b718-bd4cf40ca8fa","Date","Wed, 08 Apr 2020 13:54:53 GMT","Content-Type","text/xml","Content-Length","240"]},{Line truncated
[{"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;MIIMDAIBAzCCC9YGCSqGSIb3DQEHAaCCC8cEggvDMIILvzCCBl8GCSqGSIb3DQEHBqCCBlAwggZMAgEAMIIGRQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIyCGcdprP/WkCAggAgIIGGFqAu4HyWNRsBd7y5oylLA5K4/qtIggDVitAITLQ8lpp8XdzuFkYUpzvIY65WPuS3s/JNX1HcFPbldFqH2p10j5E32WuH1sKxht8OVVmjdMRWqxvU/EUZDQHwX+Os4Mx1h8zQub7JYjQkBpb+TbrZwG/qONyIROJXOPTmF6MyZaQeQ4JSgXxEaDLRJ4z94vu2KXGFIVhBKvs1w78I61OzDKsfiG4kWi0p903wvSfsH4IisigSry9UVGM+jsKU5ZUemgrMWZt23dxOx3kHTLTYH+uGAnu6hwzd3vg1s4wtU1hyDxlDS+2pqPF2wdVA9vnPgFagd0oarMuAbYvgweCjplFgh3biDr+jmson9WPHEaaCe5j1bFl9DFfRz4YyZd0QhUEmjR0idWruEeDTvg+DZ1ULTM3g16xr96E9ku8FOzrcnU3vYsNzD31ltQT2K0MoHGTFNjeX+foM7dgvcDaOgGSwm88+aVCK8/8Vrk0wEYbomlJxh+//2dchpHO0EDGyYaF/f06fv6ZfqOKp+/XMbvDP/iLVN/dOthwuM6aRHIZfQ26V5ddscXCQZKGNpCdJWJNSFdhPKBU3QaLE5mn3IKL+wtxwPPORtJVe5hCh0jAsKY6X+bAp+9M0lTqT5TjSPT1BtoLDVQBLkUiYdBYtVBs132MPFnhxPUZeth+YttFLZpg2eT8C74d83LR9azr6jod7VyTcUjDYNgFsyGdmnyeZ8WLnHWEP+LJJbheUlcj6MhuG7cP9doEWzHk3lwGCn9aRW9J/r7FO+nge88CMZ8UCfGJEYkvqxQArT7a06dEzE/YtMsWS5VQ38h6ByryexO22PZx2Ztcd01fcCf7SNmB5m6GfxsABmDdRukUADsid1Tx+sTT52T7CJlgvOjueHHitIjv7XOkydZ81wWmbSm/3PXcjpzFQk48JGRYErFfcKZQRKtDiYsNMENGhIiqEds2BvwENKuHpsa5EMogj5Eoq9VEdfyKytbEdqe/ri/DvG6IyuS1a7e5UKSP8IXV3/N5ekL9p6xJmXYkqQT9v/ByhIS92Kt3z1ySmWUNWl1FOqDC2Ss00weAE9UFS9DQYLk9hwrqgSCjH5ejIf+AAUb0Fg/ujnsEbC9FVbKbUKq1L0uk1w1q/j17yMAFCyHYqnrJD2xqUjm2ijhwZ1ln1Xrin6l6pcLy6nGYRw1AC+JNNlIQvNPanBI0s/ADF1q2SjLgFa2ohMsV1yEtkPVHokgvrFW8lLAiSX0FXauRbnx6U6eby5j8Mz3MGYKDurqYYmoYQW6ip6Dekg9aE81+PC12SrPfsTiYkOvThiNfyvzirMR7ZsZmTiMWIJKFow0g5ut13eEM+5WnbnK94xVUf9uRP1cgbN9UC0HgyzDQGT0gX84HCT9mIKj0PmofuXzuaMme+3BRTRIkWRZdErPyEJOEzmO0EY7cPFLh3uGa2J7tFSHGgv49ADSayagiYs5bIn1YpoOMINfawYINtzljten2qpfphJXBBcU5dP9T7pYaeLv0xXh0Xye895Qr7So/OuWqSlCaxigRCFP7rXgEISABgDkn+Hp2Dq9ebAzNfRPhx5n63crDyyRPtNb26H29u6hfIUbj2i1uBcbASYXZAxSoM20wjzPm+RGv9tsalXGZhJYEHJqBp/S9hhKxTpKjvIr74gZpbSQxfM0L5K3lmKJ6SNjIngWWLUKN87TtAqanwJgP+GJ+66VfxQdQdxI/bGg94GY1qjJqXyU09J9jMXfA9+oD53w6Fj7Tjry3puqDGB9mEVwKEpK8F6CYs3PKYwbG3Al6RNVpaE+qIPYdGnBTDyd7BHvFDswFYUNkRWtbmawsae9S0sICIc926QK4fQHa304lX0AN82juSVUBeCdEI4sOopm2QMNFkczfVEV7GjFCXi58XRCntfFiwNUI/asC4wjzIMmga3qmBtY5aWrW0lIOge48Gb3f9RDOMCEY/hcZouuLkiRQ2E27hspaHd0+op0zpc/KhV0jSrzCzRnol3YG1kFt8c39F345lpVAPiHMoinYSakpAnn0zRjNXzIC+zfdpgBzV0x1Fv5C9vanqCUUEp/9OzCCBVgGCSqGSIb3DQEHAaCCBUkEggVFMIIFQTCCBT0GCyqGSIb3DQEMCgECoIIE7jCCBOowHAYKKoZIhvcNAQwBAzAOBAgX37um07SbJwICCAAEggTIcFrbpfb6ISarEIHkvxM7JcLn+UtU1aolZ++BuMPrKZl9Bnau1bLjg0BJLxMfycvJ9TsjvgH/b8y1BjF7uesn4XxbAlc8HoyA+8/t5emjiEicISNwcVTMHWPPY0TV88xPeAKHAG5HugXIsOaVjkrI0l36M1e9+J6MfF6sG4+phhK/YKmPJtwRwXsrWDLdt4ScG/uQi+tBG+Be02kVHjg9rUrBokmuPGF9/q/2k/f4f3VkDlFGNugubc6moPS73X1wnWdOD3ob32Hx4lhcAUngmtqDF8Uczsk5YZz0vjFd1Go9uWNbI+hjj8Pjv/iU1Tcov6VcCPxXfYYRKYJlRrurdA+ZLwGXBXpU0thEv1RMj9RTljPecU783qvDs6kj3AEh5K6RBoPauOGDkZZzxvz8jbcZb9aY/GZddHESnAA22yEcYbMeyQb0d1HYiOC6Wy6RGsy7PqDRg/8gNHna4BYUMgJD6EfCp5gt6hyjA7fVi/HI9S4GmfUlxR4IBe1t8BvmKKL8WgzydRupn3/hXpEcg3P2rbLH8L4OqnEV4Dpgp5ic+a6HjqVgK/EihO6gPA7HftGPJ6Egs62Line truncated
+1 -2
View File
@@ -17,8 +17,7 @@ jest.mock('../builders/utils/uploader.ts', () => ({
async function performSmokeTest(recording: string) {
jest.setTimeout(60 * 60 * 1000);
// @ts-ignore
const fixtureExists = await fs.exists(recording);
const fixtureExists = await fs.pathExists(recording);
if (fixtureExists) {
logger.info('Fixture exists, test will use existing one.');
+1 -1
View File
@@ -136,7 +136,7 @@ function _addEmptyMetrics(metrics: IMetric[]) {
acc.add(i.MetricName);
}
return acc;
}, new Set());
}, new Set<string>());
const nonEmptyMetrics = _.omitBy(state.registeredMetrics, ({ addEmpty }) => !addEmpty);
const toAdd = _.difference(Object.keys(nonEmptyMetrics), Array.from(seenMetrics));
+4 -4
View File
@@ -19,10 +19,10 @@ export default function calculateStatistics(metrics: IMetric[]) {
});
}
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;
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];
+1 -18
View File
@@ -2,9 +2,8 @@ import retry from 'async-retry';
import AWS from 'aws-sdk';
import _ from 'lodash';
import { OUTPUT_QUEUE_URL, QUEUE_URL } from 'turtle/aws/utils';
import { QUEUE_URL } from 'turtle/aws/utils';
import config from 'turtle/config';
import { JOB_UPDATE_TYPE } from 'turtle/constants/build';
import logger from 'turtle/logger';
import { getCurrentJobId } from 'turtle/turtleContext';
@@ -73,19 +72,3 @@ export function changeMessageVisibilityRecurring(priority: string, receiptHandle
}
}, (VISIBILITY_TIMEOUT_SEC * 1000) / 3);
}
export async function sendMessage(jobId: string, status: JOB_UPDATE_TYPE, data = {}) {
const params = {
MessageBody: JSON.stringify({ jobId, status, ...data }),
QueueUrl: OUTPUT_QUEUE_URL(),
DelaySeconds: 0,
MessageGroupId: jobId,
};
try {
return await retry(async () => {
return await sqs.sendMessage(params).promise();
});
} catch (err) {
logger.error({ err }, `Error sending SQS message: ${JSON.stringify(params)}}`);
}
}
-1
View File
@@ -1,4 +1,3 @@
import config from 'turtle/config';
export const QUEUE_URL = (priority: string) => (config.sqs.queues as any)[priority][config.platform];
export const OUTPUT_QUEUE_URL = () => config.sqs.queues.out;
+5
View File
@@ -29,6 +29,11 @@ export default (program: any, setCommonCommandOptions: any) => {
/^(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.',
+6 -1
View File
@@ -15,7 +15,12 @@ function setCommonCommandOptions(cmd: any) {
.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!',
'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>',
+8 -2
View File
@@ -42,7 +42,7 @@ export default async function ensureAndroidSDKIsPresent() {
}
}
return {
envVars: _createEnvVars(androidSdkDir),
envVars: await _createEnvVars(androidSdkDir),
path: _createPaths(androidSdkDir),
};
}
@@ -63,10 +63,16 @@ async function _configureSdk(androidSdkDir: string) {
});
}
function _createEnvVars(androidSdkDir: string) {
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 } : {}),
};
}
+16 -13
View File
@@ -1,6 +1,6 @@
import _url from 'url';
import { ConfigError, getExpoSDKVersion } from '@expo/config';
import { ConfigError, getExpoSDKVersion, ProjectConfig } from '@expo/config';
import { ExponentTools } from '@expo/xdl';
import _ from 'lodash';
import uuid from 'uuid';
@@ -57,7 +57,7 @@ export function createBuilderAction({
);
}
if (cmd.publicUrl) {
if (cmd.publicUrl && !cmd.allowNonHttpsPublicUrl) {
const parsedPublicUrl = _url.parse(cmd.publicUrl);
if (parsedPublicUrl.protocol !== 'https:') {
throw new ErrorWithCommandHelp('--public-url is invalid - only HTTPS urls are supported');
@@ -74,12 +74,12 @@ export function createBuilderAction({
publicUrl: cmd.publicUrl,
};
const appJSON = await ProjectUtils.loadAppJSON(projectDirArg, cmd.config);
const sdkVersion = getExpoSDKVersionSafely(projectAbsoluteDir, appJSON);
const projectConfig = await ProjectUtils.getConfig(projectDirArg, cmd.config);
const sdkVersion = getExpoSDKVersionSafely(projectAbsoluteDir, projectConfig);
await setup(platform, sdkVersion);
const credentials = await prepareCredentials(cmd);
const rawJob = {
...await buildJobObject(platform, appJSON, args, credentials, sdkVersion),
...await buildJobObject(cmd, platform, projectConfig, args, credentials, sdkVersion),
...cmd.buildDir && { fakeUploadDir: ProjectUtils.resolveAbsoluteDir(cmd.buildDir) },
...cmd.output && { fakeUploadBuildPath: ProjectUtils.resolveAbsoluteDir(cmd.output) },
};
@@ -97,9 +97,9 @@ export function createBuilderAction({
};
}
function getExpoSDKVersionSafely(projectDir: string, appJSON?: any) {
function getExpoSDKVersionSafely(projectDir: string, projectConfig: ProjectConfig) {
try {
return getExpoSDKVersion(projectDir, appJSON && appJSON.expo);
return getExpoSDKVersion(projectDir, projectConfig.exp);
} catch (err) {
if (err instanceof ConfigError) {
throw new Error(
@@ -113,22 +113,25 @@ function getExpoSDKVersionSafely(projectDir: string, appJSON?: any) {
}
const buildJobObject = async (
cmd: any,
platform: 'android' | 'ios',
appJSON: any,
projectConfig: ProjectConfig,
{ releaseChannel, buildType, buildMode, username, publicUrl, projectDir }: any,
credentials: any,
sdkVersion: string,
) => {
const experienceName = `@${_.get(appJSON, 'expo.owner', username)}/${_.get(appJSON, 'expo.slug')}`;
const owner = projectConfig.exp.owner || username;
const experienceName = `@${owner}/${projectConfig.exp.slug}`;
const job = {
config: {
..._.get(appJSON, `expo.${platform}.config`, {}),
...(projectConfig.exp?.[platform]?.config || {}),
buildType,
...(platform === 'android' ? { buildMode } : {}),
releaseChannel,
...(platform === 'ios' ? { bundleIdentifier: _.get(appJSON, 'expo.ios.bundleIdentifier') } : {}),
...(platform === 'android' ? { androidPackage: _.get(appJSON, 'expo.android.package') } : {}),
publicUrl,
...(platform === 'android' && cmd.gradleArgs ? { gradleArgs: cmd.gradleArgs.split(' ') } : {}),
...(platform === 'android' ? { buildMode } : {}),
...(platform === 'android' ? { androidPackage: projectConfig.exp?.android?.package } : {}),
...(platform === 'ios' ? { bundleIdentifier: projectConfig.exp?.ios?.bundleIdentifier } : {}),
},
id: uuid.v4(),
platform,
+11 -13
View File
@@ -1,20 +1,18 @@
import fs from 'fs-extra';
import path from 'path';
export async function loadAppJSON(projectDirArg: string, config: string | null) {
let appJSONPath;
import { getConfig as getProjectConfig, setCustomConfigPath } from '@expo/config';
import fs from 'fs-extra';
export async function getConfig(projectDir: string, config: string | null) {
projectDir = resolveAbsoluteDir(projectDir);
if (config) {
appJSONPath = resolveAbsoluteDir(config);
} else {
const projectDir = resolveAbsoluteDir(projectDirArg);
appJSONPath = path.join(projectDir, 'app.json');
}
const appJSONExists = await fs.pathExists(appJSONPath);
if (!appJSONExists) {
throw new Error(`Couldn't find app.json.`);
} else {
return require(appJSONPath);
const pathToConfig = path.resolve(process.cwd(), config);
if (!await fs.pathExists(pathToConfig)) {
throw new Error(`File at provided config path does not exist: ${pathToConfig}`);
}
setCustomConfigPath(projectDir, pathToConfig);
}
return await getProjectConfig(projectDir, {});
}
export const resolveAbsoluteDir = (dir: string) => {
+4 -3
View File
@@ -34,8 +34,8 @@ export default async function buildAndroid(jobData: IJob): Promise<IJobResult> {
...config.builder.fakeUpload && {
fakeUploadBuildPath:
jobData.fakeUploadBuildPath
? jobData.fakeUploadBuildPath
: path.join(jobData.fakeUploadDir || config.directories.fakeUploadDir, fakeUploadFilename),
? jobData.fakeUploadBuildPath
: path.join(jobData.fakeUploadDir || config.directories.fakeUploadDir, fakeUploadFilename),
},
});
@@ -84,7 +84,7 @@ async function runShellAppBuilder(
logger.info({ buildPhase: 'resolve native modules' }, 'Resolving universal modules dependencies');
const packageJsonDependecies = _.get(manifest, 'dependencies');
const enabledModules = _.get(manifest, 'android.enableDangerousExperimentalLeanBuilds')
? await resolveNativeModules(workingDir, packageJsonDependecies)
? await resolveNativeModules(workingDir, sdkVersion, packageJsonDependecies)
: await resolveExplicitOptIn(workingDir, packageJsonDependecies);
try {
@@ -103,6 +103,7 @@ async function runShellAppBuilder(
modules: enabledModules,
buildType: jobData.config.buildType,
buildMode: jobData.config.buildMode,
gradleArgs: jobData.config.gradleArgs,
});
} catch (err) {
commonUtils.logErrorOnce(err);
+8
View File
@@ -1,6 +1,7 @@
import fs from 'fs-extra';
import pick from 'lodash/pick';
import spawnAsync from '@expo/spawn-async';
import buildArchive from 'turtle/builders/ios/archive';
import { createBuilderContext, IContext } from 'turtle/builders/ios/context';
import buildSimulator from 'turtle/builders/ios/simulator';
@@ -51,6 +52,13 @@ async function initBuilder(ctx: IContext) {
await fs.ensureDir(dir);
await fs.chmod(dir, 0o755);
}
if (config.builder.mode === 'online') {
await spawnAsync('sudo', ['xcrun', 'simctl', 'list']);
} else {
// sudo not needed for CLI builds
await spawnAsync('xcrun', ['simctl', 'list']);
}
}
async function cleanup(ctx: IContext) {
+2 -5
View File
@@ -5,11 +5,10 @@ import fs from 'fs-extra';
import get from 'lodash/get';
import uuidv4 from 'uuid/v4';
import * as sqs from 'turtle/aws/sqs';
import { UPDATE_CREDENTIALS } from 'turtle/constants/build';
import { IAndroidCredentials, IJob } from 'turtle/job';
import logger from 'turtle/logger';
import { isOffline } from 'turtle/turtleContext';
import { sendCredentialsUpdate } from 'turtle/utils/www';
async function getOrCreateCredentials(jobData: IJob): Promise<IAndroidCredentials> {
if (!jobData.credentials) {
@@ -50,9 +49,7 @@ async function getOrCreateCredentials(jobData: IJob): Promise<IAndroidCredential
l.info(`Key password: ${credentials.keyPassword}`);
l.info(`Please keep these credentials safe`);
} else {
await sqs.sendMessage(jobData.id, UPDATE_CREDENTIALS, {
...credentials,
});
await sendCredentialsUpdate(jobData.id, 'android', credentials);
l.info('Keystore sent to storage successfully');
}
await fs.unlink(keystoreFilename);
+2 -3
View File
@@ -4,12 +4,11 @@ import spawnAsync from '@expo/spawn-async';
import { IosCodeSigning } from '@expo/xdl';
import fs from 'fs-extra';
import * as sqs from 'turtle/aws/sqs';
import BuildError, { BuildErrorReason } from 'turtle/builders/BuildError';
import { UPDATE_CREDENTIALS } from 'turtle/constants/build';
import { IJob } from 'turtle/job';
import logger from 'turtle/logger';
import { isOffline } from 'turtle/turtleContext';
import { sendCredentialsUpdate } from 'turtle/utils/www';
// tslint:disable-next-line:no-var-requires
const travelingFastlane = process.platform === 'darwin' ? require('@expo/traveling-fastlane-darwin')() : null;
@@ -64,7 +63,7 @@ async function prepareAdHocBuildCredentials(job: IJob) {
await fs.writeFile(provisioningProfilePath, Buffer.from(credentials.provisioningProfile, 'base64'));
logger.info(`Saved provisioning profile to ${provisioningProfilePath}`);
} else {
await sqs.sendMessage(job.id, UPDATE_CREDENTIALS, {
await sendCredentialsUpdate(job.id, 'ios', {
provisioningProfileId: credentials.provisioningProfileId,
provisioningProfile: credentials.provisioningProfile,
});
+74 -19
View File
@@ -4,6 +4,7 @@ import keys from 'lodash/keys';
import merge from 'lodash/merge';
import values from 'lodash/values';
import path from 'path';
import semver from 'semver';
import logger from 'turtle/logger';
export interface IUnimoduleEntry {
@@ -19,21 +20,37 @@ interface IPackageInfo {
dependencies: string[];
}
export async function resolveExplicitOptIn(workingdir: string, packages?: string[]): Promise<IUnimoduleEntry[]> {
export async function resolveExplicitOptIn(
workingdir: string,
packages?: string[],
): Promise<IUnimoduleEntry[]> {
const resolver = new Resolver(workingdir);
await resolver.init();
const optionalModules = ['expo-branch'];
resolver.addAll();
const modules = packages
? resolver.getModules().filter((mod) => !optionalModules.includes(mod.name) || packages.includes(mod.name))
: resolver.getModules().filter((mod) => !optionalModules.includes(mod.name));
? resolver
.getModules()
.filter(
(mod) =>
!optionalModules.includes(mod.name) || packages.includes(mod.name),
)
: resolver
.getModules()
.filter((mod) => !optionalModules.includes(mod.name));
modules.forEach(({ name, version }) => { logger.info(`Adding ${name}:${version}`); });
modules.forEach(({ name, version }) => {
logger.info(`Adding ${name}:${version}`);
});
return modules;
}
export async function resolveNativeModules(workingdir: string, packages?: string[]): Promise<IUnimoduleEntry[]> {
export async function resolveNativeModules(
workingdir: string,
sdkVersion: string,
packages?: string[],
): Promise<IUnimoduleEntry[]> {
const resolver = new Resolver(workingdir);
await resolver.init();
@@ -41,6 +58,13 @@ export async function resolveNativeModules(workingdir: string, packages?: string
resolver.addAll();
} else {
const corePackages = await readCorePackages(workingdir);
// expo-notifications is required for shell apps in SDK >= 39
// https://github.com/expo/expo/issues/10569
if (semver.gte(sdkVersion, '39.0.0')) {
resolver.addModule('expo-notifications');
}
for (const pkg of corePackages) {
if (resolver.isUnimodule(pkg)) {
resolver.addModule(pkg);
@@ -53,17 +77,36 @@ export async function resolveNativeModules(workingdir: string, packages?: string
}
}
const modules = resolver.getModules();
modules.forEach(({ name, version }) => { logger.info(`Adding ${name}:${version}`); });
modules.forEach(({ name, version }) => {
logger.info(`Adding ${name}:${version}`);
});
return modules;
}
async function readCorePackages(workingdir: string) {
const pkgJsonPath = path.join(workingdir, 'node_modules', 'react-native-unimodules', 'package.json');
const expoPkgJsonPath = path.join(workingdir, 'packages', 'expo', 'package.json');
if (await fs.pathExists(pkgJsonPath) && await fs.pathExists(expoPkgJsonPath)) {
const pkgJsonPath = path.join(
workingdir,
'node_modules',
'react-native-unimodules',
'package.json',
);
const expoPkgJsonPath = path.join(
workingdir,
'packages',
'expo',
'package.json',
);
if (
(await fs.pathExists(pkgJsonPath)) &&
(await fs.pathExists(expoPkgJsonPath))
) {
const packageJson = JSON.parse(await fs.readFile(pkgJsonPath, 'utf-8'));
const expoPackageJson = JSON.parse(await fs.readFile(expoPkgJsonPath, 'utf-8'));
return keys(packageJson.dependencies).concat(keys(expoPackageJson.dependencies));
const expoPackageJson = JSON.parse(
await fs.readFile(expoPkgJsonPath, 'utf-8'),
);
return keys(packageJson.dependencies).concat(
keys(expoPackageJson.dependencies),
);
} else {
logger.warn('No core packages detected');
return [];
@@ -76,7 +119,7 @@ interface IDependencyInfo {
class Resolver {
private workingdir: string;
private modulesMap: {[key: string]: IUnimoduleEntry};
private modulesMap: { [key: string]: IUnimoduleEntry };
private dependencyMap: IDependencyInfo;
constructor(workingdir: string) {
@@ -108,7 +151,7 @@ class Resolver {
}
public getModules(): IUnimoduleEntry[] {
return values(this.modulesMap);
return values(this.modulesMap);
}
private async resolveModule(moduleName: string) {
@@ -127,7 +170,9 @@ class Resolver {
}
}
async function generateDependenciesInfo(workingdir: string): Promise<IDependencyInfo> {
async function generateDependenciesInfo(
workingdir: string,
): Promise<IDependencyInfo> {
const dir = await fs.readdir(path.join(workingdir, 'packages'));
const map: IDependencyInfo = {};
@@ -140,7 +185,9 @@ async function generateDependenciesInfo(workingdir: string): Promise<IDependency
}
// handle @unimodules directory
const unimodulesDir = await fs.readdir(path.join(workingdir, 'packages', '@unimodules'));
const unimodulesDir = await fs.readdir(
path.join(workingdir, 'packages', '@unimodules'),
);
for (const pkgName of unimodulesDir) {
const pkg = await getPackage(workingdir, path.join('@unimodules', pkgName));
if (pkg) {
@@ -155,19 +202,27 @@ async function generateDependenciesInfo(workingdir: string): Promise<IDependency
return map;
}
async function getPackage(workingdir: string, pkgName: string): Promise<IPackageInfo | null> {
async function getPackage(
workingdir: string,
pkgName: string,
): Promise<IPackageInfo | null> {
const pkgPath = path.join(workingdir, 'packages', pkgName);
const isAndroid = await fs.pathExists(path.join(pkgPath, 'android'));
const isIos = await fs.pathExists(path.join(pkgPath, 'ios'));
const isUnimodule = await fs.pathExists(path.join(pkgPath, 'unimodule.json'));
const hasPackageJson = await fs.pathExists(path.join(pkgPath, 'package.json'));
const hasPackageJson = await fs.pathExists(
path.join(pkgPath, 'package.json'),
);
if (!isUnimodule || !hasPackageJson || (!isAndroid && !isIos)) {
return null;
}
const packageJson = JSON.parse(await fs.readFile(path.join(pkgPath, 'package.json'), 'utf-8'));
const packageJson = JSON.parse(
await fs.readFile(path.join(pkgPath, 'package.json'), 'utf-8'),
);
const pkgDeps = merge({}, // reading everything to make sure
const pkgDeps = merge(
{}, // reading everything to make sure
packageJson.dependencies,
packageJson.peerDependencies,
packageJson.unimodulePeerDependencies,
+18 -5
View File
@@ -1,3 +1,4 @@
import fs from 'fs';
import os from 'os';
import path from 'path';
@@ -28,7 +29,6 @@ export default {
ios: env('AWS_SQS_IOS_PRIORITY_QUEUE_URL'),
android: env('AWS_SQS_ANDROID_PRIORITY_QUEUE_URL'),
},
out: env('AWS_SQS_OUT_QUEUE_URL'),
},
},
cloudwatch: {
@@ -44,8 +44,17 @@ export default {
intervalMs: env('DATADOG_INTERVAL_MS', 5 * 60 * 1000),
},
redis: {
url: env('REDIS_URL'),
configUrl: env('REDIS_CONFIG_URL'),
main: {
url: env('REDIS_URL'),
caCertificate: envTransform(
'REDIS_CA_CERTIFICATE',
null,
(caCertificate: string) => caCertificate && fs.readFileSync(caCertificate),
),
},
turtle: {
url: env('REDIS_CONFIG_URL'),
},
},
logger: {
level: env('LOGGER_LEVEL', 'info'),
@@ -81,7 +90,7 @@ export default {
androidDependenciesDir: env(
'TURTLE_ANDROID_DEPENDENCIES_DIR',
path.join(os.homedir(), '.turtle/androidDependencies'),
),
),
tempS3LogsDir: env('TURTLE_TEMP_S3_LOGS_DIR', '/tmp/logs'),
fakeUploadDir: envOptional('TURTLE_FAKE_UPLOAD_DIR'),
temporaryFilesRoot: env(
@@ -90,6 +99,10 @@ export default {
),
},
www: {
sdkVersionsSecretToken: env('TURTLE_SDK_VERSIONS_SECRET_TOKEN'),
secretToken: env('TURTLE_SDK_VERSIONS_SECRET_TOKEN'),
},
leader: {
redisKey: env('LEADER_REDIS_KEY', 'turtle-v1:leader'),
redisKeyTTLSec: envNum('LEADER_REDIS_KEY_TTL', 30),
},
};
+1
View File
@@ -15,6 +15,7 @@ export interface IJob {
// android
androidPackage?: string;
buildMode?: ANDROID_BUILD_MODES;
gradleArgs?: string[];
};
credentials: {
// android
+26 -10
View File
@@ -12,6 +12,7 @@ import * as buildStatusMetric from 'turtle/metrics/buildStatus';
import { checkShouldExit, setCurrentJobId, turtleVersion } from 'turtle/turtleContext';
import { getPriorities, labelConfiguration, TurtleMode } from 'turtle/utils/priorities';
import * as redis from 'turtle/utils/redis';
import { sendBuildStatusUpdate } from 'turtle/utils/www';
import { sanitizeJob } from 'turtle/validator';
function _maybeExit() {
@@ -73,7 +74,8 @@ async function processJob(jobData: any, turtleMode: TurtleMode) {
logger.error({ err, ...rawJob && { buildJobId: rawJob.id } }, 'The build job is invalid');
// send message only if we've managed to parse the job json
if (rawJob) {
await sqs.sendMessage(rawJob.id, BUILD.JOB_STATES.ERRORED, {
await sendBuildStatusUpdate(rawJob.id, {
status: BUILD.JOB_STATES.ERRORED,
turtleVersion,
buildDuration: 0,
reason: 'The build job is invalid',
@@ -128,7 +130,7 @@ async function processJob(jobData: any, turtleMode: TurtleMode) {
function failAfterMaxJobTime(priority: string, receiptHandle: string, job: any) {
return setTimeout(async () => {
try {
sqs.sendMessage(job.id, BUILD.JOB_STATES.ERRORED, { turtleVersion });
sendBuildStatusUpdate(job.id, { status: BUILD.JOB_STATES.ERRORED, turtleVersion });
await deleteMessage(priority, receiptHandle);
} finally {
logger.error('Build timed out. Going to terminate turtle agent.');
@@ -143,16 +145,28 @@ async function build(job: any, turtleMode: TurtleMode) {
const s3Url = await logger.initForJob(job);
const calculateBuildDuration = () => Math.ceil((Date.now() - startTimestamp) / 1000);
try {
await sqs.sendMessage(job.id, BUILD.JOB_STATES.IN_PROGRESS, {
logUrl: s3Url,
logFormat: 'json',
const commonPayload = {
logs: {
url: s3Url,
format: 'json',
},
extraData: {
turtleMode,
},
};
try {
await sendBuildStatusUpdate(job.id, {
...commonPayload,
status: BUILD.JOB_STATES.IN_PROGRESS,
});
const result = await (builders as any)[job.platform](job);
const { artifactUrl } = await (builders as any)[job.platform](job);
const buildDuration = calculateBuildDuration();
sqs.sendMessage(job.id, BUILD.JOB_STATES.FINISHED, {
...result,
sendBuildStatusUpdate(job.id, {
...commonPayload,
artifacts: {
url: artifactUrl,
},
status: BUILD.JOB_STATES.FINISHED,
turtleVersion,
buildDuration,
});
@@ -164,7 +178,9 @@ async function build(job: any, turtleMode: TurtleMode) {
if (err instanceof BuildError) {
reason = err.reason;
}
sqs.sendMessage(job.id, BUILD.JOB_STATES.ERRORED, {
sendBuildStatusUpdate(job.id, {
...commonPayload,
status: BUILD.JOB_STATES.ERRORED,
turtleVersion,
buildDuration,
...reason && { reason },
+1
View File
@@ -15,6 +15,7 @@ export default baseJobSchema.concat(
config: Joi.object().keys({
buildMode: Joi.string().valid(Object.values(ANDROID_BUILD_MODES)).default(ANDROID_BUILD_MODES.RELEASE),
buildType: Joi.string().valid(Object.values(ANDROID_BUILD_TYPES)).default(ANDROID_BUILD_TYPES.APK),
gradleArgs: Joi.array().items(Joi.string()),
}),
}),
);
+2 -2
View File
@@ -29,13 +29,13 @@ class Logger {
jobID: job.id,
experienceName: job.experienceName,
});
const s3Url = await streams.s3.stream.init(job);
const s3Url = await streams.s3?.stream.init(job);
return s3Url;
}
public async cleanup() {
this.currentLogger = this.parentLogger;
await streams.s3.stream.cleanup();
await streams.s3?.stream.cleanup();
}
public trace(...all: any[]) {
+9 -7
View File
@@ -1,20 +1,22 @@
import pickBy from 'lodash/pickBy';
import { pickBy } from 'lodash';
import createGCloudStream from 'turtle/logger/streams/gcloud';
import createOfflineStream from 'turtle/logger/streams/offline';
import createS3Stream from 'turtle/logger/streams/s3';
import createS3Stream, { S3Stream } from 'turtle/logger/streams/s3';
import createSentryStream from 'turtle/logger/streams/sentry';
import { isOffline } from 'turtle/turtleContext';
interface IStream {
stream: any;
interface IStream<T> {
stream: T;
type?: string;
level?: string;
reemitErrorEvents?: boolean;
}
interface IStreamMap {
[key: string]: IStream;
stdout: IStream<any>;
gcloud?: IStream<any>;
s3?: IStream<S3Stream>;
sentry?: IStream<any>;
}
function prepareStreams(): IStreamMap {
@@ -29,7 +31,7 @@ function prepareStreams(): IStreamMap {
s3: createS3Stream(),
sentry: createSentryStream(),
};
return pickBy(allStreams) as IStreamMap;
return pickBy(allStreams) as any as IStreamMap;
}
}
+7 -3
View File
@@ -18,7 +18,7 @@ export default function create() {
};
}
class S3Stream extends EventEmitter {
export class S3Stream extends EventEmitter {
private s3Url: string | null = null;
private lastFlush: number | null = null;
private filePath: string | null = null;
@@ -44,7 +44,11 @@ class S3Stream extends EventEmitter {
public async cleanup() {
await this.flush(true);
await fs.close(this.fileHandle as number);
if (this.fileHandle) {
await fs.close(this.fileHandle);
}
this.fileHandle = null;
this.waitingOnPromise = false;
}
@@ -64,7 +68,7 @@ class S3Stream extends EventEmitter {
return;
}
fs
.write(this.fileHandle as number, `${JSON.stringify(rec)}\n`)
.write(this.fileHandle, `${JSON.stringify(rec)}\n`)
.then(() => {
this.flush();
});
+26
View File
@@ -6,6 +6,8 @@ import { doJob } from 'turtle/jobManager';
import logger from 'turtle/logger';
import setup from 'turtle/setup';
import { checkShouldExit, setShouldExit, turtleVersion } from 'turtle/turtleContext';
import { synchronizeFailedUpdates } from 'turtle/updatesManager';
import Leader, { LeaderEvent } from 'turtle/utils/leader';
import { setSupportedSdkVersions, setTurtleVersion } from 'turtle/utils/versions';
process.on('unhandledRejection', (err) => logger.error({ err }, 'Unhandled promise rejection'));
@@ -33,6 +35,8 @@ async function main() {
await setup[config.platform]();
}
await electLeaderAndSynchronize();
try {
await setTurtleVersion(turtleVersion);
logger.info(`Registered Turtle version (${turtleVersion}) in www`);
@@ -52,6 +56,28 @@ async function main() {
}
}
async function electLeaderAndSynchronize() {
if (config.env === 'test') {
return;
}
const l = new Leader({
key: config.leader.redisKey,
id: config.hostname,
ttl: config.leader.redisKeyTTLSec,
});
let intervalId: NodeJS.Timeout;
l.on(LeaderEvent.elected, async () => {
intervalId = await synchronizeFailedUpdates();
});
l.on(LeaderEvent.revoked, () => {
if (intervalId) {
clearInterval(intervalId);
}
});
await l.elect();
}
main()
.then(() => logger.error('This should never happen...'))
.catch((err) => logger.error({ err }, 'Something went terribly wrong'))
-1
View File
@@ -4,7 +4,6 @@ declare module 'bunyan-sentry-stream';
declare module 'bunyan-debug-stream';
declare module 'copy';
declare module 'dogapi';
declare module 'ioredis';
declare module 'is-semver';
declare module 'request-progress';
declare module '@expo/xdl';
+472
View File
@@ -0,0 +1,472 @@
interface pbxFile {
basename: string;
lastKnownFileType?: string;
group?: string;
path?: string;
fileEncoding?: number;
defaultEncoding?: number;
sourceTree: string;
includeInIndex?: number;
explicitFileType?: unknown;
settings?: object;
uuid?: string;
fileRef: string;
target?: string;
}
declare module 'xcode' {
/**
* UUID that is a key to each fragment of PBXProject.
*/
type UUID = string;
/**
* if has following format `${UUID}_comment`
*/
type UUIDComment = string;
type XCObjectType =
| 'PBXBuildFile'
| 'PBXFileReference'
| 'PBXFrameworksBuildPhase'
| 'PBXGroup'
| 'PBXNativeTarget'
| 'PBXProject'
| 'PBXResourcesBuildPhase'
| 'PBXShellScriptBuildPhase'
| 'PBXSourcesBuildPhase'
| 'PBXVariantGroup'
| 'XCBuildConfiguration'
| 'XCConfigurationList';
type PBXFile = pbxFile;
interface PBXProject {
isa: 'PBXProject';
attributes: {
LastUpgradeCheck: number;
TargetAttributes: Record<
UUID,
{
CreatedOnToolsVersion?: string;
TestTargetID?: UUID;
LastSwiftMigration?: number;
ProvisioningStyle?: string;
} & Record<string, undefined | number | string>
>;
};
buildConfigurationList: UUID;
buildConfigurationList_comment: string;
compatibilityVersion: string;
developmentRegion: string;
hasScannedForEncodings: number;
knownRegions: string[];
mainGroup: UUID;
productRefGroup: UUID;
productRefGroup_comment: string;
projectDirPath: string;
projectRoot: string;
targets: Array<{
value: UUID;
comment: string;
}>;
}
interface PBXNativeTarget {
isa: 'PBXNativeTarget';
buildConfigurationList: UUID;
buildConfigurationList_comment: string;
buildPhases: Array<{
value: UUID;
comment: string;
}>;
buildRules: [];
dependencies: [];
name: string;
productName: string;
productReference: UUID;
productReference_comment: string;
productType: string;
}
interface PBXBuildFile {
isa: 'PBXBuildFile';
fileRef: UUID;
// "AppDelegate.m"
fileRef_comment: string;
}
interface XCConfigurationList {
isa: 'XCConfigurationList';
buildConfigurations: Array<{
value: UUID;
comment: string | 'Release' | 'Debug';
}>;
defaultConfigurationIsVisible: number;
defaultConfigurationName: string;
}
interface XCBuildConfiguration {
isa: 'XCBuildConfiguration';
baseConfigurationReference: UUID;
baseConfigurationReference_comment: string;
buildSettings: Record<string, string | undefined | number | Array<unknown>> & {
// '"$(TARGET_NAME)"',
PRODUCT_NAME?: string;
// '"io.expo.demo.$(PRODUCT_NAME:rfc1034identifier)"',
PRODUCT_BUNDLE_IDENTIFIER?: string;
PROVISIONING_PROFILE_SPECIFIER?: string;
// '"$(BUILT_PRODUCTS_DIR)/rni.app/rni"'
TEST_HOST?: any;
DEVELOPMENT_TEAM?: string;
CODE_SIGN_IDENTITY?: string;
CODE_SIGN_STYLE?: string;
// '"$(TEST_HOST)"'
BUNDLE_LOADER?: string;
GCC_PREPROCESSOR_DEFINITIONS?: Array<unknown>;
INFOPLIST_FILE?: string;
IPHONEOS_DEPLOYMENT_TARGET?: string;
LD_RUNPATH_SEARCH_PATHS?: string;
OTHER_LDFLAGS?: Array<unknown>;
ASSETCATALOG_COMPILER_APPICON_NAME?: string;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME?: string;
CLANG_ANALYZER_NONNULL?: string;
CLANG_WARN_DOCUMENTATION_COMMENTS?: string;
CLANG_WARN_INFINITE_RECURSION?: string;
CLANG_WARN_SUSPICIOUS_MOVE?: string;
DEBUG_INFORMATION_FORMAT?: string;
ENABLE_TESTABILITY?: string;
GCC_NO_COMMON_BLOCKS?: string;
// 'appletvos'
SDKROOT?: string;
TARGETED_DEVICE_FAMILY?: number | string;
// '10.0'
TVOS_DEPLOYMENT_TARGET?: string;
};
name: string;
}
type ProductType =
| 'com.apple.product-type.application'
| 'com.apple.product-type.app-extension'
| 'com.apple.product-type.bundle'
| 'com.apple.product-type.tool'
| 'com.apple.product-type.library.dynamic'
| 'com.apple.product-type.framework'
| 'com.apple.product-type.library.static'
| 'com.apple.product-type.bundle.unit-test'
| 'com.apple.product-type.application.watchapp'
| 'com.apple.product-type.application.watchapp2'
| 'com.apple.product-type.watchkit-extension'
| 'com.apple.product-type.watchkit2-extension';
interface PBXGroup {
isa: 'PBXGroup';
children: Array<{
value: UUID;
comment?: string;
}>;
name: string;
path?: string;
sourceTree: '"<group>"' | unknown;
}
export class XcodeProject {
/**
* `.pbxproj` file path.
*/
public filepath: string;
// Ex: '$(TARGET_NAME)'
public productName: string;
public hash: {
headComment: string;
project: {
archiveVersion: number;
objectVersion: number;
objects: {
[T in XCObjectType]: Record<
string,
{
isa: T;
name: string;
[key: string]: any;
}
>;
};
rootObject: string;
rootObject_comment: string;
};
};
constructor(pbxprojPath: string);
// ------------------------------------------------------------------------
//
// `.pbxproj` related operation - starting & ending point.
//
// ------------------------------------------------------------------------
/**
* First step to be executed while working with `.pbxproj` file.
*/
public parse(callback?: (err: Error | null, results?: string) => void): this;
public parseSync(): void;
/**
* @returns Content of .pbxproj file.
*/
public writeSync(options?: { omitEmptyValues?: boolean }): string;
public allUuids(): UUID[];
public generateUuid(): UUID;
public addPluginFile(path: unknown, opt: unknown): unknown;
public removePluginFile(path: unknown, opt: unknown): unknown;
public addProductFile(targetPath: unknown, opt: unknown): unknown;
public removeProductFile(path: unknown, opt: unknown): unknown;
public addSourceFile(path: string, opt: unknown, group: string): unknown;
public removeSourceFile(path: string, opt: unknown, group: string): unknown;
public addHeaderFile(path: string, opt: unknown, group: string): unknown;
public removeHeaderFile(path: string, opt: unknown, group: string): unknown;
public addResourceFile(path: string, opt: unknown, group: string): unknown;
public removeResourceFile(path: string, opt: unknown, group: string): unknown;
public addFramework(fpath: unknown, opt: unknown): unknown;
public removeFramework(fpath: unknown, opt: unknown): unknown;
public addCopyfile(fpath: unknown, opt: unknown): unknown;
public pbxCopyfilesBuildPhaseObj(target: unknown): unknown;
public addToPbxCopyfilesBuildPhase(file: unknown): void;
public removeCopyfile(fpath: unknown, opt: unknown): unknown;
public removeFromPbxCopyfilesBuildPhase(file: unknown): void;
public addStaticLibrary(path: unknown, opt: unknown): unknown;
/**
* Adds to `PBXBuildFile` section
*/
public addToPbxBuildFileSection(file: PBXFile): void;
public removeFromPbxBuildFileSection(file: unknown): void;
public addPbxGroup(
filePathsArray: string[],
name: string,
path: string,
sourceTree?: string,
): { uuid: UUID; pbxGroup: PBXGroup };
public removePbxGroup(groupName: unknown): void;
public addToPbxProjectSection(target: unknown): void;
public addToPbxNativeTargetSection(target: unknown): void;
public addToPbxFileReferenceSection(file: any): void;
public removeFromPbxFileReferenceSection(file: unknown): unknown;
public addToXcVersionGroupSection(file: unknown): void;
public addToPluginsPbxGroup(file: unknown): void;
public removeFromPluginsPbxGroup(file: unknown): unknown;
public addToResourcesPbxGroup(file: unknown): void;
public removeFromResourcesPbxGroup(file: unknown): unknown;
public addToFrameworksPbxGroup(file: unknown): void;
public removeFromFrameworksPbxGroup(file: unknown): unknown;
public addToPbxEmbedFrameworksBuildPhase(file: unknown): void;
public removeFromPbxEmbedFrameworksBuildPhase(file: unknown): void;
public addToProductsPbxGroup(file: unknown): void;
public removeFromProductsPbxGroup(file: unknown): unknown;
public addToPbxSourcesBuildPhase(file: unknown): void;
public removeFromPbxSourcesBuildPhase(file: unknown): void;
/**
* Adds to PBXResourcesBuildPhase` section
* @param resourcesBuildPhaseSectionKey Because there's might more than one `Resources` build phase we need to ensure file is placed under correct one.
*/
public addToPbxResourcesBuildPhase(file: PBXFile): void;
public removeFromPbxResourcesBuildPhase(file: unknown): void;
public addToPbxFrameworksBuildPhase(file: unknown): void;
public removeFromPbxFrameworksBuildPhase(file: unknown): void;
public addXCConfigurationList(
configurationObjectsArray: unknown,
defaultConfigurationName: unknown,
comment: unknown,
): {
uuid: unknown;
xcConfigurationList: {
isa: string;
buildConfigurations: Array<unknown>;
defaultConfigurationIsVisible: number;
defaultConfigurationName: unknown;
};
};
public addTargetDependency(
target: unknown,
dependencyTargets: unknown,
): {
uuid: unknown;
target: unknown;
};
public addBuildPhase(
filePathsArray: unknown,
buildPhaseType: unknown,
comment: unknown,
target: unknown,
optionsOrFolderType: unknown,
subfolderPath: unknown,
): {
uuid: unknown;
buildPhase: {
isa: unknown;
buildActionMask: number;
files: Array<unknown>;
runOnlyForDeploymentPostprocessing: number;
};
};
/**
* Retrieves main part describing PBXProjects that are available in `.pbxproj` file.
*/
public pbxProjectSection(): Record<UUID, PBXProject> & Record<UUIDComment, string>;
public pbxBuildFileSection(): Record<UUID, PBXBuildFile> & Record<UUIDComment, string>;
public pbxXCBuildConfigurationSection(): Record<UUID, XCBuildConfiguration> &
Record<UUIDComment, string>;
public pbxFileReferenceSection(): Record<UUID, PBXFile> & Record<UUIDComment, string>;
public pbxNativeTargetSection(): Record<UUID, PBXNativeTarget> & Record<UUIDComment, string>;
public xcVersionGroupSection(): unknown;
public pbxXCConfigurationList(): Record<UUID, XCConfigurationList> & Record<UUIDComment, string>;
public pbxGroupByName(name: string): PBXGroup | undefined;
/**
* @param targetName in most cases it's the name of the application
*/
public pbxTargetByName(targetName: string): PBXNativeTarget | undefined;
public findTargetKey(name: string): string;
public pbxItemByComment(name: string, pbxSectionName: unknown): unknown;
public pbxSourcesBuildPhaseObj(target: unknown): unknown;
public pbxResourcesBuildPhaseObj(target: unknown): unknown;
public pbxFrameworksBuildPhaseObj(target: unknown): unknown;
public pbxEmbedFrameworksBuildPhaseObj(target: unknown): unknown;
public buildPhase(group: unknown, target: unknown): string;
public buildPhaseObject(name: string, group: unknown, target: unknown): unknown;
public addBuildProperty(prop: unknown, value: unknown, build_name: unknown): void;
public removeBuildProperty(prop: unknown, build_name: unknown): void;
public updateBuildProperty(prop: string, value: unknown, build: string): void;
public updateProductName(name: string): void;
public removeFromFrameworkSearchPaths(file: unknown): void;
public addToFrameworkSearchPaths(file: unknown): void;
public removeFromLibrarySearchPaths(file: unknown): void;
public addToLibrarySearchPaths(file: unknown): void;
public removeFromHeaderSearchPaths(file: unknown): void;
public addToHeaderSearchPaths(file: unknown): void;
public addToOtherLinkerFlags(flag: unknown): void;
public removeFromOtherLinkerFlags(flag: unknown): void;
public addToBuildSettings(buildSetting: unknown, value: unknown): void;
public removeFromBuildSettings(buildSetting: unknown): void;
/**
* Checks whether there is a file with given `filePath` in the project.
*/
public hasFile(filePath: string): PBXFile | false;
public addTarget(
name: unknown,
type: unknown,
subfolder: unknown,
): {
uuid: unknown;
pbxNativeTarget: {
isa: string;
name: string;
productName: string;
productReference: unknown;
productType: string;
buildConfigurationList: unknown;
buildPhases: Array<unknown>;
buildRules: Array<unknown>;
dependencies: Array<unknown>;
};
};
/**
* Get First PBXProject that can be found in `.pbxproj` file.
*/
public getFirstProject(): { uuid: UUID; firstProject: PBXProject };
public getFirstTarget(): {
uuid: UUID;
firstTarget: unknown;
};
/**
* Retrieves PBXNativeTarget by the type
*/
public getTarget(productType: ProductType): { uuid: UUID; target: PBXNativeTarget } | null;
public addToPbxGroupType(file: unknown, groupKey: unknown, groupType: unknown): void;
public addToPbxVariantGroup(file: unknown, groupKey: unknown): void;
public addToPbxGroup(file: PBXFile, groupKey: UUID): void;
public pbxCreateGroupWithType(name: unknown, pathName: unknown, groupType: unknown): unknown;
public pbxCreateVariantGroup(name: unknown): unknown;
public pbxCreateGroup(name: string, pathName: string): UUID;
public removeFromPbxGroupAndType(file: unknown, groupKey: unknown, groupType: unknown): void;
public removeFromPbxGroup(file: unknown, groupKey: unknown): void;
public removeFromPbxVariantGroup(file: unknown, groupKey: unknown): void;
public getPBXGroupByKeyAndType(key: unknown, groupType: unknown): unknown;
/**
* @param groupKey UUID.
*/
public getPBXGroupByKey(groupKey: string): PBXGroup | undefined;
public getPBXVariantGroupByKey(key: unknown): unknown;
public findPBXGroupKeyAndType(criteria: unknown, groupType: unknown): string;
/**
* @param criteria Params that should be used to locate desired PBXGroup.
*/
public findPBXGroupKey(criteria: { name?: string; path?: string }): UUID | undefined;
public findPBXVariantGroupKey(criteria: unknown): string;
public addLocalizationVariantGroup(
name: unknown,
): {
uuid: unknown;
fileRef: unknown;
basename: unknown;
};
public addKnownRegion(name: string): void;
public removeKnownRegion(name: string): void;
public hasKnownRegion(name: string): boolean;
public getPBXObject(name: string): unknown;
/**
* - creates `PBXFile`
* - adds to `PBXFileReference` section
* - adds to `PBXGroup` or `PBXVariantGroup` if applicable
* @returns `null` if file is already in `pbxproj`.
*/
public addFile(
path: string,
group?: string,
opt?: {
plugin?: string;
target?: string;
variantGroup?: string;
lastKnownFileType?: string;
defaultEncoding?: 4;
customFramework?: true;
explicitFileType?: number;
weak?: true;
compilerFLags?: string;
embed?: boolean;
sign?: boolean;
},
): PBXFile | null;
public removeFile(path: unknown, group: unknown, opt: unknown): unknown;
public getBuildProperty(prop: unknown, build: unknown): unknown;
public getBuildConfigByName(name: unknown): object;
public addDataModelDocument(filePath: unknown, group: unknown, opt: unknown): unknown;
public addTargetAttribute(prop: unknown, value: unknown, target: unknown): void;
public removeTargetAttribute(prop: unknown, target: unknown): void;
}
export function project(projectPath: string): XcodeProject;
}
declare module 'xcode/lib/pbxFile' {
export default class PBXFile implements pbxFile {
public basename: string;
public lastKnownFileType?: string;
public group?: string;
public path?: string;
public fileEncoding?: number;
public defaultEncoding?: number;
public sourceTree: string;
public includeInIndex?: number;
public explicitFileType?: unknown;
public settings?: object;
public uuid?: string;
public fileRef: string;
public target?: string;
constructor(file: string);
}
}
+83
View File
@@ -0,0 +1,83 @@
import Redis from 'ioredis';
import chunk from 'lodash/chunk';
import config from 'turtle/config';
import { getRedisClient, RedisClient } from 'turtle/utils/redis';
import { sendBuildStatusUpdate, sendCredentialsUpdate } from 'turtle/utils/www';
const RETRY_COUNT = 5;
type UpdateType = 'build' | 'credentials';
interface IUpdate {
type: UpdateType;
buildId: string;
updateBody: any;
retried: number;
}
export async function saveUpdateFailure(buildId: string, type: UpdateType, updateBody: object): Promise<void> {
if (config.env === 'test') {
return;
}
const redis = await getRedisClient(RedisClient.Configuration) as Redis.Redis;
const update: IUpdate = {
type,
buildId,
updateBody,
retried: 0,
};
await redis.set(getFailedUpdateKey(buildId), JSON.stringify(update));
}
export async function synchronizeFailedUpdates(intervalMs = 3 * 60 * 1000): Promise<NodeJS.Timeout> {
try {
await _synchronizeFailedUpdates();
} catch (err) {
// don't do anything
}
return setInterval(() => _synchronizeFailedUpdates(), intervalMs);
}
async function _synchronizeFailedUpdates(): Promise<void> {
const redis = await getRedisClient(RedisClient.Configuration) as Redis.Redis;
const keys = await redis.keys(getFailedUpdateKey('*'));
const keyChunks = chunk(keys, 20);
for (const keyChunk of keyChunks) {
await Promise.all(keyChunk.map((key: string) => resendUpdateForKey(key)));
}
}
async function resendUpdateForKey(key: string): Promise<void> {
try {
const redis = await getRedisClient(RedisClient.Configuration) as Redis.Redis;
const updateRaw = await redis.get(key);
if (updateRaw) {
const update = JSON.parse(updateRaw) as IUpdate;
try {
await resendUpdateToWWW(update);
await redis.del(key);
} catch (err) {
update.retried += 1;
if (update.retried >= RETRY_COUNT) {
await redis.del(key);
} else {
await redis.set(key, JSON.stringify(update));
}
}
}
} catch (err) {
// don't do anything
}
}
async function resendUpdateToWWW(update: IUpdate): Promise<void> {
const { type, buildId, updateBody } = update;
if (type === 'build') {
await sendBuildStatusUpdate(buildId, updateBody);
} else if (type === 'credentials') {
const { platform, ...rest } = updateBody;
await sendCredentialsUpdate(buildId, platform, rest);
}
}
const getFailedUpdateKey = (buildId: string) => `${config.deploymentEnv}:failed-update:${buildId}`;
+164
View File
@@ -0,0 +1,164 @@
import { EventEmitter } from 'events';
import Redis from 'ioredis';
import { v4 as uuid } from 'uuid';
import { getRedisClient, RedisClient } from 'turtle/utils/redis';
interface ILeaderParams {
key: string;
id?: string;
ttl?: number;
wait?: number;
}
const RENEW_LEADER_SCRIPT = `
local leader_key = KEYS[1]
local leader_id = KEYS[2]
local leader_ttl = KEYS[3]
local current_leader
current_leader = redis.call("get", leader_key)
if (current_leader == leader_id) then
redis.call("pexpire", leader_key, leader_ttl)
return "ok"
else
return "you_are_not_the_leader"
end
`;
const STOP_BEING_LEADER_SCRIPT = `
local leader_key = KEYS[1]
local leader_id = KEYS[2]
local current_leader
current_leader = redis.call("get", leader_key)
if (current_leader == leader_id) then
redis.call("del", leader_key)
return "ok"
else
return "you_are_not_the_leader"
end
`;
interface IRedisCustom extends Redis.Redis {
renewLeader(key: string, id: string, ttl: number): Promise<string>;
stopBeingLeader(key: string, id: string): Promise<string>;
}
enum LeaderEvent {
elected = 'elected',
revoked = 'revoked',
error = 'error',
}
class Leader extends EventEmitter {
private key: string;
private id: string;
private ttl: number;
private wait: number;
private waitId?: NodeJS.Timeout;
private redisClientValue?: IRedisCustom;
private renewId?: NodeJS.Timeout;
private started = false;
constructor({ key, id, ttl = 30, wait = 1000 }: ILeaderParams) {
super();
this.key = key;
this.id = id || uuid();
this.ttl = ttl * 1000;
this.wait = wait;
}
public async elect(): Promise<void> {
if (!this.redisClientValue) {
await this.init();
}
if (!this.started) {
this.started = true;
}
try {
const res = await this.redisClient.set(this.key, this.id, 'PX', this.ttl, 'NX');
if (res === null) {
this.waitId = setTimeout(() => {
this.elect();
}, this.wait);
} else {
this.emit(LeaderEvent.elected);
this.renewId = setInterval(() => {
this.renew();
}, this.ttl / 2);
}
} catch (err) {
this.emit(LeaderEvent.error, err);
}
}
public async stop(): Promise<void> {
if (!this.started) {
throw new Error('You should start the election first!');
}
try {
const res = await this.redisClient.stopBeingLeader(this.key, this.id);
if (res === 'ok') {
this.emit(LeaderEvent.revoked);
}
if (this.renewId) {
clearInterval(this.renewId);
}
if (this.waitId) {
clearTimeout(this.waitId);
}
this.redisClientValue?.disconnect();
this.redisClientValue = undefined;
} catch (err) {
this.emit(LeaderEvent.error, err);
}
}
private get redisClient(): IRedisCustom {
if (!this.redisClientValue) {
throw new Error('Please run the init method first!');
}
return this.redisClientValue as IRedisCustom;
}
private async init(): Promise<void> {
if (this.redisClientValue) {
return;
}
this.redisClientValue = await getRedisClient(RedisClient.Configuration);
const redisClient = this.redisClient as IRedisCustom;
redisClient.defineCommand('renewLeader', {
numberOfKeys: 3,
lua: RENEW_LEADER_SCRIPT,
});
redisClient.defineCommand('stopBeingLeader', {
numberOfKeys: 2,
lua: STOP_BEING_LEADER_SCRIPT,
});
}
private async renew(): Promise<void> {
try {
const result = await this.redisClient.renewLeader(this.key, this.id, this.ttl);
if (result === 'you_are_not_the_leader') {
if (this.renewId) {
clearInterval(this.renewId);
}
this.waitId = setTimeout(() => {
this.elect();
}, this.wait);
this.emit(LeaderEvent.revoked);
}
} catch (err) {
this.emit(LeaderEvent.error, err);
}
}
}
export default Leader;
export { LeaderEvent };
+15 -6
View File
@@ -12,18 +12,27 @@ export enum RedisClient {
Configuration = 'REDIS_CLIENT_CONFIGURATION',
}
interface IClientConfig { [key: string]: string; }
interface IClientConfig {
[key: string]: {
url: string;
caCertificate?: string;
};
}
const clientToUrl: IClientConfig = {
[RedisClient.Subscriber]: config.redis.url,
[RedisClient.Default]: config.redis.url,
[RedisClient.Configuration]: config.redis.configUrl,
const clientConfigs: IClientConfig = {
[RedisClient.Subscriber]: config.redis.main,
[RedisClient.Default]: config.redis.main,
[RedisClient.Configuration]: config.redis.turtle,
};
export function connect(timeoutMs: number, type: string): Promise<any> {
return new Promise((resolve, reject) => {
const redisClient = new Redis(clientToUrl[type], {
const { url, caCertificate } = clientConfigs[type];
const redisClient = new Redis(url, {
maxRetriesPerRequest: 2,
...caCertificate && {
tls: { ca: caCertificate },
},
});
const timer = setTimeout(() => reject(new Error('Timeout at connecting to Redis')), timeoutMs);
redisClient.on('ready', () => {
+4 -4
View File
@@ -10,7 +10,7 @@ async function setSupportedSdkVersions(platform: string, sdkVersions: string[])
method: 'POST',
uri: href,
headers: {
'secret-token': config.www.sdkVersionsSecretToken,
'secret-token': config.www.secretToken,
},
body: {
platform,
@@ -26,7 +26,7 @@ async function setTurtleVersion(version: string) {
method: 'POST',
uri: href,
headers: {
'secret-token': config.www.sdkVersionsSecretToken,
'secret-token': config.www.secretToken,
},
body: {
version,
@@ -38,9 +38,9 @@ async function setTurtleVersion(version: string) {
function resolveWWWEndpoint() {
const currentEnv = config.deploymentEnv;
if (currentEnv === 'production') {
return 'https://expo.io';
return 'https://exp.host';
} else if (currentEnv === 'staging') {
return 'https://staging.expo.io';
return 'https://staging.exp.host';
} else {
return 'http://127.0.0.1:3000';
}
+56
View File
@@ -0,0 +1,56 @@
import { URL } from 'url';
import request from 'request-promise';
import config from 'turtle/config';
import { saveUpdateFailure } from 'turtle/updatesManager';
async function sendBuildStatusUpdate(buildId: string, updateParams: object) {
const { href } = new URL(`/--/api/v2/turtle-legacy-builds/${buildId}`, resolveWWWEndpoint());
try {
await request({
method: 'PUT',
uri: href,
headers: {
'secret-token': config.www.secretToken,
},
body: updateParams,
json: true,
});
} catch (err) {
await saveUpdateFailure(buildId, 'build', updateParams);
}
}
async function sendCredentialsUpdate(buildId: string, platform: 'android' | 'ios', updateParams: object) {
const { href } = new URL(`/--/api/v2/turtle-legacy-builds/${buildId}/credentials`, resolveWWWEndpoint());
try {
await request({
method: 'PUT',
uri: href,
headers: {
'secret-token': config.www.secretToken,
},
body: {
platform,
...updateParams,
},
json: true,
});
} catch (err) {
await saveUpdateFailure(buildId, 'credentials', updateParams);
}
}
function resolveWWWEndpoint() {
const currentEnv = config.deploymentEnv;
if (currentEnv === 'production') {
return 'https://exp.host';
} else if (currentEnv === 'staging') {
return 'https://staging.exp.host';
} else {
return 'http://127.0.0.1:3000';
}
}
export { sendBuildStatusUpdate, sendCredentialsUpdate };
+6 -1
View File
@@ -10,5 +10,10 @@
},
"rulesDirectory": [
"node_modules/tslint-eslint-rules/dist/rules"
]
],
"linterOptions": {
"exclude": [
"src/types/xcode.d.ts"
]
}
}
+5323 -2953
View File
File diff suppressed because it is too large. Load diff