> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mirurobotics.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

export const Framed = ({image, background, link, alt = "Framed content", borderWidth = "24px", outerRadius = "10px", innerRadius = "6px"}) => {
  const parseShorthand = value => {
    const values = String(value).trim().split(/\s+/);
    switch (values.length) {
      case 1:
        return [values[0], values[0], values[0], values[0]];
      case 2:
        return [values[0], values[1], values[0], values[1]];
      case 3:
        return [values[0], values[1], values[2], values[1]];
      default:
        return values.slice(0, 4);
    }
  };
  const isZero = v => parseFloat(v) === 0;
  const padding = parseShorthand(borderWidth);
  const outer = parseShorthand(outerRadius);
  const cornerMasks = [];
  if (isZero(padding[0]) && isZero(padding[3])) {
    cornerMasks.push(`radial-gradient(circle at 0% 0%, transparent ${outer[0]}, black ${outer[0]})`);
  }
  if (isZero(padding[0]) && isZero(padding[1])) {
    cornerMasks.push(`radial-gradient(circle at 100% 0%, transparent ${outer[1]}, black ${outer[1]})`);
  }
  if (isZero(padding[2]) && isZero(padding[1])) {
    cornerMasks.push(`radial-gradient(circle at 100% 100%, transparent ${outer[2]}, black ${outer[2]})`);
  }
  if (isZero(padding[2]) && isZero(padding[3])) {
    cornerMasks.push(`radial-gradient(circle at 0% 100%, transparent ${outer[3]}, black ${outer[3]})`);
  }
  const backgroundMask = cornerMasks.length > 0 ? cornerMasks.join(", ") : undefined;
  const innerImage = <img src={image} alt={alt} noZoom={link ? true : false} style={{
    display: "block",
    width: "100%",
    margin: 0,
    borderRadius: 0
  }} />;
  return <div style={{
    display: "inline-block",
    position: "relative",
    borderRadius: outerRadius,
    overflow: "hidden"
  }}>
            {}
            {background && <div style={{
    position: "absolute",
    inset: 0,
    backgroundImage: `url(${background})`,
    backgroundSize: "cover",
    maskImage: backgroundMask,
    WebkitMaskImage: backgroundMask,
    maskComposite: "intersect",
    WebkitMaskComposite: "source-in"
  }} />}
            {}
            <div style={{
    position: "relative",
    padding: borderWidth
  }}>
                <div style={{
    borderRadius: innerRadius,
    overflow: "hidden",
    lineHeight: 0
  }}>
                    {link ? <a href={link}>{innerImage}</a> : innerImage}
                </div>
            </div>
        </div>;
};

<Framed background="https://assets.mirurobotics.com/docs/v04/images/developers/background.jpeg" image="https://assets.mirurobotics.com/docs/v04/images/releases/header:release-create.png" borderWidth="28px" innerRadius="8px" outerRadius="10px" />

Miru supports continuous integration (CI) to automate various tasks, such as the creation of [releases](/cfg-mgmt/create-a-release) and their associated schemas.

CI pipelines leverage the [Miru CLI](/developers/cli/overview) to programmatically execute any CLI commands, which accept an API key for authentication.

Since the Miru CLI is the engine behind CI tasks, any tasks supported by the CLI can easily be automated in your CI pipeline.

## Supported CI tools

Currently, GitHub Actions is the only officially supported CI tool. However, support for other CI tools is coming soon.

If you use a different CI tool, please reach out to [support@mirurobotics.com](mailto:support@mirurobotics.com) to request support for your tool.

## API key authentication

When used in your CI pipeline, the CLI can be authenticated using an API key. Simply export the `MIRU_API_KEY` environment variable.

```bash theme={null}
export MIRU_API_KEY=<your-api-key>
```

To create an API key for your CI pipeline, follow the instructions in the [API keys](/admin/apikeys#create-an-api-key) section.

## API key scopes

To determine the scopes to give an API key, find the CLI command you want to execute in the [CLI Reference](/references/cli/release-create) and consult its **API key scopes** section.

For example, if you want to execute the `miru release create` command in CI, visit the create release command's [API key scopes](/references/cli/release-create#api-key-scopes) section.
