FrontPage 

Fuego wiki

Login or create account

Continuous Integration Notes in 'raw' format

{{TableOfContents}}

Fuego is intended to be used for continuous integration of a Linux system.

This page documents continuous integration options for testing Fuego itself.

= Alternatives =
There are different approaches available for implementing this system:
 * Fuego testplan approach
 * Fuego test approach
 * Jenkins pipeline approach

= pros, cons, issues =
== Fuego testplan ==
 * requires editing a json file
 * is executed by Jenkins without indicating pass or fail
   * there's no visualization of sub-results
 * already have full management of this on the command line
   * can create Jenkins batch job from a plan
 * is assigned to a single node
   * I want to test on multiple nodes, with different tests per node
     * e.g. fuego-test has fuego tests, and bbb has nightly tests
     * disable some tests on particular nodes
 * baseline is missing for Functional.fuego_compare_reports

Questions:
 * can I control the order of test execution?
   * I think so.
 * can I repeat a test in the list?
 * can I stop when a test fails?
   * no - the jobs are started as post-build actions
 * can I use a job in more than one plan?
   * not with different test settings (reboot, timeouts, cleanup flags, etc.)
   * you can use different specs, though

Notes:
 * a Jenkins job can start on the completion of another build, so these could be expressed as job dependencies (with upstream and downstream jobs)
   * however, I can't see a way to use a job in more than one plan this way


== Fuego test ==
 * is very flexible
   * maybe too flexible - is imperative instead of declarative, so cannot be easily parsed itself for meta-analysis
 * language (shell scripting) is already used in Fuego
 * doesn't have visualization?
   * depends on parser and Jenkins visualization
 * already have full management of this on the command line
   * treat like a regular Fuego test

== Jenkins pipeline ==
 * still dependent on Jenkins
 * requires learning yet-another-domain-specific-language
 * has visualization inside Jenkins?


= Plan =
 * Make one of each and compare difficulty and features
 * DEFER Need to have bbb change systems (kernel?)
 * DEFER Need to have min1 change systems (kernel?)

= things that were painful when building release table =
See [[Release_test_results]]

 * finding the thing that failed for each board
   * not too bad in Jenkins - used Jenkins history and sorted by failure
   * not too bad on the command line - used ftc list-runs and gen-report
     * commands are difficult for average user
     * results can't be browsed in the Jenkins interface
   * can't tell aborted test from not-run test
 * finding the reason for the failure for each board
   * it takes a lot of work to drill down and see the reason for a failure
     * have to look at console log and diagnose test failures
       * could be build failure, runtime failure, dependency abort, etc.
 * comparing the failure for this release cycle with the failure for last release cycle, and seeing if the failure is new
   * that's what the CI cycle is supposed to check
   * Functional.fuego_compare_reports is supposed to be useful for that, but there was no baseline to compare with
 * can't see summary table with multiple different boards
 * have to click through to see test history
 * ftc gen-report doesn't scale well - on 50 tests or more, it starts to get really slow
  * no listing of "expected failures" that I can ignore unless I'm interested.
   * could take the test out of the plan, but then can't see if it's status changes
   * would be good if 'xfail' had a different color

= What do I want to see? =


= Notes on making and using the different CI approaches =

== fuego testplan approach ==
Here's what I did for to create fuego_nightly.batch:

I created testplan_fuego_nightly1.json and testplan_fuego_nightly2.json
by copying from testplan_default.json and testplan_fuego_test.json

{{{#!YellowBox
 $ cd fuego-core/engine/overlays/testplans
 $ cp testplan_default.json testplan_fuego_nightly1.json
 $ cp testplan_fuego_test.json testplan_fuego_nightly2.json
}}}

Note that I added 'reboot': 'true' to Functional.OpenSSL, because it follows
LTP, and I want the board restarted after that test.  ''I'm not sure this will
work, because likely <board>.default.Functional.OpenSSL already exists,
and won't be created with that flag set on the job.''

Then I added jobs for these tests:
{{{#!YellowBox
 $ ftc add-jobs -b bbb,min1,ren1 -p testplan_fuego_nightly1
 $ ftc add-jobs -b fuego-test -p testplan_fuego_nightly2
}}}

Note that this creates the sub-jobs, as well as the batch jobs for fuego_nightly* operations.

Then I created a single "cover" job called fuego_nightly.batch.
This jobs had a post-build action of:
 * bbb.testplan_fuego_nightly1.batch,min1.testplan_fuego_nightly1.batch,ren1.testplan_fuego_nightly1.batch,fuego-test.testplan_fuego_nightly2.batch

I added a build trigger of "Build periodically", with a schedule line of:
 * 0 0 * * *

Another option would have been to schedule each of the <board>.testplan_fuego_nightly* jobs with the schedule "H H(0-7) * * *", instead of making a cover job that runs at midnight.

I changed the schedule to "0 7 * * *", to be 7 am UTC, which corresponds
to 11:00 pm on my host machine (Pacific Standard Time).

I added, at the front of testplan_fuego_nightly1 a reference to Benchmark.reboot.

I created a view called 'nightly' so I'd have easy access to the batch jobs.


= ideas to do =
 * add one-off criteria definition (e.g. xfail for a test or testcase) as a board variable
   * e.g. ftc add-critera -b bbb  "Functional.fuego_test_variables.precedence_of_class_vars_over_env_vars=FAIL"
   * e.g. ftc set-var -b bbb "FUNCTIONS_FUEGO_TEST_VARIABLES_CRITERIA1=Functional.fuego_test_variables.precedence_of_class_vars_over_env_vars=FAIL"
      * not as good, requires use to know criteria number
   * see [[Update Criteria]] for a possible 'ftc set-criteria' command (in progress)
 * we should record the phase and reason string for an abort in the run.json file
 * we should allow running a step to translate a regular expression into a short description
   * I understand the Jenkins description setter module better now
   * allows you to associate a short string with a particular pattern found in the log
   * is useful for abbreviating the reason for a failing result
   * could collect such patterns from users, and use them to build a database for "reason" parsing










TBWiki engine 1.8.3 by Tim Bird