
<!DOCTYPE html>

<html lang="en">
<meta charset="utf-8">
<meta name="google" value="notranslate">
<title>
  
      Running
    
    -
     2d8d62f6be545b10
</title>
<link rel="stylesheet" href="/static/buildbot/css/default.css" type="text/css">
<link rel="stylesheet" href="/static/common/third_party/css/jquery-ui.min.css" type="text/css">
<link rel="stylesheet" href="/static/common/third_party/css/vis.min.css" type="text/css">
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="LUCI" />
<script src="/static/common/third_party/js/moment-with-locales.min.js"></script>
<script src="/static/common/third_party/js/moment-timezone-with-data-2012-2022.min.js"></script>
<script src="/static/common/js/time.js"></script>
<script src="/static/common/third_party/js/jquery.min.js"></script>
<script src="/static/common/third_party/js/jquery-ui.min.js"></script>
<script src="/static/common/third_party/js/vis-custom.min.js"></script>

<link id="favicon" rel="shortcut icon" type="image/png" href="/static/common/favicon/yellow-32.png">


<script>
  const useTabs = false;
</script>
<script src="/static/common/js/build.js"></script>
<link rel="stylesheet" href="/static/common/css/tabs.css" type="text/css">


<body class="interface">
  <header>
    <div>
      <a href="/" aria-label="Home page">Home</a> |
      <a href="/search" aria-label="Search page">Search</a>
    </div>
    <div>
      
        <a href="http://fake.example.com/login?dest=%2Ffoobar" alt="Login">Login</a>
      
    </div>
  </header>
  <hr>
  
  <div class="content">
    <h1>
    
    Build <a>2d8d62f6be545b10</a>
    
    
    </h1>

    <div id="tabs" style="display: none;">
      <ul>
        <li><a href="#overview-tab">Overview</a></li>
      </ul>
      <div id="overview-tab">
        
  <div id="results" class="column">
    <h2>Results:</h2>
    
      <p class="result status-Running">
      <span class="step-text">Running recipe bootstrap </span>
      
      </p>
     

    
    

    <h2>Trigger Info:</h2>

    <table class="info" width="100%">
    
      <tr><td class="left">Project</td><td>secret</td></tr>
    

    

    

    

    

    

    </table>
      
      

    
    <h2>Execution:</h2>
    <ul>
      
      <li>
        Source:
        <a href="https://example.com/task?id=2d8d62f6be545b10&amp;show_raw=1&amp;wide_logs=true"
           aria-label="Source for Task 2d8d62f6be545b10">
          Task 2d8d62f6be545b10
        </a>
      </li>
      

      

      
    </ul>
     

    
      
    

    
      <h2>Steps and Logfiles:</h2>
      Show:
      <input type="radio" name="hider" id="showExpanded">
      <label for="showExpanded">Expanded</label>
      <input type="radio" name="hider" id="showDefault">
      <label for="showDefault">Default</label>
      <input type="radio" name="hider" id="showNonGreen" checked>
      <label for="showNonGreen">Non-Green</label>

      <ol id="steps" class="non-green">

        
          
          <li>
            <div class="status-Running result">
              
  
    <span class="duration"
          data-starttime="2016-03-14T10:00:01Z"
          >
          ( 59 mins 58 secs )</span>
  

              <b>Steps</b>
            </div>
            <ul>
              
              <li class="sublink"><a href="/swarming/task/build-internal/stdout" aria-label="log link for stdout">stdout</a></li>
              
            </ul>
          </li>
          
        

        
          
<li class="">
  <div class="status-Running result">
      
  
    <span class="duration"
          data-starttime="2016-03-14T10:00:02Z"
          >
          ( 59 mins 58 secs )</span>
  

    <b><a aria-label="recipe bootstrap">recipe bootstrap</a></b>
    <span>
      
    </span>
  </div>
  <ul>
    
      <li class="sublink"><a href="/swarming/task/build-internal/steps/recipe_bootstrap/0/stdout" aria-label="log link for stdout">stdout</a></li>
          <link rel="prerender" href="/swarming/task/build-internal/steps/recipe_bootstrap/0/stdout">
          <link rel="prefetch" href="/swarming/task/build-internal/steps/recipe_bootstrap/0/stdout">
        
      
    
      <li class="sublink"><a href="https://chromium.googlesource.com/external/github.com/luci/recipes-py/&#43;/master/doc/workflow.md" aria-label="step link for Confused? README here">Confused? README here</a></li>
    
    
  </ul>
  
</li>

        
      </ol>
     

  </div>

        
  <div id="properties" class="column">
    <h2>Build Properties:</h2>

    <table class="info BuildProperties" width="100%">
    <tr><th>Name</th><th>Value</th><th>Source</th></tr>

      
      
        
      
      
        
      
    </table>

    

    <h2>Timing:</h2>
    <table class="info" width="100%">
      <tr class="alt"><td class="left">Create</td>
      <td>
        N/A
      </td></tr>
      <tr><td class="left">Start</td>
      <td>
        <span class="local-time " data-timestamp="1457949601850">Monday, 14-Mar-16 10:00:01 UTC</span>
      </td></tr>
      <tr class="alt"><td class="left">End</td>
      <td>
        N/A
      </td></tr>
      <tr><td class="left">Pending</td>
      <td id="duration">
        
          N/A
        
      </td></tr>
      <tr class="alt"><td class="left">Execution</td>
      <td id="duration">
        
          59 mins 58 secs
        
      </td></tr>
    </table>

  </div>

        
  <div id="changes" class="column">
    
  </div>

      </div>
    </div>
  </div>

  <footer>
    <hr>
      <div><img class="lucy-logo" src="https://storage.googleapis.com/chrome-infra/lucy-small.png"></div>
      <div>
        <a href="https://chromium.googlesource.com/infra/luci">LUCI</a><br>
        built: <b><span class="local-time " data-timestamp="-6792498672871">Saturday, 03-Feb-01 04:05:06 UTC</span></b><br>
        version: <b>testVersionID</b><br>
      </div>
  </footer>
</body>
<script>
$(function () {
  'use strict';
  
  setTimeout(function() {
    milo.makeTimesLocal();
    milo.annotateDurations();
  }, 0);
  $(document).tooltip({
    show: false,
    hide: false
  });
});
</script>
<script>
  (function(i,s,o,g,r,a,m){i['CrDXObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','https://storage.googleapis.com/crdx-feedback.appspot.com/feedback.js','crdx');

  crdx('setFeedbackButtonLink', 'https://bugs.chromium.org/p/chromium/issues/entry?components=Infra%3EPlatform%3EMilo');

(function(window) {
  let lastWindowScrollTop = window.scrollY;

  function debounce(f, wait) {
    let timeout;
    return function(...args) {
      if (timeout) {
        clearTimeout(timeout);
      }
      timeout = setTimeout(() => {
        f(...args);
        timeout = null;
      }, wait);
    };
  }

  window.addEventListener('scroll', debounce(function(evt) {
    const delta = window.scrollY - lastWindowScrollTop;
    lastWindowScrollTop = window.scrollY;
    const absDelta = Math.abs(delta);
    const category = window.location.pathname.split('/').slice(0, 2).join('/');
    ga('send', 'event', category, 'scroll-abs', '', absDelta);
    if (delta > 0) {
      ga('send', 'event', category, 'scroll-down', '', absDelta);
    } else {
      ga('send', 'event', category, 'scroll-up', '', absDelta);
    }
  }, 250));
})(window);
</script>

<script>
setTimeout(function() {
	(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

	ga('create', 'UA-12345-01', 'auto');
	ga('send', 'pageview');
}, 0);
</script>

</html>
