<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ci_info"><title>ci_info - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../static.files/rustdoc-aa0817cf.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="ci_info" data-themes="" data-resource-suffix="" data-rustdoc-version="1.90.0 (1159e78c4 2025-09-14)" data-channel="1.90.0" data-search-js="search-fa3e91e5.js" data-settings-js="settings-5514c975.js" ><script src="../static.files/storage-68b7e25d.js"></script><script defer src="../crates.js"></script><script defer src="../static.files/main-eebb9057.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-32bb7600.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-6580c154.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-044be391.svg"></head><body class="rustdoc mod crate"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle" title="show sidebar"></button></nav><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../ci_info/index.html">ci_info</a><span class="version">0.14.15</span></h2></div><div class="sidebar-elems"><ul class="block"><li><a id="all-types" href="all.html">All Items</a></li></ul><section id="rustdoc-toc"><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#ci_info" title="ci_info">ci_info</a></li><li><a href="#examples" title="Examples">Examples</a><ul><li><a href="#get-ci-environment-information" title="Get CI environment information">Get CI environment information</a></li><li><a href="#check-if-a-ci-environment-is-detected" title="Check if a CI environment is detected">Check if a CI environment is detected</a></li><li><a href="#mocking-ci-environment" title="Mocking CI environment">Mocking CI environment</a></li></ul></li><li><a href="#installation" title="Installation">Installation</a><ul><li><a href="#iterating-over-vendor-variants-optional-feature" title="Iterating Over Vendor Variants (Optional Feature)">Iterating Over Vendor Variants (Optional Feature)</a></li></ul></li><li><a href="#contributing" title="Contributing">Contributing</a></li><li><a href="#license" title="License">License</a></li></ul><h3><a href="#modules">Crate Items</a></h3><ul class="block"><li><a href="#modules" title="Modules">Modules</a></li><li><a href="#functions" title="Functions">Functions</a></li></ul></section><div id="rustdoc-modnav"></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><rustdoc-search></rustdoc-search><section id="main-content" class="content"><div class="main-heading"><h1>Crate <span>ci_info</span><button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../src/ci_info/lib.rs.html#1-254">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><h2 id="ci_info"><a class="doc-anchor" href="#ci_info">§</a>ci_info</h2>
<p>Provides current CI environment information.</p>
<p>This library main goal is to provide development/build tools such as <a href="https://sagiegurari.github.io/cargo-make/">cargo-make</a> the needed information on the current CI environment.<br>
The code is based on the <a href="https://github.com/watson/ci-info">ci-info</a> npm module.</p>
<h2 id="examples"><a class="doc-anchor" href="#examples">§</a>Examples</h2><h3 id="get-ci-environment-information"><a class="doc-anchor" href="#get-ci-environment-information">§</a>Get CI environment information</h3>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">fn </span>main() {
<span class="comment">// Just check if a CI environment is detected.
</span><span class="kw">let </span>ci = ci_info::is_ci();
<span class="macro">println!</span>(<span class="string">"Is CI: {}"</span>, ci);
<span class="comment">// Get CI environment information
</span><span class="kw">let </span>info = ci_info::get();
<span class="macro">println!</span>(<span class="string">"Is CI: {}"</span>, info.ci);
<span class="kw">if let </span><span class="prelude-val">Some</span>(vendor) = info.vendor {
<span class="macro">println!</span>(<span class="string">"Vendor: {:#?}"</span>, vendor);
<span class="macro">println!</span>(<span class="string">"Name: {:#?}"</span>, info.name.unwrap());
}
<span class="kw">if let </span><span class="prelude-val">Some</span>(pr) = info.pr {
<span class="macro">println!</span>(<span class="string">"Is PR: {:#?}"</span>, pr);
}
<span class="kw">if let </span><span class="prelude-val">Some</span>(branch_name) = info.branch_name {
<span class="macro">println!</span>(<span class="string">"Branch Name: {:#?}"</span>, branch_name);
}
}</code></pre></div>
<h3 id="check-if-a-ci-environment-is-detected"><a class="doc-anchor" href="#check-if-a-ci-environment-is-detected">§</a>Check if a CI environment is detected</h3>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">fn </span>main() {
<span class="kw">let </span>ci = ci_info::is_ci();
<span class="macro">println!</span>(<span class="string">"Is CI: {}"</span>, ci);
}</code></pre></div>
<h3 id="mocking-ci-environment"><a class="doc-anchor" href="#mocking-ci-environment">§</a>Mocking CI environment</h3>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>ci_info::types::{CiInfo, Vendor};
<span class="kw">fn </span>main() {
<span class="comment">// create the CI info manually
</span><span class="kw">let </span><span class="kw-2">mut </span>mock_info = CiInfo::new();
mock_info.vendor = <span class="prelude-val">Some</span>(Vendor::TravisCI);
mock_info.ci = <span class="bool-val">true</span>;
mock_info.pr = <span class="prelude-val">Some</span>(<span class="bool-val">true</span>);
mock_info.branch_name = <span class="prelude-val">Some</span>(<span class="string">"dev_branch"</span>.to_string());
<span class="comment">// mock environment
</span>ci_info::mock_ci(<span class="kw-2">&</span>mock_info);
<span class="kw">let </span>info = ci_info::get();
<span class="macro">assert!</span>(info.ci);
<span class="macro">assert!</span>(info.pr.unwrap());
<span class="macro">assert_eq!</span>(info.vendor.unwrap(), Vendor::TravisCI);
<span class="macro">assert_eq!</span>(info.name.unwrap(), <span class="string">"Travis CI"</span>);
<span class="macro">assert_eq!</span>(info.branch_name.unwrap(), <span class="string">"dev_branch"</span>);
<span class="comment">// clear CI environment
</span>mock_info = CiInfo::new();
ci_info::mock_ci(<span class="kw-2">&</span>mock_info);
<span class="kw">let </span>info = ci_info::get();
<span class="macro">assert!</span>(!info.ci);
}</code></pre></div>
<h2 id="installation"><a class="doc-anchor" href="#installation">§</a>Installation</h2>
<p>In order to use this library, just add it as a dependency:</p>
<div class="example-wrap"><pre class="language-ini"><code>[dependencies]
ci_info = "*"</code></pre></div>
<p>There is optional <code>serde</code> support that can be enabled via the <code>serde-1</code> feature:</p>
<div class="example-wrap"><pre class="language-ini"><code>[dependencies]
ci_info = { version = "*", features = ["serde-1"] }</code></pre></div><h3 id="iterating-over-vendor-variants-optional-feature"><a class="doc-anchor" href="#iterating-over-vendor-variants-optional-feature">§</a>Iterating Over Vendor Variants (Optional Feature)</h3>
<p>When <code>iter</code> feature is enabled, you can iterate over all known CI vendor variants:</p>
<div class="example-wrap"><pre class="language-toml"><code>[dependencies]
ci_info = { version = "*", features = ["iter"] }</code></pre></div>
<p>Example usage:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>ci_info::types::Vendor;
<span class="kw">use </span>strum::IntoEnumIterator;
<span class="comment">// List all supported CI vendors
</span><span class="kw">for </span>vendor <span class="kw">in </span>Vendor::iter() {
<span class="macro">println!</span>(<span class="string">"Supported CI vendor: {:?}"</span>, vendor);
}
<span class="comment">// Count vendors
</span><span class="kw">let </span>vendor_count = Vendor::iter().count();
<span class="macro">println!</span>(<span class="string">"Total CI vendors supported: {}"</span>, vendor_count);
<span class="comment">// Filter for specific vendors
</span><span class="kw">let </span>cloud_vendors: Vec<<span class="kw">_</span>> = Vendor::iter()
.filter(|v| <span class="macro">matches!</span>(v,
Vendor::GitHubActions |
Vendor::GitLabCI |
Vendor::CircleCI
))
.collect();</code></pre></div>
<p>This feature uses <a href="https://crates.io/crates/strum">strum</a> library’s <code>EnumIter</code> derive macro.</p>
<h2 id="contributing"><a class="doc-anchor" href="#contributing">§</a>Contributing</h2>
<p>See <a href="https://github.com/sagiegurari/ci_info/blob/master/.github/CONTRIBUTING.md">contributing guide</a></p>
<h2 id="license"><a class="doc-anchor" href="#license">§</a>License</h2>
<p>Developed by Sagie Gur-Ari and licensed under the
<a href="https://github.com/sagiegurari/ci_info/blob/master/LICENSE">Apache 2</a> open source license.</p>
</div></details><h2 id="modules" class="section-header">Modules<a href="#modules" class="anchor">§</a></h2><dl class="item-table"><dt><a class="mod" href="types/index.html" title="mod ci_info::types">types</a></dt><dd>types</dd></dl><h2 id="functions" class="section-header">Functions<a href="#functions" class="anchor">§</a></h2><dl class="item-table"><dt><a class="fn" href="fn.get.html" title="fn ci_info::get">get</a></dt><dd>Loads and returns the CI info of the current environment.</dd><dt><a class="fn" href="fn.is_ci.html" title="fn ci_info::is_ci">is_ci</a></dt><dd>Returns true if a CI environment is detected.</dd><dt><a class="fn" href="fn.mock_ci.html" title="fn ci_info::mock_ci">mock_ci</a></dt><dd>This function will modify the current environment variables to mock the
requested CI vendor.</dd></dl></section></div></main></body></html>