Cordova and UWP

Cordova is a framework for mobile application development. It is a cross platform tool, you can create packages for various platforms ( Windows/Android/Apple ). Let's create UWP package for cordova application, it is really easy.

VSTS and Sparrowdo

We are going to use VSTS as a CICD framework and Sparrowdo as a code generator for our builds.

We are going to use so called YAML build definitions to create build scenario. This approach allows us to keep build logic in source code and treat build as a code.

We use Sparrowdo as high level Perl6 API to generate YAML build definition, instead of create those ones manually.

Generate build defintition

First of all let's install Sparrowdo and related Sparrowdo::VSTS::YAML::* dependencies, these are Perl6 modules:



$ zef install Sparrowdo Sparrowdo::VSTS::YAML::Build Sparrowdo::VSTS::YAML::Cordova VSTS::YAML::Artifact

Then let create Sparrowdo scenario to build build definition:



$ nano cicd/Builds/uwp/sparrowfile

#!perl6 module_run "VSTS::YAML::Build", %( build-dir => "cicd/Builds/uwp", queue => "Q-one", timeout => 20, ); module_run "VSTS::YAML::Cordova", %( build-dir => "cicd/Builds/uwp", build-configuration => "debug", ); module_run "VSTS::YAML::Artifact", %( build-dir => "cicd/Builds/uwp", artifact-name => "drop", path => "platforms/windows/AppPackages", publish-location => "Container" );

This high level code generates all necessary build infrastructure, we are all set up:



$ sparrowdo --localhost --no_sudo --sparrowfile=builds/uwp/sparrowfile

running sparrow tasks on 127.0.0.1 ... target OS is - centos7 enter module <VSTS::YAML::Build> ... push [task] delete directory cicd/Builds/uwp/files OK push [task] delete directory cicd/Builds/uwp/.cache OK push [task] create directory cicd/Builds/uwp/.cache OK push [task] create directory cicd/Builds/uwp/files OK push [task] create template cicd/Builds/uwp/build.yaml OK enter module <VSTS::YAML::Cordova> ... push [task] create directory cicd/Builds/uwp/.cache OK push [task] create directory cicd/Builds/uwp/files OK push [task] create file cicd/Builds/uwp/files/npm-install.cmd OK push [task] create file cicd/Builds/uwp/files/npm-install-cordova.cmd OK push [task] create file cicd/Builds/uwp/files/platform-add.cmd OK push [task] create file cicd/Builds/uwp/files/set-version.pl OK push [task] create file cicd/Builds/uwp/files/prepare.cmd OK push [task] create file cicd/Builds/uwp/files/clean-build-dir.cmd OK push [task] create template cicd/Builds/uwp/files/build.cmd OK push [task] create template cicd/Builds/uwp/.cache/build.yaml.sample OK push [task] run bash: cat cicd/Builds/uwp/.cache/build.yaml.sample >> ci ... OK enter module <VSTS::YAML::Artifact> ... push [task] create directory cicd/Builds/uwp/.cache OK push [task] create directory cicd/Builds/uwp/files OK push [task] create template cicd/Builds/uwp/.cache/build.yaml.sample OK push [task] run bash: cat cicd/Builds/uwp/.cache/build.yaml.sample >> ci ... OK SPL file /opt/sparrow/sparrow.list is empty get index updates from SparrowHub ... OK set up task box file - /home/gimy/.sparrowdo//opt/sparrow/task-box.json - OK public@directory is uptodate (0.1.6) public@templater is uptodate (0.0.13) Installing modules using /opt/sparrow/plugins/public/templater/cpanfile Complete! Modules were installed into /opt/sparrow/plugins/public/templater/local public@file is uptodate (0.0.6) public@bash is uptodate (0.1.8) running task box from /opt/sparrow/sparrow-cache/task-box.json ... 2018-08-13 20:48:23 : [task] delete directory cicd/Builds/uwp/files [path] modules/delete/ 2018-08-13 20:48:23 : [task] delete directory cicd/Builds/uwp/.cache [path] modules/delete/ 2018-08-13 20:48:24 : [task] create directory cicd/Builds/uwp/.cache [path] modules/create/ 2018-08-13 20:48:24 : [task] create directory cicd/Builds/uwp/files [path] modules/create/ 2018-08-13 20:48:24 : [task] create template cicd/Builds/uwp/build.yaml [path] modules/generate-content/ 2018-08-13 20:48:24 : [task] create template cicd/Builds/uwp/build.yaml [path] / [msg] updated ok 2018-08-13 20:48:25 : [task] create directory cicd/Builds/uwp/.cache [path] modules/create/ 2018-08-13 20:48:25 : [task] create directory cicd/Builds/uwp/files [path] modules/create/ 2018-08-13 20:48:25 : [task] create file cicd/Builds/uwp/files/npm-install.cmd [path] / 2018-08-13 20:48:25 : [task] create file cicd/Builds/uwp/files/npm-install-cordova.cmd [path] / 2018-08-13 20:48:26 : [task] create file cicd/Builds/uwp/files/platform-add.cmd [path] / 2018-08-13 20:48:26 : [task] create file cicd/Builds/uwp/files/set-version.pl [path] / 2018-08-13 20:48:27 : [task] create file cicd/Builds/uwp/files/prepare.cmd [path] / 2018-08-13 20:48:27 : [task] create file cicd/Builds/uwp/files/clean-build-dir.cmd [path] / 2018-08-13 20:48:27 : [task] create template cicd/Builds/uwp/files/build.cmd [path] modules/generate-content/ 2018-08-13 20:48:28 : [task] create template cicd/Builds/uwp/files/build.cmd [path] / [msg] updated ok 2018-08-13 20:48:28 : [task] create template cicd/Builds/uwp/.cache/build.yaml.sample [path] modules/generate-content/ 2018-08-13 20:48:28 : [task] create template cicd/Builds/uwp/.cache/build.yaml.sample [path] / [msg] updated ok 2018-08-13 20:48:28 : [task] run bash: cat cicd/Builds/uwp/.cache/build.yaml.sample >> ci ... [path] modules/bash-command/ [params] envvars: 2018-08-13 20:48:29 : [task] create directory cicd/Builds/uwp/.cache [path] modules/create/ 2018-08-13 20:48:29 : [task] create directory cicd/Builds/uwp/files [path] modules/create/ 2018-08-13 20:48:30 : [task] create template cicd/Builds/uwp/.cache/build.yaml.sample [path] modules/generate-content/ 2018-08-13 20:48:30 : [task] create template cicd/Builds/uwp/.cache/build.yaml.sample [path] / [msg] updated ok 2018-08-13 20:48:30 : [task] run bash: cat cicd/Builds/uwp/.cache/build.yaml.sample >> ci ... [path] modules/bash-command/ [params] envvars:

Now we just commit changes and run VSTS build:



$ echo .cache >> .gitignore $ git add cicd $ git commit -a -m "my UWP build" $ git push

Conclusion

VSTS provides programmatic approach called YAML build scenarios to codify build logic. But developing in YAML is tedious. Instead of creating YAML build definitions manually we use Sparrowdo task runner to express build logic in high level and more flexible way using powerful Perl6 language.

For more details in the topic read Sparrowdo::VSTS::YAML::Cordova documentation.

Thanks

Alexey