aboutsummaryrefslogtreecommitdiffstats
path: root/docs/YoctoAutobuilderDevelopersDocument.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/YoctoAutobuilderDevelopersDocument.html')
-rw-r--r--docs/YoctoAutobuilderDevelopersDocument.html1
1 files changed, 0 insertions, 1 deletions
diff --git a/docs/YoctoAutobuilderDevelopersDocument.html b/docs/YoctoAutobuilderDevelopersDocument.html
deleted file mode 100644
index 7fcbb4bc..00000000
--- a/docs/YoctoAutobuilderDevelopersDocument.html
+++ /dev/null
@@ -1 +0,0 @@
-<html><head><meta content="text/html; charset=UTF-8" http-equiv="content-type"><style type="text/css">ol.lst-kix_eogk2g9lz4ou-0.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-0 0}ol.lst-kix_z44608xc5z5-0.start{counter-reset:lst-ctn-kix_z44608xc5z5-0 0}ol.lst-kix_z44608xc5z5-8{list-style-type:none}ol.lst-kix_55zebeya5hie-2.start{counter-reset:lst-ctn-kix_55zebeya5hie-2 0}ol.lst-kix_z44608xc5z5-6{list-style-type:none}ol.lst-kix_z44608xc5z5-7{list-style-type:none}ol.lst-kix_z44608xc5z5-4{list-style-type:none}ol.lst-kix_z44608xc5z5-5{list-style-type:none}ol.lst-kix_z44608xc5z5-2{list-style-type:none}ol.lst-kix_z44608xc5z5-3{list-style-type:none}ol.lst-kix_z44608xc5z5-0{list-style-type:none}ol.lst-kix_z44608xc5z5-1{list-style-type:none}.lst-kix_w6ctxtwswacj-0>li:before{content:"\0025cf "}.lst-kix_w6ctxtwswacj-1>li:before{content:"\0025cb "}.lst-kix_55zebeya5hie-7>li{counter-increment:lst-ctn-kix_55zebeya5hie-7}.lst-kix_w6ctxtwswacj-6>li:before{content:"\0025cf "}.lst-kix_w6ctxtwswacj-8>li:before{content:"\0025a0 "}.lst-kix_w6ctxtwswacj-5>li:before{content:"\0025a0 "}.lst-kix_w6ctxtwswacj-2>li:before{content:"\0025a0 "}.lst-kix_w6ctxtwswacj-4>li:before{content:"\0025cb "}ul.lst-kix_vgo489ljcome-8{list-style-type:none}.lst-kix_w6ctxtwswacj-3>li:before{content:"\0025cf "}.lst-kix_w6ctxtwswacj-7>li:before{content:"\0025cb "}.lst-kix_55zebeya5hie-3>li{counter-increment:lst-ctn-kix_55zebeya5hie-3}ul.lst-kix_qrb1a1jgz3rn-4{list-style-type:none}ul.lst-kix_qrb1a1jgz3rn-3{list-style-type:none}ul.lst-kix_qrb1a1jgz3rn-6{list-style-type:none}ul.lst-kix_qrb1a1jgz3rn-5{list-style-type:none}ul.lst-kix_qrb1a1jgz3rn-0{list-style-type:none}.lst-kix_55zebeya5hie-0>li{counter-increment:lst-ctn-kix_55zebeya5hie-0}ul.lst-kix_qrb1a1jgz3rn-2{list-style-type:none}ul.lst-kix_qrb1a1jgz3rn-1{list-style-type:none}ul.lst-kix_qrb1a1jgz3rn-8{list-style-type:none}ul.lst-kix_qrb1a1jgz3rn-7{list-style-type:none}.lst-kix_2vtha56u4mwf-6>li:before{content:"- "}ol.lst-kix_eogk2g9lz4ou-7.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-7 0}.lst-kix_2vtha56u4mwf-4>li:before{content:"- "}.lst-kix_2vtha56u4mwf-8>li:before{content:"- "}.lst-kix_z44608xc5z5-3>li{counter-increment:lst-ctn-kix_z44608xc5z5-3}.lst-kix_ivvjgdhufo4a-7>li:before{content:"- "}ul.lst-kix_2vtha56u4mwf-7{list-style-type:none}.lst-kix_ivvjgdhufo4a-3>li:before{content:"- "}ul.lst-kix_2vtha56u4mwf-6{list-style-type:none}ul.lst-kix_2vtha56u4mwf-8{list-style-type:none}.lst-kix_ivvjgdhufo4a-5>li:before{content:"- "}ul.lst-kix_2vtha56u4mwf-1{list-style-type:none}ul.lst-kix_2vtha56u4mwf-0{list-style-type:none}ul.lst-kix_2vtha56u4mwf-3{list-style-type:none}ul.lst-kix_2vtha56u4mwf-2{list-style-type:none}ul.lst-kix_2vtha56u4mwf-5{list-style-type:none}ul.lst-kix_2vtha56u4mwf-4{list-style-type:none}ul.lst-kix_5jxi9skcdaiv-7{list-style-type:none}ul.lst-kix_5jxi9skcdaiv-8{list-style-type:none}.lst-kix_5jxi9skcdaiv-4>li:before{content:"\0025cb "}.lst-kix_5jxi9skcdaiv-8>li:before{content:"\0025a0 "}ul.lst-kix_5jxi9skcdaiv-1{list-style-type:none}ul.lst-kix_5jxi9skcdaiv-2{list-style-type:none}ul.lst-kix_5jxi9skcdaiv-0{list-style-type:none}ul.lst-kix_5jxi9skcdaiv-5{list-style-type:none}ul.lst-kix_5jxi9skcdaiv-6{list-style-type:none}.lst-kix_ivvjgdhufo4a-1>li:before{content:"- "}ul.lst-kix_5jxi9skcdaiv-3{list-style-type:none}.lst-kix_5jxi9skcdaiv-6>li:before{content:"\0025cf "}ul.lst-kix_5jxi9skcdaiv-4{list-style-type:none}ul.lst-kix_vgo489ljcome-5{list-style-type:none}ul.lst-kix_vgo489ljcome-4{list-style-type:none}ul.lst-kix_vgo489ljcome-7{list-style-type:none}ul.lst-kix_e6cn8ienuo6k-8{list-style-type:none}ul.lst-kix_vgo489ljcome-6{list-style-type:none}ul.lst-kix_e6cn8ienuo6k-7{list-style-type:none}ul.lst-kix_vgo489ljcome-1{list-style-type:none}ul.lst-kix_e6cn8ienuo6k-6{list-style-type:none}.lst-kix_2vtha56u4mwf-0>li:before{content:"- "}ul.lst-kix_vgo489ljcome-0{list-style-type:none}.lst-kix_5jxi9skcdaiv-0>li:before{content:"\0025cf "}ul.lst-kix_e6cn8ienuo6k-5{list-style-type:none}.lst-kix_rxf8talb6b1y-5>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-5}ul.lst-kix_vgo489ljcome-3{list-style-type:none}ul.lst-kix_e6cn8ienuo6k-4{list-style-type:none}ul.lst-kix_vgo489ljcome-2{list-style-type:none}ul.lst-kix_e6cn8ienuo6k-3{list-style-type:none}.lst-kix_eogk2g9lz4ou-2>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-2}ul.lst-kix_e6cn8ienuo6k-2{list-style-type:none}.lst-kix_2vtha56u4mwf-2>li:before{content:"- "}ul.lst-kix_e6cn8ienuo6k-1{list-style-type:none}ul.lst-kix_e6cn8ienuo6k-0{list-style-type:none}.lst-kix_z44608xc5z5-2>li{counter-increment:lst-ctn-kix_z44608xc5z5-2}.lst-kix_5jxi9skcdaiv-2>li:before{content:"\0025a0 "}.lst-kix_z44608xc5z5-1>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-1,lower-latin) ". "}.lst-kix_55zebeya5hie-4>li{counter-increment:lst-ctn-kix_55zebeya5hie-4}.lst-kix_z44608xc5z5-5>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-5,lower-roman) ". "}ol.lst-kix_eogk2g9lz4ou-5.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-5 0}.lst-kix_z44608xc5z5-7>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-7,lower-latin) ". "}ol.lst-kix_55zebeya5hie-2{list-style-type:none}ol.lst-kix_55zebeya5hie-3{list-style-type:none}ol.lst-kix_55zebeya5hie-4{list-style-type:none}ol.lst-kix_55zebeya5hie-5{list-style-type:none}ol.lst-kix_55zebeya5hie-6{list-style-type:none}ol.lst-kix_55zebeya5hie-7{list-style-type:none}ol.lst-kix_55zebeya5hie-8{list-style-type:none}.lst-kix_z44608xc5z5-3>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-3,decimal) ". "}ul.lst-kix_jqwplanlf6ac-8{list-style-type:none}ol.lst-kix_55zebeya5hie-0.start{counter-reset:lst-ctn-kix_55zebeya5hie-0 0}ul.lst-kix_jqwplanlf6ac-6{list-style-type:none}ul.lst-kix_jqwplanlf6ac-7{list-style-type:none}ul.lst-kix_jqwplanlf6ac-4{list-style-type:none}ul.lst-kix_jqwplanlf6ac-5{list-style-type:none}ul.lst-kix_jqwplanlf6ac-2{list-style-type:none}ul.lst-kix_jqwplanlf6ac-3{list-style-type:none}ul.lst-kix_jqwplanlf6ac-0{list-style-type:none}ul.lst-kix_jqwplanlf6ac-1{list-style-type:none}.lst-kix_rxf8talb6b1y-6>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-6}.lst-kix_eogk2g9lz4ou-3>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-3}ol.lst-kix_55zebeya5hie-0{list-style-type:none}ol.lst-kix_55zebeya5hie-1{list-style-type:none}.lst-kix_vgo489ljcome-0>li:before{content:"\0025cf "}.lst-kix_vgo489ljcome-2>li:before{content:"\0025a0 "}ul.lst-kix_inqgee5fh4k6-6{list-style-type:none}.lst-kix_vgo489ljcome-6>li:before{content:"\0025cf "}ul.lst-kix_inqgee5fh4k6-7{list-style-type:none}.lst-kix_e6cn8ienuo6k-0>li:before{content:"- "}.lst-kix_e6cn8ienuo6k-1>li:before{content:"- "}.lst-kix_e6cn8ienuo6k-4>li:before{content:"- "}.lst-kix_e6cn8ienuo6k-5>li:before{content:"- "}ul.lst-kix_inqgee5fh4k6-8{list-style-type:none}ul.lst-kix_inqgee5fh4k6-2{list-style-type:none}ul.lst-kix_inqgee5fh4k6-3{list-style-type:none}ul.lst-kix_inqgee5fh4k6-4{list-style-type:none}ul.lst-kix_inqgee5fh4k6-5{list-style-type:none}ul.lst-kix_inqgee5fh4k6-0{list-style-type:none}.lst-kix_vgo489ljcome-3>li:before{content:"\0025cf "}ul.lst-kix_inqgee5fh4k6-1{list-style-type:none}.lst-kix_1ypaffc481r0-7>li:before{content:"- "}.lst-kix_1ypaffc481r0-4>li:before{content:"- "}.lst-kix_1ypaffc481r0-8>li:before{content:"- "}.lst-kix_vgo489ljcome-7>li:before{content:"\0025cb "}.lst-kix_1ypaffc481r0-0>li:before{content:"- "}.lst-kix_1ypaffc481r0-3>li:before{content:"- "}ul.lst-kix_j6pu4ozg1h9q-0{list-style-type:none}ul.lst-kix_j6pu4ozg1h9q-3{list-style-type:none}ul.lst-kix_j6pu4ozg1h9q-4{list-style-type:none}ul.lst-kix_j6pu4ozg1h9q-1{list-style-type:none}ul.lst-kix_j6pu4ozg1h9q-2{list-style-type:none}ul.lst-kix_j6pu4ozg1h9q-7{list-style-type:none}ul.lst-kix_j6pu4ozg1h9q-8{list-style-type:none}ul.lst-kix_j6pu4ozg1h9q-5{list-style-type:none}ul.lst-kix_j6pu4ozg1h9q-6{list-style-type:none}.lst-kix_inqgee5fh4k6-5>li:before{content:"- "}.lst-kix_inqgee5fh4k6-2>li:before{content:"- "}.lst-kix_inqgee5fh4k6-6>li:before{content:"- "}ol.lst-kix_eogk2g9lz4ou-2.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-2 0}.lst-kix_inqgee5fh4k6-1>li:before{content:"- "}.lst-kix_eogk2g9lz4ou-7>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-7}.lst-kix_hte491cj00mg-1>li:before{content:"- "}.lst-kix_qrb1a1jgz3rn-2>li:before{content:"\0025a0 "}.lst-kix_hte491cj00mg-0>li:before{content:"- "}.lst-kix_hte491cj00mg-4>li:before{content:"- "}.lst-kix_z44608xc5z5-7>li{counter-increment:lst-ctn-kix_z44608xc5z5-7}.lst-kix_qrb1a1jgz3rn-3>li:before{content:"\0025cf "}ol.lst-kix_eogk2g9lz4ou-3.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-3 0}.lst-kix_hte491cj00mg-8>li:before{content:"- "}.lst-kix_hte491cj00mg-5>li:before{content:"- "}.lst-kix_qrb1a1jgz3rn-6>li:before{content:"\0025cf "}.lst-kix_qrb1a1jgz3rn-7>li:before{content:"\0025cb "}.lst-kix_2vtha56u4mwf-7>li:before{content:"- "}.lst-kix_eogk2g9lz4ou-0>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-0,decimal) ". "}.lst-kix_ivvjgdhufo4a-2>li:before{content:"- "}.lst-kix_ivvjgdhufo4a-6>li:before{content:"- "}.lst-kix_55zebeya5hie-2>li{counter-increment:lst-ctn-kix_55zebeya5hie-2}.lst-kix_rxf8talb6b1y-4>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-4}.lst-kix_rxf8talb6b1y-1>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-1,lower-latin) ". "}.lst-kix_eogk2g9lz4ou-4>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-4,lower-latin) ". "}.lst-kix_5jxi9skcdaiv-7>li:before{content:"\0025cb "}ol.lst-kix_rxf8talb6b1y-8{list-style-type:none}.lst-kix_eogk2g9lz4ou-5>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-5}.lst-kix_j6pu4ozg1h9q-2>li:before{content:"\0025a0 "}ol.lst-kix_eogk2g9lz4ou-1.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-1 0}.lst-kix_rxf8talb6b1y-5>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-5,lower-roman) ". "}.lst-kix_5jxi9skcdaiv-3>li:before{content:"\0025cf "}ol.lst-kix_rxf8talb6b1y-6{list-style-type:none}.lst-kix_2vtha56u4mwf-3>li:before{content:"- "}ol.lst-kix_rxf8talb6b1y-7{list-style-type:none}ol.lst-kix_rxf8talb6b1y-4{list-style-type:none}ol.lst-kix_rxf8talb6b1y-5{list-style-type:none}ol.lst-kix_rxf8talb6b1y-2{list-style-type:none}.lst-kix_rxf8talb6b1y-2>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-2}ol.lst-kix_rxf8talb6b1y-3{list-style-type:none}ol.lst-kix_rxf8talb6b1y-0{list-style-type:none}ol.lst-kix_rxf8talb6b1y-1{list-style-type:none}.lst-kix_z44608xc5z5-5>li{counter-increment:lst-ctn-kix_z44608xc5z5-5}.lst-kix_z44608xc5z5-0>li{counter-increment:lst-ctn-kix_z44608xc5z5-0}.lst-kix_z44608xc5z5-2>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-2,lower-roman) ". "}.lst-kix_z44608xc5z5-6>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-6,decimal) ". "}.lst-kix_alogm9c9t96n-1>li:before{content:"\0025cb "}.lst-kix_sdy6fqgzk2k7-8>li:before{content:"\0025a0 "}.lst-kix_jqwplanlf6ac-8>li:before{content:"\0025a0 "}.lst-kix_jqwplanlf6ac-4>li:before{content:"\0025cb "}.lst-kix_j6pu4ozg1h9q-6>li:before{content:"\0025cf "}.lst-kix_jqwplanlf6ac-0>li:before{content:"\0025cf "}.lst-kix_sdy6fqgzk2k7-0>li:before{content:"\0025cf "}.lst-kix_sdy6fqgzk2k7-4>li:before{content:"\0025cb "}.lst-kix_eogk2g9lz4ou-0>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-0}.lst-kix_alogm9c9t96n-5>li:before{content:"\0025a0 "}.lst-kix_iun8hna84yne-3>li:before{content:"\0025cf "}.lst-kix_e6cn8ienuo6k-8>li:before{content:"- "}.lst-kix_iun8hna84yne-7>li:before{content:"\0025cb "}ol.lst-kix_z44608xc5z5-6.start{counter-reset:lst-ctn-kix_z44608xc5z5-6 0}.lst-kix_55zebeya5hie-0>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-0,decimal) ". "}ol.lst-kix_rxf8talb6b1y-5.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-5 0}.lst-kix_eogk2g9lz4ou-8>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-8}.lst-kix_z44608xc5z5-8>li{counter-increment:lst-ctn-kix_z44608xc5z5-8}ol.lst-kix_55zebeya5hie-8.start{counter-reset:lst-ctn-kix_55zebeya5hie-8 0}.lst-kix_eogk2g9lz4ou-1>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-1}ol.lst-kix_z44608xc5z5-1.start{counter-reset:lst-ctn-kix_z44608xc5z5-1 0}ol.lst-kix_rxf8talb6b1y-0.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-0 0}.lst-kix_rxf8talb6b1y-7>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-7}.lst-kix_rxf8talb6b1y-0>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-0,decimal) ". "}.lst-kix_55zebeya5hie-6>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-6,decimal) ". "}.lst-kix_55zebeya5hie-8>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-8,lower-roman) ". "}.lst-kix_z44608xc5z5-4>li{counter-increment:lst-ctn-kix_z44608xc5z5-4}.lst-kix_z44608xc5z5-1>li{counter-increment:lst-ctn-kix_z44608xc5z5-1}.lst-kix_eogk2g9lz4ou-8>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-8,lower-roman) ". "}.lst-kix_55zebeya5hie-7>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-7,lower-latin) ". "}.lst-kix_55zebeya5hie-4>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-4,lower-latin) ". "}.lst-kix_55zebeya5hie-2>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-2,lower-roman) ". "}.lst-kix_55zebeya5hie-1>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-1,lower-latin) ". "}ol.lst-kix_55zebeya5hie-3.start{counter-reset:lst-ctn-kix_55zebeya5hie-3 0}.lst-kix_55zebeya5hie-5>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-5,lower-roman) ". "}.lst-kix_55zebeya5hie-3>li:before{content:"" counter(lst-ctn-kix_55zebeya5hie-3,decimal) ". "}ol.lst-kix_55zebeya5hie-1.start{counter-reset:lst-ctn-kix_55zebeya5hie-1 0}.lst-kix_eogk2g9lz4ou-1>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-1,lower-latin) ". "}.lst-kix_eogk2g9lz4ou-5>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-5,lower-roman) ". "}.lst-kix_eogk2g9lz4ou-7>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-7,lower-latin) ". "}.lst-kix_eogk2g9lz4ou-3>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-3,decimal) ". "}ol.lst-kix_eogk2g9lz4ou-4.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-4 0}.lst-kix_eogk2g9lz4ou-4>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-4}.lst-kix_j6pu4ozg1h9q-3>li:before{content:"\0025cf "}.lst-kix_j6pu4ozg1h9q-5>li:before{content:"\0025a0 "}.lst-kix_rxf8talb6b1y-2>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-2,lower-roman) ". "}.lst-kix_j6pu4ozg1h9q-1>li:before{content:"\0025cb "}.lst-kix_rxf8talb6b1y-4>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-4,lower-latin) ". "}.lst-kix_rxf8talb6b1y-6>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-6,decimal) ". "}.lst-kix_rxf8talb6b1y-8>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-8,lower-roman) ". "}.lst-kix_alogm9c9t96n-0>li:before{content:"\0025cf "}.lst-kix_iun8hna84yne-8>li:before{content:"\0025a0 "}.lst-kix_alogm9c9t96n-2>li:before{content:"\0025a0 "}.lst-kix_jqwplanlf6ac-7>li:before{content:"\0025cb "}.lst-kix_sdy6fqgzk2k7-7>li:before{content:"\0025cb "}.lst-kix_jqwplanlf6ac-3>li:before{content:"\0025cf "}.lst-kix_iun8hna84yne-0>li:before{content:"\0025cf "}.lst-kix_j6pu4ozg1h9q-7>li:before{content:"\0025cb "}.lst-kix_jqwplanlf6ac-5>li:before{content:"\0025a0 "}.lst-kix_sdy6fqgzk2k7-1>li:before{content:"\0025cb "}ol.lst-kix_eogk2g9lz4ou-6.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-6 0}.lst-kix_rxf8talb6b1y-0>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-0}.lst-kix_sdy6fqgzk2k7-3>li:before{content:"\0025cf "}.lst-kix_55zebeya5hie-5>li{counter-increment:lst-ctn-kix_55zebeya5hie-5}.lst-kix_sdy6fqgzk2k7-5>li:before{content:"\0025a0 "}.lst-kix_jqwplanlf6ac-1>li:before{content:"\0025cb "}.lst-kix_iun8hna84yne-2>li:before{content:"\0025a0 "}.lst-kix_alogm9c9t96n-6>li:before{content:"\0025cf "}.lst-kix_iun8hna84yne-4>li:before{content:"\0025cb "}.lst-kix_alogm9c9t96n-4>li:before{content:"\0025cb "}.lst-kix_alogm9c9t96n-8>li:before{content:"\0025a0 "}.lst-kix_e6cn8ienuo6k-7>li:before{content:"- "}.lst-kix_iun8hna84yne-6>li:before{content:"\0025cf "}.lst-kix_vgo489ljcome-8>li:before{content:"\0025a0 "}.lst-kix_e6cn8ienuo6k-2>li:before{content:"- "}.lst-kix_e6cn8ienuo6k-3>li:before{content:"- "}.lst-kix_vgo489ljcome-5>li:before{content:"\0025a0 "}.lst-kix_vgo489ljcome-4>li:before{content:"\0025cb "}ol.lst-kix_rxf8talb6b1y-2.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-2 0}.lst-kix_55zebeya5hie-6>li{counter-increment:lst-ctn-kix_55zebeya5hie-6}ol.lst-kix_z44608xc5z5-3.start{counter-reset:lst-ctn-kix_z44608xc5z5-3 0}.lst-kix_1ypaffc481r0-5>li:before{content:"- "}.lst-kix_1ypaffc481r0-6>li:before{content:"- "}ul.lst-kix_iun8hna84yne-5{list-style-type:none}ul.lst-kix_iun8hna84yne-4{list-style-type:none}ul.lst-kix_iun8hna84yne-3{list-style-type:none}.lst-kix_1ypaffc481r0-1>li:before{content:"- "}ul.lst-kix_iun8hna84yne-2{list-style-type:none}ul.lst-kix_iun8hna84yne-8{list-style-type:none}ul.lst-kix_w6ctxtwswacj-8{list-style-type:none}ul.lst-kix_iun8hna84yne-7{list-style-type:none}.lst-kix_1ypaffc481r0-2>li:before{content:"- "}ul.lst-kix_iun8hna84yne-6{list-style-type:none}ul.lst-kix_1ypaffc481r0-8{list-style-type:none}.lst-kix_rxf8talb6b1y-8>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-8}ul.lst-kix_iun8hna84yne-1{list-style-type:none}ul.lst-kix_iun8hna84yne-0{list-style-type:none}ul.lst-kix_1ypaffc481r0-0{list-style-type:none}ol.lst-kix_55zebeya5hie-5.start{counter-reset:lst-ctn-kix_55zebeya5hie-5 0}ul.lst-kix_1ypaffc481r0-1{list-style-type:none}ul.lst-kix_1ypaffc481r0-2{list-style-type:none}ul.lst-kix_1ypaffc481r0-3{list-style-type:none}ul.lst-kix_1ypaffc481r0-4{list-style-type:none}ul.lst-kix_1ypaffc481r0-5{list-style-type:none}ol.lst-kix_eogk2g9lz4ou-8.start{counter-reset:lst-ctn-kix_eogk2g9lz4ou-8 0}ul.lst-kix_1ypaffc481r0-6{list-style-type:none}ul.lst-kix_1ypaffc481r0-7{list-style-type:none}.lst-kix_inqgee5fh4k6-4>li:before{content:"- "}.lst-kix_inqgee5fh4k6-3>li:before{content:"- "}ul.lst-kix_sdy6fqgzk2k7-1{list-style-type:none}.lst-kix_rxf8talb6b1y-1>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-1}ul.lst-kix_sdy6fqgzk2k7-0{list-style-type:none}.lst-kix_inqgee5fh4k6-0>li:before{content:"- "}ol.lst-kix_rxf8talb6b1y-8.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-8 0}ol.lst-kix_z44608xc5z5-8.start{counter-reset:lst-ctn-kix_z44608xc5z5-8 0}.lst-kix_qrb1a1jgz3rn-1>li:before{content:"\0025cb "}.lst-kix_hte491cj00mg-2>li:before{content:"- "}.lst-kix_qrb1a1jgz3rn-0>li:before{content:"\0025cf "}.lst-kix_qrb1a1jgz3rn-5>li:before{content:"\0025a0 "}.lst-kix_qrb1a1jgz3rn-4>li:before{content:"\0025cb "}ol.lst-kix_eogk2g9lz4ou-0{list-style-type:none}ol.lst-kix_z44608xc5z5-2.start{counter-reset:lst-ctn-kix_z44608xc5z5-2 0}.lst-kix_hte491cj00mg-3>li:before{content:"- "}ol.lst-kix_eogk2g9lz4ou-5{list-style-type:none}ol.lst-kix_rxf8talb6b1y-1.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-1 0}ol.lst-kix_rxf8talb6b1y-7.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-7 0}ol.lst-kix_eogk2g9lz4ou-6{list-style-type:none}ul.lst-kix_sdy6fqgzk2k7-8{list-style-type:none}ol.lst-kix_eogk2g9lz4ou-7{list-style-type:none}ul.lst-kix_sdy6fqgzk2k7-7{list-style-type:none}ol.lst-kix_eogk2g9lz4ou-8{list-style-type:none}ul.lst-kix_sdy6fqgzk2k7-6{list-style-type:none}.lst-kix_qrb1a1jgz3rn-8>li:before{content:"\0025a0 "}ol.lst-kix_eogk2g9lz4ou-1{list-style-type:none}ul.lst-kix_sdy6fqgzk2k7-5{list-style-type:none}ol.lst-kix_eogk2g9lz4ou-2{list-style-type:none}ul.lst-kix_sdy6fqgzk2k7-4{list-style-type:none}ol.lst-kix_eogk2g9lz4ou-3{list-style-type:none}ul.lst-kix_sdy6fqgzk2k7-3{list-style-type:none}ol.lst-kix_eogk2g9lz4ou-4{list-style-type:none}ul.lst-kix_sdy6fqgzk2k7-2{list-style-type:none}.lst-kix_inqgee5fh4k6-8>li:before{content:"- "}.lst-kix_inqgee5fh4k6-7>li:before{content:"- "}.lst-kix_hte491cj00mg-7>li:before{content:"- "}.lst-kix_hte491cj00mg-6>li:before{content:"- "}.lst-kix_55zebeya5hie-1>li{counter-increment:lst-ctn-kix_55zebeya5hie-1}.lst-kix_eogk2g9lz4ou-2>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-2,lower-roman) ". "}.lst-kix_ivvjgdhufo4a-8>li:before{content:"- "}.lst-kix_2vtha56u4mwf-5>li:before{content:"- "}ol.lst-kix_rxf8talb6b1y-6.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-6 0}ul.lst-kix_ivvjgdhufo4a-0{list-style-type:none}ul.lst-kix_ivvjgdhufo4a-1{list-style-type:none}ul.lst-kix_ivvjgdhufo4a-2{list-style-type:none}ul.lst-kix_ivvjgdhufo4a-3{list-style-type:none}ul.lst-kix_ivvjgdhufo4a-4{list-style-type:none}ul.lst-kix_ivvjgdhufo4a-5{list-style-type:none}ul.lst-kix_ivvjgdhufo4a-6{list-style-type:none}.lst-kix_eogk2g9lz4ou-6>li:before{content:"" counter(lst-ctn-kix_eogk2g9lz4ou-6,decimal) ". "}ul.lst-kix_ivvjgdhufo4a-7{list-style-type:none}ul.lst-kix_ivvjgdhufo4a-8{list-style-type:none}.lst-kix_ivvjgdhufo4a-4>li:before{content:"- "}ol.lst-kix_55zebeya5hie-4.start{counter-reset:lst-ctn-kix_55zebeya5hie-4 0}.lst-kix_j6pu4ozg1h9q-4>li:before{content:"\0025cb "}ul.lst-kix_alogm9c9t96n-3{list-style-type:none}ul.lst-kix_alogm9c9t96n-4{list-style-type:none}ul.lst-kix_alogm9c9t96n-5{list-style-type:none}ul.lst-kix_alogm9c9t96n-6{list-style-type:none}.lst-kix_5jxi9skcdaiv-5>li:before{content:"\0025a0 "}ol.lst-kix_rxf8talb6b1y-3.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-3 0}ul.lst-kix_alogm9c9t96n-0{list-style-type:none}ul.lst-kix_alogm9c9t96n-1{list-style-type:none}.lst-kix_rxf8talb6b1y-3>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-3,decimal) ". "}ol.lst-kix_z44608xc5z5-7.start{counter-reset:lst-ctn-kix_z44608xc5z5-7 0}ul.lst-kix_alogm9c9t96n-2{list-style-type:none}.lst-kix_j6pu4ozg1h9q-0>li:before{content:"\0025cf "}ul.lst-kix_alogm9c9t96n-7{list-style-type:none}.lst-kix_ivvjgdhufo4a-0>li:before{content:"- "}ul.lst-kix_alogm9c9t96n-8{list-style-type:none}.lst-kix_5jxi9skcdaiv-1>li:before{content:"\0025cb "}.lst-kix_rxf8talb6b1y-7>li:before{content:"" counter(lst-ctn-kix_rxf8talb6b1y-7,lower-latin) ". "}.lst-kix_2vtha56u4mwf-1>li:before{content:"- "}ol.lst-kix_z44608xc5z5-4.start{counter-reset:lst-ctn-kix_z44608xc5z5-4 0}ol.lst-kix_rxf8talb6b1y-4.start{counter-reset:lst-ctn-kix_rxf8talb6b1y-4 0}.lst-kix_z44608xc5z5-0>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-0,decimal) ". "}.lst-kix_z44608xc5z5-6>li{counter-increment:lst-ctn-kix_z44608xc5z5-6}.lst-kix_alogm9c9t96n-3>li:before{content:"\0025cf "}ol.lst-kix_55zebeya5hie-6.start{counter-reset:lst-ctn-kix_55zebeya5hie-6 0}ul.lst-kix_w6ctxtwswacj-6{list-style-type:none}ul.lst-kix_w6ctxtwswacj-7{list-style-type:none}ul.lst-kix_w6ctxtwswacj-4{list-style-type:none}.lst-kix_jqwplanlf6ac-6>li:before{content:"\0025cf "}ul.lst-kix_w6ctxtwswacj-5{list-style-type:none}ul.lst-kix_hte491cj00mg-0{list-style-type:none}ul.lst-kix_w6ctxtwswacj-2{list-style-type:none}ul.lst-kix_hte491cj00mg-1{list-style-type:none}ul.lst-kix_w6ctxtwswacj-3{list-style-type:none}.lst-kix_sdy6fqgzk2k7-6>li:before{content:"\0025cf "}ul.lst-kix_hte491cj00mg-2{list-style-type:none}ul.lst-kix_w6ctxtwswacj-0{list-style-type:none}ul.lst-kix_hte491cj00mg-3{list-style-type:none}ul.lst-kix_w6ctxtwswacj-1{list-style-type:none}ul.lst-kix_hte491cj00mg-4{list-style-type:none}ul.lst-kix_hte491cj00mg-5{list-style-type:none}ul.lst-kix_hte491cj00mg-6{list-style-type:none}.lst-kix_z44608xc5z5-4>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-4,lower-latin) ". "}ul.lst-kix_hte491cj00mg-7{list-style-type:none}ul.lst-kix_hte491cj00mg-8{list-style-type:none}.lst-kix_sdy6fqgzk2k7-2>li:before{content:"\0025a0 "}ol.lst-kix_55zebeya5hie-7.start{counter-reset:lst-ctn-kix_55zebeya5hie-7 0}ol.lst-kix_z44608xc5z5-5.start{counter-reset:lst-ctn-kix_z44608xc5z5-5 0}.lst-kix_j6pu4ozg1h9q-8>li:before{content:"\0025a0 "}.lst-kix_jqwplanlf6ac-2>li:before{content:"\0025a0 "}.lst-kix_iun8hna84yne-1>li:before{content:"\0025cb "}.lst-kix_55zebeya5hie-8>li{counter-increment:lst-ctn-kix_55zebeya5hie-8}.lst-kix_rxf8talb6b1y-3>li{counter-increment:lst-ctn-kix_rxf8talb6b1y-3}.lst-kix_eogk2g9lz4ou-6>li{counter-increment:lst-ctn-kix_eogk2g9lz4ou-6}.lst-kix_z44608xc5z5-8>li:before{content:"" counter(lst-ctn-kix_z44608xc5z5-8,lower-roman) ". "}.lst-kix_alogm9c9t96n-7>li:before{content:"\0025cb "}.lst-kix_iun8hna84yne-5>li:before{content:"\0025a0 "}.lst-kix_vgo489ljcome-1>li:before{content:"\0025cb "}.lst-kix_e6cn8ienuo6k-6>li:before{content:"- "}ol{margin:0;padding:0}.c9{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:156.8pt;border-top-color:#000000;border-bottom-style:solid}.c36{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:199.5pt;border-top-color:#000000;border-bottom-style:solid}.c28{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:102.8pt;border-top-color:#000000;border-bottom-style:solid}.c52{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:57.8pt;border-top-color:#000000;border-bottom-style:solid}.c13{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:264.8pt;border-top-color:#000000;border-bottom-style:solid}.c21{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:126pt;border-top-color:#000000;border-bottom-style:solid}.c1{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:284.2pt;border-top-color:#000000;border-bottom-style:solid}.c38{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:78pt;border-top-color:#000000;border-bottom-style:solid}.c59{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:468pt;border-top-color:#000000;border-bottom-style:solid}.c29{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:170.2pt;border-top-color:#000000;border-bottom-style:solid}.c35{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:268.5pt;border-top-color:#000000;border-bottom-style:solid}.c44{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:105.8pt;border-top-color:#000000;border-bottom-style:solid}.c5{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:185.2pt;border-top-color:#000000;border-bottom-style:solid}.c48{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:96pt;border-top-color:#000000;border-bottom-style:solid}.c34{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:147pt;border-top-color:#000000;border-bottom-style:solid}.c18{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:51pt;border-top-color:#000000;border-bottom-style:solid}.c43{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:228.8pt;border-top-color:#000000;border-bottom-style:solid}.c46{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:111pt;border-top-color:#000000;border-bottom-style:solid}.c40{border-right-style:solid;padding:2.9pt 2.9pt 2.9pt 2.9pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:269.2pt;border-top-color:#000000;border-bottom-style:solid}.c0{color:#000000;font-weight:normal;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c8{color:#000000;font-weight:normal;text-decoration:none;vertical-align:baseline;font-size:10pt;font-family:"Arial";font-style:normal}.c30{color:#000000;text-decoration:none;vertical-align:baseline;font-size:11pt;font-style:normal}.c7{padding-top:0pt;padding-bottom:0pt;line-height:1.15;text-align:left}.c4{padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c42{border-collapse:collapse;margin-right:auto}.c3{orphans:2;widows:2;direction:ltr}.c57{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c24{font-size:14pt;font-weight:bold}.c19{padding:0;margin:0}.c23{margin-left:36pt;padding-left:0pt}.c22{margin-left:108pt;padding-left:0pt}.c20{padding-top:8pt;height:10pt}.c26{margin-left:144pt;padding-left:0pt}.c49{margin-left:36pt;text-indent:36pt}.c41{margin-left:72pt;padding-left:0pt}.c10{color:#1155cc;text-decoration:underline}.c17{color:inherit;text-decoration:inherit}.c2{color:#100f0c;text-decoration:underline}.c47{font-size:10pt}.c6{height:11pt}.c54{font-size:11pt}.c58{height:13pt}.c50{text-align:right}.c45{padding-top:0pt}.c37{font-size:8pt}.c56{text-decoration:underline}.c33{height:10pt}.c25{color:#100f0c}.c32{padding-top:8pt}.c12{line-height:1.0}.c39{font-size:9pt}.c14{font-family:"Arial"}.c51{font-style:italic}.c15{height:0pt}.c16{page-break-after:avoid}.c31{font-weight:normal}.c11{font-size:12pt}.c55{padding-bottom:10pt}.c53{height:24pt}.c27{font-weight:bold}.title{padding-top:0pt;color:#000000;font-weight:bold;font-size:24pt;padding-bottom:0pt;font-family:"Arial";line-height:1.15;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:13pt;padding-bottom:10pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:10pt;color:#000000;font-size:16pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:10pt;color:#000000;font-weight:bold;font-size:13pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:8pt;color:#666666;font-weight:bold;font-size:12pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:8pt;color:#666666;text-decoration:underline;font-size:11pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:8pt;color:#000000;font-size:10pt;padding-bottom:0pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:0pt;color:#000000;font-size:10pt;padding-bottom:0pt;font-family:"Courier New";line-height:1.0;page-break-after:avoid;orphans:2;widows:2;text-align:left}</style></head><body class="c57"><p class="c3 title"><a name="h.jym5tjorc2rp"></a><span>Yocto Autobuilder Developers Manual<br></span></p><p class="c3"><span class="c31">Contributors<br></span><span class="c31">Elizabeth Flanagan </span><span>&lt;</span><span class="c10"><a class="c17" href="mailto:elizabeth.flanagan@intel.com">elizabeth.flanagan@intel.com</a></span><span>&gt;</span></p><p class="c3"><span class="c31">California Sullivan &nbsp;</span><span>&lt;</span><span class="c10"><a class="c17" href="mailto:california.l.sullivan@intel.com">california.l.sullivan@intel.com</a></span><span>&gt;</span></p><p class="c3"><span class="c31">Michael Halstead </span><span>&lt;</span><span class="c10"><a class="c17" href="mailto:michael@yoctoproject.org">michael@yoctoproject.org</a></span><span>&gt; </span></p><p class="c3"><span>Bryan Evenson &lt;</span><span class="c10"><a class="c17" href="mailto:bevenson@melinkcorp.com">bevenson@melinkcorp.com</a></span><span>&gt;<br>Stefan Agner &lt;</span><span class="c10"><a class="c17" href="mailto:stefan@agner.ch">stefan@agner.ch</a></span><span>&gt;</span></p><p class="c3"><span>Sipke Vriend &lt;</span><span class="c10"><a class="c17" href="mailto:sipke.vriend@xilinx.com">sipke.vriend@xilinx.com</a></span><span>&gt;</span></p><p class="c3"><span>Tomas Frydrych &lt;</span><span class="c10"><a class="c17" href="mailto:tomas@sleepfive.com">tomas@sleepfive.com</a></span><span>&gt;</span></p><p class="c3"><span>Scott Rifenbark &lt;</span><span class="c10"><a class="c17" href="mailto:scott.m.rifenbark@intel.com">scott.m.rifenbark@intel.com</a></span><span>&gt;</span></p><p class="c3"><span>Tracy Graydon &lt;</span><span class="c10"><a class="c17" href="mailto:tracy.graydon@intel.com">tracy.graydon@intel.com</a></span><span>&gt;</span></p><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Copyright &copy; 2015 Linux Foundation</span></p><p class="c3"><span><br>Coding Standards Section modified from the Yocto Project Development Manual by Scott Rifenbark &lt;</span><span class="c10"><a class="c17" href="mailto:Scott.m.rifenbark@intel.com">scott.m.rifenbark@intel.com</a></span><span>&gt; Copyright &copy; 2010 2014 Linux Foundation<br></span></p><p class="c3"><span>The section on schedulers comes from work initially done by Tomas Frydrych &lt;</span><span class="c10"><a class="c17" href="mailto:tomas@sleepfive.com">tomas@sleepfive.com</a></span><span>&gt; and Bryan Evenson &lt;</span><span class="c10"><a class="c17" href="mailto:bevenson@melinkcorp.com">bevenson@melinkcorp.com</a></span><span>&gt; </span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Permission is granted to copy, distribute and/or modify this document under the terms of the</span><span><a class="c17" href="https://www.google.com/url?q=http://creativecommons.org/licenses/by-sa/2.0/uk/&amp;sa=D&amp;usg=AFQjCNGppO3ltlRjxEgzMQRcuSRF-CqxbQ">&nbsp;</a></span><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://creativecommons.org/licenses/by-sa/2.0/uk/&amp;sa=D&amp;usg=AFQjCNGppO3ltlRjxEgzMQRcuSRF-CqxbQ">Creative Commons Attribution-Share Alike 2.0 UK: England &amp; Wales</a></span><span>&nbsp;as published by Creative Commons. </span></p><p class="c3 c6"><span class="c27"></span></p><p class="c3 c6"><span class="c27"></span></p><a href="#" name="6fc8c91e5e6cccac69232ddf9775e7e2d8f66e4e"></a><a href="#" name="0"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c46" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Commit</span></p></td><td class="c43" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Author(s)</span></p></td><td class="c34" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Date</span></p></td></tr><tr class="c15"><td class="c46" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Initial draft</span></p></td><td class="c43" colspan="1" rowspan="1"><p class="c4 c3"><span>California Sullivan &lt;</span><span class="c10"><a class="c17" href="mailto:california.l.sullivan@intel.com">california.l.sullivan@intel.com</a></span><span class="c0">&gt;<br>Elizabeth Flanagan &lt;elizabeth.flanagan@intel.com&gt;</span></p><p class="c4 c3"><span>Michael Halstead<br>&lt;</span><span class="c10"><a class="c17" href="mailto:michael@yoctoproject.org">michael@yoctoproject.org</a></span><span class="c0">&gt;</span></p></td><td class="c34" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">September 15th 2014</span></p></td></tr><tr class="c15"><td class="c46" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Add GEN_IMG_MD5</span></p></td><td class="c43" colspan="1" rowspan="1"><p class="c4 c3"><span>Elizabeth Flanagan &lt;</span><span class="c10"><a class="c17" href="mailto:elizabeth.flanagan@intel.com">elizabeth.flanagan@intel.com</a></span><span class="c0">&gt;</span></p></td><td class="c34" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">September 29th 2014</span></p></td></tr><tr class="c15"><td class="c46" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Add EAM/AD Info</span></p></td><td class="c43" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Tracy Graydon</span></p><p class="c4 c3"><span>&lt;</span><span class="c10"><a class="c17" href="mailto:tracy.graydon@intel.com">tracy.graydon@intel.com</a></span><span class="c0">&gt;</span></p></td><td class="c34" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">September 9th 2015</span></p></td></tr><tr class="c15"><td class="c46" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Add Large Scale deployment information.</span></p></td><td class="c43" colspan="1" rowspan="1"><p class="c4 c3"><span>Elizabeth Flanagan &lt;</span><span class="c10"><a class="c17" href="mailto:elizabeth.flanagan@intel.com">elizabeth.flanagan@intel.com</a></span><span class="c0">&gt;</span></p></td><td class="c34" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">October 14th 2015</span></p></td></tr></tbody></table><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><p class="c3 c6 c16 subtitle"><a name="h.wx1tk3vobc5e"></a></p><hr style="page-break-before:always;display:none;"><p class="c3 c6 c16 subtitle"><a name="h.qtdfesrl9t67"></a></p><p class="c3 c16 subtitle"><a name="h.campvdj3pgpk"></a><span class="c14">Table of Contents</span></p><ol class="c19 lst-kix_55zebeya5hie-0 start" start="1"><li class="c3 c23"><span>Introduction</span></li><li class="c3 c23"><span>Contributing to the yocto-autobuilder</span></li><li class="c3 c23"><span>Getting Started</span></li><li class="c3 c23"><span>Setting up automated testing</span></li><li class="c3 c23"><span>Introduction to the yocto-autobuilder</span></li><li class="c3 c23"><span>High Level Architectural Overview</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-1 start" start="1"><li class="c3 c41"><span>Introduction and Philosophy</span></li><li class="c3 c41"><span>Terminology (Beth but with review from everyone else)</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-2 start" start="1"><li class="c3 c22"><span>What is a buildset</span></li><li class="c3 c22"><span>What is a factory</span></li><li class="c3 c22"><span>What is a build-worker? </span></li><li class="c3 c22"><span>What is a build-controller?</span></li><li class="c3 c22"><span>What is a scheduler?</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-3 start" start="1"><li class="c3 c26"><span>What schedulers do we support?</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-1" start="3"><li class="c3 c41"><span>What patches we have made to buildbot and why?</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-2 start" start="1"><li class="c3 c22"><span>yoctogit.py</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-1" start="4"><li class="c3 c41"><span>What projects are contained within it?</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-2 start" start="1"><li class="c3 c22 c6"><span></span></li></ol><ol class="c19 lst-kix_55zebeya5hie-1" start="5"><li class="c3 c41"><span>Config files</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-2 start" start="1"><li class="c3 c22"><span>What is the format of the autobuilder.conf file?</span></li><li class="c3 c22"><span>How do I change the global configuration file?</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-1" start="6"><li class="c3 c41"><span>Buildsets</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-2 start" start="1"><li class="c3 c22"><span>what is a buildset?</span></li><li class="c3 c22"><span>Is the format of a buildset?</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-3 start" start="1"><li class="c3 c26"><span>builders</span></li><li class="c3 c26"><span>repos</span></li><li class="c3 c26"><span>props</span></li><li class="c3 c26"><span>steps</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-2" start="3"><li class="c3 c22"><span>How do I create my own buildset?</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-1" start="7"><li class="c3 c41"><span>Buildsteps</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-2 start" start="1"><li class="c3 c22"><span>what is a buildstep?</span></li><li class="c3 c22"><span>what is the format requirements of a buildstep?</span></li><li class="c3 c22"><span>How do I create my own buildstep?</span></li><li class="c3 c22"><span>Buildstep Class Documentation</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-1" start="8"><li class="c7 c3 c41"><span>Release JSON</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-2 start" start="1"><li class="c3 c22"><span>(Note: Stub this out. The functionality isn&rsquo;t done yet, but perhaps thinking about how this is all done will manifest it into existence)</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-0" start="7"><li class="c3 c23"><span>Advanced Topics:</span></li></ol><ol class="c19 lst-kix_55zebeya5hie-1 start" start="1"><li class="c3 c41"><span>How do I debug?</span></li><li class="c3 c41"><span>How do I optimize it/make it faster?</span></li><li class="c3 c41"><span>Should I use it </span><span>versus</span><span>&nbsp;another CI solution?</span></li><li class="c3 c41"><span>Are there &ldquo;gotchas&rdquo; in using the yocto autobuilder?</span></li><li class="c3 c41"><span>why Should I use/not use DL_DIR to maintain GPL compliance?</span></li><li class="c3 c41"><span>why Should I use/not use &nbsp;an exposed SSTATE_DIR mirror?</span></li><li class="c3 c41"><span>Do I maintain a large autobuilder cluster?</span></li><li class="c3 c41"><span>Doing embedded Linux distribution releases with the yocto-autobuilder</span></li><li class="c3 c41"><span>Use EAM/AD with yocto-autobuilder?</span></li></ol><hr style="page-break-before:always;display:none;"><p class="c3 c6"><span></span></p><p class="c3 c16 subtitle"><a name="h.2ksayeu0zwky"></a><span class="c14">Introduction</span></p><p class="c3"><span>The yocto-autobuilder is a continuous integration system as well as the build and release tool used by the Yocto Project and its end users. The main purpose of the yocto-autobuilder is to replicate many of the steps that an end user would take to build an embedded Linux distribution, test the build output of a build run and perform most of the Yocto Project release. &nbsp;The current production yocto-autobuilder is found at http://autobuilder.yoctoproject.org/main/<br><br>The core of the yocto-autobuilder is Buildbot, currently at 0.8.8 with a few Yocto Project specific patches. However the yocto-autobuilder is not like most Buildbot implementations. Most Buildbot implementations treat Buildbot as an out of the box CI solution. <br><br>The yocto-autobuilder utilizes Buildbot as set of libraries. Think of the yocto-autobuilder as an abstraction layer around Buildbot that allows you to interact with Buildbot and generate Buildbot configuration files without actually having to know the intricacies around Buildbot. For more information on design philosophies regarding the yocto-autobuilder see the section </span><span class="c51">&ldquo;High Level Architectural Overview: Introduction and Philosophy&rdquo; </span><span><br><br>The yocto-autobuilder was initially written by Richard Purdie &lt;</span><span class="c10"><a class="c17" href="mailto:rp@linuxfoundation.org">richard.purdie@linuxfoundation.org</a></span><span>&gt;. In December 2012, it was entirely rewritten by Elizabeth &lsquo;pidge&rsquo; Flanagan &lt;</span><span class="c10"><a class="c17" href="mailto:elizabeth.flanagan@intel.com">elizabeth.flanagan@intel.com</a></span><span>&gt;, who is the current maintainer. <br><br>The current production Yocto Project yocto-autobuilder infrastructure is maintained by both Elizabeth Flanagan and Michael Halstead &lt;</span><span class="c10"><a class="c17" href="mailto:michael@yoctoproject.org">michael@yoctoproject.org</a></span><span>&gt;. The majority of discussion related to the yocto-autobuilder occurs on the Yocto Project mailing list &lt;</span><span class="c10"><a class="c17" href="mailto:yocto@yoctoproject.org">yocto@yoctoproject.org</a></span><span>&gt; as well as the #yocto channel on FreeNode irc servers.<br><br>The yocto-autobuilder code is licensed under the GNU General Public License version 2 (GPL-2.0). Dependencies packaged with the yocto-autobuilder are licensed under their associated licenses as denoted in the COPYING* files within the yocto-autobuilder root directory.</span></p><p class="c3 c6"><span></span></p><p class="c3 c16 c55 subtitle"><a name="h.yi4ca48vcpk5"></a><span class="c14">Contributing to the yocto-autobuilder</span></p><p class="c3"><span>The yocto-autobuilder is an open source project and as such we welcome community contributions. Because the yocto-autobuilder is extremely configurable and flexible, we recognize that developers will want to extend, configure or optimize it for their specific uses.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>We ask that if you contribute a patch to the yocto-autobuilder that you make the patch as generic as possible. If you have, for example, written a buildstep that is useful to your organization and is probably useful to the overall project, we ask that you make it so that specific things (strings, emails, etc.) that would be specific to your organization are abstracted out into the global configuration file (autobuilder.conf.example).</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>When you send a patch, be sure to include a &quot;Signed-off-by:&quot; line in the same style as required by the Linux kernel. Adding this line signifies that you, the submitter, have agreed to the Developer&#39;s Certificate of Origin 1.1 as follows:</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Developer&#39;s Certificate of Origin 1.1</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By making a contribution to this project, I certify that:</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a) The contribution was created in whole or in part by me and I</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;have the right to submit it under the open source license</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indicated in the file; or</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(b) The contribution is based upon previous work that, to the best</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of my knowledge, is covered under an appropriate open source</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;license and I have the right under that license to submit that</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;work with modifications, whether created in whole or in part</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by me, under the same open source license (unless I am</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;permitted to submit under a different license), as indicated</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in the file; or</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(c) The contribution was provided directly to me by some other</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person who certified (a), (b) or (c) and I have not modified</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(d) I understand and agree that this project and the contribution</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;are public and that a record of the contribution (including all</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personal information I submit with it, including my sign-off) is</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maintained indefinitely and may be redistributed consistent with</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this project or the open source license(s) involved.</span></p><p class="c3"><span>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p><p class="c3"><span>For each commit, you must provide a single-line summary of the change submitted and you should almost always provide a more detailed description of what you did (i.e. the body of the commit message). The only exceptions for not providing a detailed description would be if your change is a simple, self-explanatory change that needs no further description beyond the summary.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>We recommend that contributors follow the PEP8 Coding Guidelines http://legacy.python.org/dev/peps/pep-0008/ especially with regard to spaces v. tabs (PROTIP: 4 spaces. Always)</span></p><p class="c3 c16 subtitle"><a name="h.doastvd1t2ls"></a><span class="c14">Getting Started</span></p><p class="c3"><span>The quickest method to get a basic yocto-autobuilder instance in place is to do the following:<br></span></p><h6 class="c3 c16"><a name="h.9p9c4o3dqhmk"></a><span class="c14">git clone git://git.yoctoproject.org/yocto-autobuilder<br>cd yocto-autobuilder<br>. ./yocto-autobuilder-setup<br>yocto-start-autobuilder both</span></h6><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>This will set up a basic yocto-autobuilder controller and a single worker on a single machine. The yocto-autobuilder utilizes (generally) a single controller and one or more workers. These systems can be started and stopped independently of each other. In order to start or stop either the worker or controller independently:<br></span></p><h6 class="c3 c16"><a name="h.pr5ymd9g0mr4"></a><span class="c14"><br>. ./yocto-autobuilder-setup<br>yocto-stop-autobuilder worker</span></h6><h6 class="c3 c12 c16"><a name="h.istcggivldtj"></a><span class="c14">yocto-stop-autobuilder controller</span></h6><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><h6 class="c3 c12 c16"><a name="h.ke1bc65w47hl"></a><span class="c14">. ./yocto-autobuilder-setup<br>yocto-start-autobuilder worker</span></h6><h6 class="c3 c12 c16"><a name="h.wpo9jnurjl79"></a><span class="c14">yocto-start-autobuilder controller</span></h6><p class="c3 c6"><span></span></p><p class="c3"><span>Please be aware that you MUST either setup a ~/.bashrc with the contents of ./yocto-autobuilder-setup or make it so that the file is sourced prior to trying to starting or stopping any portion of the yocto-autobuilder.<br></span></p><p class="c3"><span>Do keep in mind that this is a very basic setup, with a single machine, single controller and a single worker utilizing the default buildsets we use for Yocto Project releases. These buildsets are rather large and are meant to be utilized in a large scale cluster.<br><br>Most instances of the yocto-autobuilder are generally part of a large scale infrastructure utilizing many workers. For details on how to set up and maintain large scale yocto-autobuilder infrastructures like this, please see the section &ldquo;</span><span class="c51">Advanced Topics: Maintaining and Setting up yocto-autobuilder clusters.</span><span>&rdquo;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>During the initial run of . ./yocto-autobuilder-setup a generated username and password will be created. This is to ensure that some level of security is enabled during the initial configuration. <br><br>/</span></p><a href="#" name="e8e6272cbd362f7bd467d769160af02b37b52ce8"></a><a href="#" name="1"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c59" colspan="1" rowspan="1"><h6 class="c4 c3 c16"><a name="h.4f106rdknz78"></a><span class="c8">Creating buildset-config from buildset-config.controller</span></h6><h6 class="c4 c3 c33 c16"><a name="h.o4hnmo5f8z11"></a></h6><h6 class="c4 c3 c16"><a name="h.y63owuyqehu6"></a><span class="c8">&nbsp;You&#39;ve not setup the autobuilder before. Generating a username/password</span></h6><h6 class="c4 c3 c16"><a name="h.wbhuzh1o9o3q"></a><span class="c8">&nbsp;combo for you.</span></h6><h6 class="c4 c3 c33 c16"><a name="h.2jzqx6sc42ab"></a></h6><h6 class="c4 c3 c16"><a name="h.4c59e8uktdfv"></a><span class="c8">&nbsp;Username = 4wEWTMh6G</span></h6><h6 class="c4 c3 c16"><a name="h.aeg2537uq8gj"></a><span class="c8">&nbsp;Password = uARwXSBTe</span></h6><h6 class="c4 c3 c33 c16"><a name="h.9tvldpn14pfw"></a></h6><h6 class="c4 c3 c16"><a name="h.hqiucuunsz6q"></a><span class="c8">&nbsp;Modifying the following files with this username/password:</span></h6><h6 class="c4 c3 c33 c16"><a name="h.n2pe9dwqjx3s"></a></h6><h6 class="c4 c3 c16"><a name="h.4npiq3anszjm"></a><span class="c8">&nbsp;/home/pidge/yocto-autobuilder/yocto-controller/controller.cfg</span></h6><h6 class="c4 c3 c16"><a name="h.6ujk481uku2l"></a><span class="c8">&nbsp;/home/pidge/yocto-autobuilder/yocto-worker/buildbot.tac</span></h6><h6 class="c4 c3 c33 c16"><a name="h.we2xzgi2ttwz"></a></h6><h6 class="c4 c3 c16"><a name="h.llaj9impgd1z"></a><span class="c8">&nbsp;If you wish to use your own generated username and password please</span></h6><h6 class="c4 c3 c16"><a name="h.qvh7bg51mqni"></a><span class="c8">&nbsp;modify the above files as needed. Please see the README for more</span></h6><h6 class="c4 c3 c16"><a name="h.dqw6anxrz7oe"></a><span class="c8">&nbsp;information.</span></h6><p class="c4 c3 c6"><a name="h.qbv67e6yvnkn"></a></p></td></tr></tbody></table><h6 class="c3 c33 c16"><a name="h.5z5cb3tmfssd"></a></h6><p class="c3"><span class="c47 c51">Initial setup of the yocto-autobuilder showing automatically generated username and password</span></p><h6 class="c3 c33 c16"><a name="h.e8uhxmssgmu3"></a></h6><p class="c3"><span>This password and username is displayed on the terminal during the initial configuration and is also added to the default configuration files. In order to change the automatically generated usernames and passwords you must edit the yocto-controller/controller.cfg file and the yocto-worker/buildbot.tac file<br><br>&lt;Insert image of files and where to change what&gt;<br></span></p><hr style="page-break-before:always;display:none;"><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><p class="c3 c16 subtitle"><a name="h.hbtu8yu4bn5c"></a><span class="c14">Setting up automated testing</span></p><p class="c3"><span>The yocto-autobuilder has the ability to run the Yocto Project automated test suites. This is run by the RunSanityTests build steps.<br><br>In order to be able to run these, you must set up your workers to be able to run qemu with virtual network tap devices. There are a few ways of setting these up, but probably the best method to do so securely is to utilise the runqemu-gen-tapdevs script in scripts directory of the the poky repo.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span class="c27">Setup prerequisites:</span><span><br> &nbsp; &nbsp; &nbsp;- &nbsp; &nbsp;you will need a checkout of poky (git clone git://git.yoctoproject.org/poky)<br> &nbsp; &nbsp; &nbsp;- &nbsp; &nbsp;you will need a native-sysroot (we suggest building your own or downloading one from the yocto project download site at downloads.yoctoproject.org/releases/yocto)</span></p><ul class="c19 lst-kix_2vtha56u4mwf-0 start"><li class="c3 c23"><span>you will need to disable NetworkManager as it seems to remove tap devs</span></li></ul><p class="c3 c6"><span></span></p><p class="c3"><span>You will need to run the script as root:</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>&nbsp;sudo ./scripts/runqemu-gen-tapdevs &lt;uid of the build user&gt; &lt;gid of the build user&gt; &lt;num of tap devices. we use 24 on our servers&gt; &lt;native-sysroot-basedir&gt;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Once this is complete, you should setup a vnc session and log into it at least once.<br><br>1. Install tight-vnc client and server.</span></p><p class="c3"><span>2. Set up tap devs by running poky/scripts/runqemu-gen-tapdevs</span></p><p class="c3"><span>3. Add &quot;xterm*vt100*geometry: 80x50+10+10&quot; to .Xdefaults</span></p><p class="c3"><span>4. Setup and start vnc session as the autobuilder user.</span></p><p class="c3"><span>5. You MUST manually connect to the vnc session at least once prior to</span></p><p class="c3"><span>&nbsp; &nbsp;running a qemu sanity test (Something is getting set during the initial</span></p><p class="c3"><span>&nbsp; &nbsp;connection that I haven&#39;t figured out yet. Manually connecting seems to</span></p><p class="c3"><span>&nbsp; &nbsp;set up the session correctly.)</span></p><p class="c3 c16 subtitle"><a name="h.hf4hiordgw9a"></a><span class="c14"><br>Introductory use of the yocto-autobuilder</span></p><p class="c3"><span>Following the above steps you should have a functional yocto-autobuilder running on your host system. You should be able to point a web browser to port 8010 of the machine you have set the yocto-autobuilder up on and see a functional autobuilder (i.e. </span><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://localhost:8010&amp;sa=D&amp;usg=AFQjCNF9aARYDQmN-e4hI_YU28rL8ye5HA">http://localhost:8010</a></span><span>&nbsp;or </span><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://myawesomeautobuilder.foo.org:8010&amp;sa=D&amp;usg=AFQjCNFqUYmElBex7_pf2_Gi33xck6Ra6g">http://myawesomeautobuilder.foo.org:8010</a></span><span><a class="c17" href="https://www.google.com/url?q=http://myawesomeautobuilder.foo.org:8010&amp;sa=D&amp;usg=AFQjCNFqUYmElBex7_pf2_Gi33xck6Ra6g">) </a></span></p><p class="c3 c6"><span></span></p><h5 class="c3 c16"><a name="h.eugat8d5osss"></a><span style="overflow: hidden; display: inline-block; margin: -0.00px 0.00px; border: 2.67px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 653.63px; height: 373.50px;"><img alt="openscreen.png" src="images/image01.png" style="width: 653.63px; height: 373.50px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span><span><br>Initial Screen on first startup of the yocto-autobuilder</span></h5><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><p class="c3"><span>If you do not see this screen, a few things may have gone wrong.</span></p><ul class="c19 lst-kix_w6ctxtwswacj-0 start"><li class="c3 c23"><span>Proxy issues/network issues/firewall issues</span></li><li class="c3 c23"><span>The controller never started</span></li></ul><p class="c3"><span><br>For more details on debugging a yocto-autobuilder instance see &ldquo;</span><span class="c51">Advanced Topics: Debugging a broken yocto-autobuilder&rdquo;</span><span><br></span></p><p class="c3 c16 subtitle"><a name="h.s3sfsvc42osf"></a><span class="c14">High Level Architectural Overview</span></p><h2 class="c3 c16 c58"><a name="h.nagxed8fq7sr"></a></h2><h2 class="c3 c16"><a name="h.v1umf6wh8cv"></a><span class="c14">Introduction and Philosophy</span></h2><h6 class="c3 c16 c33"><a name="h.z3mo5bsprul0"></a></h6><p class="c3"><span>The yocto-autobuilder was initially a standard Buildbot implementation. In it&rsquo;s initial incarnation it was a simple 600 line configuration file. As the needs of the Yocto Project grew, the yocto-autobuilder was relied on more and more to support the project. It became apparent in mid-2012 that the initial design of the yocto-autobuilder wasn&rsquo;t flexible enough to deal with the needs of the project.<br><br>The re-write of the yocto-autobuilder started out with a few design goals:</span></p><p class="c3 c6"><span></span></p><ol class="c19 lst-kix_z44608xc5z5-0 start" start="1"><li class="c3 c23"><span>The yocto-autobuilder is not a &lsquo;reference design&rsquo;. It is a product and should be developed as if it were used by those outside the Yocto Project.</span></li><li class="c3 c23"><span>Casual users of the yocto-autobuilder should never have to see the inner workings of Buildbot.</span></li><li class="c3 c23"><span>Developer users of the yocto-autobuilder should have a stable and standard API to utilize that limits the amount of Buildbot knowledge they need to have.</span></li><li class="c3 c23"><span>Code, configuration and buildset definitions will never again be in a single unmaintainable file.</span></li><li class="c3 c23"><span>Conditional buildsteps will always be written at the buildstep layer. We will never utilize doStepIf.</span></li><li class="c3 c23"><span>Buildsteps should have a clearly defined standard.</span></li><li class="c3 c23"><span>Buildset definitions should be written as configuration, not code.</span></li><li class="c3 c23"><span>We will support the ability to build prior Yocto Project releases for a minimum of what was initially a year (we can currently build with minor issues as far back as 1.4)</span></li><li class="c3 c23"><span>The yocto-autobuilder cluster used by the Yocto Project will share between worker nodes as much common data (SSTATE_DIR, DL_DIR) as possible in order to speed up build times.</span></li></ol><p class="c3"><span><br>The current yocto-autobuilder code base has been operational since the 1.3 release. The Yocto Project autobuilder infrastructure consists of a NAS which contains the SSTATE_DIR and DL_DIR common to all builders operating on all workers, one controller and ten physical machines running two to three workers a piece. This allows us to build, test and release, around .25 TB of build artifacts and around 250,000 build artifacts (around 140 images across 17 different MACHINES) in around 3 to 11 hours depending on the size of the changeset being built and the number of things that need to be rebuilt due to the change.</span></p><p class="c3 c6"><span></span></p><h5 class="c3 c16 c20"><a name="h.vx9ilulew8hf"></a></h5><ul class="c19 lst-kix_jqwplanlf6ac-0 start"><li class="c3 c23"><span>Terminology (Beth but with review from everyone else)</span></li></ul><ul class="c19 lst-kix_jqwplanlf6ac-1 start"><li class="c3 c41"><span>What is a build-worker? (Beth)</span></li><li class="c3 c41"><span>What is a build-controller? (Beth)</span></li><li class="c3 c41"><span>What is a scheduler? (Cal)</span></li></ul><ul class="c19 lst-kix_jqwplanlf6ac-2 start"><li class="c3 c22"><span>What schedulers do we support?</span></li></ul><ul class="c19 lst-kix_jqwplanlf6ac-0"><li class="c3 c23"><span>What patches we have made to buildbot and why? (Beth)</span></li></ul><ul class="c19 lst-kix_jqwplanlf6ac-1 start"><li class="c3 c41"><span>yoctogit.py</span></li></ul><ul class="c19 lst-kix_jqwplanlf6ac-0"><li class="c3 c23"><span>What projects are contained within it? (Beth)</span></li></ul><ul class="c19 lst-kix_jqwplanlf6ac-1 start"><li class="c3 c41 c6"><span></span></li></ul><h2 class="c3 c16"><a name="h.om7ekjlsi0z1"></a><span class="c14">Config files</span></h2><h3 class="c3 c16"><a name="h.db796lhd1kp5"></a><span class="c14">What is the format of the autobuilder.conf file?</span></h3><p class="c3"><span>The autobuilder.conf file is used to set autobuilder wide parameters, like where various build<br>artifacts are published to, DL_DIR, SSTATE_DIR or if build artifacts should be<br>published.</span></p><p class="c3 c6"><span></span></p><a href="#" name="d53b2ae8b8588625772cffe614678439c574ecbb"></a><a href="#" name="2"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Field</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Type</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Description</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">OPTIMIZED_GIT_CLONE</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">OGIT_TRASH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory </span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Provides the trash directory.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">OGIT_MIRROR_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory </span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Provides the mirror directory.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">OGIT_TRASH_CRON_TIME</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Crontab input string for ogit trash process</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c3 c7"><span class="c0">OGIT_TRASH_NICE_LEVEL</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">int string </span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Sets the nice level of the ogit trash process.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BUILD_HISTORY_COLLECT</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Turns build history collection on or off.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BUILD_HISTORY_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory to use for buildhistory.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BUILD_HISTORY_REPO</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">URL string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Repo to use for buildhistory.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ERROR_REPORT_COLLECT</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Turns error report collection on or off.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ERROR_REPORT_SERVER</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">URL</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Server to send error reports.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ERROR_REPORT_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory to store error reports.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">PUBLISH_BUILDS</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean </span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Turns build publishing on or off.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">PUBLISH_SOURCE_MIRROR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Turns source mirrow publishing on or off.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">PUBLISH_SSTATE</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Turns sstate publishing on or off.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">MAINTAIN_PERSISTDB</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Turns persistent database maintaining on or off.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">GEN_IMG_MD5</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">During PublishArtifacts step it will generate and publish the md5sums of the image if True</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">MACHINE_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Subdirectory within BUILD_PUBLISH_DIR to publish machine artifacts.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BA_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Build appliance publishing directory</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">QEMU_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Subdirectory within BUILD_PUBLISH_DIR to publish QEMU artifacts.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">RPM_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Subdirectory within BUILD_PUBLISH_DIR to publish RPM artifacts.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">DEB_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Subdirectory to publish debian packages.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">IPK_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Subdirectory within BUILD_PUBLISH_DIR to publish IPK artifacts.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">MARKED_RELEASE_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">No longer used.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ADT_INST_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory the adt-installer is published to under DEST</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ADTQA_INST_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory the QA version of the adt-installer is published to under DEST</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">SSTATE_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory to publish sstate.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">SOURCE_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory to publish source code.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BUILD_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory to publish builds.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">RELEASE_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Release directory.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">X86TC_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory the x86 toolchain is published to under DEST</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">X8664TC_PUBLISH_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory the x86-64 toolchain is published to under DEST</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">DL_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory to store downloads.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">SSTATE_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory to store sstate.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">TMP_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">tmp directory path.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">IMAGE_FSTYPES</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">PERSISTDB_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Directory to store the persistdb</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BB_NUMBER_THREADS</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">int string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Sets BB_THREADS in auto.conf</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">PARALLEL_MAKE_NUM</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">int string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Number of threads to use while using make.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">RESOLVE_TRIGGERED_HEAD</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">We immediately resolve what FETCH_HEAD is for a build and utilize that commit hash for all triggered builds</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">DEVKERNEL_MUT_REPO</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">URL to git repo and list of branches used.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">DEVKERNEL</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Name of dev kernel.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ADTREPO_POPULATE</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ADTREPO_DEV_POPULATE</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">boolean</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ADTREPO_URL</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">URL string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ADTREPO_PATH</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ADTREPO_DEV_URL</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">URL string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ADTREPO_DEV_PATH</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">EMGD_DRIVER_DIR</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">WEB_ROOT</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">directory string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Base of web visible directory.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">WEB_URL</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">URL string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">QA_MAIL_TO</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">List of email addresses to send QA email to.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">QA_MAIL_CC</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">List of email addresses to CC QA email to.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">QA_MAIL_BCC</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">List of email addresses to BCC QA email to.</span></p></td></tr><tr class="c15"><td class="c29" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">QA_MAIL_SIG</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">string</span></p></td><td class="c13" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Signature to use in sent emails.</span></p></td></tr></tbody></table><p class="c3 c6"><span></span></p><h3 class="c3 c16"><a name="h.wd202ph67o7"></a><span class="c14">How do I change the global configuration file?</span></h3><p class="c3"><span>Change the values of a field by editing the value to the right of the &lsquo;=&rsquo; sign. Also, some fields may be commented out via a &lsquo;#&rsquo; sign. These can be removed to make the property take effect. Make sure to restart the autobuilder after changing anything in the configuration file.</span></p><p class="c3 c6"><span></span></p><ul class="c19 lst-kix_jqwplanlf6ac-0"><li class="c3 c23"><span>yocto-controller/controller.cfg file</span></li><li class="c3 c23"><span>yocto-worker/buildbot.tac file</span></li></ul><h2 class="c3 c16"><a name="h.vnf90xbhrwjc"></a><span class="c14">Buildsets</span></h2><h3 class="c3 c16"><a name="h.qf6tfuw8jqm0"></a><span class="c14">What is a buildset?</span></h3><p class="c3"><span>A buildset is a configuration file that tells the yocto-autobuilder parser basic information and the buildsteps necessary to create a Buildbot build factory. The buildset directory&rsquo;s contents are parsed during start of the yocto-autobuilder controller and a Buildbot configuration is generated from these files.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Buildset files are essentially python abstract syntax trees.<br></span></p><h6 class="c3 c16"><a name="h.4dbznzj5rggu"></a><span class="c14"><br>[buildset-name]<br>builders: [&#39;example-worker&#39;, &#39;other-example-worker&#39;]<br>repos: [{&#39;poky&#39;:<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&#39;repourl&#39;:&#39;git://git.yoctoproject.org/poky&#39;,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;branch&#39;:&#39;daisy&#39;}}]</span></h6><h6 class="c3 c16"><a name="h.5kwvg67t3an5"></a><span class="c14">props: [{&#39;choice-box&#39;:</span></h6><h6 class="c3 c16"><a name="h.5fgu0v85dh0g"></a><span class="c14">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&#39;prop_type&#39;:&#39;ChoiceStringParameter&#39;,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;name&#39;: &#39;choice-box&#39;,</span></h6><h6 class="c3 c16"><a name="h.5g2ekwgm1jfj"></a><span class="c14">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;choice&#39;:[&#39;option-one&#39;, &#39;option-two&#39;],<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;label&#39;:&#39;&lt;hr&gt;&lt;h3&gt;CHOICE_BOX_HEADING:&lt;/h3&gt;&#39;}}]<br>steps: [{&#39;SetDest&#39;:{}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;CheckOutLayers&#39;: {}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;RunPreamble&#39;: {}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;CreateAutoConf&#39;: {&#39;machine&#39;: &#39;example-machine&#39;, &#39;distro&#39;: </span><span class="c14">&#39;poky</span><span class="c14">&#39;}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;CreateBBLayersConf&#39;: {}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;BuildImages&#39;: {&#39;images&#39;: &#39;custom-example-image&#39;}}]</span></h6><h6 class="c3 c16"><a name="h.xd4wdmfmj77e"></a><span class="c14">scheduler: [{&#39;name-of-scheduler&#39;: {&#39;type&#39;:&#39;Nightly&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;repository&#39;:&#39;poky&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;hour&#39;:0,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;minute&#39;:0}}]</span></h6><p class="c3 c6"><span></span></p><p class="c3"><span><br>Buildsets have at least three, possibly five sections within them - builders, repos, props, steps and schedulers with the props and schedulers sections being optional. Buildsets within the buildset-config directory will appear on the waterfall page of the autobuilder.</span></p><h3 class="c3 c16"><a name="h.w3tgcacgyifm"></a><span class="c14">What is the format of a buildset?</span></h3><h4 class="c3 c16"><a name="h.c4lqgy2sahkw"></a><span class="c14">builders</span></h4><p class="c3"><span>A list of workers that a buildset should use. </span><span>If only one worker is being used by the buildset, a string can be used instead of a list.</span></p><p class="c3 c6"><span></span></p><h6 class="c3 c12 c16"><a name="h.f44wht3o5rws"></a><span class="c14">builders: &#39;example-worker&#39;</span></h6><p class="c3 c6"><span></span></p><p class="c3"><span>or</span></p><p class="c3 c6"><span></span></p><h6 class="c3 c16"><a name="h.2ngd9qpgxcos"></a><span class="c14">builders: [&#39;example-worker&#39;, &#39;other-example-worker&#39;]</span></h6><h4 class="c3 c16"><a name="h.em6hs1tnm7lt"></a><span class="c14">repos</span></h4><p class="c3"><span>A list of dictionaries that provides information about the repositories that are needed for a buildset. NOTE: Either the poky or oe-core repository must be listed first in the repos section because anything above them will be deleted when poky or oe-core is re-checked out, as they are the root directories for building.</span></p><p class="c3 c6"><span></span></p><h6 class="c3 c16"><a name="h.bpjmcf9uh9bb"></a><span class="c14">&nbsp; &nbsp; &nbsp; &nbsp;{&#39;name-of-repo&#39;:<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&#39;repourl&#39;:&#39;git://path.to/git_repo&#39;,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;layerversion&#39;:&#39;core&#39;,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;checkout&#39;:False,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;branch&#39;:&#39;master&#39;}},</span></h6><p class="c3"><span><br>&lt;Note from Beth: I want a description of each field. &gt;</span></p><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><a href="#" name="209e4464ce1dfe52a3722731ffec524cd25691a6"></a><a href="#" name="3"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Field</span></p></td><td class="c44" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Optional/Required</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Description</span></p></td></tr><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">repourl</span></p></td><td class="c44" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Required</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The repository that a git clone will be attempted from.</span></p></td></tr><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">layerversion</span></p></td><td class="c44" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">checkout</span></p></td><td class="c44" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Defaults to True. If false, the repo&rsquo;s information is loaded but it is not checked out.</span></p></td></tr><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">branch</span></p></td><td class="c44" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Required</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The branch of the repository to use.</span></p></td></tr></tbody></table><p class="c3 c6"><span></span></p><h4 class="c3 c16"><a name="h.j33sgw3t462r"></a><span class="c14">props</span></h4><p class="c3"><span>A list of dictionaries that allows you to add custom properties to a build through the web interface. These are abstractions of Buildbot parameters as described in the </span><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://docs.buildbot.net/0.8.8/manual/cfg-schedulers.html?highlight%3Dchoicestringparameter%23forcescheduler-parameters&amp;sa=D&amp;usg=AFQjCNHjw8TzyQZch2kC5e1NzUbX4O4LkQ">ForceSched Parameters</a></span><span>&nbsp;section of the Buildbot manual. The yocto-autobuilder supports the following parameters: </span><span>FixedParameter, StringParameter, BooleanParameter and &nbsp;ChoiceStringParameter.<br><br>We currently do not support: UserNameParameter, IntParameter and TextParameter</span></p><p class="c3 c6"><span></span></p><h6 class="c3 c16"><a name="h.8y09uxyhmcju"></a><span class="c14">props: [{&#39;myname&#39;:{&#39;prop_type&#39;:&#39;ChoiceStringParameter&#39;,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;name&#39;: &#39;myname&#39;,</span></h6><h6 class="c3 c16"><a name="h.42mwfz2rv51u"></a><span class="c14">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;choice&#39;:[&#39;David&#39;,&#39;Jessica&#39;],<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;label&#39;:&#39;&lt;hr&gt;&lt;h3&gt; Your name is?:&lt;/h3&gt;&#39;}}]</span></h6><h5 class="c3 c33 c16"><a name="h.pf05wrnpj1sz"></a></h5><a href="#" name="ec7487d31f43f85448dd3b16849d1b3231f846d1"></a><a href="#" name="4"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c52" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Field </span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Optional/Required</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Description</span></p></td></tr><tr class="c53"><td class="c52" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">prop_type</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Required. </span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The type of property to add.</span></p></td></tr><tr class="c15"><td class="c52" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">name</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c3 c4"><span class="c0">Adds custom_&lt;name&gt; to properties. If missing it uses the prop key</span></p></td></tr><tr class="c15"><td class="c52" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">choice</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Required if using ChoiceStringParameter</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">A list of choices for ChoiceStringParameter</span></p></td></tr><tr class="c15"><td class="c52" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">label</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Required</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The text displayed next to the property on the force build page</span></p></td></tr><tr class="c15"><td class="c52" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">default</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Sets the default selection of a property. If a ChoiceStringParameter, if this is missing, we default to the first entry in the list.</span></p></td></tr><tr class="c15"><td class="c52" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">required</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Defaults to True. If True, a selection is required to start the build (functionality currently broken. Beth, patch this. Also, should Default to False)</span></p></td></tr></tbody></table><p class="c3 c6"><span></span></p><h4 class="c3 c16 c32"><a name="h.3cxfnuu7ilam"></a><span class="c14">steps</span></h4><p class="c3"><span>A list of the buildsteps that are to be done by the buildset, and any parameters that are required by the buildsteps.</span></p><h6 class="c3 c33 c16"><a name="h.5q55yuyfsgws"></a></h6><h6 class="c3 c16"><a name="h.pygwy5w88k7v"></a><span class="c14">steps: [{&#39;SetDest&#39;:{}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;CheckOutLayers&#39;: {}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;RunPreamble&#39;: {}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;CreateAutoConf&#39;: {&#39;machine&#39;: &#39;qemux86&#39;, &#39;distro&#39;: &#39;poky-tiny&#39;}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;CreateBBLayersConf&#39;: {}},<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;BuildImages&#39;: {&#39;images&#39;: &#39;core-image-minimal&#39;}}]</span></h6><p class="c3 c6"><span></span></p><h4 class="c3 c32 c16"><a name="h.ggityiknheep"></a><span class="c14">schedulers:</span></h4><p class="c3"><span>A list of dicts. Each item defines a scheduler associated with this buildset:</span></p><h6 class="c3 c33 c16"><a name="h.vzt5v3r246h5"></a></h6><h6 class="c3 c16"><a name="h.jro17iphjvso"></a><span class="c14">&nbsp; &nbsp; &#39;name_of_scheduler&#39;:<br> &nbsp; &nbsp; &nbsp; &nbsp;{&#39;type&#39;: &#39;Nightly&#39;,</span></h6><h6 class="c3 c16"><a name="h.pjcs10qwili7"></a><span class="c14">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;repo&#39;: &#39;poky&#39;,</span></h6><h6 class="c3 c16"><a name="h.joaedpr66itq"></a><span class="c14">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;hour&#39;: 0,</span></h6><h6 class="c3 c16"><a name="h.29udekf7bojg"></a><span class="c14">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;minute&#39;: 0}</span></h6><h5 class="c3 c16"><a name="h.w2ghdxw00hav"></a><span><br>The scheduler type is specified by the &#39;type&#39; property, where supported values are &#39;Nightly&#39; or &#39;SingleBranchScheduler&#39;, with &#39;Nightly&#39; as the default. Additional properties are used to configure the scheduler and are type-specific:<br><br></span><span class="c27">Nightly scheduler properties:</span></h5><p class="c3 c6"><span></span></p><a href="#" name="095a6afba3165bb677687adebd131eecbcff29e1"></a><a href="#" name="5"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Property</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c14 c27 c30">Required/Optional</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Description</span></p></td></tr><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">month</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The month in which to start the build, with January = 1. This defaults to &#39;*&#39;, meaning every month.</span></p></td></tr><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">dayOfWeek</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The day of the week in which to start the build, with Monday = 1. This defaults to &#39;*&#39;, meaning every day.</span></p></td></tr><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">hour</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Required</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The hour of the day in which to start the build, with 12:00 AM = 0.</span></p></td></tr><tr class="c15"><td class="c38" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">minute</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Required</span></p></td><td class="c1" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The minute of the hour in which to start the build, with 0 to 59 as valid values.</span></p></td></tr></tbody></table><h5 class="c3 c16"><a name="h.6qrq5vlptfqm"></a><span><br></span><span class="c27">SingleBranchScheduler properties:</span></h5><p class="c3 c6"><span></span></p><a href="#" name="973600197440cdb5920d7726621de039a4b94aca"></a><a href="#" name="6"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c48" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Property</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Optional/Required</span></p></td><td class="c40" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Description</span></p></td></tr><tr class="c15"><td class="c48" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">repository</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Required</span></p></td><td class="c40" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">the repository to attach the scheduler to; this is the repo name from the &#39;repos&#39; section; the branch which &nbsp;the scheduler is attached to matches that in the repo definition.</span></p></td></tr><tr class="c15"><td class="c48" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">stable-timer</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c40" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">how long (in seconds) to wait after change before triggering build to allow for changes to settle.</span></p></td></tr><tr class="c15"><td class="c48" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">change-user</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c40" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">the user name which the remote hook will use; the &nbsp;default value is the repository name as per the &#39;repository&#39; property.</span></p></td></tr><tr class="c15"><td class="c48" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">change-password</span></p></td><td class="c28" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Optional</span></p></td><td class="c40" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">password which the remote hook will use; the default is the buildbot default &#39;changepw&#39; -- if your autobuilder is publically accessible, you want to keep this secret to avoid injection of arbitrary changes into your autobuilder.<br></span></p></td></tr></tbody></table><h5 class="c3 c16"><a name="h.9xpudqajj26x"></a><span><br></span><span class="c27">Extra Notes on SingleBranchScheduler setup</span><span><br></span></h5><p class="c3"><span>There is one SBS scheduler for each repository in the buildset, i.e., if your buildset contains more repositories, and you want build triggered by changes to any of them, you need to define a scheduler for each. This also means that you can mix and match, e.g., only do nightly rebuilds for some repos and immediate for others.<br></span></p><p class="c3"><span>The scheduler change filter is set up to watch changes only in the single repository specified, so you have to set up your repository hook to sent the repository url in the change set with the --repository argument to git_buildbot.py, e.g., your git post-receive &nbsp;hook could look something like:<br></span></p><h6 class="c3 c16"><a name="h.xrluuas8ukd9"></a><span class="c14"><br> &nbsp; &nbsp;#!/bin/sh<br> &nbsp; &nbsp;echo &quot;$1 $2 $3&quot; | git_buildbot.py --repository=&quot;git://some_repo...&quot;<br></span></h6><p class="c3"><span><br>For local testing, you can use a post-merge hook instead, along these lines:</span></p><h6 class="c3 c16"><a name="h.64rcw99ffkjq"></a><span class="c14"><br> &nbsp; &nbsp;#!/bin/sh<br> &nbsp; &nbsp;PRE=$(git rev-parse &#39;HEAD@{1}&#39;)<br> &nbsp; &nbsp;POST=$(git rev-parse HEAD)<br> &nbsp; &nbsp;SYMNAME=$(git rev-parse --symbolic-full-name HEAD)<br> &nbsp; &nbsp;echo &quot;$PRE $POST $SYMNAME&quot; | \<br> &nbsp; &nbsp;git_buildbot.py --repository=&quot;file:///where_your_repo_is&quot;</span></h6><p class="c3"><span><br>Because of the way buildbot change sources work, your change user names must not collide with the user names used by your </span><span>workers. </span><span>.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>If you are using a GitPoller changesource and you specify a valid repository but an non-existent branch, Buildbot will silently ignore your scheduler. If a repository has changed recently but your build has not triggered, validate that your repository and branch settings are valid.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>For either a PBChangeSource or a GitPoller changesource, the scheduler will not see the initial repository discovery as a change. If you are using a SingleBranchScheduler schedule, it is good practice to force a build to verify the buildset works correctly.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Example of PBChangeSource:</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[nightly-x86]</span></p><p class="c3"><span>builders: &#39;builder1&#39;</span></p><p class="c3"><span>repos: [{&#39;poky&#39;:</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&#39;repourl&#39;:&#39;git://git.yoctoproject.org/poky&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;bbpriority&#39;:&#39;1&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;branch&#39;:&#39;master&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;meta-qt3&#39;:</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&#39;repourl&#39;:&#39;git://git.yoctoproject.org/meta-qt3&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;bbpriority&#39;:&#39;2&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;branch&#39;:&#39;master&#39;}}]</span></p><p class="c3"><span>steps: [{&#39;SetDest&#39;:{}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;CheckOutLayers&#39;: {}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;RunPreamble&#39;: {}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;CreateAutoConf&#39;: {&#39;machine&#39;: &#39;qemux86&#39;, &#39;SDKMACHINE&#39; : &#39;i686&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;distro&#39;: &#39;poky&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;CreateBBLayersConf&#39;: {&#39;buildprovider&#39; : &#39;yocto&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;BuildImages&#39;: {&#39;images&#39;: &#39;core-image-sato core-image-sato-dev&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;RunSanityTests&#39;: {&#39;images&#39;: &#39;core-image-minimal core-image-sato&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;PublishArtifacts&#39;: {&#39;artifacts&#39;: [&#39;qemux86&#39;, &#39;atom-pc&#39;]}}]</span></p><p class="c3"><span>scheduler: [{&#39;dev-branch-scheduler&#39; :</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&#39;type&#39;:&#39;SingleBranchScheduler&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;repository&#39;:&#39;poky&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;stable-timer&#39;:30,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;change-password&#39;:&#39;secret_change_password&#39;}}]</span></p><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Example of MultiBranch GitPoller:</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[git-poller]</span></p><p class="c3"><span>builders: &#39;example-worker&#39;</span></p><p class="c3"><span>repos: [{&#39;poky-contrib&#39;:</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&#39;repourl&#39;:&#39;git://git.yoctoproject.org/poky-contrib&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;layerversion&#39;:{&#39;core&#39;:&#39;meta&#39;, &#39;yoctobsp&#39;:&#39;meta-yocto-bsp&#39;},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;branch&#39;:&#39;tgraydon/poky&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;meta-qt3&#39;:</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&#39;repourl&#39;:&#39;git://git.yoctoproject.org/poky-contrib&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;branch&#39;:&#39;tgraydon/meta-qt3&#39;}}]</span></p><p class="c3"><span>steps: [{&#39;SetDest&#39;:{}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;CheckOutLayers&#39;: {}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;RunPreamble&#39;: {}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;GetDistroVersion&#39; : {&#39;distro&#39;: &#39;poky&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;CreateAutoConf&#39;: {&#39;machine&#39;: &#39;qemux86&#39;, &#39;SDKMACHINE&#39; : &#39;i686&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;distro&#39;: &#39;poky&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;CreateBBLayersConf&#39;: {&#39;buildprovider&#39; : &#39;yocto&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;BuildImages&#39;: {&#39;images&#39;: &#39;core-image-sato&#39;}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;PublishLayerTarballs&#39;:{}},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; {&#39;PublishArtifacts&#39;: {&#39;artifacts&#39;: [&#39;qemux86&#39;, &#39;atom-pc&#39;]}}]</span></p><p class="c3"><span>scheduler: [{&#39;git-poller-scheduler&#39;:</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&#39;type&#39;:&#39;SingleBranchScheduler&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;changesource&#39;:&#39;GitPoller&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;repository&#39;:&#39;poky-contrib&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;branch&#39;:&#39;tgraydon/poky&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;interval&#39;:3600},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;stable-timer&#39;:300}}]</span></p><p class="c3"><span>scheduler: [{&#39;git-poller-scheduler&#39;:</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&#39;type&#39;:&#39;SingleBranchScheduler&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;changesource&#39;:&#39;GitPoller&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;repository&#39;:&#39;poky-contrib&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;branch&#39;:&#39;tgraydon/meta-qt3&#39;,</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;interval&#39;:3600},</span></p><p class="c3"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;stable-timer&#39;:300}}]</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Note that the &#39;change-password&#39; property is not used for GitPoller. This </span></p><p class="c3"><span>buildset config may also be found in the build-config.examples directory.</span></p><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><h3 class="c3 c16"><a name="h.fs6mwzkke7xv"></a><span class="c14">How do I create my own buildset?</span></h3><ol class="c19 lst-kix_rxf8talb6b1y-0 start" start="1"><li class="c3 c23"><span>Make a new &lt;buildset-name&gt;.conf file and put it in the buildset-config directory.</span></li><li class="c3 c23"><span>Add the [&lt;buildset-name&gt;] field with a name unique within the buildset-config directory. A best practice is to make the name of the file without the .conf and the name of the buildset the same. Example: foo.conf and [foo]</span></li><li class="c3 c23"><span>Add the workers you want to build with to the builders field.</span></li><li class="c3 c23"><span>Identify the repositories and branches needed to build what you want, and add them to the repos field. Either the poky or oe-core repository must be listed first in the repos section because anything above them will be deleted when poky or oe-core is re-checked out, as they are the root directories for building.</span></li><li class="c3 c23"><span>If it needs any custom properties, add them to the props section.</span></li><li class="c3 c23"><span>Identify the steps that are needed to complete your build. For basic builds, usually at least </span><span class="c47">&#39;SetDest&#39;</span><span>,</span><span class="c47">&nbsp;&#39;CheckOutLayers&#39;</span><span>,</span><span class="c47">&nbsp;&#39;RunPreamble&#39;</span><span>,</span><span class="c47">&nbsp;&#39;CreateAutoConf&#39;</span><span>,</span><span class="c47">&nbsp;&#39;CreateBBLayersConf&#39;</span><span>,</span><span class="c47">&nbsp;and &#39;BuildImages&#39;</span><span>&nbsp;are used. Fill out these and any other relevant steps with the necessary information.</span></li></ol><p class="c3 c6"><span></span></p><h2 class="c3 c16"><a name="h.7q7e3fqn2tp3"></a><span class="c14">Buildsteps</span></h2><p class="c3"><span>A buildstep is a python class used to make BuildBot do a certain task.</span></p><p class="c3"><span>There are a number of buildsteps available by default that will take care of most basic building needs. For other tasks you can create your own buildstep.</span></p><ul class="c19 lst-kix_jqwplanlf6ac-0"><li class="c3 c23"><span class="c27">what is the format requirements of a buildstep? (Beth)</span></li></ul><h3 class="c3 c16"><a name="h.n147nqwecmii"></a><span class="c14">How do I create my own buildstep?</span></h3><p class="c3"><span>Creating your own buildstep is easy as long as you know about a few key functions, variables, and functions to override. First, import ShellCommand from buildbot.steps.shell and use that as your new buildstep&rsquo;s type. For example, class Foo(ShellCommand). Then, use the table below.</span></p><p class="c3 c6"><span></span></p><a href="#" name="b64fb990852e8dc6477fd50e5aec7606a45925a7"></a><a href="#" name="7"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c36" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Item</span></p></td><td class="c35" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Purpose</span></p></td></tr><tr class="c15"><td class="c36" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">__init__(self, factory, argdict=None, **kwargs)</span></p></td><td class="c35" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">The contents of this function will be ran when the builder using this buildstep is initialized. Anything that only needs computed once and is available on startup can be done here.</span></p></td></tr><tr class="c15"><td class="c36" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">ShellCommand.__init__(self, **kwargs)</span></p></td><td class="c35" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Initializes the buildstep with any arguments in kwargs. Should be called inside def __init__.</span></p></td></tr><tr class="c15"><td class="c36" colspan="1" rowspan="1"><h6 class="c4 c3 c16"><a name="h.q4ej01figa2j"></a><span class="c54 c14">def start(self)</span></h6></td><td class="c35" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Override this function to make the buildstep do something when the autobuilder gets to this buildstep. If you are using self.command, you will want to call ShellCommand.start() at the end of this function. If start is not overridden, the default ShellCommand.start() is called by itself.</span></p></td></tr><tr class="c15"><td class="c36" colspan="1" rowspan="1"><h6 class="c4 c3 c16"><a name="h.q4ej01figa2j"></a><span class="c0">self.command</span></h6></td><td class="c35" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">A string of the command(s) to be ran when calling</span></p><p class="c7 c3"><span class="c0">ShellCommand.start().</span></p></td></tr><tr class="c15"><td class="c36" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">def commandComplete(self, cmd)</span></p></td><td class="c35" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Override this function to make the buildstep do something when ShellCommand.start() completes.</span></p></td></tr><tr class="c15"><td class="c36" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">cmd.didFail()</span></p></td><td class="c35" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">Useful in commandComplete. Returns whether or not the command failed.</span></p></td></tr><tr class="c15"><td class="c36" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">self.setProperty(&ldquo;name&rdquo;, value)</span></p></td><td class="c35" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">Sets a builder&rsquo;s &ldquo;name&rdquo; property with &lt;value&gt;. This can be used for communication across buildsteps.</span></p></td></tr><tr class="c15"><td class="c36" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">self.getProperty(&quot;name&quot;)</span></p></td><td class="c35" colspan="1" rowspan="1"><p class="c7 c3"><span class="c0">Gets the builder&rsquo;s &ldquo;name&rdquo; property.</span></p></td></tr></tbody></table><p class="c7 c3 c6"><span></span></p><p class="c3"><span>To take input from a buildset .conf file, use the argdict as shown in other buildsteps. The buildstep will get attributes with the name of keys and the values of the values. For example, if the &ldquo;foo&rdquo;: &ldquo;bar&rdquo; was the input in the buildset, the buildstep would get self.foo=&rdquo;bar&rdquo;. </span></p><p class="c3 c6"><span></span></p><h3 class="c3 c16"><a name="h.q4peqc6rvcl2"></a><span class="c14">Default buildsteps</span></h3><p class="c3 c6"><span></span></p><a href="#" name="67b4a9385858399219ed198527614921011bae18"></a><a href="#" name="8"></a><table cellpadding="0" cellspacing="0" class="c42"><tbody><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Buildstep</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Purpose</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c30 c14 c27">Parameters</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BuildEclipsePlugin</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Runs the Yocto Project Eclipse plugin builder</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&ldquo;images&rdquo;: string</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BuildImages</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Uses Bitbake to build the images listed in the space-separated &#39;images&#39; string.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">BuildToolChainImages</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Runs bitbake&#39;s environment setup script, then runs bitbake to build the toolchain images.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">CheckBSPExists</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Checks whether a board support package exists. If the BSP is no longer supported, the build is stopped without counting as a failure. Otherwise, it continues as usual.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">CheckOutLayers</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Uses git to check out the layers required by the build.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">CreateAutoConf</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Creates the auto.conf file, which sets many properties that are used by bitbake.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;adtdev&quot;: bool</span></p><p class="c4 c3"><span class="c0">&quot;atext&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;atextappend&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;atextprepend&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;buildapp&quot;: bool</span></p><p class="c4 c3"><span class="c0">&quot;buildhistory&quot;: bool</span></p><p class="c4 c3"><span class="c0">&quot;distro&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;emgd&quot;: bool</span></p><p class="c4 c3"><span class="c0">&quot;initmgr&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;machine&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;multilib&quot;: string or bool</span></p><p class="c4 c3"><span class="c0">&quot;nosstate&quot;: bool</span></p><p class="c4 c3"><span class="c0">&quot;packages&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;pvr&quot;: bool</span></p><p class="c4 c3"><span class="c0">&quot;swabber&quot;: bool</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">CreateBBLayersConf</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Creates the bblayers.conf file, which tells bitbake which</span></p><p class="c4 c3"><span class="c0">directories to find the layers required by the build.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;bbtext&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;bbtextappend&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;bbtextprepend&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;bsplayer&quot;: bool</span></p><p class="c4 c3"><span class="c0">&quot;bspprovider&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;buildprovider&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;layerdirs&quot;: [string]</span></p><p class="c4 c3"><span class="c0">&quot;x32abi&quot;: bool</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">CreateCurrentLink</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Deletes &lt;DEST&gt;/../CURRENT/ then creates a symbolic link from &lt;DEST&gt; to &lt;DEST&gt;/../CURRENT/.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">CreateIntelBSPPackage</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Creates Intel&#39;s BSP package.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;machine&quot;: string</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">GetDistroVersion</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Gets the version of the current build&#39;s ditribution if it is poky, oecore, or angstrom. If the distribution is none of these, the build step fails.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;distro&quot;: string</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">GetLayerVersion</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Gets the version number of a layer. If it can not find one, the version number defaults to one. Once the version is found, the corresponding property is set as well.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">HelloWorld</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Simply writes a hello world message into the console.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;lastname&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;name&quot;: string</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">NoOp</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Simply exits with a success status.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">PrepPkgIndex</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Copies or links the ipk directory to a tmp directory within the autobuilder so that bitbake package-index can be ran on it.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">PublishArtifacts</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Publishes selected items to their respective publish directories.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;artifacts&quot;: [string]</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">PublishLayerTarballs</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Packages a layer as tarballs and publish them in the directory the DEST property points to.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">ResolveLayerHead</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Gets the git commit hash of the layer head, then updates the properties keeping track of the layer head.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">RunBitbakeSelftest</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Runs bitbake&#39;s environment setp script followed by bitbake&#39;s self test.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">RunOeSelftest</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Runs the bitbake environment setup script, then if the meta-selftest layer exists, oe-selftest is ran. If it doesn&#39;t exist, only the setup script is ran.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">RunPreamble</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Runs the bitbake environment setup script. This script is required to be ran before most bitbake functions, and is therefore needed for most building through the autobuilder.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">RunSanityTests</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Runs sanity tests via bitbake&#39;s testimage or qemuimagetest_standalone commands.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;images&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;scene&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;suites&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;suitesappend&quot;: string</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">SendErrorReport</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Sends error reports to a given server.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">SetDest</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Sets the DEST property if it hasn&#39;t been set already.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;target&quot;: string</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Sleep</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Puts the autobuilder to sleep for the inputted number of seconds. In addition, if &quot;funny&quot; is set to &quot;True&quot;, a funny string is shown on the web interface for that buildstep.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&quot;funny&quot;: string</span></p><p class="c4 c3"><span class="c0">&quot;time&quot;: string</span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">TestFailStep</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Completes immediately and exits with a failure status. Its used to test if failing build steps work properly.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3 c6"><span class="c0"></span></p></td></tr><tr class="c15"><td class="c21" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">TriggerBuilds</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">Starts other builds.</span></p></td><td class="c9" colspan="1" rowspan="1"><p class="c4 c3"><span class="c0">&ldquo;schedulerName&rdquo;: string</span></p><p class="c4 c3"><span class="c0">&ldquo;waitForFinish&rdquo;: boolean</span></p><p class="c4 c3"><span class="c0">&ldquo;schedulerNames&rsquo;: {string:{}}</span></p><p class="c4 c3"><span class="c0">&ldquo;schedulerNames_nowait&rsquo;: {string:{}}</span></p></td></tr></tbody></table><p class="c3 c6"><span></span></p><hr style="page-break-before:always;display:none;"><p class="c3 c16 subtitle"><a name="h.ez3seudiwyhm"></a><span class="c14">Advanced Topics and Questions</span></p><h2 class="c3 c16"><a name="h.yhlxm8i0n5b1"></a><span class="c14">Debugging a broken yocto-autobuilder</span></h2><p class="c3 c6"><span></span></p><p class="c3"><span>The first thing you should do is to verify that the controller and workers are up and running:</span></p><p class="c3 c6"><span></span></p><h6 class="c3 c12 c16"><a name="h.sknvp460p8ru"></a><span class="c37 c14">[pidge@fuath yocto-autobuilder]$ ps aux|grep twist</span></h6><h6 class="c3 c12 c16"><a name="h.qi5f1ry0jscm"></a><span class="c37 c14">pidge &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4545 &nbsp;0.1 &nbsp;0.1 1388716 49080 ? &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sl &nbsp; 16:04 &nbsp; 0:01 /usr/bin/python /home/pidge/yocto-autobuilder/bin/twistd --no_save -y buildbot.tac</span></h6><h6 class="c3 c12 c16"><a name="h.mg04etp33ahf"></a><span class="c14 c37">pidge &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4549 &nbsp;0.0 &nbsp;0.0 306340 19292 ? &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sl &nbsp; 16:04 &nbsp; 0:00 /usr/bin/python /home/pidge/yocto-autobuilder/bin/twistd --no_save -y buildbot.tac</span></h6><h6 class="c3 c12 c16"><a name="h.417j4dy4fng7"></a><span class="c37 c14">pidge &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4985 &nbsp;0.0 &nbsp;0.0 112672 &nbsp;2148 pts/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S+ &nbsp; 16:24 &nbsp; 0:00 grep --color=auto twist</span></h6><p class="c3 c6"><span></span></p><p class="c3"><span>In the above example we see that there are two twistd processes. One should be the controller, the other the worker. The next place we will want to check is the yocto-controller/twistd.log file.</span></p><h5 class="c3 c32 c16"><a name="h.mvtlfawtntuj"></a><span class="c39">./yocto-stop-autobuilder controller; ./yocto-start-autobuilder controller; tail -f yocto-controller/twistd.log</span></h5><h5 class="c3 c32 c16"><a name="h.k651hdex6d9g"></a><span class="c39">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parseRepos(buildset)<br> &nbsp; &nbsp; &nbsp;File &quot;/home/pidge/yocto-autobuilder/lib/python2.7/site-packages/autobuilder/Autobuilder.py&quot;, line 111, in parseRepos<br> &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for layer in ast.literal_eval(self.configdict[buildset][&#39;repos&#39;]):<br> &nbsp; &nbsp; &nbsp;File &quot;/usr/lib64/python2.7/ast.py&quot;, line 49, in literal_eval<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node_or_string = parse(node_or_string, mode=&#39;eval&#39;)<br> &nbsp; &nbsp; &nbsp;File &quot;/usr/lib64/python2.7/ast.py&quot;, line 37, in parse<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return compile(source, filename, mode, PyCF_ONLY_AST)<br> &nbsp; &nbsp;exceptions.SyntaxError: invalid syntax (&lt;unknown&gt;, line 36) &nbsp; &nbsp;</span></h5><h5 class="c3 c32 c16"><a name="h.23mni4ugh8e1"></a><span class="c39">2014-09-15 16:28:44-0700 [-] Configuration Errors:<br>2014-09-15 16:28:44-0700 [-] &nbsp; error while parsing config file: invalid syntax (&lt;unknown&gt;, line 36) (traceback in logfile)<br>2014-09-15 16:28:44-0700 [-] Halting master.<br>2014-09-15 16:28:44-0700 [-] Main loop terminated.<br>2014-09-15 16:28:44-0700 [-] Server Shut Down.</span></h5><p class="c3"><span><br>In the above log snippet we can see that the yocto-autobuilder threw a SyntaxError around the ability to parse some python AST. This indicates that the issue is somewhere in our buildset configs. This is usually seen if you have failed to add correct notation, for example the colon to indicate a dictionary key:value pair or a comma to split list entries, &nbsp;or you have failed to properly close either quotes, brackets or braces. No matter what, when this error is seen, it is generally an issue with improperly constructed buildsets.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>In the below case, the issue is a bit more obvious to identify and easy to debug</span></p><p class="c3 c6"><span></span></p><h5 class="c3 c16"><a name="h.z0oh3kqan7r"></a><span class="c39">&nbsp; &nbsp; &nbsp; File &quot;/home/pidge/yocto-autobuilder/lib/python2.7/site-packages/autobuilder/BuildSet.py&quot;, line 173, in __init__<br> &nbsp; &nbsp;</span><span class="c39">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c39">m = __import__ (step)<br> &nbsp; &nbsp; &nbsp;File &quot;/home/pidge/yocto-autobuilder/lib/python2.7/site-packages/autobuilder/buildsteps/BuildImages.py&quot;, line 17, in &lt;module&gt;<br> &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import foobar<br> &nbsp; &nbsp;exceptions.ImportError: No module named foobar</span></h5><h5 class="c3 c16"><a name="h.mt3y7s49lkj3"></a><span class="c39">2014-09-15 16:39:31-0700 [-] Configuration Errors:<br>2014-09-15 16:39:31-0700 [-] &nbsp; error while parsing config file: No module named foobar (traceback in logfile)<br>2014-09-15 16:39:31-0700 [-] Halting master.<br>2014-09-15 16:39:31-0700 [-] Main loop terminated.<br>2014-09-15 16:39:31-0700 [-] Server Shut Down.</span></h5><h5 class="c3 c33 c16"><a name="h.hrtfbgkvsrt3"></a></h5><p class="c3"><span>In this case, we&rsquo;re trying to import a module named foobar into the BuildImages buildstep. It either does not exist or is not in our PYTHONPATH, so the start fails.<br><br>One of the less common issues people run across is a build worker not connecting to the controller. There could be a lot of reasons for this, most of them involving an inability of the worker to connect to the controller port.<br><br>First, check the yocto-worker/twistd.log as well as the yocto-controller/twistd.log. These will generally give you a good idea as to what is going on. Next, check the yocto-worker/buildbot.tac file and ensure that the worker is pointed to the correct controller, port and utilizes the correct password. Lastly, check that the buildsets are referencing the name of the worker as defined in yocto-worker/buildbot.tac.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>TODO:</span></p><p class="c3 c6"><span></span></p><ul class="c19 lst-kix_qrb1a1jgz3rn-0 start"><li class="c3 c23"><span>Yoctogit. The fast git source buildstep. Why we use it, what it does. What does buildjanitor do?</span></li><li class="c3 c23"><span>How do I optimize it/make it faster? (Beth)</span></li><li class="c3 c23"><span>Should I use it verses another CI solution? (Beth)</span></li><li class="c3 c23"><span>Are the &ldquo;gotchas&rdquo; in using the yocto autobuilder? (Cal) And (Beth)</span></li><li class="c3 c23"><span>Why should I use/not use DL_DIR to maintain GPL compliance? (Beth)</span></li><li class="c3 c23"><span>Why should I use/not use &nbsp;an exposed SSTATE_DIR mirror?(Beth)</span></li><li class="c3 c23"><span class="c51">Maintaining and Setting up yocto-autobuilder clusters.</span></li><li class="c3 c23"><span>Doing embedded Linux distribution releases with the yocto-autobuilder(Beth)</span></li></ul><p class="c3 c6"><span></span></p><p class="c3"><span class="c24">Maintaining and Setting up yocto-autobuilder clusters</span></p><p class="c3 c6"><span class="c24"></span></p><p class="c3"><span>The Yocto autobuilder is most useful when deployed in a large organisation. This allows not just a CI solution, but also allows for the autobuilder to provide a source mirror, an sstate mirror for developers to utilize, automated testing, buildhistory and error reporting integration.<br></span></p><p class="c3 c6"><span></span></p><p class="c3"><span class="c27">Example Setup:<br></span></p><p class="c3"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 624.00px; height: 381.33px;"><img alt="sclae.png" src="images/image00.png" style="width: 624.00px; height: 381.33px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span><span><br></span></p><p class="c3"><span>In the above image, we have set up a cluster of workers. These workers all point to the same controller. They also share an NFS mount. (NOTE: It is imperative that all workers and the NAS utilize the same UUID as the build user!)<br><br>The workers will utilise the NAS as a shared DL_DIR/SSTATE_DIR. This enables a bit of speedup. It also ensures that we only keep one version of DL_DIR and SSTATE_DIR, thus minimizing disk space.<br><br>We have also mounted the NAS via our webserver and are using the artifacts provided by the autobuilder to populate a Source Mirror, an SSTATE mirror, the QA Build Website and the Release Build Website.<br></span></p><p class="c3"><span class="c27">Setting up a cluster<br><br></span><span>Using the above scenario, we will set up a cluster. We are going to assume for this exercise that the name of the build user is &ldquo;builder&rdquo; and that our mount point to the NAS for all workers and the webserver is &ldquo;/mnt/yab-nas01&rdquo;.<br></span><span class="c27">Setting up the controller:<br></span><span>Git clone the yocto-autobuilder repo and run through the normal setup on your controller.<br>You will want to modify your yocto-controller/controller.cfg to include your workers.<br><br>from buildbot.buildslave import BuildSlave as BuildWorker</span></p><p class="c3"><span>c[&#39;workers&#39;] = [BuildWorker(&quot;worker1&quot;, &quot;password&quot;, max_builds=3),</span></p><p class="c3 c49"><span>BuildWorker(&quot;worker2&quot;, &quot;password&quot;, max_builds=3),</span></p><p class="c3 c49"><span>BuildWorker(&quot;worker3&quot;, &quot;password&quot;, max_builds=3),]</span></p><p class="c3"><span><br>You will also want to modify your config/autobuilder.conf:<br></span></p><p class="c3"><span>[GitSettings]</span></p><p class="c3"><span>OPTIMIZED_GIT_CLONE = True</span></p><p class="c3"><span>#Set the next two lines to somewhere local to the machine</span></p><p class="c3"><span>OGIT_TRASH_DIR = /home/builder/yocto-autobuilder/git/trash</span></p><p class="c3"><span>OGIT_MIRROR_DIR = /home/builder/yocto-autobuilder/git/mirror</span></p><p class="c3"><span>OGIT_TRASH_CRON_TIME = &quot;0 0 * * *&quot;</span></p><p class="c3"><span>OGIT_TRASH_NICE_LEVEL = &quot;19&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[BuildHistorySettings]</span></p><p class="c3"><span>BUILD_HISTORY_COLLECT = True</span></p><p class="c3"><span>BUILD_HISTORY_DIR = &quot;/mnt/yab-nas01/buildhistory&quot;</span></p><p class="c3"><span>BUILD_HISTORY_REPO = &quot;file://///mnt/yab-nas01/buildhistory-repo&quot;</span></p><p class="c3"><span>BUILD_HISTORY_WHITELIST = &quot;{&#39;git://git.yoctoproject.org/poky&#39;:[&#39;master&#39;]}&quot;</span></p><p class="c3"><span>BUILD_HISTORY_WEB = False</span></p><p class="c3"><span>BUILD_HISTORY_WEB_DIR = &quot;/mnt/yab-nas01/buildhistory-web&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[ErrorReportSettings]</span></p><p class="c3"><span>ERROR_REPORT_COLLECT = True</span></p><p class="c3"><span>ERROR_REPORT_SERVER = &quot;http://yourerrorreport.url.com&quot;</span></p><p class="c3"><span>ERROR_REPORT_DIR = &quot;/mnt/yab-nas01/error_logs&quot;</span></p><p class="c3"><span>ERROR_REPORT_EMAIL = &quot;autobuilder@error-report.yourproject.org&quot;</span></p><p class="c3"><span>ERROR_REPORT_NAME = &quot;MyProject Autobuilder&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[PublishSettings]</span></p><p class="c3"><span>PUBLISH_BUILDS = True</span></p><p class="c3"><span>PUBLISH_SOURCE_MIRROR = False</span></p><p class="c3"><span>PUBLISH_SSTATE = False</span></p><p class="c3"><span>MAINTAIN_PERSISTDB = True</span></p><p class="c3"><span>GEN_IMG_MD5 = True</span></p><p class="c3"><span>MACHINE_PUBLISH_DIR = &quot;machines&quot;</span></p><p class="c3"><span>BA_PUBLISH_DIR = &quot;build-appliance&quot;</span></p><p class="c3"><span>QEMU_PUBLISH_DIR = &quot;/machines/qemu&quot;</span></p><p class="c3"><span>RPM_PUBLISH_DIR = &quot;rpm&quot;</span></p><p class="c3"><span>DEB_PUBLISH_DIR = &quot;deb&quot;</span></p><p class="c3"><span>IPK_PUBLISH_DIR = &quot;ipk&quot;</span></p><p class="c3"><span>MARKED_RELEASE_DIR = &quot;releases&quot;</span></p><p class="c3"><span>ADT_INST_PUBLISH_DIR = &quot;adt-installer&quot;</span></p><p class="c3"><span>ADTQA_INST_PUBLISH_DIR = &quot;adt-installer-QA&quot;</span></p><p class="c3"><span>SSTATE_PUBLISH_DIR = &quot;/mnt/yab-nas01/sstate_mirror&quot;</span></p><p class="c3"><span>SOURCE_PUBLISH_DIR = &quot;/mnt/yab-nas01/source&quot;</span></p><p class="c3"><span>BUILD_PUBLISH_DIR = &quot;/mnt/yab-nas01/builds&quot;</span></p><p class="c3"><span>RELEASE_PUBLISH_DIR = &quot;/mnt/yab-nas01/releases&quot;</span></p><p class="c3"><span>X86TC_PUBLISH_DIR = &quot;toolchain/i686&quot;</span></p><p class="c3"><span>X8664TC_PUBLISH_DIR = &quot;toolchain/x86_64&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[ToasterSettings]</span></p><p class="c3"><span>TOASTER_UPLOAD_URL = &quot;http://localhost:8000/orm/eventfile&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[BuildSettings]</span></p><p class="c3"><span>DL_DIR = &quot;/mnt/yab-nas01/downloads&quot;</span></p><p class="c3"><span>SSTATE_DIR = &quot;/mnt/yab-nas01/sstate&quot;</span></p><p class="c3"><span>IMAGE_FSTYPES = &quot; tar.gz&quot;</span></p><p class="c3"><span>PERSISTDB_DIR = &quot;/home/builder/persistdb&quot;</span></p><p class="c3"><span>BB_NUMBER_THREADS = &quot;16&quot;</span></p><p class="c3"><span>PARALLEL_MAKE_NUM = &quot;16&quot;</span></p><p class="c3"><span>RESOLVE_TRIGGERED_HEAD = True</span></p><p class="c3"><span>DEVKERNEL_MUT_REPO = &quot;{&#39;git://git.yoctoproject.org/poky-contrib&#39;:[&#39;stage/master_under_test&#39;, &#39;sgw/mut&#39;]}&quot;</span></p><p class="c3"><span>DEVKERNEL = &quot;linux-yocto-dev&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[ADTREPO Settings]</span></p><p class="c3"><span>ADTREPO_POPULATE = False</span></p><p class="c3"><span>ADTREPO_DEV_POPULATE = True</span></p><p class="c3"><span>ADTREPO_URL = &quot;http://adtrepo.yoctoproject.org/&quot;</span></p><p class="c3"><span>ADTREPO_PATH = &quot;/tmp/adtrepo.yoctoproject.org/&quot;</span></p><p class="c3"><span>ADTREPO_DEV_URL = &quot;http://adtrepo-dev.yoctoproject.org/&quot;</span></p><p class="c3"><span>ADTREPO_DEV_PATH = &quot;/tmp/adtrepo-dev/&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[WebServer]</span></p><p class="c3"><span>WEB_ROOT = &quot;/var/www/&quot;</span></p><p class="c3"><span>WEB_URL = &quot;http://mycoolproject.org/&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>[QAEmail]</span></p><p class="c3"><span>QA_MAIL_TO = &quot;root@localhost otherperson@localhost&quot;</span></p><p class="c3"><span>QA_MAIL_CC = &quot;buildcc@localhost&quot;</span></p><p class="c3"><span>QA_MAIL_BCC = &quot;buildbcc@localhost&quot;</span></p><p class="c3"><span>QA_MAIL_SIG = &quot;Multiline\nSig\nLine&quot;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span class="c27">Note: You must use this config for each build worker.<br></span></p><p class="c3"><span>You will now need to ensure that all your buildset-config files use the correct builders. Modify the &lsquo;builders:&rsquo; field to have a list of builders. e.g.:<br><br>builders: [&lsquo;worker1&rsquo;, &lsquo;worker2&rsquo;, &lsquo;worker3&rsquo;]</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>At this point you should be ready to set up each worker. You will need to copy the autobuilder.conf to each workers config dir, set up each worker with the correct builder name and password in the yocto-worker/buildbot.tac file and then start each worker and allow them to connect to the controller.<br><br></span><span class="c27">Notes:<br></span><span><br>- It is probably not a bad idea to have a cron job sync the results of your autobuilder DL_DIR to another directory. This ensures a source history that will keep you from losing any previously built source.<br><br>- It&rsquo;s also not a bad idea to set up cron jobs to clean up artifacts. Full adt-repos and releases can be fairly large (in the TB range and doing it multiple times a day can cause issues)<br><br>- If you are running qemu based sanity tests, you will need to ensure that you set up each worker to be able to run sanity testing. Please ensure you have enough tapdevs. For each worker that runs 3 builds concurrently we generally set up 24 tapdevs with runqemu-gen-tapdevs.<br><br>- From an IP protection standpoint, if you are building protected IP source, you do not want to expose your DL_DIR and SSTATE_DIR outside of your organisation.<br></span></p><p class="c3 c12"><span class="c24">Using EAM/AD with Yocto-Autobuilder</span></p><p class="c3"><span>In the current version of yocto-autobuilder (Buildbot 0.8.8), using EAM/AD for authentication must be done via reverse proxy and Kerberos. Later versions of Buildbot are able to use LDAP for authentication but this is not implemented in 0.8.8. Hence, for this example configuration, reverse proxy and Kerberos are used here.</span></p><p class="c3 c6"><span></span></p><p class="c3 c12"><span>This example configuration is based on a Fedora 20 installation running Apache. This is also a &ldquo;workstation&rdquo; configuration. That is, it is assumed that one is trying to connect to a corporate or similar EAM/AD setup, and that the Kerberos server is running elsewhere. &nbsp;Therefore, this documentation does not cover setting up a Kerberos server.</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span class="c11 c27">Set Up the Reverse Proxy for Apache</span></p><p class="c3 c6 c12"><span class="c11 c27"></span></p><p class="c3 c12"><span class="c54">Setting up the reverse proxy is simple, and details are available here:</span></p><p class="c3 c12"><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://httpd.apache.org/docs/2.0/mod/mod_proxy.html%23forwardreverse&amp;sa=D&amp;usg=AFQjCNEOOxKhmYSu4Uc6qy_5UUZxbljtFQ">http://httpd.apache.org/docs/2.0/mod/mod_proxy.html - forwardreverse</a></span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>You do not need to enable the forward proxy just to use reverse proxy. If you don&rsquo;t need to use the forward proxy, it is best to disable it for the sake of security. &nbsp;</span></p><p class="c3 c12"><span>To enable the reverse proxy only, add a section like this to your httpd.conf file.</span></p><p class="c3 c6 c45 c12"><span></span></p><p class="c3 c45 c12"><span>ProxyRequests Off</span></p><p class="c3 c6 c12 c45"><span></span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c45 c12"><span>&lt;Proxy *&gt;</span></p><p class="c3 c45 c12"><span>&nbsp; &nbsp;Order deny,allow</span></p><p class="c3 c45 c12"><span>&nbsp; &nbsp;Allow from all</span></p><p class="c3 c45 c12"><span>&lt;/Proxy&gt;</span></p><p class="c3 c6 c45 c12"><span></span></p><p class="c3 c45 c12"><span>ProxyPass /buildbot/ http://myhost.somewhere.com:8010/</span></p><p class="c3 c45 c12"><span>ProxyPassReverse /buildbot/ http://myhost.somewhere.com:8010/ </span></p><p class="c3 c12"><span>Be mindful of the trailing slashes. If your autobuilder webStatus page doesn&rsquo;t load, you have likely mismatched your slashes. Note that the port here is the autobuilder default. Adjust yours accordingly. This also assumes that Apache is running on the default port of 80.</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>Once you have that in place stop and restart Apache to load the new config.</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span class="c11">Edit the Autobuilder Config</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>Now you need to tell the autobuilder about this change by editing yocto-autobuilder/yocto-controller/controller.cfg. &nbsp;In the section labeled &ldquo;PROJECT IDENTITY,&rdquo; you need to set the URLs to correspond to your reverse proxy settings.</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>Example:</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3 c12"><span>####################</span></p><p class="c3 c12"><span># PROJECT IDENTITY #</span></p><p class="c3 c12"><span>####################</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>&lt;snip&gt;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>c[&#39;title&#39;] = &quot;The Yocto Autobuilder&quot;</span></p><p class="c3 c12"><span>c[&#39;titleURL&#39;] = &quot;http://myhost.somewhere.com:8010/buildbot/&quot;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span># the &#39;buildbotURL&#39; string should point to the location where the buildbot&#39;s</span></p><p class="c3 c12"><span># internal web server (usually the html.WebStatus page) is visible. This</span></p><p class="c3 c12"><span># typically uses the port number set in the Waterfall &#39;status&#39; entry, but</span></p><p class="c3 c12"><span># with an externally-visible host name which the buildbot cannot figure out</span></p><p class="c3 c12"><span># without some help.</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>c[&#39;buildbotURL&#39;] = &quot;http://myhost.somewhere.com:8010/buildbot/&quot;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>Note that this matches the URL in the reverse proxy config. If you drop a trailing slash here, your autobuilder page will not likely come up, or subpages will not come up properly.</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>Also note that the default for c[&#39;titleURL&#39;] uses https. If you are not using https as your buildbotURL, you&rsquo;ll want to change that.</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>Once this config is complete, you should now be able to load your autobuilder webStatus page, and subpages (waterfall, grid, buiders, etc.) using the newly defined URL: http://myhost.somewhere.com/buildbot</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span class="c11">Configure Kerberos</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3 c12"><span class="c25">Kerberos documentation may be found at</span><span class="c2"><a class="c17" href="https://www.google.com/url?q=http://web.mit.edu/kerberos/krb5-latest/doc/&amp;sa=D&amp;usg=AFQjCNEpowNezSNoamflGo5lCA3MDa2u0Q">&nbsp;</a></span><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://web.mit.edu/kerberos/krb5-latest/doc/&amp;sa=D&amp;usg=AFQjCNEpowNezSNoamflGo5lCA3MDa2u0Q">http://web.mit.edu/kerberos/krb5-latest/doc/</a></span><span class="c25">. </span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span class="c25">Fedora&rsquo;s Security guide at</span><span class="c2"><a class="c17" href="https://www.google.com/url?q=https://docs.fedoraproject.org/en-US/Fedora/19/html/Security_Guide/sect-Security_Guide-Kerberos-Configuring_a_Kerberos_5_Client.html&amp;sa=D&amp;usg=AFQjCNFMHurwESBlDwinrX4NMX2JUxlSNg">&nbsp;</a></span><span class="c10"><a class="c17" href="https://www.google.com/url?q=https://docs.fedoraproject.org/en-US/Fedora/19/html/Security_Guide/sect-Security_Guide-Kerberos-Configuring_a_Kerberos_5_Client.html&amp;sa=D&amp;usg=AFQjCNFMHurwESBlDwinrX4NMX2JUxlSNg">https://docs.fedoraproject.org/en-US/Fedora/19/html/Security_Guide/sect-Security_Guide-Kerberos-Configuring_a_Kerberos_5_Client.html</a></span></p><p class="c3 c6 c12"><span class="c10"><a class="c17" href="https://www.google.com/url?q=https://docs.fedoraproject.org/en-US/Fedora/19/html/Security_Guide/sect-Security_Guide-Kerberos-Configuring_a_Kerberos_5_Client.html&amp;sa=D&amp;usg=AFQjCNFMHurwESBlDwinrX4NMX2JUxlSNg"></a></span></p><p class="c3 c12"><span class="c25">A CentOS guide:</span><span class="c2"><a class="c17" href="https://www.google.com/url?q=https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s1-kerberos-server.html&amp;sa=D&amp;usg=AFQjCNGyP3-LBz32pZ7HKXvQJFwqhNux1Q">&nbsp;</a></span><span class="c10"><a class="c17" href="https://www.google.com/url?q=https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s1-kerberos-server.html&amp;sa=D&amp;usg=AFQjCNGyP3-LBz32pZ7HKXvQJFwqhNux1Q">https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s1-kerberos-server.html</a></span></p><p class="c3 c6 c12"><span class="c10"><a class="c17" href="https://www.google.com/url?q=https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s1-kerberos-server.html&amp;sa=D&amp;usg=AFQjCNGyP3-LBz32pZ7HKXvQJFwqhNux1Q"></a></span></p><p class="c3 c12"><span>Detailed explanations of commands, etc., are available in the above references. Please refer to the documentation for a more info on the various steps/commands. Obviously, the first step is to install the required packages: krb5-libs, krb5-server, and krb5-workstation and any missing dependencies.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>You will also need a working krb5.conf configuration or have the information know to create one.</span></p><p class="c3 c6"><span></span></p><p class="c3"><span class="c56">Example krb5.conf file</span><span>:</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3 c12"><span>[logging]</span></p><p class="c3 c12"><span>&nbsp; default = FILE:/var/log/krb5libs.log</span></p><p class="c3 c12"><span>&nbsp; kdc = FILE:/var/log/krb5kdc.log</span></p><p class="c3 c12"><span>&nbsp; admin_server = FILE:/var/log/kadmind.log</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>[libdefaults]</span></p><p class="c3 c12"><span>&nbsp; default_realm = CORP.FOO.COM</span></p><p class="c3 c12"><span>&nbsp; dns_lookup_realm = false</span></p><p class="c3 c12"><span>&nbsp; dns_lookup_kdc = false</span></p><p class="c3 c12"><span>&nbsp; ticket_lifetime = 24h</span></p><p class="c3 c12"><span>&nbsp; renew_lifetime = 7d</span></p><p class="c3 c12"><span>&nbsp; forwardable = yes</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>[realms]</span></p><p class="c3 c12"><span>&nbsp;CORP.FOO.COM = {</span></p><p class="c3 c12"><span>&nbsp; kdc = CORP.FOO.COM:88</span></p><p class="c3 c12"><span>&nbsp; admin_server = corp.foo.com:&lt;port&gt;</span></p><p class="c3 c12"><span>&nbsp; default_domain = corp.foo.com</span></p><p class="c3 c12"><span>&nbsp;}</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>[domain_realm]</span></p><p class="c3 c12"><span>.example.com = CORP.FOO.COM</span></p><p class="c3 c12"><span>example.com = CORP.FOO.COM</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Next, create the database using the kdb5_util command:</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>$ kdb5_util create &ndash;s</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>Then edit /var/Kerberos/krb5kdc/kadm5.acl. You should be able to use something along the lines of:</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>*/admin@EXAMPLE.COM &nbsp;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>Now you can create the first principal by running:</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>$ kadmin.local &ndash;q &ldquo;addprinc &lt;username&gt;/admin&rdquo;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>Once you have completed that, start the services:</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>$ service krb5kdc start</span></p><p class="c3 c12"><span>$ service kadmin start</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>Now run kinit to test:</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>$ kinit &lt;username&gt;</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3 c12"><span>You should be prompted for the user password, which should authenticate successfully using the user&rsquo;s EAM/AD password.</span></p><p class="c3 c6 c12"><span></span></p><p class="c3 c12"><span>You should now also have an /etc/krb.keytab file. You will need this for the Apache and the autobuilder to authenticate against.</span></p><p class="c3 c12"><span>&nbsp;</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span class="c11">Revisit Apache Conf</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Apache needs to be configured to use Kerberos for authentication. You will need to add something similar to this to your httpd.conf file:</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>&lt;Location &quot;/&quot;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p class="c3"><span>&nbsp; AuthType Kerberos</span></p><p class="c3"><span>&nbsp; AuthName &quot;Buildbot&quot;</span></p><p class="c3"><span>&nbsp; KrbMethodNegotiate On</span></p><p class="c3"><span>&nbsp; KrbMethodK5Passwd On</span></p><p class="c3"><span>&nbsp; KrbAuthRealms CORP.FOO.COM</span></p><p class="c3"><span>&nbsp; KrbVerifyKDC off</span></p><p class="c3"><span>&nbsp; KrbServiceName Any</span></p><p class="c3"><span>&nbsp; Krb5KeyTab /etc/krb.keytab</span></p><p class="c3"><span>&nbsp; KrbSaveCredentials Off</span></p><p class="c3"><span>&nbsp; require valid-user</span></p><p class="c3"><span>&nbsp; Order allow,deny</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>&nbsp; Satisfy Any</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>&nbsp; #] SSO</span></p><p class="c3"><span>&nbsp; RewriteEngine On</span></p><p class="c3"><span>&nbsp; RewriteCond %{LA-U:REMOTE_USER} (.+)$</span></p><p class="c3"><span>&nbsp; RewriteRule . - [E=RU:%1,NS]</span></p><p class="c3"><span>&nbsp; RequestHeader set REMOTE_USER %{RU}e</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>&lt;/Location&gt;</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Adjust the path to your krb.keytab file and Realm accordingly.</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Note:</span><span class="c25">&nbsp;This config is copied straight from</span><span class="c2"><a class="c17" href="https://www.google.com/url?q=http://docs.buildbot.net/latest/manual/cfg-www.html&amp;sa=D&amp;usg=AFQjCNFzV5K-aZtLzktAUhNHDhu_YZjr3A">&nbsp;</a></span><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://docs.buildbot.net/latest/manual/cfg-www.html&amp;sa=D&amp;usg=AFQjCNFzV5K-aZtLzktAUhNHDhu_YZjr3A">http://docs.buildbot.net/latest/manual/cfg-www.html</a></span><span class="c25">&nbsp;with minor adjustments to genericize the Realm and path to the keytab file. Be aware that this doc is for a newer version of BuildBot and the backend auth component has been significantly rewritten. While this Apache conf works, the other configuration information (for plugins, etc) in this doc is NOT implemented in 0.8.8.</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Restart httpd services to pick up the new config.</span></p><p class="c3 c6"><span></span></p><p class="c3 c6"><span></span></p><p class="c3"><span class="c25">Revisit Autobuilder Config</span></p><p class="c7 c3"><span class="c25">&nbsp;</span></p><p class="c7 c3"><span class="c25">Lastly, revisit the autobuilder config to set the path to the krb.keytab file. In the &ldquo;STATUS TARGETS&rdquo; section of yocto-controller/controller.cfg, adjust the path accordingly. Change the line:</span></p><p class="c7 c3 c6"><span class="c25"></span></p><p class="c7 c3"><span class="c25">authz_cfg=Authz(auth=HTPasswdAuth(&#39;&#39;&lt;HTPASSWDPATH&gt;&#39;),</span></p><p class="c7 c3"><span class="c25">&nbsp;</span></p><p class="c7 c3"><span class="c25">to</span></p><p class="c7 c3"><span class="c25">&nbsp;</span></p><p class="c7 c3"><span class="c25">authz_cfg=Authz(auth=HTPasswdAuth(&#39;&#39;/etc/krb.keytab&#39;), </span></p><p class="c7 c3"><span class="c25">&nbsp;</span></p><p class="c7 c3"><span class="c25">(Or whatever the correct path and filename is for your setup.)</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Example:</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>###################</span></p><p class="c3"><span># STATUS TARGETS #</span></p><p class="c3"><span>###################</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>&lt;snip&gt;</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>c[&#39;status&#39;] = []</span></p><p class="c3"><span>from buildbot.status.html import WebStatus</span></p><p class="c3"><span>from buildbot.status.web.authz import Authz</span></p><p class="c3"><span>from buildbot.status.web.auth import HTPasswdAuth</span></p><p class="c3"><span>authz_cfg=Authz(auth=HTPasswdAuth(&#39;/etc/krb.keytab&#39;),</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forceBuild = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopBuild = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopAllBuilds = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cancelAllPendingBuilds = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cancelPendingBuild = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gracefulShutdown = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forceAllBuilds = False,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopChange = False,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cleanShutdown = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showUsersPage = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pauseSlave = &#39;auth&#39;,</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pingBuilder = False)</span></p><p class="c3"><span>c[&#39;status&#39;].append(WebStatus(http_port=8010, authz=authz_cfg))</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>You should now be prompted for your EAM/AD username and password when accessing your autobuilder. </span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span class="c11">References</span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Kerberos Documentation:</span></p><p class="c3"><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://web.mit.edu/kerberos/krb5-latest/doc/&amp;sa=D&amp;usg=AFQjCNEpowNezSNoamflGo5lCA3MDa2u0Q">http://web.mit.edu/kerberos/krb5-latest/doc/</a></span><span class="c25">. </span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Fedora&rsquo;s Security Guide:</span></p><p class="c3"><span class="c10"><a class="c17" href="https://www.google.com/url?q=https://docs.fedoraproject.org/en-US/Fedora/19/html/Security_Guide/sect-Security_Guide-Kerberos-Configuring_a_Kerberos_5_Client.html&amp;sa=D&amp;usg=AFQjCNFMHurwESBlDwinrX4NMX2JUxlSNg">https://docs.fedoraproject.org/en-US/Fedora/19/html/Security_Guide/sect-Security_Guide-Kerberos-Configuring_a_Kerberos_5_Client.html</a></span></p><p class="c3 c6"><span class="c10"><a class="c17" href="https://www.google.com/url?q=https://docs.fedoraproject.org/en-US/Fedora/19/html/Security_Guide/sect-Security_Guide-Kerberos-Configuring_a_Kerberos_5_Client.html&amp;sa=D&amp;usg=AFQjCNFMHurwESBlDwinrX4NMX2JUxlSNg"></a></span></p><p class="c3"><span>CentOS Guide:</span></p><p class="c3"><span class="c10"><a class="c17" href="https://www.google.com/url?q=https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s1-kerberos-server.html&amp;sa=D&amp;usg=AFQjCNGyP3-LBz32pZ7HKXvQJFwqhNux1Q">https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s1-kerberos-server.html</a></span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span>Apache mod_proxy:</span></p><p class="c3"><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://httpd.apache.org/docs/2.0/mod/mod_proxy.html%23forwardreverse&amp;sa=D&amp;usg=AFQjCNEOOxKhmYSu4Uc6qy_5UUZxbljtFQ">http://httpd.apache.org/docs/2.0/mod/mod_proxy.html - forwardreverse</a></span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Buildbot 0.8.8 Documentation:</span></p><p class="c3"><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://docs.buildbot.net/0.8.8/index.html&amp;sa=D&amp;usg=AFQjCNGR49KMI4YiHgb0RhWaqCjRhi52yg">http://docs.buildbot.net/0.8.8/index.html</a></span><span class="c25">&nbsp;</span></p><p class="c3 c6"><span></span></p><p class="c3"><span>Buildbot Latest Documentation with Apache config for using Kerberos:</span></p><p class="c3"><span class="c10"><a class="c17" href="https://www.google.com/url?q=http://docs.buildbot.net/latest/manual/cfg-www.html&amp;sa=D&amp;usg=AFQjCNFzV5K-aZtLzktAUhNHDhu_YZjr3A">http://docs.buildbot.net/latest/manual/cfg-www.html</a></span></p><p class="c3 c6"><span class="c10"></span></p><p class="c3"><span>RunningLight lcnc-buildbot Reverse Proxy with Debian/Ubuntu examples:</span></p><p class="c3 c12"><span class="c10"><a class="c17" href="https://www.google.com/url?q=https://github.com/RunningLight/lcnc-buildbot/blob/master/HOW-TO-reverse-proxy&amp;sa=D&amp;usg=AFQjCNFc6u5rG9fmE5fAUkweude7TGVZhA">https://github.com/RunningLight/lcnc-buildbot/blob/master/HOW-TO-reverse-proxy</a></span></p><p class="c3 c6 c12"><span></span></p><div><p class="c3 c6 c50"><span></span></p></div></body></html>