[Fuego] Fuego Digest, Vol 31, Issue 11

dhinakar k dhinakar.k at gmail.com
Thu Feb 7 17:04:22 UTC 2019


Thanks Tim for 'Fuego Next Status Update'.
Fuego 1.5 release features: Batch_id feature, integrating the 'fserver'
code, parser code simplication, refactoring of fuego directory structure
looks interesting.
Will checkout sometime and report if I find any issues.

Regards,
Dhinakar



On Thu, Feb 7, 2019 at 1:46 PM <fuego-request at lists.linuxfoundation.org>
wrote:

> Send Fuego mailing list submissions to
>         fuego at lists.linuxfoundation.org
>
> To subscribe or unsubscribe via the World Wide Web, visit
>         https://lists.linuxfoundation.org/mailman/listinfo/fuego
> or, via email, send a message with subject or body 'help' to
>         fuego-request at lists.linuxfoundation.org
>
> You can reach the person managing the list at
>         fuego-owner at lists.linuxfoundation.org
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of Fuego digest..."
>
>
> Today's Topics:
>
>    1. Fuego next status update (Tim.Bird at sony.com)
>    2. Re: Similar Jenkins-based framework
>       (daniel.sangorrin at toshiba.co.jp)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Thu, 7 Feb 2019 07:17:45 +0000
> From: <Tim.Bird at sony.com>
> To: <fuego at lists.linuxfoundation.org>
> Subject: [Fuego] Fuego next status update
> Message-ID:
>         <ECADFF3FD767C149AD96A924E7EA6EAF8E0E9974 at USCULXMSG01.am.sony.com>
> Content-Type: text/plain; charset="us-ascii"
>
> Hello Fuego users and developers,
>
> Here is a quick status update for Fuego.  Lately I've been working on
> changes to the batch
> processing system.  The new batch_id code seems to work pretty well.  It's
> in the 'next' branch,
> and it needs more testing to figure out the best way to pass the batch_id
> from parent test
> jobs to child test jobs.  But querying runs using batch_id works fine, and
> this is leading
> to an overhaul of the batch system (moving from the testplan json files to
> Fuego tests
> that are themselves collections of sub-tests).  In the process, this will
> lead to better
> facilities to compose complicated test pipelines natively in Fuego
> (without resorting to
> Jenkins pipelines).
>
> Also, I've worked on integrating the 'fserver' code, which is the Fuego
> server code for managing job requests between Fuego sites.  This code may
> end up
> supporting other functionality in the future, such as a binary test
> package cache, and sharing
> tests outside of the fuego-core repository.  It's still in the prototype
> stage, but having it
> included by default in the container will allow people to look at it and
> experiment with it
> if they'd like.
>
> Also, I simplified the parser code a bit.  It is now no longer necessary
> for a test's parser.py
> module to preload the python system path.  This is done prior to calling
> the module, which
> is a much cleaner approach, I think.
>
> I've done a bit of refactoring of the directory structure for Fuego.  I've
> removed the 'engine'
> directory in fuego-core, and I've placed fuego-core inside the fuego
> directory (parallel
> to fuego-ro and fuego-rw).  This puts the fuego-core git repository inside
> the fuego git repository,
> which might be a bit confusing.  However, since this configuration matches
> the directory
> structure inside the docker container, it allowed me to remove an ugly
> hack in ftc that dealt
> with this difference.  I also think it's easier for users conceptually.
>
> The downside of this directory refactoring is that patches made against
> the 'master' branch
> will not apply cleanly in the 'next' branch.  Tests that have 'engine' in
> their paths should
> still work, as I've left a compatibility symlink in the repository.
> However, managing patches
> will be difficult.  For this reason, I'd like to accelerate the 1.5
> release, and try to do it much
> faster than the 1.4 release.  I'm actually hoping to get it done by the
> beginning of March.
> It will be a much shorter release (only 2 months or so).  I want to
> shorten the release
> window in order to reduce the amount of work spent on patch fixups that
> are required due
> to the directory refactoring.
>
> Finally - I'm moving the main fuego repositories from my personal
> bitbucket account (tbird20d)
> to a 'fuegotest' account.  The new git url will be:
> https://bitbucket.org/fuegotest/fuego.git
> A change to the install process now only requires that you download the
> 'fuego' repository.
> During install, fuego will download 'fuego-core' for you, so this shortens
> the installation
> instructions a bit.
>
> This will all get written up for the 1.5 release notes.  The main reason
> for this status update
> is to let you all know about the shortened release.  If you have a feature
> pending that you'd like
> to get in to this release, please let me know.  And of course, if you are
> interested in these
> features, please try out the 'next' branch (which is now maintained in the
> fuegotest bitbucket
> account) and let me know what you think.
>
> Regards,
>  -- Tim
>
>
>
>
> ------------------------------
>
> Message: 2
> Date: Thu, 7 Feb 2019 08:15:10 +0000
> From: <daniel.sangorrin at toshiba.co.jp>
> To: <RGC at hms.se>, <fuego at lists.linuxfoundation.org>
> Subject: Re: [Fuego] Similar Jenkins-based framework
> Message-ID:
>         <
> OSAPR01MB376339B9DD044448A2AD8394D0680 at OSAPR01MB3763.jpnprd01.prod.outlook.com
> >
>
> Content-Type: text/plain; charset="utf-8"
>
> Hello Rafael,
>
> > From: Rafael Gago Castano <RGC at hms.se>
> >
> > > By "the GIT repository" do you mean the Fuego core (fuego-core)
> repository or
> > > are you talking about the fuego-ro folder where the board files are?
> >
> > It was this thread:
> >
> > https://lists.linuxfoundation.org/pipermail/fuego/2017-June/000717.html
> >
> > I don't have the whole picture of that evaluation on my mind now, as it
> was
> > long ago, but our conclusion was that there was no way for multiple
> people to
> > safely develop on the server at the same time without external
> coordination.
> >
> > If I remember correctly:
> >
> > -The board code was sourced, modifications there had to be coordinated.
> True, the board file is sourced. My understanding then is that you wanted
> to have the board file embedded in the job. But what happens then when two
> developers want to use the same job with slightly different board code?
> What do you do to avoid collisions between them? Are the "namespaces
> (folders)" that you mention below related to that? Are the jobs (the name
> that appears on the jenkins interface) named with some specific syntax
> (e.g.: username-testname-boardname)?
>
> > -Running on the same board required external coordination to don't
> collide as
> >  there was no scheduler/board allocation.
> hmm the Jenkins scheduler serializes the execution of tests to the same
> board, so they are not supposed to collide.
> I guess you mean something that happens when using Jenkins labels to
> schedule a job among multiple boards of the same type/label, don't you?.
>
> > On Hottest the tests are stored on the server, but there are three
> features
> > that allow to safely develop tests on the server for multiple people:
> >
> > -Test jobs can be uploaded to own temporary folders (namespaces) to do
> some
> >  trial work and then deleted (this should be easy for Fuego too).
> >
> > -The boards are allocated dinamically, so you know for sure that when
> you run
> >  some test for some board you don't collide with another user.
> >
> > -The board code is not sourced, but dummy copied on each test.
> >
> > > Thanks a lot for releasing it as open source. It looks quite clean and
> nicely written.
> > > My only concern is further fragmentation in the Linux testing arena.
> It would be nice to share some parts to
> > avoid redundant work.
> > > https://elinux.org/Automated_Testing_Summit
> >
> > You're welcome. I agree. I wouldn't have gone this way if I could. maybe
> I was
> > wrong, but I thought that we needed some major changes and that you guys
> had
> > already some systems deployed already working, so pushing all those
> changes
> > would require a lot of coordination and risk of not being accepted. If
> Fuego at
> > some point can do what we need I'd prefer to join efforts of course.
>
> Understanding what your needs are and possible problems in Fuego is
> actually very useful.
>
> > > Q: can you use it without jenkins, from the command line alone?
> >
> > I guess not, at least not for now. Jenkins is used for dynamic board
> allocation.
> >
> > If I added a trivial modification on the generation tool generate a
> script file
> > containing all the parameter values and Jenkins variables it could work
> provided
> > that:
> >
> > -They source that file.
> > -They have access to all the Jenkins variables that make possible to
> locate
> >  required small tools.
> >
> > But there is no use case for us requiring this and we'd lose the Jenkins
> > scheduler.
> >
> > > I guess that this is similar to the prolog.sh in Fuego, isn't it?
> >
> > It's a more powerful mechanism IMO. You write the board and tests
> starting from
> > 0. Then you can combine individual chunks (piece of code) for e.g.:
> >
> > -powering "on" and "off" your relays.
> > -fetch files through wget
> > -Flash e.g. via tftp (not provided as of now, as we use an internal
> tool) and
> >  boot.
> > -ssh transport.
> >
> > Then all that logic gets into your test. Your test gets all the Jenkins
> parameters
> > too e.g. which relay line are you using, the url of the files to get
> when flashing,
> > the tftp addresses, the ssh parameters, etc.
> >
> >
> > E.g. take a look att
> chunks/util/communication/booted-ssh-board[.sh|.json],
> > any test including this gets the related parameters.
>
> Mmm this really sounds very similar to prolog.sh. I guess I would need to
> go into the details to understand the difference.
>
> > The default value of those Jenkins parameters can be configured at the
> > generation stage, so it isn't required to enter it any time.
>
> Is the "generation stage" what we call the "run" stage? In other words,
> each test run/execution has different parameters (called dynamic variables
> in Fuego)?
> Or is it what we call "add-job" stage, when you select the spec/parameters
> for your job but they are not changed on each run?
>
> > All these inclusions the only thing they did was to add funcions att
> specific
> > test steps/milestones, e.g. fetching calls "add_step_before_power_on",
> flashing
> > calls "add_step_after_power_on", etc.
>
> hmm ok, I guess the difference then is that the test.sh works like the
> director of an orchestra, somehow like Fuego's main.sh. In other workds, in
> Fuego we call main.sh which executes the test's phases (build, deploy, run,
> parse..). In your case, you would call test.sh directly and test.sh would
> decide what to do by using functions from the library. Is my understanding
> correct?
> Sounds like an object oriented approach (Fuego) vs an function oriented
> approach (Hottest). If I understood that correctly, probably your approach
> is more flexible. In fact, it looks like LAVA tests which define all of the
> stages.
> In Fuego, we just ask the test developers to "fill" a set of
> functions/hooks. I guess there is a trade-off there.
>
> > > In Fuego you can choose and existing transport but you are also able
> to override the functions as well thanks
> > to the overlays (ov) system.
> > > ov_transport_cmd, ov_transport_get, ov_transport_put
> >
> > Yeah, but aren't you choosing something that you aren't goint to use
> just to
> > make Fuego happy and then using shell function shadowing?
> I guess that happens because we use this kind of object oriented approach
> and function overriding.
>
> > > Nice. Fuego also allows powering on and off the board (still a bit
> experimental, we want to use the pdudaemon)
> > but not flashing it.
> > > Apart from flashing, can it also provision (deploy the kernel and
> rootfs) the board using tftp and a network
> > filesystem like LAVA?
> >
> > Anything that can be done with shell can be done, as the design is
> completely
> > modular it's just a matter of adding the right steps at the right place.
> Useful
> > modules can always be made part of the core if they are generic enough.
>
> I see, I think I understand what you mean.
>
> > > Is this part what enables having "multiple users developing on the
> same server"?
> >
> > No, It was having dynamic board allocation + namespacing (folders) + the
> board
> > code duplicated into each test.
> >
> > Having the include directories allows you to keep your own server
> definitions,
> > boards and modules (e.g. for own tools that no one is interested about)
> on
> > private repositories.
> >
> > > Interesting approach. What happens when you want to update the job? Do
> you need to remove the previous
> > results?
> >
> > No, it just updates, the results stay there. You get an automatic backup
> from
> > the tool each time you upload something too.
> >
> > > Nice, I think that Jan-Simon used Jenkins labels for dynamic board
> scheduling in Fuego as well. But I have
> > never tried it because I don't have the need.
> >
> > Yeah. This is how it's done on Hottest. This is a must for ourselves,
> both for
> > allowing multiple users without board synchronization and to be able to
> speed up
> > the nightly testing by throwing more hardware.
> >
> > > Sounds good.
> > > We are planning to use a different approach. Basically it would be a
> fuego test calling fuego tests in order. This
> > is possible because we can call tests from the command line.
> >
> > If a sizeable amount of tests are scheduled at the same time point, how
> are
> > tests made not to collide when allocating boards to run in?
>
> Assuming that you run the testplan from jenkins using labels:
> - the build/deploy phase is shared between jobs but protected by a file
> lock.
> - there are separate log folders for each run (build id)
> - Jenkins serializes the tests for a single board/node
> What collisions in particular are you thinking about?
>
> > > Default plugins: do you mean the "recommended plugins" button that
> appears the first time you run jenkins?
> >
> > Yes.
>
> OK, maybe you want to add that to the README ("install suggested plugins")
> because in the README it says "no plugins" and that was the reason for my
> first try to fail. Now I have a different error (see below).
>
> > > Another posibility is to send the results to Squad using a REST API as
> we can do now in Fuego. Squad has a
> > nicer interface than Jenkins.
> >
> > What is Squad?
> https://squad.readthedocs.io/en/latest/
>
> > > PS: the error
> >
> > I tried to reproduce by reinstalling from 0 by downloading a recent
> Jenkins war
> > and everything worked.
>
> I think this was because of not installed the "suggested plugins".
> Btw, it may be a good idea to create a Dockerfile instead of documenting
> how to install. For example, I had to install jsonschema as a dependency
> and that is not written in the README.
>
> > I catched some dumb bugs on the install script that are fixed though.
> >
> > Are you installing as instructed on the "install" section of the main
> > "README.md"? The Jenkins install filesystem requires access to some
> tools (e.g.
> > serio).
> yes.
>
> I run the example without "dry-run"
> $ scripts/cli/sync.py http://localhost:8080 $USER
> 118aeaa7sdf2ca9ec52060e404eb316a7bc sync -f
> example-cfg/sync/localsetup.json -c chunks -I example-cfg -r test
>
> Now I can see some offline nodes and a "test" folder in jenkins (if i
> click there is an error).
> Also i get these errors below but I suppose this was not expected to work,
> was it?
>
> Thanks,
> Daniel
>
> backing up server state to folder:
> "hottest.bak/localsetup.json-2019-02-07_15-37-46"
> backup done
> node "dummyboard-4": generating
> node "dummyboard-3": generating
> node "dummyboard-2": generating
> node "dummyboard-1": generating
> node "dummyboard-4": creating
> node "dummyboard-3": creating
> node "dummyboard-2": creating
> node "dummyboard-1": creating
> job "test/jobs/dummyboard/dummy-2": generating
> job "test/jobs/dummyboard/dummy-3": generating
> job "test/jobs/dummyboard/dummy-1": generating
> job "test/jobs/dummyboard/dummy-4": generating
> job "test/jobs/dummyboard/dummy-2": added non-existent Jenkins folder:
> "test/jobs/dummyboard"
> job "test/jobs/dummyboard/dummy-2": creating
> job "test/jobs/dummyboard/dummy-3": creating
> job "test/jobs/dummyboard/dummy-1": creating
> job "test/jobs/dummyboard/dummy-4": creating
> pipeline "test/testplans/daily-dummy": generating
> WARNING: On pipeline "test/testplans/daily-dummy". Non-existant job in
> server or serial branch: "test/jobs/dummyboard/dummy-1". This WARNING can
> be ignored on a dry-run.
> WARNING: On pipeline "test/testplans/daily-dummy". Non-existant job in
> server or serial branch: "test/jobs/dummyboard/dummy-2". This WARNING can
> be ignored on a dry-run.
> WARNING: On pipeline "test/testplans/daily-dummy". Non-existant job in
> server or serial branch: "test/jobs/dummyboard/dummy-3". This WARNING can
> be ignored on a dry-run.
> WARNING: On pipeline "test/testplans/daily-dummy". Non-existant job in
> server or serial branch: "test/jobs/dummyboard/dummy-4". This WARNING can
> be ignored on a dry-run.
> Traceback (most recent call last):
>   File "scripts/cli/sync.py", line 691, in <module>
>     main()
>   File "scripts/cli/sync.py", line 688, in main
>     args.func (args)
>   File "scripts/cli/sync.py", line 570, in run_sync
>     args.item_whitelist)
>   File "scripts/cli/sync.py", line 525, in jenkins_sync
>     srv, sync, root_folder, pipeline_dirs, whitelist)
>   File "scripts/cli/sync.py", line 352, in gen_and_sync_pipelines
>     lambda name, jobset: pipeline_validation (name, jobset, srv, pddict))
>   File "scripts/cli/sync.py", line 243, in srv_sync_jobs
>     if srv_add_folder (srv, srvjobs[JENKINS_FOLDER_CLASS], dirsplit[0]):
>   File "scripts/cli/sync.py", line 208, in srv_add_folder
>     srv.create_job (current, gen.FolderData())
>   File "scripts/cli/sync.py", line 33, in create_job
>     name, job_data.get_jenkins_xml())
>   File "/usr/local/lib/python2.7/dist-packages/jenkins/__init__.py", line
> 987, in create_job
>     raise JenkinsException('job[%s] already exists' % (name))
> jenkins.JenkinsException: job[test] already exists
>
>
> Feb 07, 2019 3:37:46 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-4
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:46 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-4
> Feb 07, 2019 3:37:46 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-4
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-3
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-4
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-3
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-4
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-3
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-4
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-3
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-4
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-2
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-3
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-4
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-2
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-3
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-4
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-2
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-3
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-3
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-2
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-1
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-2
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-3
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-1
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-2
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-3
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-1
> Feb 07, 2019 3:37:47 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-2
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-1
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:37:47 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-2
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:38:07 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-1
> Feb 07, 2019 3:38:07 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-2
> Feb 07, 2019 3:38:07 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-1
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
> Feb 07, 2019 3:38:07 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-2
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
>
>
>
> Feb 07, 2019 3:40:07 PM hudson.slaves.SlaveComputer tryReconnect
> INFO: Attempting to reconnect dummyboard-1
> Feb 07, 2019 3:40:07 PM hudson.slaves.CommandLauncher launch
> SEVERE: Unable to launch the agent for dummyboard-1
> java.io.IOException: Cannot run program "hottest/noderun.sh": error=2, No
> such file or directory
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>         at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:147)
>         at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:294)
>         at
> jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
>         at
> jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.IOException: error=2, No such file or directory
>         at java.lang.UNIXProcess.forkAndExec(Native Method)
>         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
>         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
>         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>         ... 8 more
>
>
>
>
> >
> >
> >
> > ________________________________
> >
> > From: daniel.sangorrin at toshiba.co.jp <daniel.sangorrin at toshiba.co.jp>
> > Sent: Wednesday, February 6, 2019 9:59:07 AM
> > To: Rafael Gago Castano; fuego at lists.linuxfoundation.org
> > Subject: RE: Similar Jenkins-based framework
> >
> > Hello Rafael,
> >
> > I tried the example in the Readme but I got an error (I put it at the
> end of this email).
> >
> > > From: fuego-bounces at lists.linuxfoundation.org <
> fuego-bounces at lists.linuxfoundation.org> On Behalf Of
> > > Rafael Gago Castano
> > > You probably remember me. If you don't, I was on this list evaluating
> Fuego
> > > some time ago (Spring-Summer 2017) because we had a LAVA setup that
> had become
> > > hard to work with, but at the end we didn't switch because on Fuego
> the GIT
> > > repository was mounted on the Jenkin's instance filesystem, this
> prevented
> > > multiple users to develop on the same server.
> >
> > By "the GIT repository" do you mean the Fuego core (fuego-core)
> repository or are you talking about the
> > fuego-ro folder where the board files are?
> >
> > > I still found Fuego superior to LAVA on a lot of aspects for our use
> case, so
> > > taking time from here and there I developed similar Jenkins-based
> framework that
> > > has a very similar philosophy: A very-thin wrapper that delegates the
> hard work
> > > to Jenkins, but adds some features from LAVA like dynamic board
> scheduling.
> > >
> > > Luckily my company has allowed me to open-source it, so because this
> framework
> > > is inspired in Fuego (some code is a direct copy) I thought that it
> would be a
> > > good idea to share it with you here. If you think there are cool
> ideas/concepts
> > > you have a reference implementation. If we get some criticism from
> experts on
> > > the field it is very welcome.
> >
> > Thanks a lot for releasing it as open source. It looks quite clean and
> nicely written.
> > My only concern is further fragmentation in the Linux testing arena. It
> would be nice to share some parts to avoid
> > redundant work.
> > https://elinux.org/Automated_Testing_Summit
> >
> > > https://github.com/HMSAB/hottest
> > >
> > > I will try to make a list of the most important features/differences:
> > >
> > > -Like Fuego, it has small tooling coded in Python, tests are written
> in shell
> > >  and uses Jenkins too.
> >
> > Q: can you use it without jenkins, from the command line alone?
> >
> > > -Test are generated by using shell script pieces (with json metadata
> for
> > >  Jenkins consumption) that support including (copy pasting) other
> pieces for
> > >  building a script and accumulating all the Jenkins metadata (e.g.
> each of these
> > >  pieces can define parameters for Jenkins).
> >
> > I guess that this is similar to the prolog.sh in Fuego, isn't it?
> >
> > > -There is an API containing a few board functions that the user has to
> provide
> > >  (dut_cmd, dut_get, dut_put), so board functions are abstracted and
> tests are
> > >  shareable. All the transports on Fuego are(were) part of the core, on
> hottest
> > >  they are a "module", so the user can implement them or select one of
> the
> > >  transports available.
> >
> > In Fuego you can choose and existing transport but you are also able to
> override the functions as well thanks to
> > the overlays (ov) system.
> > ov_transport_cmd, ov_transport_get, ov_transport_put
> >
> > > -There are predefined milestones on the test sequence. The test writer
> can add
> > >  functions before or after each of the milestones dinamically, e.g.
> you can call
> > >  "add_step_before_power_on" and pass a function that crosscompiles a
> small
> > >  executable and then call "add_step_before_test" and pass a function
> that copies
> > >  the executable to the device, then use the executable inside a test.
> > >
> > > -Allows powering on and off the boards and flashing.
> >
> > Nice. Fuego also allows powering on and off the board (still a bit
> experimental, we want to use the pdudaemon)
> > but not flashing it.
> > Apart from flashing, can it also provision (deploy the kernel and
> rootfs) the board using tftp and a network
> > filesystem like LAVA?
> >
> > > -The generator supports include directories, so the board, powering,
> lab setup
> > >  and firmware flashing implementation can be left on separate
> user-private
> > >  repositories while still using shared tests.
> >
> > Is this part what enables having "multiple users developing on the same
> server"?
> >
> > > -All the jobs(tests) are self-contained, they embed the board code
> into the job.
> > >  This avoids having to mount git repositories on the server's
> filesystem at the
> > >  expense of code duplication on Jenkins (handled by the tool, HDD is
> cheap). It
> > >  allows tests from older versions to coexist unmodified on the same
> server too.
> >
> > Interesting approach. What happens when you want to update the job? Do
> you need to remove the previous
> > results?
> >
> > > -It adds a mapping between boards and Jenkins nodes, so you can have
> some tests
> > >  written for a specific board and some boards connected to the server.
> When you
> > >  schedule a lot of tests for the same board Jenkins spreads the
> workload between
> > >  all idle boards. This uses Jenkins labels under the hood.
> >
> > Nice, I think that Jan-Simon used Jenkins labels for dynamic board
> scheduling in Fuego as well. But I have never
> > tried it because I don't have the need.
> >
> > > -The testplans are implemented as Groovy pipelines that schedule a
> series of tests
> > >  in parallel. These pipelines can have some tests serially executed in
> a well defined
> > >  order, useful for cases where e.g. there is only one hardware
> resource/dongle on
> > >  the test PC that many tests use.
> >
> > Sounds good.
> > We are planning to use a different approach. Basically it would be a
> fuego test calling fuego tests in order. This
> > is possible because we can call tests from the command line.
> >
> > > -For now, it has no extra Jenkins dependencies, so it works with a
> bare modern
> > >  Jenkins install with default plugins.
> >
> > Default plugins: do you mean the "recommended plugins" button that
> appears the first time you run jenkins?
> >
> > > -Reporting is in a minimum-viable state now, it just generates a Junit
> report
> > >  and builds a trivial gnuplot graph as a Jenkins artifact.
> >
> > Another posibility is to send the results to Squad using a REST API as
> we can do now in Fuego. Squad has a nicer
> > interface than Jenkins.
> >
> > Thanks,
> > Daniel
> >
> > PS: the error
> >
> > host$ scripts/cli/sync.py http://localhost:8090 $USER
> 1187d61ba0sd7864656758c64827211a2e  sync -f
> > example-cfg/sync/localsetup.json -c chunks -I example-cfg -r test
> > backing up server state to folder:
> "hottest.bak/localsetup.json-2019-02-06_17-15-48"
> > backup done
> > node "dummyboard-4": generating
> > node "dummyboard-3": generating
> > node "dummyboard-2": generating
> > node "dummyboard-1": generating
> > node "dummyboard-4": creating
> > Traceback (most recent call last):
> >   File "scripts/cli/sync.py", line 691, in <module>
> >     main()
> >   File "scripts/cli/sync.py", line 688, in main
> >     args.func (args)
> >   File "scripts/cli/sync.py", line 570, in run_sync
> >     args.item_whitelist)
> >   File "scripts/cli/sync.py", line 519, in jenkins_sync
> >     gen_and_sync_nodes (srv, sync, chunk_dirs, param_dirs, whitelist)
> >   File "scripts/cli/sync.py", line 417, in gen_and_sync_nodes
> >     srv_sync_nodes (srv, syncnodes, whitelist)
> >   File "scripts/cli/sync.py", line 384, in srv_sync_nodes
> >     launcher_params = { "command": gen.JENKINS_NODE_CMD }
> >   File "scripts/cli/sync.py", line 21, in create_node
> >     super (JenkinsWrapper, self).create_node(*args, **kwargs)
> >   File "/usr/local/lib/python2.7/dist-packages/jenkins/__init__.py",
> line 1305, in create_node
> >     self._build_url(CREATE_NODE, params), b''))
> >   File "/usr/local/lib/python2.7/dist-packages/jenkins/__init__.py",
> line 448, in jenkins_open
> >     e.code, e.msg)
> > jenkins.JenkinsException: Error in request. Possibly authentication
> failed [500]: Server Error
> >
> >
> > Server
> > =====
> >
> > Feb 06, 2019 5:15:49 PM
> org.eclipse.jetty.server.handler.ContextHandler$Context log
> > WARNING: Error while serving http://localhost:8090/computer/doCreateItem
> > <http://localhost:8090/computer/doCreateItem>
> > java.lang.reflect.InvocationTargetException
> >         at
> org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:400)
> >         at
> org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:408)
> >         at
> org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:77)
> >         at
> org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26)
> >         at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:212)
> >         at
> org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:145)
> >         at
> org.kohsuke.stapler.MetaClass$11.doDispatch(MetaClass.java:537)
> >         at
> org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
> >         at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:739)
> >         at org.kohsuke.stapler.Stapler.invoke(Stapler.java:870)
> >         at org.kohsuke.stapler.MetaClass$2.doDispatch(MetaClass.java:221)
> >         at
> org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
> >         at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:739)
> >         at org.kohsuke.stapler.Stapler.invoke(Stapler.java:870)
> >         at org.kohsuke.stapler.Stapler.invoke(Stapler.java:668)
> >         at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
> >         at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
> >         at
> org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865)
> >         at
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)
> >         at
> hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154)
> >         at
> jenkins.telemetry.impl.UserLanguages$AcceptLanguageFilter.doFilter(UserLanguages.java:128)
> >         at
> hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
> >         at
> hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157)
> >         at
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
> >         at
> jenkins.security.ApiCrumbExclusion.process(ApiCrumbExclusion.java:48)
> >         at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:73)
> >         at
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
> >         at
> hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
> >         at
> hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
> >         at
> hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
> >         at
> jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
> >         at
> hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
> >         at
> >
> org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:1
> > 25)
> >         at
> hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
> >         at
> >
> org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:14
> > 2)
> >         at
> hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
> >         at
> org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
> >         at
> hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
> >         at
> jenkins.security.BasicHeaderProcessor.success(BasicHeaderProcessor.java:140)
> >         at
> jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:82)
> >         at
> hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
> >         at
> >
> org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:
> > 249)
> >         at
> >
> hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
> >         at
> hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
> >         at
> hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)
> >         at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)
> >         at
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
> >         at
> org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)
> >         at
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
> >         at
> hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)
> >         at
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
> >         at
> org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
> >         at
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
> >         at
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
> >         at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
> >         at
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
> >         at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
> >         at
> org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
> >         at
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
> >         at
> org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
> >         at
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)
> >         at
> org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
> >         at
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
> >         at
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
> >         at
> org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
> >         at
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242)
> >         at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
> >         at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
> >         at org.eclipse.jetty.server.Server.handle(Server.java:503)
> >         at
> org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
> >         at
> org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
> >         at org.eclipse.jetty.io
> .AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
> >         at org.eclipse.jetty.io
> .FillInterest.fillable(FillInterest.java:103)
> >         at org.eclipse.jetty.io
> .ChannelEndPoint$2.run(ChannelEndPoint.java:118)
> >         at
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
> >         at
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
> >         at
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
> >         at
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
> >         at
> >
> org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
> >         at
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
> >         at
> org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
> >         at java.lang.Thread.run(Thread.java:748)
> > Caused by: java.lang.Error: Failed to instantiate class
> hudson.slaves.DumbSlave from
> >
> {"launcher":{"stapler-class":"hudson.slaves.CommandLauncher","command":"hottest/noderun.sh"},"numExe
> >
> cutors":2,"nodeProperties":{"stapler-class-bag":"true"},"name":"dummyboard-4","retentionStrategy":{"stapl
> >
> er-class":"hudson.slaves.RetentionStrategy$Always"},"remoteFS":"/tmp/nodecreate","type":"hudson.slaves.D
> >
> umbSlave$DescriptorImpl","nodeDescription":null,"labelString":null,"mode":"EXCLUSIVE"}
> >         at hudson.model.Descriptor.newInstance(Descriptor.java:605)
> >         at hudson.model.ComputerSet.doDoCreateItem(ComputerSet.java:300)
> >         at
> java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
> >         at
> org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:396)
> >         ... 81 more
> > Caused by: java.lang.IllegalArgumentException: Failed to instantiate
> class hudson.slaves.DumbSlave from
> >
> {"launcher":{"stapler-class":"hudson.slaves.CommandLauncher","command":"hottest/noderun.sh"},"numExe
> >
> cutors":2,"nodeProperties":{"stapler-class-bag":"true"},"name":"dummyboard-4","retentionStrategy":{"stapl
> >
> er-class":"hudson.slaves.RetentionStrategy$Always"},"remoteFS":"/tmp/nodecreate","type":"hudson.slaves.D
> >
> umbSlave$DescriptorImpl","nodeDescription":null,"labelString":null,"mode":"EXCLUSIVE"}
> >         at
> org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:681)
> >         at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:478)
> >         at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:474)
> >         at hudson.model.Descriptor.newInstance(Descriptor.java:597)
> >         ... 84 more
> > Caused by: java.lang.IllegalArgumentException: Failed to convert the
> launcher parameter of the constructor
> > public
> hudson.slaves.DumbSlave(java.lang.String,java.lang.String,hudson.slaves.ComputerLauncher)
> throws
> > hudson.model.Descriptor$FormException,java.io.IOException
> >         at
> org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:780)
> >         at
> org.kohsuke.stapler.RequestImpl.access$200(RequestImpl.java:83)
> >         at
> org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:678)
> >         ... 87 more
> > Caused by: java.lang.IllegalArgumentException: Failed to instantiate
> class hudson.slaves.ComputerLauncher
> > from
> {"stapler-class":"hudson.slaves.CommandLauncher","command":"hottest/noderun.sh"}
> >         at
> org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:681)
> >         at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:478)
> >         at
> org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:778)
> >         ... 89 more
> > Caused by: java.lang.IllegalArgumentException: Class
> hudson.slaves.CommandLauncher is specified in JSON,
> > but no such class found in classLoader
> hudson.PluginManager$UberClassLoader
> >         at
> org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:674)
> >         ... 91 more
> > Caused by: java.lang.ClassNotFoundException:
> hudson.slaves.CommandLauncher
> >         at
> hudson.PluginManager$UberClassLoader.findClass(PluginManager.java:1915)
> >         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
> >         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
> >         at
> org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:669)
> >         ... 91 more
> >
>
>
> ------------------------------
>
> _______________________________________________
> Fuego mailing list
> Fuego at lists.linuxfoundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/fuego
>
>
> End of Fuego Digest, Vol 31, Issue 11
> *************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linuxfoundation.org/pipermail/fuego/attachments/20190207/3bce4fe6/attachment-0001.html>


More information about the Fuego mailing list