Slide 1

Slide 1 text

Cross-Platform MAD Release Engineering The secret sauce from the outsource industry

Slide 2

Slide 2 text

99X Technology Sri Lanka Product Engineering company 150+ engineers 20+ ISV and enterprise partners Mostly in Scandinavia 3.5h - 4.5h ahead Compello Group is the 3rd biggest partner

Slide 3

Slide 3 text

99X Technology Sri Lanka Compello Germany Compello Sweden Compello Norway Compello Hungary 3 distinct product suites 90+ employees 7000+ customers 20+ countries 100K users everyday Microsoft savvy

Slide 4

Slide 4 text

Mobile Enablement initiative made everything we have been doing irrelevant!

Slide 5

Slide 5 text

Desktop Browser Platform Backend Web / Frontend Administration Rules engine Invoice approval Metadata … Mobile Platform Cross-platform / Heavy JS Feature vs. Platform Ends up naturally as platform teams!

Slide 6

Slide 6 text

Product Specialists Backend Web / Frontend Cross-platform / Heavy JS Administration Rules engine Invoice approval Metadata Product Specialists Cross-platform / Heavy JS Backend Web / Frontend Feature Teams Transformation is costly but worth it. Still work in progress!

Slide 7

Slide 7 text

master branch represents the current version | unstable but good for internal use bug bug feature feature feature bug release branch release branch stabilise and promote | rename/tag once shipped Git Simple flow. Uses visualstudio.com.

Slide 8

Slide 8 text

master branch represents the current version | unstable but good for internal use monthly milestone release branch stabilise and promote | rename/tag once shipped critical issues Monthly Builds Monthly or at the end of each milestone. Uses visualstudio.com to automate. build: code-push web components binary build: only and only if required build: code-push promote

Slide 9

Slide 9 text

Binary releases Manually uploaded Backend API release Manually triggered Beta Testflight Google Play Beta Shipping Apps Rollout cross-platform apps; both binaries and web components. Still not fully-automated. Appstore Review 2 Stable 4 Code-push releases Manually triggered Beta 1 1 1 Latest Appstore Google Play 3 3 Latest 3

Slide 10

Slide 10 text

So, what else goes with these techniques? ?

Slide 11

Slide 11 text

Shake-To-Report Easy way to capture screenshots and report any issues. • Testers can shake the phone to report any bugs found during smoke testing • Capture screenshot and bundles the device details, app state and few more details for further investigation • Available for all users to provide feedback and we can turn it off any time we wish

Slide 12

Slide 12 text

Eureka Service Server-side Discovery to figure out which environment / backend services to connect. Still a work-in-progress! debug-mode 2 Beta Latest Stable Internal Eureka Service 1 release-mode user | version | device | platform | ... Stable Latest Beta Eureka Service 1 Backend 2

Slide 13

Slide 13 text

/// Eureka API: Search for features (C#). /// Payload: { debug, version, device, platform, user, ... } /// Returns: JSON /// Altered for bravery :-) JObject defaults; JObject slots; JObject manifest = new JObject(); slots = GetSlotOrDefault(version: ver, debug: debug, json: slots); manifest.Merge(slots, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }); var res = req.CreateResponse(HttpStatusCode.OK); res.Content = new StringContent (manifest.ToString(), System.Text.Encoding.UTF8, "application/json"); return res; Dark Launching Look for related API and Configuration. Eureka Service is an Azure Function.

Slide 14

Slide 14 text

/// Return-Type: JSON /// Altered for bravery :-) "apiendpoint": "http://192.186.22.65/ rest.lucid.no", "telemetry": { "enabled": false, "tracker": “XX-XXXXXXXX-X", "level": "all" }, "notifications": { "enabled": true, "level": "push", "push": { "apiendpoint": "https://XXX.azure- mobile.net", "key": "XXXXXXXXX" } }, "feedback": { "shaketoreport": true, "template": "summary" }, "disposeifempty": true, "canselfdestruct": true, "canleave": true, "candelegaterights": true, "confirmapproval": false, "canreapprove": false, Sample Manifest JSON JSON configuration returned by the Eureka Service which is required for the app to boot. Eureka Service is an Azure Function.

Slide 15

Slide 15 text

Feature Toggling Toggling features till it’s safe to use on both apps and backend APIs. /// App: Delete account (C#). /// Altered for bravery :-)
ACCOUNT SETTINGS
ds.DeactivateUser(context, id); bool delegateRights = (bool)data.candelegaterights.Value; if (delegateRights) { ds.MarkAdministratorIfNotFound(context, context.ClientId); } bool deleteIfEmpty = (bool)data.disposeifempty.Value; if (deleteIfEmpty) { ds.DeactivateClientIfEmpty(context, context.ClientId); } return Ok();

Slide 16

Slide 16 text

Ship Write code Build Test Contact Kosala Nuwan Perera Technical Coach / Architect e: [email protected] tw: @kosalanuwan gh: github.com/kosalanuwan