UNPKG

@willowtreeapps/ukor

Version:

Roku build tool with flavors and deployment

225 lines (170 loc) 6.42 kB
<br> <p align="center"> <img width="200px" height="200px" src="artwork/ukor-logo.svg"/> </p> <br> # Ukor A build tool for Roku projects Features: - Multiple flavors - Install to device - Project and local configuration properties - Save installation targets and authentication details - Set default install targets - Search for Rokus on your local network ## Questions? Join us in the #tooling channel on the [Roku Developers Slack](https://join.slack.com/t/rokudevelopers/shared_invite/enQtMzU5Njc5ODM5MzAyLWE2MTIxMWQ5Nzg0Y2E3ODgzYTk4NmQxMDg2YjRjYjdiMzM5ZDU4ZTc0YmM1ZmU0Mzc5MzI3ODU3MmUxOTdlNTE). ## Requirements * Node **v7.6** or higher. ## Project setup You can install Ukor via NPM. ```sh npm install -g @willowtreeapps/ukor ``` A Ukor project is organized in a single `src` folder with properties files in order to configure Ukor. The `src` folder contains a single `main` folder which contain the default built sources, optional customized flavor sources as well as test sources. ``` /Project - src/ - main/ - components/ - source/ - anyThingYouWant/ - constants.yaml - flavor1/ - flavor2/ - test/ - testflavor1/ - ukor.properties - ukor.local ``` The `ukor.properties` file is the main ukor configuration file for the project and should be version controlled. The `ukor.local` file is a local properties file that contains local customizations for ukor overriding the `ukor.properties` file. This file is not expected to be version controlled. The `constants.yaml` file is *per-flavor*. In the file, you can define strings (or even any text to insert into a file), and can be identified with `@{some.category.id}` in brightscript OR xml source files. ### Example properties (yaml) ```yaml buildDir: 'build' sourceDir: 'src' preBuild: 'scripts/main.js' mainFlavor: 'flavorName' flavors: { flavorName: { src: ['flavor', 'main'] }, flavorNameRelease: { base: 'flavorName', src: ['release'] } } rokus: { roku2: { serial: '123123123', auth: { user: 'rokudev', pass: 'YourPassword' } } } ``` ## Constants Each flavor can contain string resources specified in the `YAML` format by providing `constants.yaml` file. Strings can be referenced by their path specified in any `.xml` or `.brs` source files. For example, Given a `constants.yaml` file: ```yml strings: contactSupport: 'contact support at 555-555-5555' login: signIn: 'Sign in now!' ``` Strings can be references in a `*.brs` file using the following interpolation syntax `@{ <your_resource_here> }`. For example, ```yml supportLabel.text = "@{strings.contactSupport}" loginLabel.text = "@{strings.login.signIn}" ``` The final generated `*.brs` source file will have the strings inlined like so. ```yml supportLabel.text = "contact support at 555-555-555" loginLabel.text = "Sign in now!" ``` ## Usage ``` Usage: ukor [options] [command] Commands: make [flavors...] Bundle your channel into a zip to the build directory install [flavor] [roku] [-c] Bundle then deploy your channel to a named roku package <flavor> <roku> Package a channel flavor with a roku device rekey <roku> Rekey your device (an packageReference is required) lint <flavor> Lint a channel flavor console [roku] Launch the Telnet console for the named roku debugger [roku] Launch the Telnet debugger for the named roku find Search for rokus on the network init [flavors...] Initialize a ukor project test Run the tests validate Validate ukor.properties and ukor.local help [cmd] display help for [cmd] Options: -h, --help output usage information -v, --verbose Turn on verbose logging ``` ## Quick reference * I want to make a new project ``` ukor init ``` * I want to build my project ``` ukor make [flavor] ``` * I want to install my project on a device ``` ukor install [flavor] [device] ``` or ``` ukor install [flavor] [ip address] --auth=[username]:[password] ``` * I want to package my project using a device ``` ukor package [flavor] [device] ``` or ``` ukor package [flavor] [ip address] --auth=[username]:[password] ``` * I want to rekey my device ``` ukor rekey [device] ``` or ``` ukor package [ip address] --auth=[username]:[password] ``` NOTE: you will need to define a `packageReference` in `ukor.properties.yaml`. `packageReference` represent an signed release package. ## Testing Ukor uses `UnitTestFramework.brs` as part of its unit test runner and test reporting feature. This is especially useful if you plan on having Continuous Integration as part of your workflow. ### Setup First, copy the modified `UnitTestFramework.brs` in [lib/brs/](../master/lib/brs/UnitTestFramework.brs) to your `src/test/source/` folder, so it loads at startup for when testing. > Note that the original `UnitTestFramework.brs` can be found [here](https://github.com/rokudev/unit-testing-framework) Next, dd the following snippet in your startup function, after `screen.show()` but before the event loop ```brightscript if params.RunTests = "true" runner = TestRunner() if params.host <> invalid runner.logger.SetServer(params.host, params.port) else runner.logger.SetServerURL(params.url) end if ' other setup if needed runner.run() end if ``` You should now be able to execute your test suite using the `test` command. ``` ukor test [flavor] [roku] ``` ### What's happening? Basically, we modified the rokudev `UnitTestFramework.brs` file to make a `JSON` of test results, and then `POST` that to the specified server. `ukor test [flavor]` builds and deploys the specified flavor with the `test` src folder, and then restarts the channel with parameters to run tests and point the results to the client machine. `ukor` will log the results, and also output results in `xml` and `junit` format to `.out/tests/ukorTests.[xml|junit]`. notes: - Ukor now copies `UnitTestFramework.brs` with `ukor init`! - `UnitTestFramework.brs` is now up to date with the rokudev repo! # Contributing to Ukor Contributions and suggestions are more than welcome. Please see our [Code of Conduct](/CODE_OF_CONDUCT.md) as well as our [Contributing Guidelines ](/CONTRIBUTING.md) for more information.