<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Optional Components on Prow</title>
    <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/</link>
    <description>Recent content in Optional Components on Prow</description>
    <generator>Hugo</generator>
    <language>en</language>
    <atom:link href="https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Branchprotector</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/branchprotector/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/branchprotector/</guid>
      <description>&lt;p&gt;branchprotector configures &lt;a href=&#34;https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/about-protected-branches&#34;&gt;github branch protection&lt;/a&gt; according to a specified&#xA;policy.&lt;/p&gt;&#xA;&lt;h2 id=&#34;github-api-access&#34;&gt;GitHub API Access&lt;/h2&gt;&#xA;&lt;p&gt;Branchprotector uses the GitHub API to read and update branch protection rules across repositories. It requires GitHub authentication credentials and should be configured with ghproxy to manage rate limits. See &lt;a href=&#34;https://deploy-preview-754--k8s-prow.netlify.app/docs/github-api-access/&#34;&gt;Managing GitHub API Access&lt;/a&gt; for details on authentication methods, endpoint configuration, and rate limit management.&lt;/p&gt;&#xA;&lt;h2 id=&#34;policy-configuration&#34;&gt;Policy configuration&lt;/h2&gt;&#xA;&lt;p&gt;Extend the primary prow &lt;a href=&#34;https://github.com/kubernetes/test-infra/blob/master/config/prow/config.yaml&#34;&gt;&lt;code&gt;config.yaml&lt;/code&gt;&lt;/a&gt; document to include a top-level&#xA;&lt;code&gt;branch-protection&lt;/code&gt; key that looks like the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exporter</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/exporter/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/exporter/</guid>
      <description>&lt;p&gt;The prow-exporter exposes metrics about prow jobs while the&#xA;metrics are not directly related to a specific prow-component.&lt;/p&gt;&#xA;&lt;h2 id=&#34;metrics&#34;&gt;Metrics&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Metric name&lt;/th&gt;&#xA;          &lt;th&gt;Metric type&lt;/th&gt;&#xA;          &lt;th&gt;Labels/tags&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;prow_job_labels&lt;/td&gt;&#xA;          &lt;td&gt;Gauge&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;job_name&lt;/code&gt;=&amp;lt;prow_job-name&amp;gt; &lt;br&gt; &lt;code&gt;job_namespace&lt;/code&gt;=&amp;lt;prow_job-namespace&amp;gt; &lt;br&gt; &lt;code&gt;job_agent&lt;/code&gt;=&amp;lt;prow_job-agent&amp;gt; &lt;br&gt; &lt;code&gt;label_PROW_JOB_LABEL_KEY&lt;/code&gt;=&amp;lt;PROW_JOB_LABEL_VALUE&amp;gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;prow_job_annotations&lt;/td&gt;&#xA;          &lt;td&gt;Gauge&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;job_name&lt;/code&gt;=&amp;lt;prow_job-name&amp;gt; &lt;br&gt; &lt;code&gt;job_namespace&lt;/code&gt;=&amp;lt;prow_job-namespace&amp;gt; &lt;br&gt; &lt;code&gt;job_agent&lt;/code&gt;=&amp;lt;prow_job-agent&amp;gt; &lt;br&gt; &lt;code&gt;annotation_PROW_JOB_ANNOTATION_KEY&lt;/code&gt;=&amp;lt;PROW_JOB_ANNOTATION_VALUE&amp;gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;prow_job_runtime_seconds&lt;/td&gt;&#xA;          &lt;td&gt;Histogram&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;job_name&lt;/code&gt;=&amp;lt;prow_job-name&amp;gt; &lt;br&gt; &lt;code&gt;job_namespace&lt;/code&gt;=&amp;lt;prow_job-namespace&amp;gt; &lt;br&gt; &lt;code&gt;type&lt;/code&gt;=&amp;lt;prow_job-type&amp;gt; &lt;br&gt; &lt;code&gt;last_state&lt;/code&gt;=&amp;lt;last-state&amp;gt; &lt;br&gt; &lt;code&gt;state&lt;/code&gt;=&amp;lt;state&amp;gt; &lt;br&gt; &lt;code&gt;org&lt;/code&gt;=&amp;lt;org&amp;gt; &lt;br&gt; &lt;code&gt;repo&lt;/code&gt;=&amp;lt;repo&amp;gt; &lt;br&gt; &lt;code&gt;base_ref&lt;/code&gt;=&amp;lt;base_ref&amp;gt; &lt;br&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;For example, the metric &lt;code&gt;prow_job_labels&lt;/code&gt; is similar to &lt;code&gt;kube_pod_labels&lt;/code&gt; defined&#xA;in &lt;a href=&#34;https://github.com/kubernetes/kube-state-metrics/blob/master/docs/pod-metrics.md&#34;&gt;kubernetes/kube-state-metrics&lt;/a&gt;.&#xA;A typical usage of &lt;code&gt;prow_job_labels&lt;/code&gt; is to &lt;a href=&#34;https://github.com/kubernetes/kube-state-metrics/tree/master/docs#join-metrics&#34;&gt;join&lt;/a&gt;&#xA;it with other metrics using a &lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching&#34;&gt;Prometheus matching operator&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>gcsupload</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/gcsupload/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/gcsupload/</guid>
      <description>&lt;p&gt;&lt;code&gt;gcsupload&lt;/code&gt; uploads artifacts to cloud storage at a path resolved from the job configuration.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;gcsupload&lt;/code&gt; can be configured by either passing in flags or by specifying a full set of options&#xA;as JSON in the &lt;code&gt;$GCSUPLOAD_OPTIONS&lt;/code&gt; environment variable, which has the following form:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;bucket&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubernetes-jenkins&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;sub_dir&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;items&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/logs/artifacts/&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;path_strategy&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;legacy&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;default_org&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;default_repo&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;gcs_credentials_file&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/secrets/gcs/service-account.json&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;dry_run&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In addition to this configuration for the tool, the &lt;code&gt;$JOB_SPEC&lt;/code&gt; environment variable should be&#xA;present to provide the contents of the Prow downward API for jobs. This data is used to resolve&#xA;the exact location in GCS to which artifacts and logs will be pushed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gerrit</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/gerrit/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/gerrit/</guid>
      <description>&lt;p&gt;Gerrit is a Prow-gerrit adapter for handling CI on gerrit workflows. It can poll gerrit&#xA;changes from multiple gerrit instances, and trigger presubmits on Prow upon new patchsets&#xA;on Gerrit changes, and postsubmits when Gerrit changes are merged.&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment-usage&#34;&gt;Deployment Usage&lt;/h2&gt;&#xA;&lt;p&gt;When deploy the gerrit component, you need to specify &lt;code&gt;--config-path&lt;/code&gt; to your prow config, and optionally&#xA;&lt;code&gt;--job-config-path&lt;/code&gt; to your prowjob config if you have split them up.&lt;/p&gt;&#xA;&lt;p&gt;Set &lt;code&gt;--gerrit-projects&lt;/code&gt; to the gerrit projects you want to poll against.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HMAC</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/hmac/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/hmac/</guid>
      <description>&lt;p&gt;&lt;code&gt;hmac&lt;/code&gt; is a tool to update the HMAC token, GitHub webhooks and HMAC secret&#xA;for the orgs/repos as per the &lt;code&gt;managed_webhooks&lt;/code&gt; configuration changes in the Prow config file.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;To run this tool, you&amp;rsquo;ll need:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;A github account that has admin permission to the orgs/repos.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;A &lt;a href=&#34;https://github.com/settings/tokens&#34;&gt;personal access token&lt;/a&gt; for the github account.&#xA;Note the token must be granted &lt;code&gt;admin:repo_hook&lt;/code&gt; and &lt;code&gt;admin:org_hook&lt;/code&gt; scopes.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Permissions to read&amp;amp;write the hmac secret in the Prow cluster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>jenkins-operator</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/jenkins-operator/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/jenkins-operator/</guid>
      <description>&lt;p&gt;&lt;code&gt;jenkins-operator&lt;/code&gt; is a controller that enables Prow to use Jenkins&#xA;as a backend for running jobs.&lt;/p&gt;&#xA;&lt;h2 id=&#34;jenkins-configuration&#34;&gt;Jenkins configuration&lt;/h2&gt;&#xA;&lt;p&gt;A Jenkins master needs to be provided via &lt;code&gt;--jenkins-url&lt;/code&gt; in order for&#xA;the operator to make requests to. By default, &lt;code&gt;--dry-run&lt;/code&gt; is set to &lt;code&gt;true&lt;/code&gt;&#xA;so the operator will not make any mutating requests to Jenkins, GitHub,&#xA;and Kubernetes, but you most probably want to set it to &lt;code&gt;false&lt;/code&gt;.&#xA;The Jenkins operator expects to read the Prow configuration by default&#xA;in &lt;code&gt;/etc/config/config.yaml&lt;/code&gt; which can be configured with &lt;code&gt;--config-path&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>status-reconciler</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/status-reconciler/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/status-reconciler/</guid>
      <description>&lt;p&gt;&lt;code&gt;status-reconciler&lt;/code&gt; ensures that changes to blocking presubmits in Prow configuration while PRs are&#xA;in flight do not cause those PRs to get stuck.&lt;/p&gt;&#xA;&lt;p&gt;When the set of blocking presubmits changes for a repository, one of three cases occurs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;a new blocking presubmit exists and should be triggered for every trusted, non-draft pull request in flight&lt;/li&gt;&#xA;&lt;li&gt;an existing blocking presubmit is removed and should have its&amp;rsquo; status retired&lt;/li&gt;&#xA;&lt;li&gt;an existing blocking presubmit is renamed and should have its&amp;rsquo; status migrated&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;github-api-access&#34;&gt;GitHub API Access&lt;/h2&gt;&#xA;&lt;p&gt;Status-reconciler uses the GitHub API to create, retire, and migrate commit status contexts on open pull requests. It requires GitHub authentication credentials and should be configured with ghproxy to manage rate limits. See &lt;a href=&#34;https://deploy-preview-754--k8s-prow.netlify.app/docs/github-api-access/&#34;&gt;Managing GitHub API Access&lt;/a&gt; for details on authentication methods, endpoint configuration, and rate limit management.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gangway (Prow API)</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/gangway/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/gangway/</guid>
      <description>&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;&#xA;&lt;p&gt;See the &lt;a href=&#34;https://docs.google.com/document/d/1v77jp1Nb5C2C2-PdV02SGViO9CyZ9SvNxCPOHyIUQeo/edit?usp=sharing&#34;&gt;design doc&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Gangway uses gRPC to serve several endpoints. These can be seen in the&#xA;&lt;a href=&#34;https://github.com/kubernetes-sigs/prow/blob/main/pkg/gangway/gangway.proto&#34;&gt;&lt;code&gt;gangway.proto&lt;/code&gt;&lt;/a&gt; file, which describes the gRPC endpoints. The&#xA;proto describes the interface at a high level, and is converted into low-level&#xA;Golang types into &lt;a href=&#34;https://github.com/kubernetes-sigs/prow/blob/main/pkg/gangway/gangway.pb.go&#34;&gt;&lt;code&gt;gangway.pb.go&lt;/code&gt;&lt;/a&gt; and&#xA;&lt;a href=&#34;https://github.com/kubernetes-sigs/prow/blob/main/pkg/gangway/gangway_grpc.pb.go&#34;&gt;&lt;code&gt;gangway_grpc.pb.go&lt;/code&gt;&lt;/a&gt;. These low-level Golang types are&#xA;then used in the  &lt;a href=&#34;https://github.com/kubernetes-sigs/prow/blob/main/pkg/gangway/gangway.go&#34;&gt;&lt;code&gt;gangway.go&lt;/code&gt;&lt;/a&gt; file to implement the high-level&#xA;intent of the proto file.&lt;/p&gt;&#xA;&lt;p&gt;As Gangway only understands gRPC natively, if you want to use a REST client&#xA;against it you must deploy Gangway. For example, on GKE you can use Cloud&#xA;Endpoints and deploy Gangway behind a reverse proxy called &amp;ldquo;ESPv2&amp;rdquo;. This ESPv2&#xA;container will forward HTTP requests made to it to the equivalent gRPC endpoint&#xA;in Gangway and back again.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sub</title>
      <link>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/sub/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://deploy-preview-754--k8s-prow.netlify.app/docs/components/optional/sub/</guid>
      <description>&lt;p&gt;Sub is a Prow component that can trigger new Prow jobs (PJs) using Pub/Sub&#xA;messages.  The message does not need to have the full PJ defined; instead you&#xA;just need to have the job name and some other key pieces of information (more on&#xA;this below). The rest of the data needed to create a full-blown PJ is derived&#xA;from the main Prow configuration (or inrepoconfig).&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment-usage&#34;&gt;Deployment Usage&lt;/h2&gt;&#xA;&lt;p&gt;Sub can listen to Pub/Sub subscriptions (known as &amp;ldquo;pull subscriptions&amp;rdquo;).&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
