<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>escape(window): blog</title>
  <link>http://drkscrtlv.livejournal.com/</link>
  <description>escape(window): blog - LiveJournal.com</description>
  <managingEditor>aki@escapewindow.com</managingEditor>
  <lastBuildDate>Mon, 06 May 2013 22:01:09 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>drkscrtlv</lj:journal>
  <lj:journalid>759575</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>http://l-userpic.livejournal.com/21817427/759575</url>
    <title>escape(window): blog</title>
    <link>http://drkscrtlv.livejournal.com/</link>
    <width>100</width>
    <height>90</height>
  </image>

<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/336833.html</guid>
  <pubDate>Mon, 06 May 2013 22:01:09 GMT</pubDate>
  <title>hg-git part i</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/336833.html</link>
  <description>&lt;p&gt;
I was about a week into my m-c hg-git conversion&lt;sup&gt;*&lt;/sup&gt; when &lt;a href=&quot;http://gregoryszorc.com/blog/2013/04/14/making-hg-git-faster/&quot; rel=&quot;nofollow&quot;&gt;gps blogged about faster hg-git&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
I was about two weeks into the initial conversion when I tried the latest upstream hg-git, with gps&apos; patches.  That conversion finished in less than a day, while the initial conversion was still chugging along on a different core.  However, the git shas differed from our existing pre-cvs conversion repositories.  This was due to different behavior when faced with a &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/rev/26a2aacf9e3a&quot; rel=&quot;nofollow&quot;&gt;bogus email address&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Once I backed out the corresponding &lt;a href=&quot;https://github.com/escapewindow/hg-git/commit/58ba440425ada6e0f1338c8243c556d9ea8cc870&quot; rel=&quot;nofollow&quot;&gt;email&lt;/a&gt; &lt;a href=&quot;https://github.com/escapewindow/hg-git/commit/706fb1750102e304e88c4e00e110342964a145fb&quot; rel=&quot;nofollow&quot;&gt;munging&lt;/a&gt; commits, and landed Ehsan&apos;s &lt;a href=&quot;https://github.com/escapewindow/hg-git/commit/3657cbc871903a749d456a74ebfa0ec2ed65db0f&quot; rel=&quot;nofollow&quot;&gt;timezone fix&lt;/a&gt; for a &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=835202&quot; rel=&quot;nofollow&quot;&gt;separate issue&lt;/a&gt; that halted the conversion process, we&apos;re now back to a converted m-c with the same shas.
&lt;/p&gt;&lt;p&gt;
At this point I killed the still-running initial conversion.
&lt;/p&gt;&lt;p&gt;
I&apos;m still working on automating the cvs prepending and pulling in other repos/branches, but this is a good sanity-check point.
&lt;/p&gt;&lt;br /&gt;&lt;hr align=&quot;left&quot; width=&quot;10&quot; /&gt;&lt;p&gt;
&lt;sup&gt;*&lt;/sup&gt; Note, I had pulled both mozilla-central and mozilla-b2g18 into the same working directory as a proof-of-concept workflow test before converting.  In hindsight this was a terrible decision, as it more than doubled the estimated conversion time.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/336833.html</comments>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/336492.html</guid>
  <pubDate>Thu, 21 Feb 2013 02:51:15 GMT</pubDate>
  <title>mozharness-based desktop unittests are live</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/336492.html</link>
  <description>&lt;p&gt;
We are now running &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793022&quot; rel=&quot;nofollow&quot;&gt;Firefox desktop unittests through mozharness&lt;/a&gt; for Firefox-22-based branches (mozilla-central, mozilla-inbound, try, and project branches).
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;http://slantedcellardoor.com/myblog/&quot; rel=&quot;nofollow&quot;&gt;Jordan Lund&lt;/a&gt; started this work during his internship last year, and had the &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=650880&quot; rel=&quot;nofollow&quot;&gt;mozharness scripts and configs code-complete&lt;/a&gt; by the end of his internship.
I took over afterwards, but my efforts were sporadic, between high-priority mobile and b2g work.
&lt;/p&gt;&lt;p&gt;
This was a multi-phase operation:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;
We enabled them on &lt;a href=&quot;https://tbpl.mozilla.org/?tree=Cedar&quot; rel=&quot;nofollow&quot;&gt;Cedar&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;
This required platform-specific fixes, since we were working against a subset of platforms in staging.
&lt;/li&gt;&lt;li&gt;
Cedar unittests were essentially the same as, say, mozilla-central, other than having the logic in mozharness instead of hardcoded in buildbot.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;
At this point, the majority of the tests were green, but a number were perma-orange or red or missing or had intermittent issues not present in buildbot-based unittests.  So we went through and identified+fixed the &lt;a href=&quot;https://bugzilla.mozilla.org/showdependencytree.cgi?id=793022&amp;amp;hide_resolved=0&quot; rel=&quot;nofollow&quot;&gt;various problems&lt;/a&gt; per-suite or per-platform, whether that was &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793017&quot; rel=&quot;nofollow&quot;&gt;missing debug tests&lt;/a&gt; or &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=795533&quot; rel=&quot;nofollow&quot;&gt;barfing on leaks&lt;/a&gt;.
&lt;/li&gt;&lt;li&gt;
We also cleaned up issues that made these jobs hard to sheriff, e.g. missing automated retries or ugly log summaries.
&lt;/li&gt;&lt;li&gt;
Whenever P0 interrupts hit (regularly), we had to put this work on the back burner, and determine what changes had made the buildbot-based unittests diverge from the mozharness-based unittests when we revisited.  This back-and-forth added months to the schedule, but allowed us to respond to higher priority tasks more quickly.
&lt;/li&gt;&lt;li&gt;
Once all the blocker bugs were resolved, I split the rollout into three parts:
&lt;ol&gt;&lt;li&gt;
Get &lt;a href=&quot;http://hg.mozilla.org/build/buildbot-configs/file/0ef0d21f5072/mozilla-tests/config.py&quot; rel=&quot;nofollow&quot;&gt;mozilla-tests/config.py&lt;/a&gt; to &lt;a href=&quot;http://hg.mozilla.org/build/buildbot-configs/rev/97d8757436a9&quot; rel=&quot;nofollow&quot;&gt;not warn in python mode&lt;/a&gt; (pep8).  This wasn&apos;t critical, but helped avoid spurious conflicts later.  Easy peasy.  (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793022#c8&quot; rel=&quot;nofollow&quot;&gt;comment 8&lt;/a&gt; through &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793022#c10&quot; rel=&quot;nofollow&quot;&gt;comment 10&lt;/a&gt;)
&lt;/li&gt;&lt;li&gt;
Split out the mobile tests into their own config file.  This helped me limit the scope of my config.py rewrites to desktop only. (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793022#c11&quot; rel=&quot;nofollow&quot;&gt;comment 11&lt;/a&gt; through &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793022#c28&quot; rel=&quot;nofollow&quot;&gt;comment 28&lt;/a&gt;)
&lt;/li&gt;&lt;li&gt;
The final set of patches made mozharness-based unittests default for Firefox desktop, with exceptions for aurora, beta, release, esr, and b2g18*. (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793022#c29&quot; rel=&quot;nofollow&quot;&gt;comment 29&lt;/a&gt; through &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793022#c60&quot; rel=&quot;nofollow&quot;&gt;comment 60&lt;/a&gt;)
&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;
I ran through a number of spot tests in staging to limit risk for rollout; I also waited until after merge day so the unittests could ride the trains.  So far the only fallout is some bustage in debug b2g emulator tests on b2g18 and b2g18_v1_0_1 due to missing symbols (now &lt;a href=&quot;http://hg.mozilla.org/build/buildbot-configs/rev/8349163e6eaa&quot; rel=&quot;nofollow&quot;&gt;fixed&lt;/a&gt;; we also have &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=843303&quot; rel=&quot;nofollow&quot;&gt;bugs&lt;/a&gt; to &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=843296&quot; rel=&quot;nofollow&quot;&gt;enable symbols&lt;/a&gt; filed).
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
Making large sweeping changes in infrastructure while
&lt;ol style=&quot;list-style-type: lower-alpha&quot;&gt;&lt;li&gt;
responding to constant priority interrupts (often for weeks or months at a time), and
&lt;/li&gt;&lt;li&gt;
avoiding bustage
&lt;/li&gt;&lt;/ol&gt;
is a long game.  But we&apos;re playing for keeps.
&lt;/p&gt;&lt;p&gt;
Thanks to Jordan for the initial work around this, and A-Team, sheriffs, and RelEng for their help + patience.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/336492.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/336352.html</guid>
  <pubDate>Fri, 01 Feb 2013 04:20:52 GMT</pubDate>
  <title>mozharness 0.6</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/336352.html</link>
  <description>&lt;blockquote&gt;
&quot; I certainly don&apos;t want to wait another 5 months before the next arbitrary version bump.&quot;&lt;br /&gt;&lt;br /&gt;
&lt;center&gt;-- me, &lt;a href=&quot;http://escapewindow.dreamwidth.org/234039.html&quot; rel=&quot;nofollow&quot;&gt;11 months ago&lt;/a&gt;.
&lt;/blockquote&gt;
&lt;p&gt;
What&apos;s happened in the past 11 months?  In no particular order,
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
completed Android Native support,
&lt;/li&gt;&lt;li&gt;
Fennec armv6+noion support,
&lt;/li&gt;&lt;li&gt;
broadened VirtualenvMixin functionality (setup.py support, pip freeze, PyWin32 support, --find-links, ...),
&lt;/li&gt;&lt;li&gt;
further mozbase support / integration,
&lt;/li&gt;&lt;li&gt;
&lt;a href=&quot;http://escapewindow.dreamwidth.org/234671.html&quot; rel=&quot;nofollow&quot;&gt;developer-runnable Android multilocale build support&lt;/a&gt;,
&lt;/li&gt;&lt;li&gt;
Marionette tests on Firefox desktop,
&lt;/li&gt;&lt;li&gt;
mock (mock_mozilla) support,
&lt;/li&gt;&lt;li&gt;
tooltool support,
&lt;/li&gt;&lt;li&gt;
retry support,
&lt;/li&gt;&lt;li&gt;
Boot2Gecko (FirefoxOS) device builds (panda, unagi, unagi_eng, unagi_stable, otoro) (all multilocale),
&lt;/li&gt;&lt;li&gt;
Boot2Gecko desktop builds (all multilocale),
&lt;/li&gt;&lt;li&gt;
Boot2Gecko emulator tests: marionette-webapi, mochitests, reftests, crashtests, xpcshell,
&lt;/li&gt;&lt;li&gt;
mozpool support for Boot2Gecko + Android Pandas,
&lt;/li&gt;&lt;li&gt;
Boot2Gecko Panda Gaia UI tests,
&lt;/li&gt;&lt;li&gt;
Android signing on demand,
&lt;/li&gt;&lt;li&gt;
TBPL parser compatibility improvements,
&lt;/li&gt;&lt;li&gt;
per-locale status in mobile_l10n.py,
&lt;/li&gt;&lt;li&gt;
mozharness Firefox desktop unittests (ready to roll out),
&lt;/li&gt;&lt;li&gt;
mozharness Firefox desktop talos support (baking on Cedar),
&lt;/li&gt;&lt;li&gt;
proof-of-concept jetperf,
&lt;/li&gt;&lt;li&gt;
proof-of-concept remote (mobile device) talos support (needs work),
&lt;/li&gt;&lt;li&gt;
further Peptest support (which has since been disabled),
&lt;/li&gt;&lt;li&gt;
MPL 2.0,
&lt;/li&gt;&lt;li&gt;
and a mozharness production branch, which will let us run CI tests against default before merging, to avoid production bustage.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
So, yeah.  Some minor version bumps are larger than others.  We&apos;ve gotten all this done thanks to great efforts by the A-Team and RelEng.
&lt;/p&gt;&lt;p&gt;
B2G automation is largely mozharness-based; mobile is maybe half-mozharness and Firefox desktop is still largely buildbot-based.  But, without actually crunching numbers, I would guess that rolling out mozharness Firefox desktop unittests would push us somewhere near the halfway point.  Soon.
&lt;/p&gt;&lt;p&gt;
I&apos;m glad to see the project continuing to gain traction, and we&apos;ve been seeing concrete evidence of the theoretical benefits I&apos;ve been touting &lt;a href=&quot;http://escapewindow.dreamwidth.org/223757.html&quot; rel=&quot;nofollow&quot;&gt;since the beginning&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
This time I&apos;m not going to make any predictions about when I&apos;ll bump the arbitrary version next, but I&apos;ll schedule something in &lt;a href=&quot;http://culturedcode.com/&quot; rel=&quot;nofollow&quot;&gt;Things&lt;/a&gt;.
&lt;/p&gt;&lt;/center&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/336352.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/333395.html</guid>
  <pubDate>Thu, 31 May 2012 20:00:49 GMT</pubDate>
  <title>Building Android multilocale locally</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/333395.html</link>
  <description>&lt;p&gt;
Tl;dr: it&apos;s now &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=753545&quot; rel=&quot;nofollow&quot;&gt;easier to run multilocale builds locally&lt;/a&gt;.  I&apos;d love feedback in terms of whether this is useful for you, and if there are changes that would make this script better for your workflow.
&lt;/p&gt;&lt;p&gt;
I updated &lt;a href=&quot;https://wiki.mozilla.org/Mobile/Fennec/Android#Multilocale_builds&quot; rel=&quot;nofollow&quot;&gt;the wiki&lt;/a&gt; as well.
&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;what &amp;amp; why&lt;/h3&gt;
&lt;p&gt;
There are only three ways to get a multilocale build currently:
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle&quot;&gt;&lt;li&gt;
triggering a nightly build off of a multilocale-enabled branch,
&lt;/li&gt;&lt;li&gt;
pinging me directly and asking for a multilocale build, or
&lt;/li&gt;&lt;li&gt;
building multilocale locally.  Up until now, that involved a combination of digging through logs, asking for help, and reverse-engineering the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/scripts/multil10n.py&quot; rel=&quot;nofollow&quot;&gt;multilocale script&lt;/a&gt; with a lot of trial and error.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
The latter was so difficult because I hadn&apos;t spent the time to make it friendly to run locally.  Now that &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=753545&quot; rel=&quot;nofollow&quot;&gt;bug 753545&lt;/a&gt; has landed, it should now be relatively easy.
&lt;/p&gt;&lt;p&gt;
The &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py&quot; rel=&quot;nofollow&quot;&gt;config file&lt;/a&gt; is written to [hopefully] be easily editable and usable.
&lt;/p&gt;
&lt;br /&gt;
&lt;h3&gt;running the script&lt;/h3&gt;
&amp;lt;/p&amp;gt;&lt;ul&gt;&lt;li&gt;
Create a directory to run in.  It&apos;s simplest to create a new directory, although you can use an existing directory with mozilla-central (or other tree) already checked out.
&lt;blockquote&gt;&lt;pre&gt;
mkdir multilocale
cd multilocale
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/li&gt;&lt;li&gt;
Clone mozharness and copy the standalone config file for easy editing+use.

&lt;blockquote&gt;&lt;pre&gt;
hg clone http://hg.mozilla.org/build/mozharness
cp mozharness/configs/multi_locale/standalone_mozilla-central.py myconfig.py
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/li&gt;&lt;li&gt;
Customize your config file.
&lt;p&gt;
By default it&apos;s going to &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l6&quot; rel=&quot;nofollow&quot;&gt;clone mozilla-central&lt;/a&gt; into a &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l3&quot; rel=&quot;nofollow&quot;&gt;directory called &lt;code&gt;mozilla-central&lt;/code&gt;&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
It also assumes your objdir will be &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l12&quot; rel=&quot;nofollow&quot;&gt;named &lt;code&gt;objdir-droid&lt;/code&gt;&lt;/a&gt; and that will be specified in your mozconfig, which will be in a &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l17&quot; rel=&quot;nofollow&quot;&gt;file named &lt;code&gt;mozconfig&lt;/code&gt; in this directory&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
This should hopefully be easy to edit.  Holler if it&apos;s confusing.
&lt;/p&gt;&lt;p&gt;
Afterwards, you can verify it&apos;s still valid python by typing
&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
python myconfig.py
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;
which should exit silently.
&lt;/p&gt;&lt;/li&gt;&lt;li&gt;
If your config file still says that your mozconfig is in &lt;code&gt;os.path.join(os.getcwd(), &quot;mozconfig&quot;)&lt;/code&gt;, copy your mozconfig into this directory and make sure it&apos;s named &lt;code&gt;mozconfig&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
Make sure mozilla-central (or whatever repo you specified) is in this directory.
&lt;p&gt;
You can either clone it manually, or use the script&apos;s &lt;code&gt;pull-build-source&lt;/code&gt; action:
&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py --pull-build-source
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/li&gt;&lt;li&gt;
Run the script.
&lt;p&gt;
By default, this will:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;
pull the locale source,
&lt;/li&gt;&lt;li&gt;
copy your mozconfig into the tree and build mozilla-central,
&lt;/li&gt;&lt;li&gt;
package the en-US apk,
&lt;/li&gt;&lt;li&gt;
backup your objdir to a &lt;i&gt;-bak&lt;/i&gt; directory (e.g. &lt;code&gt;objdir-droid-bak&lt;/code&gt;) via rsync,
&lt;/li&gt;&lt;li&gt;
restore your objdir via rsync (no changes),
&lt;/li&gt;&lt;li&gt;
add the locales to your objdir,
&lt;/li&gt;&lt;li&gt;
and package the multilocale build.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
(See the &lt;b&gt;actions&lt;/b&gt; section below for more advanced usage.)
&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py
&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;developing + debugging&lt;/h3&gt;
&lt;p&gt;
The above instructions are sufficient for when you want a single multilocale build.
&lt;/p&gt;&lt;p&gt;
If you&apos;re changing m-c code or otherwise want multiple builds, you probably want to follow this workflow:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;
After running the multilocale steps, you want to restore your objdir to en-US.  At least until someone figures out how to clobber the multilocale-specific bits, rsyncing from a clean backup directory seemed like the most expedient solution.
&lt;blockquote&gt;&lt;pre&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py --restore-objdir
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/li&gt;&lt;li&gt;
Then make your code changes.
&lt;/li&gt;&lt;li&gt;
Then run the default actions again.  If this seems like it&apos;s doing more than it needs to, you&apos;re correct.  See the &lt;b&gt;actions&lt;/b&gt; section below for more advanced usage.
&lt;blockquote&gt;&lt;pre&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;actions&lt;/h3&gt;
&lt;p&gt;
(I covered actions to some degree &lt;a href=&quot;http://escapewindow.dreamwidth.org/231122.html&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt; as well, but the below specifically covers this script + config file.)
&lt;/p&gt;
&lt;h5&gt;what actions are available?&lt;/h5&gt;
&lt;p&gt;
You can see the default actions, &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l41&quot; rel=&quot;nofollow&quot;&gt;defined in the config file&lt;/a&gt;, by:
&lt;blockquote&gt;&lt;code&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py --list-actions&lt;br /&gt;
&lt;/code&gt;&lt;/blockquote&gt;
&lt;p&gt;
This will give you this output:
&lt;/p&gt;&lt;blockquote&gt;&lt;code&gt;
&lt;b&gt;Actions available:&lt;/b&gt; clobber, pull-build-source, pull-locale-source, build, package-en-US, upload-en-US, backup-objdir, restore-objdir, add-locales, package-multi, upload-multi&lt;br /&gt;
&lt;b&gt;Default actions:&lt;/b&gt; pull-locale-source, build, package-en-US, backup-objdir, restore-objdir, add-locales, package-multi&lt;br /&gt;
&lt;/code&gt;&lt;/blockquote&gt;
&lt;h5&gt;what do these actions do?&lt;/h5&gt;
&lt;p&gt;
I&apos;d like to have more information about each action built into each script.  Here&apos;s an overview of multil10n.py&apos;s actions:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
&lt;i&gt;clobber&lt;/i&gt; - This is effectively no-op as long as &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l20&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;work_dir&lt;/code&gt; is set to &apos;.&apos;&lt;/a&gt;.  Otherwise it nukes the entire &lt;code&gt;work_dir&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;pull-build-source&lt;/i&gt; - This clones the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l26&quot; rel=&quot;nofollow&quot;&gt;repos defined in &lt;code&gt;repos&lt;/code&gt;&lt;/a&gt;.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;pull-locale-source&lt;/i&gt; - This clones the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l31&quot; rel=&quot;nofollow&quot;&gt;repos defined in &lt;code&gt;l10n_repos&lt;/code&gt;&lt;/a&gt;, as well as &lt;a href=&quot;http://hg.mozilla.org/l10n-central&quot; rel=&quot;nofollow&quot;&gt;the l10n repositories&lt;/a&gt; defined in &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/file/183aed68ea36/mobile/android/locales/maemo-locales&quot; rel=&quot;nofollow&quot;&gt;the locales file&lt;/a&gt; (specified &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l23&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;)
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;build&lt;/i&gt; - This copies the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/636e0f7b6ab6/configs/multi_locale/standalone_mozilla-central.py#l40&quot; rel=&quot;nofollow&quot;&gt;mozconfig path specified here&lt;/a&gt; into the source tree, and runs &lt;code&gt;make -f client.mk build&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;package-en-US&lt;/i&gt; - This runs &lt;code&gt;make package&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;upload-en-US&lt;/i&gt; - To be written.  It will call &lt;code&gt;make upload&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;backup-objdir&lt;/i&gt; - This rsyncs your objdir to a backup directory, since there&apos;s no current solution for clobbering the multilocale bits in your objdir.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;restore-objdir&lt;/i&gt; - This rsyncs the backup directory into your objdir.  If you want to re-run the build or re-add the locales without a lot of old cruft lying around, I recommend doing this first.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;add-locales&lt;/i&gt; - This runs compare-locales and adds the locale strings + manifests into your objdir.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;package-multi&lt;/i&gt; - This runs &lt;code&gt;make package&lt;/code&gt; for your multilocale apk.
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;upload-multi&lt;/i&gt; - To be written.  It will call &lt;code&gt;make upload&lt;/code&gt;.
&lt;/li&gt;&lt;/ul&gt;
&lt;h5&gt;how do I run a single action?&lt;/h5&gt;
&lt;p&gt;
You can run any single action by itself by prepending &lt;code&gt;--&lt;/code&gt; in front of the action name (making it a command line option).  For instance, to only run the &lt;i&gt;restore-objdir&lt;/i&gt; action,
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py --restore-objdir
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;h5&gt;how do I skip an action?&lt;/h5&gt;
&lt;p&gt;
You can run the default set of actions, minus an action, by prepending &lt;code&gt;--no-&lt;/code&gt; to the action(s) you want to skip.  To run the default actions without pulling the locale source,
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py --no-pull-locale-source
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;h5&gt;how do I run several actions at once?&lt;/h5&gt;
&lt;p&gt;
Running the script with no action-specific command line options will iterate over the list of default actions.
&lt;/p&gt;&lt;p&gt;
You can also have a combination of --ACTION or --no-ACTION to add an action to or remove an action from the default list.  For example,
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py --no-pull-locale-source --no-build --no-package-en-US --no-backup-objdir
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
and
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
mozharness/scripts/multil10n.py --cfg myconfig.py --restore-objdir --add-locales --package-multi
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
are equivalent.
&lt;/p&gt;&lt;p&gt;
You also have the option of editing your &lt;code&gt;default_actions&lt;/code&gt; in myconfig.py if that makes things easier.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/333395.html</comments>
  <category>fennec</category>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/333292.html</guid>
  <pubDate>Thu, 19 Apr 2012 01:40:22 GMT</pubDate>
  <title>mozharness presentation</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/333292.html</link>
  <description>For those interested, I gave an overview of mozharness for the Automation Team today.&lt;br /&gt;&lt;br /&gt;I mentioned that we&apos;re not yet at that point of critical mass where the accumulated knowledge and shared code help make everything go faster.  But we&apos;re getting there.&lt;br /&gt;&lt;br /&gt;The presentation &quot;slides&quot; are available &lt;a href=&quot;http://escapewindow.com/mozharness/20120418_preso&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.</description>
  <comments>http://drkscrtlv.livejournal.com/333292.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/332967.html</guid>
  <pubDate>Wed, 29 Feb 2012 01:35:37 GMT</pubDate>
  <title>mozharness 0.5</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/332967.html</link>
  <description>&lt;p&gt;
A lot&apos;s happened since &lt;a href=&quot;http://escapewindow.dreamwidth.org/229826.html&quot; rel=&quot;nofollow&quot;&gt;mozharness 0.4&lt;/a&gt; landed in late September.  We:
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle; line-height: 1.5em&quot;&gt;&lt;li&gt;
added a bunch of Android native support.
&lt;/li&gt;&lt;ul&gt;&lt;li&gt;
enabled &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/896444892a59/scripts/mobile_l10n.py&quot; rel=&quot;nofollow&quot;&gt;Android single locale repacks&lt;/a&gt; with nightly update snippet generation
&lt;/li&gt;&lt;li&gt;
ported &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/896444892a59/scripts/sign_android.py&quot; rel=&quot;nofollow&quot;&gt;Android signing&lt;/a&gt; with passphrase verification, signature verification, single locale support, and update snippet creation.
&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;
rolled &lt;a href=&quot;https://developer.mozilla.org/en/Peptest&quot; rel=&quot;nofollow&quot;&gt;peptest&lt;/a&gt; out to production on Try, across all desktop test platforms.
&lt;/li&gt;&lt;li&gt;
improved mozharness virtualenv support, with real-life mozbase usage in peptest.
&lt;/li&gt;&lt;li&gt;
fixed actions-in-config-files.
&lt;/li&gt;&lt;li&gt;
separated the output parser from &lt;code&gt;ShellMixin.run_command()&lt;/code&gt;, so we can
&lt;/li&gt;&lt;ul&gt;&lt;li&gt;
parse output from &lt;code&gt;subprocess&lt;/code&gt; or &lt;code&gt;get_output_from_command()&lt;/code&gt;,
&lt;/li&gt;&lt;li&gt;
eventually add context lines to output parsing, and
&lt;/li&gt;&lt;li&gt;
potentially split serial tasks into multiple parallel jobs with their own log parsing.
&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;
added chunking support to split up jobs across machines.
&lt;/li&gt;&lt;li&gt;
added &lt;code&gt;query_exe()&lt;/code&gt; and &lt;code&gt;which()&lt;/code&gt; support to specify or find executables.
&lt;/li&gt;&lt;li&gt;
added &lt;code&gt;add_failure()&lt;/code&gt;, &lt;code&gt;query_failure()&lt;/code&gt;, and &lt;code&gt;summarize_success_count()&lt;/code&gt; support to track granular status across a list of tasks.
&lt;/li&gt;&lt;li&gt;
added a &lt;code&gt;BuildbotMixin&lt;/code&gt; and &lt;code&gt;ReleaseMixin&lt;/code&gt; to tie into our existing buildbot infrastructure/configs.
&lt;/li&gt;&lt;li&gt;
precompiled the &lt;code&gt;error_list&lt;/code&gt; regexes.
&lt;/li&gt;&lt;li&gt;
made various &lt;code&gt;OSMixin&lt;/code&gt; and &lt;code&gt;ShellMixin&lt;/code&gt; method improvements.
&lt;/li&gt;&lt;li&gt;
added a &lt;code&gt;setup.py&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
added a &lt;code&gt;pyflakes&lt;/code&gt; call and Debian/Ubuntu support to &lt;code&gt;unit.sh&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
moved mozilla-specific modules into &lt;code&gt;mozharness.mozilla.*&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
retired Maemo scripts (Maemo tier 3).
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
This feels like an as-good-as-any time to arbitrarily increment the arbitrary version number:  &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/rev/720d1b0a4a66&quot; rel=&quot;nofollow&quot;&gt;mozharness 0.5&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
I think the best part of this release is how more people got involved; I can feel the momentum building.  I certainly don&apos;t want to wait another 5 months before the next arbitrary version bump.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/332967.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/332607.html</guid>
  <pubDate>Thu, 17 Nov 2011 16:47:17 GMT</pubDate>
  <title>mobile/ is now mobile/xul/</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/332607.html</link>
  <description>&lt;p&gt;
Today we moved &lt;code&gt;mobile&lt;/code&gt; to &lt;code&gt;mobile/xul&lt;/code&gt; in mozilla-central, in preparation for landing the native UI code in &lt;code&gt;mobile/android&lt;/code&gt;.&lt;br /&gt;
Mozilla-aurora, mozilla-beta, and mozilla-release are currently unaffected.
&lt;/p&gt;&lt;center&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;&lt;tr&gt;&lt;th&gt;
Branch
&lt;/th&gt;&lt;th&gt;
Android platform
&lt;/th&gt;&lt;th&gt;
Mobile source location
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan=&quot;2&quot;&gt;
mozilla-central
&lt;/td&gt;&lt;td&gt;
android
&lt;/td&gt;&lt;td&gt;
mobile/android
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
android-xul
&lt;/td&gt;&lt;td&gt;
mobile/xul
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
mozilla-aurora
&lt;/td&gt;&lt;td&gt;
linux-android
&lt;/td&gt;&lt;td&gt;
mobile
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
mozilla-beta
&lt;/td&gt;&lt;td&gt;
linux-android
&lt;/td&gt;&lt;td&gt;
mobile
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
mozilla-release
&lt;/td&gt;&lt;td&gt;
linux-android
&lt;/td&gt;&lt;td&gt;
mobile
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/center&gt;
&lt;p&gt;
&lt;b&gt;NOTE: mobile/android has not yet landed.&lt;/b&gt;  The builds are switched over and will need to be hidden.  I&apos;m doing that as I see them, but would appreciate any help in this matter.
&lt;/p&gt;&lt;p&gt;
The mobile team has said that &lt;code&gt;mobile/android&lt;/code&gt; is at least a few days away from landing.
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;Attention project branch owners!&lt;/b&gt; If you have Android builds on your project branch:
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;
You will need to merge from mozilla-central for the &apos;android-xul&apos; builds to go green.
&lt;/li&gt;&lt;li&gt;
The &apos;android&apos; builds will burn until mobile/android lands and you re-merge from mozilla-central.  These builds need to be hidden.
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;
&lt;b&gt;Attention trychooser users!&lt;/b&gt;  You probably want the &apos;android-xul&apos; platform.  The mozconfig situation will be a little convoluted for now, so it would be best to land a &lt;code&gt;mozconfig-extra-android-xul&lt;/code&gt; at the top of your push to make sure you get the right settings.
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;Attention l10n users!&lt;/b&gt;  Due to the move of &lt;code&gt;mobile/locales&lt;/code&gt;, we have broken mobile localization on mozilla-central.  We will be fixing this and finding a single locale repack solution ASAP.
&lt;/p&gt;&lt;p&gt;
See also:
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=701833&quot; rel=&quot;nofollow&quot;&gt;bug 701833 - hg move mobile to mobile/xul&lt;/a&gt;
&lt;br /&gt;
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=701864&quot; rel=&quot;nofollow&quot;&gt;bug 701864 - support mobile builds+repacks out of mobile/, mobile/xul/, and mobile/android/&lt;/a&gt;
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/332607.html</comments>
  <category>fennec</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/332491.html</guid>
  <pubDate>Sat, 05 Nov 2011 02:03:32 GMT</pubDate>
  <title>device_talosrunner.py: a first peek</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/332491.html</link>
  <description>&lt;p&gt;
&lt;b&gt;[what is it?]&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
&lt;code&gt;device_talosrunner.py&lt;/code&gt; is a work-in-progress &lt;a href=&quot;http://escapewindow.com/mozharness/&quot; rel=&quot;nofollow&quot;&gt;mozharness&lt;/a&gt; script that sets up talos and runs it against a device using either the sut or adb protocols.
&lt;/p&gt;&lt;p&gt;
It&apos;s designed to:
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle;&quot;&gt;&lt;li&gt;
allow anyone with a [supported and rooted] Android device to run talos without building the tree;
&lt;/li&gt;&lt;li&gt;
allow someone with access to a staging/production tegra to run a production-like talos run without setting up buildbot;
&lt;/li&gt;&lt;li&gt;
at some point, become the official way we run talos on Android in production.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
This is similar to, and parallel to, the work on &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=688604&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;make talos-remote&lt;/code&gt;&lt;/a&gt;. However, aiui, that is developer-oriented, whereas &lt;code&gt;device_talosrunner.py&lt;/code&gt; is targeted towards someone who wants to test pre-built apks (as well as replacing our current production code).
&lt;/p&gt;&lt;p&gt;
I have used this script to run talos on both a tegra over sut, and an Asus Eee Pad Transformer using adb-over-ip, successfully.
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;[how do i use it?]&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
You need:
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle;&quot;&gt;&lt;li&gt;
python (2.5 - 2.7.x)
&lt;/li&gt;&lt;li&gt;
virtualenv
&lt;/li&gt;&lt;li&gt;
hg, to clone the various repos
&lt;/li&gt;&lt;li&gt;
a copy of &lt;a href=&quot;https://github.com/escapewindow/mozharness/tree/talosrunner&quot; rel=&quot;nofollow&quot;&gt;my github mozharness repo&lt;/a&gt;, on the branch &apos;talosrunner&apos;;
&lt;/li&gt;&lt;li&gt;
a rooted, supported Android device that is either running the sutagent, or is attach{ed,able} via adb.  The adb calls require busybox.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
Once you have those things,
&lt;/p&gt;&lt;ol style=&quot;list-style-type: number;&quot;&gt;&lt;li&gt;
Create a config file.  I&apos;ve got a wip &lt;a href=&quot;https://github.com/escapewindow/mozharness/blob/talosrunner/configs/users/aki/tablet1.py&quot; rel=&quot;nofollow&quot;&gt;tablet config&lt;/a&gt; that I use for my Asus Eee Pad Transformer, and a wip &lt;a href=&quot;https://github.com/escapewindow/mozharness/blob/talosrunner/configs/users/aki/tegra1.py&quot; rel=&quot;nofollow&quot;&gt;tegra config&lt;/a&gt; that I use for a staging tegra.
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;
If you&apos;re using adb-over-usb, the device needs to be connected to your desktop/laptop.  If you&apos;re using adb-over-ip or sut, specifying the device_ip should be sufficient.
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;
If this is the first time you&apos;re running &lt;code&gt;device_talosrunner.py&lt;/code&gt;, you need a virtualenv. Run
&lt;blockquote&gt;
&lt;code&gt;mozharness/scripts/device_talosrunner.py --cfg users/aki/tablet1.py --create-virtualenv&lt;/code&gt;
&lt;/blockquote&gt;
(replacing the config file path with the path to your config file).  This will create a python virtualenv in &lt;code&gt;./venv&lt;/code&gt; and install PyYAML, a Talos dependency, into it.
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;
Run
&lt;blockquote&gt;
&lt;code&gt;mozharness/scripts/device_talosrunner.py --cfg users/aki/tablet1.py&lt;/code&gt;
&lt;/blockquote&gt;
If the &lt;code&gt;start_python_webserver&lt;/code&gt; option is set, the script will start a webserver and point the device at it. Otherwise it&apos;ll point the device at whatever &lt;code&gt;talos_webserver&lt;/code&gt; is set.
&lt;br /&gt;&lt;br /&gt;
When this script is polished and mature, I definitely want people to be comfortable using it on their personal phones and tablets, but it&apos;s still rough around the edges.
&lt;br /&gt;&lt;br /&gt;
This will uninstall Fennec and possibly reboot your device, so &lt;b&gt;please be careful&lt;/b&gt; if you&apos;re trying this on a device/profile that you haven&apos;t backed up.
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;
&lt;b&gt;[what&apos;s left to do?]&lt;/b&gt;
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle;&quot;&gt;&lt;li&gt;
I&apos;ve only tested a handful of talos suites against two devices; for this to be a production replacement, it needs to be able to run reliably against a large pool of devices.
&lt;/li&gt;&lt;li&gt;
This relies on a talos patch in &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=688604&quot; rel=&quot;nofollow&quot;&gt;bug 688604&lt;/a&gt; for the python webserver; I most likely need to use &lt;a href=&quot;https://github.com/mozilla/mozbase/tree/master/mozhttpd&quot; rel=&quot;nofollow&quot;&gt;mozhttpd&lt;/a&gt;.
&lt;/li&gt;&lt;li&gt;
I&apos;ve hit issues with both m-c and birch builds, and will most likely need to make changes for the native UI.
&lt;/li&gt;&lt;li&gt;
I have an idea which would allow us to find the next available and working tegra, which may reduce red and purple Tegra results; this needs writing and testing. More on that later.
&lt;/li&gt;&lt;/ul&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/332491.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/329829.html</guid>
  <pubDate>Wed, 12 Oct 2011 07:11:46 GMT</pubDate>
  <title>mozharness: actions</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/329829.html</link>
  <description>&lt;p&gt;
&lt;a href=&quot;http://escapewindow.dreamwidth.org/223757.html&quot; rel=&quot;nofollow&quot;&gt;&lt;i&gt;that allows production infrastructure and individual developers to use the same scripts.&lt;/i&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;What are actions?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
Actions are discrete logical steps to a script, similar to [simple] makefile targets.
&lt;/p&gt;&lt;p&gt;
Since certain actions, like &lt;code&gt;upload&lt;/code&gt; or &lt;code&gt;notify&lt;/code&gt; might not be useful to certain consumers of a script, it&apos;s helpful to be able to turn those off.
&lt;/p&gt;&lt;p&gt;
Versatile, reusable &lt;a href=&quot;http://escapewindow.dreamwidth.org/230482.html&quot; rel=&quot;nofollow&quot;&gt;configs&lt;/a&gt; are key to sharing scripts between automation and users with different workflows.  Actions are another key ingredient.
&lt;/p&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;What are default actions?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
&lt;code&gt;default_actions&lt;/code&gt; is a subset of &lt;code&gt;all_actions&lt;/code&gt;, and specifies the list of actions to run if no action-specific command line options are specified.
&lt;/p&gt;&lt;p&gt;
Using the &lt;code&gt;configtest.py&lt;/code&gt; script as an example:
&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
deathduck:~/src/clean/mozharness [19:09:59] (default)
621$ scripts/configtest.py --list-actions
Actions available: list-config-files, test-json-configs, test-python-configs
Default actions: test-json-configs, test-python-configs
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;
These are specified &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e9a73bfed62c/scripts/configtest.py#l70&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
It&apos;s now possible to specify your own &lt;code&gt;default_actions&lt;/code&gt; in your config file, so if you want to run a script with a different set of default actions, you can do so without copy/pasting a ton of command line arguments.
&lt;/p&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;How is the list of actions-to-run generated?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
I have that documented &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e9a73bfed62c/mozharness/base/config.py#l366&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Using &lt;code&gt;configtest.py&lt;/code&gt; as an example again:
&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
# Only run the list-config-files action
configtest.py --list-config-files

# Run the list-config-files and test-json-configs actions
configtest.py --list-config-files --test-json-configs
# or
configtest.py --action list-config-files,test-json-configs
# or
configtest.py --action list-config-files --action test-json-configs

# Run list-config-files in addition to the default actions
configtest.py --add-action list-config-files

# Run the default actions, but not test-python-configs
configtest.py --no-test-python-configs
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;How are the actions run in the script?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
That&apos;s handled by &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e9a73bfed62c/mozharness/base/script.py#l484&quot; rel=&quot;nofollow&quot;&gt;BaseScript.run()&lt;/a&gt;:
&lt;/p&gt;&lt;ol style=&quot;list-style-type: lower-alpha&quot;&gt;&lt;li&gt;
Change all dashes in the action name to underscores; that&apos;s the method to call
&lt;/li&gt;&lt;li&gt;
If the action is not in the list of actions to run, skip + go to the next action.
&lt;/li&gt;&lt;li&gt;
if &lt;code&gt;preflight_METHODNAME&lt;/code&gt; exists, run that before running &lt;code&gt;METHODNAME&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
Call &lt;code&gt;METHODNAME&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;
If &lt;code&gt;postflight_METHODNAME&lt;/code&gt; exists, run that after running &lt;code&gt;METHODNAME&lt;/code&gt;.
&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;&lt;p&gt;
&lt;a href=&quot;http://escapewindow.dreamwidth.org/223757.html&quot; rel=&quot;nofollow&quot;&gt;Mozharness home&lt;/a&gt;
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/329829.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/329481.html</guid>
  <pubDate>Wed, 12 Oct 2011 01:30:02 GMT</pubDate>
  <title>mozharness: logging</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/329481.html</link>
  <description>&lt;p&gt;
&lt;a href=&quot;http://escapewindow.dreamwidth.org/223757.html&quot; rel=&quot;nofollow&quot;&gt;&lt;i&gt;with full logging&lt;/i&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;Why so many log files?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
This is the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/mozharness/base/log.py#l295&quot; rel=&quot;nofollow&quot;&gt;MultiFileLogger&lt;/a&gt;, which creates a log file per log level.  We could just as easily default to the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/mozharness/base/log.py#l273&quot; rel=&quot;nofollow&quot;&gt;SimpleFileLogger&lt;/a&gt; or write a new class, e.g. a MultiNetworkLogger.
&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
deathduck:~/src/clean/mozharness [17:39:57] (default)
608$ ls -l logs
total 24
drwxr-xr-x   8 asasaki  staff   272B Oct 11 17:18 ./
drwxr-xr-x  15 asasaki  staff   510B Oct 11 17:18 ../
-rw-r--r--   1 asasaki  staff     0B Oct 11 17:18 log_critical.log
-rw-r--r--   1 asasaki  staff     0B Oct 11 17:18 log_error.log
-rw-r--r--   1 asasaki  staff     0B Oct 11 17:18 log_fatal.log
-rw-r--r--   1 asasaki  staff   5.1K Oct 11 17:18 log_info.log
-rw-r--r--   1 asasaki  staff   3.6K Oct 11 17:18 log_raw.log
-rw-r--r--   1 asasaki  staff     0B Oct 11 17:18 log_warning.log
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;
Because each log file is a superset of all levels above it, you can easily glance at the warning or error log file and determine whether the script detected any warnings or errors.
&lt;br /&gt;
(debug &amp;gt; info &amp;gt; warning &amp;gt; error &amp;gt; critical &amp;gt; fatal, where &apos;&amp;gt;&apos; means is-a-superset-of)
&lt;/p&gt;&lt;p&gt;
These are all standard &lt;a href=&quot;http://docs.python.org/library/logging.html&quot; rel=&quot;nofollow&quot;&gt;logging module&lt;/a&gt; levels except for &lt;code&gt;FATAL&lt;/code&gt;, which I added to indicate a critical error that should also exit the script.
&lt;/p&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;What do Mozharness logs look like?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
Here&apos;s a snippet from running &lt;code&gt;scripts/configtest.py&lt;/code&gt; (without arguments):
&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
17:18:00     INFO - Testing /src/clean/mozharness/scripts/../configs/deb_repos/staging_release_mozilla-release.py.
17:18:00     INFO - Good.
17:18:00     INFO - Testing /src/clean/mozharness/scripts/../configs/test/test.py.
17:18:00     INFO - Good.
17:18:00     INFO - 5 of 5 python config files were good.
17:18:00     INFO - #####
17:18:00     INFO - ##### ConfigTest summary:
17:18:00     INFO - #####
17:18:00     INFO - 17 of 17 json config files were good.
17:18:00     INFO - 5 of 5 python config files were good.
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;
The timestamp and log level are prepended to most log files and the console output.  By default, we also create a raw log without that information, which is potentially more scrape-friendly.
&lt;/p&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;How does Mozharness detect errors?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
The core error detection is through the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/mozharness/base/script.py#l240&quot; rel=&quot;nofollow&quot;&gt;ShellMixin.run_command&lt;/a&gt; &lt;code&gt;error_list&lt;/code&gt;.
&lt;/p&gt;&lt;p&gt;
Generic error lists are defined in &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/mozharness/base/errors.py#l59&quot; rel=&quot;nofollow&quot;&gt;errors.py&lt;/a&gt;.  These are ordered lists of substrings and/or regular expressions, which, if matched against a log line, determines its log level.  When we hit a match, we exit the loop.
&lt;/p&gt;&lt;p&gt;
Two very important features I want to add here:
&lt;/p&gt;&lt;ol style=&quot;list-style-type: lower-roman&quot;&gt;&lt;li&gt;
&lt;i&gt;context lines&lt;/i&gt;:
&lt;p&gt;
If we set &lt;code&gt;&apos;context_lines&apos;: (10, 3)&lt;/code&gt;, I want ten lines up and three lines down to also be marked at this log level.&lt;br /&gt;
This requires buffering lines before outputting to the log file and/or console.
&lt;/p&gt;&lt;p&gt;
This allows for more useful contents in the error log. Rather than only highlighting, say, &lt;code&gt;make: *** [all] Error 2&lt;/code&gt;, you can also include some lines of context above and/or below that line.
&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;
&lt;i&gt;explanations&lt;/i&gt;, to translate obscure error messages into &quot;this probably means [insert human readable message here]&quot;.  More &lt;a href=&quot;https://github.com/escapewindow/mozharness/blob/a0f12802c04dadf81232978f6284b5da6ad3a745/mozharness/base/errors.py#L49&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.
&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;&lt;p&gt;
&lt;a href=&quot;http://escapewindow.com/mozharness/&quot; rel=&quot;nofollow&quot;&gt;Mozharness home&lt;/a&gt;
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/329481.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/329299.html</guid>
  <pubDate>Wed, 12 Oct 2011 00:09:35 GMT</pubDate>
  <title>mozharness: config</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/329299.html</link>
  <description>&lt;p&gt;
&lt;a href=&quot;http://escapewindow.dreamwidth.org/223757.html&quot; rel=&quot;nofollow&quot;&gt;&lt;i&gt;Mozharness is a configuration-driven script harness&lt;/i&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;How is configuration specified in Mozharness?&lt;/b&gt;
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle&quot;&gt;&lt;li&gt;
A script can define an optional initial config, as a &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/scripts/mozmill_updates.py#l114&quot; rel=&quot;nofollow&quot;&gt;dictionary&lt;/a&gt; or a &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/test/test_base_config.py#l37&quot; rel=&quot;nofollow&quot;&gt;config file&lt;/a&gt;.
&lt;/li&gt;&lt;li&gt;
Next, if we specify &lt;code&gt;--config-file FILE&lt;/code&gt; on the command line, that file&apos;s contents will be added to &lt;code&gt;self.config&lt;/code&gt;.
&lt;li&gt;
Finally, command line options are added to &lt;code&gt;self.config&lt;/code&gt;.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
If the same config key is specified in multiple locations, the command line takes precedence over the config file, which takes precedence over the initial config [file].
&lt;br /&gt;
(&lt;code&gt;command line options &amp;gt; config file &amp;gt; initial config &amp;gt; initial config file&lt;/code&gt;)
&lt;/p&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;How does a script add command line options?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
The command line options are all &lt;a href=&quot;http://docs.python.org/library/optparse.html&quot; rel=&quot;nofollow&quot;&gt;optparse&lt;/a&gt;-based.
&lt;/p&gt;&lt;p&gt;
Since there&apos;s a &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/mozharness/base/config.py#l211&quot; rel=&quot;nofollow&quot;&gt;global list of command line arguments&lt;/a&gt; for all mozharness scripts, I&apos;m currently passing in an &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/scripts/sourcetool.py#l90&quot; rel=&quot;nofollow&quot;&gt;additional list&lt;/a&gt; from scripts to add to that global list.
&lt;/p&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;What does a config file look like?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
Here&apos;s a &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/configs/multi_locale/mozilla-central_linux-android.json&quot; rel=&quot;nofollow&quot;&gt;json&lt;/a&gt; config file, and a WIP &lt;a href=&quot;https://github.com/escapewindow/mozharness/blob/a0f12802c04dadf81232978f6284b5da6ad3a745/configs/users/aki/tablet1.py&quot; rel=&quot;nofollow&quot;&gt;python&lt;/a&gt; config file.
&lt;/p&gt;&lt;p&gt;
We can currently specify anything here. I have a &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/scripts/configtest.py&quot; rel=&quot;nofollow&quot;&gt;config file well-formedness checker&lt;/a&gt;, but I&apos;d love to test for misspellings or missing/extraneous config options as well.
&lt;/p&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;How do we set the config to read-only?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
This is handled by &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/mozharness/base/script.py#l475&quot; rel=&quot;nofollow&quot;&gt;locking&lt;/a&gt; the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/e76fdabbca55/mozharness/base/config.py#l97&quot; rel=&quot;nofollow&quot;&gt;ReadOnlyDict&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
I cover &lt;i&gt;why&lt;/i&gt; &lt;a href=&quot;http://escapewindow.dreamwidth.org/223757.html&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;br /&gt;&lt;p&gt;
&lt;b&gt;What is the volatile config?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
After locking the read-only config, mozharness dumps a copy of the running config in a file called &lt;code&gt;localconfig.json&lt;/code&gt;, which can be reused or inspected later.
&lt;/p&gt;&lt;p&gt;
If you specify set of &lt;i&gt;actions&lt;/i&gt; to run, that information will currently be saved with the rest of your config.  The next time someone runs the script with that config file, that set of non-default actions might be unexpected and undesirable.
&lt;/p&gt;&lt;p&gt;
Previously, I discarded action config before dumping that file. In the &lt;a href=&quot;https://github.com/escapewindow/mozharness/tree/talosrunner&quot; rel=&quot;nofollow&quot;&gt;talosrunner branch&lt;/a&gt;, I&apos;m now &lt;a href=&quot;https://github.com/escapewindow/mozharness/blob/talosrunner/mozharness/base/config.py#L419&quot; rel=&quot;nofollow&quot;&gt;moving action-specific config&lt;/a&gt; to self.config[&apos;volatile_config&apos;]; we&apos;ll have the choice whether to re-use that or ignore it in future runs.
&lt;/p&gt;&lt;p&gt;
If I ever fully support &lt;code&gt;--dry-run&lt;/code&gt; / &lt;code&gt;--noop&lt;/code&gt;, that will likely be another candidate for a volatile config option.
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
&lt;a href=&quot;http://escapewindow.com/mozharness/&quot; rel=&quot;nofollow&quot;&gt;mozharness home&lt;/a&gt;
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/329299.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/328639.html</guid>
  <pubDate>Fri, 30 Sep 2011 22:33:50 GMT</pubDate>
  <title>mozharness 0.4</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/328639.html</link>
  <description>&lt;p&gt;
I landed mozharness 0.4 today (&lt;a href=&quot;http://hg.mozilla.org/build/mozharness/rev/2091ae4c21ec&quot; rel=&quot;nofollow&quot;&gt;2091ae4c21ec&lt;/a&gt;).
&lt;/p&gt;&lt;p&gt;
Some notable points:
&lt;ul&gt;&lt;li&gt;
&lt;a href=&quot;http://escapewindow.com/mozharness/&quot; rel=&quot;nofollow&quot;&gt;documentation&lt;/a&gt;;
&lt;/li&gt;&lt;li&gt;
&lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/2091ae4c21ec/CHANGES#l37&quot; rel=&quot;nofollow&quot;&gt;python virtualenv creation&lt;/a&gt;;
&lt;/li&gt;&lt;li&gt;
&lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/2091ae4c21ec/CHANGES#l77&quot; rel=&quot;nofollow&quot;&gt;new MercurialVCS&lt;/a&gt; and &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/2091ae4c21ec/CHANGES#l228&quot; rel=&quot;nofollow&quot;&gt;sourcetool&lt;/a&gt;, based on &lt;a href=&quot;http://hg.mozilla.org/build/tools/file/ae083c31d789/lib/python/util/hg.py&quot; rel=&quot;nofollow&quot;&gt;lib/python/util/hg&lt;/a&gt; and &lt;a href=&quot;http://hg.mozilla.org/build/tools/file/ae083c31d789/buildfarm/utils/hgtool.py&quot; rel=&quot;nofollow&quot;&gt;hgtool&lt;/a&gt; (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=650882&quot; rel=&quot;nofollow&quot;&gt;bug 650882&lt;/a&gt;);
&lt;/li&gt;&lt;li&gt;
&lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/2091ae4c21ec/CHANGES#l254&quot; rel=&quot;nofollow&quot;&gt;more&lt;/a&gt; &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/2091ae4c21ec/CHANGES#l265&quot; rel=&quot;nofollow&quot;&gt;mixins&lt;/a&gt; to avoid duplication of code;
&lt;/li&gt;&lt;li&gt;
other than &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=690911&quot; rel=&quot;nofollow&quot;&gt;bug 690911&lt;/a&gt;, &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/2091ae4c21ec/CHANGES#l121&quot; rel=&quot;nofollow&quot;&gt;mozharness unit tests now pass on windows and linux&lt;/a&gt;.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
These changes are largely behind the scenes.&lt;br /&gt;
However, work is already under way on &lt;a href=&quot;https://github.com/escapewindow/mozharness/tree/talosrunner&quot; rel=&quot;nofollow&quot;&gt;talosrunner&lt;/a&gt; (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=650890&quot; rel=&quot;nofollow&quot;&gt;bug 640890&lt;/a&gt; and &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=650887&quot; rel=&quot;nofollow&quot;&gt;bug 650887&lt;/a&gt;); more on that in a bit.
&lt;/p&gt;&lt;p&gt;
&lt;br /&gt;
(&lt;a href=&quot;http://escapewindow.dreamwidth.org/223757.html&quot; rel=&quot;nofollow&quot;&gt;What is mozharness?&lt;/a&gt;)
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/328639.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/328024.html</guid>
  <pubDate>Thu, 14 Jul 2011 03:21:27 GMT</pubDate>
  <title>6.0b2: the first combined desktop/mobile release</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/328024.html</link>
  <description>&lt;img src=&quot;http://darksecretlove.com/images/lj/2011/0713_dualrelease.png&quot; /&gt;

&lt;p&gt;
Firefox 6.0b2 is the first combined release: Firefox desktop and Firefox for Mobile running in the same automation, run by the same release engineer.
&lt;/p&gt;&lt;p&gt;
I remember talking about this with &lt;a href=&quot;http://oduinn.com/&quot; rel=&quot;nofollow&quot;&gt;John O&apos;Duinn&lt;/a&gt; in pie-in-the-sky brainstorming sessions back in Building K a few years ago, back before Fennec 1.0. It seemed so far away, then. It&apos;s a bit surreal seeing it run now.
&lt;/p&gt;&lt;p&gt;
A large part of the team chipped in on this one, but &lt;a href=&quot;http://blog.mozilla.com/rail/&quot; rel=&quot;nofollow&quot;&gt;Rail&lt;/a&gt; did most of the heavy lifting. Thank you Rail!
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/328024.html</comments>
  <category>fennec</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/326666.html</guid>
  <pubDate>Thu, 07 Apr 2011 00:55:39 GMT</pubDate>
  <title>mobile-browser is dead; long live mozilla-central/mobile !</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/326666.html</link>
  <description>&lt;p&gt;
The mobile-browser repo is now a subdirectory of mozilla-central.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mozilla-central-based project branches will need to re-sync from m-c to go green.&lt;/li&gt;
&lt;li&gt;Outstanding patches will need to be applied accordingly.&lt;/li&gt;
&lt;li&gt;If there are any outstanding un-ack&apos;ed issues as a result of this merge, please ping me and file a mozilla.org::Release Engineering bug.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
On Try, we can still build older, non-mobile-merge builds (e.g., a Fennec 4.0-based patch) by using the mobile-repo and mobile-rev special files as described &lt;a href=&quot;http://blog.johnford.info/mobile-on-the-new-try-server/&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/326666.html</comments>
  <category>fennec</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/326560.html</guid>
  <pubDate>Tue, 05 Apr 2011 10:45:51 GMT</pubDate>
  <title>mozharness 0.3</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/326560.html</link>
  <description>&lt;p&gt;
I&apos;ve been too busy to announce the landing of mozharness 0.3 on March 5.
&lt;/p&gt;&lt;p&gt;
I&apos;m no longer completely embarrassed by the code. (I consider that the most important feature of v 0.3.)  Further details are here: &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=628571#c1&quot; rel=&quot;nofollow&quot;&gt;bug 628571, comment 1&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
This is still a work in progress, as evidenced by both the version number and my lengthy mozharness todo list.
&lt;/p&gt;&lt;p&gt;
The list of problems which mozharness can help solve in the near future is growing, even as the harness evolves and stabilizes.
&lt;/p&gt;&lt;p&gt;
For those at the Mozilla All Hands this week, I&apos;ll be discussing mozharness with the A-Team (schedule TBD; I&apos;m thinking Thursday, 11am PDT).  If others wish to join, or set up alternate meetings, please comment or email &amp;lt;aki AT mozilla DOT com&amp;gt;
&lt;/p&gt;&lt;p&gt;
(&lt;a href=&quot;http://escapewindow.dreamwidth.org/223757.html&quot; rel=&quot;nofollow&quot;&gt;what is mozharness?&lt;/a&gt;&lt;br /&gt; &lt;a href=&quot;http://hg.mozilla.org/build/mozharness&quot; rel=&quot;nofollow&quot;&gt;mozharness source&lt;/a&gt;)
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/326560.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/326321.html</guid>
  <pubDate>Thu, 17 Mar 2011 09:00:11 GMT</pubDate>
  <title>tl;dr 4.0.x branching</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/326321.html</link>
  <description>&lt;p&gt;
In case &lt;a href=&quot;http://oduinn.com/blog/2011/03/09/branch-mechanics-for-firefox4-0-fennec4-0/&quot; rel=&quot;nofollow&quot;&gt;John&apos;s branching blog post&lt;/a&gt; was tl;dr:
&lt;/p&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot;&gt;
&lt;tr&gt;&lt;th&gt;
Mozilla branch
&lt;/th&gt;&lt;th&gt;
Mobile branch
&lt;/th&gt;&lt;th&gt;
Firefox desktop version
&lt;/th&gt;&lt;th&gt;
Firefox mobile (Fennec) version
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;a href=&quot;http://hg.mozilla.org/mozilla-central&quot; rel=&quot;nofollow&quot;&gt;mozilla-central&lt;/a&gt;
&lt;/td&gt;&lt;td&gt;
&lt;a href=&quot;http://hg.mozilla.org/mobile-browser&quot; rel=&quot;nofollow&quot;&gt;mobile-browser&lt;/a&gt; &lt;sup&gt;&lt;small&gt;[1]&lt;/small&gt;&lt;/sup&gt;
&lt;/td&gt;&lt;td&gt;
Firefox Next
&lt;/td&gt;&lt;td&gt;
Fennec Next
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;a href=&quot;http://hg.mozilla.org/releases/mozilla-2.0&quot; rel=&quot;nofollow&quot;&gt;mozilla-2.0&lt;/a&gt;
&lt;/td&gt;&lt;td style=&quot;background-color: grey&quot; bgcolor=&quot;grey&quot;&gt;
N/A
&lt;/td&gt;&lt;td&gt;
Firefox 4.0[.x]
&lt;/td&gt;&lt;td style=&quot;background-color: grey&quot; bgcolor=&quot;grey&quot;&gt;
N/A
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;a href=&quot;http://hg.mozilla.org/releases/mozilla-2.1&quot; rel=&quot;nofollow&quot;&gt;mozilla-2.1&lt;/a&gt;
&lt;/td&gt;&lt;td&gt;
&lt;a href=&quot;http://hg.mozilla.org/releases/mobile-2.0&quot; rel=&quot;nofollow&quot;&gt;mobile-2.0&lt;/a&gt;
&lt;/td&gt;&lt;td style=&quot;background-color: grey&quot; bgcolor=&quot;grey&quot;&gt;
N/A
&lt;/td&gt;&lt;td&gt;
Fennec 4.0[.x]
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
[1]: We&apos;re still debating whether we&apos;re going to &lt;a href=&quot;https://wiki.mozilla.org/User:Asasaki:MBMerge&quot; rel=&quot;nofollow&quot;&gt;merge mobile-browser in&lt;/a&gt;.
&lt;/p&gt;
&lt;br /&gt;
And for l10n:
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot;&gt;
&lt;tr&gt;&lt;th&gt;
Firefox desktop version
&lt;/th&gt;&lt;th&gt;
Firefox mobile (Fennec) version
&lt;/th&gt;&lt;th&gt;
L10n repo directory
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
Firefox Next
&lt;/td&gt;&lt;td&gt;
Fennec Next
&lt;/td&gt;&lt;td&gt;
&lt;a href=&quot;http://hg.mozilla.org/l10n-central&quot; rel=&quot;nofollow&quot;&gt;l10n-central&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
Firefox 4.0[.x]
&lt;/td&gt;&lt;td&gt;
Fennec 4.0[.x]
&lt;/td&gt;&lt;td&gt;
&lt;a href=&quot;http://hg.mozilla.org/releases/l10n-mozilla-2.0&quot; rel=&quot;nofollow&quot;&gt;l10n-mozilla-2.0&lt;/a&gt; &lt;sup&gt;&lt;small&gt;[2]&lt;/small&gt;&lt;/sup&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
[2]: We&apos;re using the same set of l10n-mozilla-2.0 repos for both Firefox 4.0.x and Fennec 4.0.x.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/326321.html</comments>
  <category>fennec</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/322870.html</guid>
  <pubDate>Thu, 18 Nov 2010 12:19:45 GMT</pubDate>
  <title>dispelling some mozharness fallacies</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/322870.html</link>
  <description>&lt;p&gt;
My previous blog post, &lt;a href=&quot;http://drkscrtlv.livejournal.com/322809.html&quot; rel=&quot;nofollow&quot;&gt;what is mozharness?&lt;/a&gt;, appears to have &lt;a href=&quot;http://groups.google.com/group/mozilla.dev.planning/browse_thread/thread/b6e801da34641ec6&quot; rel=&quot;nofollow&quot;&gt;caused some dismay&lt;/a&gt;.&lt;br /&gt;
I&apos;m writing this to answer Axel&apos;s invitation to respond, and to clear up some misconceptions about mozharness.
&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;mozharness_assertions&quot;&gt;
&lt;div style=&quot;border: thin solid #660000; padding: 1em;&quot;&gt;&lt;p&gt;
&lt;b&gt;[assertions]&lt;/b&gt;
&lt;/p&gt;&lt;ol style=&quot;list-style-type: lower-roman&quot;&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;Respect for Mozilla l10n.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
This conversation is larger than just localization.  However, the above thread brings up l10n specifically, and the first two mozharness scripts involve l10n, so here are my high-level thoughts:
&lt;/p&gt;&lt;p&gt;
I remain highly impressed with the state of l10n at Mozilla: the sheer number of locales, the contributions of volunteer localizers, the &lt;i&gt;sim-shipping of localized releases with en-US releases&lt;/i&gt;.  Never have I seen localization done anywhere near so efficiently and well, anywhere in software.  I believe strongly that this is key to Firefox&apos;s success.  And Axel is a significant part of that.
&lt;/p&gt;&lt;p&gt;
I also believe that however good our localization story may be, there&apos;s definitely room for improvement.&lt;br /&gt;
We seem to disagree as to how to improve that story for the moment.
&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;Mozharness is imperfect software with time-tested concepts.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
I will be the first to admit that mozharness is imperfect. I&apos;m self-taught. Python is a relatively new language to me. I wrote mozharness to solve complex problems with tight deadlines.  Mozharness, as it exists today, is essentially non-feature-complete beta software.
&lt;/p&gt;&lt;blockquote&gt;&lt;small&gt;
(With that in mind, I will be speaking about what mozharness &lt;i&gt;could be&lt;/i&gt;, in forward-thinking statements.  Saying &quot;Nothing prevents us from doing ____&quot; does not mean it&apos;ll take zero development/testing/roll out time. I am speaking about technical feasibility only.)
&lt;/small&gt;&lt;/blockquote&gt;&lt;p&gt;
However, the &lt;i&gt;concepts&lt;/i&gt; behind mozharness are lessons I&apos;ve learned over the years.  Usually the hard way.&lt;br /&gt;
I&apos;m open to changing mozharness&apos; specific implementation details, but I strongly believe the concepts themselves are right.&lt;br /&gt;
It falls on my shoulders to communicate those clearly.
&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;Buildbot was not written to micromanage slaves.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
The above statement sums up my first conversation with &lt;a href=&quot;http://www.lothar.com/&quot; rel=&quot;nofollow&quot;&gt;Brian Warner&lt;/a&gt;, where we vehemently agreed that too much complex logic had been relegated to Mozilla&apos;s buildbot masters.
&lt;/p&gt;&lt;p&gt;
Even if one ignores his original intent, I assert that moving complex logic from an overloaded master to its relatively unloaded slaves will be
&lt;ol style=&quot;list-style-type: lower-alpha&quot;&gt;
&lt;li&gt;more efficient&lt;/li&gt;
&lt;li&gt;more scalable&lt;/li&gt;
&lt;li&gt;more portable&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;
I&apos;ll revisit this, and the other assertions, in the next three sections.
&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;mozharness_fallacy1&quot;&gt;
&lt;div style=&quot;border: thin solid #006600; padding: 1em;&quot;&gt;&lt;p&gt;
&lt;b&gt;[fallacy #1: mozharness will make {builds,tests,repacks} less granular]&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
This can be split into two concerns: granularity of status, and granularity of easy-to-replicate steps.  &lt;small&gt;This is going to be a long section; I still haven&apos;t fully convinced everyone on my own team about these points.&lt;/small&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;Mozharness can sum up status at the end of jobs.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
I don&apos;t want to spend this &lt;i&gt;entire&lt;/i&gt; post talking about abstractions and what mozharness &lt;i&gt;could be&lt;/i&gt; if this nebulous vision in my head somehow sees the light of day. So here&apos;s a concrete example that exists today.
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/bb8ae419ccaa/scripts/signdebs.py&quot; rel=&quot;nofollow&quot;&gt;signdebs.py&lt;/a&gt; outputs a summary at the end of every log:
&lt;/p&gt;&lt;blockquote&gt;&lt;code&gt;
19:29:25     INFO - #####&lt;br /&gt;
19:29:25     INFO - ##### MaemoDebSigner summary:&lt;br /&gt;
19:29:25     INFO - #####&lt;br /&gt;
19:29:25    ERROR - Can&apos;t download http://stage.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo5-gtk-l10n/he/fennec_4.0~b3~20101117005726_armel.deb; skipping he on fremantle&lt;br /&gt;
19:29:25    ERROR - Can&apos;t download http://stage.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo5-gtk-l10n/ja/fennec_4.0~b3~20101117005726_armel.deb; skipping ja on fremantle&lt;br /&gt;
19:29:25    ERROR - Can&apos;t download http://stage.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo5-gtk-l10n/ja-JP-mac/fennec_4.0~b3~20101117005726_armel.deb; skipping ja-JP-mac on fremantle&lt;br /&gt;
19:29:25    ERROR - Can&apos;t download http://stage.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo5-qt-l10n/he/fennec_4.0~b3~20101117010937_armel.deb; skipping he on fremantle-qt&lt;br /&gt;
19:29:25    ERROR - Can&apos;t download http://stage.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo5-qt-l10n/ja/fennec_4.0~b3~20101117010937_armel.deb; skipping ja on fremantle-qt&lt;br /&gt;
19:29:25    ERROR - Can&apos;t download http://stage.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo5-qt-l10n/ja-JP-mac/fennec_4.0~b3~20101117010937_armel.deb; skipping ja-JP-mac on fremantle-qt&lt;br /&gt;
19:29:25     INFO - Uploaded multi on fremantle successfully.&lt;br /&gt;
19:29:25     INFO - Uploaded en-US on fremantle successfully.&lt;br /&gt;
19:29:25     INFO - Uploaded ar on fremantle successfully.&lt;br /&gt;
19:29:25     INFO - Uploaded be on fremantle successfully.&lt;br /&gt;
19:29:25     INFO - Uploaded ca on fremantle successfully.&lt;br /&gt;
19:29:25     INFO - Uploaded cs on fremantle successfully.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;... snip 76 more lines of &quot;Uploaded ___ on ___ succesfully.&quot;&lt;/i&gt;
&lt;/code&gt;&lt;/blockquote&gt;&lt;p&gt;
I&apos;d love for this to be prettier and take fewer lines, like &quot;82/88 deb repos uploaded successfully!&quot; with more verbose information about the ones that failed.  But again, deadlines, and pretty statuses were not a hard requirement.
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle&quot;&gt;
&lt;li&gt;What&apos;s keeping us from emailing this summary somewhere? Nothing.&lt;/li&gt;
&lt;li&gt;What&apos;s keeping us from updating a database or hitting a cgi with this status? Nothing.&lt;/li&gt;
&lt;li&gt;What&apos;s keeping us from sending out a Pulse message with this info? Probably the fact that I know very very little about how to send a Pulse message. Other than that, probably nothing.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
We&apos;ll want to make those updates conditional, &lt;code&gt;if &quot;notify-pulse&quot; in self.actions:&lt;/code&gt;, for example, so staging or development runs don&apos;t attempt to send production status messages.  But if it can be done in a script, it can be done at the end of any mozharness script.
&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;Mozharness can update status &lt;i&gt;during&lt;/i&gt; jobs.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
What&apos;s keeping us from updating status in the middle of a &lt;code&gt;for &lt;i&gt;locale&lt;/i&gt; in &lt;i&gt;locales&lt;/i&gt;:&lt;/code&gt; for loop, for example? NOTHING.
&lt;/p&gt;&lt;p&gt;
Though it is more expensive.  If you want to hit a cgi, for example, mid-&lt;i&gt;for&lt;/i&gt;-loop, then that cgi needs to be up and available the entirety of every script run (or the script needs to fail gracefully, or have retry logic, or queueing logic, or whatever.) You need to decide when the cost of faster status updates is worth the effort, since post-processing tends to be less expensive.
&lt;/p&gt;&lt;p&gt;
There is nothing preventing us from doing so, however, if the need outweighs the cost of updating status throughout the script.&lt;br /&gt;
If it can be done in a script, it can be done inside of any mozharness for loop.
&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;Mozharness parses its own logs &lt;i&gt;during&lt;/i&gt; runCommand() calls already.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
The &lt;code&gt;&lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/bb8ae419ccaa/lib/base/script.py#l217&quot; rel=&quot;nofollow&quot;&gt;runCommand()&lt;/a&gt;&lt;/code&gt; method uses pre-defined &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/bb8ae419ccaa/lib/base/errors.py#l16&quot; rel=&quot;nofollow&quot;&gt;error lists&lt;/a&gt; to determine whether specific lines in the log are errors.
&lt;/p&gt;&lt;p&gt;
These are far from complete, and need to be fleshed out further, but the framework is there.
&lt;/p&gt;&lt;p&gt;
Recently, I thought we should add a &lt;code&gt;summary&lt;/code&gt; (or somesuch) key to that list of dictionaries.  We could, say, add a &lt;code&gt;substr&lt;/code&gt; of &lt;code&gt;&quot;Assertion failure: !(addr &amp;amp; GC_CELL_MASK)&quot;&lt;/code&gt; with a custom &lt;code&gt;level&lt;/code&gt; of &lt;code&gt;intermittent_orange&lt;/code&gt; (somewhere between &lt;code&gt;info&lt;/code&gt; and &lt;code&gt;warning&lt;/code&gt;?) and a &lt;code&gt;summary&lt;/code&gt; of &lt;code&gt;&quot;Intermittent orange: This looks like &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=583554&quot; rel=&quot;nofollow&quot;&gt;bug 583554&lt;/a&gt;!&quot;&lt;/code&gt;
&lt;/p&gt;&lt;p&gt;
As long as we&apos;re in conjecture-land, we can combine this with a post- or mid-job status update that can populate an intermittent orange database with the specific details of this job.
&lt;/p&gt;&lt;p&gt;
Awesome or not awesome? You vote.
&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;Mozharness can create buildbot-parseable status.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
This point&apos;s reverse could be a top level fallacy in itself.
&lt;/p&gt;&lt;p&gt;
There are two approaches here.
&lt;/p&gt;&lt;p&gt;
If it&apos;s a hard requirement that we lose none of the &quot;granularity&quot; of the existing buildbot steps, nothing prevents us from creating an &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/bb8ae419ccaa/lib/base/config.py#l352&quot; rel=&quot;nofollow&quot;&gt;action list&lt;/a&gt; that encapsulates each buildbot action.
&lt;/p&gt;&lt;p&gt;
Then you can &lt;code&gt;script.py --only-set-props-builddir&lt;/code&gt;, for example.  A buildbot &lt;code&gt;addStep([&apos;python&apos;, &apos;script.py&apos;, &apos;--only-%s&apos; % stepName])&lt;/code&gt; for every single thrilling step in the one-hundred-one steps &lt;a href=&quot;http://l10n.mozilla.org/bounty/build/1895091&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Can you? Yes. Do you want to? I would argue no.
&lt;/p&gt;&lt;p&gt;
Do developers really care if buildbot step #73 dies with python exception ____? Or do they only really care if compilation fails on file X at line Y (link to hg annotate with appropriate finger pointing here)?
&lt;/p&gt;&lt;blockquote&gt;&lt;small&gt;
(What if we tied in a ping in #developers or an email message for the suspected culprit in the &lt;code&gt;notify&lt;/code&gt; action? Not free, in terms of mozharness development time, but is it doable in scripts? Seems like it, to me.)
&lt;/small&gt;&lt;/blockquote&gt;&lt;p&gt;
Do localizers really care if buildbot step #45 dies with compare-locales exception ___? Or do they just want a description of which strings are missing, or which XML files need updating, with a link to a wiki page on how to fix those things?
&lt;/p&gt;&lt;p&gt;
The second approach could involve writing a buildbot-property parseable file during or at the end of the mozharness script, and adding a buildbot &lt;code&gt;addStep(SetProperty(&quot;cat filename&quot;))&lt;/code&gt; afterwards to set buildbot-statusdb-parseable buildbot properties.
&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;Mozharness could create a step-summary log.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
As I explained in my &lt;a href=&quot;http://drkscrtlv.livejournal.com/322809.html&quot; rel=&quot;nofollow&quot;&gt;previous blog post&lt;/a&gt;, I lean very heavily towards more verbosity than less, though you could &lt;code&gt;--log-level error&lt;/code&gt; (or w/e) to ignore most of this verbosity.
&lt;/p&gt;&lt;p&gt;
In a &lt;code&gt;--multi-log&lt;/code&gt; run, I could add a step-level log. Basically, any calls to the &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/file/bb8ae419ccaa/lib/base/script.py#l19&quot; rel=&quot;nofollow&quot;&gt;BaseScript&lt;/a&gt; wrapper methods could also write their equivalent to a log.
&lt;/p&gt;&lt;blockquote&gt;&lt;small&gt;
(Huh??? English, do you speak it?)
&lt;/small&gt;&lt;/blockquote&gt;&lt;p&gt;
If we cared enough about this, we could create yet another log file. The BaseScript.chdir() method could output &lt;code&gt;cd DIRNAME&lt;/code&gt; to this log. And the &lt;code&gt;BaseScript.runCommand()&lt;/code&gt; method could write its command line to this log file, and so on.  This log file would approach being an executable shell script.
&lt;/p&gt;&lt;p&gt;
I say approach since there aren&apos;t always going to be universal scriptable equivalents.  But this would be an &lt;i&gt;improvement&lt;/i&gt; over the status quo.
&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;p&gt;
&lt;b&gt;High-level granularity is not always desirable.&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
So you&apos;re a developer or a localizer.  You&apos;ve painstakingly set up scratchbox to the point where it works (congratulations!!). You now want to attempt a Maemo multilocale build without checking into the tree and either requesting or waiting for a nightly.  What steps do you follow?
&lt;/p&gt;&lt;p&gt;
You could drill down into the &lt;a href=&quot;http://l10n.mozilla.org/bounty/build/1895091&quot; rel=&quot;nofollow&quot;&gt;101 buildbot steps&lt;/a&gt;, each with python-list-format command lines, and full env dumps per step.  Granular, no?  Run each one, with appropriate env settings, and then it should work! Maybe! Have fun!
&lt;/p&gt;&lt;p&gt;
Or you could take a &lt;small&gt;[yet to be written, but next in line]&lt;/small&gt; mozharness script, a config file that&apos;s oriented towards standalone developers (you may have to edit paths), and an example command line, and run it.  It should hopefully either give you a descriptive error message (and ultra-verbose logs), or a usable multilocale deb file.
&lt;/p&gt;&lt;p&gt;
Which would you prefer?  (Don&apos;t let me influence your decision.)
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;mozharness_fallacy2&quot;&gt;
&lt;div style=&quot;border: thin solid #000066; padding: 1em;&quot;&gt;&lt;p&gt;
&lt;b&gt;[fallacy #2: a script means complex undecipherable command lines]&lt;/b&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;small&gt;
(Phew! That last section was a doozy, wasn&apos;t it? This section will be shorter, I promise!!)
&lt;/small&gt;&lt;/blockquote&gt;&lt;p&gt;
This section also has a couple components, though much shorter.
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;
First, Ben&apos;s work in &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=608004&quot; rel=&quot;nofollow&quot;&gt;bug 608004&lt;/a&gt; is not mozharness.
&lt;/p&gt;&lt;p&gt;
Is it a step in that direction? Sure, it&apos;s moving logic out of buildbot towards slave-side python scripts. Does that mean it&apos;s mozharness? No.  Are we considering merging tools/lib/python code into mozharness? Yes.  But it&apos;s not reality yet.
&lt;/p&gt;&lt;p&gt;
I haven&apos;t looked at his patch; I&apos;ve been bogged down trying to fix the Android Tegras. And writing this lengthy blog post. But it is not mozharness.
&lt;/p&gt;&lt;p&gt;
Could it be ported to mozharness? In my eyes, yes, easily, without even looking at the code.  I&apos;ve thought about writing this script in mozharness myself in my &quot;spare time&quot;. But again, I haven&apos;t looked at the patch.
&lt;/p&gt;&lt;p&gt;
Could it be reliant on long command line arguments? Sure, that&apos;s probably the case outside of mozharness.  But that&apos;s not what I&apos;m discussing in this blog post.
&lt;/p&gt;&lt;p&gt;
The only two scripts in mozharness, as of this writing, are for Maemo deb signing and Android multilocale.
&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;
Second, in mozharness, practically every option that&apos;s specifiable via commandline is specifiable in a config file.
&lt;/p&gt;&lt;p&gt;
What does this mean? You certainly &lt;i&gt;could&lt;/i&gt; specify a massive command line that challenges &lt;code&gt;ARG_MAX&lt;/code&gt; every single time.  Or, if you find yourself doing this often, you could save all of that in a config file (json only, currently, but we can add .py or other filetype support relatively easily) and just run &lt;code&gt;path/to/script.py --config-file path/to/config/file&lt;/code&gt; .
&lt;/p&gt;&lt;p&gt;
In fact, right now any mozharness script will look, by default, for &lt;code&gt;./localconfig.json&lt;/code&gt; and use that if no &lt;code&gt;--config-file&lt;/code&gt; is specified.  I&apos;m debating whether this might actually be harmful in production systems, but can you really get much simpler than &lt;code&gt;path/to/script.py&lt;/code&gt;? Or &lt;code&gt;python path/to/script.py&lt;/code&gt; if your &lt;code&gt;#!&lt;/code&gt; support is broken.
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;mozharness_fallacy3&quot;&gt;
&lt;div style=&quot;border: thin solid #660066; padding: 1em;&quot;&gt;&lt;p&gt;
&lt;b&gt;[fallacy #3: mozharness will replace all of buildbot]&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
Is mozharness powerful enough to replace all of the complex &lt;a href=&quot;http://hg.mozilla.org/build/buildbotcustom/file/5d0f94deaa25/process/factory.py&quot; rel=&quot;nofollow&quot;&gt;buildbotcustom.process.factory&lt;/a&gt; logic in buildbot? Absolutely.
&lt;/p&gt;&lt;p&gt;
Is that my short term goal? No.  I have &lt;i&gt;real&lt;/i&gt; bugs to fix. Blockers for shipping real product. Replacing working code with a rewrite-without-urgent-need is at the &lt;i&gt;bottom&lt;/i&gt; of my todo list.
&lt;/p&gt;&lt;p&gt;
The reasons I wrote however much of mozharness I did include:
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle&quot;&gt;
&lt;li&gt;RelEng has been considering ways to move build logic to slave-side scripts, and this is my proof-of-concept&lt;/li&gt;
&lt;li&gt;I&apos;ve been trying to solve real problems with real deadlines.  Like &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=525327&quot; rel=&quot;nofollow&quot;&gt;MultiNightlyL10n&lt;/a&gt; being the only real blocker to moving the mobile build infrastructure from the crufty buildbot-0.7 branch to the supported and shiny default 0.8.x branch.&lt;/li&gt;
&lt;li&gt;I do secretly hope that the community will buy into this, to the point where I can afford to spend the time to do this. Because, if I haven&apos;t made it &lt;a href=&quot;#mozharness_assertions&quot; rel=&quot;nofollow&quot;&gt;clear&lt;/a&gt; by this point, I believe in this.  But if there&apos;s no immediate goal or community buy-in, that&apos;s a huge task to tackle.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
I mean, the barrier of entry to buildbot is... high.  First, install buildbot! Then, navigate our &lt;a href=&quot;http://hg.mozilla.org/build/buildbot-configs&quot; rel=&quot;nofollow&quot;&gt;buildbot-configs&lt;/a&gt; and &lt;a href=&quot;http://hg.mozilla.org/build/buildbotcustom&quot; rel=&quot;nofollow&quot;&gt;buildbotcustom&lt;/a&gt; repos (easy!), set up your master, then set up a slave that points to the master, then somehow use the appropriate one of the six buildbot methods to trigger a build/test/repack that you want, and debug from there.
&lt;/p&gt;&lt;p&gt;
Or, check out this repo, potentially modify this config file that&apos;s tailored to your use case, and run this script.  You&apos;ll either get a [hopefully] useful error message, or your
&amp;lt;select ... &amp;gt;
&amp;lt;option ... &amp;gt;(while i&apos;m promising the moon, select one)&amp;lt;/option&amp;gt;
&amp;lt;option ... &amp;gt;multilocale build&amp;lt;/option&amp;gt;
&amp;lt;option ... &amp;gt;l10n repack&amp;lt;/option&amp;gt;
&amp;lt;option ... &amp;gt;standalone talos performance results&amp;lt;/option&amp;gt;
&amp;lt;option ... &amp;gt;orange intermittent test results&amp;lt;/option&amp;gt;
&amp;lt;option ... &amp;gt;pgo build&amp;lt;/option&amp;gt;
&amp;lt;option ... &amp;gt;WHATEVER A SCRIPT CAN DO&amp;lt;/option&amp;gt;
&amp;lt;option ... &amp;gt;THAT WE FEEL IS WORTH THE TIME TO WRITE&amp;lt;/option&amp;gt;
&amp;lt;option ... &amp;gt;&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt; with verbose logs and python source to tweak if you want to delve into this shit.
&lt;/p&gt;&lt;p&gt;
But am I going to volunteer to port all of that stuff if people aren&apos;t into it? Fuck no. I will argue this to the ground, evidently, because I&apos;ve thought about this stuff for years and years.  This blog post may end up being my own personal &lt;a href=&quot;http://ha.ckers.org/blog/20070803/mozilla-says-ten-fucking-days/&quot; rel=&quot;nofollow&quot;&gt;ten fucking days&lt;/a&gt; rubicon, with its forward-thinking year&apos;s worth of &quot;we could do this!&quot; statements.  But I still feel like I haven&apos;t touched on everything I&apos;ve thought about over the years.  And I&apos;m defending my not-yet-fully-formed mozharness against allegations that it&apos;s going to be &lt;i&gt;harmful&lt;/i&gt; for some reason.
&lt;/p&gt;&lt;p&gt;
Even if we did port all of factory.py to mozharness, buildbot&apos;s ability to queue and manage multiple build slave pools is a level above and beyond mozharness.
&lt;/p&gt;&lt;p&gt;
......... If this section seems less coherent and well-thought out compared to the previous sections,
&lt;/p&gt;&lt;ul style=&quot;list-style-type: circle&quot;&gt;
&lt;li&gt;tired&lt;/li&gt;
&lt;li&gt;late&lt;/li&gt;
&lt;li&gt;bourbon&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;
Ok. It&apos;s late. I&apos;m getting punchy. My profanity-to-signal ratio is rising sharply. I&apos;ve written a diatribe that is probably the longest post on a &lt;i&gt;script harness&lt;/i&gt; EVAR. And I have a nine-&lt;i&gt;fucking&lt;/i&gt;-o-clock meeting I have to be up for.  And coherent.
&lt;/p&gt;&lt;p&gt;
I&apos;m stopping this post right meow.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;[EDIT]:&lt;/b&gt; (let&apos;s just pretend dreamwidth/eljay didn&apos;t munge my select/option tags, shall we?)&lt;/p&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/322870.html</comments>
  <category>buildbot</category>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/322809.html</guid>
  <pubDate>Mon, 15 Nov 2010 19:31:27 GMT</pubDate>
  <title>what is mozharness?</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/322809.html</link>
  <description>&lt;p&gt;
I&apos;ve been relatively quiet about mozharness since it&apos;s still a work in progress.  It seems to be gaining some traction, however, so here&apos;s an attempt at a one line description of what mozharness is, or at least &lt;i&gt;will be&lt;/i&gt;:
&lt;/p&gt;&lt;blockquote&gt;
Mozharness is a configuration-driven script harness with full logging that allows production infrastructure and individual developers to use the same scripts.
&lt;/blockquote&gt;&lt;p&gt;
I&apos;m sure I&apos;ll want to amend that at some point, but that works for now.  Delving a bit deeper into that statement, still at a high level:
&lt;/p&gt;
&lt;div style=&quot;border: thin solid #660000; padding: 1em;&quot;&gt;&lt;p&gt;
&lt;b&gt;[i: Configuration-driven]&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
At a previous job, I had to wrangle 70,000+ lines of intertangled spaghetti perl.  The original config file you gave the system often had very little to do with the workflow and end result, since hardcodes and runtime configuration shifts were liberally applied throughout the codebase.  Debugging a shifting config setting which might be set to four different values at different points in the script can be extremely frustrating.  As a direct result, my replacement code was strictly, strictly configuration-driven.  Mozharness follows this path.
&lt;/p&gt;&lt;p&gt;
After parsing the script-level config defaults, the optional configuration file, and command line arguments, mozharness dumps the script&apos;s running configuration in a reusable config file format (currently json), and &lt;b&gt;locks the running configuration&lt;/b&gt;.
&lt;/p&gt;&lt;p&gt;
To quote myself from &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=606963#c6&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;,
&lt;/p&gt;&lt;blockquote&gt;&lt;code&gt;
Any time you&apos;re trying to get around this lock, you&apos;re probably doing things
wrong.  It&apos;s strict, it&apos;s possibly a pain, it forces you to think about
configuration first and config-driven behavior later.  I try to think of ways
around it as well, and bend the rules sometimes.  But all in all, in my entire
career, I&apos;ve never been unhappy to know exactly what to expect from a script if
I look at the config file + command line options.  I can&apos;t say the same about
mid-script configuration changes.
&lt;/code&gt;&lt;/blockquote&gt;&lt;p&gt;
The dumped configuration file can be uploaded along with the logs and resulting binaries (if appropriate) for later perusal, debugging, and/or reuse.
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div style=&quot;border: thin solid #006600; padding: 1em;&quot;&gt;&lt;p&gt;
&lt;b&gt;[ii: Log everything]&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
When debugging a script, verbose and &lt;i&gt;complete&lt;/i&gt; logs can very much be your friend.  A paraphrased conversation from a previous job:
&lt;/p&gt;&lt;blockquote&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;10&quot;&gt;
&lt;tr&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot; valign=&quot;top&quot;&gt;Boss&apos; boss: &lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;Do we have full logs for all of that?&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;Me: &lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;No.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;Boss: &lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;Yes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;Me: &lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;No we don&apos;t.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;Boss: &lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;Yes we do.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;Me: &lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;We do not! I can point out a hundred places in our code where we don&apos;t.  Even if we did, we chdir, chmod, chown, rename, rmtree, system(), `backtick`, file open(), and a shit ton of other things that happen or fail silently, or get output to the console but not the logs. We. Do. Not. Log. Everything.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;Boss&apos; boss:&lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;That&apos;s hilarious. Did you guys rehearse this?&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/blockquote&gt;&lt;p&gt;
Soon afterwards I wrote my own replacement functions that did the same things, but with more error checking and full logging.  With timestamps, so we could tell when a particular step was suddenly taking a lot longer than it normally did.  And error parsing, with separate log files for fatal/critical/error/warning/info/debug (each a subset of the next), for easily finding the information you need.  Or way more information than you need.
&lt;/p&gt;&lt;p&gt;
Mozharness follows that path, but with 100% less perl.
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div style=&quot;border: thin solid #000066; padding: 1em;&quot;&gt;&lt;p&gt;
&lt;b&gt;[iii: Modular/portable scripts]&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
There are so many benefits to having scripts that can be run by various people in different roles and different machines.
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;it kills machine-specific hardcodes (these would go into config files)&lt;/li&gt;
&lt;li&gt;it requires documentation and some user-friendliness&lt;/li&gt;
&lt;li&gt;it forces the script to be modular&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
By &lt;i&gt;modular&lt;/i&gt;, here, I mean able to switch discrete portions of the script on or off depending on context.
&lt;/p&gt;&lt;p&gt;
For instance, a script that clobbers, pulls source, builds, packages, uploads the bits somewhere, and notifies people might insert status into a database and email tinderbox and a developer email list as part of the &quot;notify&quot; action.
&lt;/p&gt;&lt;p&gt;
A developer using the same script might not want to upload the build anywhere or notify anyone but herself at the end of it.  To effectively share the script, those actions need to be switched on or off at will, and configurable.
&lt;/p&gt;&lt;p&gt;
Similarly, someone writing and debugging the packaging or upload portion of the script would be best served not having to start from square 1 every test run.  Being able to run *only* the packaging or upload step would speed that up immensely. (Or re-running an intermitent orange test over and over without reinstalling, for example.)
&lt;/p&gt;&lt;p&gt;
As far as sharing production infrastructure scripts with developers, specifically, there are also these wins:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;developers can test with the same scripts that production infra uses, removing one variable&lt;/li&gt;
&lt;li&gt;developers can potentially provide useful patches to production infra, if they&apos;re so inclined&lt;/li&gt;
&lt;li&gt;it helps prevent Release Engineering&apos;s automation from being a black box&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
This sharing of scripts has been a long term goal of mine elsewhere, but I haven&apos;t seen it fully successful and widespread as of yet. I haven&apos;t given up on it.
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;
I think those three points provide a fairly good overview of mozharness.
&lt;/p&gt;&lt;p&gt;
The source for mozharness is &lt;a href=&quot;http://hg.mozilla.org/build/mozharness/&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.  Currently there are only scripts for creating Maemo deb repos and dealing with Android multilocale builds; this list will grow in the not too distant future.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/322809.html</comments>
  <category>mozharness</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/322139.html</guid>
  <pubDate>Sat, 23 Oct 2010 21:52:26 GMT</pubDate>
  <title>Android multilocale builds</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/322139.html</link>
  <description>&lt;p&gt;
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=563382&quot; rel=&quot;nofollow&quot;&gt;Android multilocale builds&lt;/a&gt; have landed, thanks to Coop, Mwu, Armenzg&apos;s previous work, and a little thing I call mozharness.  (More on that in a later post.)
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;These are active on mozilla-central nightly builds only.&lt;/li&gt;
&lt;li&gt;They are currently using the &lt;a href=&quot;http://hg.mozilla.org/mobile-browser/raw-file/default/locales/maemo-locales&quot; rel=&quot;nofollow&quot;&gt;Maemo multilocale locale list&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=596004&quot; rel=&quot;nofollow&quot;&gt;bug 596004&lt;/a&gt; is currently open to determine the set of android-specific locales to include.  I imagine this will result in a mobile-browser/locales/android-locales file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Index of &lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/&quot; rel=&quot;nofollow&quot;&gt;/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/blank.gif&quot; alt=&quot;[ICO]&quot;&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/?C=N;O=D&quot; rel=&quot;nofollow&quot;&gt;Name&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/?C=M;O=A&quot; rel=&quot;nofollow&quot;&gt;Last modified&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/?C=S;O=A&quot; rel=&quot;nofollow&quot;&gt;Size&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/?C=D;O=A&quot; rel=&quot;nofollow&quot;&gt;Description&lt;/a&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th colspan=&quot;5&quot;&gt;&lt;hr&gt;&lt;/th&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/back.gif&quot; alt=&quot;[DIR]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/&quot; rel=&quot;nofollow&quot;&gt;Parent Directory&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;  - &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/folder.gif&quot; alt=&quot;[DIR]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/&quot; rel=&quot;nofollow&quot;&gt;en-US/&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:45  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt;  - &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/fennec-4.0b2pre.multi.eabi-arm.apk&quot; rel=&quot;nofollow&quot;&gt;fennec-4.0b2pre.multi.eabi-arm.apk&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:47  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt; 14M&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/fennec-4.0b2pre.multi.eabi-arm.checksums&quot; rel=&quot;nofollow&quot;&gt;fennec-4.0b2pre.multi.eabi-arm.checksums&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:47  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt;714 &lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/compressed.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/fennec-4.0b2pre.multi.eabi-arm.tests.zip&quot; rel=&quot;nofollow&quot;&gt;fennec-4.0b2pre.multi.eabi-arm.tests.zip&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:47  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt; 38M&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/text.gif&quot; alt=&quot;[TXT]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/fennec-4.0b2pre.multi.eabi-arm.txt&quot; rel=&quot;nofollow&quot;&gt;fennec-4.0b2pre.multi.eabi-arm.txt&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:47  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt; 28 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/gecko-unsigned-unaligned.apk&quot; rel=&quot;nofollow&quot;&gt;gecko-unsigned-unaligned.apk&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:47  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt; 14M&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th colspan=&quot;5&quot;&gt;&lt;hr&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;

&lt;h3&gt;Index of &lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/&quot; rel=&quot;nofollow&quot;&gt;/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/blank.gif&quot; alt=&quot;[ICO]&quot;&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/?C=N;O=D&quot; rel=&quot;nofollow&quot;&gt;Name&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/?C=M;O=A&quot; rel=&quot;nofollow&quot;&gt;Last modified&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/?C=S;O=A&quot; rel=&quot;nofollow&quot;&gt;Size&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/?C=D;O=A&quot; rel=&quot;nofollow&quot;&gt;Description&lt;/a&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th colspan=&quot;5&quot;&gt;&lt;hr&gt;&lt;/th&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/back.gif&quot; alt=&quot;[DIR]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/&quot; rel=&quot;nofollow&quot;&gt;Parent Directory&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;  - &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/fennec-4.0b2pre.en-US.eabi-arm.apk&quot; rel=&quot;nofollow&quot;&gt;fennec-4.0b2pre.en-US.eabi-arm.apk&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:45  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt; 12M&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/fennec-4.0b2pre.en-US.eabi-arm.checksums&quot; rel=&quot;nofollow&quot;&gt;fennec-4.0b2pre.en-US.eabi-arm.checksums&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:45  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt;916 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/compressed.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/fennec-4.0b2pre.en-US.eabi-arm.tests.zip&quot; rel=&quot;nofollow&quot;&gt;fennec-4.0b2pre.en-US.eabi-arm.tests.zip&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:45  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt; 38M&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/text.gif&quot; alt=&quot;[TXT]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/fennec-4.0b2pre.en-US.eabi-arm.txt&quot; rel=&quot;nofollow&quot;&gt;fennec-4.0b2pre.en-US.eabi-arm.txt&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:45  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt; 28 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://ftp.mozilla.org/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/en-US/gecko-unsigned-unaligned.apk&quot; rel=&quot;nofollow&quot;&gt;gecko-unsigned-unaligned.apk&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;23-Oct-2010 13:45  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt; 12M&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th colspan=&quot;5&quot;&gt;&lt;hr&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/322139.html</comments>
  <category>fennec</category>
  <category>l10n</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/320620.html</guid>
  <pubDate>Wed, 21 Jul 2010 03:08:32 GMT</pubDate>
  <title>Where are the mobile builds?</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/320620.html</link>
  <description>&lt;p&gt;
We&apos;ve been thinking about changing our mobile upload logic for a while now.
&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&quot;mobile-trunk&quot; and &quot;mobile-1.9.2&quot; were effective enough abstractions, but forced us to translate those back to branch names in automation,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;uploading all platforms to the same directory resulted in same-named files being overwritten by subsequent builds (e.g. the windows l10n repack overwriting the linux l10n repack&apos;s xpi files), and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;old versions of the same files would hang around in the latest nightly directories after a version bump. Or, in the case of the Maemo deb files, &lt;i&gt;every&lt;/i&gt; build would upload a differently-named deb.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;
The first two issues should be solved now that &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=579097&quot; rel=&quot;nofollow&quot;&gt;bug 579097&lt;/a&gt; has landed.  Instead of stuffing everything into &lt;nobr&gt;&lt;code&gt;latest-mobile-trunk/&lt;/code&gt;&lt;/nobr&gt;, we&apos;re using a branch-platform naming structure.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;
This structure should also allow us to solve issue #3 elegantly.  We&apos;re currently copying new files into a directory with existing files, with the assumption that they&apos;ll overwrite each other.  This, of course, breaks when the filename changes. And adding per-file cleanup logic tends to be complex or messy or both.
&lt;/p&gt;&lt;p&gt;
If, instead, the latest-* directories were softlinks to the latest dated directory (e.g. &lt;nobr&gt;&lt;code&gt;latest-mozilla-central-maemo4 -&amp;gt;&lt;/code&gt;&lt;/nobr&gt; &lt;nobr&gt;&lt;code&gt;2010/07/2010-07-20-13-mozilla-central-maemo4/&lt;/code&gt;&lt;/nobr&gt;), there would be no old files to clean up.  I&apos;m a big fan of directory-level upload logic, because of things like this.
&lt;/p&gt;&lt;p&gt;
This is on my radar; not written yet.  Tracked in &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=580495&quot; rel=&quot;nofollow&quot;&gt;bug 580495&lt;/a&gt;.
&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;
So where are the builds?  Still in the &lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/&quot; rel=&quot;nofollow&quot;&gt;nightly&lt;/a&gt; directory. But the layout&apos;s a bit different.
&lt;/p&gt;&lt;p&gt;
For trunk (mozilla-central), look here:
&lt;/p&gt;&lt;blockquote&gt;&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;5&quot;&gt;
&lt;tr&gt;&lt;td&gt;Android&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-r7/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-central-android-r7/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Maemo 5 GTK (Fremantle)&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo5-gtk/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-central-maemo5-gtk/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Maemo 5 QT (Fremantle-QT)&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo5-qt/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-central-maemo5-qt/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Maemo 4 (Chinook)&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-maemo4/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-central-maemo4/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Linux Desktop&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-linux/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-central-linux/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MacOSX Desktop&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-macosx/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-central-macosx/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Windows Desktop&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-win32/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-central-win32/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/blockquote&gt;&lt;p&gt;
For 1.1.x nightlies (mozilla-1.9.2), look here:
&lt;/p&gt;&lt;blockquote&gt;&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;5&quot;&gt;
&lt;tr&gt;&lt;td&gt;Maemo 5 GTK (Fremantle)&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-1.9.2-maemo5-gtk/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-1.9.2-maemo5-gtk/&lt;/a&gt;&lt;br /&gt;
&lt;tr&gt;&lt;td&gt;Maemo 4 (Chinook)&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-1.9.2-maemo4/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-1.9.2-maemo4/&lt;/a&gt;&lt;br /&gt;
&lt;tr&gt;&lt;td&gt;Linux Desktop&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-1.9.2-linux/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-1.9.2-linux/&lt;/a&gt;&lt;br /&gt;
&lt;tr&gt;&lt;td&gt;MacOSX Desktop&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-1.9.2-macosx/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-1.9.2-macosx/&lt;/a&gt;&lt;br /&gt;
&lt;tr&gt;&lt;td&gt;Windows Desktop&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-1.9.2-win32/&quot; rel=&quot;nofollow&quot;&gt;latest-mozilla-1.9.2-win32/&lt;/a&gt;&lt;br /&gt;
&lt;/table&gt;&lt;/blockquote&gt;&lt;p&gt;
Depend builds are still in the misnamed &lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/tinderbox-builds/&quot; rel=&quot;nofollow&quot;&gt;tinderbox-builds&lt;/a&gt; directory, and the &lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/&quot; rel=&quot;nofollow&quot;&gt;Maemo nightly update repositories&lt;/a&gt; are still in the same place.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/320620.html</comments>
  <category>fennec</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/320344.html</guid>
  <pubDate>Wed, 23 Jun 2010 05:23:07 GMT</pubDate>
  <title>new Maemo Fennec nightly .install files</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/320344.html</link>
  <description>&lt;p&gt;
Some of you may have noticed that the &lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/&quot; rel=&quot;nofollow&quot;&gt;Maemo Fennec nightly deb repositories&lt;/a&gt; now have multiple .install files:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;Index of &lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/&quot; rel=&quot;nofollow&quot;&gt;/pub/mozilla.org/mobile/repos/trunk_multi&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;img src=&quot;http://darksecretlove.com/icons/blank.gif&quot; alt=&quot;[ICO]&quot;&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/?C=N;O=D&quot; rel=&quot;nofollow&quot;&gt;Name&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/?C=M;O=A&quot; rel=&quot;nofollow&quot;&gt;Last modified&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/?C=S;O=A&quot; rel=&quot;nofollow&quot;&gt;Size&lt;/a&gt;&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/?C=D;O=A&quot; rel=&quot;nofollow&quot;&gt;Description&lt;/a&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th colspan=&quot;5&quot;&gt;&lt;hr&gt;&lt;/th&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://darksecretlove.com/icons/back.gif&quot; alt=&quot;[DIR]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi//pub/mozilla.org/mobile/repos/&quot; rel=&quot;nofollow&quot;&gt;Parent Directory&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;  - &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://darksecretlove.com/icons/folder.gif&quot; alt=&quot;[DIR]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/dists/&quot; rel=&quot;nofollow&quot;&gt;dists/&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;22-Jun-2010 12:46  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt;  - &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://darksecretlove.com/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/trunk_multi_nightly_chinook.install&quot; rel=&quot;nofollow&quot;&gt;trunk_multi_nightly_chinook.install&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;22-Jun-2010 12:43  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt;306 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://darksecretlove.com/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/trunk_multi_nightly_fremantle.install&quot; rel=&quot;nofollow&quot;&gt;trunk_multi_nightly_fremantle.install&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;22-Jun-2010 12:44  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt;312 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;img src=&quot;http://darksecretlove.com/icons/unknown.gif&quot; alt=&quot;[   ]&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/trunk_multi/trunk_multi_nightly_fremantle_qt.install&quot; rel=&quot;nofollow&quot;&gt;trunk_multi_nightly_fremantle_qt.install&lt;/a&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;22-Jun-2010 12:46  &lt;/td&gt;&lt;td align=&quot;right&quot;&gt;321 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th colspan=&quot;5&quot;&gt;&lt;hr&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/blockquote&gt;

&lt;br /&gt;
&lt;p&gt;
This is due to work done in &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=563767&quot; rel=&quot;nofollow&quot;&gt;bug 563767&lt;/a&gt; (enable Maemo5 qt debs) and &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=563081&quot; rel=&quot;nofollow&quot;&gt;bug 563081&lt;/a&gt; (deb repo updates with both chinook and fremantle).
&lt;/p&gt;&lt;p&gt;
Quick terminology table:
&lt;/p&gt;
&lt;center&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot;&gt;
&lt;tr&gt;&lt;th&gt;Device&lt;/th&gt;&lt;th&gt;OS Version&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://wiki.maemo.org/Codenames&quot; rel=&quot;nofollow&quot;&gt;Maemo codename&lt;/a&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;N810&lt;/td&gt;&lt;td&gt;Maemo 4&lt;/td&gt;&lt;td&gt;Chinook&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;N900&lt;/td&gt;&lt;td&gt;Maemo 5&lt;/td&gt;&lt;td&gt;Fremantle&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/center&gt;
&lt;p&gt;
(The QT builds are a variant of the Maemo 5 builds, using the &lt;a href=&quot;http://en.wikipedia.org/wiki/Qt&quot; rel=&quot;nofollow&quot;&gt;QT toolkit&lt;/a&gt; instead of &lt;a href=&quot;http://en.wikipedia.org/wiki/Gtk&quot; rel=&quot;nofollow&quot;&gt;GTK&lt;/a&gt;.  If you don&apos;t know what this is, ignore it :)
&lt;/p&gt;&lt;p&gt;
These repos should be updated nightly with their corresponding builds.  I have seen issues and confusion stemming from having multiple Fennec repos on a single device, so I tend to remove all Mozilla repos from the App Manager, uninstall Fennec+Mozilla Runtime, then click on the appropriate .install file.
&lt;/p&gt;&lt;p&gt;
Additional instructions available &lt;a href=&quot;http://ahdesai.wordpress.com/2010/01/18/how-to-install-nightly-builds-on-your-maemo-device/&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
(More QT repos will be available once &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=563770&quot; rel=&quot;nofollow&quot;&gt;bug 563770&lt;/a&gt; (enable Maemo 5 QT l10n repacks) starts showing up in tonight&apos;s nightly builds.)
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;[EDIT]&lt;/b&gt;: I&apos;ve renamed the .install files in &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=574104&quot; rel=&quot;nofollow&quot;&gt;bug 574104&lt;/a&gt;.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/320344.html</comments>
  <category>maemo</category>
  <category>fennec</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/316649.html</guid>
  <pubDate>Tue, 03 Nov 2009 20:58:08 GMT</pubDate>
  <title>Pooling, part 3: the pooling model on multiple branches</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/316649.html</link>
  <description>&lt;p&gt;
(Continuing the &lt;a href=&quot;http://atlee.ca/blog/2009/10/26/releng-blogging-blitz/&quot; rel=&quot;nofollow&quot;&gt;blogging blitz&lt;/a&gt;: here is &lt;a href=&quot;http://drkscrtlv.livejournal.com/315772.html&quot; rel=&quot;nofollow&quot;&gt;pooling&lt;/a&gt;, part 3.)&lt;br /&gt;&lt;br /&gt;
The build pool consists of a number of identical build machines that can handle all builds of a certain category, across branches.
&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; style=&quot;border: thin solid #333333&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;
&lt;b&gt;Builds on checkin&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
Pooling lends itself to building on checkin: each checkin triggers a &lt;a href=&quot;http://atlee.ca/blog/2009/11/02/what-happens-when-you-push/&quot; rel=&quot;nofollow&quot;&gt;full set of builds&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
This gives much more granular information about each checkin:  does it build on every platform?  Does it pass all tests?  This saves many hours of &quot;who broke the build&quot; digging.  As a result, the tree should stay open longer.
&lt;/p&gt;&lt;p&gt;
The tradeoff is wait times.  During peak traffic, checkins can trigger more build requests than there are available build slaves.  As builds begin to queue, new build requests sit idle for longer and longer before build slaves are available to handle those requests.
&lt;/p&gt;&lt;p&gt;
You can combat wait times via queue collapsing:  Once builds queue, the master can combine multiple checkins in the next build.  However, this negatively affects granular per-checkin information.
&lt;/p&gt;&lt;p&gt;
Another solution to wait times is adding more build slaves to the pool.
&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; style=&quot;border: thin solid #999999&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;
&lt;b&gt;Dynamic allocation&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
As long as there are available build slaves, the pool is dynamically allocated to where it&apos;s needed.  If one branch is especially busy, more build slaves can be temporarily allocated to that branch.  Or if the debug build takes twice as long, more build slaves can be allocated to keep it from falling behind.
&lt;/p&gt;&lt;p&gt;
(At Mozilla, this happens within Buildbot and requires no manual intervention beyond the initial configuration.)
&lt;/p&gt;&lt;p&gt;
This is in direct contrast to the tinderbox model, where busier branches or longer builds would always mean more changes per build.
&lt;/p&gt;&lt;p&gt;
Dynamic allocation adds a certain amount of fault tolerance.  In the tinderbox model, a single machine going down could cause tree closure.  In the pooling model, a number of build machines in the pool could fall over, and the builds would continue at a slower rate.
&lt;/p&gt;&lt;p&gt;
The main drawback to dynamic allocation is that an extremely long build or an overly busy branch can starve the other builds/branches of available build machines.
&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; style=&quot;border: thin solid #333333&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;
&lt;b&gt;Self-testing process&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
In the tinderbox model, one of the weaknesses was machine setup documentation.  This can be assuaged with strict change management and VM cloning, but there&apos;s no real ongoing test to verify that the documentation is up to date.
&lt;/p&gt;&lt;p&gt;
Since pooled slaves jump from build to build and from branch to branch, it&apos;s easier to detect whether breakage is build slave- or code/branch- specific.  This isn&apos;t perfect, especially with heisenbugs, but it&apos;s definitely an improvement.
&lt;/p&gt;&lt;p&gt;
In addition, every time you set up a new build slave, that tests the documentation and process.  This happens much, much more often than spinning up new tinderboxes in the tinderbox model.
&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; style=&quot;border: thin solid #999999&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;
&lt;b&gt;Spinning up a new branch or build&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
Since the pool of slaves can handle any existing branch or build, it&apos;s relatively easy to spin up a new, compatible branch or build type.  It&apos;s even possible to do so by merely updating the master config files, with none of the &quot;spin up N new tinderbox machines&quot; work.
&lt;/p&gt;&lt;p&gt;
However, new branches and build types do add more load to the pool; it&apos;s important to keep capacity and wait times in mind.  As the &lt;a href=&quot;http://atlee.ca/blog/2009/11/02/what-happens-when-you-push/&quot; rel=&quot;nofollow&quot;&gt;full set of builds&lt;/a&gt; show, it&apos;s easy to lose track of just how much your build pool is responsible for.
&lt;/p&gt;&lt;p&gt;
Still, I think it&apos;s clear that this is a big Win for pooling, as the number of active branches and builds at Mozilla are as high as I&apos;ve seen anywhere.
&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; style=&quot;border: thin solid #333333&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;
&lt;b&gt;The tyranny of the single config&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
It&apos;s very, very powerful to have a single configuration that works for all builds across all branches.  However, this is also a very strict limitation.
&lt;/p&gt;&lt;p&gt;
In the tinderbox model, a change could be made to a single machine without affecting the stability of any other builds or branches.  Once that one build goes green, you&apos;re golden.
&lt;/p&gt;&lt;p&gt;
In the pooling model, the change needs to propagate across the entire pool, and it affects all builds across all branches.  As the number of branches and build types grow, the testing matrix for config changes grows as well.
&lt;/p&gt;&lt;p&gt;
And at some point, new, &lt;i&gt;incompatible&lt;/i&gt; requirements rear their ugly head -- maybe an incompatible new toolchain that can&apos;t coexist with the previous one, or a whole new platform.  At that point, you need to create a new pool.  And ramping that up from zero can be a time consuming process.
&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;
I hope the above helps illustrate the pooling model and some of its benefits and drawbacks.
&lt;/p&gt;&lt;p&gt;
We don&apos;t just have a single build pool here, however; we have multiple, and the number is growing.  This was partially by design, and partially to deal with growing pains as we scale larger and larger.
&lt;/p&gt;&lt;p&gt;
I&apos;ll illustrate where we are today in the next segment: split pools.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/316649.html</comments>
  <category>buildbot</category>
  <category>tinderbox</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/316401.html</guid>
  <pubDate>Tue, 27 Oct 2009 19:32:28 GMT</pubDate>
  <title>Pooling, part 2: the tinderbox model on multiple branches</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/316401.html</link>
  <description>&lt;p&gt;
(Continuing the &lt;a href=&quot;http://atlee.ca/blog/2009/10/26/releng-blogging-blitz/&quot; rel=&quot;nofollow&quot;&gt;blogging blitz&lt;/a&gt;: here is &lt;a href=&quot;http://drkscrtlv.livejournal.com/315772.html&quot; rel=&quot;nofollow&quot;&gt;pooling&lt;/a&gt;, part 2.&lt;br /&gt;
This illustrates how the &lt;a href=&quot;http://drkscrtlv.livejournal.com/315956.html&quot; rel=&quot;nofollow&quot;&gt;Tinderbox model&lt;/a&gt; can quickly become a headache to maintain on multiple branches, and what problems the pooling model is trying to solve.)
&lt;/p&gt;&lt;hr width=&quot;7&quot; /&gt;&lt;p&gt;
Since each column is its own build machine, if trunk has 12 columns (and you want to have the same coverage on the new branch), you need to spin up 12 new tinderbox machines with similar configurations for the new branch.
&lt;/p&gt;&lt;p&gt;
Let&apos;s reexamine the benefits and drawbacks of the Tinderbox model, with multiple branches in mind:
&lt;/p&gt;&lt;div style=&quot;border: thin solid orange; padding: 1em;&quot;&gt;&lt;dl&gt;&lt;dt&gt;
&lt;b&gt;[i]&lt;/b&gt; Anyone can spin up a new builder.
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
If anyone wants to start working on a new project, platform, or branch, they can run their own tinderbox and send the results to the tinderbox server on their own schedule.  This meant that developers could have the coverage they wished, and community members could add ports for the platforms they cared about.
&lt;/p&gt;&lt;p&gt;
After these ran for a while, they were often &quot;donated&quot; to the Release team to maintain.
&lt;/p&gt;&lt;p&gt;
This worked fairly well, but donated tinderboxen often came undocumented, resulting in maintenance headaches down the road.  Many, many machines were labeled &quot;Don&apos;t Touch!&quot; because no one knew if any changes would break anything, and no one knew how to rebuild them if anything catastrophic happened.
&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;
&lt;b&gt;[ii]&lt;/b&gt; It&apos;s relatively simple to make changes to a single build.
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
If a particular branch needs a different toolchain or setting, it&apos;s not difficult to set up that branch&apos;s build machine with that.  In fact, when we wanted to, say, change compilers on a single branch, we usually spun up a new build machine with that new compiler, and ran it in parallel with the old one until it was reliably green.
&lt;/p&gt;&lt;p&gt;
These inconsistencies also made it difficult to determine why changes worked on one branch but not another.  Was it the new compiler? Or a hidden environment variable?  Were the patch/service pack levels the same?  Did it matter that one tinderbox was running win2k when the other ran NT?
&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;
&lt;b&gt;[iii]&lt;/b&gt; Consistent wait times [for a single build].
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
No matter how many checkins happen on any (or all) branches, wait times stay consistent.
&lt;/p&gt;&lt;p&gt;
On the other hand, if a flurry of checkins happen on trunk, and the branches lie idle, all of those changes are picked up by the trunk builders.  The branch builders continue building the latest revision on those idle branches or lie idle.
&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;p&gt;
The drawbacks stay the same, although amplified with each additional machine and build type to administer and maintain.
&lt;/p&gt;&lt;p&gt;
I wasn&apos;t at Mozilla at the time, but as I understand it, a little more than two years ago, the tree would regularly be held closed whenever a single build machine went down -- unscheduled downtimes on a fairly consistent basis.  In &lt;i&gt;addition to&lt;/i&gt; the tree closures required to figure out who broke the build.
&lt;/p&gt;&lt;p&gt;
These were among the reasons for the move to Buildbot pooling, which I&apos;ll cover in part 3.
&lt;/p&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/316401.html</comments>
  <category>tinderbox</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/315956.html</guid>
  <pubDate>Tue, 27 Oct 2009 18:51:51 GMT</pubDate>
  <title>Pooling, part 1: the tinderbox model on a single branch</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/315956.html</link>
  <description>&lt;p&gt;
(Continuing the &lt;a href=&quot;http://atlee.ca/blog/2009/10/26/releng-blogging-blitz/&quot; rel=&quot;nofollow&quot;&gt;blogging blitz&lt;/a&gt;: here is &lt;a href=&quot;http://drkscrtlv.livejournal.com/315772.html&quot; rel=&quot;nofollow&quot;&gt;pooling&lt;/a&gt;, part 1.&lt;br /&gt;
This illustrates how builds were set up at one point in Mozilla and Netscape&apos;s past, mainly to contrast with how they&apos;re set up currently.)
&lt;/p&gt;
&lt;center&gt;
&lt;img src=&quot;http://people.mozilla.com/~sayrer/2007/10/17/tinderbox.png&quot; /&gt;&lt;br /&gt; (from &lt;a href=&quot;http://blog.mozilla.com/rob-sayre/2007/10/16/keeping-an-eye-on-things/&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;)
&lt;/center&gt;&lt;p&gt;
There were many variations&lt;a href=&quot;#tinderbox-singlebranch-variations&quot; rel=&quot;nofollow&quot;&gt;*&lt;/a&gt; of the old Tinderbox model of continuous integration.  The basic concept involved a single machine running a single type of build (e.g., Win32 Opt Depend) on a 24/7 basis; when the previous build finished, the next build would start.
&lt;/p&gt;&lt;p&gt;
When we needed more build types (e.g. adding MacOSX coverage), we added more machines, one for each new build type.  They would each be represented by their own column on the Tinderbox page, color coded green for success, red for failure, orange for test failed.
&lt;/p&gt;&lt;div style=&quot;border: thin solid green; padding: 1em;&quot;&gt;&lt;p&gt;
There are inherent benefits to such a model:
&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;
&lt;b&gt;[i]&lt;/b&gt; Anyone can spin up a new builder.
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
This is partially due to the delivery of logs via mail (and later, in Tinderbox 2, via ftp), but also because each machine and tinderbox client is standalone.  Anyone with a spare machine can spin up a Tinderbox builder.
&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;
&lt;b&gt;[ii]&lt;/b&gt; It&apos;s relatively simple to make changes to a single build.
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
Need a new compiler? A different SDK? A whole new toolchain? Track down the machine running that build and make those changes, and you&apos;re done.
&lt;/p&gt;&lt;p&gt;
(You documented that, right?)
&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;
&lt;b&gt;[iii]&lt;/b&gt; Consistent wait times [for a single build].
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
The maximum wait time for one build type to pick up your change is a little less than one full build cycle (if you happen to check in immediately after a build cycle starts, you need to wait for the next cycle).  If a full build takes one hour, the longest end-to-end time is a little less than 2 hours.  This is true whether one person checked in or five hundred people checked in.
&lt;/p&gt;&lt;p&gt;
(Later, people started running two of the same build and staggering them so that the longest wait time was a little less than 1/2 a full build cycle.)
&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;border: thin solid red; padding: 1em;&quot;&gt;&lt;p&gt;
Any drawbacks?
&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;
&lt;b&gt;[i]&lt;/b&gt; The tree has many single points of failure.
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
Most of these build machines are unique.  If something happens to one machine, that column goes perma-red or drops from the waterfall.  If it&apos;s measuring something critical (and most of them are), that means tree closure.
&lt;/p&gt;&lt;dd&gt;&lt;dt&gt;
&lt;b&gt;[ii]&lt;/b&gt; It&apos;s easy to lose track of build [script|machine] changes.
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
It is simple to make changes to the build toolchain, scripts, or environment on individual tinderboxen.  Unfortunately, it&apos;s also simple to make those changes without properly documenting or checking in those changes.  It&apos;s only a matter of time before this becomes a problem.
&lt;/p&gt;&lt;p&gt;
Missing or faulty documentation might only be discovered after massive hardware failure, long after the people responsible for those changes have moved on.  If you&apos;re unfortunate enough to not have a recent clone or full backup of that machine, you may be looking at a possible multi-day tree closure.
&lt;/p&gt;&lt;p&gt;
This also affects spinning up a new build machine or making changes to an existing one.  If there are settings you&apos;re unaware of, troubleshooting the problem can eat up valuable time.
&lt;/p&gt;&lt;dd&gt;&lt;dt&gt;
&lt;b&gt;[iii]&lt;/b&gt; It&apos;s hard to track down who broke the tree.
&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;
Since each build cycle can pick up multiple checkins, it can be difficult to tell which checkin broke a particular build or test.  This can become a protracted session of finger pointing, involving multiple developers and the reliability of the build machine(s) in question.
&lt;/p&gt;&lt;p&gt;
This was exacerbated by the old CVS problem of figuring out which build actually picked up your checkin.  Also, the fact that each build machine (tinderbox column) has different-length cycles means that builds start at different times, and each build picks up different combinations of new checkins.  Those can each break in new and exciting ways, for different reasons.
&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;
Don&apos;t get me wrong; I have a fondness for Tinderbox that it seems few people share.  But I can be objective about its strengths and weaknesses, and one of its weaknesses is that it doesn&apos;t scale very well.  At least not Scale with a capital Scale.  (And scaling is a major factor in our decisions today.)
&lt;/p&gt;&lt;p&gt;
I&apos;ll illustrate that a bit more in the next segment: the tinderbox model on multiple branches.
&lt;/p&gt;
&lt;hr width=&quot;7&quot; align=&quot;left&quot; /&gt;
&lt;p&gt;
&lt;a name=&quot;tinderbox-singlebranch-variations&quot;&gt;&lt;sup&gt;*&lt;/sup&gt;&lt;/a&gt; (We did have depend tinderboxen that spit out clobber or release builds at certain times of day or when a certain file was touched.  We also had machines that cycled through several different build types -- these exceptions tended to occur on side projects that had fewer developers or less hardware.  But for the most part, it was a single machine for a single build type.)
&lt;/p&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/315956.html</comments>
  <category>tinderbox</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://drkscrtlv.livejournal.com/315772.html</guid>
  <pubDate>Tue, 27 Oct 2009 01:08:23 GMT</pubDate>
  <title>Blogging Blitz: Pooling Intro</title>
  <author>aki@escapewindow.com</author>  <link>http://drkscrtlv.livejournal.com/315772.html</link>
  <description>&lt;p&gt;
As part of RelEng&apos;s &lt;a href=&quot;http://atlee.ca/blog/2009/10/26/releng-blogging-blitz/&quot; rel=&quot;nofollow&quot;&gt;Blogging Blitz&lt;/a&gt;, I&apos;m going to write a bit about [build slave] pooling concepts, differentiating between the old Tinderbox model and the Buildbot pool-of-slaves model.
&lt;/p&gt;&lt;p&gt;
The topics covered will be:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;The tinderbox model on a single branch.&lt;/li&gt;
&lt;li&gt;The tinderbox model on multiple branches.&lt;/li&gt;
&lt;li&gt;The pooling model on multiple branches.&lt;/li&gt;
&lt;li&gt;Split pools.&lt;/li&gt;
&lt;li&gt;Some new approaches.&lt;/li&gt;
&lt;/ul&gt;</description>
  <comments>http://drkscrtlv.livejournal.com/315772.html</comments>
  <category>buildbot</category>
  <category>tinderbox</category>
  <category>mozilla</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>
