diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..f3603a8 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "docusaurus", + "runtimeExecutable": "npx", + "runtimeArgs": ["docusaurus", "serve", "--port", "3333"], + "port": 3333 + } + ] +} diff --git a/.gitignore b/.gitignore index e52648a..bfddbd7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,13 @@ /temp /out +/out_xml /deploy -/node_modules \ No newline at end of file +/node_modules + +# Docusaurus +.docusaurus/ +/build/ + +# Migration intermediates +/migration/docs/ diff --git a/README.md b/README.md index c4854ff..0a53013 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,81 @@ The latest, user-friendly documentation is available at: 👉 [docs.bitrise.io](https://docs.bitrise.io/) ## Note -This repository is not intended for open source contributions. If you have questions or feedback about Bitrise or its documentation, please use the support channels provided on our website. \ No newline at end of file +This repository is not intended for open source contributions. If you have questions or feedback about Bitrise or its documentation, please use the support channels provided on our website. + +## Run the docs locally + +If you've never used Node.js or a docs site before, no problem — these steps walk you through everything. + +### 1. Install the tools you need (one-time setup) + +You need two things on your machine: + +- **Node.js** — the JavaScript runtime that powers Docusaurus. Get the **LTS** version from [nodejs.org](https://nodejs.org/) (or run `brew install node` on macOS). After installing, open a fresh terminal and confirm it's there: + + ```bash + node --version # should print v18.x or higher + npm --version # should print 9.x or higher + ``` + +- **Git** — to clone this repo. Check with `git --version`. macOS prompts you to install it on first run; on other systems grab it from [git-scm.com](https://git-scm.com/). + +### 2. Get the code + +```bash +git clone git@github.com:bitrise-io/docs.git +cd docs +``` + +### 3. Install the docs site's dependencies + +From inside the `docs/` folder: + +```bash +npm install +``` + +This downloads everything Docusaurus needs into a `node_modules/` folder. It's safe to ignore the deprecation warnings; the install takes a minute or two. + +### 4. Start the docs locally + +```bash +npm start +``` + +Docusaurus boots a development server, then opens [http://localhost:3000](http://localhost:3000) in your browser automatically. Every page is served at `/en/...` — for example [http://localhost:3000/en/bitrise-ci.html](http://localhost:3000/en/bitrise-ci.html). + +The dev server hot-reloads: edit any `.md` / `.mdx` file under `docs/` (or any partial under `src/partials/`), save, and the browser refreshes within a second. + +To stop the server, press `Ctrl+C` in the terminal. + +### 5. Build the static site (optional) + +When you want to verify the production build (same output that ships to docs.bitrise.io): + +```bash +npm run build +``` + +The output lands in `build/`. To preview it locally: + +```bash +npm run serve +``` + +### Where to edit what + +| You want to... | Edit this | +|---|---| +| Change the text of a page | `docs/
/.../.md` or `.mdx` | +| Change a piece of content reused across many pages | `src/partials/.mdx` | +| Change the landing page (the `/` portal) | `src/pages/index.tsx` | +| Change site-wide navbar / footer / colors | `docusaurus.config.ts`, `src/css/custom.css` | +| Add a new image | drop it under `static/img/` and reference it as `/img/your-file.png` | + +### Troubleshooting + +- **`npm: command not found`** — Node.js isn't installed (or your terminal hasn't picked it up). Reinstall from [nodejs.org](https://nodejs.org/) and open a new terminal window. +- **Build errors mentioning MDX** — usually a stray `` or `{kebab-case}` placeholder in a Markdown file is being parsed as JSX. The error message points at the file and line; wrap the offending text in backticks (`` `` ``) or escape with HTML entities (`<word>`). +- **Port 3000 already in use** — pass a different port: `npm start -- --port 3001`. +- **Browser shows an empty page after editing** — check the terminal for compile errors; the dev server pauses rendering until it can recompile. \ No newline at end of file diff --git a/docs/bitrise-build-cache/_category_.json b/docs/bitrise-build-cache/_category_.json new file mode 100644 index 0000000..856a08b --- /dev/null +++ b/docs/bitrise-build-cache/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Bitrise Build Cache", + "position": 1, + "link": { + "type": "doc", + "id": "bitrise-build-cache/index" + } +} diff --git a/docs/bitrise-build-cache/build-cache-for-bazel/_category_.json b/docs/bitrise-build-cache/build-cache-for-bazel/_category_.json new file mode 100644 index 0000000..79ad0f0 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-bazel/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Build Cache for Bazel", + "position": 2, + "link": null +} diff --git a/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds.md b/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds.md new file mode 100644 index 0000000..a62d130 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds.md @@ -0,0 +1,70 @@ +--- +title: "Configuring the build cache for Bazel in local builds" +sidebar_position: 3 +slug: /bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds +sidebar_label: Configuring the Bitrise Build Cache for Bazel in local environments +--- + +You can use the Bitrise Build Cache for Bazel on any machine: you just need to create a `bitrise.bazelrc` configuration file that includes the required configuration for the cache endpoints. + +1. Select your Bitrise workspace and go to **Build Cache**. +1. Click **New connection**. +1. Select **Other CI provider** and then select your build tool from the dropdown menu. + + ![2025-10-21-choose-build-tool.png](/img/_paligo/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png) +1. Click **Create token**. + + ![2025-10-21-create-token.png](/img/_paligo/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png) +1. Enter a name and set it to never expire. +1. Copy the keys and values of the two variables. +1. Set the variables as Environment Variables in your local configuration. + + ``` + export BITRISE_BUILD_CACHE_WORKSPACE_ID= + export BITRISE_BUILD_CACHE_AUTH_TOKEN= + ``` +1. Download the CLI and install it in a temporary location. You will only need to use it to activate the build cache once, or if any of the settings change. + + ``` + curl --retry 5 -sSfL 'https://raw.githubusercontent.com/bitrise-io/bitrise-build-cache-cli/main/install/installer.sh' | sh -s -- -b /tmp/bin -d + ``` +1. Activate the Bitrise Build Cache. + + There are a couple of flags you can use to control the configuration, but we recommend these defaults: + + ``` + /tmp/bin/bitrise-build-cache activate bazel --cache --cache-push=false + ``` + + :::note[Pulling from cache] + + We recommend only pulling artifacts from the cache to avoid accidentally sharing incorrect cache data due to file modifications during a build. + + For the full list of flags check the CLI’s `/tmp/bin/bitrise-build-cache activate bazel --help` command. + + ::: +1. If you have Remote Build Execution enabled for your workspace, you can also use it locally by adding the `--rbe` flag. + + :::note[Enabling RBE locally] + + You will need to have the workers set up for your workspace, and the pool configuration in your repository’s `.bazelrc` file before enabling RBE locally! + + ::: +1. Optionally, add your repository URL in your repository’s root `.bazelrc` file. + + We recommend doing this to be able to identify your local builds. + + :::note[Replace the URL] + + Make sure to replace the placeholder URL in the command with your own! + + ::: + + ``` + build --remote_header='x-repository-url=https://github.com/bazelbuild/bazel.git' + build --bes_header='x-repository-url=https://github.com/bazelbuild/bazel.git' + ``` + +That's it! You can now run any `bazel` commands and take advantage of the Bitrise Build Cache. You can check the invocation details through the link printed during builds: + +![bazel-local-printout.png](/img/_paligo/uuid-a87ac3d9-b1bf-89bc-8d33-84e7edc358c9.png) diff --git a/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments.md b/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments.md new file mode 100644 index 0000000..74e8057 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments.md @@ -0,0 +1,46 @@ +--- +title: "Configuring the build cache for Bazel in other CI environments" +sidebar_position: 2 +slug: /bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments +sidebar_label: Configuring the Build Cache for Bazel in non-Bitrise CI environments +--- + +The Bitrise Build Cache does not require using the Bitrise CI. You can use other CI/CD services and still take advantage of remote caching to improve your Bazel build times. + +To do so, you need to configure your CI environment to download the Bitrise Build Cache CLI during the build and then run the CLI to enable the Bitrise Build Cache. + +1. Select your Bitrise workspace and go to **Build Cache**. +1. Click **New connection**. +1. Select **Other CI provider** and then select your build tool from the dropdown menu. + + ![2025-10-21-choose-build-tool.png](/img/_paligo/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png) +1. Click **Create token**. + + ![2025-10-21-create-token.png](/img/_paligo/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png) +1. Enter a name and set it to never expire. +1. Copy the variables and add them to your CI configuration as Environment Variables. +1. Add the following script to your CI configuration before the step you want to speed up: + + :::important[Environment] + + Make sure to run the script in the same environment as the Bazel command you want to speed up. For example, if you use multiple Docker containers throughout the build, make sure that the Bitrise Build Cache CLI runs in the same Docker container as the Bazel command. + + ::: + + ``` + #!/usr/bin/env bash + set -euxo pipefail + + # download Bitrise Build Cache CLI + curl --retry 5 -sSfL 'https://raw.githubusercontent.com/bitrise-io/bitrise-build-cache-cli/main/install/installer.sh' | sh -s -- -b /tmp/bin -d + + # run the CLI to enable Bitrise build cache for Bazel + /tmp/bin/bitrise-build-cache activate bazel --cache --cache-push + ``` +1. If you have Remote Build Execution enabled for your workspace, you can also use it locally by adding the `--rbe` flag. + + :::note[Enabling RBE locally] + + You will need to have the workers set up for your workspace, and the pool configuration in your repository’s `.bazelrc` file before enabling RBE locally! + + ::: diff --git a/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment.mdx b/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment.mdx new file mode 100644 index 0000000..90db2ea --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment.mdx @@ -0,0 +1,35 @@ +--- +title: "Configuring the build cache for Bazel in the Bitrise CI environment" +sidebar_position: 1 +slug: /bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment +sidebar_label: Configuring the Bitrise Build Cache for Bazel in the Bitrise CI environment +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkflowEditorAndSelectingAWorkflow from '@site/src/partials/opening-the-workflow-editor-and-selecting-a-workflow.mdx'; + +You can use the Bitrise [Build Cache for Bazel](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-bazel) on the Bitrise CI by adding our dedicated Step to your Workflow. The Step activates the Bitrise Build Cache. After it executes, Bazel builds will automatically read from the build cache and push new entries if it's enabled. + +Workflow Editor + +bitrise.yml + +1. +1. Add the **Bitrise [Build Cache for Bazel](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-bazel)** Step to your Workflow. + + The Step requires no configuration. + +1. Open the `bitrise.yml` file and add the `activate-build-cache-for-bazel` Step to your Workflow. + + The Step requires no configuration. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - activate-build-cache-for-bazel: + ``` + +During your first build, outputs will be saved to cache. We recommend running a couple of builds to ensure the cache is warmed up. diff --git a/docs/bitrise-build-cache/build-cache-for-bazel/index.md b/docs/bitrise-build-cache/build-cache-for-bazel/index.md new file mode 100644 index 0000000..3d527c8 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-bazel/index.md @@ -0,0 +1,8 @@ +--- +title: "Build cache for Bazel" +sidebar_position: 2 +slug: /bitrise-build-cache/build-cache-for-bazel +sidebar_label: Build Cache for Bazel +--- + +Build Cache for Bazel diff --git a/docs/bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel.mdx b/docs/bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel.mdx new file mode 100644 index 0000000..cd383ae --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel.mdx @@ -0,0 +1,76 @@ +--- +title: "Remote build execution for Bazel" +description: "Remote execution of a Bazel build allows you to distribute build and test actions across multiple machines. This speeds up build and test execution, allows reuse of build outputs across development teams, and provides" +sidebar_position: 4 +slug: /bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RecommendedFlagsForRemoteBuildExecution from '@site/src/partials/recommended-flags-for-remote-build-execution.mdx'; + +Remote execution of a Bazel build allows you to distribute build and test actions across multiple machines. This speeds up build and test execution, allows reuse of build outputs across development teams, and provides a consistent environment. + +You can use the Bitrise Build Cache with remote build execution both on Bitrise and in a non-Bitrise CI environment. + +## Configuring remote build execution on Bitrise + + + + +1. Set up the Bitrise [Build Cache for Bazel](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-bazel): [Configuring the build cache for Bazel in the Bitrise CI environment](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment). +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. In the **Bitrise [Build Cache for Bazel](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-bazel)** Step, set the **Enable Bazel RBE** input field to **true**. + + + + +1. Open your configuration YAML file. +1. Add the `activate-build-cache-for-bazel` Step to your Workflow. + + ``` + your-workflow: + steps: + - git-clone: {} + - activate-build-cache-for-bazel: + inputs: + - enable_rbe: true + ``` + + + + +## Configuring remote build execution in a non-Bitrise environment + + + + +1. Start setting up the Bitrise [Build Cache for Bazel](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-bazel): [Configuring the build cache for Bazel in other CI environments](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments). +1. When enabling the Bitrise Build Cache, add the `--rbe` flag. + + ``` + /tmp/bin/bitrise-build-cache activate bazel --cache --cache-push=false --rbe + ``` + + :::note[Cache] + + We recommend setting the `--cache-push` flag to false because during remote build execution, workers upload results to the cache. + + ::: + + + + +1. Start setting up the Bitrise [Build Cache for Bazel](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-bazel): [Configuring the build cache for Bazel in local builds](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds). +1. Add the RBE endpoint config to your `.bazelrc`: + + ``` + build:remote --remote_executor=grpcs://bitrise-accelerate.services.bitrise.io:443 + ``` + + + + + diff --git a/docs/bitrise-build-cache/build-cache-for-gradle/_category_.json b/docs/bitrise-build-cache/build-cache-for-gradle/_category_.json new file mode 100644 index 0000000..ce3da97 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-gradle/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Build Cache for Gradle", + "position": 3, + "link": null +} diff --git a/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds.md b/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds.md new file mode 100644 index 0000000..cd29812 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds.md @@ -0,0 +1,54 @@ +--- +title: "Configuring the build cache for Gradle in local builds" +sidebar_position: 3 +slug: /bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds +sidebar_label: Configuring the Build Cache for Gradle in local environments +--- + +You can use the Bitrise Build Cache even for local Gradle builds. In this way your local builds and CI builds will use the same build cache, minimizing build times in both environments. + +There are two ways to set up the Bitrise Build Cache for a Gradle project: + +- Configuring caching in a separate file, without changing Gradle project files. +- Configuring caching directly in the Gradle project build files. + +1. Select your Bitrise workspace and go to **Build Cache**. +1. Click **New connection**. +1. Select **Other CI provider** and then select your build tool from the dropdown menu. + + ![2025-10-21-choose-build-tool.png](/img/_paligo/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png) +1. Click **Create token**. + + ![2025-10-21-create-token.png](/img/_paligo/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png) +1. Enter a name and set it to never expire. +1. Copy the keys and values of the two variables. +1. Set the variables as Environment Variables in your local configuration. + + ``` + export BITRISE_BUILD_CACHE_WORKSPACE_ID= + export BITRISE_BUILD_CACHE_AUTH_TOKEN= + ``` +1. Download the CLI and install it in a temporary location. You will only need to use it to activate the build cache once, or if any of the settings change. + + ``` + curl --retry 5 -sSfL 'https://raw.githubusercontent.com/bitrise-io/bitrise-build-cache-cli/main/install/installer.sh' | sh -s -- -b /tmp/bin -d + ``` +1. Activate the Bitrise Build Cache. + + There are a couple of flags you can use to control the configuration, but we recommend these defaults: + + ``` + /tmp/bin/bitrise-build-cache activate gradle --cache --cache-push=false + ``` + + :::note[Pulling from cache] + + We recommend only pulling artifacts from the cache to avoid accidentally sharing incorrect cache data due to file modifications during a build. + + For the full list of flags check the CLI’s `/tmp/bin/bitrise-build-cache activate gradle --help` command. + + ::: + +Now Bitrise Build Cache will be used for your local builds. You can check the invocation details through the link printed during builds: + +![DevCenter_article_gradle_bazel_local_dev_env_guide_-_Google_Docs.png](/img/_paligo/uuid-f2b9bb79-63bb-0c15-7e8d-4304c3fa2a51.png) diff --git a/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments.md b/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments.md new file mode 100644 index 0000000..80908b7 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments.md @@ -0,0 +1,39 @@ +--- +title: "Configuring the build cache for Gradle in other CI environments" +sidebar_position: 2 +slug: /bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments +sidebar_label: Configuring the Build Cache for Gradle in non-Bitrise CI environments +--- + +The Bitrise Build Cache does not require using the Bitrise CI. You can use other CI/CD services and still take advantage of the cache to improve your Gradle build times. + +To do so, you need to configure your CI environment to download the Bitrise Build Cache CLI during the build and then run the CLI to enable the Bitrise Build Cache. + +1. Select your Bitrise workspace and go to **Build Cache**. +1. Click **New connection**. +1. Select **Other CI provider** and then select your build tool from the dropdown menu. + + ![2025-10-21-choose-build-tool.png](/img/_paligo/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png) +1. Click **Create token**. + + ![2025-10-21-create-token.png](/img/_paligo/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png) +1. Enter a name and set it to never expire. +1. Copy the variables and add them to your CI configuration as Environment Variables. +1. Add the following script to your CI configuration before the step you want to speed up: + + :::important[Environment] + + Make sure to run the script in the same environment as the Gradle command(s) you want to speed up. For example, if you use multiple Docker containers throughout the build, make sure that the Bitrise Build Cache CLI runs in the same Docker container as the Gradle command. + + ::: + + ``` + #!/usr/bin/env bash + set -euxo pipefail + + # download Bitrise Build Cache CLI + curl --retry 5 -sSfL 'https://raw.githubusercontent.com/bitrise-io/bitrise-build-cache-cli/main/install/installer.sh' | sh -s -- -b /tmp/bin -d + + # run the CLI to enable Bitrise build cache for Gradle + /tmp/bin/bitrise-build-cache activate gradle --cache --cache-push + ``` diff --git a/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment.mdx b/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment.mdx new file mode 100644 index 0000000..a25297f --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment.mdx @@ -0,0 +1,37 @@ +--- +title: "Configuring the build cache for Gradle in the Bitrise CI environment" +sidebar_position: 1 +slug: /bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment +sidebar_label: Configuring the Build Cache for Gradle in the Bitrise CI environment +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkflowEditorAndSelectingAWorkflow from '@site/src/partials/opening-the-workflow-editor-and-selecting-a-workflow.mdx'; + +In the Bitrise CI environment, you only need our official Step to use the Bitrise Build Cache for your Gradle builds. + +If you want to use the Bitrise Build Cache [in your local builds](#section-idm4592334394502433722959666507), you need to first activate it in our CI environment. + +Workflow Editor + +bitrise.yml + +1. +1. Add the [**Build Cache for Gradle**](https://github.com/bitrise-steplib/bitrise-step-activate-gradle-remote-cache) Step to your Workflow. + + The Step should be before any Step that executes Gradle tasks, such as [**Gradle Runner**](https://github.com/bitrise-io/steps-gradle-runner) or [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build). + + ![gradle-cache-image.png](/img/_paligo/uuid-1afefa9a-7cc1-db41-6186-0ee56293458c.png) + +1. Open the `bitrise.yml` file and add the `activate-build-cache-for-gradle` Step to your Workflow. + + The Step should be before any Step that executes Gradle tasks, such as `gradle-runner` or `android-build`. + + ```yaml + your-workflow: + steps: + - git-clone@8: {} + - activate-build-cache-for-gradle: + ``` diff --git a/docs/bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache.md b/docs/bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache.md new file mode 100644 index 0000000..c4a665b --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache.md @@ -0,0 +1,91 @@ +--- +title: "Gradle configuration cache" +description: "Gradle configuration cache reduces build times by caching the result of a Gradle project's configuration phase and reusing it in subsequent builds. For details, read [Gradle's official documentation](https://docs.gradle.org/current/userguide/configuration_cache.html). The Bitrise Build Cache supports this feature for Gradle 8.6 and later versions." +sidebar_position: 4 +slug: /bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache +--- + +Gradle configuration cache reduces build times by caching the result of a Gradle project's configuration phase and reusing it in subsequent builds. For details, read [Gradle's official documentation](https://docs.gradle.org/current/userguide/configuration_cache.html). The [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching) supports this feature for Gradle 8.6 and later versions. + +## Setting up the configuration cache + +To set up the configuration cache: + +1. Make sure you have a subscription or a trial for the [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching). +1. Run a build locally with the `--configuration-cache` flag. + + This ensures that your Gradle project supports configuration caching. To enable configuration caching in the Gradle settings, [refer to Gradle's official guide](https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:usage:enable). +1. Generate a Bitrise [personal access token](/en/bitrise-platform/accounts/personal-access-tokens/creating-a-personal-access-token) and add it as a [Secret](/en/bitrise-ci/configure-builds/secrets.html) with the BITRISE_BUILD_CACHE_AUTH_TOKEN key. + + :::note[Token consistency] + + For the configuration cache to function correctly, the authentication token used by the Gradle plugins must remain consistent across builds. + + ::: +1. Generate a Gradle encryption key: + + ``` + openssl rand -base64 16 + ``` +1. Save the key as a [Secret](/en/bitrise-ci/configure-builds/secrets.html) named GRADLE_ENCRYPTION_KEY in your Bitrise project. + + This ensures that the encrypted value of the configuration cache remains the same across different builds. Using a fixed encryption key is supported from Gradle version 8.6 or later. Bitrise doesn't support Gradle configuration cache for earlier Gradle versions. +1. Set your Bitrise [workspace slug](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs) as an Environment Variable named BITRISE_BUILD_CACHE_WORKSPACE_ID. +1. Add the **Build Cache for Gradle** Step to your Workflow. + + The Step must be of version 2.7.7 or later. Any subsequent updates to the Step will cause a one-off invalidation of the configuration cache. If this happens, do a rebuild to fix the issue. +1. Add the **Restore Gradle configuration cache** and the **Restore Gradle Cache** Steps before your Gradle invocation in the Workflow. + + The Steps retrieve cached configuration data and enable the configuration cache to access artifacts it references. + + :::note[Configuration cache directory] + + The **Restore Gradle configuration cache** Step saves data in the `./.gradle/configuration-cache` directory. You can override this by changing the **Configuration cache directory** input. + + ::: + + For example, if you use **Android Build** to build your Gradle project, these two Steps must come before it in the Workflow. +1. Add the **Save Gradle configuration cache** and the **Save Gradle Cache** Steps after your Gradle invocation in the Workflow. + + The Steps save the configuration data to the cache and save artifacts referenced by the configuration cache. +1. Enable the **Save transforms** input of the **Save Gradle Cache** Step. You need Step version 1.4.1 or later. + +## Saving the Gradle configuration cache log + +Gradle's build logs might contain information about why it didn't reuse the configuration cache. You can save the log to the **Artifacts** page of your build: + +1. Enable the `--info` [log level](https://docs.gradle.org/current/userguide/logging.html) in Gradle. +1. Add the **Deploy to Bitrise.io** Step to your Workflow. +1. Set the **Deploy directory or file path** input to what Gradle outputs as the file path. + +You can check the deployed file on the **Artifacts** page: open Bitrise CI, select your project and then the build, and select the **Artifacts** tab. + +## Troubleshooting the configuration cache + +If your build doesn't reuse the configuration cache, you can check a number of potential problems. + +### General troubleshooting + +- Make sure to add the Save/Restore Gradle cache Steps to utilize dependency caching. Gradle configuration cache references artifacts that must be present. +- It may take multiple runs before the configuration cache is fully applied and reused. +- Check the Gradle logs to find out why Gradle didn't reuse the configuration cache. You can [save the gradle configuration cache log](#section-idm23460613639422) to your build artifacts. +- Updates to the **Build Cache for Gradle** Step will cause a one-off invalidation of the configuration cache. Just run another build to fix the problem. + +### Failed to instrument class error + +Your build could fail with the following error: + +``` +org.gradle.internal.operations.BuildOperationInvocationException: Failed to instrument class io/bitrise/gradle/cache/BitriseBuildCache in ClassLoaderScopeIdentifier.Id{coreAndPlugins:init-file:/root/.gradle/init.d/bitrise-build-cache.init.gradle.kts(export)} +``` + +To fix this issue: + +1. In the **Save Gradle cache** Step, set the **Save transforms** input to **true**. + + :::note[Version requirement] + + The input is only available from version 1.4.1 or later. + + ::: +1. Force a save by running a build without the **Restore Gradle cache** Step. diff --git a/docs/bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds.mdx b/docs/bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds.mdx new file mode 100644 index 0000000..9e3889a --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds.mdx @@ -0,0 +1,24 @@ +--- +title: "Gradle execution reason diagnostic builds" +description: "You can run Gradle diagnostic builds on Bitrise to find out the reasons behind Gradle task execution events. This helps reducing cache misses for remote caching." +sidebar_position: 5 +slug: /bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GradleTasksAndCaching from '@site/src/partials/gradle-tasks-and-caching.mdx'; +import Partial_DiagnosticBuilds from '@site/src/partials/diagnostic-builds.mdx'; + +Cache hit ratio is a measurement of how many content requests a cache is able to fill successfully, compared to how many requests it receives. Getting a high amount of cache misses slows down your build as it doesn't take full advantage of caching. + +When running Gradle tasks, a change in task inputs usually lead to a cache miss. Gradle's execution reasons can help understand why the change in inputs happened, and to debug the problem. + +You can keep on reading to understand the details of how Gradle tasks and their caching works. + +To learn how to set up diagnostic builds on Bitrise, skip ahead to [see topic](#UUID-bae4be67-215c-daa2-07e9-055a1ec60f34). + + + + diff --git a/docs/bitrise-build-cache/build-cache-for-gradle/index.md b/docs/bitrise-build-cache/build-cache-for-gradle/index.md new file mode 100644 index 0000000..f64c6d6 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-gradle/index.md @@ -0,0 +1,8 @@ +--- +title: "Build cache for Gradle" +sidebar_position: 3 +slug: /bitrise-build-cache/build-cache-for-gradle +sidebar_label: Build Cache for Gradle +--- + +Build Cache for Gradle diff --git a/docs/bitrise-build-cache/build-cache-for-xcode/_category_.json b/docs/bitrise-build-cache/build-cache-for-xcode/_category_.json new file mode 100644 index 0000000..39be978 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-xcode/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Build Cache for Xcode", + "position": 4, + "link": null +} diff --git a/docs/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments.mdx b/docs/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments.mdx new file mode 100644 index 0000000..3b9e011 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments.mdx @@ -0,0 +1,45 @@ +--- +title: "Configuring the Build Cache for Xcode in non-Bitrise CI environments" +description: "The Bitrise Build Cache does not require using the Bitrise CI. You can use other CI/CD services and still take advantage of the cache to improve your Xcode build times. To do so, you need to configure your CI environment to download the Bitrise Build Cache CLI during the build and then run the CLI to enable the Bitrise Build Cache." +sidebar_position: 2 +slug: /bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +The Bitrise Build Cache does not require using the Bitrise CI. You can use other CI/CD services and still take advantage of the cache to improve your Xcode build times. + +To do so, you need to configure your CI environment to download the Bitrise Build Cache CLI during the build and then run the CLI to enable the Bitrise Build Cache. + +1. Generate a Personal Access Token on Bitrise: [Creating a personal access token](/en/bitrise-platform/accounts/personal-access-tokens/creating-a-personal-access-token). + + Copy the value of the token, as you will need it during the process. +1. [Find your Workspace ID](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs): open the **Workspace settings** page and select **General settings** on the left navigation menu. You can find and copy the slug from there. +1. Set the following Environment Variables in your CI configuration: + + - BITRISE_BUILD_CACHE_AUTH_TOKEN: The value should be your Personal Access Token. + - BITRISE_BUILD_CACHE_WORKSPACE_ID: The value should be the Bitrise Workspace slug. +1. Add the following script to your CI configuration before the step you want to speed up: + + :::important[Environment] + + Make sure to run the script in the same environment as the Xcode command(s) you want to speed up. + + If you already have a workflow set up for other build tools (for example, Gradle), you need to make sure to install the latest CLI version that supports Xcode, i.e. at least v1.0.0. + + The Xcode Compilation Cache requires Xcode 26 or later version. + + ::: + + ``` + #!/usr/bin/env bash + set -euxo pipefail + + # download Bitrise Build Cache CLI + curl --retry 5 -sSfL 'https://raw.githubusercontent.com/bitrise-io/bitrise-build-cache-cli/main/install/installer.sh' | sh -s -- -b /tmp/bin -d + + # run the CLI to enable Bitrise build cache for Xcode + /tmp/bin/bitrise-build-cache activate xcode --cache --cache-push + ``` diff --git a/docs/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.mdx b/docs/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.mdx new file mode 100644 index 0000000..4c1614c --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.mdx @@ -0,0 +1,42 @@ +--- +title: "Configuring the Build Cache for Xcode in the Bitrise CI environment" +description: "You need the **Bitrise Build Cache for Xcode** Step to activate the Build Cache for your Xcode project. After the Step executes, Xcode tasks will automatically read from the build cache and push new entries, too." +sidebar_position: 1 +slug: /bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkflowEditor from '@site/src/partials/opening-the-workflow-editor.mdx'; + +You need the **Bitrise [Build Cache for Xcode](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-xcode)** Step to activate the Build Cache for your Xcode project. After the Step executes, Xcode tasks will automatically read from the build cache and push new entries, too. + +Workflow Editor + +Configuration YAML + +1. Make sure your build runs on a stack with Xcode 26 or higher version installed: [Setting the stack for your builds](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds). +1. +1. Add the [**Build Cache for Xcode**](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-xcode) Step to your Workflow. + + The Step should be before any Step that executes Xcode tasks. For example, **fastlane** or [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive). +1. Optionally, you can disable pushing new cache entries: set the **Push new cache entries** input to **false**. + + In read-only mode, your build only reads from the cache but doesn't update it. +1. Click **Save changes**. + +1. Make sure your build runs on a stack with Xcode 26 or higher version installed: [Setting the stack for your builds](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds). +1. Add the `activate-build-cache-for-xcode` Step to your Workflow. + + The Step should be before any Step that executes Xcode tasks. For example, `fastlane` or `xcode-archive`. + + ``` + your-workflow: + meta: + bitrise.io: + stack: osx-xcode-26.0.x-edge + steps: + - git-clone: {} + - activate-build-cache-for-xcode: {} + ``` diff --git a/docs/bitrise-build-cache/build-cache-for-xcode/index.md b/docs/bitrise-build-cache/build-cache-for-xcode/index.md new file mode 100644 index 0000000..303cd73 --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-xcode/index.md @@ -0,0 +1,7 @@ +--- +title: "Build Cache for Xcode" +sidebar_position: 4 +slug: /bitrise-build-cache/build-cache-for-xcode +--- + +Build Cache for Xcode diff --git a/docs/bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq.mdx b/docs/bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq.mdx new file mode 100644 index 0000000..48b1f8e --- /dev/null +++ b/docs/bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq.mdx @@ -0,0 +1,78 @@ +--- +title: "Xcode Compilation Cache FAQ" +sidebar_position: 3 +slug: /bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## What are the requirements to use Xcode Compilation Cache? + +You need Xcode 26 and **Explicitly Built Modules enabled** (default in Xcode 26 for Swift targets) + +## Will this work with Swift Package Manager dependencies? + +As of September 2025, SPM dependencies are not cacheable in Xcode 26 Beta. Apple is working on it and it should be available in the future. + +## What build tasks are not cacheable? + +`CompileStoryboard`, `CompileXIB`, `CompileAssetCatalogVariant`, `PhaseScriptExecution`, `DataModelCompile`, `CopyPNGFile`, `GenerateDSYMFile`, and `Ld` tasks are currently not cacheable. + +## Will it speed up my Xcode Tests? + +Xcode Compilation Cache helps reducing compilation times. This means build and archive actions benefit the most. + +In case of Xcode Test, the compilation of the tests will be faster, but running the tests won’t be quicker. + +For testing the performance benefits of Xcode compilation cache, we recommend to test with a Workflow which runs [Xcode Archive](https://bitrise.io/integrations/steps/xcode-archive) or [Xcode Build For Testing](https://bitrise.io/integrations/steps/xcode-build-for-test) (or any other build command). + +## How can I disable Xcode compilation cache temporarily? + +The simplest method is to specify a custom Xcode flag: `--no-bitrise-build-cache`. + +This is recognized by the Bitrise wrapper and disables caching without disabling analytics. This means the invocation will show up on the UI but it will not use caching and therefore won't count towards the caching quota. + +There is another option: you can override the PATH to remove the wrapping we set up by issuing: + +``` +export PATH="${PATH#"$HOME/.bitrise-xcelerate/bin:"}" +``` + +Note that this will be reverted in the next terminal session as the Bitrise Build Cache CLI persists, the PATH overrides in `~/.zshrc` and `~/.bashrc`. + +To make this persist among Bitrise Steps, set the PATH again with envman: + +``` +envman add --key PATH --value "$PATH" +``` + +## How to pass compilation cache build flags manually? + +To enable compilation caching manually per-project, you can disable passing the necessary flags in the [Build Cache for Xcode](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-xcode) Step (on Bitrise CI) with the **Skip passing cache flags to xcodebuild** Step input. If you are using the Bitrise Build Cache CLI locally, you can pass the `--cache-skip-flag` to your `activate xcode` command. + +In this case, you either need to manually set some flags per-build, or in your project's build settings. Some might already have a named version in Xcode IDE, for example, "Enable Compilation Caching", or "Explicitly Built Modules". These are the flags we pass by default: + +``` +- "COMPILATION_CACHE_ENABLE_PLUGIN": "YES" +- "COMPILATION_CACHE_ENABLE_INTEGRATED_QUERIES": "YES" +- "COMPILATION_CACHE_ENABLE_DETACHED_KEY_QUERIES": "YES" +- "SWIFT_ENABLE_COMPILE_CACHE": "YES" +- "SWIFT_ENABLE_EXPLICIT_MODULES": "YES" +- "SWIFT_USE_INTEGRATED_DRIVER": "YES" +- "CLANG_ENABLE_COMPILE_CACHE": "YES" +- "CLANG_ENABLE_MODULES": "YES" +``` + +Learn more on how we pass these flags on Bitrise in this [blog post](https://bitrise.io/blog/post/lifting-the-hood-on-build-cache-for-xcode). + +## What about tools that depend on Xcode Index Data Store? + +Xcode does not generate an `Index.noindex/DataStore` in DerivedData when remote compilation cache is enabled. This can cause an error if your tasks depend on the Index Data Store. + +Here's an example error, generated by [Periphery](https://github.com/peripheryapp/periphery) when the Index data store isn’t found: + +`error: Internal Error: index store path does not exist: /Users/vagrant/Library/Developer/Xcode/DerivedData/.../Index.noindex/DataStore` + +Currently, there’s no solution for this. A workaround can be to use Bitrise [Build Cache for Xcode](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-xcode) with all the steps and workflows which don’t depend on the Index data store, and run the steps which do depend on the Index data store in a separate workflow where you don’t configure Bitrise [Build Cache for Xcode](https://github.com/bitrise-steplib/bitrise-step-activate-build-cache-for-xcode). diff --git a/docs/bitrise-build-cache/getting-started-with-the-build-cache/_category_.json b/docs/bitrise-build-cache/getting-started-with-the-build-cache/_category_.json new file mode 100644 index 0000000..7dd23b4 --- /dev/null +++ b/docs/bitrise-build-cache/getting-started-with-the-build-cache/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Bitrise Build Cache", + "position": 1, + "description": "The Bitrise Build Cache is a fully managed caching solution that reduces CI build durations for applications built with Gradle and Bazel build systems. It specifically caches build and test outputs to minimize how much work is done in subsequent builds.", + "link": null +} diff --git a/docs/bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache.md b/docs/bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache.md new file mode 100644 index 0000000..643db2e --- /dev/null +++ b/docs/bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache.md @@ -0,0 +1,41 @@ +--- +title: "At-rest encryption for the Build Cache" +description: "[Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching) protects customer data with at-rest encryption using envelope encryption and AES-256-GCM." +sidebar_position: 3 +slug: /bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache +--- + +[Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching) protects customer data with at-rest encryption using envelope encryption and AES-256-GCM. + +## At-rest encryption overview + +- A unique Data Encryption Key (DEK) is generated for each customer. +- The DEK is encrypted using a Key Encryption Key (KEK), which is generated and managed by a Key Management System (KMS). For example, Google KMS. +- We rotate the KEK every 90 days for enhanced security. +- The encrypted DEKs are stored securely in our database, but the DEK never persists in its decrypted form—it is only used in memory when encrypting or decrypting data. +- The DEK is used to encrypt customer data, ensuring that sensitive information is securely stored at rest. + +KEK and DEKs are never stored together, ensuring strong isolation. The raw KEK is never exposed: it is only used within KMS to encrypt and decrypt DEKs securely. This approach ensures strong encryption, safe key handling, and a high level of data protection for our customers. + +## Security benefits + +- Strong encryption: AES-256-GCM is a widely trusted encryption standard that provides robust protection for sensitive data. +- Customer isolation: Each customer has a unique DEK, meaning that if one customer's key were to be compromised, no other customers' data would be affected. Accessing encrypted data alone does not provide access to decrypted data. +- Regulatory compliance: Our at-rest encryption aligns with best practices recommended by security and privacy regulations, including: + + - **GDPR (General Data Protection Regulation)**: Encourages encryption as a data protection measure. + - **CCPA (California Consumer Privacy Act)**: Encrypted data may be exempt from certain breach liability requirements. + - **SOC 2**: Supports encryption as a key security control for compliance. + - **ISO/IEC 27001**: Recommends encryption for securing stored data. + - **NIST (National Institute of Standards and Technology)**: Provides encryption standards (for example, AES-256) to ensure strong data protection and compliance with industry security frameworks. + +## Customer-managed Encryption Keys + +For customers seeking greater control over their encryption, we offer the option to use Customer-Managed Encryption Keys (CMEKs). + +With CMEKs, customers can store their Key Encryption Key (KEK) in their own Google Cloud KMS or Amazon KMS, allowing them to: + +- Maintain full control: Manage their own KEKs, including creation, rotation, and revocation. +- Enhance security compliance: Ensure that only they have access to their encryption keys, aligning with strict internal security policies. + +If you're interested in using CMEKs, [contact us](https://bitrise.io/contact) to discuss your requirements. diff --git a/docs/bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache.md b/docs/bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache.md new file mode 100644 index 0000000..1f4f0c1 --- /dev/null +++ b/docs/bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache.md @@ -0,0 +1,24 @@ +--- +title: "Clearing the Build Cache" +description: "You can clear the entire contents of your Bitrise Build Cache any time. This clears everything, including the Gradle configuration cache." +sidebar_position: 4 +slug: /bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache +--- + +You can clear the entire contents of your Bitrise Build Cache any time. This clears everything, including the Gradle configuration cache. There is no way to delete specific parts of the cache. + +After clearing the cache, your first build will take longer because outputs will need to be saved again. + +:::important[Owners only] + +Only workspace owners can clear the cache. + +::: + +To clear the cache: + +1. Open the Bitrise Build Cache. +1. Click **Clear cache**. +1. In the dialog, click **Clear cache**. + + ![SCR-20260401-obcc.png](/img/_paligo/uuid-9547e14a-19b8-4d74-9d5a-6558fdc1f8ea.png) diff --git a/docs/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache.md b/docs/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache.md new file mode 100644 index 0000000..1842168 --- /dev/null +++ b/docs/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache.md @@ -0,0 +1,51 @@ +--- +title: "Getting started with the Build Cache" +description: "The [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching) is a fully managed caching solution that reduces CI build durations for applications built with Gradle and Bazel build systems. It specifically caches build and test outputs to minimize how much work is done in subsequent builds, making it more efficient in environments with frequent updates. Compatible with any CI tool, it accelerates the build cycle without requiring you to manage a caching infrastructure." +sidebar_position: 1 +slug: /bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache +sidebar_label: Getting started +--- + +The [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching) is a fully managed caching solution that reduces CI build durations for applications built with Gradle, Bazel, and Xcode. It specifically caches build and test outputs to minimize how much work is done in subsequent builds, making it more efficient in environments with frequent updates. Compatible with any CI tool, it accelerates the build cycle without requiring you to manage a caching infrastructure. + +:::tip[Try it for free] + +We offer a 30-day free trial at no cost; you don't even need to provide payment information. The trial starts automatically when you set up the Bitrise Build Cache. + +[Click here to get started with the Bitrise Build Cache](https://app.bitrise.io/build-cache). If you don't have a Bitrise account, you will be prompted to create one first before proceeding to set up the Build Cache. + +::: + +Bitrise supports remote build caching for the following build systems: + +- [Build Cache for Gradle](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment). +- [Build Cache for Bazel](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment). +- [Build Cache for Xcode](/en/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.html). + +## Adding a new connection to the Build Cache + +To start using the Bitrise Build Cache, you have to add a new connection. The process consists of: + +- Selecting a CI provider: you can use either Bitrise or another CI provider. +- Selecting a build tool: currently, Bazel, Gradle, and Xcode are supported. +- If you use Bitrise as your CI provider, selecting a Bitrise project. +- If you use a different CI provider, adding [a personal access token](/en/bitrise-platform/accounts/personal-access-tokens/creating-a-personal-access-token) to allow the Bitrise Build Cache access to your CI. +- Adding the cache activation scripts to your CI process. On Bitrise, we have dedicated [Steps](/en/bitrise-ci/workflows-and-pipelines/steps/steps-overview.html) for this. + +To add a new connection: + +1. Log in to Bitrise and select the **Build Cache** from the left navigation menu. +1. On the top right corner, click **New connection**. + + ![cache-new-connection.png](/img/_paligo/uuid-bdbb02c7-b8e7-bf04-fb52-7cacd2231760.png) +1. Follow the instructions. + + :::tip[Detailed instructions] + + For more information on configuring the Build Cache, refer to our dedicated guides: + + - [Build Cache for Gradle](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment). + - [Build Cache for Bazel](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment). + - [Build Cache for Xcode](/en/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.html). + + ::: diff --git a/docs/bitrise-build-cache/getting-started-with-the-build-cache/index.md b/docs/bitrise-build-cache/getting-started-with-the-build-cache/index.md new file mode 100644 index 0000000..4afafc0 --- /dev/null +++ b/docs/bitrise-build-cache/getting-started-with-the-build-cache/index.md @@ -0,0 +1,11 @@ +--- +title: "Getting started with the Build Cache" +description: "The Bitrise Build Cache is a fully managed caching solution that reduces CI build durations for applications built with Gradle and Bazel build systems. It specifically caches build and test outputs to minimize how much work is done in subsequent builds." +sidebar_position: 1 +slug: /bitrise-build-cache/getting-started-with-the-build-cache +sidebar_label: Bitrise Build Cache +--- + +Bitrise Build Cache + +The Bitrise Build Cache is a fully managed caching solution that reduces CI build durations for applications built with Gradle and Bazel build systems. It specifically caches build and test outputs to minimize how much work is done in subsequent builds. diff --git a/docs/bitrise-build-cache/getting-started-with-the-build-cache/invocations.md b/docs/bitrise-build-cache/getting-started-with-the-build-cache/invocations.md new file mode 100644 index 0000000..daccd8b --- /dev/null +++ b/docs/bitrise-build-cache/getting-started-with-the-build-cache/invocations.md @@ -0,0 +1,83 @@ +--- +title: "Invocations" +description: "Invocation is a key concept in remote caching, one that we use often in the guides. An invocation is a single Gradle or Bazel command execution. This means running a specific command to achieve a particular goal." +sidebar_position: 2 +slug: /bitrise-build-cache/getting-started-with-the-build-cache/invocations +--- + +Invocation is a key concept in remote caching. An invocation is a single command execution. This means running a specific command to achieve a particular goal. + +Invocations are only counted when the Bitrise Build Cache and/or analytics are enabled. Only cached invocations (invocations downloading data from the cache) are counted for billing purposes. Invocations not downloading data are not billed (free). + +## Checking invocations + +You can check the details of every single invocation in your cache history. + +1. Open the Build Cache. +1. Select the tab of your build tool, either Gradle, Xcode, or Bazel. +1. Select your filter. You can filter for: + + - Dates + - Bitrise projects + - CI providers + - Invocation status + - Bitrise Workflow +1. In the invocation list, click the downward arrow to the left of any given invocation to see the basic information about it: + + ![2025-09-16-xcode-tab-invocations.png](/img/_paligo/uuid-e1c9e6b8-a0cf-6513-8b88-7ad65a2df1fe.png) + + - Invocation ID. + - The CI provider used. + - The build URL. + + If you use the Bitrise CI, you will see the Workflow and the Step in which the command was executed. +1. Click the arrow on the right to get to the details page of the invocation. + +## Invocation details + +The invocation details page shows: + +- The command name and the event data of its invocation (such as CI provider, build tool, duration, cache hit rate). +- The critical path: the longest chain of dependent build tasks within an invocation. Executed cacheable tasks can be fixed to improve build cache performance. +- Uploads and downloads during the invocation. Large items or a high number of items increase invocation size. This can impact cache efficiency. + +The details page allows you to compare the metrics of this invocation to the averages from the last 30 days for the same command: + +![mygreat-project.png](/img/_paligo/uuid-3452d29c-7dd3-8a00-dbc3-c69620063c48.png) + +If you use the Bitrise CI, the command card can take you to the project's build list: + +![mygreat-project-name.png](/img/_paligo/uuid-79a85107-1f7e-60a6-6934-cbec5be94c28.png) + +For even more invocation metrics, check out [Insights](/en/insights/available-metrics-in-insights/command-metrics.html). + +## Comparing invocation differences + +You can compare two command invocations side-by-side to quickly identify what changed between them. This helps debugging and failure root cause analysis. + +For example, in Bitrise Insights you see an increase in command failure. You check which command started to fail. On the build cache page, you can check out the differences between two invocations of the command. + +To check the differences: + +1. Open the Build Cache. +1. Select the tab of your build tool, either Gradle, Xcode, or Bazel. +1. Set any filters you might need. +1. Click **Compare**. + + ![inv-compare.png](/img/_paligo/uuid-4e5bd057-700c-f047-f6ae-498ebd98f1a2.png) +1. Check the box to the right of the invocations you want to compare. +1. Click **Compare** to see the difference. + + ![invocation-diffing.png](/img/_paligo/uuid-d5bbba7f-b660-6c42-3745-ce80f0c72abf.png) + + In this example, you can immediately see that the duration of the more recent invocation has doubled compared to the previous one. You can dive in to the detailed comparison to see why. + + ![demo-wait-seconds-reason.png](/img/_paligo/uuid-ca915855-de3e-21af-a1d7-539b1020af65.png) + + The `demo.wait.seconds` Gradle property changed from 28 to 56. + +:::tip[Invocation details] + +You can also access the compare function [from the **Invocation details** page](#section-idm234872184294415): you can find the button in the top right corner of the page. + +::: diff --git a/docs/bitrise-build-cache/index.mdx b/docs/bitrise-build-cache/index.mdx new file mode 100644 index 0000000..7f5548e --- /dev/null +++ b/docs/bitrise-build-cache/index.mdx @@ -0,0 +1,67 @@ +--- +title: "Bitrise Build Cache" +hide_table_of_contents: true +hide_title: true +unlisted: true +sidebar_class_name: sidebar-hidden-item +--- + +import ProductHomepage from '@site/src/components/ProductHomepage'; + +
+ +
diff --git a/docs/bitrise-build-cache/insights.mdx b/docs/bitrise-build-cache/insights.mdx new file mode 100644 index 0000000..72bc43b --- /dev/null +++ b/docs/bitrise-build-cache/insights.mdx @@ -0,0 +1,25 @@ +--- +title: "Insights" +sidebar_position: 5 +slug: /bitrise-build-cache/insights +sidebar_label: Insights for the Build Cache +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_BuildCacheMetrics from '@site/src/partials/build-cache-metrics.mdx'; + +[Bitrise Insights](urn:resource:publication:94879) offers detailed metrics on the performance of your Build Cache, including invocation count, command duration, or cache hit rate. You can explore Insights starting from any invocation: + +1. Open the Build Cache. +1. Open the [Invocation details](/en/bitrise-build-cache/getting-started-with-the-build-cache/invocations.html) page. +1. Click **Explore Insights**. + + Alternatively, clicking any of the metrics on the card takes you to Insights. + + ![cache-insights-explore.png](/img/_paligo/uuid-299959e9-b519-88a2-05a2-ee89fa6963cd.png) + +Caching metrics are available as build cache metrics and command metrics. + + diff --git a/docs/bitrise-build-hub/_category_.json b/docs/bitrise-build-hub/_category_.json new file mode 100644 index 0000000..a435e40 --- /dev/null +++ b/docs/bitrise-build-hub/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Bitrise Build Hub", + "position": 1, + "link": { + "type": "doc", + "id": "bitrise-build-hub/index" + } +} diff --git a/docs/bitrise-build-hub/build-hub-for-github-actions/_category_.json b/docs/bitrise-build-hub/build-hub-for-github-actions/_category_.json new file mode 100644 index 0000000..a9f50c9 --- /dev/null +++ b/docs/bitrise-build-hub/build-hub-for-github-actions/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Build Hub for GitHub Actions", + "position": 1, + "link": null +} diff --git a/docs/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview.mdx b/docs/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview.mdx new file mode 100644 index 0000000..09cf0a6 --- /dev/null +++ b/docs/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview.mdx @@ -0,0 +1,49 @@ +--- +title: "Build Hub for GitHub Actions overview" +description: "Bitrise Build Hub is a high-performance build infrastructure for GitHub Actions, purpose-built for mobile app development. It provides fully managed, zero-maintenance runners that execute your GitHub Actions workflows on the industry's fastest Apple silicon and Linux machines." +sidebar_position: 1 +slug: /bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_WarmupScriptForGitHubActions from '@site/src/partials/warmup-script-for-github-actions.mdx'; +import Partial_RollingUpdatePercentage from '@site/src/partials/rolling-update-percentage.mdx'; +import Partial_TargetScope from '@site/src/partials/target-scope.mdx'; +import Partial_ProvisioningMachinesForGitHubActions from '@site/src/partials/provisioning-machines-for-github-actions.mdx'; +import Partial_Authentication from '@site/src/partials/authentication.mdx'; + +Bitrise Build Hub is a high-performance build infrastructure for GitHub Actions, purpose-built for mobile app development. It provides fully managed, zero-maintenance runners that execute your GitHub Actions workflows on the industry's fastest Apple silicon and Linux machines. + +Find out how to set up Build Hub for GitHub Actions: [Configuring Build Hub for GitHub Actions](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions). + +## Key capabilities + +- `M4 Pro` Apple silicon and `AMD EPYC Zen4/Zen5` Linux machines optimized for iOS and Android builds. +- Latest Xcode versions within 24 hours of Apple release, including betas. +- Mobile-optimized stacks with preinstalled tooling (`Xcode`, `Android SDK`, `Flutter`, `React Native`, and more). +- Co-located caching for near-zero latency and no network egress costs. +- US and EU data centers for data residency requirements. +- Pre-warmed VM pools for instant build start with no queue times. + +Build Hub works with both GitHub Cloud and GitHub Enterprise Server repositories. Your existing GitHub Actions workflow files stay unchanged—you only update the runs-on label to route builds to Bitrise infrastructure. + +## Requirements + +To run your GitHub Actions workflows on Bitrise Build Hub infrastructure, you need: + +- A Bitrise workspace. +- A GitHub account. +- A way to authenticate the Build Hub machines to GitHub Actions. You can either use a personal access token or the Bitrise - Build Hub app. We recommend using the app. +- A machine pool on Bitrise: you can select the machine type, the amount of machines, and the system image that contains the software configuration required to launch your instance. + + + + + + + + + + diff --git a/docs/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions.mdx b/docs/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions.mdx new file mode 100644 index 0000000..04d25b6 --- /dev/null +++ b/docs/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions.mdx @@ -0,0 +1,29 @@ +--- +title: "Configuring Build Hub for GitHub Actions" +description: "Create a Bitrise machine pool, and then configure your GitHub Actions workflow to successfully run it on Bitrise Build Hub infrastructure. You need either a GitHub personal access token or a GitHub app to authenticate." +sidebar_position: 2 +slug: /bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CreatingAMachinePool from '@site/src/partials/creating-a-machine-pool.mdx'; +import Partial_CreatingGitHubPersonalAccessTokensForBuildHub from '@site/src/partials/creating-github-personal-access-tokens-for-build-hub.mdx'; +import Partial_ConfiguringYourGitHubActionsWorkflow from '@site/src/partials/configuring-your-github-actions-workflow.mdx'; + +To successfully use Build Hub for GitHub Actions, you need to: + +1. Create a machine pool on Bitrise. + + The machine pool requires authentication information. You can either: + + - Install the Bitrise - Build Hub GitHub app while creating the machine pool. We recommend this authentication method. + - [Create a GitHub personal access token](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-github-personal-access-tokens-for-build-hub). +1. Configure your GitHub Actions workflow to use Bitrise infrastructure for your builds. + + + + + + diff --git a/docs/bitrise-build-hub/build-hub-for-github-actions/index.md b/docs/bitrise-build-hub/build-hub-for-github-actions/index.md new file mode 100644 index 0000000..ec9072c --- /dev/null +++ b/docs/bitrise-build-hub/build-hub-for-github-actions/index.md @@ -0,0 +1,7 @@ +--- +title: "Build Hub for GitHub Actions" +sidebar_position: 1 +slug: /bitrise-build-hub/build-hub-for-github-actions +--- + +Build Hub for GitHub Actions diff --git a/docs/bitrise-build-hub/index.mdx b/docs/bitrise-build-hub/index.mdx new file mode 100644 index 0000000..242cc9e --- /dev/null +++ b/docs/bitrise-build-hub/index.mdx @@ -0,0 +1,19 @@ +--- +title: "Bitrise Build Hub" +hide_table_of_contents: true +hide_title: true +unlisted: true +sidebar_class_name: sidebar-hidden-item +--- + +import ProductHomepage from '@site/src/components/ProductHomepage'; + +
+ +
diff --git a/docs/bitrise-build-hub/infrastructure/_category_.json b/docs/bitrise-build-hub/infrastructure/_category_.json new file mode 100644 index 0000000..2716b5a --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Infrastructure", + "position": 2, + "link": null +} diff --git a/docs/bitrise-build-hub/infrastructure/build-machine-types.md b/docs/bitrise-build-hub/infrastructure/build-machine-types.md new file mode 100644 index 0000000..ee9eab0 --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-machine-types.md @@ -0,0 +1,38 @@ +--- +title: "Build machine types" +description: "Bitrise offers multiple build machines with different specifications. You can choose between them based on your needs." +sidebar_position: 1 +slug: /bitrise-build-hub/infrastructure/build-machine-types +--- + +Bitrise offers multiple build machines with different specifications You can choose between them based on your needs. + +You can track how much time you spent building your apps on each machine type with Insights: [Bitrise CI metrics](/en/insights/available-metrics-in-insights/bitrise-ci-metrics). + +:::tip[Machine availability by subscription plan] + +Not all machines are available on all subscription plans. Visit [the pricing page](http://www.bitrise.io/pricing) to find out which machines are available on your plan! + +::: + +Machine types are divided into resource classes. The same resource class offers multiple machine types with broadly similar performances. Bitrise automatically assigns machine types from a resource class, which means that on the same day, your builds might run on different machine types. + +| Operating system | Resource class | Hardware types | Specs | Machine type ID for [YAML configuration](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds/setting-the-stack-in-the-bitriseyml-file) | +| --- | --- | --- | --- | --- | +| macOS | | | | | +| Medium | - M2 Pro Medium - M4 Medium | - 4 CPU @3.49GHz and 6 GB RAM - 5 CPU @4.4 GHz and 6 GB RAM | `g2.mac.medium` | | +| Large | - M2 Pro Large - M4 Large | - 6 CPU @3.49GHz and 14 GB RAM - 5 CPU @4.4 GHz and 14 GB RAM | `g2.mac.large` | | +| X Large | - M2 Pro X Large - M4 X Large | - 12 CPU @3.49GHz and 28 GB RAM - 10 CPU @4.4 GHz and 28 GB RAM | `g2.mac.x-large` | | +| 4Large | M4 Pro Large | 7 CPU @4.52GHz and 27 GB RAM | `g2.mac.4large` | | +| 4X Large | M4 Pro X Large | 14 CPU @4.52GHz and 54 GB RAM | `g2.mac.4x-large` | | +| Linux | Medium | 4 vCPU @ 3.1 GHz | 4 vCPU @3.1 GHz and 16 GB RAM | `standard` | +| Large | 8 vCPU @ 3.1 GHz | 8 vCPU @3.1 GHz and 32 GB RAM | `elite` | | +| X Large | 16 vCPU @ 3.1 GHz | 16 vCPU @3.1 GHz and 64 GB RAM | `elite-xl` | | +| M | AMD EPYC Zen 4 and Zen 5 | 4 vCPU @3.7 GHz and 16 GB RAM | `g2.linux.medium` | | +| 2M | AMD EPYC Zen 4 and Zen 5 | 6 vCPU @3.7 GHz and 24 GB RAM | `g2.linux.2medium` | | +| L | AMD EPYC Zen 4 and Zen 5 | 8 vCPU @3.7 GHz and 32 GB RAM | `g2.linux.large` | | +| 4L | AMD EPYC Zen 4 and Zen 5 | 14 vCPU @3.7 GHz and 56 GB RAM | `g2.linux.4large` | | +| XL | AMD EPYC Zen 4 and Zen 5 | 16 vCPU @3.7 GHz and 64 GB RAM | `g2.linux.x-large` | | +| 3XL | AMD EPYC Zen 4 and Zen 5 | 24 vCPU @3.7 GHz and 96 GB RAM | `g2.linux.3x-large` | | +| 5XL | AMD EPYC Zen 4 and Zen 5 | 32 vCPU @3.7 GHz and 128 GB RAM | `g2.linux.5x-large` | | +| 7XL | AMD EPYC Zen 4 and Zen 5 | 48 vCPU @3.7 GHz and 192 GB RAM | `g2.linux.7x-large` | | diff --git a/docs/bitrise-build-hub/infrastructure/build-stacks/_category_.json b/docs/bitrise-build-hub/infrastructure/build-stacks/_category_.json new file mode 100644 index 0000000..7b39e26 --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-stacks/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Build stacks", + "position": 2, + "description": "The Bitrise build stack defines the virtual machine version used to run your builds. The main types are macOS stacks and Android & Docker stacks.", + "link": null +} diff --git a/docs/bitrise-build-hub/infrastructure/build-stacks/about-build-stacks.mdx b/docs/bitrise-build-hub/infrastructure/build-stacks/about-build-stacks.mdx new file mode 100644 index 0000000..4e0b0c6 --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-stacks/about-build-stacks.mdx @@ -0,0 +1,44 @@ +--- +title: "About build stacks" +description: "The Bitrise build stack defines the virtual machine version used to run your builds. The main types are macOS stacks and Android & Docker stacks." +sidebar_position: 1 +slug: /bitrise-build-hub/infrastructure/build-stacks/about-build-stacks +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +The build stack indicates the virtual machine version that we will use to run your build. The main stack types are: + +- **macOS stacks**: These stacks run on a macOS operating system and each one includes multiple Xcode versions. Ideal for building iOS apps. They also have Android tools installed if you want to use them to build a cross-platform app. +- The **Android & Docker** stack: These stacks run on Linux operating system in a Docker environment. They have all Android tools installed and they are ideal for building native Android apps. + +:::note[Free disk space] + +Each stack has at least 100 GB of free disk space. You can check each stack's exact available disk space on the relevant stack report page: [Bitrise stack reports](https://stacks.bitrise.io/stack_reports/). + +::: + +Each build runs in its own virtual machine and the virtual machine is rolled back to a saved state, the “base box” state, after the build is finished. This way **your builds are always protected** by changes made by others and by your previous builds and you can use a **stable environment** to define your build workflow, since no state persists between builds. + +:::note[Passwordless sudo enabled] + +The user account that is used for the builds is configured to have **passwordless sudo** enabled. This way you are able to install all the extra things you need for your builds and for other automation. If a tool is not preinstalled on your stack of choice, you can install it yourself - see the guide. + +::: + +After adding your app to Bitrise we will select an appropriate stack for it. You can change the stack at any time on the **Stacks & Machines** tab of the Workflow Editor. + +![xcode_image.png](/img/_paligo/uuid-fc53715a-add5-8c4c-d4a6-9a04f5da6d3b.png) + +After selecting the stack you want to use, you’ll see a short description of the stack with an additional link to learn more about that specific one (for example, to see what tools are preinstalled, and which versions, on the selected stack). + +| Type | Description | +| --- | --- | +| Stable | Generally available and expected to be supported for the foreseeable future. Updated when an update for the stack’s primary tool is available. Example: when Xcode 7.3.1 was released, the Xcode 7.3 stack was updated to have 7.3.1 instead of 7.3(.0). | + +| Type | Description | +| --- | --- | +| Pre-booted | If a stack is available as pre-booted, and there’s enough pre-booted machines with that stack configuration, your build can start right away, without waiting for the build environment to boot. In case there’s no more available pre-booted machine with that stack configuration, your build will start on an on-demand configuration. | +| On-demand | If a stack is available as on-demand configuration and there’s no (available) pre-booted configuration for the stack, our system will have to create a virtual machine for your selected configuration when your build starts. This means that your build will be in preparing environment state while the related virtual machine is created & booted. For a macOS configuration the boot process usually takes about 1 - 1.5 minutes. The prepare time (of course) is not counted into the build time, it won’t affect how long your build can run. | diff --git a/docs/bitrise-build-hub/infrastructure/build-stacks/changelog.md b/docs/bitrise-build-hub/infrastructure/build-stacks/changelog.md new file mode 100644 index 0000000..c5dcbe0 --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-stacks/changelog.md @@ -0,0 +1,37 @@ +--- +title: "Changelog" +sidebar_position: 6 +slug: /bitrise-build-hub/infrastructure/build-stacks/changelog +--- + +## June 2025 + +**Changed** + +Mentions of Linux stack update policy has been moved on its own page, [Linux stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.html), with more information on Edge, Stable and Frozen stacks. It also describes the yearly cadence of new Linux stacks, as well as the deprecation and removal of older Linux stacks. + +Removed how to use previous versions of a stack from this page and added it to [Stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.html). + +## July 2024 + +**Removed**: + +Mentions of dependency manager cache updates. Both Cocoapods and Homebrew have better mechanisms now than cloning the entire registry git repo, and these newer mechanisms (Cocoapods CDN, Homebrew API) are enabled on stacks now. When stacks are updated, you can expect the on-disk repos to be up-to-date, but Stable stacks are no longer strictly updated weekly if there are no other changes to release. + +**Changed**: + +The breaking changes to stable macOS stacks (once a year when a new Xcode major version is released) no longer apply to older, existing stable stacks, only the newly released stable stack. For example, when Xcode 16.0 is released, the planned breaking changes only apply to the Xcode 16.0 stable stack. Xcode 14.x and 15.x stable stacks won’t receive breaking changes. + +## March 2024 + +**New**: + +Define what happens when an Edge stack is phased out in favor of a newer edge stack. + +**Removed**: + +When a new Xcode Edge stack is released, it no longer brings tooling changes to the Stable stacks. + +**Changed**: + +New, simpler simulator runtime policy. The same number of older iOS major versions are installed, but only the latest minor version is installed for each. diff --git a/docs/bitrise-build-hub/infrastructure/build-stacks/index.md b/docs/bitrise-build-hub/infrastructure/build-stacks/index.md new file mode 100644 index 0000000..a14cf1d --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-stacks/index.md @@ -0,0 +1,6 @@ +--- +title: "Build stacks" +sidebar_position: 2 +--- + +Build stacks diff --git a/docs/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.md b/docs/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.md new file mode 100644 index 0000000..59d6bf9 --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.md @@ -0,0 +1,95 @@ +--- +title: "Linux stack update policy" +sidebar_position: 4 +slug: /bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy +--- + +Linux stacks on Bitrise are based on Ubuntu LTS releases. Each Bitrise stack is based on one Ubuntu LTS version and never gets upgraded to another. Instead, we release new stacks and sunset older ones over time. + +:::note[Previous version of a stack] + +Updating a stack to a new version might cause problems with some builds. To help ease the transition, you can use the previous version of a stack for 2-3 days after an update: [Using the previous version of a stack](/en/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy/using-the-previous-version-of-a-stack). + +::: + +For macOS specific information, check out [macOS stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html). + +## Linux stack offerings + +Bitrise offers multiple Linux stacks to handle different use-cases. + +You can check the available stacks at any given time [here](https://bitrise.io/stacks/). + +Each stack is based on one release of a Linux distribution. At the moment, we offer stacks based on Ubuntu LTS releases. Tools are installed on this base image, creating the Bitrise edition of a system. + +The stack name and ID contains all of the above parameters and looks like this in practice: + +- Name: Ubuntu Noble 24.04 - Bitrise 2025 Edition +- ID: `ubuntu-noble-24.04-bitrise-2025-android` + +There are subtle differences between the different Linux stacks and their update frequency. You need to be aware of these details in order to pick the right stack and to avoid sudden broken builds. + +## Linux stack updates + +A new Bitrise edition and a new stack is created each year. This is always based on the latest Ubuntu LTS release. + +Besides the new Ubuntu release, this new yearly Bitrise edition contains breaking changes that would have been too disruptive to ship in existing stacks. For example: + +- Upgrading a preinstalled tool to a new version with breaking changes. +- When multiple versions of a tool are installed (for example, Ruby, Node.js,), removing an old version that reached its end-of-life and no longer receives security fixes. +- Configuration changes that could be breaking to some or all user workflows. + +| Year of stack release | Stack name | Ubuntu base | +| --- | --- | --- | +| 2024 | Ubuntu Jammy 22.04 - Bitrise 2024 Edition | Ubuntu 22.04 LTS | +| 2025 | Ubuntu Noble 24.04 - Bitrise 2025 Edition | Ubuntu 24.04 LTS | +| **Future releases** (release codenames are unknown at this point) | | | +| 2026 | Ubuntu 26.04 - Bitrise 2026 Edition | Ubuntu 26.04 | +| 2027 | Ubuntu 26.04 - Bitrise 2027 Edition | | +| 2028 | Ubuntu 28.04 - Bitrise 2028 Edition | Ubuntu 28.04 | +| 2029 | Ubuntu 28.04 - Bitrise 2029 Edition | | + +## Stack lifecycle + +Similar to macOS Bitrise stacks, the Linux ones have the following lifecycle: Edge, Stable, Frozen, Removed. + +A new stack is introduced as an edge stack first, then, after a year of testing and feedback, it becomes a stable stack. One year later it’s marked as frozen, then completely removed after one more year. + +Different stages of a single stack: + +![stack-state-change.svg](/img/_paligo/uuid-5169df38-e851-52da-fb4f-d37c3f98e8d8.svg) + +Every year, around April and the release of the new Ubuntu version: + +- A new stack is introduced as an edge stack. +- Last year’s edge stack becomes stable. +- Last year’s stable stack becomes frozen. +- Last year’s frozen stack gets removed. + +Changing states presented with previous and future stacks: + +![multiple-stack-state-change.svg](/img/_paligo/uuid-bcc68f5e-feec-8292-2e57-1bfb0dd9d9b9.svg) + +Before a stack is removed, it’s flagged for removal, and you see the final removal date throughout the UI. Additionally, the remaining users of the stack receive an email notification from Bitrise. + +## Which stack to choose? + +At any given time, you can choose from at least one edge, stable and frozen stack. The following table helps make this choice: + +| | Edge | Stable | Frozen | +| --- | --- | --- | --- | +| Stable stack ID which can be included in bitrise.yml | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Security updates to OS components, system libraries and preinstalled tools | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Updates to OS components and system libraries | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Addition of new tools and tool versions | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Breaking changes in stack updates to existing tools and tool versions | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| New experimental features and configuration changes | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Removal of tools and tool versions | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | + +## Changelog + +June 2025 + +**New** + +Introduced the concept of Edge, Stable and Frozen stacks with regards to Linux, similar to the [macOS stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html). Defined the yearly cadence of new Linux stacks, as well as the deprecation and removal of older Linux stacks. diff --git a/docs/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.mdx b/docs/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.mdx new file mode 100644 index 0000000..ca65eb9 --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.mdx @@ -0,0 +1,15 @@ +--- +title: "macOS stack update policy" +sidebar_position: 3 +slug: /bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_Changelog from '@site/src/partials/changelog.mdx'; +import Partial_XcodeStackUpdates from '@site/src/partials/xcode-stack-updates.mdx'; + + + + diff --git a/docs/bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy.mdx b/docs/bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy.mdx new file mode 100644 index 0000000..6dc82dd --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy.mdx @@ -0,0 +1,22 @@ +--- +title: "Stack deprecation and removal policy" +description: "On Bitrise, Android stacks are supported for around two years; Xcode stacks are deprecated gradually as new Xcode versions are released." +sidebar_position: 5 +slug: /bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_MaintainingMacOSStacks from '@site/src/partials/maintaining-macos-stacks.mdx'; +import Partial_DeprecatingAndroidDockerStacks from '@site/src/partials/deprecating-android-docker-stacks.mdx'; + +We don't keep all stacks around forever: our aim is to provide you with the latest tools to help you build the best app you can. However, we don't expect you to rework your build configuration every time a stack update comes out: you can keep using your reliable older stacks for a long time. + +Some older stacks are frozen when a new major version of Xcode is released. When a stack is frozen, you can still keep using it, but the stack will no longer get any updates, and at that point, we strongly recommend switching to a newer, active stack. + +After stacks have been frozen for a year, they are removed when the next major version of Xcode is released. + + + + diff --git a/docs/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.mdx b/docs/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.mdx new file mode 100644 index 0000000..1d918a7 --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.mdx @@ -0,0 +1,35 @@ +--- +title: "Stack update policy" +description: "Bitrise stacks are updated every week: some stacks are completely rebuilt while on others only certain cache archives are updated." +sidebar_position: 2 +slug: /bitrise-build-hub/infrastructure/build-stacks/stack-update-policy +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UsingThePreviousVersionOfAStack from '@site/src/partials/using-the-previous-version-of-a-stack.mdx'; + +Bitrise stacks include the most important tools for mobile development pre-installed and ready for use. Our goal is to make Workflows simple and make your builds fast and efficient. These tools change continuously: old versions become deprecated and unsupported while new versions are released with new features and breaking changes. + +Stacks on [bitrise.io](https://www.bitrise.io) are updated regularly. The updates contain one or more of the following kinds of changes: + +- Tool upgrade: An already installed tool is upgraded to the latest version (for example, the git CLI is upgraded from 2.9.1 to 2.9.5). +- Tool addition: A new tool is added (for example, the latest Android emulator system image becomes preinstalled when a new Android version is released). +- Tool removal: A tool version is removed if it reaches end-of-life and poses a security risk, making another version of the tool the default (for example, Ruby 2.7 is removed, making Ruby 3.0 the new default). +- Platform changes: Changes to major components, like Xcode on macOS stacks, OS versions, Android SDK. + +If you wish to read more on our Linux and MacOS stack update policies, check out: + +- [macOS stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy) +- [Linux stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy) + +:::note[Using the previous version of a stack] + +Updating a stack to a new version might cause problems with some builds. To help ease the transition, you can use the previous version of a stack for 2-3 days after an update: [Using the previous version of a stack](/en/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy/using-the-previous-version-of-a-stack). + +::: + +For more information on what tools are available on the different stacks, check out our relevant guide: [Preinstalled tools on Bitrise stacks](/en/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks) + + diff --git a/docs/bitrise-build-hub/infrastructure/index.md b/docs/bitrise-build-hub/infrastructure/index.md new file mode 100644 index 0000000..4853b9a --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/index.md @@ -0,0 +1,7 @@ +--- +title: "Infrastructure" +sidebar_position: 2 +slug: /bitrise-build-hub/infrastructure +--- + +Infrastructure diff --git a/docs/bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines.md b/docs/bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines.md new file mode 100644 index 0000000..67b71d5 --- /dev/null +++ b/docs/bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines.md @@ -0,0 +1,62 @@ +--- +title: "IP addresses for the build machines" +sidebar_position: 3 +slug: /bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines +sidebar_label: IP address ranges for the Bitrise build machines +--- + +For most users, who host their repositories on cloud-based service providers, there is no need for any network configuration to be able to use Bitrise. All we need is permission to access the repository and for that, [an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) or [an access token](/en/bitrise-platform/repository-access/configuring-https-authorization-credentials) is enough. + +However, your company security policy might not allow unknown and unauthorized IP addresses to communicate with the servers where your code is being stored - either on your own datacenter or in a private cloud. In that case, Bitrise won’t work unless the relevant IP addresses are added to your allow list. + +You will see IP addresses from the following ranges as source when your Bitrise build machines reach out to your services like Git to download your source code, or call into your test backend services, or any other services you run outside Bitrise that are required to be reached as part of your CI workflow. + +:::warning[Allowlist the entire subnet] + +If the provided public IP address is a subnet, you need to allow the entire subnet on your network! For example, 208.52.166.128/28 means all IP addresses between 208.52.166.128 and 208.52.166.143 (208.52.166.128, 208.52.166.129, 208.52.166.130, and so on, all the way to and including 208.52.166.143) have to be allowlisted. + +::: + +:::warning[Multi-tenant vs Single-tenant] + +The build machine IP ranges listed below are for the Bitrise multi-tenant environment. Depending on your organization's security requirements, it may not be advisable to allow access to your network from the Bitrise multi-tenant IP range. For organizations with enhanced security requirements, you can: + +- [Connect by VPN](/en/bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.html). +- [Select a single-tenant environment](/en/bitrise-platform/infrastructure/customizable-enterprise-build-platforms.html). +- [Deploy runners to your own AWS account](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html). + +Feel free to [contact us](https://bitrise.io/contact) if you have questions. + +::: + +| Stack type | Public IP | +| --- | --- | +| Xcode stacks If you run your builds using Xcode stacks, they will run on machines with the IP address ranges in the **Public IP** column. For example, if you run `curl` from a build, the source IP will be from these IP ranges. | 74.122.**200**.224/27 (74.122.**200.224** - 74.122.**200.255**) 74.122.**201**.224/27 (74.122.**201.224** - 74.122.**201.255**) 74.122.**202**.224/27 (74.122.**202.224** - 74.122.**202.255**) 74.122.**203**.224/27 (74.122.**203.224** - 74.122.**203.255**) | +| 185.55.**252**.224/27 (185.55.**252.224** - 185.55.**252.255**) 185.55.**253**.224/27 (185.55.**253.224** - 185.55.**253.255**) 185.55.**254**.224/27 (185.55.**254.224** - 185.55.**254.255**) 185.55.**255**.224/27 (185.55.**255.224** - 185.55.**255.255**) | | +| 208.52.166.154/**32** 208.52.166.128/**28** | | +| 207.254.0.248/**29** 207.254.0.208/**28** | | +| 207.254.34.148/**32** 207.254.33.176/**28** | | +| Linux/Docker stacks If you run your builds using Linux/Docker stacks, they will run on machines with the IP address ranges in the **Public IP** column. For example, if you run `curl` from a build, the source IP will be from these IP ranges. | 74.122.**200**.224/27 (74.122.**200.224** - 74.122.**200.255**) 74.122.**201**.224/27 (74.122.**201.224** - 74.122.**201.255**) 74.122.**202**.224/27 (74.122.**202.224** - 74.122.**202.255**) 74.122.**203**.224/27 (74.122.**203.224** - 74.122.**203.255**) | +| 185.55.**252**.224/27 (185.55.**252.224** - 185.55.**252.255**) 185.55.**253**.224/27 (185.55.**253.224** - 185.55.**253.255**) 185.55.**254**.224/27 (185.55.**254.224** - 185.55.**254.255**) 185.55.**255**.224/27 (185.55.**255.224** - 185.55.**255.255**) | | +| 104.197.15.74/32 | | +| 34.123.172.192/32 | | +| 34.125.50.224/32 | | +| 34.125.82.130/32 | | +| 34.134.193.138/32 | | +| 34.138.187.10/32 | | +| 34.150.152.190/32 | | +| 34.162.185.129/32 | | +| 34.162.202.37/32 | | +| 34.162.229.32/32 | | +| 34.162.29.153/32 | | +| 34.162.88.79/32 | | +| 34.23.207.105/32 | | +| 34.85.139.176/32 | | +| 34.85.240.93/32 | | +| 34.86.56.118/32 | | +| 35.202.121.43/32 | | +| 35.225.44.167/32 | | +| 35.231.56.118/32 | | +| 35.237.165.17/32 | | +| 35.243.148.182/32 | | +| 35.245.56.67/32 | | diff --git a/docs/bitrise-ci/_category_.json b/docs/bitrise-ci/_category_.json new file mode 100644 index 0000000..d0dc223 --- /dev/null +++ b/docs/bitrise-ci/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Bitrise CI", + "position": 1, + "link": { + "type": "doc", + "id": "bitrise-ci/index" + } +} diff --git a/docs/bitrise-ci/api/_category_.json b/docs/bitrise-ci/api/_category_.json new file mode 100644 index 0000000..f590818 --- /dev/null +++ b/docs/bitrise-ci/api/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "API", + "position": 10, + "link": null +} diff --git a/docs/bitrise-ci/api/adding-and-managing-apps.mdx b/docs/bitrise-ci/api/adding-and-managing-apps.mdx new file mode 100644 index 0000000..b118e3c --- /dev/null +++ b/docs/bitrise-ci/api/adding-and-managing-apps.mdx @@ -0,0 +1,39 @@ +--- +title: "Adding and managing apps" +description: "You can add new apps on Bitrise with the API: add the app, generate SSH keys, and set up the app’s initial configuration." +sidebar_position: 4 +slug: /bitrise-ci/api/adding-and-managing-apps +sidebar_label: Adding and managing projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ManagingAppAccessForWorkspaceGroups from '@site/src/partials/managing-app-access-for-workspace-groups.mdx'; +import Partial_ManagingAnExistingApp from '@site/src/partials/managing-an-existing-app.mdx'; +import Partial_ChangingMachineTypesInAllAppsAtTheSameTime from '@site/src/partials/changing-machine-types-in-all-apps-at-the-same-time.mdx'; +import Partial_AddingANewAppWithTheAPI from '@site/src/partials/adding-a-new-app-with-the-api.mdx'; +import Partial_DeletingAnAppUsingTheAPI from '@site/src/partials/deleting-an-app-using-the-api.mdx'; +import Partial_ChangingTheLocationOfTheAppSBitriseYmlFile from '@site/src/partials/changing-the-location-of-the-apps-bitriseyml-file.mdx'; +import Partial_ManagingAppNotifications from '@site/src/partials/managing-app-notifications.mdx'; +import Partial_UploadingANewBitriseYmlFile from '@site/src/partials/uploading-a-new-bitriseyml-file.mdx'; + +You can add new projects on Bitrise with the API: add the project, generate SSH keys, and set up the project’s initial configuration. + +In addition, you can list all projects belonging, for example, to a single user or to a specific Workspace. + + + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/api/api-overview.md b/docs/bitrise-ci/api/api-overview.md new file mode 100644 index 0000000..43ee1cd --- /dev/null +++ b/docs/bitrise-ci/api/api-overview.md @@ -0,0 +1,28 @@ +--- +title: "API overview" +description: "The Bitrise API allows you to build deep, custom integrations with your preferred tools and processes to create even more efficient development pipelines." +sidebar_position: 1 +slug: /bitrise-ci/api/api-overview +--- + +The Bitrise API allows you to build deep, custom integrations with your preferred tools and processes to create even more efficient development pipelines. + +The API provides you with control of - and access to - the features and data available through the Bitrise website and CLI. By using the API, you gain the ability to fully customize Bitrise’s functionality to fit your process. + +:::note[The API is work-in-progress] + +The API is work-in-progress: we will add new endpoints and possibly update the existing ones in the future. + +You can track the progress of the API: [join the discussion](https://discuss.bitrise.io/t/bitrise-api-v0-1-work-in-progress/1554)! Follow it and get notified about new endpoints and changes, we announce those there. + +::: + +Feel free to contribute! If you want to request a new API feature or a new endpoint, [you can do so!](http://discuss.bitrise.io/t/bitrise-public-api/37) + +The Bitrise API’s host is: [https://api.bitrise.io/](https://api.bitrise.io/) + +Every endpoint except the root one is versioned. The version has to be included in the URL right after the host: for example, [https://api.bitrise.io/v0.1/me](https://api.bitrise.io/v0.1/me) is the endpoint for your own user account. + +Right now we have only one version, `v0.1`. + +There’s no long term compatibility promise for `v0.1`, although we try to do our best to not to break anything unless we have to. Once we’re happy with `v0.1` we’ll “freeze” it as `v1.0`, for which we’ll provide long term support. diff --git a/docs/bitrise-ci/api/api-reference.md b/docs/bitrise-ci/api/api-reference.md new file mode 100644 index 0000000..2009391 --- /dev/null +++ b/docs/bitrise-ci/api/api-reference.md @@ -0,0 +1,8 @@ +--- +title: "API reference" +description: "A full list and descriptions of all Bitrise API endpoints." +sidebar_position: 15 +slug: /bitrise-ci/api/api-reference +--- + +[https://api-docs.bitrise.io/docs/swagger.json](https://api-docs.bitrise.io/docs/swagger.json) diff --git a/docs/bitrise-ci/api/authenticating-with-the-bitrise-api.md b/docs/bitrise-ci/api/authenticating-with-the-bitrise-api.md new file mode 100644 index 0000000..4f06635 --- /dev/null +++ b/docs/bitrise-ci/api/authenticating-with-the-bitrise-api.md @@ -0,0 +1,26 @@ +--- +title: "Authenticating with the Bitrise API" +description: "You need to create a personal access token to authenticate with the Bitrise API. The token is needed for all endpoints." +sidebar_position: 2 +slug: /bitrise-ci/api/authenticating-with-the-bitrise-api +--- + +The current API supports two types of authentication: + +- User-generated **personal access tokens**. +- Workspace API tokens. + +Every API endpoint requires authentication, except the “root” URL ([https://api.bitrise.io](https://api.bitrise.io)). + +1. Create either a [personal access token](/en/bitrise-platform/accounts/personal-access-tokens/creating-a-personal-access-token) or [a Workspace API token](/en/bitrise-platform/workspaces/workspace-api-token/creating-a-workspace-api-token). +1. Save it in a secure way. +1. Add an `Authorization` header with the access token to your API calls. + + For example, the following call retrieves a list of apps you or your Workspace has access to: + + ``` + curl -X 'GET' \ + 'https://api.bitrise.io/v0.1/apps' \ + -H 'Authorization: ' + -H 'accept: application/json' + ``` diff --git a/docs/bitrise-ci/api/github-app-configuration-api.mdx b/docs/bitrise-ci/api/github-app-configuration-api.mdx new file mode 100644 index 0000000..99ae18e --- /dev/null +++ b/docs/bitrise-ci/api/github-app-configuration-api.mdx @@ -0,0 +1,30 @@ +--- +title: "GitHub app configuration API" +description: "Configure the Bitrise Github app integration via the API: change the connection type from OAuth to the GitHub app, enable full permissions for the GitHub app, set additional linked repositories, and remove other authorization methods." +sidebar_position: 6 +slug: /bitrise-ci/api/github-app-configuration-api +sidebar_label: GitHub app configuration +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingAdditionalLinkedRepositoriesAPI from '@site/src/partials/setting-additional-linked-repositories-api.mdx'; +import Partial_RemovingTheOAuthConnectionAPI from '@site/src/partials/removing-the-oauth-connection-api.mdx'; +import Partial_ChangingTheConnectionTypeFromOAuthToTheGitHubAppAPI from '@site/src/partials/changing-the-connection-type-from-oauth-to-the-github-app-api.mdx'; +import Partial_ExtendingGitHubAppPermissionsToBuildsAPI from '@site/src/partials/extending-github-app-permissions-to-builds-api.mdx'; + +After you successfully [installed a Bitrise GitHub app](/en/bitrise-platform/repository-access/github-app-integration/installing-the-github-app-integration), you can use it as your default Git connection method. Configure the [Bitrise GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration) via the API: + +- Change the connection type from [OAuth](/en/bitrise-platform/repository-access/repository-access-with-oauth.html) to the GitHub app. +- Enable the [full permissions](/en/bitrise-platform/repository-access/github-app-integration/extending-github-app-permissions-to-the-builds) defined for the GitHub app. +- Set additional [linked repositories](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories). +- Remove the service credential user and other authorization methods as they aren't required for the GitHub app. + + + + + + + + diff --git a/docs/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs.mdx b/docs/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs.mdx new file mode 100644 index 0000000..20b6db3 --- /dev/null +++ b/docs/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs.mdx @@ -0,0 +1,114 @@ +--- +title: "Identifying Workspaces and apps with their slugs" +description: "The API (and the Bitrise support team) often asks for slugs: a Workspace slug or a project slug. A slug is a unique identifier of one of these resources, consisting of hexadecimal numbers. You can find the slugs of a given Workspace or app both on the UI and in the API." +sidebar_position: 5 +slug: /bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs +sidebar_label: Identifying Workspaces and projects with their slugs +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkspaceSettingsPage from '@site/src/partials/opening-the-workspace-settings-page.mdx'; + +The API (and the Bitrise support team) often asks for slugs: a Workspace slug or a project slug. A slug is a unique identifier of one of these resources, consisting of hexadecimal numbers. You can find the slugs of a given Workspace or project both on the UI and in the API. + +## Finding a slug on the Bitrise website + +You can find both Workspace slugs and project slugs on the Bitrise website. + + + + +1. +1. On the **Workspace settings** page, select `**General settings** from the left navigation menu. +1. Find the Workspace slug in the **Workspace information** section. You can copy the slug by clicking the copy button next to it. + + ![workspace-slug.png](/img/_paligo/uuid-c82d552a-8d31-148f-82e4-bb4ec929c183.png) + + + + +1. Open [Bitrise CI](https://app.bitrise.io/dashboard) and select your project. +1. Once on the project's page, go to your browser's address bar. + + The URL will look like this: `https://app.bitrise.io/app/5c89d92-8be6-4892-b11d-efbc1fdd607`. +1. Find the hexadecimal number after the `/app/` section of the URL. That is your project's slug. + + + + +## Finding a slug with the Bitrise API + +You can get the slug for all Workspaces and apps you have access to with simple API calls. + + + + +1. [Authenticate](/en/bitrise-ci/api/authenticating-with-the-bitrise-api.html) with the Bitrise API. +1. Call the `GET /organizations` endpoint with your Personal Access Token: + + ``` + curl -X 'GET' \ + 'https://api.bitrise.io/v0.1/organizations' \ + -H 'accept: application/json' \ + -H 'Authorization: ' + ``` +1. Find the slug in the response: + + ``` + { + "name": "TestOrg", + "slug": "2dec5c71bbce73d9", + "avatar_icon_url": "https://bitrise-public-content-production.s3.amazonaws.com/org-icons/default_avatar-09.png", + "concurrency_count": null, + "owners": [ + { + "slug": "1b3f130835b1c09ef2", + "username": "bitbot", + "email": "bit.bot@bitrise.io" + }, + ] + }, + ``` + + + + +1. [Authenticate](/en/bitrise-ci/api/authenticating-with-the-bitrise-api.html) with the Bitrise API. +1. Call the `GET /apps` endpoint with your Personal Access Token. + + ``` + curl -X 'GET' \ + 'https://api.bitrise.io/v0.1/apps' \ + -H 'accept: application/json' \ + -H 'Authorization: ' + ``` +1. Find the slug in the response: + + ``` + { + "data": [ + { + "slug": "13aa9897-3891-4fe7-8cf5-5b2f75638b0e", + "title": "TestApp", + "project_type": "ios", + "provider": "github", + "repo_owner": "bitrise", + "repo_url": "git@github.com:bitrise/TestApp.git", + "repo_slug": "TestApp", + "is_disabled": false, + "status": 1, + "is_public": false, + "is_github_checks_enabled": false, + "owner": { + "account_type": "organization", + "name": "Bitrise", + "slug": "03a9543ede4d12bd" + }, + "avatar_url": null + }, + ``` + + + diff --git a/docs/bitrise-ci/api/incoming-and-outgoing-webhooks.mdx b/docs/bitrise-ci/api/incoming-and-outgoing-webhooks.mdx new file mode 100644 index 0000000..f1825fc --- /dev/null +++ b/docs/bitrise-ci/api/incoming-and-outgoing-webhooks.mdx @@ -0,0 +1,29 @@ +--- +title: "Incoming and outgoing webhooks" +description: "Both incoming and outgoing webhooks can be set up with the Bitrise API. They are important for automatic build triggering and the reporting of build events to other services." +sidebar_position: 9 +slug: /bitrise-ci/api/incoming-and-outgoing-webhooks +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RegisteringAnIncomingWebhookWithTheAPI from '@site/src/partials/registering-an-incoming-webhook-with-the-api.mdx'; +import Partial_ModifyingAndDeletingOutgoingWebhooksWithTheAPI from '@site/src/partials/modifying-and-deleting-outgoing-webhooks-with-the-api.mdx'; +import Partial_CreatingOutgoingWebhooksWithTheAPI from '@site/src/partials/creating-outgoing-webhooks-with-the-api.mdx'; + +Both incoming and outgoing webhooks can be set up with the Bitrise API. They are important for automatic build triggering and the reporting of build events to other services. + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| POST /apps/\{app-slug\}/register-webhook | Register an incoming webhook for a specific application. | Owner or Admin | +| GET /apps/\{app-slug\}/outgoing-webhooks | List the outgoing webhooks of an app. | Owner or Admin | +| POST /apps/\{app-slug\}/outgoing-webhooks | Create an outgoing webhook for an app. | Owner or Admin | +| PUT /apps/\{app-slug\}/outgoing-webhooks/\{app-webhook-slug\} | Update an outgoing webhook of an app. | Owner or Admin | +| DELETE /apps/\{app-slug\}/outgoing-webhooks/\{app-webhook-slug\} | Delete an outgoing webhook of an app. | Owner or Admin | + + + + + + diff --git a/docs/bitrise-ci/api/index.md b/docs/bitrise-ci/api/index.md new file mode 100644 index 0000000..7b6aaa4 --- /dev/null +++ b/docs/bitrise-ci/api/index.md @@ -0,0 +1,7 @@ +--- +title: "API" +sidebar_position: 10 +slug: /bitrise-ci/api +--- + +API diff --git a/docs/bitrise-ci/api/managing-an-apps-builds.mdx b/docs/bitrise-ci/api/managing-an-apps-builds.mdx new file mode 100644 index 0000000..b98a460 --- /dev/null +++ b/docs/bitrise-ci/api/managing-an-apps-builds.mdx @@ -0,0 +1,28 @@ +--- +title: "Managing an app's builds" +description: "You can use the Bitrise API to list an app's build, get all information about a specific build, view the build logs, and view archived builds that are older than 200 days." +sidebar_position: 8 +slug: /bitrise-ci/api/managing-an-app-s-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ViewingTheBuildDataOfAnApp from '@site/src/partials/viewing-the-build-data-of-an-app.mdx'; +import Partial_ListingTheArchivedBuildsOfAnApp from '@site/src/partials/listing-the-archived-builds-of-an-app.mdx'; + +You can use the Bitrise API to list an app's build, get all information about a specific build, view the build logs, and view archived builds that are older than 200 days. + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| GET /apps/\{app-slug\}/archived-builds | List archived builds of a specified app. | Tester/QA | +| GET /apps/\{app-slug\}/build-workflows | List the workflows that were triggered at any time for a specified app. | Tester/QA | +| GET /apps/\{app-slug\}/builds | List all the builds of a specified app. | Tester/QA | +| GET /apps/\{app-slug\}/builds/\{build-slug\} | Get the specified build of a given app. | Tester/QA | +| GET /apps/\{app-slug\}/builds/\{build-slug\}/bitrise.yml | Get the `bitrise.yml` file of one of the builds of a specified app. | Developer | +| GET /apps/\{app-slug\}/builds/\{build-slug\}/log | Get the build log of a specified build of an app. | Developer | +| GET /builds | List all the Bitrise builds that can be accessed with the authenticated account. | N/A | + + + + diff --git a/docs/bitrise-ci/api/managing-android-keystore-files.mdx b/docs/bitrise-ci/api/managing-android-keystore-files.mdx new file mode 100644 index 0000000..5a16de9 --- /dev/null +++ b/docs/bitrise-ci/api/managing-android-keystore-files.mdx @@ -0,0 +1,27 @@ +--- +title: "Managing Android keystore files" +description: "You can create and upload Android keystore files to Bitrise for the purposes of Android code signing, using the Bitrise API. Your account must be an owner or an admin on the app's team to access these features." +sidebar_position: 11 +slug: /bitrise-ci/api/managing-android-keystore-files +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DownloadingAnAndroidKeystoreFile from '@site/src/partials/downloading-an-android-keystore-file.mdx'; +import Partial_ListingTheAndroidKeystoreFilesOfAnApp from '@site/src/partials/listing-the-android-keystore-files-of-an-app.mdx'; +import Partial_CreatingAndUploadingAndroidKeystoreFiles from '@site/src/partials/creating-and-uploading-android-keystore-files.mdx'; + +This guide describes how to manage your Android keystore files with the Bitrise API. If you’d like to learn more about how to do the same on the UI, please check out [Android code signing](urn:resource:component:42718). + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| GET/apps/\{app-slug\}/android-keystore-files | Get a list of Android keystore files | Owner or Admin | +| POST/apps/\{app-slug\}/android-keystore-files | Create an Android keystore file | Owner or Admin | +| DELETE/apps/\{app-slug\}/android-keystore-files/\{android-keystore-file-slug\} | Delete an Android keystore file | Owner or Admin | + + + + + + diff --git a/docs/bitrise-ci/api/managing-build-artifacts.mdx b/docs/bitrise-ci/api/managing-build-artifacts.mdx new file mode 100644 index 0000000..31a187c --- /dev/null +++ b/docs/bitrise-ci/api/managing-build-artifacts.mdx @@ -0,0 +1,36 @@ +--- +title: "Managing build artifacts" +description: "You can list, retrieve, update, and delete any build artifacts with the Bitrise API." +sidebar_position: 13 +slug: /bitrise-ci/api/managing-build-artifacts +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DeletingABuildArtifact from '@site/src/partials/deleting-a-build-artifact.mdx'; +import Partial_IMPORTANTArtifactRetentionPolicy from '@site/src/partials/important-artifact-retention-policy.mdx'; +import Partial_ListingBuildArtifacts from '@site/src/partials/listing-build-artifacts.mdx'; +import Partial_RetrievingASpecificBuildArtifactSData from '@site/src/partials/retrieving-a-specific-build-artifacts-data.mdx'; +import Partial_DisablingThePublicInstallPageOfAnArtifact from '@site/src/partials/disabling-the-public-install-page-of-an-artifact.mdx'; + +If you add the `Deploy to bitrise.io` Step to your Workflow, once the build has run, you can access the build artifacts in the build's **Artifacts** tab on bitrise.io. + +You can also manage the generated artifacts with the Bitrise API. + + + +| Endpoint | Function | Required role on the app's team | +| --- | --- | --- | +| [GET/apps/\{app-slug\}/builds/\{build-slug\}/artifacts](/en/api/api-reference.html#operations-tag-build-artifact) | Listing build artifacts | Any | +| [GET/apps/\{app-slug\}/builds/\{build-slug\}/artifacts/\{artifact-slug\}](/en/api/api-reference.html#operations-tag-build-artifact) | Retrieving data of a specific build artifact | Any | +| [PATCH/apps/\{app-slug\}/builds/\{build-slug\}/artifacts/\{artifact-slug\}](/en/api/api-reference.html#operations-tag-build-artifact) | Updating a build artifact | Owner, Admin, or Developer | +| [DELETE/apps/\{app-slug\}/builds/\{build-slug\}/artifacts/\{artifact-slug\}](/en/api/api-reference.html#operations-tag-build-artifact) | Deleting a build artifact | Owner, Admin, or Developer | + + + + + + + + diff --git a/docs/bitrise-ci/api/managing-files-in-generic-file-storage.mdx b/docs/bitrise-ci/api/managing-files-in-generic-file-storage.mdx new file mode 100644 index 0000000..43356e6 --- /dev/null +++ b/docs/bitrise-ci/api/managing-files-in-generic-file-storage.mdx @@ -0,0 +1,33 @@ +--- +title: "Managing files in Generic File Storage" +description: "You can upload, delete, update, and list any project files to the Generic File Storage on Bitrise. You can access the files either via the API or in the Workflow Editor." +sidebar_position: 12 +slug: /bitrise-ci/api/managing-files-in-generic-file-storage +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ListingTheUploadedFilesOfAnApp from '@site/src/partials/listing-the-uploaded-files-of-an-app.mdx'; +import Partial_CreatingAndUploadingFilesToTheGenericFileStorage from '@site/src/partials/creating-and-uploading-files-to-the-generic-file-storage.mdx'; +import Partial_RetrievingASpecificFileSData from '@site/src/partials/retrieving-a-specific-files-data.mdx'; +import Partial_DeletingAFileFromTheGenericFileStorage from '@site/src/partials/deleting-a-file-from-the-generic-file-storage.mdx'; + +You can upload, delete, update, and list any project files in the `GENERIC FILE STORAGE` section of Bitrise. + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| [POST/apps/\{app-slug\}/generic-project-files](/en/api/api-reference.html#operations-tag-generic-project-file) | Create a generic project file | Owner or Admin | +| [POST/apps/\{app-slug\}/generic-project-files/\{generic-project-file-slug\}/uploaded](/en/api/api-reference.html#operations-tag-generic-project-file) | Confirm the upload process | Owner or Admin | +| [PATCH/apps/\{app-slug\}/generic-project-files/\{generic-project-file-slug\}](/en/api/api-reference.html#operations-tag-generic-project-file) | Update an uploaded project file | Owner or Admin | +| [GET/apps/\{app-slug\}/generic-project-files](/en/api/api-reference.html#operations-tag-generic-project-file) | Get a list of the uploaded project files | Owner or Admin | +| [GET/apps/\{app-slug\}/generic-project-files/\{generic-project-file-slug\}](/en/api/api-reference.html#operations-tag-generic-project-file) | Retrieve data of a specific project file | Owner or Admin | +| [DELETE/apps/\{app-slug\}/generic-project-files/\{generic-project-file-slug\}](/en/api/api-reference.html#operations-tag-generic-project-file) | Delete an uploaded project file | Owner or Admin | + + + + + + + + diff --git a/docs/bitrise-ci/api/managing-ios-code-signing-files.mdx b/docs/bitrise-ci/api/managing-ios-code-signing-files.mdx new file mode 100644 index 0000000..ca21bd2 --- /dev/null +++ b/docs/bitrise-ci/api/managing-ios-code-signing-files.mdx @@ -0,0 +1,44 @@ +--- +title: "Managing iOS code signing files" +description: "You can upload, update, list, and delete iOS code signing files with the Bitrise API: we have separate endpoints for certificates and provisioning profiles." +sidebar_position: 10 +slug: /bitrise-ci/api/managing-ios-code-signing-files +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingASpecificIOSCodeSigningFileSData from '@site/src/partials/getting-a-specific-ios-code-signing-files-data.mdx'; +import Partial_CreatingAndUploadingAnIOSCodeSigningFile from '@site/src/partials/creating-and-uploading-an-ios-code-signing-file.mdx'; +import Partial_ListingTheIOSCodeSigningFilesOfAnApp from '@site/src/partials/listing-the-ios-code-signing-files-of-an-app.mdx'; +import Partial_UpdatingAnUploadedIOSCodeSigningFile from '@site/src/partials/updating-an-uploaded-ios-code-signing-file.mdx'; + +This guide describes how to manage your iOS code signing files with the Bitrise API. If you’d like to learn more about how to do the same on the UI, please check out [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing). + +You can upload, update, list, and delete iOS code signing files with the API. In this guide we show you how and in what order to use those code signing endpoints. + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| POST/apps/\{app-slug\}/provisioning-profiles | Create a provisioning file | Owner or Admin | +| POST/apps/\{app-slug\}/provisioning-profiles/\{provisioning-profile-slug\}/uploaded | Confirm the upload process | Owner or Admin | +| PATCH/apps/\{app-slug\}/provisioning-profiles/\{provisioning-profile-slug\} | Update an uploaded provisioning file | Owner or Admin | +| GET/apps/\{app-slug\}/provisioning-profiles | Get a list of the uploaded provisioning files | Owner or Admin | +| GET/apps/\{app-slug\}/provisioning-profiles/\{provisioning-profile-slug\} | Retrieve data of a specific provisioning file | Owner or Admin | +| DELETE/apps/\{app-slug\}/provisioning-profiles/\{provisioning-profile-slug\} | Delete an uploaded provisioning file | Owner or Admin | + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| POST/apps/\{app-slug\}/build-certificates | Create a build certificate | Owner or Admin | +| POST/apps/\{app-slug\}/build-certificates/\{build-certificate-slug\}/uploaded | Confirm the upload process | Owner or Admin | +| PATCH/apps/\{app-slug\}/build-certificates/\{build-certificate-slug\} | Update an uploaded build certificate | Owner or Admin | +| GET/apps/\{app-slug\}/build-certificates | Get a list of the uploaded build certificate | Owner or Admin | +| GET/apps/\{app-slug\}/build-certificates/\{build-certificate-slug\} | Retrieve data of a specific build certificate | Owner or Admin | +| DELETE/apps/\{app-slug\}/build-certificates/\{build-certificate-slug\} | Delete an uploaded build certificate | Owner or Admin | + + + + + + + + diff --git a/docs/bitrise-ci/api/managing-secrets-with-the-api.mdx b/docs/bitrise-ci/api/managing-secrets-with-the-api.mdx new file mode 100644 index 0000000..6e41d08 --- /dev/null +++ b/docs/bitrise-ci/api/managing-secrets-with-the-api.mdx @@ -0,0 +1,24 @@ +--- +title: "Managing Secrets with the API" +sidebar_position: 14 +slug: /bitrise-ci/api/managing-secrets-with-the-api +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CreatingOrUpdatingAnExistingSecret from '@site/src/partials/creating-or-updating-an-existing-secret.mdx'; +import Partial_ViewingTheSecretsOfAnApp from '@site/src/partials/viewing-the-secrets-of-an-app.mdx'; + +This guide describes how to manage your secrets with the Bitrise API. If you’d like to learn more about how to do the same on the UI, check out [Secrets](/en/bitrise-ci/configure-builds/secrets.html). + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| GET/apps/\{app-slug\}/secrets | Get a list of Secrets of a specified app. | Owner or Admin | +| GET/apps/\{app-slug\}/secrets/\{secret-name\}/value | Get the value of an (unprotected) Secret. | Owner or Admin | +| PUT/apps/\{app-slug\}/secrets/\{secret-name\} | Create or update a Secret. | Owner or Admin | +| DELETE/apps/\{app-slug\}/secrets/\{secret-name\} | Delete a Secret. | Owner or Admin | + + + + diff --git a/docs/bitrise-ci/api/pagination-of-api-calls.md b/docs/bitrise-ci/api/pagination-of-api-calls.md new file mode 100644 index 0000000..8caa3d9 --- /dev/null +++ b/docs/bitrise-ci/api/pagination-of-api-calls.md @@ -0,0 +1,51 @@ +--- +title: "Pagination of API calls" +description: "With the Bitrise API, you can use pagination to iterate through list of items in the responses of certain endpoints. You can configure the properties of pagination." +sidebar_position: 3 +slug: /bitrise-ci/api/pagination-of-api-calls +--- + +When you call an endpoint that returns a list of items, you might not get the whole list in a single response. You’ll have to iterate through the pages to retrieve all the items. + +The response of such endpoints include a `paging` object, with `total_item_count` and `page_item_limit` properties. If there is a “next” page available, it’ll also include a `next` “anchor” item. For example, the response will show the app slug of the first app on the next page. + +``` +{ + "data": [ ... ], + "paging": { + "total_item_count": 3, + "page_item_limit": 2, + "next": "518e869d56f2adfd" + } +} +``` + +:::note[The `next` property of the `paging` object] + +The `next` property of the `paging` object is only included if there’s at least one more page available. If there’s no `next` property inside `paging` that means that there’s no more page to retrieve. + +::: + +Limit the number of response pages with the `limit` parameter: + +``` +https://api.bitrise.io/v0.1/me/apps?limit=10 +``` + +This call sets the `page_item_limit` property to 10. The default (and maximum) value of the parameter is 50. + +Iterate through response items: + +1. Call the endpoint without any pagination parameters. +1. From the response process the `paging` object. +1. If the `paging` object includes a `next` item, call the exact same endpoint with an additional `next=` query parameter, and pass the value you got in the response as the value of the `next` parameter. + +**Iterating through all your registered apps** + +1. Call `https://api.bitrise.io/v0.1/me/apps`. +1. Process the items (`data` property). +1. Check the `paging` (root) property. +1. If there’s a `next` property inside `paging`, call the endpoint again, with the `next` query parameter + + - Example: `https://api.bitrise.io/v0.1/me/apps?next=NEXTVALUE`, where `NEXTVALUE` is the value of the `next` property you got in your previous response. +1. Repeat this until the `paging` object does not include a `next` property, which means that the page you received was the last one. diff --git a/docs/bitrise-ci/api/triggering-and-aborting-builds.mdx b/docs/bitrise-ci/api/triggering-and-aborting-builds.mdx new file mode 100644 index 0000000..57ee51b --- /dev/null +++ b/docs/bitrise-ci/api/triggering-and-aborting-builds.mdx @@ -0,0 +1,23 @@ +--- +title: "Triggering and aborting builds" +description: "You can use the Bitrise API to trigger and abort builds of your apps. Define parameters for the build: for example, branch, tag or git commit to use. Custom Environment Variables can be defined as well." +sidebar_position: 7 +slug: /bitrise-ci/api/triggering-and-aborting-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TriggeringANewBuildWithTheAPI from '@site/src/partials/triggering-a-new-build-with-the-api.mdx'; +import Partial_AbortingABuild from '@site/src/partials/aborting-a-build.mdx'; + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| POST /apps/\{app-slug\}/builds | Trigger a new build. | Owner, Admin, or Developer | +| POST /apps/\{app-slug\}/builds/\{build-slug\}/abort | Abort a specific build. | Owner, Admin, or Developer | + +You can trigger and abort builds with the Bitrise API. Define parameters for the build: for example, branch, tag or git commit to use. Custom [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) can be defined as well. + + + + diff --git a/docs/bitrise-ci/bitrise-cli/_category_.json b/docs/bitrise-ci/bitrise-cli/_category_.json new file mode 100644 index 0000000..4325011 --- /dev/null +++ b/docs/bitrise-ci/bitrise-cli/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Bitrise CLI", + "position": 9, + "link": null +} diff --git a/docs/bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli.mdx b/docs/bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli.mdx new file mode 100644 index 0000000..21c5b9b --- /dev/null +++ b/docs/bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli.mdx @@ -0,0 +1,24 @@ +--- +title: "Adding a new project from a CLI" +description: "You can register a Bitrise project from a command line interface and start building. You can create a bitrise.yml file in advance and use that, or have our project scanner scan your project and generate one for you." +sidebar_position: 2 +slug: /bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_PreparingTheProject from '@site/src/partials/preparing-the-project.mdx'; +import Partial_AddingTheProject from '@site/src/partials/adding-the-project.mdx'; + +You can easily register a new Bitrise project from any command line interface: the process is guided and simple to follow. And it’s fast: if, for example, you have the `bitrise.yml` file you want to use for the project, you do not have to wait for the project scanner to detect the project type and generate your `bitrise.yml` file. Just plug in the existing file and you are good to go! + +:::tip[Adding a project with the API] + +You can also use the Bitrise API to add a new project: [Adding and managing apps](/en/bitrise-ci/api/adding-and-managing-apps) + +::: + + + + diff --git a/docs/bitrise-ci/bitrise-cli/index.md b/docs/bitrise-ci/bitrise-cli/index.md new file mode 100644 index 0000000..7aaeb0f --- /dev/null +++ b/docs/bitrise-ci/bitrise-cli/index.md @@ -0,0 +1,7 @@ +--- +title: "Bitrise CLI" +sidebar_position: 9 +slug: /bitrise-ci/bitrise-cli +--- + +Bitrise CLI diff --git a/docs/bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally.mdx b/docs/bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally.mdx new file mode 100644 index 0000000..d7e69ec --- /dev/null +++ b/docs/bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally.mdx @@ -0,0 +1,48 @@ +--- +title: "Initializing a Bitrise project locally" +description: "You can use the bitrise init plugin to initialize a new Bitrise app on your own computer, without adding it to Bitrise online." +sidebar_position: 3 +slug: /bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +When you add a new app to Bitrise, we detect the type of your project and generate a basic `bitrise.yml` file for you, with Workflows that are appropriate for your project type. + +With the Bitrise CLI, you can make this work on your own computer: + +1. [Install the Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html) on your computer. +1. Make sure that `$GOPATH/bin` is added to `$PATH` on your computer. + + By default, your Go workspace is at `$HOME/go/bin`. + + :::note[Installing Go] + + If you don't have Go installed on your computer, `bitrise init` will automatically install it for you. + + ::: +1. Start the `bitrise init` plugin: + + ``` + bitrise init + ``` +1. Wait while the plugin runs all available scanners to determine your project type. +1. Depending on the detected project type, the scanner asks for some input. Follow the instructions. + + For example, with an iOS project, it asks the user to specify an export method: + + ``` + Select: ipa export method + Please select from the list: + [1] : app-store + [2] : ad-hoc + [3] : enterprise + [4] : development + (type in the option's number, then hit Enter) : + ``` + +Based on the scanner outputs, the plugin generates a Bitrise configuration, with a `bitrise.yml` file. In the automatically generated Workflows, every required input will have a valid value. + +The plugin also generates a `bitrise.secrets.yml` file. You can store your Secrets in this file. diff --git a/docs/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.mdx b/docs/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.mdx new file mode 100644 index 0000000..48ed02d --- /dev/null +++ b/docs/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.mdx @@ -0,0 +1,23 @@ +--- +title: "Installing and updating the Bitrise CLI" +description: "The Bitrise CLI is distributed as a single binary for macOS and Linux. You can download it using curl or Homebrew." +sidebar_position: 1 +slug: /bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_InstallingTheBitriseCLIWithCurl from '@site/src/partials/installing-the-bitrise-cli-with-curl.mdx'; +import Partial_UpdatingTheBitriseCLI from '@site/src/partials/updating-the-bitrise-cli.mdx'; +import Partial_InstallingTheBitriseCLIWithHomebrew from '@site/src/partials/installing-the-bitrise-cli-with-homebrew.mdx'; + +The Bitrise CLI is Bitrise's open source runner. The CLI is used to run your builds on [bitrise.io](https://www.bitrise.io) and you can install and run it on your own computer to run builds locally. + +The Bitrise CLI is distributed as a single binary for macOS and Linux. You can download it using curl or Homebrew. + + + + + + diff --git a/docs/bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.mdx b/docs/bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.mdx new file mode 100644 index 0000000..23119c9 --- /dev/null +++ b/docs/bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.mdx @@ -0,0 +1,20 @@ +--- +title: "Installing and upgrading the offline Workflow Editor" +sidebar_position: 4 +slug: /bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_InstallingTheOfflineWorkflowEditorToYourComputer from '@site/src/partials/installing-the-offline-workflow-editor-to-your-computer.mdx'; +import Partial_UpgradingWorkflowEditorVersion from '@site/src/partials/upgrading-workflow-editor-version.mdx'; +import Partial_StartingTheOfflineWorkflowEditor from '@site/src/partials/starting-the-offline-workflow-editor.mdx'; + +Bitrise Workflow Editor is designed in such a way that you can run it offline on your Mac/PC without having to log into [bitrise.io](https://www.bitrise.io/). The Workflow Editor is open source, you can find its repository [here](https://github.com/bitrise-io/bitrise-workflow-editor). You can also join the discussion around Workflow Editor [here](https://discuss.bitrise.io/t/workflow-editor-v2-open-source-offline-workflow-editor/39). + + + + + + diff --git a/docs/bitrise-ci/bitrise-cli/managing-secrets-locally.mdx b/docs/bitrise-ci/bitrise-cli/managing-secrets-locally.mdx new file mode 100644 index 0000000..b2f8207 --- /dev/null +++ b/docs/bitrise-ci/bitrise-cli/managing-secrets-locally.mdx @@ -0,0 +1,58 @@ +--- +title: "Managing Secrets locally" +description: "When you run a build locally, with the Bitrise CLI, the Secrets are read from a `.bitrise.secrets.yml` file, which is expected to be in the same directory where the `bitrise.yml` is, and where you run the `bitrise run` command." +sidebar_position: 6 +slug: /bitrise-ci/bitrise-cli/managing-secrets-locally +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +When you run a build locally, with the Bitrise CLI, the Secrets are read from a `.bitrise.secrets.yml` file, which is expected to be in the same directory where the `bitrise.yml` is, and where you run the `bitrise run` command. + +If you want to store your Secrets somewhere else, you can specify the location of the Secrets file with the `--inventory` flag of the `bitrise run` command. For example: . + +``` +bitrise run my-workflow --inventory /path/to/secrets.yml +``` + +:::tip[Make sure to `gitignore` your Secrets file] + +As a best practice, you should always make sure that the `.bitrise.secrets.yml` is added to your `.gitignore`, so that it will never be committed into your repository! The best is if you `gitignore` everything that starts with `.bitrise`, which can be done by adding the line: `.bitrise*` to your `.gitignore` file. + +::: + +The Secrets YAML file has to include a root `envs:` item and then the list of Secret Environment Variables. + +``` +envs: +- SECRET_ENV_ONE: first Secret value +- SECRET_ENV_TWO: second Secret value +``` + +The Secrets defined in the `.bitrise.secrets.yml` file can be used just like any other Environment Variable. + +``` +format_version: 11 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + +workflows: + test: + steps: + - script@1.1.3: + inputs: + - content: | + #!/bin/bash + echo "SECRET_ENV_ONE: ${SECRET_ENV_ONE}" + echo "SECRET_ENV_TWO: ${SECRET_ENV_TWO}" +``` + +You can just `bitrise run test` in the directory, and the Script Step will print the values specified in the secrets file: + +``` +SECRET_ENV_ONE: first secret value +SECRET_ENV_TWO: second secret value +``` + +As Secrets are the first Environment Variables processed when you execute a `bitrise run` command, you can use the Secrets everywhere in your `bitrise.yml`. diff --git a/docs/bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli.mdx b/docs/bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli.mdx new file mode 100644 index 0000000..f302432 --- /dev/null +++ b/docs/bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli.mdx @@ -0,0 +1,47 @@ +--- +title: "Running your first local build with the CLI" +description: "Run a Bitrise build locally with the Bitrise CLI and a bitrise.yml file. To do so, use the bitrise run command once you have the correct YAML configuration." +sidebar_position: 5 +slug: /bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +To run a Bitrise build locally, you only need to: + +1. [Install the Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html). +1. A build configuration: that is, a `bitrise.yml` file. + +If you use [bitrise.io](https://www.bitrise.io), you can download your app’s `bitrise.yml` from there: open the Workflow Editor of the app on [bitrise.io](https://www.bitrise.io), under the `bitrise.yml` section. + +If you want to create a `bitrise.yml` yourself, simply create a `bitrise.yml` file in the root of your project. You can use this as the base content of the `bitrise.yml`: + +``` +format_version: 11 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + +app: + envs: + - MY_NAME: My Name + +workflows: + test: + steps: + - script@1.1.3: + inputs: + - content: echo "Hello ${MY_NAME}!" +``` + +This defines an [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) with your name and a Workflow called `test`. To run this build: + +1. Open the Terminal or some other CLI app. +1. Go to the directory where you saved the `bitrise.yml` file. +1. Run `bitrise run` with the name of the Workflow you defined in the file. + + ``` + bitrise run test + ``` + +That’s it: your first build is running with the Bitrise CLI. diff --git a/docs/bitrise-ci/code-signing/_category_.json b/docs/bitrise-ci/code-signing/_category_.json new file mode 100644 index 0000000..4951d19 --- /dev/null +++ b/docs/bitrise-ci/code-signing/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Code signing", + "position": 6, + "link": null +} diff --git a/docs/bitrise-ci/code-signing/android-code-signing/_category_.json b/docs/bitrise-ci/code-signing/android-code-signing/_category_.json new file mode 100644 index 0000000..17c8911 --- /dev/null +++ b/docs/bitrise-ci/code-signing/android-code-signing/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Android code signing", + "position": 1, + "link": null +} diff --git a/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle.md b/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle.md new file mode 100644 index 0000000..b041618 --- /dev/null +++ b/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle.md @@ -0,0 +1,92 @@ +--- +title: "Android code signing in Gradle" +description: "You can manually specify the code signing configuration in your Gradle configuration so that your app gets signed during the build process on Bitrise." +sidebar_position: 5 +slug: /bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle +--- + +You can manually specify the code signing configuration in your Gradle configuration so that your app gets signed during the build process. + +1. Open your module-level `build.gradle` file. +1. Add the `signingConfigs` codeblock to your code and define the following entries specific to your project: + + - `storeFiled` + - `storePassword` + - `keyAlias` + - `keyPassword` +1. Attach the signing config to a build type. +1. Build your app on Bitrise. + +For more information, check out how to [configure Gradle to sign your app](https://developer.android.com/studio/publish/app-signing). + +**Signing configuration in the build.gradle file** + +In this example, your keystore path should have the same path locally and on [bitrise.io](https://www.bitrise.io) to ensure the build can use the keystore file. + +``` +android { + // Make sure signingConfigs is defined before buildTypes. + signingConfigs { + release { + keyAlias 'MyAndroidKey' + keyPassword '***' + storeFile file("/path/to/my/keystore.jks") + storePassword '***' + } + } + + + buildTypes { + release { + // Use signing config for build type + signingConfig signingConfigs.release + // ... + } + } + // ... +``` + +**Using Environment Variables in the build.gradle file** + +You can avoid having the same keystore path locally and on [bitrise.io](https://www.bitrise.io) by using configuration values and Environment Variables in the keystore path (`storeFile`) and in the keystore password. + +You can use the `System.getenv("ENV_KEY")` file to access Environment Variables in the `build.gradle` file. Make sure to define the Environment Variables you use in your `build.gradle` file on [bitrise.io](https://www.bitrise.io) as well. + +If your keystore path is `$HOME/keystores/my_keystore.jks`, then your `build.gradle` file should look like this: + +``` +android { + signingConfigs { + release { + keyAlias 'MyAndroidKey' + keyPassword '***' + storeFile file(System.getenv("HOME") + "/keystores/my_keystore.jks") + storePassword '***' + } + } ... +``` + +You can then download the keystore file [using the File Downloader Step](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds/downloading-a-file-using-the-file-downloader-step), using the `$HOME/keystores/my_keystore.jks` as the destination path. + +If you use Environment Variables as `keyPassword` and `storePassword` on the **Code signing** tab, your `build.gradle` will look like this: + +``` +android { + signingConfigs { + release { + keyAlias System.getenv("BITRISEIO_ANDROID_KEYSTORE_ALIAS") + keyPassword System.getenv("BITRISEIO_ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD") + storeFile file(System.getenv("HOME") + "/keystores/my_keystore.jks") + storePassword System.getenv("BITRISEIO_ANDROID_KEYSTORE_PASSWORD") + } + } + + buildTypes { + release { + // Use signing config for build type + signingConfig signingConfigs.release + // ... + } + } + ... +``` diff --git a/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.mdx b/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.mdx new file mode 100644 index 0000000..0e381b6 --- /dev/null +++ b/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.mdx @@ -0,0 +1,44 @@ +--- +title: "Android code signing using the Android Sign Step" +description: "You can create a signed APK using the **Android Sign** Step in your Bitrise Workflow. This Step is configured to run if you have already uploaded your keystore file on the Code signing tab of the Workflow Editor." +sidebar_position: 3 +slug: /bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +You can create a signed APK using the [**Android Sign**](https://github.com/bitrise-steplib/steps-sign-apk) Step in your Bitrise Workflow. This Step is configured to run if you have already uploaded your [keystore file](https://developer.android.com/studio/publish/app-signing#generate-key) to Bitrise. + +The [**Android Sign**](https://github.com/bitrise-steplib/steps-sign-apk) Step is not required if signing is configured in your project’s `build.gradle` file. If so, running the [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build) Step (or the [**Gradle Runner**](https://github.com/bitrise-io/steps-gradle-runner) Step) signs the output (APK or AAB) automatically. Nevertheless, we recommend that you use the [**Android Sign**](https://github.com/bitrise-steplib/steps-sign-apk) Step to sign your project in an easy and secure way. + +:::note[jarsign and apksigner] + +APKs can be signed with either `jarsigner` or `apksigner`. For APKs, if you wish to use apksigner to sign your project, then in the [Android Sign](https://github.com/bitrise-steplib/steps-sign-apk) Step you have to first set the Enables `apksigner` input to true and leave the APK Signature Scheme input on automatic. This way `apksigner` checks your APK’s minimum and target SDK versions and chooses the required schemes. It signs your project with V1 scheme if your minimum supported version is low and it also signs with other schemes for newer systems. + +Please note that AAB files can only be signed with jarsigner. The Step uses `jarsigner` if it detects a file ending with `.aab` + +::: + +1. [Upload your keystore file to Bitrise](/en/bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.html). +1. Add the [**Android Sign**](https://github.com/bitrise-steplib/steps-sign-apk) Step to your Workflow after the Step that builds your APK or AAB file. + + Bitrise uses the above Environment Variables and sets them as inputs into the respective fields of the [**Android Sign**](https://github.com/bitrise-steplib/steps-sign-apk) Step. Once the Step runs, it produces either a signed APK or an AAB. The signed APK or AAB is used in deploy Steps, for example, the[**Google Play Deploy**](https://github.com/bitrise-io/steps-google-play-deploy) Step or the **Deploy to Bitrise.io** Step. The latter deploys the APK/AAB on the **Artifacts** tab. You can also use [Release Management](urn:resource:publication:90740) to deploy your app once you built an installable artifact. + +:::note[Downloading your keystore file] + +You can download your keystore file to the project directory using the **[File Downloader](https://github.com/bitrise-steplib/steps-file-downloader)** Step: + +``` +- file-downloader: + inputs: + - source: $BITRISEIO_ANDROID_KEYSTORE_URL + - destination: "$HOME/keystores/my_keystore.jks" #native android# +``` + +If a Step requires the keystore file, make sure to include that Step AFTER the [**File Downloader**](https://github.com/bitrise-steplib/steps-file-downloader) Step. + +After this Step, `my_keystore.jks` will be available at `$HOME/keystores/my_keystore.jks`. + +::: diff --git a/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio.md b/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio.md new file mode 100644 index 0000000..2cac9c3 --- /dev/null +++ b/docs/bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio.md @@ -0,0 +1,22 @@ +--- +title: "Android code signing with Android Studio" +description: "You can specify the code signing configuration for your project in [Android Studio](https://developer.android.com/studio/) before running a Bitrise build. You will need a keystore file, a key alias and a key password." +sidebar_position: 4 +slug: /bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio +--- + +You can specify the code signing configuration for your project in [Android Studio](https://developer.android.com/studio/). You will need a keystore file, a key alias and a key password - have these ready before you start the procedure! + +1. Open Android Studio. +1. Go to **Project navigator**. +1. Select your project and open **Module Settings**. +1. From **Modules**, select your module. +1. On the **Signing** tab, fill out the signing information. In our example, we used the following values: + + - Name: `release` + - Key alias: `MyAndroidKey` + - Key password: `***` + - Store file: `/path/to/my/keystore.jks` + - Store password: `***` + +Once you filled out the signing information, the `signingConfigs` block will be created in your module’s `build.gradle` file. On Bitrise, you just need to build the app, either with the **Android Build** or the **Gradle Runner** Step. diff --git a/docs/bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file.md b/docs/bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file.md new file mode 100644 index 0000000..68c9246 --- /dev/null +++ b/docs/bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file.md @@ -0,0 +1,24 @@ +--- +title: "Downloading a keystore file" +description: "You can define the location of the keystore file of an Android app in your `build.gradle` file. If the keystore file itself is missing from the location, you can use one of our file downloading Steps to download the keystore file from Bitrise and put it in the defined location." +sidebar_position: 1 +slug: /bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file +sidebar_label: Downloading a keystore file from Bitrise during a build +--- + +A keystore file is required for Android code signing. You can define the location of the keystore file of an Android app in your `build.gradle` file: [Android code signing in Gradle](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle). You can upload your keystore file to Bitrise and use the **File Downloader** Step to download the keystore file from Bitrise and put it in the location defined in the `build.gradle` file. + +:::note[The Android Sign Step] + +If you use the **Android Sign** Step to sign your app, you don't need to download the keystore file. The Step will find the file: [Android code signing using the Android Sign Step](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step). + +::: + +1. Add the **File Downloader** Step to your Workflow. The Step should be added BEFORE any Step that requires the keystore file, such as **Gradle Runner**. +1. Fill out the following two input fields: + + - **Download source url**: Set the generated keystore URL you get when you [upload your file to Bitrise](/en/bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.html)). + - **Download destination path**: Set the location of the keystore file as a relative path. This path should be the same as the keystore path already defined in your `build.gradle` file (for example, `$HOME/keystores/project_release.keystore`). +1. Add the **Gradle Runner** Step right after your file downloading Step. + +With that said, if you have successfully added the Steps to download your keystore file to the same location that you specified in your `build.gradle` file, you do not need the **Android Sign** Step in your workflow. Our **Gradle Runner** Step will sign and assemble your project. diff --git a/docs/bitrise-ci/code-signing/android-code-signing/index.md b/docs/bitrise-ci/code-signing/android-code-signing/index.md new file mode 100644 index 0000000..af8bf0e --- /dev/null +++ b/docs/bitrise-ci/code-signing/android-code-signing/index.md @@ -0,0 +1,7 @@ +--- +title: "Android code signing" +sidebar_position: 1 +slug: /bitrise-ci/code-signing/android-code-signing +--- + +Android code signing diff --git a/docs/bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.mdx b/docs/bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.mdx new file mode 100644 index 0000000..61c47fc --- /dev/null +++ b/docs/bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.mdx @@ -0,0 +1,50 @@ +--- +title: "Uploading Android keystore files to Bitrise" +description: "You can upload multiple Android keystore files to Bitrise and use the one your app needs. This makes the Android code signing process much easier." +sidebar_position: 2 +slug: /bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +To be able to digitally sign your Android apps, and distribute them on the Google Play Store, you need [a keystore file](https://developer.android.com/training/articles/keystore). You can store the keystore file in any accessible location and our Steps can use them but the easiest, most convenient way is to upload them directly to Bitrise. + +To do so: + +:::note[Multiple files] + +You can upload multiple keystore files to Bitrise. If you do, make sure your Steps use the right one, as they will have different URLs. + +::: + +1. +1. On the left, select **Code signing** and go to the **Android** tab. +1. Click the **Add keystore file** button. +1. In the dialog box, you can either drag-and-drop your keystore file to the **Select an Android keystore file** field, or click the field to browse your files. + + A keystore URL automatically gets generated once you upload the keystore file. Bitrise assigns an Environment Variable (BITRISEIO_ANDROID_KEYSTORE_URL) to the download URL (which is a time-limited, read-only download URL) of the file as the value. No need to download it manually as the [Android Sign](https://github.com/bitrise-steplib/steps-sign-apk) Step downloads it automatically. +1. Fill out the displayed three input fields with your Android keystore credentials: + + - **Keystore password** + - **Keystore alias** + - **Private key password** + + ![add-android-keystore.png](/img/_paligo/uuid-6ca09ed8-f6fb-b286-2327-e41d25cdf10a.png) + + You can set the passwords and the alias when creating the key: [Generate an upload key and keystore](https://developer.android.com/studio/publish/app-signing#generate-key). +1. Click **Continue**. The next page will show the new Environment Variables that will be available to your builds once you finish the file upload process: + + - $BITRISEIO_ANDROID_KEYSTORE_ALIAS + - $BITRISEIO_ANDROID_KEYSTORE_PASSWORD + - $BITRISEIO_ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD + - $BITRISEIO_ANDROID_KEYSTORE_URL + + Each time you upload an additional keystore file after the first, the new file's respective Env Vars will have a number at the end. For example, $BITRISEIO_ANDROID_KEYSTORE_ALIAS_1, $BITRISEIO_ANDROID_KEYSTORE_ALIAS_2. +1. Review your keystore data to make sure you've uploaded the correct file. +1. Optionally, you can set up a custom ID for the keystore file: in the **Custom keystore ID** field, add the ID you want to use to identify your keystore file. + + The ID will replace the unique part of the keystore-related Env Vars: for example, if you set the ID to `My_Best_App`, the URL will be $BITRISEIO_ANDROID_KEYSTORE_URL_MY_BEST_APP. +1. Click **Add file**. diff --git a/docs/bitrise-ci/code-signing/index.md b/docs/bitrise-ci/code-signing/index.md new file mode 100644 index 0000000..9872e5b --- /dev/null +++ b/docs/bitrise-ci/code-signing/index.md @@ -0,0 +1,7 @@ +--- +title: "Code signing" +sidebar_position: 6 +slug: /bitrise-ci/code-signing +--- + +Code signing diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/_category_.json b/docs/bitrise-ci/code-signing/ios-code-signing/_category_.json new file mode 100644 index 0000000..17ed97d --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "iOS code signing", + "position": 2, + "link": null +} diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects.mdx b/docs/bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects.mdx new file mode 100644 index 0000000..47dd8a2 --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects.mdx @@ -0,0 +1,94 @@ +--- +title: "Creating a signed IPA for Xcode projects" +description: "You can easily create a signed IPA file for your Xcode project with Bitrise if you have your Apple connection set up correctly and you made code signing files available to your builds." +sidebar_position: 4 +slug: /bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SigningAnIPAFileWithADifferentTeamSCodeSigningFile from '@site/src/partials/signing-an-ipa-file-with-a-different-teams-code-signing-file.mdx'; +import Partial_IMPORTANTUploadTheDistributionANDTheDevelopmentSigningCertificates from '@site/src/partials/important-upload-the-distribution-and-the-development-signing-certificates.mdx'; + +:::note[Overview on iOS code signing in Bitrise] + +For a comprehensive overview on what Steps are available for code signing asset management, visit the [iOS code signing page](/en/bitrise-ci/code-signing/ios-code-signing.html). + +::: + +You can easily create a signed IPA file for your Xcode project with Bitrise. + +- You have set up [Apple service connection](/en/bitrise-platform/integrations/apple-services-connection.html) on Bitrise. +- Your [code signing files are managed correctly](/en/bitrise-ci/code-signing/ios-code-signing.html). +- You set the relevant inputs of our **Xcode Archive and Export for iOS** Step. + + + +If you’re all set, proceed to setting up IPA export in your Workflow. + +Workflow Editor + +bitrise.yml + +1. Make sure the necessary [code signing files have been collected and uploaded](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning/uploading-ios-code-signing-certificates). +1. Make sure you have the [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive) Step in your Workflow. +1. Set the **Distribution method** input of the Step. + + ![xcode-archive.png](/img/_paligo/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png) + + The options are: + + - `app-store`: Choose this if you want to deploy the app to the App Store. Requires a Distribution certificate and an App Store provisioning profile. + - `ad-hoc`: Choose this if you want to deploy the app to ad-hoc testers. Requires a Distribution certificate and an Ad Hoc provisioning profile. + - `enterprise`: Choose this if you have an Apple Enterprise account and want to use that to distribute your app. + - `development`: Choose this for internal testing. Requires a Developer certificate and a Development provisioning profile. +1. Set the **Automatic code signing** input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t use automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Save the Workflow, and start a new build. + +1. Make sure all the [necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) are available for your build. +1. Open the `bitrise.yml` file of your app. +1. Make sure you have the `xcode-archive` Step in your Workflow. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + ``` +1. Set the `distribution_method` input to the correct value. The available options are: + + - `app-store`: Choose this if you want to deploy the app to the App Store. Requires a Distribution certificate and an App Store provisioning profile. + - `ad-hoc`: Choose this if you want to deploy the app to ad-hoc testers. Requires a Distribution certificate and an Ad Hoc provisioning profile. + - `enterprise`: Choose this if you have an Apple Enterprise account and want to use that to distribute your app. + - `development`: Choose this for internal testing. Requires a Developer certificate and a Development provisioning profile. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - distribution_method: development + ``` +1. Set the `automatic_code_signing` input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - automatic_code_signing: api-key + - distribution_method: development + ``` + +That’s all. Xcode will automatically select the right signing files based on your project’s Bundle ID and Team ID settings, and the export method you set. + + diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc.mdx b/docs/bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc.mdx new file mode 100644 index 0000000..5848488 --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc.mdx @@ -0,0 +1,25 @@ +--- +title: "Exporting iOS code signing files without codesigndoc" +description: "You can export iOS code signing certificates and provisioning profiles manually, or using Xcode." +sidebar_position: 9 +slug: /bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc +sidebar_label: Exporting iOS code signing files manually +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ExportingIOSProvisioningProfilesManually from '@site/src/partials/exporting-ios-provisioning-profiles-manually.mdx'; +import Partial_ExportingIOSProvisioningProfilesWithXcode from '@site/src/partials/exporting-ios-provisioning-profiles-with-xcode.mdx'; +import Partial_ExportingIOSCodeSigningCertificatesWithXcode from '@site/src/partials/exporting-ios-code-signing-certificates-with-xcode.mdx'; +import Partial_ExportingIOSCodeSigningCertificatesManually from '@site/src/partials/exporting-ios-code-signing-certificates-manually.mdx'; + +You can export iOS code signing certificates and provisioning profiles manually, or using Xcode. + + + + + + + + diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files.mdx b/docs/bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files.mdx new file mode 100644 index 0000000..4d047bf --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files.mdx @@ -0,0 +1,30 @@ +--- +title: "Generating iOS code signing files" +description: "You can generate iOS code signing files either with Xcode or on the Apple Developer Portal." +sidebar_position: 8 +slug: /bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GeneratingAProvisioningProfileWithXcode from '@site/src/partials/generating-a-provisioning-profile-with-xcode.mdx'; +import Partial_GeneratingACodeSigningCertificateWithXcode from '@site/src/partials/generating-a-code-signing-certificate-with-xcode.mdx'; +import Partial_GeneratingAProvisioningProfileManually from '@site/src/partials/generating-a-provisioning-profile-manually.mdx'; +import Partial_GeneratingACodeSigningCertificateManually from '@site/src/partials/generating-a-code-signing-certificate-manually.mdx'; + +You’ll need two kinds of files to sign your app: certificates and provisioning profiles. + +The certificates - development or distribution - are the guarantee that you, the named developer, built this code, that you are a member of the developer program, and that Apple have issued you with a certificate to do so. + +To get a certificate, you need to generate a Certificate Signing Request with Keychain Access and send it to Apple. This will create a public/private key pair for you if you don’t have one already. Apple will then verify the information, and create a certificate for you. + +Provisioning is the process of preparing and configuring an app to launch on devices and to use app services. Development provisioning profiles holds the device identifiers (UUID) that is eligible to run your app. Distribution provisioning profiles can include App Store profiles that allow you to distribute your app to the App Store. Ad-hoc profiles are good for distributing to your testers. + + + + + + + + diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/index.md b/docs/bitrise-ci/code-signing/ios-code-signing/index.md new file mode 100644 index 0000000..05f66a3 --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/index.md @@ -0,0 +1,7 @@ +--- +title: "iOS code signing" +sidebar_position: 2 +slug: /bitrise-ci/code-signing/ios-code-signing +--- + +iOS code signing diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects.mdx b/docs/bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects.mdx new file mode 100644 index 0000000..118f5f6 --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects.mdx @@ -0,0 +1,20 @@ +--- +title: "iOS code signing for Ionic and Cordova projects" +description: "Bitrise supports both manual and automatic provisioning for the iOS code signing of Ionic and Cordova apps as well." +sidebar_position: 6 +slug: /bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_IonicCordovaCodeSigningWithManualProvisioning from '@site/src/partials/ioniccordova-code-signing-with-manual-provisioning.mdx'; +import Partial_IonicCordovaCodeSigningWithAutomaticProvisioning from '@site/src/partials/ioniccordova-code-signing-with-automatic-provisioning.mdx'; + +Naturally, Bitrise supports iOS applications built with either **Ionic** or **Cordova**. However, the code signing process is slightly different compared to a native Xcode project. + +Bitrise supports both manual and automatic provisioning for Ionic and Cordova apps as well - and once again, the processes are somewhat different. + + + + diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/ios-code-signing.md b/docs/bitrise-ci/code-signing/ios-code-signing/ios-code-signing.md new file mode 100644 index 0000000..3286f95 --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/ios-code-signing.md @@ -0,0 +1,23 @@ +--- +title: "iOS code signing" +description: "To install your iOS app on a new device or to distribute your app to App Store, you will need to provide code signing files. The code signing of iOS projects requires signing certificates issued by Apple and provisioning profile file(s) matching your project." +sidebar_position: 1 +slug: /bitrise-ci/code-signing/ios-code-signing/ios-code-signing +sidebar_label: iOS code signing overview +--- + +To install your iOS app on a new device or to [distribute your app to App Store](/en/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect.html), you will need to provide code signing files. The code signing of iOS projects requires: + +- Signing certificates issued by Apple. +- Provisioning profile file(s) matching your project (team ID, bundle ID, and so on). + +:::note[Broken builds] + +If your builds break down and you suspect code signing issues, check out [our troubleshooting page](/en/bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing.html). + +::: + +| Methods | How it works | When to use it | +| --- | --- | --- | +| [Automatically managed provisioning profiles (recommended)](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning) | You only need to upload the code signing certificate(s) to Bitrise and to establish an [Apple Service connection](/en/bitrise-platform/integrations/apple-services-connection.html) (either via App Store Connect API key or through an Apple ID). Bitrise will download, create or renew the provisioning profile(s) and handle App ID and test device registration automatically. | This is the recommended option for most apps. With this option, managing your provisioning profiles is seamless and it's much easier to set up your Workflows. | +| [Manually managed provisioning profiles](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning) | You need to upload the code signing certificate(s) and also the provisioning profile(s) to Bitrise and keep the provisioning profile(s) updated with your iOS project. | Choose this option if: - You cannot connect your App Store Connect API key or Apple ID to Bitrise. - You store or handle your code signing files in a unique way. - You wish to use code signing files from multiple Apple Developer Accounts. You might also prefer this option if you are using an account with Apple Developer Enterprise Program. In this case only Apple ID-based authentication is supported. This has certain limitations: for example, needs to be renewed every 30 days. | diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning.mdx b/docs/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning.mdx new file mode 100644 index 0000000..807a1db --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning.mdx @@ -0,0 +1,33 @@ +--- +title: "Managing iOS code signing files - automatic provisioning" +description: "Automatic code signing means automatically managing the provisioning profiles that are available on your Apple Developer Portal account. If you set up some form of authentication to your Apple account, Bitrise can download and install the provisioning profile for your app during the build process." +sidebar_position: 2 +slug: "/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files---automatic-provisioning" +sidebar_label: iOS code signing with automatic provisioning +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ConfiguringTheStepsForAutomaticProvisioning from '@site/src/partials/configuring-the-steps-for-automatic-provisioning.mdx'; +import Partial_GeneratingExportOptionsPlist from '@site/src/partials/generating-export-options-plist.mdx'; +import Partial_AppleServicesAuthenticationForAutomaticProvisioning from '@site/src/partials/apple-services-authentication-for-automatic-provisioning.mdx'; +import Partial_UploadingIOSCodeSigningCertificates from '@site/src/partials/uploading-ios-code-signing-certificates.mdx'; + +On Bitrise, we're aiming to make iOS code signing as simple as possible for you. As such, we've done our best to automate a lot of the process. Several of our Steps have a built-in option for automatic code signing management to make configuration a lot more streamlined. + +Automatic code signing in this context means automatically managing the provisioning profiles that are available on your Apple Developer Portal account. If you set up some form of authentication to your Apple account, Bitrise can download and install the provisioning profile for your app during the build process. + +To use this feature, you need to: + +1. [Upload the code signing certificates to Bitrise.](#UUID-b18b6783-91e1-6655-e348-55aa94c78b4b) +1. Connect your Apple Developer Portal account to Bitrise either via [Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.html) or via the [App Store Connect API](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html). +1. [Use one of the Steps that support automatically managing code signing assets.](#UUID-50ad06ea-5990-80ef-ee00-17290556beec) + + + + + + + + diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning.mdx b/docs/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning.mdx new file mode 100644 index 0000000..3740fa8 --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning.mdx @@ -0,0 +1,42 @@ +--- +title: "Managing iOS code signing files - manual provisioning" +description: "To manage your code signing files manually, you need to upload your .p12 signing certificates and the app's provisioning profiles to Bitrise. There are multiple ways to do this." +sidebar_position: 3 +slug: "/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files---manual-provisioning" +sidebar_label: iOS code signing with manual provisioning +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +To manage your code signing files manually, you need to upload your .p12 signing certificates and the app's provisioning profiles to Bitrise. + +You always need to upload at least a Developer certificate and a Development type provisioning profile! That is necessary for our Xcode Steps to be able to test and build your apps properly. + +:::tip[Generating code signing files] + +If you don't have the necessary code signing files ready, you can generate new files: [Generating iOS code signing files](/en/bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files) + +::: + +To upload the code signing files to Bitrise, first you need to export the files in the .p12 file format. Once you successfully exported the files, you need to upload them to Bitrise. You have two options: + +- [Via an API call](/en/bitrise-ci/api/managing-ios-code-signing-files/creating-and-uploading-an-ios-code-signing-file). +- Uploading it manually to Bitrise. This guide focuses on this option. + +To manually upload your code signing files to Bitrise: + +1. Make sure you have your .p12 certificates and provisioning profiles exported and ready. Check out [Exporting iOS code signing files](/en/bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc) for more information. +1. +1. On the left, select **Code signing** from the menu. +1. Add your files: + + - To add a certificate, click the **Add .p12 file** button. In the dialog box, upload the file and, if required, provide the password for the certificate. + - To add provisioning profiles, click the **Add profile(s)** button. In the dialog box, upload the file(s). +1. Make sure you have the [**Certificate and profile installer**](https://github.com/bitrise-steplib/steps-certificate-and-profile-installer)Step in your app’s Workflow. You can check it on the **Workflow** tab of the Workflow Editor. + + Please note that these Steps must be **BEFORE** the Steps that archive and export your app (for example, [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive)) in your Workflow. + + ![certificate_and_profile_installer.png](/img/_paligo/uuid-fda915ec-d2ed-00a0-707c-b8a120221095.png) diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files.mdx b/docs/bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files.mdx new file mode 100644 index 0000000..129f29c --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files.mdx @@ -0,0 +1,22 @@ +--- +title: "Protecting your code signing files" +description: "You can set your code signing files to **Protected** mode: this means they cannot be downloaded from your [bitrise.io](https://www.bitrise.io) account. Your builds will be able to use these protected files but no one will be able to reveal them and there is no way to overwrite them: you can only delete the files and upload new ones instead." +sidebar_position: 7 +slug: /bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +You can set your code signing files to **Protected** mode: this means they cannot be downloaded from your [bitrise.io](https://www.bitrise.io) account. Your builds will be able to use these protected files but no one will be able to reveal them and there is no way to overwrite them: you can only delete the files and upload new ones instead. + +1. +1. On the left, select **Code signing** from the menu. +1. Locate the file you wish to make protected and open the dropdown menu by clicking the ellipsis button on the right. +1. Select the **Make protected** option. + + A dialog box will warn you that this change is irreversible once you confirm it. You do not need to separately save your changes. + +Once you are done, your only option in the file’s dropdown menu will be **Delete**. diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities.md b/docs/bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities.md new file mode 100644 index 0000000..cb78cef --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities.md @@ -0,0 +1,129 @@ +--- +title: "Signing an IPA with multiple code signing identities" +description: "You can create multiple IPA files with different code signing identities within a single Bitrise build. You just need to make sure the required code signing files are available and use the Export iOS and tvOS Xcode archive Step." +sidebar_position: 5 +slug: /bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities +--- + +:::note + +Overview on iOS code signing asset management + +For a comprehensive overview on what Steps are available for code signing asset management, visit the [iOS code signing page](/en/bitrise-ci/code-signing/ios-code-signing.html). + +::: + +You can create multiple IPA files with different code signing identities within a single Bitrise build. + +During the development of your iOS app you will need multiple types of distributions for different purposes, such as internal testing or deployment to the App Store. The good news is that this does not require setting up two separate workflows on [bitrise.io](https://www.bitrise.io). + +In this example we’ll be setting up a Workflow to create two signed IPA files: one with the `development` and one with the `app-store` export method. + +:::tip[Advanced configuration options] + +The procedure lists the bare minimum requirements to configure these Steps to export Xcode archives. Check out the Step in the Workflow Editor or the Step's `step.yml` in GitHub to see all potential configuration options, including but not limited to overriding the Bitrise-managed automatic code signing options, recompiling from and including bitcode, or using a specific `.plist` file to configure exporting. + +::: + +Workflow Editor + +bitrise.yml + +1. Make sure all the [necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) are available for your build. +1. Make sure you have the **[Xcode Archive & Export for iOS](https://www.bitrise.io/integrations/steps/xcode-archive)** Step in your Workflow. +1. In the list of input variables, navigate to **Distribution method** and select **development** from the dropdown menu. + + ![multipleexport.png](/img/_paligo/uuid-1e2babf9-a88c-0bd8-653d-9b5c7e8217a5.png) +1. Set the **Automatic code signing method** input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Add the **[Export iOS and tvOS Xcode archive](https://www.bitrise.io/integrations/steps/export-xcarchive)** Step to your Workflow. This Step reuses the archive generated by the**Xcode Archive and Export for iOS** Step and does a second export from the archive. +1. Set the **Automatic code signing method** input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` if you use API key authorization. + - `apple-id` if you use Apple ID authorization. +1. In the list of input variables, navigate to **Distribution method** and select **app-store** from the dropdown menu. + + ![app-store-method.png](/img/_paligo/uuid-734ff7ef-99f2-2ad4-e962-6fb90c3f936a.png) + +1. Make sure all the [necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) are available for your build. +1. Open the `bitrise.yml` file of your app. +1. Make sure you have the `xcode-archive` Step in your Workflow. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + ``` +1. Set the `distribution_method` input to `development`. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - distribution_method: development + ``` +1. Set the `automatic_code_signing` input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - automatic_code_signing: api-key + - distribution_method: development + ``` +1. Add the `export-xcarchive` Step to your Workflow. This Step reuses the archive generated by the `xcode-archive` Step and does a second export from the archive. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - automatic_code_signing: api-key + - distribution_method: development + - export-xcarchive: + inputs: + ``` +1. Set the `automatic_code_signing` input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` if you use API key authorization. + - `apple-id` if you use Apple ID authorization. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - automatic_code_signing: api-key + - distribution_method: development + - export-xcarchive: + inputs: + - automatic_code_signing: api-key + ``` +1. Set the `distribution_method` input to `app-store`. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - automatic_code_signing: api-key + - distribution_method: development + - export-xcarchive: + inputs: + - automatic_code_signing: api-key + - distribution_method: app-store + ``` + +And you’re done! Feel free to add multiple **Export iOS and tvOS Xcode archive** Steps to your Workflows to create multiple different signed .ipa files if necessary. diff --git a/docs/bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing.mdx b/docs/bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing.mdx new file mode 100644 index 0000000..43e98f3 --- /dev/null +++ b/docs/bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing.mdx @@ -0,0 +1,24 @@ +--- +title: "Troubleshooting iOS code signing" +description: "iOS code signing can be complicated, with several potential issues. We've collected some of the most common issues and their potential solutions." +sidebar_position: 10 +slug: /bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CodeSigningAndCleanVirtualMachines from '@site/src/partials/code-signing-and-clean-virtual-machines.mdx'; +import Partial_CouldNotInstallTheAppOnADevice from '@site/src/partials/could-not-install-the-app-on-a-device.mdx'; +import Partial_FileCountLimitOnProvisioningProfiles from '@site/src/partials/file-count-limit-on-provisioning-profiles.mdx'; +import Partial_IOSCodeSigningStepsFail from '@site/src/partials/ios-code-signing-steps-fail.mdx'; + +iOS code signing can be complicated, with several potential issues. We've collected some of the most common issues and their potential solutions. Let’s look into what you can do to make sure code signing works! + + + + + + + + diff --git a/docs/bitrise-ci/configure-builds/_category_.json b/docs/bitrise-ci/configure-builds/_category_.json new file mode 100644 index 0000000..80df840 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Configure builds", + "position": 3, + "link": null +} diff --git a/docs/bitrise-ci/configure-builds/configuration-yaml/_category_.json b/docs/bitrise-ci/configure-builds/configuration-yaml/_category_.json new file mode 100644 index 0000000..898ff04 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuration-yaml/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Configuration YAML", + "position": 1, + "link": null +} diff --git a/docs/bitrise-ci/configure-builds/configuration-yaml/accessing-a-builds-bitriseyml-file.mdx b/docs/bitrise-ci/configure-builds/configuration-yaml/accessing-a-builds-bitriseyml-file.mdx new file mode 100644 index 0000000..d50f88e --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuration-yaml/accessing-a-builds-bitriseyml-file.mdx @@ -0,0 +1,30 @@ +--- +title: "Accessing a build's bitrise.yml file" +description: "You can access a build's bitrise.yml file by selecting a build from your app's Dashboard and selecting 'show bitrise.yml' from the bitrise.yml drop-down menu." +sidebar_position: 3 +slug: /bitrise-ci/configure-builds/configuration-yaml/accessing-a-build-s-bitrise-yml-file +sidebar_label: Accessing a build's configuration YAML +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RestoringTheCurrentBitriseYmlToTheBuildSBitriseYml from '@site/src/partials/restoring-the-current-bitriseyml-to-the-builds-bitriseyml.mdx'; +import Partial_CheckingChangesInTheBitriseYmlFile from '@site/src/partials/checking-changes-in-the-bitriseyml-file.mdx'; +import Partial_DeletingABuildSBitriseYmlFile from '@site/src/partials/deleting-a-builds-bitriseyml-file.mdx'; + +Once you ran a build on Bitrise, you can always check the `bitrise.yml` configuration the build used. You can download it, compare it to the current `bitrise.yml` file, and you can even replace the current configuration file with the build's configuration file. + +To access a build's configuration file: + +1. Open Bitrise CI, select a project and then select one of the builds of the project. +1. Select **Configuration YAML** on the top right. + + ![show-config-yaml.png](/img/_paligo/uuid-b4d1eb0b-3222-87c7-f672-82695ed71e87.png) +1. In the dropdown menu, select **Show configuration YAML**. + + + + + + diff --git a/docs/bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview.mdx b/docs/bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview.mdx new file mode 100644 index 0000000..a4ddd57 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview.mdx @@ -0,0 +1,36 @@ +--- +title: "Configuration YAML overview" +description: "Your Bitrise CI configuration is defined and stored inside YAML files that define the version of the Bitrise CLI the build will use, the stack and machine type, the trigger map, and even Environment Variables." +sidebar_position: 1 +slug: /bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview +sidebar_label: About configuration YAML +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Your Bitrise CI configuration is defined and stored inside YAML files. When you modify your configuration on the GUI of the Workflow Editor, you modify YAML files. The files define: + +- The format version of [the Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html) the build will use. The format version number determines what Bitrise CLI versions will be able to run the configuration. +- The type of the project (for example, Android or iOS). +- The default [source of Steps](/en/bitrise-ci/references/steps-reference/step-reference-id-format.html) used. +- The [stack](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds/setting-the-stack-in-the-bitriseyml-file) and [machine type](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds/setting-the-stack-in-the-bitriseyml-file) of the build and of the specific Workflows or Pipelines. +- [Build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers.html) based on Git events. +- App- and Workflow-level [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables/setting-env-vars-in-the-bitriseyml) accessible to the build. +- The Workflows and Steps used in the build. + +The default configuration YAML file is called `bitrise.yml`. Each Bitrise project has a `bitrise.yml` file. You can find detailed reference information on the `bitrise.yml` file: [Configuration YAML reference](/en/bitrise-ci/references/configuration-yaml-reference). + +Configuration YAML files can be stored on: + +- The Bitrise website. This is the default setting. +- Your own Git repository. + +If you store your YAML configuration in your own Git repository, you can also use a modular YAML configuration. This means that in addition to the default `bitrise.yml` configuration file, you have one or more additional YAML files containing additional configuration. This allows breaking down large configurations into smaller, modular components, as well as efficient reuse of configuration segments across multiple different repositories and Bitrise projects: [Modular YAML configuration](/en/bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration). + +:::important[Enterprise only] + +A modular YAML configuration is only available to Workspaces on an [Enterprise plan](https://bitrise.io/pricing). For now, it is not available if you store your YAML configuration on bitrise.io. + +::: diff --git a/docs/bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml.mdx b/docs/bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml.mdx new file mode 100644 index 0000000..f3ddc0e --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml.mdx @@ -0,0 +1,86 @@ +--- +title: "Customizing your configuration YAML" +description: "Any tool that can edit `bitrise.yml` can add custom properties to it. This way you can add special properties or notes to your env vars, or even try new configurations of your Workflow in `bitrise.yml`. All you have to add is add a `meta` field and a namespace label with key and value to the right place." +sidebar_position: 6 +slug: /bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::note[Full reference] + +This is a basic reference for the most important aspects of CI/CD configuration in YAML. For the full reference, see [Configuration YAML reference](/en/bitrise-ci/references/configuration-yaml-reference). + +::: + +Any tool that can edit a configuration YAML file can add custom properties to it. This way you can add special properties or notes to your [Env Vars](/en/bitrise-ci/configure-builds/environment-variables.html), or even try new configurations of your Workflow. All you have to add is add a `meta` field and a namespace label with key and value to the right place. + +Use the following format to add custom values to your configuration: + +``` +KEY: "VALUE", +opts: { + title: "My env var" + description: "Description of my env var." + summary: "Summary of env var." + ... + meta: { + custom_namespace_id_1: { + key1: "value1", + key2: "value2", + ... + } + custom_namespace_id_2: { + ... + } +} +``` + +**Using your own version of the Workflow Editor** + +You can fork our Workflow Editor and use your own version of it. Then you can use `meta`: for example, let's say you want to keep an eye on one of the Environment Variables (Env Var), you want to know when it was last modified and by who. + +``` +app: + envs: + - ASXaS: "`ZX`ZX" + opts: + is_expand: false + meta: + audit: # used by the Audited Workflow Editor imaginary tool: that works like the WFE but it also saves the modifier and modification date, and displays it + last_modified_at: 2018.09.12. + last_modifier: Jane Doe +``` + +**Adding background color to an Environment Variable** + +You can use `meta` to add background color to an env var in your own tool: + +``` +meta: { + my_fancy_new_workflow_editor: { + env_var_background_color: "red" + } + } +``` + +When you change the stack configuration on the Workflow Editor UI, you modify `meta`under the hood. In this example, the `deploy` Workflow is configured to run on Xcode 16.1. + +``` +workflows: + deploy: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@4: {} + - script@1: + title: Do anything with Script step + - deploy-to-bitrise-io@1: {} + meta: + bitrise.io: + stack: osx-xcode-16.1.x +``` + +Since this meta is only interpreted on [bitrise.io](https://www.bitrise.io/) and not locally or on the Bitrise CLI, it is categorized by a `bitrise.io` namespace (where the stack is the key and `osx-xcode-12.1.x` is the value). The Workflow Editor always validates the saved variable and throws an error if there is a syntax error, but with `meta` added, its content is fully ignored by the Workflow Editor validation process. diff --git a/docs/bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file.mdx b/docs/bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file.mdx new file mode 100644 index 0000000..8c4024c --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file.mdx @@ -0,0 +1,30 @@ +--- +title: "Editing an app's bitrise.yml file" +description: "You can edit the file on bitrise.io, in the graphical Workflow Editor, or you can download it and edit it locally. Whenever you modify a Workflow or a Step in the Workflow Editor, you're indirectly editing the app's bitrise.yml configuration file." +sidebar_position: 4 +slug: /bitrise-ci/configure-builds/configuration-yaml/editing-an-app-s-bitrise-yml-file +sidebar_label: Editing a project's bitrise.yml configuration file +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_EditingTheBitriseYmlFileOnline from '@site/src/partials/editing-the-bitriseyml-file-online.mdx'; +import Partial_EditingTheBitriseYmlFileLocally from '@site/src/partials/editing-the-bitriseyml-file-locally.mdx'; +import Partial_IMPORTANTFamiliarityWithTheStructureOfTheBitriseYmlFile from '@site/src/partials/important-familiarity-with-the-structure-of-the-bitriseyml-file.mdx'; + +Your Bitrise configuration is defined in YAML files. All Bitrise projects have a root `bitrise.yml` file which defines Pipelines, Workflows, app-level Environment Variables, the trigger map, and stack types and machine types for your project. You can edit this file in three different ways: + +- Using the graphical UI of the Workflow Editor. Whenever you make a change in the Workflow Editor, it automatically updates your `bitrise.yml` file. +- [Editing the bitrise.yml file online on bitrise.io](#UUID-5a8a5778-2583-3270-a1bb-52af7b023f0c). +- [Editing the bitrise.yml file locally](#UUID-d0674540-e7cf-2ce0-8f59-569fc6704400) in an editor of your choice. You can either copy the content to the online editor, or you can [store your configuration file in your repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository). + +Whenever you modify a Workflow or a Step in the Workflow Editor, you're indirectly editing the app's `bitrise.yml` configuration file. However, if you prefer, you can edit the file directly, in YAML. + + + +You can edit the file on bitrise.io, in the graphical Workflow Editor, or you can download it and edit it locally. + + + + diff --git a/docs/bitrise-ci/configure-builds/configuration-yaml/index.md b/docs/bitrise-ci/configure-builds/configuration-yaml/index.md new file mode 100644 index 0000000..f49b1b7 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuration-yaml/index.md @@ -0,0 +1,7 @@ +--- +title: "Configuration YAML" +sidebar_position: 1 +slug: /bitrise-ci/configure-builds/configuration-yaml +--- + +Configuration YAML diff --git a/docs/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file.mdx b/docs/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file.mdx new file mode 100644 index 0000000..08e5da7 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file.mdx @@ -0,0 +1,39 @@ +--- +title: "Managing a project's configuration YAML file" +description: "The heart of your build is the bitrise.yml file. You can configure the Steps you use, the project type, the trigger map, and specify the app- and Workflow-level Env Vars." +sidebar_position: 2 +slug: /bitrise-ci/configure-builds/configuration-yaml/managing-a-project-s-configuration-yaml-file +sidebar_label: Storing an app's configuration YAML +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UpdatingABitriseYmlStoredInTheRepository from '@site/src/partials/updating-a-bitriseyml-stored-in-the-repository.mdx'; +import Partial_MovingTheBitriseYmlFileBackToBitriseIo from '@site/src/partials/moving-the-bitriseyml-file-back-to-bitriseio.mdx'; +import Partial_IMPORTANTYAMLFilesSizeLimitation from '@site/src/partials/important-yaml-files-size-limitation.mdx'; +import Partial_StoringTheBitriseYmlFileInYourRepository from '@site/src/partials/storing-the-bitriseyml-file-in-your-repository.mdx'; +import Partial_StoringABitriseYmlFileOnMultipleBranchesInTheRepository from '@site/src/partials/storing-a-bitriseyml-file-on-multiple-branches-in-the-repository.mdx'; + + + +There are two ways to store the configuration YAML file of your project: + +- Keep the file in your Git repository: with this solution, you have full control over maintaining and versioning the file. +- Keep it on [bitrise.io](http://bitrise.io/): Bitrise will store your configuration, and you can access it any time on the website. With this solution, the configuration file is fully independent from your repository. + +You can switch between the two solutions at any time. + +:::note[Reference] + +For full configuration YAML syntax reference, see [Configuration YAML reference](/en/bitrise-ci/references/configuration-yaml-reference). + +::: + + + + + + + + diff --git a/docs/bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration.mdx b/docs/bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration.mdx new file mode 100644 index 0000000..d9ced4a --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration.mdx @@ -0,0 +1,37 @@ +--- +title: "Modular YAML configuration" +description: "Modular YAML Configuration enables you to break down large, complex YAML files into smaller, modular components. It allows easier reuse across multiple repositories." +sidebar_position: 5 +slug: /bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TheIncludeFormatReference from '@site/src/partials/the-include-format-reference.mdx'; +import Partial_DefiningConfigurationModules from '@site/src/partials/defining-configuration-modules.mdx'; +import Partial_IncludingConfigurationFromMultipleYAMLFiles from '@site/src/partials/including-configuration-from-multiple-yaml-files.mdx'; + +:::important[Enterprise only] + +Modular YAML configuration is only available for Workspaces with Enterprise plans. You also need to [store your configuration files in your own repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository), not on bitrise.io. + +If you are not on an Enterprise plan but interested in modular YAML, [contact us](http://www.bitrise.io/contact)! + +::: + +Modular YAML configuration enables you to break down large, complex YAML files into smaller, modular components. It allows easier reuse across multiple repositories. By modularizing YAML files, you can quickly locate and update configurations, reducing the risk of errors and merge conflicts. + +A modular YAML configuration includes: + +- A `bitrise.yml` file in the root of your repository. +- Other YAML files in the same or a different repository. To include a file from a different repository, the repository must belong to the same Git account or organization as the primary repository. +- One or more `include` keywords in the `bitrise.yml` file. These point to other YAML files and bring their configuration into the main project configuration. + +After an additional YAML file has been included in the `bitrise.yml` file, you can refer to any of its Workflows or Pipelines as to any other Workflow or Pipeline in your configuration. + + + + + + diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/_category_.json b/docs/bitrise-ci/configure-builds/configuring-build-settings/_category_.json new file mode 100644 index 0000000..5c82645 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Configuring build settings", + "position": 2, + "description": "The heart of your build is the bitrise.yml file. You can configure the Steps you use, the project type, the trigger map, and specify the app- and Workflow-level Env Vars.", + "link": null +} diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/build-priority.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/build-priority.mdx new file mode 100644 index 0000000..591baff --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/build-priority.mdx @@ -0,0 +1,38 @@ +--- +title: "Build priority" +description: "You can configure build priority on Bitrise: by setting a value between -100 and 100, you can determine the order in which queued builds should run." +sidebar_position: 3 +slug: /bitrise-ci/configure-builds/configuring-build-settings/build-priority +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ConfiguringPriorityWhenStartingABuildManually from '@site/src/partials/configuring-priority-when-starting-a-build-manually.mdx'; +import Partial_ConfiguringPriorityForBuildTriggers from '@site/src/partials/configuring-priority-for-build-triggers.mdx'; +import Partial_ConfiguringPriorityForWorkflowsAndPipelines from '@site/src/partials/configuring-priority-for-workflows-and-pipelines.mdx'; +import Partial_OrderOfPrecedenceForPrioritySettings from '@site/src/partials/order-of-precedence-for-priority-settings.mdx'; + +By default, builds run in simple chronological order: the build that was triggered first runs first. However, you can configure build priority, allowing you to fast-track critical builds to the top of the queue. + +You can assign numerical priorities: a value between -100 and 100. The higher value, the higher the priority of the build. A build with a higher priority is executed sooner than a build with a lower priority. By default, all builds have a priority of 0. + +You can set priorities for: + +- Pipelines and Workflows. You can assign a priority to individual Worklows or even Pipelines. Assigning a priority to a Pipeline will assign all its constituent Workflows the same priority +- Triggers: Each trigger condition can be given a priority. +- Manual builds: When starting a build on the UI or via the Bitrise API, you can set a priority that determines its position in the queue. + +:::note[Availability] + +The build priority feature is only available for Workspaces on Teams, Pro, and Enterprise plans. If you are not on these plans, but interested in the feature, [contact us](https://bitrise.io/contact)! + +::: + + + + + + + + diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.mdx new file mode 100644 index 0000000..169c60f --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.mdx @@ -0,0 +1,33 @@ +--- +title: "Configuring email notifications" +description: "Bitrise's built-in email notification system sends emails about builds to every user who is assigned to work on an application. They are sent when a build is finished and they can be configured for both successful and failed builds." +sidebar_position: 6 +slug: /bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SendingEmailsWithAStep from '@site/src/partials/sending-emails-with-a-step.mdx'; +import Partial_WatchingAnApp from '@site/src/partials/watching-an-app.mdx'; +import Partial_ChangingYourEmailNotificationSettings from '@site/src/partials/changing-your-email-notification-settings.mdx'; + +Notifications are updates about your activity on Bitrise. Usually, they concern the state of your builds but you can receive notifications about a lot of different things. + +Our built-in email notification system sends emails about builds to every user who is assigned to work on an application. They are sent when a build is finished and they can be configured for both successful and failed builds. + +:::important[Watching the app] + +To receive automatic email messages, [you need to be watching the app](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications/watching-an-app). If you turn off watching, you won’t receive the automated emails. + +::: + +Email notifications are automatically set up for all applications when first creating them but you can modify these notification settings at any time: [see topic](#UUID-f51180b1-c8de-7feb-e020-0b6e790debd5) + +The alternative solution is to send emails via a dedicated Step. This allows for far more customization regarding the notifications: [see topic](#UUID-026b92b1-7a65-94f8-73b6-449dad27bbc0) + + + + + + diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration.mdx new file mode 100644 index 0000000..dd91cc9 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration.mdx @@ -0,0 +1,37 @@ +--- +title: "Configuring Slack integration" +description: "You can integrate Slack to your app on Bitrise by adding the \"Send a Slack message\" Step to your app's Workflow." +sidebar_position: 7 +slug: /bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration +sidebar_label: Sending Slack messages in a build +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +You can send Slack messages during a Bitrise build to individual users, groups or channels with the [**Send a Slack message**](https://github.com/bitrise-io/steps-slack-message) Step. Customize the messages, include attachments, and link buttons that will take the users to the build page. + +To use the Step to send messages: + +1. Set up the [workspace Slack integration](/en/bitrise-platform/workspaces/workspace-slack-integration) and [get the integration ID](/en/bitrise-platform/workspaces/workspace-slack-integration). + + The Step needs the integration ID. +1. Add the integration ID as a [Secret](/en/bitrise-ci/configure-builds/secrets.html). +1. Add the [**Send a Slack message**](https://github.com/bitrise-io/steps-slack-message) Step to your Workflow. +1. Make sure that [it is always set to run even if the previous Step failed]()! + + This is the default setting of the Step. If you change it, messages won’t be sent if the build fails. +1. Find the **Slack integration ID** input and add the Secret containing the integration ID. +1. Customize your Slack message with the relevant inputs of the Step. + + There are several options, including but not limited to: + + - Setting the target channel, group or username: this can be a name or an encoded ID. + - The text of the message to send. + - The bot’s username for the message + - The message’s color + - File attachment + - Link buttons attached to the message + + Check out all the inputs in the Workflow Editor to see all the ways in which you can customize your Slack messages. diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions.mdx new file mode 100644 index 0000000..a048bfa --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions.mdx @@ -0,0 +1,41 @@ +--- +title: "Configuring tool versions" +description: "Bitrise can automatically set up any tools with the right version for your CI project. For example, most CI workflows often start with installing the right version of Ruby or Node.js that is compatible with the project." +sidebar_position: 2 +slug: /bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_LimitationsAndAlternatives from '@site/src/partials/limitations-and-alternatives.mdx'; +import Partial_SupportedTools from '@site/src/partials/supported-tools.mdx'; +import Partial_ToolVersionManagers from '@site/src/partials/tool-version-managers.mdx'; +import Partial_ToolSetupDuringWorkflowExecution from '@site/src/partials/tool-setup-during-workflow-execution.mdx'; +import Partial_DeclarativeToolSetup from '@site/src/partials/declarative-tool-setup.mdx'; + +Bitrise can automatically set up any tools with the right version for your CI project. For example, most CI workflows often start with installing the right version of Ruby or Node.js that is compatible with the project. + +There are two ways to set up tools: + +- A declarative, YAML-based method: add your tool and its version to the `tools` property on the top level of your configuration YAML file. We recommend getting started with this method: [see topic](#UUID-dace03bd-9354-7fd3-0ac6-5cff9936416e). +- Installation during Workflow execution: either via a purpose-built Bitrise Step or a script that runs a CLI subcommand: [see topic](#UUID-d2c60363-5e98-4501-7e97-5f1a76a75c62). + +To help you choose the right approach, consider the differences and limitations of each method: + +| Declarative config | Workflow execution | +| --- | --- | +| Executed automatically before the first Step of a Workflow. | Executed manually within the Workflow. Can be executed in the middle of the Workflow. | +| Can't read config from version files: tool setup is executed before the **Git Clone** Step. Tool versions are defined in two files (version file and your configuration YAML file). | You can read the configuration from version files if you run the command after the **Git Clone** Step. For reusability, we recommend [creating a `step bundle`](/en/bitrise-ci/workflows-and-pipelines/steps/step-bundles.html) and reference that in all Workflows. | +| No additional configuration required: tools automatically become available in `$PATH` in Workflow Steps. | Our dedicated Step requires no additional configuration. If you use your own script, shell sourcing is required before the tools become active in the current shell or script step (see details below). | +| Doesn't configure the local development environment (except when running Workflows locally via `bitrise run workflow_name`). | Configures the local developer environment if tools versions are defined in a version file (for example, `.ruby-version`) and everyone in the team has a tool version manager set up (for example, `Mise`). | + + + + + + + + + + diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/index.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/index.mdx new file mode 100644 index 0000000..00664cc --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/index.mdx @@ -0,0 +1,20 @@ +--- +title: "Configuring build settings" +description: "The heart of your build is the bitrise.yml file. You can configure the Steps you use, the project type, the trigger map, and specify the app- and Workflow-level Env Vars." +sidebar_position: 2 +slug: /bitrise-ci/configure-builds/configuring-build-settings +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +You can configure and customize your builds extensively. Bitrise provides a multitude of options to make sure you can build your app exactly the way you want to. + +The heart of your build configuration is the `bitrise.yml` file: this file contains the configuration of all the Workflows and Steps you use, it specifies the project type, the trigger map, and it contains the app- and Workflow-level Environment Variables you specified. You can [store this file on bitrise.io or in your Git repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository) and you can access the `bitrise.yml` file of any previous build you ran. + +You can [configure notifications](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.html) so that users are immediately notified when a build is finished. + +If you don't want to run a build every time a commit is pushed or a pull request is opened, but rather only if certain files are changed, you can do that using the [Selective builds](/en/bitrise-ci/configure-builds/configuring-build-settings/selective-builds.html) feature. + +If commits are frequently pushed to your repository, with each commit triggering a new build, you don't have to wait until each triggered build finishes before a new one can start. Use the [Rolling builds](/en/bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.html) feature to make sure you don't waste time! diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.mdx new file mode 100644 index 0000000..fcda615 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.mdx @@ -0,0 +1,31 @@ +--- +title: "Reporting the build status to your Git hosting provider" +description: "You need to authenticate Bitrise and specify a Service credential user in the App settings page of your app to push back build status reports to your Git provider." +sidebar_position: 9 +slug: /bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TroubleshootingBuildStatusReporting from '@site/src/partials/troubleshooting-build-status-reporting.mdx'; +import Partial_CreatingCustomStatusReports from '@site/src/partials/creating-custom-status-reports.mdx'; +import Partial_ConfiguringBuildStatusReporting from '@site/src/partials/configuring-build-status-reporting.mdx'; + +Bitrise can send build status reports to your Git provider (GitHub/GitLab/Bitbucket). This helps developers make informed decisions quickly and eliminates the need to switch between platforms. + +We send a status report for each build, even if the same commit triggers multiple builds. You can customize the report using variables to make it more descriptive and convey specific information. + +You can set up status reports on the project level or the level of Workflows or Pipelines. + +:::important[Pipeline reports] + +If the triggered entity is a Pipeline, it will report its build status but the individual Workflows within the Pipeline won't report separate statuses. Other than the Pipeline status report, Bitrise also reports test result statuses for Steps that are exporting a test result. + +::: + + + + + + diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.mdx new file mode 100644 index 0000000..b1a2011 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.mdx @@ -0,0 +1,53 @@ +--- +title: "Rolling builds" +description: "With the rolling builds feature, you can configure Bitrise to automatically abort on-hold builds or already running builds if another build is triggered on the same branch." +sidebar_position: 5 +slug: /bitrise-ci/configure-builds/configuring-build-settings/rolling-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +You can cancel running builds or builds on hold with the **Rolling Builds** feature. The previous builds of your project can be automatically aborted once a new one is started. + +Please note that manual and scheduled builds are also cancelled if you start a new build with the **Rolling builds** option enabled. + +:::note[When is a build aborted?] + +If you trigger a build on a branch where a build is already running, the running build is aborted only if it runs the same Workflow. + +For example, if you trigger a build on the **main** branch of your repository with the **deploy** Workflow, it will NOT cancel a build running on the same **main** branch with the **primary** Workflow. + +::: + +## Configuring rolling builds + +1. +1. On the left, select **Builds**. +1. Find the **Build strategy** section. +1. Select the type(s) of builds you wish to abort when a new build is started. + + ![rolling-builds.png](/img/_paligo/uuid-74153d13-4c04-d223-7389-268265192245.png) + + - **Abort builds triggered by pull requests**: Cancel all previous builds still **on-hold** for Pull Requests and all related Pushes. **Running** builds will **not** be canceled unless **Running builds are aborted** is also enabled. + - **Abort builds triggered by pushes**: Cancel all previous builds still **on-hold** for Pushes to the same branch. **Running** builds will **not** be canceled unless **Running builds are aborted** is also enabled. You can configure exclusions for push events: [see topic](#section-idm234944751860711) + - **Abort on-hold builds triggered by tags**: Cancel all previous builds still **on-hold** if they were triggered by Git tags. + - **Abort running builds**: Auto-cancel running builds in addition to on-hold ones. + +## Managing exclusions for push events + +You can configure Bitrise to never abort certain code push builds. To do so, add exclusions when configuring rolling builds. You can exclude: + +- Repository branches. +- Pipelines and Workflows. + +A build that involves an excluded branch, Pipeline or Workflow will never be aborted. + +1. [Go to the Build strategy section to configure rolling builds](#section-idm23494475101244). +1. Enable **Abort on-hold builds triggered by pushes**. +1. Click **Add exclusions**. +1. Enter excluded branches or excluded Pipelines or Workflows. Both fields accept a list of values separated by a comma. + + ![add-exclusions.png](/img/_paligo/uuid-563e93b4-6feb-8322-27f7-7b86d6957992.png) diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/selective-builds.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/selective-builds.mdx new file mode 100644 index 0000000..e240443 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/selective-builds.mdx @@ -0,0 +1,79 @@ +--- +title: "Selective builds" +description: "The Selective builds setting provides change detection for your builds. Enabling it allows you to only trigger a build of an app if certain files or folders have been modified." +sidebar_position: 4 +slug: /bitrise-ci/configure-builds/configuring-build-settings/selective-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +:::caution[Using build triggers instead] + +This is a legacy feature. + +Instead of using this feature, you can now [configure build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) to only trigger builds when certain files or folders have changed: to do so, create a new trigger for push or pull request events, and choose the **Files changed** trigger condition. We strongly recommend using this option instead of Selective builds. + +::: + +The **Selective builds** setting provides change detection for your builds. Enabling it allows you to only trigger a build of an app if certain files or folders have been modified. + +You may want to use this setting if: + +- You have a monorepo; that is, you build multiple apps from a single repository. +- Multiple apps share common files in your repository. + +:::important[Selective Builds with non-Github projects] + +The current version of our Selective Builds feature only works with GitHub projects. If your repository is hosted by another Git hosting service, the option will not be available. + +::: + +**Using the Selective builds feature** + +Let's say you want to make sure that a commit to your app's repository triggers a Bitrise build only if the `mycode.go` file on the `develop` branch is modified in the commit. + +- In this example, you have a branch called `develop`. +- You have a trigger that starts a build every time a code push happens on the `develop` branch. +- In the selective builds feature, you specified the `mycode.go` file in the input field. + +If you make a commit on the `develop` branch that modifies the `mycode.go` file, Bitrise will trigger a build. If your commit doesn't modify the file in any way, Bitrise will not trigger a build. + +To configure selective builds: + +1. +1. Make sure the appropriate [service credential user](/en/bitrise-platform/integrations/the-service-credential-user.html) is set on the **Integrations** page. + + This user must have admin right for the GitHub repository of the project. +1. On the left, select **Builds**. +1. Find the **Selective builds** section and toggle it on. + + ![selectuve-builds.png](/img/_paligo/uuid-974582cb-d9c3-a954-0909-c78a76915d55.png) +1. Click **Add path** . + + :::important[Can't find the button?] + + If you can't find the button - like in the screenshot above -, it is because of two possible reasons: + + - The app's repository isn't hosted on GitHub. + - The [service credential user](/en/bitrise-platform/integrations/the-service-credential-user.html) isn't set correctly or doesn't have admin rights to the repo. + + ::: +1. In the pop-up window, set the paths you need. + + You can add one path at a time. + +## Using patterns in the file name or file path + +You do not need to set an exact file name or file path for the Selective builds feature: you can set patterns. Using regular expressions is not supported but the pattern may contain certain metacharacters: + +- `*`: Matches all files. +- `a*`: Matches all files beginning with a. +- `*a`: Matches all files ending with a. +- `*a*`: Matches all files that have a in them (including at the beginning or end). +- `**`: Matches directories recursively. +- `?`: Matches any one character. +- `\`: Escapes the next metacharacter. +- `[set]`: Matches any one character in set. diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds.mdx new file mode 100644 index 0000000..04dfe17 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds.mdx @@ -0,0 +1,27 @@ +--- +title: "Setting the stack for your builds" +description: "The build stack indicates the virtual machine version that Bitrise will use to run your build. You can set the stack for all your builds, or you can set Workflow-specific stacks, either in the Workflow Editor or in the bitrise.yml file." +sidebar_position: 1 +slug: /bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingTheStackInTheWorkflowEditor from '@site/src/partials/setting-the-stack-in-the-workflow-editor.mdx'; +import Partial_BuildMachineTypes from '@site/src/partials/build-machine-types.mdx'; +import Partial_SettingTheStackInTheBitriseYmlFile from '@site/src/partials/setting-the-stack-in-the-bitriseyml-file.mdx'; + +[The build stack](/en/bitrise-build-hub/infrastructure/build-stacks.html) indicates the virtual machine version that we will use to run your build. You can set the stack for all your builds, or you can set Workflow-specific stacks. + +:::tip[Changing machine types using the API] + +You can also change build machine types for all apps owned by a single user or Workspace using the API: [Changing machine types in all apps at the same time](/en/bitrise-ci/api/adding-and-managing-apps/changing-machine-types-in-all-apps-at-the-same-time). + +::: + + + + + + diff --git a/docs/bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines.mdx b/docs/bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines.mdx new file mode 100644 index 0000000..d22dab0 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines.mdx @@ -0,0 +1,47 @@ +--- +title: "Setting your Git credentials on build machines" +description: "If you want to push back any commits to your own Git repo from Bitrise while running your build, you can set up your Git credentials on build machines." +sidebar_position: 8 +slug: /bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +The default Git username and user email address on our stacks are the following: + +``` +git config --global user.email "please-set-your-email@bitrise.io" +git config --global user.name "J. Doe (https://devcenter.bitrise.io/builds/setting-your-git-credentials-on-build-machines/)" +``` + +If you want to push back (`git push`) any commits to your own repo from Bitrise while running your build, you have to set your own username and the email address. There are three ways to achieve this: + +- You can use a custom Script Step to set your credentials with the `git config` command. +- You can set your Git credentials as Env Vars. +- You can use the [**Set Git Credentials**](https://github.com/prosperllc/bitrise-step-set-git-credentials) Step. + +## Setting your Git credentials using Env Vars + +Git has various basic [Environmental Variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables) similar to [Bitrise Env Vars](/en/bitrise-ci/configure-builds/environment-variables.html). If you would like to reduce the amount of Steps in your Workflow, you can set up Env Vars in Bitrise utilizing specific Git Environmental Variables: + +1. Open the Workflow Editor. +1. Go to the **Env Vars** tab. +1. Create the following Env Vars: + + - GIT_AUTHOR_NAME: This is the human-readable name of the “author”. + - GIT_AUTHOR_EMAIL: This is the email address of the "author". + - GIT_COMMITTER_NAME: This is the human-readable name of the “committer”. + - GIT_COMMITTER_EMAIL: This is the email address of the "committer". + + ![git_credentials.png](/img/_paligo/uuid-2b06167e-f54e-eb64-2314-315d36a5d17f.png) + +## Setting your Git credentials using the [Set Git Credentials](https://github.com/prosperllc/bitrise-step-set-git-credentials) Step + +1. Add a [**Set Git Credentials**](https://github.com/prosperllc/bitrise-step-set-git-credentials) Step as the very first step in your workflow. The Step has to come first before you’d `git commit`. This way you can make sure any changes you make to the current build will be attached to a commit associated with your username and email address. +1. In the **Git Username** field, set the value to your own user name. +1. In the **Git Email Address** field, set the value to your own email address. +1. [Start a build.](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html) + +If all went well, you should see the changes in your repository in your Git provider. The new username and email address will be visible for all future commits you push from your builds to your Git provider. diff --git a/docs/bitrise-ci/configure-builds/environment-variables.mdx b/docs/bitrise-ci/configure-builds/environment-variables.mdx new file mode 100644 index 0000000..0071465 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/environment-variables.mdx @@ -0,0 +1,55 @@ +--- +title: "Environment Variables" +description: "An Environment Variable (Env Var) is a key-value pair that holds data that you can use in your builds by inserting them into Step inputs." +sidebar_position: 3 +slug: /bitrise-ci/configure-builds/environment-variables +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingACustomEnvVarWhenStartingABuild from '@site/src/partials/setting-a-custom-env-var-when-starting-a-build.mdx'; +import Partial_UsingEnvVarsInTheValueOfAnEnvVar from '@site/src/partials/using-env-vars-in-the-value-of-an-env-var.mdx'; +import Partial_ExposingEnvVarsAndUsingThemInAnotherStepOrWorkflow from '@site/src/partials/exposing-env-vars-and-using-them-in-another-step-or-workflow.mdx'; +import Partial_ScopeOfEnvironmentVariables from '@site/src/partials/scope-of-environment-variables.mdx'; +import Partial_ReplacingVariablesInInputs from '@site/src/partials/replacing-variables-in-inputs.mdx'; +import Partial_UsingAnEnvVarAsAStepInput from '@site/src/partials/using-an-env-var-as-a-step-input.mdx'; +import Partial_SettingEnvVarsInTheBitriseYml from '@site/src/partials/setting-env-vars-in-the-bitriseyml.mdx'; +import Partial_SettingAnEnvVarInTheWorkflowEditor from '@site/src/partials/setting-an-env-var-in-the-workflow-editor.mdx'; +import Partial_AvailabilityOrderOfEnvironmentVariables from '@site/src/partials/availability-order-of-environment-variables.mdx'; + +An Environment Variable (Env Var) is a key-value pair that holds data that you can use in your builds. For example, working directory of a project's repository is often stored in an Env Var so you don't have to specify the path for every Step input that needs it. + +You can configure Env Vars for an entire project or for specific Pipelines and Workflows. Project level Env Vars are available for every Workflow of the app; Pipeline- and Workflow level Env Vars are only available for the given Pipeline or Workflow. + +:::note[Size limit of the Env Var list] + +By default, the Env Var list size is 120 KB. You can easily increase the list size using a [Script](https://github.com/bitrise-io/steps-script) Step as described in this [Knowledge Base article](https://support.bitrise.io/en/articles/9676692-envman-environment-list-too-large-error). + +::: + +Secrets are a specific type of Environment Variable: they hide their information in an encrypted format and their value is not exposed in the build logs. + +:::warning[Protect confidential information] + +Unlike Secrets, Env Vars are fully exposed in builds triggered by pull requests so you should not add any sensitive information to Env Vars. + +::: + + + + + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/configure-builds/index.md b/docs/bitrise-ci/configure-builds/index.md new file mode 100644 index 0000000..8c46d36 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/index.md @@ -0,0 +1,7 @@ +--- +title: "Configure builds" +sidebar_position: 3 +slug: /bitrise-ci/configure-builds +--- + +Configure builds diff --git a/docs/bitrise-ci/configure-builds/secrets.mdx b/docs/bitrise-ci/configure-builds/secrets.mdx new file mode 100644 index 0000000..b01e579 --- /dev/null +++ b/docs/bitrise-ci/configure-builds/secrets.mdx @@ -0,0 +1,35 @@ +--- +title: "Secrets" +description: "Secrets are a specific type of Environment Variable: they aren't shown in the bitrise.yml and their value is not exposed in the build logs." +sidebar_position: 4 +slug: /bitrise-ci/configure-builds/secrets +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SecretsInSelfHostedEnvironments from '@site/src/partials/secrets-in-self-hosted-environments.mdx'; +import Partial_ManagingSecretsFromACentralLocation from '@site/src/partials/managing-secrets-from-a-central-location.mdx'; +import Partial_RedactingSecrets from '@site/src/partials/redacting-secrets.mdx'; +import Partial_SettingASecret from '@site/src/partials/setting-a-secret.mdx'; +import Partial_EditingASecret from '@site/src/partials/editing-a-secret.mdx'; +import Partial_ExposingASecretToPullRequests from '@site/src/partials/exposing-a-secret-to-pull-requests.mdx'; +import Partial_ProtectingTheValueOfASecret from '@site/src/partials/protecting-the-value-of-a-secret.mdx'; + +Secrets are a specific type of Environment Variable: they hide their information in an encrypted format and their value is not exposed in the build logs. They aren't shown in the `bitrise.yml` configuration either. You can store confidential information, such as passwords or API keys as Secrets. + +Just like Environment Variables, Secrets can be used as the value of a Step input: [Using an Env Var as a Step input](/en/bitrise-ci/configure-builds/environment-variables/using-an-env-var-as-a-step-input) + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/dependencies-and-caching/_category_.json b/docs/bitrise-ci/dependencies-and-caching/_category_.json new file mode 100644 index 0000000..80a7e93 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Dependencies and caching", + "position": 5, + "link": null +} diff --git a/docs/bitrise-ci/dependencies-and-caching/android-dependencies.mdx b/docs/bitrise-ci/dependencies-and-caching/android-dependencies.mdx new file mode 100644 index 0000000..4002ea5 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/android-dependencies.mdx @@ -0,0 +1,57 @@ +--- +title: "Android dependencies" +description: "If you have your Android dependencies defined in your build.gradle file, the dedicated Android Steps on Bitrise can handle installing and even caching them." +sidebar_position: 3 +slug: /bitrise-ci/dependencies-and-caching/android-dependencies +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +The Gradle build system handles dependencies for Android apps. If you have your dependencies defined in your `build.gradle` file, the dedicated Android Steps on Bitrise can handle installing and even caching them. + +## Installing dependencies for Android apps + +Building an Android app with Gradle dependencies is straighforward on Bitrise. When you first [add the app](/en/bitrise-ci/getting-started/adding-a-new-project.html), our project scanner determines that it's an Android app by locating the `build.gradle` file. Our official Android Steps can handle installing dependencies during the build process, and can build different modules and variants easily. + +To make sure all your dependencies will be installed during the build: + +1. [Define dependencies](https://developer.android.com/build/dependencies) in your Android project. +1. Use one of our Android Steps to build your app. The following Steps can install dependencies and build the app: + + - [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build) + - [**Android Build for UI Testing**](https://github.com/bitrise-steplib/bitrise-step-android-build-for-ui-testing) + - [**Gradle Runner**](https://github.com/bitrise-io/steps-gradle-runner) + + Each of these Steps run a Gradle task the same way you would run it on your own device. They can build specific modules and install the relevant dependencies for those modules in the process. + +## Installing missing Android SDK components + +Our build machines come with all the most commonly used Android tools pre-installed. However, if you need additional components of the Android SDK installed, we have a dedicated Step that handles the job for you. + +This Step requires you to have [the Gradle Wrapper](https://docs.gradle.org/current/userguide/gradle_wrapper.html) in your project, as it looks for the ``gradlew` file. It runs the `gradlew dependencies --stacktrace` command to list and install the missing dependencies. + +To install missing Android SDK components in a Bitrise build: + +1. Define the Android SDK components you need in the top level `build.gradle` file of your project. +1. Make sure you have a `gradlew` file in your project's repository. +1. On Bitrise, add the [**Install missing Android SDK components**](https://github.com/bitrise-steplib/steps-install-missing-android-tools) Step to your Workflow. It should be before any Step that requires Android SDK components. +1. In the **gradlew file path** input, set the path to your `gradlew` file, relative to the root of the repository. + + ![install-sdk.png](/img/_paligo/uuid-3138c36f-fad8-3630-46b8-dfd9910807cc.png) +1. If you use the Native Development Kit in your project, set the required version in the **NDK version** input. + + If you don't use NDK, leave the input empty. +1. In the **Additional options for the gradlew dependencies command** input, you can set flags in addition to the default command call. + +## Caching Gradle dependencies + +With key-based caching, you only need the [**Restore Gradle cache**](https://github.com/bitrise-steplib/bitrise-step-restore-gradle-cache) and the [**Save Gradle cache**](https://github.com/bitrise-steplib/bitrise-step-save-gradle-cache) Steps to cache your Gradle dependencies. These Steps require no configuration as they automatically set up the cache keys needed for your dependencies. + +1. Add the [**Restore Gradle cache**](https://github.com/bitrise-steplib/bitrise-step-restore-gradle-cache) Step to your Workflow + + ![restore-gradle.png](/img/_paligo/uuid-527aa0a4-a647-f9e9-7a56-ea38c1366f33.png) + + It should come before any Step that handles dependencies in any way, such as [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build). +1. Add the [**Save Gradle Cache**](https://github.com/bitrise-steplib/bitrise-step-save-gradle-cache) Step to the end of your Workflow. diff --git a/docs/bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview.mdx b/docs/bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview.mdx new file mode 100644 index 0000000..daaf7dd --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview.mdx @@ -0,0 +1,64 @@ +--- +title: "Dependencies and caching overview" +description: "Bitrise offers several dedicated Steps to make sure you can install your dependencies regardless of project type. You can cache dependencies and other build files using both key-based and branch-based caching." +sidebar_position: 1 +slug: /bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview +sidebar_label: About dependencies and caching +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Handling platform and application dependencies is a vital part of development. On Bitrise, we offer several dedicated Steps to make sure you can install your dependencies regardless of project type. + +Dependencies, and just about any other build files, can be cached, too. Bitrise offers several dedicated Steps to make caching as convenient as possible. + +## iOS dependencies + +Install iOS dependencies via our official Xcode Steps which offer built-in dependency management, or use our Steps for the most commonly used third-party dependency managers: [iOS dependencies](/en/bitrise-ci/dependencies-and-caching/ios-dependencies) + +- Use the official Xcode Steps to handle Swift Package Manager dependencies without having to worry about configuring anything outside Xcode: [Managing dependencies with SPM](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm). +- If you use CocoaPods, and have your `Podfile` configured, you can use our [**Run CocoaPods install**](https://github.com/bitrise-io/steps-cocoapods-install) Step to install your pods: [Managing dependencies with CocoaPods](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods). +- If you use Carthage in your project, you can use our [**Carthage**](https://github.com/bitrise-steplib/steps-carthage) Step to install your dependencies: [Managing dependencies with Carthage](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage). + +## Android dependencies + +Our official Android Steps run your Gradle tasks for you in a CI environment. As such, if your dependencies are appropriately configured within your project, they will handle installing them for you: [Android dependencies](/en/bitrise-ci/dependencies-and-caching/android-dependencies). + +## Flutter dependencies + +For Flutter, our [**Flutter Build**](https://github.com/bitrise-steplib/bitrise-step-flutter-build) Step can handle both packages and plugins so you don't need to add any additional Step to install your dependencies: [Flutter dependencies](/en/bitrise-ci/dependencies-and-caching/flutter-dependencies). + +## React Native dependencies + +For React Native, you can install npm packages via either npm or Yarn, as we have official Steps for both package managers. You can also install your native dependencies separately: [React Native dependencies](/en/bitrise-ci/dependencies-and-caching/react-native-dependencies) + +## Caching + +Our caching solution allows you to cache just about any build file you want. You can cache all of your dependencies with barely any configuration as several Steps can automatically collect and cache dependency content. For other build files, the main caching Steps are fully configurable to fit your needs. + +### Key-based caching + +Key-based caching relies on using key-value pairs to identify cache archives. The keys can be dynamically generated so you can ensure, for example, that the archive is only updated if certain files change. You have full control over assigning keys to your cache archives: [Key-based caching](/en/bitrise-ci/dependencies-and-caching/key-based-caching). + +### Caching dependencies + +For key-based caching, we have dedicated Steps for all the most frequently used dependency managers. For branch-based caching, each and every Step handling dependencies is capable of collecting cache content. + +- [Managing dependencies with SPM](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm) +- [Managing dependencies with CocoaPods](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods) +- [Managing dependencies with Carthage](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage) +- [Android dependencies](/en/bitrise-ci/dependencies-and-caching/android-dependencies) +- [Flutter dependencies](/en/bitrise-ci/dependencies-and-caching/flutter-dependencies) +- [React Native dependencies](/en/bitrise-ci/dependencies-and-caching/react-native-dependencies) + +## Bitrise Build Cache + +The Bitrise Build Cache is a custom, hosted implementation for remote caching of certain build systems. You can use the remote cache both locally and in the Bitrise CI environment: in this way your builds will work consistently regardless of the environment and you can save a significant amount of build time. + +Bitrise supports the Bitrise Build Cache for three build systems: + +- [Build Cache for Gradle](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment) +- [Build Cache for Bazel](/en/bitrise-build-cache/getting-started-with-the-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment) +- [Build Cache for Xcode](/en/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.html) diff --git a/docs/bitrise-ci/dependencies-and-caching/flutter-dependencies.mdx b/docs/bitrise-ci/dependencies-and-caching/flutter-dependencies.mdx new file mode 100644 index 0000000..8dac6a4 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/flutter-dependencies.mdx @@ -0,0 +1,82 @@ +--- +title: "Flutter dependencies" +description: "Using the official Bitrise Steps, you can easily install and cache Flutter dependencies, including Dart packages and plugin packages." +sidebar_position: 4 +slug: /bitrise-ci/dependencies-and-caching/flutter-dependencies +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Flutter supports using shared packages as app dependencies. The packages you can use in your app can be divided into two broad types: + +- Dart packages use only Dart code and can contain dependencies, apps, resources, or tests. +- Plugins are a special type of package, containing both native Android or iOS code, as well as Dart code. They make platform functionality available to your Flutter apps. + +Bitrise Steps can handle both types, and we have efficient caching solutions for all Flutter dependencies. + +## Installing dependencies for Flutter apps + +Our [**Flutter Build**](https://github.com/bitrise-steplib/bitrise-step-flutter-build) Step can build both the iOS and Android apps of a Flutter project. The Step runs the `flutter pub get` command to install all dependencies found in your project's `pubspec.yaml` file, including plugin packages. As such, it's really simple to add dependencies to a Flutter app on Bitrise. + +:::tip[Package interdependencies] + +If your app's dependencies include plugin packages that require access to platform-specific APIs, you need to add the appropriate dependency declarations to the platform-specific build files. For example, you might need to declare a Gradle dependency in the `pubspec.yaml` file and in your project's `build.gradle` file as well. + +For more information, check out the official Flutter documentation: [Handling package interdependencies](https://docs.flutter.dev/development/packages-and-plugins/developing-packages#dependencies). + +::: + + + + +1. [Add dependencies](https://docs.flutter.dev/development/packages-and-plugins/using-packages#adding-a-package-dependency-to-an-app) to your Flutter project's `pubspec.yaml` file. +1. On Bitrise, add the [**Flutter Install**](https://github.com/bitrise-steplib/bitrise-step-flutter-installer) Step to your Workflow to install the Flutter SDK. +1. Add the [**Flutter Build**](https://github.com/bitrise-steplib/bitrise-step-flutter-build) Step to your Workflow. + + ![flutter-build-step.png](/img/_paligo/uuid-98bd1fcb-463a-c828-a627-5d3adaf78d32.png) + + The Step can build both the iOS and Android apps of a Flutter project. If your app's repository contains the necessary build files, it will download and install all required dependencies. + + + + +1. [Add dependencies](https://docs.flutter.dev/development/packages-and-plugins/using-packages#adding-a-package-dependency-to-an-app) to your Flutter project's `pubspec.yaml` file. +1. On Bitrise, add the `flutter-install` Step to your Workflow to install the Flutter SDK. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - flutter-installer: + inputs: + - is_update: false + ``` +1. Add the `flutter-build` Step to your Workflow. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - flutter-installer: + inputs: + - is_update: false + - flutter-build: {} + ``` + + The Step can build both the iOS and Android apps of a Flutter project. If your app's repository contains the necessary build files, it will download and install all required dependencies. + + + + +## Caching dependencies for Flutter apps + +With key-based caching, you only need the [**Restore Dart cache**](https://github.com/bitrise-steplib/bitrise-step-restore-dart-cache) and the [**Save Dart cache**](https://github.com/bitrise-steplib/bitrise-step-save-dart-cache) Steps to cache your Dart dependencies. These Steps require no configuration as they automatically set up the cache keys needed for your dependencies. + +1. Add the [**Restore Dart cache**](https://github.com/bitrise-steplib/bitrise-step-restore-dart-cache) Step before the [**Flutter Build**](https://github.com/bitrise-steplib/bitrise-step-flutter-build) Step. + + We also recommend placing it after the [**Flutter Install**](https://github.com/bitrise-steplib/bitrise-step-flutter-installer) Step. + + ![restore-dart-cache.png](/img/_paligo/uuid-48b2ff90-e029-0d70-f0d7-f0b05e989540.png) +1. Add the [**Save Dart cache**](https://github.com/bitrise-steplib/bitrise-step-save-dart-cache) Step to the end of your Workflow. diff --git a/docs/bitrise-ci/dependencies-and-caching/index.md b/docs/bitrise-ci/dependencies-and-caching/index.md new file mode 100644 index 0000000..96bb102 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/index.md @@ -0,0 +1,7 @@ +--- +title: "Dependencies and caching" +sidebar_position: 5 +slug: /bitrise-ci/dependencies-and-caching +--- + +Dependencies and caching diff --git a/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/_category_.json b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/_category_.json new file mode 100644 index 0000000..32ba3b5 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "iOS dependencies", + "position": 2, + "description": "You can manage iOS dependencies either via SPM or by a third-party package manager such as CocoaPods or Carthage.", + "link": { + "type": "doc", + "id": "bitrise-ci/dependencies-and-caching/ios-dependencies/index" + } +} diff --git a/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/index.md b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/index.md new file mode 100644 index 0000000..bad03e0 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/index.md @@ -0,0 +1,13 @@ +--- +title: "iOS dependencies" +description: "You can manage iOS dependencies either via SPM or by a third-party package manager such as CocoaPods or Carthage." +sidebar_position: 2 +slug: /bitrise-ci/dependencies-and-caching/ios-dependencies +--- + +There are two main ways to handle dependencies for iOS apps: + +- Using the [Swift Package Manager](https://developer.apple.com/documentation/xcode/swift-packages) which is built into Xcode. +- Using a third-party dependency manager, such as [Carthage](https://github.com/Carthage/Carthage) or [CocoaPods](https://cocoapods.org/). + +Bitrise allows you to use either method. diff --git a/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage.mdx b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage.mdx new file mode 100644 index 0000000..7e45d95 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage.mdx @@ -0,0 +1,101 @@ +--- +title: "Managing dependencies with Carthage" +description: "You can use Bitrise's official Carthage Steps to install and cache your iOS dependencies. Carthage doesn't alter your Xcode project in any way and managing it requires very little configuration on Bitrise." +sidebar_position: 3 +slug: /bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +[Carthage](https://github.com/Carthage/Carthage) is a dependency manager for iOS and macOS. It's a decentralized dependency manager that doesn't alter your Xcode project in any way. You can use it on Bitrise, too, to handle dependencies for your iOS apps. + +## Installing Carthage dependencies + +To install your dependencies with Carthage: + + + + +1. Make sure you have a [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile) included in your project. +1. Add the **Carthage** Step to your Workflow. + + It should come after any Step that pulls from the cache. If you don't have any caching Steps, add the Step right after the **Git Clone** Step. +1. In the **Carthage command to run** input, select the command you wish to run. + + ![carthage-command.png](/img/_paligo/uuid-71148b6a-fbf8-6a5f-5423-a5ac2817e866.png) + + The default value is `bootstrap`. + + For a list of available commands, run `carthage help` on a device with Carthage installed. +1. You can add options to the Carthage call in the **Additional options for carthage command** input. + + For example, the `--platform ios` flag ensures that only the iOS version of frameworks will be installed. + + + + +1. Make sure you have a [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile) included in your project. +1. Add the `carthage` Step to your Workflow. + + It should come after any Step that pulls from the cache. If you don't have any caching Steps, add the Step right after the `git-clone` Step. + + ```yml + my-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - restore-carthage-cache: {} + - carthage: + - save-carthage-cache: {} + ``` +1. In the `carthage_command` input, select the command you wish to run. + + The default value is `bootstrap`. + + For a list of available commands, run `carthage help` on a device with Carthage installed. + + ```yml + my-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - restore-carthage-cache: {} + - carthage: + - save-carthage-cache: {} + inputs: + - carthage_command: bootstrap + - save-carthage-cache: {} + ``` +1. You can add options to the Carthage call in the `carthage_options` input. + + For example, the `--platform ios` flag ensures that only the iOS version of frameworks will be installed. + + ```yml + my-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - restore-carthage-cache: {} + - carthage: + - save-carthage-cache: {} + inputs: + - carthage_command: bootstrap + - carthage_options: "--platform ios" + - save-carthage-cache: {} + ``` + + + + +## Caching Carthage dependencies + +With key-based caching, you only need the [**Restore Carthage cache**](https://github.com/bitrise-steplib/bitrise-step-restore-carthage-cache) and the [**Save Carthage cache**](https://github.com/bitrise-steplib/bitrise-step-save-carthage-cache) Steps to cache your dependencies. These Steps require no configuration as they automatically set up the cache keys and cache paths. + +1. Add the [**Restore Carthage cache**](https://github.com/bitrise-steplib/bitrise-step-restore-carthage-cache) Step to your Workflow + + ![carthage-command.png](/img/_paligo/uuid-71148b6a-fbf8-6a5f-5423-a5ac2817e866.png) + + It should come before the [**Carthage**](https://github.com/bitrise-steplib/steps-carthage) Step or any Step that needs dependencies to build your app, such as [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive). +1. Add the [**Save Carthage cache**](https://github.com/bitrise-steplib/bitrise-step-save-carthage-cache) Step to the end of your Workflow. diff --git a/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods.mdx b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods.mdx new file mode 100644 index 0000000..51fa7e2 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods.mdx @@ -0,0 +1,110 @@ +--- +title: "Managing dependencies with CocoaPods" +description: "With the Run CocoaPods install Step, you can easily install CocoaPods dependencies on Bitrise. You just need a Podfile and the Step. Bitrise also offers dedicated Steps to cache your pods." +sidebar_position: 2 +slug: /bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +[CocoaPods](https://cocoapods.org/) is a dependency manager for Swift and Objective-C Cocoa projects. An iOS app with CocoaPods dependencies needs to have a `Podfile` with a number of pods listed in it: these pods are installed during the process of building the app. + +You can, of course, easily install CocoaPods dependencies during a Bitrise build. You just need our dedicated Step: **[Run CocoaPods Install](https://github.com/bitrise-io/steps-cocoapods-install)**. The Step can run both `pod install` and `pod update` commands. + +## Installing CocoaPods dependencies + +To install your dependencies with CocoaPods: + + + + +1. If you need a specific version of CocoaPods, make sure you define it either in the `Gemfile` or the `Podfile`. + + The Step first looks for the `cocoapods` gem in the `Gemfile`. If there's no `cocoapods` gem, the Step uses the CocoaPods version defined in the `Podfile`. If the version is not defined there either, the preinstalled system version will be used which you can check in the [system reports](https://github.com/bitrise-io/bitrise.io/tree/master/system_reports/MACOS). +1. Make sure that the Xcode Step building your app uses your `.xcworkspace` file: the **Project path** input of the Step should point to the path of `.xcworkspace`. +1. Add the [**Run CocoaPods Install**](https://github.com/bitrise-io/steps-cocoapods-install) Step to your Workflow. + + It should come after any Step that pulls [from the build cache](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache). If you don't have any caching Steps, add the Step right after the **Git Clone** Step. +1. In the **CocoaPods command** input, select the command you wish to run. + + **install**: Installs the version specified in the `Podfile` for each pod. + + **update**: Installs the latest version for each pod listed in the `Podfile`. + + ![pod-install.png](/img/_paligo/uuid-92405804-e42c-f788-4026-7339492f1113.png) +1. Optionally, you can specify a path to your `Podfile` in the **Podfile path** input. + + This is not mandatory: if you leave the input empty, the Step performs a recursive search in the root directory of your app, and uses the first `Podfile` it finds. + + + + +1. If you need a specific version of CocoaPods, make sure you define it either in the `Gemfile` or the `Podfile`. + + The Step first looks for the `cocoapods` gem in the `Gemfile`. If there's no `cocoapods` gem, the Step uses the CocoaPods version defined in the `Podfile`. If the version is not defined there either, the preinstalled system version will be used which you can check in the [stack reports](https://stacks.bitrise.io/stack_reports/). +1. Make sure that the Xcode Step building your app uses your `.xcworkspace` file: the `project_path` input of the Step should point to the path of `.xcworkspace`. +1. Add the `cocoapods-install` Step to your Workflow. + + It should come after any Step that pulls [from the build cache](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache). If you don't have any caching Steps, add the Step right after the `git-clone` Step. + + ```yml + my-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - restore-cocoapods-cache: {} + - cocoapods-install: + is_always_run: true + - save-cocoapods-cache: {} + ``` +1. In the `command` input, select the command you wish to run. + + **install**: Installs the version specified in the `Podfile` for each pod. + + **update**: Installs the latest version for each pod listed in the `Podfile`. + + ```yml + my-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - restore-cocoapods-cache: {} + - cocoapods-install: + is_always_run: true + inputs: + - command: update + - save-cocoapods-cache: {} + ``` +1. Optionally, you can specify a path to your `Podfile` in the `podfile_path` input. + + ```yml + my-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - restore-cocoapods-cache: {} + - cocoapods-install: + is_always_run: true + inputs: + - command: update + - podfile_path: ./path/to/podfile/ + - save-cocoapods-cache: {} + ``` + + This is not mandatory: if you leave the input empty, the Step performs a recursive search in the root directory of your app, and uses the first `Podfile` it finds. + + + + +## Caching CocoaPods dependencies + +With key-based caching, you only need the [**Restore CocoaPods cache**](https://github.com/bitrise-steplib/bitrise-step-restore-cocoapods-cache) and the [**Save CocoaPods cache**](https://github.com/bitrise-steplib/bitrise-step-save-cocoapods-cache) Steps to cache your pods. These Steps require no configuration as they automatically set up the cache keys needed for your dependencies. + +1. Add the [**Restore CocoaPods cache**](https://github.com/bitrise-steplib/bitrise-step-restore-cocoapods-cache) Step to your Workflow + + It should come before the [**Run CocoaPods install**](https://github.com/bitrise-io/steps-cocoapods-install) Step or any Step that needs dependencies to build your app, such as [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive). + + ![restore-pods.png](/img/_paligo/uuid-3305dee6-a952-5073-e44b-02fd8c3925c1.png) +1. Add the [**Save CocoaPods cache**](https://github.com/bitrise-steplib/bitrise-step-save-cocoapods-cache) Step to the end of your Workflow. diff --git a/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm.mdx b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm.mdx new file mode 100644 index 0000000..4cdf731 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm.mdx @@ -0,0 +1,39 @@ +--- +title: "Managing dependencies with SPM" +description: "On Bitrise, every Xcode Step can handle Swift package dependencies without any extra configuration. You can install and cache SPM packages easily." +sidebar_position: 1 +slug: /bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Swift packages are reusable components of Swift, Objective-C, Objective-C++, C, or C++ code that developers can use in their projects. Xcode uses the built-in Swift Package Manager (SPM) to support creating and publishing Swift packages and managing package dependencies. + +On Bitrise, every Xcode Step can handle Swift package dependencies without any extra configuration. For example, if you wish to build an iOS app to deploy it to the App Store, the [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive) Step will handle installing Swift dependencies to your app. + +## Installing Swift packages + +You can easily install Swift packages for your iOS apps during a Bitrise build: + +1. Make sure you have correctly configured your Swift packages in Xcode. +1. Add one of our official Xcode Steps to your Workflow. The available Steps are: + + - [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive) + - [**Xcode Test for iOS**](https://github.com/bitrise-steplib/steps-xcode-test) + - **Xcode Build for testing** + - [**Xcode Build for Simulator**](https://github.com/bitrise-steplib/steps-xcode-build-for-simulator) + + Any of these Steps can handle the Swift package dependencies. + +## Caching Swift packages + +With key-based caching, you only need the [**Restore SPM cache**](https://github.com/bitrise-steplib/bitrise-step-restore-spm-cache) and the [**Save SPM cache**](https://github.com/bitrise-steplib/bitrise-step-save-spm-cache) Steps to cache your Swift packages. These Steps require no configuration as they automatically set up the cache keys needed for your dependencies. + +1. Add the [**Restore SPM cache**](https://github.com/bitrise-steplib/bitrise-step-restore-spm-cache) Step to your Workflow + + ![restore_spm-cache.png](/img/_paligo/uuid-e51ea807-fef9-bfc9-8666-2092740c7a52.png) + + It should come before any Step that handles SPM packages in any way, such as [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive). +1. Add the [**Save SPM cache**](https://github.com/bitrise-steplib/bitrise-step-save-spm-cache) Step to the end of your Workflow. diff --git a/docs/bitrise-ci/dependencies-and-caching/key-based-caching/_category_.json b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/_category_.json new file mode 100644 index 0000000..764a11c --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Key-based caching", + "position": 6, + "description": "Key-based caching on Bitrise works by associating cache archives with a key. A Workflow can restore a cache archive by referring to the key; the build files can be saved into the cache archive that the key indicates.", + "link": { + "type": "doc", + "id": "bitrise-ci/dependencies-and-caching/key-based-caching/index" + } +} diff --git a/docs/bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives.mdx b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives.mdx new file mode 100644 index 0000000..3919a58 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives.mdx @@ -0,0 +1,34 @@ +--- +title: "Accessing key-based cache archives" +description: "You can access your cache archives on the Bitrise website in the App settings section: you can download the contents, copy the cache keys, and delete the archives." +sidebar_position: 3 +slug: /bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives +sidebar_label: Accessing key-based cache archives on the website +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +You can access your cache archives separately, without running a build. This allows you to keep track of several things: + +- What cache keys are associated with different cache archives. +- How much storage space is taken up by your cache archives. +- When each cache archive is due to expire. + +In addition, you can download any cache archive - if it hasn't expired yet -, you can copy the cache keys, and you can delete archives. + +To access your archives: + +1. +1. On the left side, select **Builds**. +1. Scroll down to the **Manage build caches** section. +1. Select the **Key-based caching** tab. + + ![manage-key-based-caching.png](/img/_paligo/uuid-f98768da-d01e-4c46-d399-7e1d614a023e.png) +1. You can: + + - Copy the cache key by clicking the **Copy key** icon. + - Downloading the cache archive by clicking the **Download** icon. + - Deleting the cache archive by clicking **Delete** icon. diff --git a/docs/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.mdx b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.mdx new file mode 100644 index 0000000..203445b --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.mdx @@ -0,0 +1,25 @@ +--- +title: "Dedicated caching Steps for dependency managers" +description: "Bitrise's dedicated caching Steps store their archives in the same storage space as the **Save cache** and **Restore cache** Steps but unlike those two, they automatically set up the appropriate cache paths and cache keys and as such, they require no configuration." +sidebar_position: 2 +slug: /bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Key-based caching is powerful and flexible: you can use the [**Save cache**](https://github.com/bitrise-steplib/bitrise-step-save-cache) and [**Restore cache**](https://github.com/bitrise-steplib/bitrise-step-restore-cache) Steps with any project, regardless of platform or the type of data you want to cache. However, these Steps require careful configuration and it is possible to make mistakes. If you are looking for a simple solution to cache dependencies of the most frequently used dependency managers, we offer dedicated Steps that require no configuration whatsoever. + +The dedicated caching Steps store their archives in the same storage space as the [**Save cache**](https://github.com/bitrise-steplib/bitrise-step-save-cache) and [**Restore cache**](https://github.com/bitrise-steplib/bitrise-step-restore-cache) Steps but unlike those two, they automatically set up the appropriate cache paths and cache keys. + +The following dedicated Steps are available: + +- [**Save Cocoapods Cache**](https://github.com/bitrise-steplib/bitrise-step-save-cocoapods-cache) and [**Restore Cocoapods Cache**](https://github.com/bitrise-steplib/bitrise-step-restore-cocoapods-cache): [Managing dependencies with CocoaPods](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods). +- [**Save SPM Cache**](https://github.com/bitrise-steplib/bitrise-step-save-spm-cache) and [**Restore SPM Cache**](https://github.com/bitrise-steplib/bitrise-step-restore-spm-cache): [Managing dependencies with SPM](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm). +- [**Save NPM Cache**](https://github.com/bitrise-steplib/bitrise-step-save-npm-cache) and [**Restore NPM Cache**](https://github.com/bitrise-steplib/bitrise-step-restore-npm-cache): [React Native dependencies](/en/bitrise-ci/dependencies-and-caching/react-native-dependencies). +- [**Save Gradle Cache**](https://github.com/bitrise-steplib/bitrise-step-save-gradle-cache) and [**Restore Gradle Cache**](https://github.com/bitrise-steplib/bitrise-step-restore-gradle-cache): [Android dependencies](/en/bitrise-ci/dependencies-and-caching/android-dependencies). +- [**Save Carthage Cache**](https://github.com/bitrise-steplib/bitrise-step-save-carthage-cache) and [**Restore Carthage Cache**](https://github.com/bitrise-steplib/bitrise-step-restore-carthage-cache): [Managing dependencies with Carthage](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage). +- [**Save Dart Cache**](https://github.com/bitrise-steplib/bitrise-step-save-dart-cache) and [**Restore Dart Cache**](https://github.com/bitrise-steplib/bitrise-step-restore-dart-cache): [Flutter dependencies](/en/bitrise-ci/dependencies-and-caching/flutter-dependencies). + +To use these Steps, simply add the Restore version to the start of your Workflow and the Save version to the end of your Workflow. No other configuration is needed. diff --git a/docs/bitrise-ci/dependencies-and-caching/key-based-caching/index.mdx b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/index.mdx new file mode 100644 index 0000000..8d78eb3 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/index.mdx @@ -0,0 +1,16 @@ +--- +title: "Key-based caching" +description: "Key-based caching on Bitrise works by associating cache archives with a key. A Workflow can restore a cache archive by referring to the key; the build files can be saved into the cache archive that the key indicates." +sidebar_position: 6 +slug: /bitrise-ci/dependencies-and-caching/key-based-caching +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Key-based caching works by associating cache archives with a key. A Workflow can restore a cache archive by referring to the key; at the end of the Workflow, the build files can be saved into the cache archive that the key indicates. This overwrites the cache archive. + +Cache keys can contain variables and other dynamic elements that are replaced at runtime. Users can set up caching that periodically creates new cache archives and automatically discard the old archives. + +A new cache archive is valid for seven days after creation. If the archive is updated, the timer restarts. If an archive is not updated for seven days, it is automatically discarded. diff --git a/docs/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching.mdx b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching.mdx new file mode 100644 index 0000000..fb2d2b7 --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching.mdx @@ -0,0 +1,118 @@ +--- +title: "Using key-based caching" +description: "Key-based caching requires defining a key that identifies a cache archive. A key can be static or dynamically generated, and you can use templates in your keys. There are dedicated key-based caching Steps for dependency managers that require no configuration." +sidebar_position: 1 +slug: /bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching +sidebar_label: Using key-based caching in your builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_KeyMatchingForCacheArchives from '@site/src/partials/key-matching-for-cache-archives.mdx'; +import Partial_KeyBasedCachingTemplatesAndFunctions from '@site/src/partials/key-based-caching-templates-and-functions.mdx'; +import Partial_ConditionalCaching from '@site/src/partials/conditional-caching.mdx'; + +Key-based caching requires two Steps that must be used together: + +- [**Save Cache**](https://github.com/bitrise-steplib/bitrise-step-save-cache): saves the build files into a cache archive, identified by a key. +- [**Restore Cache**](https://github.com/bitrise-steplib/bitrise-step-restore-cache): restores build files into a cache archive, identified by a key. + +:::note[Dedicated key-based caching Steps] + +You can use dedicated key-based caching Steps, such as the [Save NPM Cache](https://github.com/bitrise-steplib/bitrise-step-save-npm-cache), to cache npm or yarn dependencies. + +For a full list of dedicated key-based caching Steps, check out [Dedicated caching Steps for dependency managers](/en/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers). + +::: + +Both Steps access cache archives via key strings. These keys need to be specified as the values of the **Cache keys** [Step input](/en/bitrise-ci/workflows-and-pipelines/steps/step-inputs.html); each key identifies a separate cache archive. + +## Cache retention and eviction policy + +Your cache entries are retained for seven days since the last use. If they're not used in your workflows for a continuous period of seven days, they will be automatically removed. + +If you run out of your cache storage allowance, the Least Recently Used (LRU) cache entries on your app will be replaced with any new ones produced. LRU is a cache replacement algorithm that removes the least recently used data in order to make room for new data. This might mean that your cache hit rate could reduce if the replaced cache entries are needed by any Workflows. We recommend upgrading to [a higher plan](http://www.bitrise.io/pricing) to get more storage so that you don't lose any cache entries that might be needed by your Workflows. + +## Creating a new cache archive + +1. Add the [**Save Cache**](https://github.com/bitrise-steplib/bitrise-step-save-cache) Step at the end of your Workflow. +1. In the **Cache key** input, define a cache key. This key will be used to identify the cache archive. + + :::important[Key limitations] + + The maximum length of a cache key is 512 characters (longer keys get truncated). Commas (,) are not allowed in keys. + + ::: + + You can use [templates and functions](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/key-based-caching-templates-and-functions) to create dynamic keys that change depending on the build environment or other factors. + + You can specify multiple keys; the Step will evaluate them in order and match the first one. Read more: [Key matching for cache archives](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/key-matching-for-cache-archives). + + :::tip[Conditional caching with dynamic keys] + + You can configure the Step in a way that allows it to automatically skip archiving and uploading the cache if its content has not changed during the build: [Conditional caching](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/conditional-caching). + + ::: + + **Creating a new cache archive with a key referring to the OS** + + In this example, we're creating a cache archive with a key that refers to the type of the operating system of the build machine. + + ``` + - save-cache@1: + inputs: + - key: |- + npm-cache-{{ .OS }} + ``` +1. In the **Paths to cache** input, define the files and folders that you want to cache. + + The input allows for wildcards: `*` and `**`. The input value is evaluated at runtime. + + :::caution[Archive size limit] + + The size of a single cache archive cannot exceed 15 GB. + + ::: + + **Caching all files and folders recursively in the node_modules folder** + + ``` + - save-cache@1: + inputs: + - key: |- + npm-cache-{{ .OS }} + - paths: node_modules/ + ``` + +Once a cache archive has been created, you can access it on the **App Settings** page: [Accessing key-based cache archives](/en/bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives). + +## Restoring an existing cache archive + +1. Add the [**Restore Cache**](https://github.com/bitrise-steplib/bitrise-step-restore-cache) Step at the start of your Workflow. +1. In the **Cache key** input, type the key of the cache that you want to restore. + + You can use [templates and functions](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/key-based-caching-templates-and-functions) to create dynamic keys that change depending on the build environment or other factors. + + You can specify multiple keys; the Step will evaluate them in order and select the first matching one. Read more: [Key matching for cache archives](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/key-matching-for-cache-archives). + + **Restoring a cache archive from one of two keys** + + In this example, we're restoring one of two keys: + + - First, we'll look for a cache archive with a key that includes the name of the current Workflow. For example, if the current Workflow's name is `primary`, the Step will look for an archive with the key `npm-cache-primary`. + - Second, we'll look for an archive with a key that includes the name of the current branch. For example, if the current branch's name is `main`, the Step will look for an archive with the key `npm-cache-main`. + + ``` + - restore-cache@1: + inputs: + - key: |- + npm-cache-{{ .Workflow }} + npm-cache-{{ .Branch }} + ``` + + + + + + diff --git a/docs/bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching.mdx b/docs/bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching.mdx new file mode 100644 index 0000000..ca2e02f --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching.mdx @@ -0,0 +1,22 @@ +--- +title: "Migrating from branch-based caching to key-based caching" +description: "As of May 2025, Bitrise is starting to deprecate its branch-based caching in favor of the more efficient and flexible [key-based caching system](/en/bitrise-ci/dependencies-and-caching/key-based-caching.html)." +sidebar_position: 7 +slug: /bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ReplacingCachingSteps from '@site/src/partials/replacing-caching-steps.mdx'; +import Partial_DifferencesBetweenCachingSystems from '@site/src/partials/differences-between-caching-systems.mdx'; + +Branch-based caching is a legacy technology that is no longer supported by Bitrise. Use the more efficient and flexible Key-based caching. + +If your builds are using smaller cache archives than 15 GB then the branch-based caching Steps will keep working but we still recommend migrating the key-based caching as it results in better caching performance in almost all cases. + +This guide will help you transition your projects to the key-based caching infrastructure. + + + + diff --git a/docs/bitrise-ci/dependencies-and-caching/react-native-dependencies.mdx b/docs/bitrise-ci/dependencies-and-caching/react-native-dependencies.mdx new file mode 100644 index 0000000..b80966f --- /dev/null +++ b/docs/bitrise-ci/dependencies-and-caching/react-native-dependencies.mdx @@ -0,0 +1,73 @@ +--- +title: "React Native dependencies" +description: "You can use both npm and Yarn to install Javascript package dependencies for React Native app on Bitrise. Bitrise also offers dedicated Steps to cache these dependencies." +sidebar_position: 5 +slug: /bitrise-ci/dependencies-and-caching/react-native-dependencies +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +[npm](https://docs.npmjs.com/) and [Yarn](https://yarnpkg.com/) are both package managers for Node.js. They can manage the dependencies of a project, or globally installed Javascript tools. For mobile development, they are frequently used as package managers for React Native projects. If you have a React Native app on Bitrise, you can use our dedicated npm or Yarn Steps to install and cache your dependencies. + +You can also install native dependencies by using the dedicated Steps: [see topic](#section-idm4593899820200033631167468577). + +## Installing dependencies with npm and Yarn + + + + +1. Make sure your project has [a package.json file](https://docs.npmjs.com/creating-a-package-json-file) defined in it. +1. Add the [**Run npm command**](https://github.com/bitrise-steplib/steps-npm) Step to your Workflow. +1. Set the **The npm command with arguments to run** to `install`. + + You can add additional options to the `install` command. For example, if you need to [link a library with native dependencies to your React Native project](https://docs.flutter.dev/development/packages-and-plugins/developing-packages#dependencies), use the `--save` or `--save-dev` flag. For the available options, see the [npm documentation](https://docs.npmjs.com/cli/v9/commands/npm-install). + + ![run-npm-command.png](/img/_paligo/uuid-676b848d-85db-ff48-883e-6ca489d799d3.png) +1. Optionally, you can set [the npm version](https://www.npmjs.com/package/npm?activeTab=versions) that will run the `npm install` command in the **Version of npm to use** input. + + + + +1. Make sure your project has [a package.json file](https://docs.npmjs.com/creating-a-package-json-file) defined in it. +1. Add the [**Run yarn command**](https://github.com/bitrise-community/steps-yarn) Step to your Workflow. +1. Set the **Yarn command to run** to `install`. +1. Optionally, add arguments to the yarn command in the **Arguments for running yarn commands**. + + You can specify multiple arguments, separated by a space. + + + + +## Caching npm and Yarn dependencies + +With key-based caching, you only need the [**Restore NPM cache**](https://github.com/bitrise-steplib/bitrise-step-restore-npm-cache) and the [**Save NPM cache**](https://github.com/bitrise-steplib/bitrise-step-save-npm-cache) Steps to cache your node modules. These Steps require no configuration as they automatically set up the cache keys needed for your dependencies. + +1. Add the [**Restore NPM cache**](https://github.com/bitrise-steplib/bitrise-step-restore-npm-cache) Step to the start of your Workflow. + + ![restore-npm-cache.png](/img/_paligo/uuid-68fb84b2-a10a-f7b9-f1e3-7ab0accbae3a.png) +1. Add the [**Save NPM cache**](https://github.com/bitrise-steplib/bitrise-step-save-npm-cache) Step to the end of your Workflow. + +## Installing native dependencies for a React Native app + +You might need to install native dependencies that are declared in the `ios` and `android` folders. For example, CocoaPods dependencies defined in a `Podfile`. You can do this quite easily on Bitrise, too: once you bundle your React Native app to be ready to build the Android and iOS binaries, you can simply use the dependency manager Steps for Android and iOS apps. + +:::tip[Demo app] + +Check out our React Native demo app for a working example. If you add the app to Bitrise, you can see that the **deploy-ios-release** Workflow, for example, contains both the [**Run npm command**](https://github.com/bitrise-steplib/steps-npm) and the [**Run CocoaPods install**](https://github.com/bitrise-io/steps-cocoapods-install) Steps, to install both npm packages and pods: [React Native demo app](https://github.com/bitrise-io/react-native-demo-app). + +::: + +1. Make sure your Workflow installs your npm packages: [see topic](#section-idm4494876304081633627858529405). + + You can have a separate Workflow that is only responsible for installing npm packages, and it's inserted to run before your main Workflow: [Chaining Workflows together](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together). It can be a [utility Workflow](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/utility-workflows). +1. Add the [**React Native Bundle**](https://github.com/bitrise-steplib/steps-react-native-bundle) Step to your Workflow. + + It must come after the npm packages are installed. +1. Add the required dependency manager Steps or build Steps to the Workflow. The exact Steps you need depend on the project type and the dependency manager you use: + + - [Android dependencies](/en/bitrise-ci/dependencies-and-caching/android-dependencies) + - [Managing dependencies with SPM](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm) + - [Managing dependencies with CocoaPods](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods) + - [Managing dependencies with Carthage](/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage) diff --git a/docs/bitrise-ci/deploying/_category_.json b/docs/bitrise-ci/deploying/_category_.json new file mode 100644 index 0000000..0cc6df7 --- /dev/null +++ b/docs/bitrise-ci/deploying/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Deploying", + "position": 8, + "link": null +} diff --git a/docs/bitrise-ci/deploying/android-deployment/_category_.json b/docs/bitrise-ci/deploying/android-deployment/_category_.json new file mode 100644 index 0000000..d47fab2 --- /dev/null +++ b/docs/bitrise-ci/deploying/android-deployment/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Android deployment", + "position": 1, + "link": null +} diff --git a/docs/bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play.mdx b/docs/bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play.mdx new file mode 100644 index 0000000..b751604 --- /dev/null +++ b/docs/bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play.mdx @@ -0,0 +1,31 @@ +--- +title: "Deploying Android apps to Bitrise and Google Play" +description: "You can deploy your Android apps to Bitrise or to Google Play by using our dedicated Steps and correctly configuring your project in Google Play Console." +sidebar_position: 1 +slug: /bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingUpGooglePlayAPIAccess from '@site/src/partials/setting-up-google-play-api-access.mdx'; +import Partial_DeployingAnAndroidAppToBitriseIo from '@site/src/partials/deploying-an-android-app-to-bitriseio.mdx'; +import Partial_DeployingToGooglePlay from '@site/src/partials/deploying-to-google-play.mdx'; +import Partial_SettingUpGooglePlayDeploymentForTheFirstTime from '@site/src/partials/setting-up-google-play-deployment-for-the-first-time.mdx'; + +This guide describes how you can add your Android project to [bitrise.io](https://www.bitrise.io) and deploy the APK or AAB built from your project to [Google Play Store](https://play.google.com/store). + +You need a new service account created in the Google Play Console so that Bitrise can authenticate with [Google Play Deploy](https://github.com/bitrise-io/steps-google-play-deploy) during your build. The new service account has to be invited to Google Play Console as a user with the appropriate permission. + +To set up your project for the first time: + +1. Register a [Google Play Developer Account](https://developer.android.com/distribute/console/). If you already have a Google Play Developer account, and have already deployed your app to Google Play Store, skip to [see topic](#UUID-055cf6ac-7b7e-3f19-38d5-c7a1a6746a03). +1. Go through [see topic](#UUID-f154a82d-18a9-6953-d054-ccd152cfa76c). + + + + + + + + diff --git a/docs/bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery.mdx b/docs/bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery.mdx new file mode 100644 index 0000000..3e6394e --- /dev/null +++ b/docs/bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery.mdx @@ -0,0 +1,73 @@ +--- +title: "Deploying apps to Huawei AppGallery" +description: "You can deploy your Android apps to Huawei AppGallery via a verified Bitrise Step called Deploy to Huawei App Gallery. The Step can be used to deploy any APK file that you build on Bitrise." +sidebar_position: 2 +slug: /bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +You can deploy your Android apps to [Huawei AppGallery](https://appgallery.huawei.com/) via a verified Bitrise Step called [**Deploy to Huawei App Gallery**](https://github.com/FutureMind/bitrise-step-huawei-app-gallery-apk-distribution). The Step can be used to deploy any APK file that you build on Bitrise. + +The Step will need: + +- The App ID of the app. +- The Client ID of the API client. +- The Key generated for the API client. + +To successfully deploy your app to Huawei AppGallery, you need a Workflow that: + +- Builds and signs an APK or AAB file. +- Includes the [**Deploy to Huawei App Gallery**](https://github.com/FutureMind/bitrise-step-huawei-app-gallery-apk-distribution) Step to deploy the app. + +To configure deploying with the **Deploy to Huawei App Gallery Step**: + +1. [Manually upload the first APK of the app to Huawei AppGallery using the website interface on AppGallery Connect.](https://developer.huawei.com/consumer/en/doc/distribution/app/agc-create_app) +1. [Create a team-level API client on AppGallery Connect](https://developer.huawei.com/consumer/en/doc/distribution/app/appgallerykit-createapiclient). + + ![huawei_api.png](/img/_paligo/uuid-e444bc09-0aed-9c9d-6ebb-8531a391fb75.png) +1. Open the Workflow Editor on Bitrise. +1. Go to the Workflow that you want to use for deploying the app. +1. Add the [**Deploy to Huawei App Gallery**](https://github.com/FutureMind/bitrise-step-huawei-app-gallery-apk-distribution) Step after the Steps that build and sign your APK. + + ![huawei_step.png](/img/_paligo/uuid-f1bdccd2-c501-e9ae-ace8-61c3c7e82a9b.png) +1. Open the **Config** input group. +1. Fill in the required inputs. + + - **File path**: If you used a Step that automatically exports the `BITRISE_APK_PATH` Environment Variable after building your APK, leave this unchanged. The [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build) Step is such a Step, for example. + - **File name**: The unique name of the APK file. This name will be used when uploading to the AppGallery Connect. + - **App ID**: The identified can be found in the **App information** section on AppGallery Connect. + - **Client ID**: The API client ID generated on AppGallery Connect. + - **Key**: The key generated with the API client on AppGallery connect. + +Take a look at the following bitrise.yml file to see an example configuration that uses the **Deploy to Huawei AppGallery** Step to deploy an app. + +``` +workflows: + deploy: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@4: {} + - cache-pull@2: {} + - install-missing-android-tools@2: + inputs: + - gradlew_path: "$PROJECT_LOCATION/gradlew" + - gradle-runner@1.9: + inputs: + - gradle_file: "$GRADLE_BUILD_FILE_PATH" + - gradle_task: assembleRelease + - gradlew_path: "$GRADLEW_PATH" + - sign-apk@1.7: {} + - deploy-to-bitrise-io@1: {} + - cache-push@2: {} + - appgallery-deploy@0: + inputs: + - huawei_client_id: 'XXX' + - huawei_client_secret: "$CLIENT_SECRET" + - huawei_app_id: 'YYY' +``` + +Run a build! If all goes well, you should see your app on Huawei AppGallery. diff --git a/docs/bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab.mdx b/docs/bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab.mdx new file mode 100644 index 0000000..b6595ee --- /dev/null +++ b/docs/bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab.mdx @@ -0,0 +1,106 @@ +--- +title: "Exporting a universal APK from an AAB" +description: "With Bitrise's Export Universal APK Step you can export a universal APK from the App Bundle, sign it with a keystore (or debug keystore), and deploy the APK to your test device before releasing the app to the Google Play Store." +sidebar_position: 5 +slug: /bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +You can test an Android app on a test device even if the generated artifact is an App Bundle (`.aab`). With the [**Export Universal APK**](https://github.com/bitrise-steplib/bitrise-step-export-universal-apk) Step you can export a universal APK from the App Bundle, sign it with a keystore (or debug keystore), and deploy the APK to your test device before releasing the app to the Google Play Store. + +To configure this Step: + +Workflow Editor + +Configuration YAML + +1. Insert the [**Export Universal APK**](https://github.com/bitrise-steplib/bitrise-step-export-universal-apk) Step after the [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build) Step in your Workflow. +1. Make sure the **Android App Bundle path** input's value is the output variable (BITRISE_AAB_PATH) of the previous build Step. + + :::note[Using a different build Step] + + If you don't use the [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build) Step to build an AAB file, make sure that the input points to the AAB output of the Step you used. You can use an [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html), or a direct local path or URL. + + ::: +1. Make sure the **Keystore URL** input points to your Android keystore file. + + We recommend uploading the file to Bitrise and using the default Env Var: $BITRISEIO_ANDROID_KEYSTORE_URL. You can, however, use a local path or a URL as input value here. +1. Provide your credentials in the **Keystore alias** and the **Keystore password** inputs. + + If you uploaded a keystore file to Bitrise, the default value of the inputs should not need to be changed. +1. In the **Bundletool version** input, you can override the default Bundletool version if you need a specific one but make sure you use the [correct version](https://github.com/google/bundletool/releases). +1. Run your Workflow. + +1. In your app's Configuration YAML file, insert the `bitrise-step-export-universal-apk` Step after the `android-build` Step. + + ``` + my-workflow: + steps: + - android-build: {} + - bitrise-step-export-universal-apk: + inputs: + ``` +1. Make sure the `aab_path` input's value is the output variable ($BITRISE_AAB_PATH) of the previous build Step. + + :::note[Using a different build Step] + + If you don't use the `android-build` Step to build an AAB file, make sure that the input points to the AAB output of the Step you used. You can use an Environment Variable, or a direct local path or URL. + + ::: + + ``` + my-workflow: + steps: + - android-build: {} + - bitrise-step-export-universal-apk: + inputs: + - aab_path: "$BITRISE_AAB_PATH" + ``` +1. Make sure the `keystore_url` input points to your Android keystore file. + + We recommend uploading the file to Bitrise and using the default Env Var: $BITRISEIO_ANDROID_KEYSTORE_URL. You can, however, use a local path or a URL as input value here. + + ``` + my-workflow: + steps: + - android-build: {} + - bitrise-step-export-universal-apk: + inputs: + - aab_path: "$BITRISE_AAB_PATH" + - keystore_url: "$BITRISEIO_ANDROID_KEYSTORE_URL" + ``` +1. Provide your credentials in the `keystore_alias` and the `keystore_password` inputs. + + If you uploaded a keystore file to Bitrise, the default value of the inputs should not need to be changed. Otherwise store your credentials in a [Secret](/en/bitrise-ci/configure-builds/secrets.html) and use the Secrets as the input values. + + ``` + my-workflow: + steps: + - android-build: {} + - bitrise-step-export-universal-apk: + inputs: + - aab_path: "$BITRISE_AAB_PATH" + - keystore_url: "$BITRISEIO_ANDROID_KEYSTORE_URL" + - keystore_password: "$BITRISEIO_ANDROID_KEYSTORE_PASSWORD" + - keystore_alias: "$BITRISEIO_ANDROID_KEYSTORE_ALIAS" + ``` +1. In the `bundletool_version` input, you can override the default Bundletool version if you need a specific one but make sure you use the [correct version](https://github.com/google/bundletool/releases). + + ``` + my-workflow: + steps: + - android-build: {} + - bitrise-step-export-universal-apk: + inputs: + - aab_path: "$BITRISE_AAB_PATH" + - keystore_url: "$BITRISEIO_ANDROID_KEYSTORE_URL" + - keystore_password: "$BITRISEIO_ANDROID_KEYSTORE_PASSWORD" + - keystore_alias: "$BITRISEIO_ANDROID_KEYSTORE_ALIAS" + - bundletool_version: 1.8.1 + ``` +1. Run your Workflow. + +The [**Export Universal APK**](https://github.com/bitrise-steplib/bitrise-step-export-universal-apk) Step exports the APK to the `$BITRISE_APK_PATH` Environment Variable which the next Steps can pick up. If the **Deploy to Bitrise.io** Step is included in your Workflow, [Release Management](urn:resource:publication:90740) can deploy the APK for you. diff --git a/docs/bitrise-ci/deploying/android-deployment/generate-and-deploy-multiple-flavor-apks-in-a-single-workflow.mdx b/docs/bitrise-ci/deploying/android-deployment/generate-and-deploy-multiple-flavor-apks-in-a-single-workflow.mdx new file mode 100644 index 0000000..6062768 --- /dev/null +++ b/docs/bitrise-ci/deploying/android-deployment/generate-and-deploy-multiple-flavor-apks-in-a-single-workflow.mdx @@ -0,0 +1,19 @@ +--- +title: "Generate and deploy multiple flavor APKs in a single workflow" +description: "You can generate, code sign and deploy multiple flavor (multi-flavor) APKs/AABs in one workflow using our Gradle Runner Step." +sidebar_position: 3 +slug: /bitrise-ci/deploying/android-deployment/generate-and-deploy-multiple-flavor-apks-in-a-single-workflow +sidebar_label: Generate and deploy multiple flavor APKs in a single Workflow +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SigningAndDeployingMultiFlavorAPKs from '@site/src/partials/signing-and-deploying-multi-flavor-apks.mdx'; +import Partial_GeneratingMultiFlavorAPKs from '@site/src/partials/generating-multi-flavor-apks.mdx'; + +You can generate, code sign and deploy multiple flavor (multi-flavor) APKs/AABs in one Workflow using our [**Gradle Runner**](https://github.com/bitrise-io/steps-gradle-runner) Step. Flavor means enhancing an app’s core code with features resulting in different versions of the same app (just to mention the most common examples: free/paid, demo/full). Check out the official Android Studio guide on [build types, flavors and build variants](https://developer.android.com/studio/build/build-variants) for more info! In this tutorial, you will need to do some settings to [**Android Sign**](https://github.com/bitrise-steplib/steps-sign-apk) and [**Google Play Deploy**](https://github.com/bitrise-io/steps-google-play-deploy) Steps - so keep your eyes peeled! + + + + diff --git a/docs/bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles.mdx b/docs/bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles.mdx new file mode 100644 index 0000000..84b9363 --- /dev/null +++ b/docs/bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles.mdx @@ -0,0 +1,32 @@ +--- +title: "Generating and deploying Android app bundles" +description: "Creating an Android App Bundle with Bitrise is almost the same as generating an APK. You have to tweak a few Step inputs to compile an Android App Bundle (.aab) file from your code, then get the bundle signed and deployed to Google Play Store." +sidebar_position: 4 +slug: /bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GeneratingAnAndroidAppBundleFile from '@site/src/partials/generating-an-android-app-bundle-file.mdx'; +import Partial_DeployingYourAndroidAppBundleToGooglePlay from '@site/src/partials/deploying-your-android-app-bundle-to-google-play.mdx'; +import Partial_SigningAnAndroidAppBundleFile from '@site/src/partials/signing-an-android-app-bundle-file.mdx'; + +Creating an Android App Bundle with Bitrise is almost the same as generating an APK. All you have to do is tweaking a few Step inputs to compile an Android App Bundle (.aab) file from your code, then get the bundle signed and deployed to Google Play Store. + +:::important[Step versions supporting bundle creation] + +The following Steps must be of the indicated version or newer - older versions of the Steps do NOT support bundle creation. + +- [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build) 0.10.0 or newer +- [**Gradle Runner**](https://github.com/bitrise-io/steps-gradle-runner) 1.9.0 or newer +- [**Android Sign**](https://github.com/bitrise-steplib/steps-sign-apk) 1.3.0 or newer +- **Deploy to Google Play** 1.6.0 or newer + +::: + + + + + + diff --git a/docs/bitrise-ci/deploying/android-deployment/index.md b/docs/bitrise-ci/deploying/android-deployment/index.md new file mode 100644 index 0000000..df61766 --- /dev/null +++ b/docs/bitrise-ci/deploying/android-deployment/index.md @@ -0,0 +1,7 @@ +--- +title: "Android deployment" +sidebar_position: 1 +slug: /bitrise-ci/deploying/android-deployment +--- + +Android deployment diff --git a/docs/bitrise-ci/deploying/bitrise-ota-app-deployment.mdx b/docs/bitrise-ci/deploying/bitrise-ota-app-deployment.mdx new file mode 100644 index 0000000..2105f97 --- /dev/null +++ b/docs/bitrise-ci/deploying/bitrise-ota-app-deployment.mdx @@ -0,0 +1,28 @@ +--- +title: "Bitrise OTA app deployment" +description: "Bitrise has an integrated app deployment system you can use to distribute your apps and other build artifacts. You can distribute your apps over the air for your app’s team members or any stakeholder, even if they don't have a Bitrise account." +sidebar_position: 3 +slug: /bitrise-ci/deploying/bitrise-ota-app-deployment +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DeployingWithTheDeployToBitriseIoStep from '@site/src/partials/deploying-with-the-deploy-to-bitriseio-step.mdx'; + +Bitrise has an integrated deployment system you can use to distribute your apps and other build artifacts. + +You can distribute your apps over the air for your app’s team members or any stakeholder, even if they don't have a Bitrise account. You can also use it to archive your app and other build artifact files which will be available on the Bitrise project’s **Builds** page for viewing and downloading. + +Here is a short recap on the different build Steps per platform. + +| Platform | Build Step | Deploy Step to Bitrise | +| --- | --- | --- | +| iOS | [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive) | **Deploy to Bitrise.io - Apps, Logs, Artifacts** | +| Android | [**Gradle Runner**](https://github.com/bitrise-io/steps-gradle-runner) or [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build) | **Deploy to Bitrise.io - Apps, Logs, Artifacts** | +| React Native | [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build) and/or [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive) | **Deploy to Bitrise.io - Apps, Logs, Artifacts** | +| Ionic | [**Ionic Archive**](https://github.com/bitrise-steplib/steps-ionic-archive) | **Deploy to Bitrise.io - Apps, Logs, Artifacts** | +| Cordova | [**Cordova Archive**](https://github.com/bitrise-steplib/steps-cordova-archive) | **Deploy to Bitrise.io - Apps, Logs, Artifacts** | +| MacOS | [**Xcode Archive for Mac**](https://github.com/bitrise-steplib/steps-xcode-archive-mac) and/or [**Export macOS Xcode Archive**](https://github.com/bitrise-steplib/steps-export-xcarchive-mac) | **Deploy to Bitrise.io - Apps, Logs, Artifacts** | + + diff --git a/docs/bitrise-ci/deploying/deploying-apps-to-applivery.mdx b/docs/bitrise-ci/deploying/deploying-apps-to-applivery.mdx new file mode 100644 index 0000000..cc7eab5 --- /dev/null +++ b/docs/bitrise-ci/deploying/deploying-apps-to-applivery.mdx @@ -0,0 +1,60 @@ +--- +title: "Deploying apps to Applivery" +description: "Applivery is a mobile app distribution platform for iOS and Android that provides a powerful mobile app management and distribution system to simplify app delivery for both testers and employees, with a focus on an easy-to-use experience." +sidebar_position: 4 +slug: /bitrise-ci/deploying/deploying-apps-to-applivery +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +[Applivery](https://www.applivery.com) is a mobile app distribution platform for iOS and Android that provides a powerful mobile app management and distribution system to simplify app delivery for both testers and employees, with a focus on an easy-to-use experience. + +Applivery has many features to better manage your in-development and production-ready apps that will help speed up your development, get better feedback and deliver better applications. + +Some of the features are: + +- Single or Multi App customized App Stores with a seamless user experience for non-technical users. +- Multi-track and fully customized app distribution with multiple security configurations including SSO, non-registered users, password protected and unlisted apps. +- Automatic and forced in-app updates. +- Feedback and bug reporting. + +Combined with Bitrise, you can cover the entire development life cycle, from testing and building to delivery and feedback. + +![App_life_cycle_with_Applivery_and_Bitrise.png](/img/_paligo/uuid-841839d9-140d-afa4-254a-5587922a594b.png) + +## Deploying your app to Applivery + +1. Add the **Applivery iOS Deploy** or the **Applivery Android Deploy** Step to your Workflow. Make sure you add the Step after the Steps that build your app. + + ![Applivery_Workflow_Step.png](/img/_paligo/uuid-794fef65-3c3b-12e1-e60f-f01f02802b37.png) +1. Get your Applivery App Token to link your Bitrise app with your Applivery app. [Read more about how to get your App Token](https://www.applivery.com/docs/api/authentication/). +1. Open your app on Bitrise and click the **Workflows** tab to open the Workflow Editor. +1. Go to the **Secrets** tab. +1. Click **Add New** and type `APPLIVERY_APP_TOKEN` in the key input field. +1. Paste your Applivery App Token in the value input field and click **Save**. + + ![Configuring_Applivery_App_Token.png](/img/_paligo/uuid-cf02074e-b629-4880-6b9c-92ee73910849.png) + +## Configuring the Applivery Step + +There are many optional parameters that you can customize for a better and deeper integration: + +| Input Variables | Type | Description | +| --- | --- | --- | +| File path | File | App’s binary file. By default gets $BITRISE_IPA_PATH or $BITRISE_APK_PATH. | +| App Token | String | Applivery App token. By default gets $APPLIVERY_APP_TOKEN Secret var. | +| Changelog | String | Additional build/release notes or changelog attached to the deploy. | +| Notify Collaborators? | Boolean | Automatically notify your project Collaborators vía emai. | +| Notify Employees? | Boolean | Automatically notify your project Employees vía emai. | +| Notification message | String | Notification message to be sent along with the email notification. | +| Tags | String | Comma-separated list of tags to easily identify the build or multitrack App Distribution | +| Version name | String | Human readable version name for a better identification of the build. | +| Upload Certificates | Boolean | Download your code signing files from Bitrise **Code Signing & Files** tab and upload them to Applivery. | + +## Distribution with Applivery + +![Distribution_in_Applivery.png](/img/_paligo/uuid-62976d61-b5fa-6258-5880-7f55090b5881.png) + +Applivery provides multiple different ways for app distribution from customized App Stores (public or private) to Distribution Pages (public, private, unlisted, or password-protected shareable installation links). It also enables multitrack app delivery based on the information gathered from your Bitrise workflows, such as GitHub Branches, Tags or customized labels. diff --git a/docs/bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise.mdx b/docs/bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise.mdx new file mode 100644 index 0000000..35c0c33 --- /dev/null +++ b/docs/bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise.mdx @@ -0,0 +1,56 @@ +--- +title: "Deploying apps to DeployGate from Bitrise" +description: "DeployGate is a mobile app distribution platform for iOS and Android, delivering your in-development iOS/Android apps to your dev team, members, employees, QA testing team in your organization or testers outside of your company." +sidebar_position: 5 +slug: /bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +[**DeployGate**](https://deploygate.com?locale=en) is a mobile app distribution platform for iOS and Android, delivering your in-development iOS/Android apps to your dev team, members, employees, QA testing team in your organization or testers outside of your company. + +DeployGate has many features to accelerate your app development cycle including QA testing and app improvement with beta tester’s feedbacks. + +DeployGate offers: + +- Real-time App distribution with automatic version control, even without requiring accounts for testers +- Flexible user account management with granular access control +- Git-like multi-track distribution allows individual version/user/device management for the same app + +With DeployGate and Bitrise, you can quickly build a fully automated in-house dogfooding environment for your team. To see more details, please visit [DeployGate Features](https://deploygate.com/features?locale=en). + +![Automated_app_distribution_workflow.png](/img/_paligo/uuid-541a72f2-6396-7422-0446-823ce23549a0.png) + +To upload your app to DeployGate, add the `DeployGate Upload` Step to your bitrise Workflow. + +![new-dg-step.png](/img/_paligo/uuid-b69592cf-9d58-0267-7327-c3265b1e4462.png) + +This Step should be added after the Step that builds your app's binary that will be uploaded. You need to set several required parameters as below: + +| Input Variables | Description | +| --- | --- | +| API Key | Set upload user’s DeployGate API Key from Account Settings. If you want to upload apps as organization account, please use organization’s API Key. Upload account will be shown on the activity timeline. | +| Owner Name | App owner’s account name in DeployGate. You can use username or organization name. | +| App file path | App’s binary file (IPA/APK) to be uploaded. For default setting, use $BITRISE_APK_PATH for Android or $BITRISE_IPA_PATH for iOS | + +You can also set optional variables for using advanced features as below: + +| Input Variables | Description | +| --- | --- | +| Short Message | Summary of update shown on DeployGate. You can use $BITRISE_GIT_MESSAGE if you want to use the commit message, the pull request title, or the message you specified when you triggered the build manually. | +| Distribution Key | You can make multiple public install links (we called it Distribution Page) for a different version of app binary in the same app. By specifying the distribution page’s hash, that distribution page will be updated simultaneously. The “xxxx” portion of the distributed page’s URL like https://deploygate.com/distributions/xxxx | +| Distribution Name | Specify the name of the updated distribution page. If nothing exists, a new distribution page will be created. Possible usage includes creating distribution pages for each Git branch name. (for example $BITRISE_GIT_BRANCH) | +| Release Note | Message for the new release in distribution page. This message will be notified to your distribution page’s testers | +| Disable Notify(iOS Only) | There is no DeployGate client app in iOS platform. By default, we use email notifications for release updates. If you don’t need email notification, please set this option as true | + +These options are based on [**DeployGate API**](https://docs.deploygate.com/reference). For more details, please read the references at [DeployGate.com](https://deploygate.com?locale=en). + +You can use DeployGate's **Distribution Page** (Shareable link) feature to generate a landing page for the app installation of your app’s specific version. + +![Distribution_Page.png](/img/_paligo/uuid-b1dd1c66-369b-691d-8842-752bd6f33919.png) + +When you upload an app to DeployGate, the system automatically assigns a sequential number (we are calling it `**Revision Number**`) for each uploaded build. On the Distribution Page, you can choose specific revision of app to distribute for each group of testers. This feature is handy for distributing your app to multiple tester groups for different purposes such as QAs, Dog Fooding, or Test Marketing. + +You can also generate a distribution page when you upload an app from Bitrise with [DeployGate Upload](https://github.com/DeployGate/upload-app-bitrise-step) Step. Please refer to the optional variables above. diff --git a/docs/bitrise-ci/deploying/deploying-to-testfairy-with-bitrise.mdx b/docs/bitrise-ci/deploying/deploying-to-testfairy-with-bitrise.mdx new file mode 100644 index 0000000..1757453 --- /dev/null +++ b/docs/bitrise-ci/deploying/deploying-to-testfairy-with-bitrise.mdx @@ -0,0 +1,26 @@ +--- +title: "Deploying to TestFairy with Bitrise" +description: "TestFairy is a deployment service that gives you plenty of insights about your app. You can deploy to TestFairy with Bitrise by using a dedicated Step." +sidebar_position: 7 +slug: /bitrise-ci/deploying/deploying-to-testfairy-with-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +If you are looking for a deployment service that also gives you lots of insights about your application, then [TestFairy](https://www.testfairy.com/) is a great service to check out. + +When testing apps in the crowd, you never know what exactly was tested and what exactly went wrong on the client side. TestFairy solves this problem by providing a video of everything that happened on the mobile device, including detailed internal metrics such as CPU, memory, GPS, network, logs, crash reports, and a lot more. To get these insights on iOS you need to [integrate their iOS SDK into your app](http://docs.testfairy.com/iOS_SDK/Integrating_iOS_SDK.html). + +To deploy your app on the TestFairy platform you just simply need to add the **TestFairy** Step to your app’s Workflow (on [bitrise.io](https://www.bitrise.io)). + +The only required parameter you have to add is your API Key on TestFairy. To get it you should navigate to your [account preferences](https://app.testfairy.com/settings/) on TestFairy and find the key under your API Key menu. + +:::note[Email notifications and Auto update] + +You can also enable or disable the email notifications and set the tester groups you would like to notify. There’s an option to make your users always upgrade to the latest build by enabling Auto update in the Step, and you can also start recording video and set the length of it. + +::: + +There’s nothing else you need to do, simply work on your awesome app and we ensure your app is automatically deployed to TestFairy every time you update your code. diff --git a/docs/bitrise-ci/deploying/deploying-your-app-to-appaloosa.mdx b/docs/bitrise-ci/deploying/deploying-your-app-to-appaloosa.mdx new file mode 100644 index 0000000..772b13c --- /dev/null +++ b/docs/bitrise-ci/deploying/deploying-your-app-to-appaloosa.mdx @@ -0,0 +1,28 @@ +--- +title: "Deploying your app to Appaloosa" +description: "Appaloosa helps you distribute your mobile apps privately, collect feedback and analyse your deployment’s efficiency. Use a dedicated Step to deploy to Appaloosa with Bitrise." +sidebar_position: 6 +slug: /bitrise-ci/deploying/deploying-your-app-to-appaloosa +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Would you like to **beta test** and **deploy** your app to 1 or thousands of users? [**Appaloosa**](http://appaloosa.io) helps you distribute your mobile apps privately, collect feedback and analyse your deployment’s efficiency. [Check it out!](http://appaloosa.io) + +Appaloosa is a simple and secure enterprise App Store. They help mobile & digital teams build, test and deploy their apps privately. + +You can manage your apps on Android, iOS and Windows Phone, all in the same place. Appaloosa also provides a native app store to increase your users’ engagement. They will receive a push notification on each update of the app and be able to test and use the latest version of your mobile apps. + +Appaloosa also gives you great insight on the efficiency of your deployment with download and usage stats as well as feedbacks and ratings from the users. + +They are entreprise ready with LDAP, OAuth, SAML and Active Directory integrations as well as a RESTful API. [Get in touch](mailto:sales@appaloosa-store.com) for more details. Plus your mobile apps can be targeted to groups of users or distributed to all collaborators. + +To deploy your app on Appaloosa, simply add the **Appaloosa** Step to your app’s Workflow. If you don’t already have an account on Appaloosa, it will be created on the go. + +- As a **registered user** you simply need your *store id* and *API Key*. +- As an **unregistered user**, an *email address* is enough. +- Optionally you can provide a *description*, *screenshot* urls (up to 5) and, if registered, *group ids*. + +With Bitrise and Appaloosa, you can focus on your mobile app development and we take care of the rest! diff --git a/docs/bitrise-ci/deploying/index.md b/docs/bitrise-ci/deploying/index.md new file mode 100644 index 0000000..f06a276 --- /dev/null +++ b/docs/bitrise-ci/deploying/index.md @@ -0,0 +1,7 @@ +--- +title: "Deploying" +sidebar_position: 8 +slug: /bitrise-ci/deploying +--- + +Deploying diff --git a/docs/bitrise-ci/deploying/ios-deployment/_category_.json b/docs/bitrise-ci/deploying/ios-deployment/_category_.json new file mode 100644 index 0000000..78cb9da --- /dev/null +++ b/docs/bitrise-ci/deploying/ios-deployment/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "iOS deployment", + "position": 2, + "link": null +} diff --git a/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing.mdx b/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing.mdx new file mode 100644 index 0000000..1d6ea0e --- /dev/null +++ b/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing.mdx @@ -0,0 +1,34 @@ +--- +title: "Deploying an iOS app for external testing" +description: "Before deploying your app to the App Store, you might want to release it to external testers who can test it on their devices outside the development environment. If you do not want to use Testflight, then you can do this by exporting an IPA file with the app-store export method." +sidebar_position: 2 +slug: /bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Before deploying your app to the App Store, you might want to release it to external testers who can test it on their devices outside the development environment. If you do not want to use Testflight, then you can do this by exporting an IPA file with the `ad-hoc` export method. + +:::important[Using Testflight] + +If you wish to invite external testers using Testflight, you CANNOT use the `ad-hoc` export method. You need an IPA with the `app-store` export method. + +::: + +1. Generate an IPA file on your own machine at least once. +1. [Upload all necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) to Bitrise. + + For the `ad-hoc` export method, you need a Distribution type certificate and an Ad Hoc type provisioning profile. Only upload a provisioning profile if you use manual provisioning: [Managing iOS code signing files - manual provisioning](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning). +1. Make sure the [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive) Step is in your Workflow. +1. Set the **Distribution method** input of the Step to `ad-hoc`. +1. Set the**Automatic code signing method** input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Make sure you have the **Deploy to Bitrise.io** Step in your Workflow. +1. Start a build. +1. When the build is finished, go to the app’s **Builds** page and click the latest build. +1. Click the **Artifacts** tab to find your IPA file that you can distribute. diff --git a/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators.mdx b/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators.mdx new file mode 100644 index 0000000..89d4daf --- /dev/null +++ b/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators.mdx @@ -0,0 +1,22 @@ +--- +title: "Deploying an iOS app for simulators" +description: "You can build and deploy your iOS app to a simulator, to show it off in a browser, for example, or to use it in testing." +sidebar_position: 4 +slug: /bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DeployingTheAppToAppetizeIo from '@site/src/partials/deploying-the-app-to-appetizeio.mdx'; +import Partial_BuildingAnIOSAppForASimulator from '@site/src/partials/building-an-ios-app-for-a-simulator.mdx'; + +You can build and deploy your iOS application to a simulator, to show it off in a browser, for example. On Bitrise, we have [a dedicated Step](https://www.bitrise.io/integrations/steps/xcode-build-for-simulator) to build for a simulator: the [**Xcode build for simulator**](https://github.com/bitrise-steplib/steps-xcode-build-for-simulator) Step runs the `xcodebuild` command with an iOS simulator destination and generates an .app file. + +The .app file can be run on any simulator. On Bitrise, we have a Step to upload your app to Appetize.io: the [**Appetize.io deploy**](https://github.com/bitrise-steplib/steps-appetize-io-deploy) Step. With this Step, you can deploy your app so you can run it in a browser. + +To build the app for a simulator, you do not need code signing files! + + + + diff --git a/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect.mdx b/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect.mdx new file mode 100644 index 0000000..acd865b --- /dev/null +++ b/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect.mdx @@ -0,0 +1,23 @@ +--- +title: "Deploying an iOS app to App Store Connect" +description: "You can deploy your Bitrise app to App Store Connect either to invite testers on Testflight or to release your app on the App Store." +sidebar_position: 3 +slug: /bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DeployingTheAppToAppStoreConnect from '@site/src/partials/deploying-the-app-to-app-store-connect.mdx'; +import Partial_DeployToAppStoreConnect from '@site/src/partials/deploy-to-app-store-connect.mdx'; + +You can deploy an app to App Store Connect to: + +- Invite testers on Testflight. +- Release your app on the App Store. + +On Bitrise, you can either simply just upload your binary to App Store Connect or you can also submit it for review. + + + + diff --git a/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio.mdx b/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio.mdx new file mode 100644 index 0000000..0b63096 --- /dev/null +++ b/docs/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio.mdx @@ -0,0 +1,53 @@ +--- +title: "Deploying an iOS app to Bitrise.io" +description: "Deploy an app to Bitrise to be able to download the IPA file and install it on devices specified in the app’s Development type provisioning profile. This way, your internal testers can easily test the app." +sidebar_position: 1 +slug: /bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitrise-io +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Deploy an app to Bitrise to be able to download the IPA file and install it on devices specified in the app’s Development type provisioning profile. This way, your internal testers can easily test the app. + +:::note[Clear the cache] + +When trying to install an app from the public install page, you should clear the cache: click the link appearing in the **If you synced your settings from your old device, you need to clear the cache and register your new device** line. The link redirects to the **Profile settings** page where you can follow the procedure described in our guide. + +::: + +:::important[Developer certificate and Development profile] + +To deploy an iOS app to [bitrise.io](https://www.bitrise.io/), you will always need a Developer type certificate and a Development type provisioning profile. Even if you want to deploy to the App Store, these are still required: they are used to create the .xcodearchive file from the provided code in the process of exporting the IPA file. + +::: + +1. Generate an IPA file on your own machine at least once. +1. [Upload all necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) to Bitrise. +1. If you want your internal testers to test the app, [register test devices](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device). +1. Make sure the **Xcode Archive and Export for iOS** Step is in your Workflow. +1. Set the **Automatic code signing** input to the Apple service connection you want to use for code signing. The available options are: + + - `off`if you don’t do automatic code signing. + - `api-key`if you use [API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id`if you use [Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Set the **Distribution method** input of the Step to `development`. + + ![deployiosapptobitrise.png](/img/_paligo/uuid-3bb43658-43d6-234e-9788-d71d49d5c1db.png) + + You can use other export methods, too, but if you only deploy to Bitrise and want to install your app on the specified devices of internal testers, `development` is sufficient. +1. Make sure the **Deploy to Bitrise.io** Step is in your Workflow. + + By default, the value of the **Enable public page for the App?** input is set to `true`. This way, once the build runs, a public install page will be available with a long and random URL which can be shared with others who are not registered on Bitrise. This URL is sent to the users in an email. The **Notify: User Roles** and the **Notify: Emails** inputs determine which users get the email. +1. Start a build. +1. When the build is finished, go to the app’s **Builds** page and click the latest build. +1. Click the **Artifacts** tab to find your IPA file. + + You can also find the public install URL here. Click the expand-arrow icon next to the IPA file to reveal the details and to find the toggle for the public install page. Make sure that’s toggled on so you’re able to send the link to non-Bitrise users. + + To install an app from the public install page, you must use a native Safari browser of the iOS device. You cannot click the installation link if you’re browsing from a third-party app. For more information, check out [Installing an .ipa file on test devices from the Artifacts tab](/en/bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page/installing-an-ipa-file-on-test-devices-from-the-artifacts-tab) + + ![Deploying_Android_apps_to_Bitrise_and_Google_Play.png](/img/_paligo/uuid-43ba1d01-1168-f540-9414-ace775c44ac5.png) + +And that’s it! The file can now be installed on all the devices included in the app’s provisioning profile. Remember: the installation link must be accessed from an iOS device’s Safari browser! diff --git a/docs/bitrise-ci/deploying/ios-deployment/index.md b/docs/bitrise-ci/deploying/ios-deployment/index.md new file mode 100644 index 0000000..00d42b1 --- /dev/null +++ b/docs/bitrise-ci/deploying/ios-deployment/index.md @@ -0,0 +1,7 @@ +--- +title: "iOS deployment" +sidebar_position: 2 +slug: /bitrise-ci/deploying/ios-deployment +--- + +iOS deployment diff --git a/docs/bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page.mdx b/docs/bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page.mdx new file mode 100644 index 0000000..dbfe166 --- /dev/null +++ b/docs/bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page.mdx @@ -0,0 +1,38 @@ +--- +title: "Installing an ipa file from the public install page" +description: "You can install .ipa files either from the public install page or from the Artifacts tab of your build." +sidebar_position: 5 +slug: /bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page +sidebar_label: Installing an .ipa file +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_PreppingForInstallation from '@site/src/partials/prepping-for-installation.mdx'; +import Partial_InstallingAnIpaFileOnTestDevices from '@site/src/partials/installing-an-ipa-file-on-test-devices.mdx'; +import Partial_InstallingAnIpaFileOnTestDevicesFromTheArtifactsTab from '@site/src/partials/installing-an-ipa-file-on-test-devices-from-the-artifacts-tab.mdx'; + +You can install .ipa files generated during a Bitrise build on test devices in two ways: + +- [Using the public install page](#UUID-67559f9c-572d-1b5f-7a5d-911a01423cb6). The public install page is a generated URL that can be distributed to users who have access to provisioned and registered test devices. +- [Downloading the file from the **Artifacts** tab](#UUID-d3b31452-4471-4d11-e253-c673408140f1) on the build's page on Bitrise. + +Installing an .ipa file on a test device consist of three phases: initiating the device compatibility check, installing a configuration profile on the test device, then finishing up with installing the app on the device. + +In this tutorial we’re describing: + +- How to install an app on a registered test device without a Bitrise account (for anyone who has not subscribed to Bitrise but wishes to check out the current version of the app). +- How to install an app on a test device which is yet to be registered on Bitrise (for Bitrise users). + + :::note[Installing an .ipa file from the Artifacts tab] + + Installing an .ipa file from the **Artifacts** tab is only possible for Bitrise users. + + ::: + + + + + + diff --git a/docs/bitrise-ci/getting-started/_category_.json b/docs/bitrise-ci/getting-started/_category_.json new file mode 100644 index 0000000..a85c93e --- /dev/null +++ b/docs/bitrise-ci/getting-started/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Getting started", + "position": 1, + "link": null +} diff --git a/docs/bitrise-ci/getting-started/adding-a-ci-configuration-to-a-project.md b/docs/bitrise-ci/getting-started/adding-a-ci-configuration-to-a-project.md new file mode 100644 index 0000000..17635ef --- /dev/null +++ b/docs/bitrise-ci/getting-started/adding-a-ci-configuration-to-a-project.md @@ -0,0 +1,25 @@ +--- +title: "Adding a CI configuration to a project" +description: "You can add a CI configuration to your Bitrise project at any point, even if the project was originally created for Release Management. Adding a CI configuration means linking the project to a Git repository. It allows you to create Workflows and Pipelines and to run CI builds." +sidebar_position: 5 +slug: /bitrise-ci/getting-started/adding-a-ci-configuration-to-a-project +--- + +You can add a CI configuration to your Bitrise project at any point, even if the project was originally created for Release Management, for example. Adding a CI configuration means linking the project to a Git repository. It allows you to create Workflows and Pipelines and to run CI builds. + +To add CI configuration to a project: + +1. Open Bitrise. +1. On the dashboard, hover over the left navigation menu, and then select **Bitrise CI**. +1. On the top right corner, click **New CI project**. +1. In the dialog, select **Add to existing project**. + + ![extending-ci-config.png](/img/_paligo/uuid-d6541f5d-351c-81f9-7a8b-41cfa8c1a21d.png) + + :::note[Start new project] + + The **Start new project** option starts a new project with a CI configuration. If you want a Release Management project without a CI configuration, select **Releases** from navigation menu on the left and [add an app](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management). + + ::: +1. Select a project from the dropdown menu, then click **Continue**. +1. Go through [the **New CI project** flow](/en/bitrise-ci/getting-started/adding-a-new-project.html). diff --git a/docs/bitrise-ci/getting-started/adding-a-new-project.mdx b/docs/bitrise-ci/getting-started/adding-a-new-project.mdx new file mode 100644 index 0000000..95d9cb3 --- /dev/null +++ b/docs/bitrise-ci/getting-started/adding-a-new-project.mdx @@ -0,0 +1,80 @@ +--- +title: "Adding a new project" +description: "Adding a project to Bitrise means setting up access to your repository so that you can run builds. Our project scanner determines the platform type and generates default Workflows to build and deploy your app." +sidebar_position: 4 +slug: /bitrise-ci/getting-started/adding-a-new-project +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Adding a project to Bitrise means one of two things: + +- Adding a new project with a CI configuration, connecting a Git repository to the project. + + During the process, we also run our [project scanner](https://github.com/bitrise-steplib/steps-project-scanner) that detects the platform type of the project - for example, iOS - and generate default Workflows with all the necessary Steps to build and deploy an app. +- Adding a new project with a new Release Management app: [Adding a new app to Release Management](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management). + +Each Bitrise project is owned by a [workspace](/en/bitrise-platform/workspaces/workspaces-overview). + +:::note[The project scanner] + +Supporting a platform/framework means that our project scanner can detect the type of the project and set up a basic Bitrise configuration based on the type. You can add any other project, too, regardless of how it's built but you'll have to configure it manually. + +::: + +In this guide, we'll go through how to add a new project to Bitrise. + +1. On the **Dashboard**, click the **New project** button. +1. Select **Configure Bitrise CI**. + + :::tip[Release Management] + + You can select **Add your app** to proceed with adding a new app to Release Management. From this point, you can follow this guide: [Adding a new app to Release Management](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management) + + ::: +1. Select the Workspace that will own the project. + + ![20251219-adding-project-workspace-select.png](/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png) +1. Set the project to private or public. This settings can't be changed later. + + - Private projects are only accessible to the Workspace members. They need to authenticate themselves to view the project's details. + - [Public projects](/en/bitrise-platform/projects/public-projects.html) expose their configuration file and build logs to everyone who has the link. +1. Connect a repository. You can: + + - Connect your GitHub account or organization to Bitrise via [the GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration) and select an available repository. We strongly recommend this method if you are using a GitHub repository. + - [Connect your Git provider account to Bitrise via an OAuth application](/en/bitrise-platform/repository-access/repository-access-with-oauth/connecting-a-git-provider-account-when-adding-an-app) and select an available repository. + - Enter a repository URL manually. + + ![20251219-repo-access.png](/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png) +1. Configure authorization to allow Bitrise to access the repository. There are multiple ways to do so, depending on the type of your project: + + - Public projects don't require authorization. + - Private projects that are accessed via the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration) don't need additional authorization. + - Private projects with SSH URLs, accessed via OAuth applications, require [configuring an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html). Bitrise can do this automatically or you can create and register your own SSH key pair. + - Private projects with HTTPS URLs, accessed via OAuth applications, require [HTTPS authorization with a personal access token](/en/bitrise-platform/repository-access/configuring-https-authorization-credentials). We recommend using a token with only **read** access. + + ![20251219-authorize-bitrise.png](/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png) +1. Set the default branch of the project and decide if you want our [project scanner](/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner.html) to scan the code on the branch. + + - If your repository is connected, you can select an available branch from a dropdown menu. + - If you entered a repository URL manually, you need to type a valid branch name. + + :::note[Repository URL] + + You will be able to [change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch) later. You can also connect or disconnect your account to Git provider services at any time. + + ::: + + ![select-branch.png](/img/_paligo/uuid-04948b79-fd8e-253c-85c5-3c0e66f9dbd9.png) +1. Configure the project settings. You can either modify and confirm the automatically generated settings, or create a configuration manually. + + The configuration sets [a stack](/en/bitrise-build-hub/infrastructure/build-stacks.html), [machine type](/en/bitrise-build-hub/infrastructure/build-machine-types.html), and a project root directory, among other things. The exact parameters to configure depends on the project type. +1. Select a project icon. You can skip this and add an icon later. + + ![app-icon.png](/img/_paligo/uuid-69955083-387a-53a2-2da4-ba67c85ef5bb.png) +1. For apps with OAuth connections, add a [webhook](/en/bitrise-platform/integrations/webhooks.html). A webhook is required to [automatically trigger builds](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html). + + Projects with the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration) don't need a webhook. +1. Once you are done, click **View Project Page** to go to the newly added project's home page. From there, you can start [editing your Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [run builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). diff --git a/docs/bitrise-ci/getting-started/getting-started.mdx b/docs/bitrise-ci/getting-started/getting-started.mdx new file mode 100644 index 0000000..c7345e3 --- /dev/null +++ b/docs/bitrise-ci/getting-started/getting-started.mdx @@ -0,0 +1,43 @@ +--- +title: "Getting started" +description: "Get started on Bitrise by signing up via email or a Git provider, connecting a repository, and running your first build." +sidebar_position: 1 +slug: /bitrise-ci/getting-started/getting-started +sidebar_label: Getting started with Bitrise CI +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ManagingYourWorkspaces from '@site/src/partials/managing-your-workspaces.mdx'; +import Partial_ChangingYourProjectSettings from '@site/src/partials/changing-your-project-settings.mdx'; +import Partial_RunningABuild from '@site/src/partials/running-a-build.mdx'; +import Partial_EditingYourBuildConfiguration from '@site/src/partials/editing-your-build-configuration.mdx'; +import Partial_TestingAndDeployment from '@site/src/partials/testing-and-deployment.mdx'; +import Partial_AddingYourFirstProject from '@site/src/partials/adding-your-first-project.mdx'; + +Bitrise is the CI/CD Platform built for Mobile DevOps. With scalable infrastructure, robust collaboration features, and a wide range of integrations, our platform offers the tools to fit all your Mobile DevOps needs. + +Sign up via email or via a Git hosting provider: [Signing up for Bitrise](/en/bitrise-platform/getting-started/signing-up-for-bitrise). + +After signing up, you can explore Bitrise but you can't start CI builds. You can add new projects and CI configurations but you won’t be able to start more builds without either our 30-day trial or a Pro subscription. + +To start the 30-day trial, you need to provide credit card details: + +- Your card will be charged $0.01 during the verification process and the transaction will be voided immediately after the process completes, meaning the 30 day Pro trial is completely free to you. +- We’re NOT going to automatically sign you up to a paid plan when your trial expires. +- Your billing data is retained so you can use the same credit card info & billing address to subscribe to a paid plan if you choose to do so. + +For more information about the trial and the paid subscription plans, check out our [Pricing page](https://bitrise.io/pricing). + + + + + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/index.md b/docs/bitrise-ci/getting-started/index.md new file mode 100644 index 0000000..6fea064 --- /dev/null +++ b/docs/bitrise-ci/getting-started/index.md @@ -0,0 +1,6 @@ +--- +title: "Getting started" +sidebar_position: 1 +--- + +Getting started diff --git a/docs/bitrise-ci/getting-started/key-bitrise-concepts.mdx b/docs/bitrise-ci/getting-started/key-bitrise-concepts.mdx new file mode 100644 index 0000000..2072908 --- /dev/null +++ b/docs/bitrise-ci/getting-started/key-bitrise-concepts.mdx @@ -0,0 +1,51 @@ +--- +title: "Key Bitrise concepts" +description: "Bitrise uses Steps, Workflows and Pipelines to manage your CI/CD builds. It supports using Environment Variables and Secrets to store and access data. Everything is configured in a YAML format." +sidebar_position: 2 +slug: /bitrise-ci/getting-started/key-bitrise-concepts +sidebar_label: Key Bitrise CI concepts +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Bitrise manages your builds with Steps, Workflows, and Pipelines. + +- Steps are individual build tasks: for example, cloning your repository, running unit tests, or creating an installable binary are all individual build tasks. +- Workflows are sequences of Steps: when running a Bitrise build, each Step is executed in the order that is defined in a Workflow. +- Pipelines represent the top level of a Bitrise CI/CD configuration. Pipelines can be used to organize the entire CI/CD process and to set up advanced configurations with multiple different tasks running parallel and/or sequentially. + +The configuration is defined entirely in a `bitrise.yml` file that you can store on Bitrise or in your own repository. It also defines the infrastructure used for the build: Bitrise builds run in a clean virtual machine, with preinstalled tools and services for most mobile development use cases. These are defined by our stacks which are updated regularly. + +## Steps and Workflows + +[Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) are a collection of [Steps](/en/bitrise-ci/workflows-and-pipelines/steps/steps-overview.html) which are executed in order. This order can be configured in the Workflow Editor, or by editing the `bitrise.yml` file directly. + +Each Bitrise build runs at least one Workflow. You can start builds by triggering a specific Workflow: in such a build, Workflows can be chained together but they run sequentially. In a Pipeline, Workflows are organized in stages, and in each stage, Workflows run in parallel. + +When you add a new app on Bitrise, we automatically create default Workflows for you. They contain the most frequently used Step for the app's platform. You can add or remove Steps any time from a Workflow. Steps can be configured via Step inputs and they can generate data that can be used by subsequent Steps in the same Workflow. + +Bitrise Steps are open source: you can suggest improvements to existing Steps or develop, share, and use your own. + +## Pipelines + +[Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html) enable a complex CI/CD configuration for advanced use cases. Pipelines can be used to organize the entire CI/CD process and to set up advanced configurations with multiple different tasks running parallel and/or sequentially. + +A Pipeline allows you to configure dependencies between Workflows. Each Workflow starts executing when its parent Workflows are done. Workflows on the same level are executed in parallel. + +You can configure build triggers to trigger a Pipeline directly. When a Pipeline is triggered, the build machine starts executing all the Workflows of the first stage. + +## Environment Variables and Secrets + +You can store and use configuration data, or any other data in key-value pairs called [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html). This enables, among other things, the reuse of build configurations across multiple different apps: in each app, Env Vars with the same key can store different values. + +Env Vars have different scopes: You can configure app-level and Workflow-level Env Vars, as well as create new variables during the build, and pass these on to subsequent Steps and Workflows in the build. Any Bitrise Step that generates some sort of output makes that output available to subsequent Steps in the form of Env Vars. + +Secrets are specific types of Env Vars: they are stored in encrypted format and their values are never exposed in build logs or in the `bitrise.yml` file. + +## Build machines and stacks + +Bitrise builds run in clean virtual machines that are destroyed once the build is finished, ensuring the security of your code. You can select the type of the build machine: the operating system (macOS or Linux) and the amount of computing resources the machine offers. + +A build stack defines what tools and services are installed on the VM that runs your build. For example, our Xcode stacks each come with a different version of Xcode. diff --git a/docs/bitrise-ci/getting-started/migrating-to-bitrise/_category_.json b/docs/bitrise-ci/getting-started/migrating-to-bitrise/_category_.json new file mode 100644 index 0000000..edc283d --- /dev/null +++ b/docs/bitrise-ci/getting-started/migrating-to-bitrise/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Migrating to Bitrise", + "position": 3, + "link": null +} diff --git a/docs/bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise.md b/docs/bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise.md new file mode 100644 index 0000000..07d85a0 --- /dev/null +++ b/docs/bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise.md @@ -0,0 +1,28 @@ +--- +title: "About migrating to Bitrise" +description: "If you have been looking to switch to Bitrise to speed up your mobile CI/CD flow and ease dedicated manpower, look no further. These guides introduce the most important Bitrise features and how you can quickly settle into Bitrise." +sidebar_position: 1 +slug: /bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise +--- + +If you have been looking to switch to Bitrise to speed up your mobile CI/CD flow and ease dedicated manpower, look no further. These guides introduce the most important Bitrise features and how you can quickly settle into Bitrise. + +We have dedicated migration guides for Jenkins and the former Visual Studio App Center: + +- [Migrating from Jenkins to Bitrise](/en/bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise). +- [Migrating from App Center to Bitrise](/en/bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise). + +These guides are meant to help the migration process by comparing the features of the other CI/CD services to Bitrise and introduce you to the most important concepts of how Bitrise works. + +If you want to migrate to Bitrise from some other CI/CD or DevOps platform, we recommend familiarizing yourself with our key concepts: + +- [Key concepts of the Bitrise platform](/en/bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform). +- [Key Bitrise concepts](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/key-bitrise-concepts). +- [Release Management concepts](/en/release-management/getting-started-with-release-management/release-management-concepts). + +Once you're familiar with these concepts, we offer quick start guides to get you through the first steps: + +- [Getting started with the Bitrise platform](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/getting-started-with-the-bitrise-platform). +- [Getting started with web CI](/en/bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci). +- [Getting started with the Build Cache](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache). +- [Getting started with Release Management](/en/release-management/getting-started-with-release-management). diff --git a/docs/bitrise-ci/getting-started/migrating-to-bitrise/index.md b/docs/bitrise-ci/getting-started/migrating-to-bitrise/index.md new file mode 100644 index 0000000..848a586 --- /dev/null +++ b/docs/bitrise-ci/getting-started/migrating-to-bitrise/index.md @@ -0,0 +1,7 @@ +--- +title: "Migrating to Bitrise" +sidebar_position: 3 +slug: /bitrise-ci/getting-started/migrating-to-bitrise +--- + +Migrating to Bitrise diff --git a/docs/bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise.mdx b/docs/bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise.mdx new file mode 100644 index 0000000..197125d --- /dev/null +++ b/docs/bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise.mdx @@ -0,0 +1,31 @@ +--- +title: "Migrating from App Center to Bitrise" +description: "Visual Studio App Center will be taken offline on March 31, 2025. If you used App Center for our CI/CD needs, this is the perfect opportunity to migrate your projects to Bitrise." +sidebar_position: 3 +slug: /bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AppCenterOrgsAndBitriseWorkspaces from '@site/src/partials/app-center-orgs-and-bitrise-workspaces.mdx'; +import Partial_TestingOnAppCenterAndOnBitrise from '@site/src/partials/testing-on-app-center-and-on-bitrise.mdx'; +import Partial_UserRolesAndCollaboration from '@site/src/partials/user-roles-and-collaboration.mdx'; +import Partial_AppCenterBuildServiceAndBitriseBuilds from '@site/src/partials/app-center-build-service-and-bitrise-builds.mdx'; +import Partial_DeployingOnAppCenterAndBitrise from '@site/src/partials/deploying-on-app-center-and-bitrise.mdx'; + +Visual Studio App Center has been taken offline on March 31, 2025. This guide is meant to help you migrating your projects from App Center to Bitrise. + +We strongly recommend going through our [Getting started](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache.html) guide. The [Key Bitrise concepts](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/key-bitrise-concepts) document can also help understanding how Bitrise works. + +In this guide, we'll be going through the similarities and differences between Bitrise and App Center. + + + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise.mdx b/docs/bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise.mdx new file mode 100644 index 0000000..6a758a5 --- /dev/null +++ b/docs/bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise.mdx @@ -0,0 +1,42 @@ +--- +title: "Migrating from Jenkins to Bitrise" +description: "Switch from Jenkins to Bitrise, and you get to experience the comfort of using a cloud-based, mobile first CI/CD platform which offers out-of-the box functionalities." +sidebar_position: 2 +slug: /bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_IntegratedSSOManagementOnBitrise from '@site/src/partials/integrated-sso-management-on-bitrise.mdx'; +import Partial_WhyBotherMigrating from '@site/src/partials/why-bother-migrating.mdx'; +import Partial_JenkinsPluginsAndBitriseSteps from '@site/src/partials/jenkins-plugins-and-bitrise-steps.mdx'; +import Partial_MasterAndAgentOnJenkinsBitriseStacks from '@site/src/partials/master-and-agent-on-jenkins-bitrise-stacks.mdx'; +import Partial_JenkinsPipelineBitriseWorkflow from '@site/src/partials/jenkins-pipeline-bitrise-workflow.mdx'; +import Partial_JenkinsfileBitriseYAML from '@site/src/partials/jenkinsfile-bitrise-yaml.mdx'; +import Partial_PeopleManagementInJenkinsAndBitrise from '@site/src/partials/people-management-in-jenkins-and-bitrise.mdx'; +import Partial_ManagingBuildsOnJenkinsAndOnBitrise from '@site/src/partials/managing-builds-on-jenkins-and-on-bitrise.mdx'; +import Partial_DashboardsInJenkinsAndBitrise from '@site/src/partials/dashboards-in-jenkins-and-bitrise.mdx'; +import Partial_QuickStartGuide from '@site/src/partials/quick-start-guide.mdx'; + +If you have been looking to switch from [Jenkins](https://www.jenkins.io/) to Bitrise to speed up your mobile CI/CD flow and ease dedicated manpower, look no further. This guide introduces the most important Bitrise features and how you can quickly settle into Bitrise from your Jenkins world. + + + + + + + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/_category_.json b/docs/bitrise-ci/getting-started/quick-start-guides/_category_.json new file mode 100644 index 0000000..904a8c1 --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Quick start guides", + "position": 7, + "link": null +} diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects.mdx b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects.mdx new file mode 100644 index 0000000..478f481 --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects.mdx @@ -0,0 +1,36 @@ +--- +title: "Getting started with Android projects" +description: "Get started on Bitrise by signing up via email or a Git provider, connecting a repository, and running the first build for your Android app." +sidebar_position: 2 +slug: /bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SigningYourAndroidApp from '@site/src/partials/signing-your-android-app.mdx'; +import Partial_TestingYourAndroidApp from '@site/src/partials/testing-your-android-app.mdx'; +import Partial_DeployingAnAndroidAppToBitriseIo from '@site/src/partials/deploying-an-android-app-to-bitriseio.mdx'; +import Partial_ManagingDependenciesForAndroidApps from '@site/src/partials/managing-dependencies-for-android-apps.mdx'; +import Partial_NOTEDoYouHaveABitriseAccount from '@site/src/partials/note-do-you-have-a-bitrise-account.mdx'; +import Partial_AddingAnAndroidAppToBitrise from '@site/src/partials/adding-an-android-app-to-bitrise.mdx'; +import Partial_DeployingToGooglePlay from '@site/src/partials/deploying-to-google-play.mdx'; +import Partial_SettingUpGooglePlayDeploymentForTheFirstTime from '@site/src/partials/setting-up-google-play-deployment-for-the-first-time.mdx'; + +In this guide, we’ll walk you through how to add an Android app to Bitrise, what the default Workflows can do, and finally how to test and deploy your app to [bitrise.io](https://www.bitrise.io/) and to Google Play Store. + + + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects.mdx b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects.mdx new file mode 100644 index 0000000..1083e3c --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects.mdx @@ -0,0 +1,26 @@ +--- +title: "Getting started with Expo projects" +description: "Get started on Bitrise by signing up via email or a Git provider, connecting a repository, and running the first build for your Expo app." +sidebar_position: 6 +slug: /bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_InstallingDependenciesForIonicCordovaReactApps from '@site/src/partials/installing-dependencies-for-ioniccordovareact-apps.mdx'; +import Partial_AddingAnExpoAppToBitrise from '@site/src/partials/adding-an-expo-app-to-bitrise.mdx'; +import Partial_TestingYourReactNativeApp from '@site/src/partials/testing-your-react-native-app.mdx'; +import Partial_DeployingYourExpoApp from '@site/src/partials/deploying-your-expo-app.mdx'; + +You can generate React Native projects [with the React Native CLI or with the Expo CLI](https://facebook.github.io/react-native/docs/getting-started.html). [Expo](https://docs.expo.io/versions/latest/) is a toolchain that allows you to quickly get a React Native app up and running without having to use native code in Xcode or Android Studio. + +In this guide we discuss how to set up, test, code sign and deploy your React Native project built with the [Expo CLI](https://docs.expo.io/get-started/installation/). + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects.mdx b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects.mdx new file mode 100644 index 0000000..ab8814f --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects.mdx @@ -0,0 +1,24 @@ +--- +title: "Getting started with Flutter projects" +description: "Get started on Bitrise by signing up via email or a Git provider, connecting a repository, and running the first build for your Flutter app." +sidebar_position: 4 +slug: /bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TestingAFlutterApp from '@site/src/partials/testing-a-flutter-app.mdx'; +import Partial_AdditionalFlutterContent from '@site/src/partials/additional-flutter-content.mdx'; +import Partial_AddingAFlutterAppToBitrise from '@site/src/partials/adding-a-flutter-app-to-bitrise.mdx'; +import Partial_DeployingAFlutterApp from '@site/src/partials/deploying-a-flutter-app.mdx'; + +Flutter is a mobile app SDK that allows developers to create native apps for both iOS and Android. [Bitrise](https://app.bitrise.io/users/sign_in) supports Flutter apps: we have dedicated Steps to help you with all your Flutter needs. This guide walks you through setting up, testing, building and deploying a simple Flutter project on Bitrise. + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-ioniccordova-projects.mdx b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-ioniccordova-projects.mdx new file mode 100644 index 0000000..b6fbf38 --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-ioniccordova-projects.mdx @@ -0,0 +1,30 @@ +--- +title: "Getting started with Ionic/Cordova projects" +description: "Get started on Bitrise by signing up via email or a Git provider, connecting a repository, and running the first build for your Ionic/Cordova app." +sidebar_position: 5 +slug: /bitrise-ci/getting-started/quick-start-guides/getting-started-with-ionic-cordova-projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_InstallingDependenciesForIonicCordovaReactApps from '@site/src/partials/installing-dependencies-for-ioniccordovareact-apps.mdx'; +import Partial_CodeSigningIonicCordovaApps from '@site/src/partials/code-signing-ioniccordova-apps.mdx'; +import Partial_DeployingIonicCordovaApps from '@site/src/partials/deploying-ioniccordova-apps.mdx'; +import Partial_TestingIonicCordovaApps from '@site/src/partials/testing-ioniccordova-apps.mdx'; +import Partial_AddingAnIonicCordovaAppToBitrise from '@site/src/partials/adding-an-ioniccordova-app-to-bitrise.mdx'; +import Partial_NOTEDoYouHaveABitriseAccount from '@site/src/partials/note-do-you-have-a-bitrise-account.mdx'; + +You can use Cordova and Ionic frameworks to develop cross-platform apps. Bitrise can help you with its automated testing, code signing and deployment procedures so that you can ship your iOS and/or Android app/s to the respective marketplace in no time! If your Workspace has more than one concurrency, you can have Android and iOS builds run simultaneously. Now let us guide you through the process! + + + + + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects.mdx b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects.mdx new file mode 100644 index 0000000..8df22e8 --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects.mdx @@ -0,0 +1,30 @@ +--- +title: "Getting started with iOS projects" +description: "Get started on Bitrise by signing up via email or a Git provider, connecting a repository, and running the first build for your iOS app." +sidebar_position: 1 +slug: /bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DeployingTheAppToAppStoreConnect from '@site/src/partials/deploying-the-app-to-app-store-connect.mdx'; +import Partial_TestingYourIOSApp from '@site/src/partials/testing-your-ios-app.mdx'; +import Partial_CreatingASignedIPAForXcodeProjects from '@site/src/partials/creating-a-signed-ipa-for-xcode-projects.mdx'; +import Partial_AddingAnIOSAppToBitrise from '@site/src/partials/adding-an-ios-app-to-bitrise.mdx'; + +Developing for iOS is complex - our aim is to make it as easy as possible for you! In this guide, we’ll walk you through how to add an iOS project to Bitrise, how to run Xcode tests, manage your code signing files, and deploy the finished app to [bitrise.io](https://www.bitrise.io/) and to the App Store. + +:::tip[Integrating fastlane to Bitrise] + +You can run your fastlane lane on Bitrise with the same commands you would use locally. Bitrise’s automated Step provides extra functionality to your lane and speed up your builds: [fastlane](https://github.com/bitrise-io/steps-fastlane). + +::: + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects.mdx b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects.mdx new file mode 100644 index 0000000..ac0a6f0 --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects.mdx @@ -0,0 +1,25 @@ +--- +title: "Getting started with MacOS projects" +description: "Get started on Bitrise by signing up via email or a Git provider, connecting a repository, and running the first build for your macOS project." +sidebar_position: 7 +slug: /bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects +sidebar_label: Getting started with macOS projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TestingYourMacOSApp from '@site/src/partials/testing-your-macos-app.mdx'; +import Partial_AddingAMacOSAppToBitrise from '@site/src/partials/adding-a-macos-app-to-bitrise.mdx'; +import Partial_CodeSigningAndExportingAMacOSApp from '@site/src/partials/code-signing-and-exporting-a-macos-app.mdx'; +import Partial_DeployingTheAppToTheAppStoreConnect from '@site/src/partials/deploying-the-app-to-the-app-store-connect.mdx'; + +In this guide, we’ll walk you through how to add a macOS project to Bitrise, how to run Xcode tests, manage your code signing files and deploy the finished app to bitrise.io and to the App Store. + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects.mdx b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects.mdx new file mode 100644 index 0000000..ac8f671 --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects.mdx @@ -0,0 +1,36 @@ +--- +title: "Getting started with React Native projects" +description: "Get started on Bitrise by signing up via email or a Git provider, connecting a repository, and running the first build for your React Native app." +sidebar_position: 3 +slug: /bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_InstallingDependenciesForIonicCordovaReactApps from '@site/src/partials/installing-dependencies-for-ioniccordovareact-apps.mdx'; +import Partial_CodeSigningForReactNativeApps from '@site/src/partials/code-signing-for-react-native-apps.mdx'; +import Partial_AddingAReactNativeAppToBitrise from '@site/src/partials/adding-a-react-native-app-to-bitrise.mdx'; +import Partial_DeployingAReactNativeApp from '@site/src/partials/deploying-a-react-native-app.mdx'; +import Partial_TestingYourReactNativeApp from '@site/src/partials/testing-your-react-native-app.mdx'; +import Partial_NOTEDoYouHaveABitriseAccount from '@site/src/partials/note-do-you-have-a-bitrise-account.mdx'; + +:::tip[Expo projects] + +If you use Expo in a React Native project, we have a dedicated guide: [Getting started with Expo projects](/en/bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects). + +::: + +You can easily set up and configure your React Native project on [Bitrise](https://app.bitrise.io/users/sign_in). A React Native repo can consist of an Android and an iOS project so configurations should be done as you would normally do with Android and iOS apps. When running a React Native project on Bitrise, you will see that first an Android, then an iOS build gets built. + + + + + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci.mdx b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci.mdx new file mode 100644 index 0000000..4422a4f --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci.mdx @@ -0,0 +1,35 @@ +--- +title: "Getting started with web CI" +sidebar_position: 8 +slug: /bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci +sidebar_label: Getting started with web CI projects +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DockerContainerSupportForWebCIProjects from '@site/src/partials/docker-container-support-for-web-ci-projects.mdx'; +import Partial_DatabaseConfigurationForRubyProjects from '@site/src/partials/database-configuration-for-ruby-projects.mdx'; +import Partial_ManagingDependenciesForWebCIProjects from '@site/src/partials/managing-dependencies-for-web-ci-projects.mdx'; +import Partial_DeployingWebCIProjects from '@site/src/partials/deploying-web-ci-projects.mdx'; +import Partial_AddingAWebCIProject from '@site/src/partials/adding-a-web-ci-project.mdx'; +import Partial_CachingDependenciesForWebCIProjects from '@site/src/partials/caching-dependencies-for-web-ci-projects.mdx'; +import Partial_RunningTestsForYourWebCIProject from '@site/src/partials/running-tests-for-your-web-ci-project.mdx'; + +Bitrise is a mobile-focused DevOps platform. However, that doesn't mean you can't build non-mobile projects on Bitrise. We support non-mobile project types with integrations, default Workflows and Pipelines, and dedicated caching solutions. + +Using Bitrise for web CI allow you to consolidate all projects, mobile and others, on Bitrise. As Bitrise excels in mobile CI/CD, a complex area, consolidating simplifies operations as it's easier to adopt Bitrise for web than a generic CI for mobile. + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/getting-started/quick-start-guides/index.md b/docs/bitrise-ci/getting-started/quick-start-guides/index.md new file mode 100644 index 0000000..aad6824 --- /dev/null +++ b/docs/bitrise-ci/getting-started/quick-start-guides/index.md @@ -0,0 +1,7 @@ +--- +title: "Quick start guides" +sidebar_position: 7 +slug: /bitrise-ci/getting-started/quick-start-guides +--- + +Quick start guides diff --git a/docs/bitrise-ci/getting-started/the-bitrise-dashboard.mdx b/docs/bitrise-ci/getting-started/the-bitrise-dashboard.mdx new file mode 100644 index 0000000..ac3e48d --- /dev/null +++ b/docs/bitrise-ci/getting-started/the-bitrise-dashboard.mdx @@ -0,0 +1,60 @@ +--- +title: "The Bitrise dashboard" +description: "Your first stop when logging in to Bitrise is the dashboard. It shows your current workspace's most important information across a number of different Bitrise products." +sidebar_position: 6 +slug: /bitrise-ci/getting-started/the-bitrise-dashboard +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Your first stop when logging in to Bitrise is the dashboard. It allows you to navigate the Bitrise products across your current workspace. You can navigate to: + +- Your projects. +- Your [CI builds](/en/bitrise-ci/run-and-analyze-builds/finding-a-specific-build.html) on your workspace's CI dashboard. +- The [Bitrise Build Cache](urn:resource:publication:94853). +- [Release Management](urn:resource:publication:90740). + +![dashboard-overview.png](/img/_paligo/uuid-c88d4641-9945-2d84-dd14-ef30fdd68fc4.png) + +You can also find [Insights](urn:resource:publication:94879) data for the workspace. + +## Checking project details + +Your projects are listed on the left side of the dashboard. To see more data about them, click the downward arrow. + +The details display basic information about all Bitrise products associated with the project: + +- The last Bitrise CI build and its status on either the `main` or the `master` branch. The dashboard doesn't show build information from other branches. +- The last time the Build Cache was used. +- The number of connected apps the project has in Release Management. + +![project-card-dashboard.png](/img/_paligo/uuid-2c2a82f9-5bea-aa62-cd49-339aa061c265.png) + +You can access each of these products from the details section of the project card. + +## Adding a new project from the dashboard + +On the top right corner of the dashboard, you can find the **New project** button. You can use this to [add a new project with a CI configuration](/en/bitrise-ci/getting-started/adding-a-new-project.html). + +:::note[Projects without CI] + +You can create projects without a CI configuration: add a new app to Release Management and select the option to create a new project. + +::: + +Any CI project added this way will also be visible on the dashboard. You can also access [Release Management](urn:resource:publication:90740) to add an app and link it to the project. + +## Workspace insights + +In the **Insights for workspace** section, you can see some basic aggregated data for your workspace's projects: + +- **Successful build time**: The average Bitrise CI build time for successful builds across the workspace's projects. +- **Build failure rate**: The percentage of failed Bitrise CI builds across the workspace's projects. +- **Cache hit rate**: The percentage of data requests that were successfully served by the Bitrise Build Cache. +- **Command error rate**: The percentage of failed commands. + +![workspace-insights.png](/img/_paligo/uuid-b15d9482-748d-bb6a-1aaa-c1153ed8392b.png) + +Explore [Insights](urn:resource:publication:94879) to see more metrics, providing data-driven visibility. diff --git a/docs/bitrise-ci/getting-started/unity-on-bitrise.mdx b/docs/bitrise-ci/getting-started/unity-on-bitrise.mdx new file mode 100644 index 0000000..cc075d6 --- /dev/null +++ b/docs/bitrise-ci/getting-started/unity-on-bitrise.mdx @@ -0,0 +1,31 @@ +--- +title: "Unity on Bitrise" +sidebar_position: 8 +slug: /bitrise-ci/getting-started/unity-on-bitrise +sidebar_label: Unity software integration on Bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingUpUnityLicensesOnBitrise from '@site/src/partials/setting-up-unity-licenses-on-bitrise.mdx'; +import Partial_RunningAUnityBuild from '@site/src/partials/running-a-unity-build.mdx'; +import Partial_DownloadingAndInstallingUnityOnBitrise from '@site/src/partials/downloading-and-installing-unity-on-bitrise.mdx'; +import Partial_AddingAUnityProjectAsABitriseApp from '@site/src/partials/adding-a-unity-project-as-a-bitrise-app.mdx'; + +Bitrise offers full support for using [Unity](https://unity.com/) software on our build machines: convenient license management, up to 40 GB of disk space, and a mobile-focused build environment that allows users to easily create both iOS- and Android versions of their Unity projects. + +To be able to build a Unity app on Bitrise, you need to: + +- [Add your project as a Bitrise app](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/unity-on-bitrise/adding-a-unity-project-as-a-bitrise-app). +- [Download and install Unity on the virtual machine running your build](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/unity-on-bitrise/downloading-and-installing-unity-on-bitrise). +- [Add your licenses to Bitrise and activate it during the build](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/unity-on-bitrise/setting-up-unity-licenses-on-bitrise). +- [Build your project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/unity-on-bitrise/running-a-unity-build). + + + + + + + + diff --git a/docs/bitrise-ci/index.mdx b/docs/bitrise-ci/index.mdx new file mode 100644 index 0000000..d752d15 --- /dev/null +++ b/docs/bitrise-ci/index.mdx @@ -0,0 +1,82 @@ +--- +title: "Bitrise CI" +hide_table_of_contents: true +hide_title: true +unlisted: true +sidebar_class_name: sidebar-hidden-item +--- + +import ProductHomepage from '@site/src/components/ProductHomepage'; + +
+ +
diff --git a/docs/bitrise-ci/references/_category_.json b/docs/bitrise-ci/references/_category_.json new file mode 100644 index 0000000..a32b406 --- /dev/null +++ b/docs/bitrise-ci/references/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "References", + "position": 11, + "link": null +} diff --git a/docs/bitrise-ci/references/available-environment-variables.mdx b/docs/bitrise-ci/references/available-environment-variables.mdx new file mode 100644 index 0000000..13225b4 --- /dev/null +++ b/docs/bitrise-ci/references/available-environment-variables.mdx @@ -0,0 +1,137 @@ +--- +title: "Available environment variables" +description: "Environment Variables (Env Vars) consist of a key and a value, as well as optional attributes. They can be defined on the level of apps, Workflows or Steps." +sidebar_position: 3 +slug: /bitrise-ci/references/available-environment-variables +sidebar_label: Available Environment Variables +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +[Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) (Env Vars) consist of a key and a value. They can also include optional attributes. They can be defined on the level of apps, Workflows or Steps. + +You can set your own Env Vars but there is a selection of Env Vars that are exposed automatically by either the Bitrise CLI or [bitrise.io](https://www.bitrise.io). + +- [Env Vars exposed by the Bitrise CLI](#table-idm4605862823913632704866333161) are available everywhere, even if you run the build on your own computer. +- [Env Vars exposed by bitrise.io](#table-idm4593103204964832704877205075) are available for builds running on [bitrise.io](https://www.bitrise.io) virtual machines. +- [Pipeline Env Vars exposed by bitrise.io](#table-idm13319399396334) are only available for Pipeline builds running on [bitrise.io](https://www.bitrise.io) virtual machines. + +In addition, plenty of Bitrise Steps export output variables. These variables are available to subsequent Steps during a build. You can find them in the Step configuration of each Step: + +- In the Workflow Editor, you can check them in the **Output properties** section of a Step. +- In the `step.yml` of a Step, you can find them under `outputs`. + +[Release Management](urn:resource:publication:90740) also passes a number of Env Vars to Bitrise builds: [see topic](#table-idm23436411389193). + +Environment Variables have a set availability order. This is the order in which they are made available as a build progresses: [Availability order of Environment Variables](/en/bitrise-ci/configure-builds/environment-variables/availability-order-of-environment-variables). + +:::tip[Step outputs exposed as Env Vars] + +Steps can also expose Step outputs as Env Vars. For example, a Step that builds a binary can expose that binary to other Steps as an Env Var. As basically any Bitrise Step can expose outputs this way, we won't list them all but you can find all Environment Variables related to the git cloning process: [see topic](#table-idm4569014080238433190713242173). + +::: + +| Env Var | Description | +| --- | --- | +| $BITRISE_TRIGGERED_WORKFLOW_ID | The ID of the Workflow that was triggered. This Env Var is exposed regardless of whether the Workflow was triggered manually or automatically. | +| $BITRISE_TRIGGERED_WORKFLOW_TITLE | The title of the Workflow that was triggered. This Env Var is exposed regardless of whether the Workflow was triggered manually or automatically. | +| $BITRISE_BUILD_STATUS | The current status of the build. The available options are: - 0: Successful. - 1: Failed. A successful current status means that none of the previous Steps in the build failed. | +| $BITRISE_SOURCE_DIR | Path to the base working directory. By default, it’s the directory where Bitrise runs, unless you provide a different value. This can be overwritten during the build, which will change the working directory for subsequent Steps in the build. | +| $BITRISE_DEPLOY_DIR | Path to the directory that stores artifacts and files for deployment. It’s a temporary directory created by the Bitrise CLI by default, and can be overwritten before starting the Bitrise CLI. The **Deploy to Bitrise.io** Step looks for your build artifacts - such as an IPA or APK of the app -, test results, and other files in this directory. | +| $BITRISE_TEST_DEPLOY_DIR | Root directory for all test results created by the Bitrise CLI. Test results placed in this directory can be viewed alongside all other test results: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). | +| $BITRISE_TEST_RESULT_DIR | Each Step has its own value of this variable. It provides a unique subdirectory, under $BITRISE_TEST_DEPLOY_DIR for each Step to save its test results. | +| $BITRISE_FAILED_STEP_TITLE | The title of the Step that first fails in a build. In other words, the Step that sets the build status to **Failed**. | +| $BITRISE_FAILED_STEP_ERROR_MESSAGE | The error message of the Step that first fails in a build. | +| $CI | Indicates whether the Bitrise CLI is running in Continuous Integration mode. The possible values are: - `true` - `false` | +| $PR | Indicates whether the Bitrise CLI is running in PR (Pull Request) mode. Running in Pull Request mode means that Bitrise builds your code in the state as if the Pull Request was already merged. The possible values are: - `true` - `false` | + +| Env Var | Description | +| --- | --- | +| $BITRISE_BUILD_NUMBER | Build number of the build on [bitrise.io](https://www.bitrise.io). | +| $BITRISE_APP_TITLE | The title of your project on [bitrise.io](https://www.bitrise.io). You can change it any time on the **Project settings** page of the project. | +| $BITRISE_APP_URL | The URL or your project on [bitrise.io](https://www.bitrise.io). This is not the same as the Git repository URL! A project URL has the following format: `app.bitrise.io/APP-SLUG/` For example: https://app.bitrise.io/app/31e481ce08e0xfd9. | +| $BITRISE_APP_SLUG | The slug that uniquely identifies your project on [bitrise.io](https://www.bitrise.io). It’s part of the project URL, too. | +| $BITRISE_BUILD_URL | The URL of the build on [bitrise.io](https://www.bitrise.io). | +| $BITRISE_BUILD_SLUG | The slug that uniquely identifies a build on [bitrise.io](https://www.bitrise.io). It’s part of the build URL, too. For example, let’s take a look at this build URL: https://app.bitrise.io/build/d75abbebxfc9ca4e. The build slug is `d65abbebxfc9ca4e` in this example. | +| $BITRISE_BUILD_TRIGGER_TIMESTAMP | The date and time when the build was triggered. | +| $GIT_REPOSITORY_URL | The URL of the Git repository that hosts your project. This can be changed in the **Settings** tab of the app. It can be in either SSH or HTTPS format. | +| $BITRISE_GIT_BRANCH | The git branch that is built by Bitrise. For example, `main`. | +| $BITRISEIO_GIT_BRANCH_DEST | Used only with builds triggered by pull requests: the destination/target branch of the pull request that triggered the build. For example, a pull request wants to merge the content of a branch into the branch `main`. In this case, this Env Var’s value is `main`. | +| $BITRISE_GIT_TAG | If a build is triggered by a Git Tag, this Env Var stores the tag used. | +| $BITRISE_GIT_COMMIT | The commit hash of the Git commit that triggered the build, when applicable. | +| $BITRISE_GIT_MESSAGE | The commit message, pull request title, or the message you specified if you triggered the build manually. | +| $BITRISEIO_GIT_REPOSITORY_OWNER | The owner of the Git repository of the project. | +| $BITRISEIO_GIT_REPOSITORY_SLUG | The slug of the Git repository of the project. | +| $BITRISE_PULL_REQUEST | The ID of the pull request that triggered a build. | +| $BITRISEIO_PULL_REQUEST_REPOSITORY_URL | The URL of the repository from where the pull request that triggered a build has been sent. | +| $BITRISEIO_PULL_REQUEST_MERGE_BRANCH | The pre-merge branch - if the Git hosting provider supports and provides the pre-merged state of a pull request on a special merge branch. | +| $BITRISEIO_PULL_REQUEST_HEAD_BRANCH | The pull request head branch, if the Git hosting provider system supports and provides this. This special git ref should point to the source of the pull request. | +| $GITHUB_PR_IS_DRAFT | For projects hosted on GitHub only: it is set to `true` if the build is triggered by [a draft pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests). | +| $BITRISE_PROVISION_URL | The URL of the Apple provisioning profiles uploaded to [bitrise.io](https://www.bitrise.io). If there is more than one provisioning profile uploaded for your project, a pipe character (`|`) separates the URLs in the list. This is only relevant for iOS projects and for cross-platform projects with iOS versions. | +| $BITRISE_CERTIFICATE_URL | The URL of the Apple certificates uploaded to [bitrise.io](https://www.bitrise.io). If there is more than one certificate uploaded for your project, a pipe character (`|`) separates the URLs in the list. This is only relevant for iOS projects and for cross-platform projects with iOS versions. | +| $BITRISE_CERTIFICATE_PASSPHRASE | The passphrase you set for the uploaded Apple certificates on the project’s **Code Signing & Files** tab. If there is more than one certificate with a passphrase, a pipe character (`|`) separates the phrases in the list. This is only relevant for iOS projects and for cross-platform projects with iOS versions. | +| $BITRISE_IO | Indicates that the build is running in a bitrise.io environment. Value is set to true by Bitrise when it starts a build. | +| `$BITRISE_TRIGGER_BY` | Identifies the entity that triggered the build. The value can be: - The Git user's name when the build is [triggered by a Git provider](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html). - The Bitrise user's name if the build is triggered manually from the Bitrise web UI. - The value specified in the `triggered_by` build parameter if the build is triggered any other way (such as [scheduled builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.html) or builds triggered by the [API](/en/bitrise-ci/api/api-overview.html)). | +| `$BITRISE_TRIGGER_METHOD` | The method by which the build was triggered. - `schedule`: When the build is triggered by a scheduler. - `webhook`: When the build is triggered automatically by a webhook at a Git provider. - `manual`: When the build is triggered by any other trigger, including the API. | +| `$BITRISE_GIT_PULL_REQUEST_COMMENT` | The comment message and its corresponding ID from a pull request (or merge request in the case of GitLab). Only available when the build is triggered by a PR comment: the build trigger must have a `pr_comment` value. | +| `$BITRISE_GIT_PULL_REQUEST_COMMENT_ID` | The comment ID from a pull request. Only available when the build is triggered by a PR comment. | +| `$BITRISE_GIT_PULL_REQUEST_LABELS` | A multiline list of new labels added to the pull request along with existing labels. Only available when the build is triggered by adding a label to a pull request or by a PR event with existing labels. Only supported for GitHub and GitLab. | +| `$BITRISE_GIT_CHANGED_FILES` | Lists file paths changed by a code push or pull request. Contains max 3000 files per event. It's available when: - A push event triggers a build. Only supported for GitHub and GitLab. - A PR event triggers a build and the trigger has a `changed_files` or `commit_message` condition. Supported for all three main Git providers. Note: this env var can become really large in some builds. If you build custom scripts that parse this env var, please see the env var size limitations section below. | +| `$BITRISE_GIT_COMMIT_MESSAGES` | The commit messages of a code push or pull request. Contains max the first 2048 commits, and at most 1000 characters in each message. It's available when: - A push event triggers the build. Only supported for GitHub and GitLab. - A PR event triggers a build and the trigger has a `commit_message` condition. Supported for all three main Git providers. Note: this env var can become really large in some builds. If you build custom scripts that parse this env var, please see the env var size limitations section below. | +| $BITRISE_WORKSPACE_ID | The [workspace slug](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs) of the workspace that owns the project. | + +:::warning[Env Var size limitations] + +Some of the above environment variables can become really large in some builds (for example, if a git commit has a really long commit message or a pull request modifies thousands of files). If the total size of all env vars would hit OS limits, Bitrise removes some env vars from the runtime environment and writes the full value to a file on disk. + +If you have custom scripts that rely on env vars that could grow large in some builds, you should read the value from this env file instead. The env var is located at $BITRISEIO_ENVFILE_PATH on both macOS and Linux stacks. It has the following format: + +``` +envs: + # Every env var from the build trigger and git event. + BITRISE_GIT_CHANGED_FILES: ... + BITRISE_GIT_COMMIT_MESSAGES: ... + CI: true + PR: true + [...] + +# List of env var KEYS that had to be erased. You should read the original value from the map above, this is just for debugging. +erased_envs: +- BITRISE_GIT_CHANGED_FILES +``` + +::: + +| Env Var | Description | +| --- | --- | +| $BITRISEIO_PIPELINE_ID | The ID of the running Pipeline build. This Env Var is exposed regardless of whether the Pipeline was triggered manually or automatically. | +| $BITRISEIO_PIPELINE_TITLE | The name of the running Pipeline build. This Env Var is exposed regardless of whether the Pipeline was triggered manually or automatically. | +| $BITRISEIO_FINISHED_STAGES | The status of previously finished Stages and Workflows in a build. Please note that the value of this Env Var may change in the future! | +| $BITRISEIO_PIPELINE_BUILD_STATUS | The current status of the Pipeline build. The value of this Env Var can be: `succeeded`, `succeeded_with_abort`, `failed`, and `aborted`. While the Pipeline is running, the Env Var's status is based on the previously finished Stages. | +| $BITRISEIO_PIPELINE_BUILD_URL | The URL of the Pipeline build. | + +| Env Var | Description | +| --- | --- | +| $RM_RELEASE_ID | The unique identifier of your release on bitrise.io. It’s part of the release URLs, too. | +| $RM_RELEASE_VERSION | The release name (for Google Play releases) or version (for App Store releases) in Release Management. | +| $RM_RELEASE_CANDIDATE_VERSION | The version of the binary (APK/AAB or IPA file) generated by the release candidate build. | +| $RM_RELEASE_CANDIDATE_DOWNLOAD_URL | The download URL of the binary (APK/AAB or IPA file) generated by the release candidate build. | +| $RM_RELEASE_CANDIDATE_SLUG | Unique identifier of the binary (APK/AAB or IPA file) generated by the release candidate build. | +| $RM_RELEASE_CANDIDATE_BUILD_SLUG | The build slug of the build that was selected as a release candidate for the release. | +| $RM_CONNECTED_APP_ID | The unique identifier of your connected app on bitrise.io. | +| $RM_PROJECT_ID | The unique identifier of your project on bitrise.io. It’s part of the project URL, too. | +| $RM_WORKSPACE_ID | The unique identifier of your workspace on bitrise.io. | +| $RM_EVENT_ID | Identifies the trigger which starts the Bitrise CI workflows. See the list of events and their IDs on the [Configuring release automation](https://docs.bitrise.io/en/release-management/releases/configuring-a-release/release-automation.html#automation-events) page. | + +| Env Var | Description | +| --- | --- | +| $GIT_CLONE_COMMIT_HASH | The hash of the commit that the build uses (the cloned commit). | +| $GIT_CLONE_COMMIT_MESSAGE_SUBJECT | The subject of the commit message of the cloned commit. | +| $GIT_CLONE_COMMIT_MESSAGE_BODY | The body (content) of the commit message of the cloned commit. | +| $GIT_CLONE_COMMIT_COUNT | The commit count of the cloned commit. This Env Var is influenced by the `clone_depth` Step input. For more information, check out the [Git Clone Step description](https://github.com/bitrise-steplib/steps-git-clone). | +| $GIT_CLONE_COMMIT_AUTHOR_NAME | The name of the author of the cloned commit. | +| $GIT_CLONE_COMMIT_AUTHOR_EMAIL | The email of the author of the cloned commit. | +| $GIT_CLONE_COMMIT_COMMITER_NAME | The name of the committer of the cloned commit. | +| $GIT_CLONE_COMMIT_COMMITER_EMAIL | The email of the committer of the cloned commit. | diff --git a/docs/bitrise-ci/references/bitrise-tools.md b/docs/bitrise-ci/references/bitrise-tools.md new file mode 100644 index 0000000..9dd75e6 --- /dev/null +++ b/docs/bitrise-ci/references/bitrise-tools.md @@ -0,0 +1,19 @@ +--- +title: "Bitrise tools" +description: "A list of open source tools used and maintained by the Bitrise team." +sidebar_position: 4 +slug: /bitrise-ci/references/bitrise-tools +--- + +Here is a list of our open source tools maintained by the Bitrise team. + +| Name | Type | Description | Link | +| --- | --- | --- | --- | +| **Bitrise CLI** | CLI | The Bitrise CLI which is used on [bitrise.io](https://www.bitrise.io) to run builds. You can use it to run builds locally. | [https://github.com/bitrise-io/bitrise](https://github.com/bitrise-io/bitrise) | +| **stepman** | CLI tool | The Step Collection Manager used for managing the Step Library. | [https://github.com/bitrise-io/stepman](https://github.com/bitrise-io/stepman) | +| **envman** | CLI tool | The Environment Variable Manager used by the Bitrise CLI to isolate and manage [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) during the build. It can also be used independently of the Bitrise CLI. | [https://github.com/bitrise-io/envman](https://github.com/bitrise-io/envman) | +| **init** | CLI core plugin | Use this plugin so that our project scanner can detect the type of your project locally and generate a Bitrise configuration. | [https://github.com/bitrise-io/bitrise-plugins-init.git](https://github.com/bitrise-io/bitrise-plugins-init.git) | +| **step** | CLI core plugin | Use this plugin to list, retrieve Step information or create Steps. | [https://github.com/bitrise-io/bitrise-plugins-step](https://github.com/bitrise-io/bitrise-plugins-step) | +| **workflow-editor** | CLI core plugin | Use this plugin to configure your builds’ `bitrise.yml` config locally with the offline Workflow Editor. | [https://github.com/bitrise-io/bitrise-workflow-editor.git](https://github.com/bitrise-io/bitrise-workflow-editor.git) | +| **bitrise-plugin-io** | CLI core plugin | Use this plugin to manage your apps on [bitrise.io](https://www.bitrise.io) right from the Terminal / command line. | [https://github.com/bitrise-io/bitrise-plugins-io](https://github.com/bitrise-io/bitrise-plugins-io) | +| **bitrise webhooks** | Webhook processor | This [Bitrise Webhooks processor](https://github.com/bitrise-io/bitrise-webhooks) transforms various incoming webhooks (for example, from GitHub, Bitbucket, or Slack) to [bitrise.io](https://www.bitrise.io)’s Build Trigger API format, and calls it to start a build. | [https://github.com/bitrise-io/bitrise-webhooks](https://github.com/bitrise-io/bitrise-webhooks) | diff --git a/docs/bitrise-ci/references/configuration-yaml-reference.mdx b/docs/bitrise-ci/references/configuration-yaml-reference.mdx new file mode 100644 index 0000000..e714150 --- /dev/null +++ b/docs/bitrise-ci/references/configuration-yaml-reference.mdx @@ -0,0 +1,40 @@ +--- +title: "Configuration YAML reference" +description: "This document lists the configuration options for the configuration YAML file where you define your CI/CD configuration on Bitrise." +sidebar_position: 1 +slug: /bitrise-ci/references/configuration-yaml-reference +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_PropertiesOfWorkflowsInPipelines from '@site/src/partials/properties-of-workflows-in-pipelines.mdx'; +import Partial_PipelineLevelProperties from '@site/src/partials/pipeline-level-properties.mdx'; +import Partial_TriggerProperties from '@site/src/partials/trigger-properties.mdx'; +import Partial_StepBundleProperties from '@site/src/partials/step-bundle-properties.mdx'; +import Partial_DockerContainerProperties from '@site/src/partials/docker-container-properties.mdx'; +import Partial_ProjectLevelProperties from '@site/src/partials/project-level-properties.mdx'; +import Partial_StepLevelProperties from '@site/src/partials/step-level-properties.mdx'; +import Partial_WorkflowLevelProperties from '@site/src/partials/workflow-level-properties.mdx'; + +This document lists the configuration options for the configuration YAML file where you define your CI/CD configuration on Bitrise. + +- Check out our overview for the basic principles of the configuration YAML file: [Configuration YAML overview](/en/bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview). +- Read more about where to store the configuration YAML file: [Managing a project's configuration YAML file](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file). +- Create advanced modular configurations: [Modular YAML configuration](/en/bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration). + + + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/references/glossary.md b/docs/bitrise-ci/references/glossary.md new file mode 100644 index 0000000..3eadc5e --- /dev/null +++ b/docs/bitrise-ci/references/glossary.md @@ -0,0 +1,92 @@ +--- +title: "Glossary" +sidebar_position: 5 +slug: /bitrise-ci/references/glossary +--- + +
+
Project
+
+ +A Bitrise project is the container for the entire Mobile DevOps process of your development work. Each workspace can own multiple projects. A project allows you to create a CI configuration and set up Release Management to distribute your mobile app to testers and to online stores. + +
+
Configuration YAML
+
+ +The configuration YAML file stores your entire build configuration for a project. It specifies your stack and the build triggers, and defines the Workflows of the app. When you make changes on the graphical UI of our Workflow Editor, you actually modify your configuration YAML. + +
+
bitrise.yml
+
+ +The configuration YAML file stores your entire build configuration for a project. It specifies your stack and the build triggers, and defines the Workflows of the app. When you make changes on the graphical UI of our Workflow Editor, you actually modify your configuration YAML. + +
+
Pipeline
+
+ +A Bitrise Pipeline is the top level of the Bitrise CI/CD configuration. Pipelines can be used to organize the entire CI/CD process and to set up advanced configurations with multiple different tasks running parallel and/or sequentially. + +
+
Project scanner
+
+ +The project scanner is a tool that identifies the given project’s type and generates a basic Bitrise configuration. Each supported project type has its own scanner: these scanners are stored as separate packages. + +
+
Secret
+
+ +A Secret is a specific type of [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html): they hide their information in an encrypted format and their value is not exposed in the build logs nor in the `bitrise.yml` configuration. You can store confidential information, such as passwords or API keys as Secrets. + +
+
Stack
+
+ +A build stack indicates the full configuration of the virtual machine that Bitrise uses to run your build. Each stack includes an operating system, and a large number of pre-installed software and tools. For example, our Xcode stacks run on macOS operating systems and contain, among many other tools, the Xcode version that is indicated in the name of the stack. + +
+
Stage
+
+ +A Stage is a collection of Workflows. Stages are the top-level building blocks of Pipelines. A Stage can contain multiple Workflows, which all run in parallel in the same Stage. If all Workflows are successful in a Stage, the Pipeline moves on to the next Stage. If any of the Workflows fail, the Pipeline ends without running the other Stages unless you configure a given Stage to always run. + +
+
Step
+
+ +A Step is a block of script execution that encapsulates a build task on Bitrise: the code to perform that task, the inputs and parameters you can define for the task, and the outputs the task generates. + +
+
step.yml
+
+ +The interface definition of a Bitrise Step. It defines the Step inputs and the generated outputs, as well as any other Step property such as the category and the description of the Step. It also points to the Step's source code. + +
+
Trigger
+
+ +A trigger or build trigger is a configuration for automatically launching a Bitrise build when a specified event happens. Triggers require a webhook set up at your Git hosting provider. + +
+
Workflow
+
+ +A Workflow is a collection of Steps, Environment Variables, and other configurations. When Bitrise starts a build, it runs one or more Workflows according to the configuration defined in the `bitrise.yml` file. + +
+
Workflow Editor
+
+ +The Bitrise Workflow Editor allows you to edit your Workflows, configure Steps, upload files (including code signing files) and manage your app's triggers and stacks on a graphical user interface. It is available both online and [offline](/en/bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.html). + +
+
Workspace
+
+ +A Workspace is an environment that allows you to manage your Bitrise apps and the team members working on the apps. You can create multiple Workspaces, and you can be invited to Workspaces by other Bitrise users. To be able to add apps and run builds, you either need to be part of a Workspace, or you have to be an outside contributor on an app's team. + +
+
diff --git a/docs/bitrise-ci/references/index.md b/docs/bitrise-ci/references/index.md new file mode 100644 index 0000000..8c00774 --- /dev/null +++ b/docs/bitrise-ci/references/index.md @@ -0,0 +1,7 @@ +--- +title: "References" +sidebar_position: 11 +slug: /bitrise-ci/references +--- + +References diff --git a/docs/bitrise-ci/references/steps-reference/_category_.json b/docs/bitrise-ci/references/steps-reference/_category_.json new file mode 100644 index 0000000..5613a35 --- /dev/null +++ b/docs/bitrise-ci/references/steps-reference/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Steps reference", + "position": 2, + "description": "A Step encapsulates a build task: the code to perform that task, the inputs and parameters you can define for the task, and the outputs the task generates.", + "link": null +} diff --git a/docs/bitrise-ci/references/steps-reference/about-step-code.mdx b/docs/bitrise-ci/references/steps-reference/about-step-code.mdx new file mode 100644 index 0000000..32d5c27 --- /dev/null +++ b/docs/bitrise-ci/references/steps-reference/about-step-code.mdx @@ -0,0 +1,25 @@ +--- +title: "About Step code" +description: "A Step encapsulates a build task: the code to perform that task, the inputs and parameters you can define for the task, and the outputs the task generates." +sidebar_position: 1 +slug: /bitrise-ci/references/steps-reference/about-step-code +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +A Step encapsulates a build task: the code to perform that task, the inputs and parameters you can define for the task, and the outputs the task generates. + +For example the `Git Clone` Step performs a `git clone` of the specified repository, with the specified inputs, such as the branch or the commit to clone. + +From a technical perspective, a Step is a semver versioned repository which includes the code of the Step and the interface definition of the Step. + +The Step interface definition is defined in the `step.yml` file for every Step. It includes: + +- The dependencies of the Step. +- The inputs and outputs of the Step. +- The title and description of the Step. +- Properties such as the issue tracker or support URL, or certain filter properties. + +To include Steps in your Workflow, you have to reference them in the configuration YAML file of your project. To do so, you will need the correct reference format for the Step. In the configuration file, you can also specify input values for the inputs defined in the Step's interface definition. diff --git a/docs/bitrise-ci/references/steps-reference/index.md b/docs/bitrise-ci/references/steps-reference/index.md new file mode 100644 index 0000000..3bca160 --- /dev/null +++ b/docs/bitrise-ci/references/steps-reference/index.md @@ -0,0 +1,10 @@ +--- +title: "Steps reference" +description: "A Step encapsulates a build task: the code to perform that task, the inputs and parameters you can define for the task, and the outputs the task generates." +sidebar_position: 2 +slug: /bitrise-ci/references/steps-reference +--- + +Steps reference + +A Step encapsulates a build task: the code to perform that task, the inputs and parameters you can define for the task, and the outputs the task generates. diff --git a/docs/bitrise-ci/references/steps-reference/step-data-in-the-bitriseyml-file.mdx b/docs/bitrise-ci/references/steps-reference/step-data-in-the-bitriseyml-file.mdx new file mode 100644 index 0000000..fe5ab9f --- /dev/null +++ b/docs/bitrise-ci/references/steps-reference/step-data-in-the-bitriseyml-file.mdx @@ -0,0 +1,103 @@ +--- +title: "Step data in the bitrise.yml file" +description: "The Step data and information you specify in the `bitrise.yml` file are the parameters of the Step you want to change, compared to the Step’s default definition." +sidebar_position: 3 +slug: /bitrise-ci/references/steps-reference/step-data-in-the-bitrise-yml-file +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +The Step data and information you specify in the `bitrise.yml` file are the parameters of the Step you want to change, compared to the Step’s default definition. + +To see the Step’s raw interface definition you can check it in the step library. The Step interface definitions can be found in the StepLib’s [steps directory](https://github.com/bitrise-io/bitrise-steplib/tree/master/steps). + +If you don’t specify any input or other Step property in the `bitrise.yml` configuration, only the Step (reference/ID), the Step will run with the default values as defined by the Step’s developer in the interface definition. + +Let’s see an example with a single [**Script**](https://github.com/bitrise-io/steps-script) Step, which will be executed when you run `bitrise run test`: + +``` +format_version: 11 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + +workflows: + test: + steps: + - script: +``` + +Specify inputs for the Step with the `inputs:` list property. An input consists of a *key* and a *value*: + +:::warning[Indentation] + +Indentation in the [YAML format](http://yaml.org/faq.html) is very important! You should use two- or four-space indentation, and you can’t use tabs to indent! + +::: + +``` +format_version: 11 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + +workflows: + test: + steps: + - script: + inputs: + - content: "echo 'Hello World!'" +``` + +If the Step doesn’t have any required inputs you don’t have to specify an input. You can specify values for as many inputs as you want to. + +Step input values are always **string** / text values and they are passed to the Step as Environment Variables. The value can be multiline too, using the standard YAML multiline format: + +``` +format_version: 11 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + +workflows: + test: + steps: + - script@1.1.3: + inputs: + - content: | + #!/bin/bash + set -ex + var_to_print='Hello World!' + echo "${var_to_print}" +``` + +If you use a multiline value, like the one above, you have to indent the value with either two or four spaces, compared to the key! + +Force a Step to run even if a previous Step fails by setting the `is_always_run` property to `true`: + +``` +format_version: 1.3.1 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + +workflows: + test: + steps: + - script@1.1.3: + is_always_run: true + inputs: + - content: "puts 'Hello Ruby!'" + - runner_bin: ruby +``` + +Use the `title` property to add a descriptive title to your Step: + +``` +format_version: 11 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + +workflows: + test: + steps: + - script@1.1.3: + title: Print Hello Ruby + is_always_run: true + inputs: + - content: "puts 'Hello Ruby!'" + - runner_bin: ruby +``` diff --git a/docs/bitrise-ci/references/steps-reference/step-inputs-reference.mdx b/docs/bitrise-ci/references/steps-reference/step-inputs-reference.mdx new file mode 100644 index 0000000..c3dfa8e --- /dev/null +++ b/docs/bitrise-ci/references/steps-reference/step-inputs-reference.mdx @@ -0,0 +1,33 @@ +--- +title: "Step inputs reference" +description: "Step inputs are environment items that tell the Bitrise CLI how to run a given Step. The inputs of a Step are defined in the `step.yml` file of every Step by setting the `inputs` property.." +sidebar_position: 5 +slug: /bitrise-ci/references/steps-reference/step-inputs-reference +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UsingTemplateExpressionsForStepInputs from '@site/src/partials/using-template-expressions-for-step-inputs.mdx'; +import Partial_StepInputProperties from '@site/src/partials/step-input-properties.mdx'; + +Step inputs are environment items that tell the [Bitrise CLI](urn:resource:component:43013) how to run a given Step. The inputs of a Step are defined in the `step.yml` file of every Step by setting the `inputs` property.. + +Step inputs have the same syntax as every environment property. It consists of two main parts: a `KEY: value` pair and an `opts` field. + +``` +inputs: +- my_key_for_the_env: "default value" + opts: + title: An example env var item + is_dont_change_value: false + category: example +``` + +- `my_key_for_the_env`: the key of the input (required). +- `default value`: the default value of the input. You don’t always have to provide a default value. +- `opts`: optional properties. + + + + diff --git a/docs/bitrise-ci/references/steps-reference/step-outputs-reference.mdx b/docs/bitrise-ci/references/steps-reference/step-outputs-reference.mdx new file mode 100644 index 0000000..8724459 --- /dev/null +++ b/docs/bitrise-ci/references/steps-reference/step-outputs-reference.mdx @@ -0,0 +1,44 @@ +--- +title: "Step outputs reference" +description: "Step outputs are environment items that are the result of running a given Step. You can check out the default outputs of a Step in the `Workflow Editor` on [bitrise.io](https://www.bitrise.io) or in the `step.yml` file of the Step." +sidebar_position: 6 +slug: /bitrise-ci/references/steps-reference/step-outputs-reference +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Step outputs are environment items that are the result of running a given Step. For example, the **Deploy to Bitrise.io** Step generates two output envs by default: + +- $BITRISE_PUBLIC_INSTALL_PAGE_URL +- BITRISE_PUBLIC_INSTALL_PAGE_URL_MAP + +You can check out the default outputs of a Step in the Workflow Editor on [bitrise.io](https://www.bitrise.io) or in the `step.yml` file of the Step. + +Step outputs can be defined in the `step.yml` file of the project by setting the `outputs` attribute. They have the same syntax as every environment property. It consists of two main parts: a `KEY: value` pair and an `opts` field. The key and the value are required, the `opts` field is optional. + +``` +- MY_KEY_FOR_THE_ENV: my value for the env + opts: + title: An example env var item + is_dont_change_value: false + category: example +``` + +- `MY_KEY_FOR_THE_ENV`: The key of the environment item (required). +- `my value for the env`: The value of the item (required). +- `opts`: Optional attributes. + +The default outputs of a Step cannot be changed by the user in the `bitrise.yml` file of the project: they can only be changed in the `step.yml` file. However, you can export the output in a custom [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html). This is useful, for example, if you have the same step twice in your Workflow and you wish to use the generated output of both steps: + +``` +workflows: + primary: + steps: + - gradle-runner: + outputs: + - BITRISE_APK_PATH: ALIAS_APK_PATH +``` + +In this example, the value for the `BITRISE_APK_PATH` Environment Variable will be exported under the `ALIAS_APK_PATH` key. diff --git a/docs/bitrise-ci/references/steps-reference/step-properties-reference.mdx b/docs/bitrise-ci/references/steps-reference/step-properties-reference.mdx new file mode 100644 index 0000000..cfc6d5f --- /dev/null +++ b/docs/bitrise-ci/references/steps-reference/step-properties-reference.mdx @@ -0,0 +1,30 @@ +--- +title: "Step properties reference" +description: "Step properties provide important data of a Step, such as its project type, its source code or the dependencies it requires. A Step’s inputs and outputs are also defined as Step properties." +sidebar_position: 4 +slug: /bitrise-ci/references/steps-reference/step-properties-reference +sidebar_label: Step properties +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TIPMetaPropertiesAsPermanentComments from '@site/src/partials/tip-meta-properties-as-permanent-comments.mdx'; + +Step properties provide important data of a Step, such as its project type, its source code or the dependencies it requires. A Step’s inputs and outputs are also defined as Step properties. Let’s take a look at the properties! + +- `title`, `summary` and `description` : metadata, for comments, tools and GUI. + + +- `website` : official website of the Step / service. +- `source_code_url` : the url where the Step’s source code can be viewed. +- `support_url` : url to the Step’s support / issue tracker. +- `published_at` : *auto-generated at share* - the StepLib publish date of the Step’s version +- `source` : *auto-generated at share* git clone information. +- `asset_urls` : *auto-generated at share* Step assets (StepLib specific), like icon image. +- `host_os_tags` : supported operating systems. *Currently unused, reserved for future use.* +- `project_type_tags` : project type tags if the Step is project type specific. Example: `ios` or `android`. Completely optional, and only used for search and filtering in Step lists. +- `type_tags` : generic type tags related to the Step. Example: `utility`, `test` or `notification`. Similar to `project_type_tags`, this property is completely optional, and only used for search and filtering in Step lists. +- `deps` : specifies the required dependencies of the Step. To declare a dependency, specify a package manager and then the dependency you wish to install. +- `inputs` : inputs (Environments) of the Step. +- `outputs` : outputs (Environments) of the Step. diff --git a/docs/bitrise-ci/references/steps-reference/step-referenceid-format.mdx b/docs/bitrise-ci/references/steps-reference/step-referenceid-format.mdx new file mode 100644 index 0000000..36ee3f0 --- /dev/null +++ b/docs/bitrise-ci/references/steps-reference/step-referenceid-format.mdx @@ -0,0 +1,42 @@ +--- +title: "Step reference/ID format" +description: "To refer to a Step in a bitrise.yml file, you need to include at least the Step ID. Optionally, you can specify the StepLib source and the Step version, too." +sidebar_position: 2 +slug: /bitrise-ci/references/steps-reference/step-reference-id-format +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SpecialStepSources from '@site/src/partials/special-step-sources.mdx'; + +A Step reference can contain three components: + +1. The StepLib source: a library of Step repositories, such as the official [Bitrise Step Library](https://github.com/bitrise-steplib). +1. The Step ID: every Step must have an ID as part of its `step.yml` definition. +1. The Step version: the numerical version of the Step you want to include. + +Use the following syntax to reference a Step: + +``` +::@: +``` + +From these three components only the Step ID is required. For example: + +``` +- script: +``` + +This could be written as: + +``` +https://github.com/bitrise-io/bitrise-steplib.git::script@1: +``` + +- If the version is not defined, the latest version of the step will be used. +- If the StepLib source is not defined, the `default_step_lib_source` will be used. + +We recommend pinning the major version of a Step when referencing it. In the example above, `script@1` means major version 1 of the [**Script**](https://github.com/bitrise-io/steps-script) Step is pinned: the Step will run with the latest available minor and patch versions of the Step. For example, if the latest minor version is 1.2, and the latest patch version is 1.2.2 then pinning major version 1 means the Step will use version 1.2.2. + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/_category_.json b/docs/bitrise-ci/run-and-analyze-builds/_category_.json new file mode 100644 index 0000000..9bf6e97 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Run and analyze builds", + "position": 4, + "link": null +} diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-annotations.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-annotations.mdx new file mode 100644 index 0000000..8d72f45 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-annotations.mdx @@ -0,0 +1,27 @@ +--- +title: "Build annotations" +description: "Build Annotations allow you to add relevant build information directly on the Bitrise build details page, simplifying the process of accessing crucial data during build progression and debugging." +sidebar_position: 8 +slug: /bitrise-ci/run-and-analyze-builds/build-annotations +sidebar_label: Build Annotations +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_FormattingYourAnnotations from '@site/src/partials/formatting-your-annotations.mdx'; +import Partial_AnnotatingABuild from '@site/src/partials/annotating-a-build.mdx'; + +Build Annotations allow you to add relevant build information directly on the Bitrise build details page, simplifying the process of accessing crucial data during build progression and debugging. + +The annotations are generated using Markdown styling. Some use cases include: + +- Detailed test results for custom tools. +- Emphasizing warnings or error messages. +- Security and vulnerability scan reports. +- Static analysis reports. +- Links to deployed artifacts. + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/_category_.json b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/_category_.json new file mode 100644 index 0000000..df22e04 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Build data and troubleshooting", + "position": 7, + "link": null +} diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer.md b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer.md new file mode 100644 index 0000000..89865d6 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer.md @@ -0,0 +1,135 @@ +--- +title: "AI build fixer" +description: "If you have a failed build, the Bitrise AI build fixer corrects it right on the build’s details page without you having to switch to other tools and processes. The AI build fixer executes the suggested code changes and pushes a PR to your GitHub repository." +sidebar_position: 9 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer +--- + +If you have a failed build, the AI build fixer corrects it right on the build’s details page without you having to switch to other tools and processes. The AI build fixer executes the suggested code changes and pushes a PR to your GitHub repository. You can check the changes through a link to the repo. Based on your configured build triggers, Bitrise kicks off a new CI build to validate the AI changes. This means less fragmented work and quicker debugging. + +:::note[AI build fixer credit consumption] + +Note that every run attempt of the AI build fixer costs two AI credits. + +::: + +## Configuring the AI build fixer + +To run the AI build fixer, you need to: + +- Turn on [AI build summary.](https://docs.bitrise.io/en/bitrise-platform/ai/ai-features-on-bitrise.html#ai-build-summary-99942) The AI build fixer builds on the outputs and suggestions of the build summary. +- Enable the AI build fixer on the **Project settings** page. +- Add your own trusted domains to the build fixer configuration. + +To do these: + +1. From your workspace's **Dashboard**, click **Settings** on the left. +1. [Enable AI features](/en/bitrise-platform/ai/enabling-ai-features-on-bitrise.html). +1. On the **Project settings** page of your project, select **Bitrise AI**. +1. [Switch the toggle to enable AI build summary](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.html). + + Without enabling it, you won't be able to use the AI build fixer since it relies on the findings of the AI Build summary. +1. Switch the toggle next to the **AI Build fixer**. + + ![2026-01-20-ai-build-fixer.png](/img/_paligo/uuid-311c03e1-c104-9bed-9744-f751497444a1.png) +1. To set the domains Bitrise AI build fixer can use, select your preferred option in the **Configure agent internet access** dialogue which appears after you enabled the toggle. Here are the two options to choose from: + + - **Use Bitrise trusted domains**: You can start with a preset list of domains and can add more if you wish. Here is the list of preset domains: + + ``` + alpinelinux.org + anaconda.com + apache.org + apt.llvm.org + archlinux.org + azure.com + bitbucket.org + bower.io + centos.org + cocoapods.org + continuum.io + cpan.org + crates.io + debian.org + docker.com + docker.io + dot.net + dotnet.microsoft.com + eclipse.org + fedoraproject.org + gcr.io + ghcr.io + github.com + githubusercontent.com + gitlab.com + golang.org + google.com + goproxy.io + gradle.org + hashicorp.com + haskell.org + hex.pm + java.com + java.net + jcenter.bintray.com + json-schema.org + json.schemastore.org + k8s.io + launchpad.net + maven.org + mcr.microsoft.com + metacpan.org + microsoft.com + nodejs.org + npmjs.com + npmjs.org + nuget.org + oracle.com + packagecloud.io + packages.microsoft.com + packagist.org + pkg.go.dev + ppa.launchpad.net + pub.dev + pypa.io + pypi.org + pypi.python.org + pythonhosted.org + quay.io + ruby-lang.org + rubyforge.org + rubygems.org + rubyonrails.org + rustup.rsrvm.io + sourceforge.netspring.io + swift.orgubuntu.com + visualstudio.com + yarnpkg.com + ``` + - **Add domains manually:** You can add the domains (for example, a hosted git provider or a dependency store) you want our build fixer to access. Note that you must add your git provider here, otherwise our Build agent won’t be able to access it. + + ![configure-agent-internet-access-bitrise.png](/img/_paligo/uuid-f2b44f50-8b8a-8c8e-48dd-c12a800692d0.png) + +Once you enabled the Bitrise AI, the Bitrise Build fixer and set the domains, you can use the AI build fixer as well. + +:::note[Your code is safe with us] + +The Bitrise AI build fixer does not store any secrets or credentials while fixing your code or pushing the PR to your repo. For each fix attempt, it uses a one time only virtual machine which gets destroyed at the end of the run. + +::: + +## Running the AI build fixer + +Now you are all set to run the AI build fixer on your project: + +1. Go to your projects **Builds** page and select a failed build. +1. On the **Build log** tab go to **Bitrise AI** and click **Show details**. +1. Under**Failure reasons** click **Fix with AI**. + + ![fix-with-ai.png](/img/_paligo/uuid-e3205cde-6fb9-f316-9666-a22617129183.png) +1. Click **Continue with fix**if you want Bitrise AI to start a build fixer agent and push changes to your current branch. + + ![fix-build-with-ai.png](/img/_paligo/uuid-49707b16-e6a3-6f4e-ea0a-869f23923758.png) +1. Once the AI build fixer has run, it produces links to the**Triggered build**, **Pushed changes to GitHub**and to the **Agent logs** for you to check changes and approve. You are ready to merge the PR into your project's repository. + + ![produced_links-ai-build-fixer.png](/img/_paligo/uuid-623c579f-869c-110a-da28-346d2a574ac0.png) diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.mdx new file mode 100644 index 0000000..02fd278 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.mdx @@ -0,0 +1,27 @@ +--- +title: "AI build summary" +description: "The Bitrise AI analyzer gives you a summary of why a CI build failed and suggests the fix right there on the build page." +sidebar_position: 8 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +Our AI analyzer gives you a summary of why a CI build failed and suggests the fix right there on the build page. + +![2025-09-30-ai-summary.png](/img/_paligo/uuid-09bb51b3-e156-8f2e-4141-e71b46951f5c.png) + +To enable the feature: + +:::note[Disabling AI] + +If you prefer not to use any AI features at all, you can disable all of them through the AI Settings menu in your Workspace settings page: [Enabling AI features on Bitrise](/en/bitrise-platform/ai/enabling-ai-features-on-bitrise) + +::: + +1. +1. Select **Bitrise AI** on the left. +1. Find **Summary** and toggle it on. diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github.mdx new file mode 100644 index 0000000..5a9aaa0 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github.mdx @@ -0,0 +1,48 @@ +--- +title: "Bitrise Checks on GitHub" +description: "The Bitrise GitHub app provides an extended version of the classic status checks Bitrise sends back to GitHub." +sidebar_position: 5 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github +sidebar_label: GitHub Checks with the Bitrise GitHub App +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_InstallingTheBitriseGitHubAppForGitHubChecks from '@site/src/partials/installing-the-bitrise-github-app-for-github-checks.mdx'; +import Partial_EnablingGitHubChecks from '@site/src/partials/enabling-github-checks.mdx'; +import Partial_GitHubChecksTestSummary from '@site/src/partials/github-checks-test-summary.mdx'; +import Partial_DisablingGitHubChecks from '@site/src/partials/disabling-github-checks.mdx'; + +:::important[GitHub App integration] + +If you use the Bitrise GitHub App to connect a Bitrise Workspace to a GitHub account or organization, you don't need to do anything described in this section: GitHub Checks will automatically work for you to provide status updates. + +You can, however, continue to use the OAuth connection for your apps and use GitHub Checks with our GitHub App. + +::: + +The Bitrise GitHub App provides, among other things, an extended version of the classic build status checks that Bitrise sends back to GitHub. This extended version includes a Bitrise build summary and a check status. You can view the checks if you click the **Details** link of a pull request on GitHub. It unfolds the detailed build summary and build status our GitHub app attaches to your pull request on the **Checks** tab of GitHub. + +![Bitrise_Checks_on_GitHub_Checks.png](/img/_paligo/uuid-d3db0692-cdd1-86cb-615a-955fd97587e9.png) + +![Bitrise_Checks_on_GitHub_Checks.jpg](/img/_paligo/uuid-0268c55e-cc52-4a65-4f01-f1db5f281a4e.jpg) + +There can be three different check statuses: + +- Success. +- Failed. +- Action required (in the case of manual pull request approval). + +To start using the Bitrise app to send status checks, you need to perform two separate actions: + +1. [Install the Bitrise app](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github/installing-the-bitrise-github-app-for-github-checks): This is only necessary for GitHub.com users. GitHub Enterprise Server users who [already set up the integration](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise) can proceed to enable the status checks with the app. +1. [Enable the Bitrise app](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github/enabling-github-checks): Turn on the feature on the Bitrise website and run a first build to be able to select the Bitrise app in your branch protection rules. + + + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.mdx new file mode 100644 index 0000000..eb7aac7 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.mdx @@ -0,0 +1,30 @@ +--- +title: "Build logs" +description: "On Bitrise, build logs are easily accessible: they can be viewed on the website in their entirety or they can be downloaded to view them on your own device." +sidebar_position: 1 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_FindingABuildLog from '@site/src/partials/finding-a-build-log.mdx'; +import Partial_FollowingABuildLogLive from '@site/src/partials/following-a-build-log-live.mdx'; +import Partial_DownloadingABuildLog from '@site/src/partials/downloading-a-build-log.mdx'; +import Partial_ContentsOfABuildLog from '@site/src/partials/contents-of-a-build-log.mdx'; +import Partial_NOTEBuildRetentionFor200Days from '@site/src/partials/note-build-retention-for-200-days.mdx'; +import Partial_DeletingABuildLog from '@site/src/partials/deleting-a-build-log.mdx'; + +Build logs allow users to analyze their builds and find out what went wrong - and what went right! On Bitrise, build logs are easily accessible: they can be viewed on the website in their entirety or they can be downloaded to view them on your own device. + + + + + + + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details.mdx new file mode 100644 index 0000000..32c54a3 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details.mdx @@ -0,0 +1,24 @@ +--- +title: "Checking build details" +description: "You can find additional details about a specific build by accessing the build's Details tab." +sidebar_position: 7 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AccessingBuildsTabAndSelectingABuild from '@site/src/partials/accessing-builds-tab-and-selecting-a-build.mdx'; + +You can find additional details about a specific build by accessing the build's **Details** tab. The details include when the build was triggered, when it started and finished, its infrastructure details (such as the agent version or the hostname), its parameters, and even the exact command that was used to launch it. + +To check the details: + +1. +1. Select the **Details** tab. + + ![details-tab.png](/img/_paligo/uuid-6b6e5440-9a6c-5fec-0970-63b75c992d1a.png) + +Additionally, if you want more information about a build’s runtime behavior and some help in diagnosing performance-related failures, check the **VM monitoring** tab. + +VM monitoring shows CPU, memory, and disk usage over the build’s lifetime. It is time-aligned with the build timeline, so you can correlate resource spikes with specific steps, logs, or long-running operations. diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine.mdx new file mode 100644 index 0000000..a6a0a5f --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine.mdx @@ -0,0 +1,40 @@ +--- +title: "Debugging your build on your own machine" +description: "If your build fails on Bitrise, we often recommend to try and run it locally. To debug: use a full clean git clone, and run the build on your machine with the Bitrise CLI." +sidebar_position: 3 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TestingWithAFullCleanGitClone from '@site/src/partials/testing-with-a-full-clean-git-clone.mdx'; +import Partial_TestingWithTheBitriseCLI from '@site/src/partials/testing-with-the-bitrise-cli.mdx'; + +If your build fails on Bitrise, we often recommend to try and run it locally, on your machine. To do this, do the following: + +- Do a full clean git clone of your project’s online repository. +- Run the build on your machine with the Bitrise CLI. + +This helps to eliminate, among other things, a very common issue: that uncommitted or gitignored files are in your working directory but they haven’t been committed into your git repository online and therefore they are not available when Bitrise clones the repository for running the build. Other possible issues include: + +- Code signing files are present on your local machine but not uploaded to Bitrise. +- A difference in the version of the tool(s) used for the build. + + + + + +:::tip[Android projects] + +If you still can’t reproduce the issue locally, you might also want to delete the `$HOME/.gradle` (hidden) directory, to clear your Gradle caches. (Quick Terminal / Command Line command: `rm -rf $HOME/.gradle`). + +::: + +:::tip[Run docker from a clean git clone] + +If your project uses the Android/Linux environment, you can download and use the exact same environment as the one your build is running in on [bitrise.io](https://www.bitrise.io/). + +Ideally, you should first do a clean git clone and run `docker` from there, so that files which are in your `.gitignore` won’t affect the build, and the build can run the the same way as on [bitrise.io](https://www.bitrise.io/). + +::: diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/index.md b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/index.md new file mode 100644 index 0000000..4e73e53 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/index.md @@ -0,0 +1,7 @@ +--- +title: "Build data and troubleshooting" +sidebar_position: 7 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting +--- + +Build data and troubleshooting diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build.mdx new file mode 100644 index 0000000..b405d67 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build.mdx @@ -0,0 +1,18 @@ +--- +title: "Rebuilding a failed build" +description: "If a Bitrise build fails, you can rebuild any time to quickly recover from any errors. You can rebuild either single Workflows or an entire Pipeline." +sidebar_position: 2 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RebuildingAFailedWorkflowBuild from '@site/src/partials/rebuilding-a-failed-workflow-build.mdx'; +import Partial_RebuildingAFailedPipeline from '@site/src/partials/rebuilding-a-failed-pipeline.mdx'; + +If a build fails, you can rebuild any time to quickly recover from any errors. You can rebuild either single Workflows or an entire Pipeline. A rebuild always uses the current configuration YAML file: if a build fails and then you modify your configuration and rebuild, the rebuild will run with the new configuration. + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access.mdx new file mode 100644 index 0000000..5c919b1 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access.mdx @@ -0,0 +1,49 @@ +--- +title: "Remote access" +description: "Remote access allows users to connect to their build’s virtual machines via SSH or a screenshare app, which you can access from your build's Build details page." +sidebar_position: 4 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RemoteAccessWithVisualStudioCode from '@site/src/partials/remote-access-with-visual-studio-code.mdx'; +import Partial_ExtendingTheAvailabilityOfRemoteAccess from '@site/src/partials/extending-the-availability-of-remote-access.mdx'; +import Partial_FindingYourFilesOnTheVM from '@site/src/partials/finding-your-files-on-the-vm.mdx'; +import Partial_RemoteAccessWithSSH from '@site/src/partials/remote-access-with-ssh.mdx'; +import Partial_RemoteAccessWithScreenshare from '@site/src/partials/remote-access-with-screenshare.mdx'; + +Remote access allows users to connect to a running build machine for easier debugging. A failed build can be rebuilt with remote access enabled to make troubleshooting a lot easier - for example, if the build logs don’t provide enough information about the error. + +You can rebuild both standalone builds and [pipeline builds](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html) with remote access. + +:::important[Authorization] + +Users who have the **Testers/QA** roles on the app CANNOT use remote access. + +::: + +There are three ways to use remote access: + +- [Visual Studio Code](#UUID-3a4bfcd1-2a82-8eec-e9c9-79bb064435a8): connect the Bitrise build to your local VSCode app as a remote repository. +- **SSH**: classic remote shell connection from your terminal. +- **Screenshare**: remote screen sharing withour VNC client of choice. Works with macOS builds only. + +With either method, you can access the build machine remotely during the build and for 10 minutes after the build is finished. If you would like to extend the availability of remote access, you can do so by adding a simple custom [Script](https://github.com/bitrise-io/steps-script) Step after the failed Step. Check out [Extending the availability of remote access](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access/extending-the-availability-of-remote-access) for more information. + +:::important[Build time] + +When using remote access, 10 minutes will be added to your overall build time. + +::: + + + + + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments.md b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments.md new file mode 100644 index 0000000..647ffbc --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments.md @@ -0,0 +1,89 @@ +--- +title: "Reporting build problems in PR comments" +sidebar_position: 6 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments +--- + +You can receive debugging information from Bitrise builds in Pull Request (PR) comments. This brings build insights directly into your PR timeline to accelerate problem resolutions and reduce context switching. + +:::note[Service Credential User and PR comments] + +Note that PR comments will be posted using a [service credential user account](https://docs.bitrise.io/en/bitrise-platform/integrations/the-service-credential-user.html) or the [Bitrise GitHub App](/en/bitrise-platform/repository-access/github-app-integration) if that is in use, rather than your personal account. + +::: + +## Configuring PR comments in Bitrise + +Configure PR comments with just a few clicks: + +1. Open your project on Bitrise with a user who has either the **Admin** role or the **Owner** role on the project. +1. On the main page of the project, click on the **Project settings** button. +1. Click **Integrations** on the left. +1. On the **Git provider** tab, scroll down to **Build reporting** and enable the toggle for **PR comments**. +1. If you wish to further edit the settings, click **Change settings**. + + ![project_settings_debugginginfoinPRs.png](/img/_paligo/uuid-5be9939f-1e31-2a9d-6c18-016f86734943.png) +1. In the **Configure PR comments**window, all information blocks are selected by default, but you can uncheck any that you do not want to include in PR comments. The information blocks are the following: + + - **Build summary**: Provides an overview of your build. + - **Step failures**: Provides details on which build Steps failed and why. + - **Test failures**: Provides information on failed tests. + - **Flaky tests**: Provides insights into tests that are inconsistent. + + ![configurePRcomments_debugginginfoinPRcomments.png](/img/_paligo/uuid-5f7b1066-7b97-56e9-54c2-cd2094b7e2d5.png) +1. Under **Comment mode**, you can choose a comment mode to receive either a single comment or multiple comments. + + - **Single comment**: Each build on the PR replaces any existing comments from a previous build, so the PR displays only the comment from the most recent build. + - **Multiple comments**: Each build on the PR adds a new comment, preserving a running history in the PR timeline. + + :::note[More on Comment mode] + + One PR build means one comment. However, multiple different Workflows on the same PR means multiple comments regardless of the **Comment mode** you choose. If the same Workflow is re-triggered, it adds new comments or updates the existing ones on the PR based on the chosen **Comment mode**. + + ::: + +## Receiving comments only for failed builds + +If you have checked all the information blocks, you will receive a comment for both successful and failed builds. In this case, comments from successful builds will include a summary of the build. See examples below: + +![reportingbuildproblemsfirstpic.png](/img/_paligo/uuid-91fa95b8-0325-7201-68ee-ddb01087718a.png) + +![reportingbuildproblemssecondpic.png](/img/_paligo/uuid-33093867-a2c4-50e5-79ca-cf8fba179e41.png) + +To prevent receiving comments on your successful builds from Bitrise, uncheck the “Build Summary” block and select the other boxes as needed. This way, you’ll only receive comments like below when there’s a problem in your build. + +![reportingbuildproblemsthirdpic.png](/img/_paligo/uuid-74995bb5-af37-b70b-03e0-218fc8e978f7.png) + +## FAQ about embedding debug information in PR commits + +**Who is the author of these PR comments?** + +This depends on the type of authentication. The [Service Credential User](https://docs.bitrise.io/en/bitrise-platform/integrations/the-service-credential-user.html) account posts comments if you [authenticate with the OAuth method](https://docs.bitrise.io/en/bitrise-platform/integrations/connecting-your-github-gitlab-bitbucket-account-to-bitrise.html). This applies for all Git providers, for example, Github, Gitlab, Bitbucket. + +If you use the [Bitrise GitHub app](/en/bitrise-platform/repository-access/github-app-integration), the associated Bitrise bot will post the comment. + +**Which Git providers are supported?** + +All major Git providers—GitHub, GitLab, and Bitbucket — are supported. + +**Will these comments appear for every PRs?** + +It's an opt-in feature per project. Comments will only be posted if you have opted into this for the project. + +**Will PR comments include full logs?** + +No. Comments include concise error snippets and links back to the full build and Step logs on Bitrise. Use the link to open the Bitrise dashboard for the full context. + +**What if it’s a pipeline build with many workflows? Will the comment show which Workflow the failing Step or test belongs to?** + +If enabled, you will get one PR comment for the pipeline build. Information will be grouped per Workflow. + +**Can I change settings per Workflow/Pipeline?** + +No. It is a project-level setting and is not customizable per Workflow/Pipeline. + +**What if I trigger multiple builds from the same PR? Will there be one comment or multiple comments?** + +If you trigger multiple builds that are distinct (for example, a PR triggered three distinct pipelines A, B, and C), you will receive multiple comments. + +If you trigger multiple builds that are the same (for example, a PR triggered the same pipeline twice, one after the other), then you will receive one comment if you selected **Single comment** mode, or multiple comments if you selected **Multiple comments** mode. diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports.md b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports.md new file mode 100644 index 0000000..b23db90 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports.md @@ -0,0 +1,34 @@ +--- +title: "Viewing HTML reports" +description: "View dynamically generated rich HTML content (for example, code coverage reports or performance reports) directly on the Bitrise UI: no need to download the report and use a separate tool to view it." +sidebar_position: 10 +slug: /bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports +--- + +If you generate some form of rich HTML content (for example, code coverage reports or performance reports) during your Bitrise build, you do not have to download and view the report in a separate tool: you can view the content directly on the Bitrise UI. You don't have to embed everything in the HTML file either: Bitrise will parse all images, CSS files and Javascript files to display the full content as intended. + +![after.gif](/img/_paligo/uuid-ab2808a9-e648-a309-8e76-6aa126e8047c.gif) + +To view an HTML report on Bitrise: + +1. Generate your HTML report during a build. +1. Create a subfolder of the BITRISE_HTML_REPORT_DIR directory with a descriptive name. The name of the folder will be the title of your report on the UI. + + BITRISE_HTML_REPORT_DIR is an Environment Variable pointing to the directory where Bitrise is looking for the HTML reports. +1. Make sure your generated report is deployed to your subfolder. + + :::tip[Multiple reports] + + You can generate multiple reports in multiple subfolders. Each report must have an `index.html` file. + + ::: +1. Run a build. +1. Once the build is finished, go to the build's page and select the **Artifacts** tab. You can find your report under the **HTML reports** section. + + :::note[Seven day limit] + + Each HTML report is available for seven days. + + ::: + + ![image1.png](/img/_paligo/uuid-712cfa80-b11d-3b99-d09a-158ea80f051b.png) diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning.mdx new file mode 100644 index 0000000..4d57c00 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning.mdx @@ -0,0 +1,23 @@ +--- +title: "Build numbering and app versioning" +description: "All Bitrise builds have a build number. The first build of your app is, by default, number 1, and the build number gets incremented with each build. You can also change your build number manually." +sidebar_position: 6 +slug: /bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingUpAppVersioningAutomaticallyOnBitrise from '@site/src/partials/setting-up-app-versioning-automatically-on-bitrise.mdx'; +import Partial_OffsettingTheBuildVersion from '@site/src/partials/offsetting-the-build-version.mdx'; +import Partial_ChangingTheNumberOfYourBuild from '@site/src/partials/changing-the-number-of-your-build.mdx'; + +All Bitrise builds have a build number. The first build of your app is, by default, number 1, and the build number gets incremented with each build. You can get a build’s Bitrise build number on the website, as well as via the `$BITRISE_BUILD_NUMBER` Environment Variable. This variable can be used in any Step or script where you need the Bitrise build number for any reason. + +You can also take care of your app’s versioning automatically, using Bitrise. We have two Steps to do it for you: [Setting up app versioning automatically on Bitrise](/en/bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning/setting-up-app-versioning-automatically-on-bitrise) + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-statuses.md b/docs/bitrise-ci/run-and-analyze-builds/build-statuses.md new file mode 100644 index 0000000..8e3f438 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-statuses.md @@ -0,0 +1,31 @@ +--- +title: "Build statuses" +description: "On the Builds page, you can track the current status of all your builds. There are six different build statuses: on hold, starting, running, aborted, failed, and success." +sidebar_position: 4 +slug: /bitrise-ci/run-and-analyze-builds/build-statuses +--- + +On the **Builds** page of a project, you can track the current status of all your builds. There are six different build statuses: + +- **On hold**: There are more builds started than what your current plan allows. In most cases, this is only relevant for legacy, concurrency-based plans: it means you don't have enough concurrency to start another build. + + :::note[Time limit] + + All builds on hold are aborted after 30 days to ensure no build gets permanently stuck. + + ::: +- **Starting**: When a build is triggered, Bitrise creates a virtual machine to run it. If computing resources aren’t immediately available, the build is placed in a queue. Once a worker is available, the worker assigned to create the virtual machine is processing the build request. +- **Running**: Once a virtual machine is ready to go, the build starts running. This means that Bitrise is executing all the Steps defined in your Workflow. +- **Aborted**: A build can be aborted manually by the user, or automatically either by the [Rolling builds feature]() or because your build time has run out. + + :::note[Aborted with success] + + There is a specific status called Aborted with success: this means the build has been aborted by the API but it is reported as a success to your git hosting provider. + + Use the abort_with_success parameter with [a Bitrise API call to abort a build](/en/bitrise-ci/api/triggering-and-aborting-builds/aborting-a-build) but still count it as a successful one. + + ::: +- **Failed**: In most cases, a build fails if any of the Steps fails. There are exceptions, such as the [caching Steps](), and you can [mark Steps as skippable](https://support.bitrise.io/hc/en-us/articles/4405252562577) which means even if they fail, the build will keep running. +- **Success**: If Bitrise successfully executes all Steps that aren’t marked as skippable, the build is marked as successful. + +You can always check your build status on the **Builds** page of the project, and you can send status reports: [Reporting the build status to your Git hosting provider](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider) diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/_category_.json b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/_category_.json new file mode 100644 index 0000000..a827735 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Build triggers", + "position": 2, + "link": null +} diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers.mdx new file mode 100644 index 0000000..615d861 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers.mdx @@ -0,0 +1,47 @@ +--- +title: "About build triggers" +description: "Use build triggers to start one or more Bitrise builds automatically. A trigger's definition contains a code event and one or more conditions that the event must match in order to trigger a build." +sidebar_position: 1 +slug: /bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TriggerVariables from '@site/src/partials/trigger-variables.mdx'; +import Partial_MergeQueueSupport from '@site/src/partials/merge-queue-support.mdx'; +import Partial_TriggerPriority from '@site/src/partials/trigger-priority.mdx'; + +Use build triggers to start one or more Bitrise builds automatically. A trigger's definition contains a code event and one or more conditions that the event must match in order to trigger a build. + +You can define triggers within a Workflow or a Pipeline. They allow a single code event to trigger multiple different Workflows or Pipelines so you can run all the relevant parts of your CI process together based on the scope of code change, without bundling everything into a single Workflow or Pipeline. Each build will run independently and deliver individual results. + +For the detailed syntax of triggers and the exact trigger conditions, see [YAML syntax for build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers). + +## Code events + +You can use three types of code events to trigger builds: + +- **Code push**: Trigger a build automatically whenever you push code using commits that match your trigger conditions. For example, a commit to the specified branch of the project's repository triggers a build. +- **Pull request**: Trigger a build automatically whenever a pull request matches your trigger conditions. For example, you can specify source and/or destination branches where any pull request will trigger a build. + + :::important[Initial PR event] + + A pull request only triggers a build once, at its initial event. In most cases, that initial event is the creation of the pull request. For example, converting a PR to a draft PR will never trigger another build. To trigger builds for updates to a pull request, configure code push triggers for the new commits. + + ::: +- [**Git Tag**](https://github.com/Itelios/bitrise-steps-git-tag): Trigger a build automatically whenever a commit with a specific tag triggers a build. + +## Conditions + +A trigger condition is a filter for code events: instead of triggering a build on every pull request, you can configure triggers for pull requests targeting a specific branch. + +Different Git providers support different conditions. For the full table, see [Supported trigger conditions](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers/supported-trigger-conditions). + +Trigger conditions can be combined within a single trigger: for example, you can set up a pull request trigger that only triggers a build if the PR targets a specific branch AND contains a specific label. + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.mdx new file mode 100644 index 0000000..fb6a61a --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.mdx @@ -0,0 +1,33 @@ +--- +title: "Configuring build triggers" +description: "You can configure automatic build triggers on Bitrise by specifying a trigger event and a Workflow. You can trigger builds from code pushes, pull requests or Git tags." +sidebar_position: 3 +slug: /bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SupportedTriggerConditions from '@site/src/partials/supported-trigger-conditions.mdx'; +import Partial_SkippingABuildTriggeredByADraftPullRequest from '@site/src/partials/skipping-a-build-triggered-by-a-draft-pull-request.mdx'; +import Partial_TriggerForTheMostRecentGitCommit from '@site/src/partials/trigger-for-the-most-recent-git-commit.mdx'; +import Partial_DeactivatingATrigger from '@site/src/partials/deactivating-a-trigger.mdx'; +import Partial_CreatingTargetBasedTriggers from '@site/src/partials/creating-target-based-triggers.mdx'; + +:::important[Existing trigger configurations] + +This page details information about target-based build triggers, defined within a Workflow or a Pipeline. We recommend this approach for all new users as it offers a more granular and flexible build trigger system. + +Existing configurations might use legacy, project-based triggers. Read more about them: [Legacy project-based triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers). + +::: + + + + + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/index.md b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/index.md new file mode 100644 index 0000000..2f9be89 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/index.md @@ -0,0 +1,7 @@ +--- +title: "Build triggers" +sidebar_position: 2 +slug: /bitrise-ci/run-and-analyze-builds/build-triggers +--- + +Build triggers diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers.mdx new file mode 100644 index 0000000..34a790f --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers.mdx @@ -0,0 +1,109 @@ +--- +title: "Legacy project-based triggers" +description: "Legacy or project-based triggers are defined on the project level: that is, the top level of your configuration YAML file. The trigger defines which Workflow or Pipeline should run when a given code event happens. A single code event can only trigger a single build." +sidebar_position: 7 +slug: /bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CreatingProjectBasedTriggers from '@site/src/partials/creating-project-based-triggers.mdx'; +import Partial_ProjectBasedTriggerComponents from '@site/src/partials/project-based-trigger-components.mdx'; + +:::important[Legacy triggers] + +This page is about legacy triggers that are defined on a project level. For new users, we strongly recommend using the target-based build triggers which are defined on the level of Workflows and Pipelines as they allow more flexibility in designing your triggers: [Configuring build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers). + +::: + +Legacy or project-based triggers are defined on the project level: that is, the top level of your configuration YAML file. The trigger defines which Workflow or Pipeline should run when a given code event happens. A single code event can only trigger a single build. + + + +## Disabling a project-based trigger + +To disable a project-based build trigger: + + + + +1. Open the Workflow Editor on Bitrise. +1. On the left, select **Triggers**. +1. Select the appropriate tab, depending on the trigger you want to deactivate. + + ![two-pr-triggers.png](/img/_paligo/uuid-84db9e9c-38a7-4d55-1911-7671964db062.png) +1. Set the trigger to **Inactive**. + + + + +1. Open your configuration YAML file. +1. Find the `trigger_map` property and the trigger you want to disable. +1. Add `enabled: false` to it. + + ``` + trigger_map: + - type: push + push_branch: main + workflow: primary + enabled: false + ``` + + + + +## Project-based trigger syntax + +A project-based trigger has three main elements in its YAML syntax: + +- The type of the trigger: `push`, `pull_request`, or `tag`. +- The trigger condition. For example, the source branch of a pull request. +- The Workflow or Pipeline to be triggered. + +One trigger means one build: a single project-based trigger can only trigger a single Workflow or Pipeline. You can [chain Workflows together](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together) run several Workflows in succession from a single trigger. + +Below is a single trigger that triggers a build with the `primary` Workflow when a pull request is opened from any branch. + +``` +trigger_map: +- pull_request_source_branch: "*" + type: pull_request + workflow: primary +``` + +### Multiple matching triggers + +For project-based triggers, the first trigger with matching conditions triggers a build. This means the order of the triggers is important: + +``` +trigger_map: +- type: push + push_branch: main + workflow: primary +- type: push + commit_message: deploy + workflow: deploy +``` + +The first trigger triggers the `primary` Workflow if code is pushed to the `main` branch of the app's repository. + +The second trigger triggers the `deploy` Workflow if a commit with the commit message `deploy` is pushed to any branch of the repository. + +What happens when a commit is pushed to the `main` branch with the commit message `deploy`? The commit matches all conditions of the first trigger so the `primary` Workflow is triggered. In this scenario, the `deploy` Workflow is NOT triggered, even though the commit matches all conditions of that trigger, too. + +### Multiple trigger conditions + +If you define multiple trigger conditions in a single project-based trigger then all conditions have to match in order to trigger a build. For example: + +``` +trigger_map: +- pull_request_target_branch: "main" + pull_request_source_branch: "develop" + type: pull_request + workflow: primary +``` + +This will only select the `primary` workflow if the pull request’s source branch is `develop` AND the target branch is `main`. + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request.mdx new file mode 100644 index 0000000..06fad5d --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request.mdx @@ -0,0 +1,27 @@ +--- +title: "Skipping a given commit or pull request" +description: "Depending on your settings, every code change in your repository can trigger Bitrise builds. However, if you need to, you can skip a specific commit or pull request." +sidebar_position: 6 +slug: /bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ExitingABuildTriggeredByADraftPR from '@site/src/partials/exiting-a-build-triggered-by-a-draft-pr.mdx'; +import Partial_SkippingBitriseCI from '@site/src/partials/skipping-bitrise-ci.mdx'; +import Partial_SkippingAComment from '@site/src/partials/skipping-a-comment.mdx'; +import Partial_PreventingACommitFromTriggeringABuild from '@site/src/partials/preventing-a-commit-from-triggering-a-build.mdx'; +import Partial_PreventingAPullRequestFromTriggeringABuild from '@site/src/partials/preventing-a-pull-request-from-triggering-a-build.mdx'; + +Depending on your settings, every code change in your repository can trigger Bitrise builds. However, if you need to, you can skip a specific commit or pull request. Skipping means, in this context, that a code change will NOT trigger a build on Bitrise, even if the triggers are set up to do so. + + + + + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger.md b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger.md new file mode 100644 index 0000000..ddf6d1d --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger.md @@ -0,0 +1,101 @@ +--- +title: "Starting parallel builds with a single trigger" +description: "You can start multiple parallel builds by using the Bitrise Start for Build and the Bitrise Wait for Build Steps." +sidebar_position: 4 +slug: /bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger +--- + +:::tip[Using Build Pipelines to start parallel builds with a single trigger] + +If you have a credit-based account and you are planning on running multiple tasks parallel with a single trigger, we recommend using Build Pipelines. For more information, check out [Build Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html). + +::: + +If you have more than one concurrency or you have a credit-based account, you can run more than one build simultaneously. And since we want to make life as easy for you as possible, these builds can be started automatically, with a single trigger. Let’s go through how it works! + +In the example, we have three Workflows of a single app set up to run at the same time. Let’s call these Workflows **Trigger**, **Building** and **Testing**. The workflow called **Trigger** will be triggered by a pull request, and then the workflow will trigger **Building** and **Testing** which will run simultaneously. + +All workflows run on separate, clean Virtual Machines. They can also run on different types of stacks: to choose the stack for any Workflow, go to the Workflow Editor of the app and select the **Stack** tab. + +If any of the builds fail, the build will be considered a failed build. If the build is triggered by a webhook, Bitrise will send [a summarized build result](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html) to your Git provider. If any of the parallel builds fail, a failed status will be reported. + +:::important[No reports for "child" builds] + +Bitrise will send a Git status report only for the original "parent" build, the one that triggered all the other builds. The "child" builds will not send back status reports to your Git provider! + +For example, if build A triggers builds B and C, a status report will be sent once A is finished. There will be no separate status reports for builds B and C, however. + +::: + +What you need: + +- A Personal Access Token. +- A Secret Environment Variable storing the token. +- The **Bitrise Start Build** Step. +- The **Bitrise Wait for Build** Step. + +:::important[Bitrise Start Build Step on the CI] + +Since the **Bitrise Build Start** Step heavily relies on the parameters of the currently running build (for example, the app slug, build slug and the build number) to call the [see topic](urn:resource:component:43135), you cannot use the **Bitrise Build Start** Step locally. + +::: + +:::tip[bitrise.yml example] + +You can edit your `bitrise.yml` file on the **bitrise.yml** tab of the Workflow Editor, or you can edit the file locally. The example below focuses on the Bitrise UI, but if you prefer to use YAML format, [check out our example](#section-idm4542014264953632888099751584)! + +::: + +1. Create a **Personal Access Token** for your user. + + Go to **Profile Settings** and select the **Security** option on the left side. Click the **Generate new** button. + + ![Starting_parallel_builds_with_a_single_trigger.png](/img/_paligo/uuid-35a66242-8cc5-8b66-380d-a996c3012825.png) + + :::warning[Copying the token] + + Make sure the copy the token once it's generated: you won't be able to see it again! + + ::: +1. Create a Secret Environment Variable on the **Secrets** tab of the app’s Workflow Editor and add the token as its value. + + ![Starting_parallel_builds_with_a_single_trigger.png](/img/_paligo/uuid-d85ee7fd-2f40-5ae8-34ce-c79f638f3879.png) + + Feel free to use any key you wish for the secret. We recommend something simple like $ACCESS_TOKEN. +1. Add the **Bitrise Start Build** Step to the **Trigger** Workflow. + + Note that the **Bitrise Start Build** Step will set an Environment Variable to all builds it starts: $SOURCE_BITRISE_BUILD_NUMBER. Each build triggered by the Step will have their own build numbers but the source build number will be the same for all of them. +1. Add the secret env storing your personal access token to the **Bitrise Access Token** input of the Step: click the **Select secret variable** button and choose the key you created. + + ![Starting_parallel_builds_with_a_single_trigger.png](/img/_paligo/uuid-f9f9d575-5b1f-73c1-53ae-94ae13e0da3f.png) +1. Find the **Workflows** input of the Step, and add `Building` and `Testing` to it. + + ![Starting_parallel_builds_with_a_single_trigger.png](/img/_paligo/uuid-41d604b4-d929-893c-2ac9-aa44b3e01e85.png) +1. Add the **Bitrise Wait for Build** Step as the last Step of the **Trigger** Workflow. + + :::important[Checking build statuses] + + The Step checks statuses of the builds defined in the Step. The builds are defined in the **Build slugs** input: the slugs are the output of the **Bitrise Start Build** Step. As long as the builds defined by the slugs are running, the Step will hold the build it is running in. The build will fail if any of the builds included in the Step fail. + + ::: +1. Add the secret env storing your personal access token to the **Bitrise Access Token** input of the Step: click the **Select secret variable** button and choose the key you created. + + ![Starting_parallel_builds_with_a_single_trigger.png](/img/_paligo/uuid-ed66ae06-8ebc-cb93-e3e3-ce6c2e94b1de.png) + +And you are done! Once you trigger the **Trigger** workflow, the **Bitrise Start Build** Step of the Workflow will trigger two more builds running simultaneously. If those two builds are successful, the **Bitrise Wait for Build** Step lets the first build finish. A single status report is sent to the git hosting provider, regardless whether the build is successful or not. + +## bitrise.yml example + +``` +Trigger: + steps: + - build-router-start@0: + inputs: + - workflows: |- + Building + Testing + - access_token: "$BITRISE_API_KEY" + - build-router-wait@0: + inputs: + - access_token: "$BITRISE_API_KEY" +``` diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands.mdx new file mode 100644 index 0000000..29382f7 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands.mdx @@ -0,0 +1,29 @@ +--- +title: "Triggering builds by Slack commands" +sidebar_position: 5 +slug: /bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AvailableParametersForSlackCommands from '@site/src/partials/available-parameters-for-slack-commands.mdx'; + +You can trigger Bitrise builds from your Slack workspace by configuring [Slash Commands](https://api.slack.com/interactivity/slash-commands) in your Slack apps. Each Bitrise app needs its own Slash Command. + +1. Register the Bitrise webhook URL to your Slack app. + + :::note[Slack app reinstall] + + Creating a new Slash Command might require a reinstall of your Slack app. + + ::: +1. Use the command by adding at least the two required parameters to it: `workflow` and `branch`. + + ``` + /build-myapp workflow: run_tests|branch: main + ``` + + You can set a number of different parameters in the command call, including a commit hash, and any [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) that you want to pass on to the build. For more information on the available parameters, check out [Available parameters for Slack commands](/en/bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands/available-parameters-for-slack-commands). + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.mdx b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.mdx new file mode 100644 index 0000000..9bb7c5c --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.mdx @@ -0,0 +1,26 @@ +--- +title: "YAML syntax for build triggers" +description: "The configuration YAML files contain the definitions for build triggers. You can configure them directly in YAML without having to use the online Workflow Editor." +sidebar_position: 2 +slug: /bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TargetBasedTriggerComponents from '@site/src/partials/target-based-trigger-components.mdx'; +import Partial_TriggerSyntax from '@site/src/partials/trigger-syntax.mdx'; + +:::important[Existing trigger configurations] + +This page details information about target-based build triggers, defined within a Workflow or a Pipeline. We recommend this approach for all new users as it offers a more granular and flexible build trigger system. + +Existing configurations might use legacy, project-based triggers. Read more about them: [Legacy project-based triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers). + +::: + +The configuration YAML files contain the definitions for build triggers. You can configure them directly in YAML without having to use the online Workflow Editor. + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/finding-a-specific-build.mdx b/docs/bitrise-ci/run-and-analyze-builds/finding-a-specific-build.mdx new file mode 100644 index 0000000..2f35c2e --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/finding-a-specific-build.mdx @@ -0,0 +1,30 @@ +--- +title: "Finding a specific build" +description: "If your project has multiple builds, you can search for a specific one on the main page of the app by using a variety of options, like build number or commit message." +sidebar_position: 5 +slug: /bitrise-ci/run-and-analyze-builds/finding-a-specific-build +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_NOTEBuildRetentionFor200Days from '@site/src/partials/note-build-retention-for-200-days.mdx'; + + + +If your project has multiple builds on [bitrise.io](https://www.bitrise.io) , you can search for a specific one by using a variety of options. To do so: + +1. Open an project on Bitrise. +1. On the **Builds** page of the project, you can find the filter options and the search field above the list of builds. You have several options: + + ![builds-search.png](/img/_paligo/uuid-5447e1bd-56ac-3503-4473-18f9784a64bf.png) + + In the search field, enter either a build number or a commit message to find the build. + + Choose a filter from the status filter dropdown menu to find builds with a specific status. + + Choose a filter from the branch filter dropdown menu to find builds that ran on a specific branch. + + Choose a filter from the Workflows dropdown menu to find builds that ran with specific Workflows. + + Choose a filter from the triggers dropdown menu to find builds that were triggered by one of our trigger options: pushes, pull requests, or tags. diff --git a/docs/bitrise-ci/run-and-analyze-builds/index.md b/docs/bitrise-ci/run-and-analyze-builds/index.md new file mode 100644 index 0000000..e6d5d78 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/index.md @@ -0,0 +1,7 @@ +--- +title: "Run and analyze builds" +sidebar_position: 4 +slug: /bitrise-ci/run-and-analyze-builds +--- + +Run and analyze builds diff --git a/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/_category_.json b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/_category_.json new file mode 100644 index 0000000..b178e6d --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Managing build files", + "position": 3, + "description": "Using the Deploy to bitrise.io Step, you can deploy files generated during a build to bitrise.io. You can also upload code signing files. You can view uploaded files on the Apps & Artifacts tab of the build page.", + "link": null +} diff --git a/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy.mdx b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy.mdx new file mode 100644 index 0000000..e6ced0d --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy.mdx @@ -0,0 +1,54 @@ +--- +title: "Artifact retention policy" +description: "Bitrise stores both build artifacts and build logs for a limited amount of time. The retention period varies by artifact type to balance storage costs with typical usage patterns." +sidebar_position: 5 +slug: /bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Bitrise stores both build artifacts and build logs for a limited amount of time. The retention period varies by artifact type to balance storage costs with typical usage patterns. + +You can download build artifacts via the Bitrise API in order to store them: [Managing build artifacts](/en/bitrise-ci/api/managing-build-artifacts). + +When artifacts are removed, they are permanently deleted with no way to recover them. + +:::note[Older artifacts] + +Artifacts created before 31 March 2026 will be subject to the old retention policy: 365 days for standards artifacts, installable artifacts, and pipeline intermediate files, and 7 days for HTML reports. + +::: + +| Artifact Type | Retention Period | Custom retention period | +| --- | --- | --- | +| Builds and [build logs](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html) | 200 days Builds older than 200 days can still be accessed via the Bitrise API. | Unavailable | +| [Test results and all non-installable artifacts](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html) | 90 days | Available for Enterprise customers | +| Installable artifacts (.ipa, .akp and .aab files) | 150 days | Available for Enterprise customers | +| [HTML reports](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports.html) | 7 days | Unavailable | +| Pipeline intermediate files | 7 days | Unavailable | +| [CodePush](/en/release-management/codepush/about-codepush.html) packages | Retention limits are based upon size rather than age: your subscription plan determines the amount of storage you have. | Unavailable | + +## Archiving artifacts to your own storage + +To keep artifacts beyond the retention period, archive them using the Bitrise API: + +1. Generate a list of build artifacts to be archived: use `/apps/{app-slug}/builds` to generate a list of all the builds in one project. +1. For each build, list out all the artifacts for a given build using `/apps/{app-slug}/builds/{buildslug}/artifacts`. +1. For each artifact, get its download URL via `/apps/{app-slug}/builds/{buildslug}/artifacts/{artifact-slug}`. +1. Download each artifact using the list of download URLs. +1. Save all the artifacts in your storage of choice. + +## Custom retention policies + +Custom retention policies are available for Enterprise customers. Contact your Customer Success Manager to discuss. + +- Shorter retention: Available at no additional cost (useful for reducing storage overhead). +- Extended retention: Available for an additional fee. + +:::note[Standard and installable artifacts only] + +Custom retention periods only apply to standard artifacts and installable artifacts (not HTML reports or pipeline intermediate files). If you have multiple workspaces, you can apply your custom retention period across all of them, or request different retention periods for each one. + +::: diff --git a/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.mdx b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.mdx new file mode 100644 index 0000000..7245827 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.mdx @@ -0,0 +1,30 @@ +--- +title: "Build artifacts online" +description: "A build on Bitrise can and often does produce artifacts: for example, test reports, images, executable binaries. If you select a build of your app, on the **Artifacts** tab, you can check out the artifacts which have been generated during the build." +sidebar_position: 4 +slug: /bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TheInstallableArtifactsPage from '@site/src/partials/the-installable-artifacts-page.mdx'; +import Partial_ArtifactDetails from '@site/src/partials/artifact-details.mdx'; +import Partial_DeployingFilesIntoArtifacts from '@site/src/partials/deploying-files-into-artifacts.mdx'; + +Build artifacts are any files generated during a Bitrise build: test results, screenshots, executable binaries, and so on. You can view build artifacts at two places: + +- On the **Artifacts** tab of the build's page. Here you can view all artifacts. + + ![builds-artifacts-tab.png](/img/_paligo/uuid-447a76c6-96e0-a493-214d-484d92a36dc8.png) +- The **Artifacts** page on the main page of the app. Here you can only see the installable binaries. + + ![installable-artifacts-2.png](/img/_paligo/uuid-ad094f49-47bd-4ee0-a1f3-899a5d2a61a4.png) + +There is no limitation on the number of files deployed to the **Artifacts** tab per build. There is a limitation, however, on the file size which is 2GB per file. + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/index.md b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/index.md new file mode 100644 index 0000000..ca331df --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/index.md @@ -0,0 +1,18 @@ +--- +title: "Managing build files" +description: "Using the Deploy to bitrise.io Step, you can deploy files generated during a build to bitrise.io. You can also upload code signing files. You can view uploaded files on the Apps & Artifacts tab of the build page." +sidebar_position: 3 +slug: /bitrise-ci/run-and-analyze-builds/managing-build-files +--- + +Managing files on Bitrise allows you to upload files to use in your builds. Builds can also produce files as outputs. + +You can: + +- Upload files to the Generic File storage. +- Use uploaded files in your builds. +- Use encrypted files in your builds. + +Using the **Deploy to bitrise.io** Step, you can deploy files generated during a build to bitrise.io. You can view these files on the **Artifacts** tab of the build page. + +In addition, you can check out a build's generated installable artifacts (installable binaries, either IPA or APK/AAB) files [on the **Artifacts** page of a project](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online/the-installable-artifacts-page). The page shows all generated binaries from past builds and you can view the details of each file, including a QR code and a link to the public install page, both of which allow users to install the app on their devices. diff --git a/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.mdx b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.mdx new file mode 100644 index 0000000..e3593a8 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.mdx @@ -0,0 +1,48 @@ +--- +title: "Uploading files for your builds" +description: "If your build requires any files to make it work, you can upload them in the Code Signing tab of the Workflow Editor." +sidebar_position: 1 +slug: /bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ProtectingYourUploadedFiles from '@site/src/partials/protecting-your-uploaded-files.mdx'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +If your build requires any files to make it work, you can upload them to Bitrise on the **App settings** page. It accepts any file type, all you need to do is provide a unique ID and upload the file. + +Once a file is uploaded, it is stored [as an Environment Variable (Env Var)](/en/bitrise-ci/configure-builds/environment-variables.html). You can use this Env Var to access the file and use it in your builds. The file can also be: + +- Downloaded by anyone who has either [admin or owner role](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) on the app’s team on Bitrise. You can prevent this: [see topic](#UUID-75c7d964-dcb3-2fa1-4d32-0654f62a10c6) +- Exposed to pull request builds. + +:::important[File restrictions] + +There are certain restrictions on upload size and number of files: + +- You can't upload a file bigger than 5 MB. +- You can only store a total of 5 different files at the same time. If you want to upload more, you need to delete one of the files in the storage. + +::: + +To upload a file: + +1. +1. On the left, select **Files**. +1. Click **Add file**. +1. In the dialog box, enter a unique ID in the **File Storage ID** input field. + + The unique ID will be part of the generated download URL that Bitrise stores as an [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html). + + ![add-new-file.png](/img/_paligo/uuid-3edf7fb2-6a3c-9e72-52c2-a5ec796816e7.png) +1. Upload the file. You have two options: + + Click anywhere in the **Select a file to upload** section and select the file from your computer. + + Drag and drop a file into the **Select a file to upload** section. + + Remember that the file size cannot exceed 5 MB. + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds.mdx b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds.mdx new file mode 100644 index 0000000..db8b32c --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds.mdx @@ -0,0 +1,24 @@ +--- +title: "Using encrypted files in your builds" +description: "You can use encrypted files on Bitrise, easily. After encrypting the file on your computer, upload it to the Generic File Storage and use the **Decrypt file** Step or your own custom decrypting solution to decrypt it when you need it." +sidebar_position: 3 +slug: /bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DecryptingYourFilesDuringABuild from '@site/src/partials/decrypting-your-files-during-a-build.mdx'; +import Partial_EncryptingYourFiles from '@site/src/partials/encrypting-your-files.mdx'; + +You can use encrypted files on Bitrise, easily and securely. All you need to do is encrypt the file on your computer, [upload it to the Generic File Storage](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html) and use the [**Decrypt file**](https://github.com/bitrise-steplib/bitrise-step-decrypt-file) Step or your own custom decrypting solution to decrypt it when you need it. + +:::note[GPG encryption] + +Please note that the [**Decrypt file**](https://github.com/bitrise-steplib/bitrise-step-decrypt-file) Step only decrypts files encrypted with GPG. If you use other encryption software, you will not be able to decrypt files using the Step. You can, of course, set up your own decryption solution in a [**Script**](https://github.com/bitrise-io/steps-script) Step. + +::: + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds.mdx b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds.mdx new file mode 100644 index 0000000..17feb61 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds.mdx @@ -0,0 +1,22 @@ +--- +title: "Using files in your builds" +description: "To use a file in your builds, you can download it using a Step like File Downloader in your Workflow, or you can use the file's automatically generated Env Var as a Step input." +sidebar_position: 2 +slug: /bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DownloadingAFileUsingTheFileDownloaderStep from '@site/src/partials/downloading-a-file-using-the-file-downloader-step.mdx'; +import Partial_DownloadingAFileUsingACustomScriptStep from '@site/src/partials/downloading-a-file-using-a-custom-script-step.mdx'; + +There are multiple ways to use files in your Bitrise builds. + +- Most Steps that generate files store the filepath in an output Environment Variable (Env Var). Subsequent Steps in the same Workflow can re-use that Env Var to access the file. +- You can [upload a file to the Generic File Storage](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html) and use the automatically generated Env Var as a Step input value in Steps that accept URLs as an input. +- You can [upload a file to the Generic File Storage](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html) and use one of our Steps (for example, the [**File Downloader**](https://github.com/bitrise-steplib/steps-file-downloader) Step) to download the file for the build. This works with Steps that require local file paths and as such do not support URLs directly as the input value. + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/starting-builds/_category_.json b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/_category_.json new file mode 100644 index 0000000..b0013df --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Starting builds", + "position": 1, + "description": "You can start builds on Bitrise in multiple ways: manually, by scheduling, setting up triggers, or by using the API.", + "link": null +} diff --git a/docs/bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds.mdx b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds.mdx new file mode 100644 index 0000000..78eab35 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds.mdx @@ -0,0 +1,52 @@ +--- +title: "Approving Pull Request builds" +description: "You have the option of requiring manual approval for Bitrise builds started by pull requests if the project contains exposed Secrets. This option cannot be deactivated for public projects." +sidebar_position: 3 +slug: /bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds +sidebar_label: Approving pull request builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +Not all pull requests need to be built. After all, for most projects, anyone can create a fork of the repository and submit a pull request. However, if a project on Bitrise is set up with [Secrets](/en/bitrise-ci/configure-builds/secrets.html) that are exposed for pull request builds, for example, then you probably don’t want just anyone to be able to access those secrets. + +That is why you have the option to require approval for [a pull request build](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) before it can start. This feature works somewhat differently for public and private projects: + +- Private projects: by default, pull requests submitted from a fork require approval. The setting can be changed. If your secrets are NOT exposed to PRs, the build will run without asking for approval. +- Public projects: pull requests submitted from a fork require approval by default and it cannot be changed. Public projects CANNOT opt out of this feature. + +## Enabling manual approval for private projects + +To enable or disable manual approval, you need to be an **Admin** or an **Owner** of the project. The project MUST be private: public projects cannot opt out of this feature! + +1. +1. On the left, select **Builds**. +1. Scroll down to **Manual build approval**. + + ![builds-pr-build-approval.png](/img/_paligo/uuid-4504890a-1b65-20b5-d16c-548bf94a890e.png) + + Please note that you can only change this setting for private projects! For public projects, this is always enabled. +1. Toggle the switch to enable or disable it. + + By default, it is set to disabled. + +## Approving the PR build + +:::important[Approving the PR build] + +Please note that approving a PR build means approving it on Bitrise. Approving a pull request on GitHub, for example, isn't sufficient to start a build on Bitrise: an owner has to approve the build on Bitrise itself. + +::: + +If a pull request is submitted from a fork, you will be notified that a PR build is waiting for approval: + +- A notification email will be sent with the name of the project, as well as links to the repository itself and to the project’s **Builds** page on Bitrise. +- On the Git provider, the status of the CI check will show **Pending - Waiting for approval** +- On the **Builds** page of the project, a confirmation box will be displayed. + + ![Approving_Pull_Request_builds.png](/img/_paligo/uuid-33ad7b4b-fc7e-c184-895e-b8b81463b2ee.png) + +To approve and run the build, click the **Approve and Run Build** button. Clicking **Review** opens the pull request on the website of your Git provider. diff --git a/docs/bitrise-ci/run-and-analyze-builds/starting-builds/index.md b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/index.md new file mode 100644 index 0000000..e26c904 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/index.md @@ -0,0 +1,21 @@ +--- +title: "Starting builds" +description: "You can start builds on Bitrise in multiple ways: manually, by scheduling, setting up triggers, or by using the API." +sidebar_position: 1 +slug: /bitrise-ci/run-and-analyze-builds/starting-builds +--- + +:::important[Pipelines] + +This section of the documentation deals with starting standalone Bitrise builds. For starting a Pipelines, check out [Pipeline builds](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds). + +::: + +You can start builds on Bitrise in multiple ways: + +- [Starting builds manually](/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually) +- [Scheduling builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds) +- [Configuring build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers) +- With the API: [Triggering and aborting builds](/en/bitrise-ci/api/triggering-and-aborting-builds) + +You can also configure Bitrise to skip certain commits or Git Tags, preventing these from triggering builds. diff --git a/docs/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.mdx b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.mdx new file mode 100644 index 0000000..319cc42 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.mdx @@ -0,0 +1,36 @@ +--- +title: "Scheduling builds" +description: "You can schedule your builds to run automatically at a specific time of the week." +sidebar_position: 2 +slug: /bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DeletingAScheduledBuild from '@site/src/partials/deleting-a-scheduled-build.mdx'; +import Partial_TriggeringAScheduledBuildManually from '@site/src/partials/triggering-a-scheduled-build-manually.mdx'; +import Partial_EditingAScheduledBuild from '@site/src/partials/editing-a-scheduled-build.mdx'; +import Partial_SchedulingABuild from '@site/src/partials/scheduling-a-build.mdx'; +import Partial_DisablingAScheduledBuild from '@site/src/partials/disabling-a-scheduled-build.mdx'; + +You can schedule your builds to run automatically at a specific time of the week so that you can check your logs when it’s most convenient for you. + +When scheduling a build, you can define custom [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html). You can also set advanced filters for Git Tags and for Git commit hash. + +If you have one or more regularly scheduled builds, you can: + +- Edit their configuration. +- Trigger them manually at any time. +- Temporarily disable them. +- Permanently delete them. + + + + + + + + + + diff --git a/docs/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.mdx b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.mdx new file mode 100644 index 0000000..40cb2a3 --- /dev/null +++ b/docs/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.mdx @@ -0,0 +1,39 @@ +--- +title: "Starting builds manually" +description: "You can start builds manually by selecting the app you need from your Dashboard and clicking the Start/Schedule build button." +sidebar_position: 1 +slug: /bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_StartingSchedulingABuildFirstTwoSteps from '@site/src/partials/startingscheduling-a-build-first-two-steps.mdx'; +import Partial_RunningWorkflowsFromTheWorkflowEditor from '@site/src/partials/running-workflows-from-the-workflow-editor.mdx'; +import Partial_StartingABuildBasicOptionsSteps from '@site/src/partials/starting-a-build-basic-options-steps.mdx'; +import Partial_AdvancedConfigurationOptions from '@site/src/partials/advanced-configuration-options.mdx'; + +Starting a build manually on Bitrise takes literally two clicks - if you leave everything on the default settings. If you do not wish to do that, or at least want to be sure what the default settings are, read on! + +To start a build using the basic configuration options: + +1. +1. + +:::note[Scheduling a build] + +The **Schedule this build** option allows you to configure builds to be triggered at specific times. Read more: [Scheduling builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds). + +::: + + + + + +## Rebuilding failed builds + +Another way of starting a build manually is to rebuild a failed build. You can: + +- Rebuild a Workflow build: [Rebuilding a failed Workflow build](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build/rebuilding-a-failed-workflow-build). +- Rebuild a Pipeline, either the entire Pipeline or only unsuccessful Workflows: [Rebuilding a failed Pipeline](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build/rebuilding-a-failed-pipeline). +- Rebuild with remote access: [Remote access](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access). diff --git a/docs/bitrise-ci/testing/_category_.json b/docs/bitrise-ci/testing/_category_.json new file mode 100644 index 0000000..cf8a310 --- /dev/null +++ b/docs/bitrise-ci/testing/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Testing", + "position": 7, + "link": null +} diff --git a/docs/bitrise-ci/testing/deploying-and-viewing-test-results.mdx b/docs/bitrise-ci/testing/deploying-and-viewing-test-results.mdx new file mode 100644 index 0000000..e58b52f --- /dev/null +++ b/docs/bitrise-ci/testing/deploying-and-viewing-test-results.mdx @@ -0,0 +1,24 @@ +--- +title: "Deploying and viewing test results" +description: "View your test results in one place after a Bitrise CI build. All tests will be available on the build page, even if you have multiple testing Steps in your Workflows." +sidebar_position: 7 +slug: /bitrise-ci/testing/deploying-and-viewing-test-results +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CollatingTestAttachmentsWithTestResults from '@site/src/partials/collating-test-attachments-with-test-results.mdx'; +import Partial_ViewingTestResults from '@site/src/partials/viewing-test-results.mdx'; +import Partial_UsingTheExportTestResultsToTheTestReportsStep from '@site/src/partials/using-the-export-test-results-to-the-test-reports-step.mdx'; +import Partial_DeployingTestResults from '@site/src/partials/deploying-test-results.mdx'; + +View your test results in one place after a Bitrise CI build. All tests will be available on the build page, even if you have multiple testing Steps in your Workflows. Our goal is to make sure you have accessible and `actionable` test results on Bitrise, leading to faster time to recover from test failures and a better overall developer experience. + + + + + + + + diff --git a/docs/bitrise-ci/testing/detecting-and-quarantining-flaky-tests.mdx b/docs/bitrise-ci/testing/detecting-and-quarantining-flaky-tests.mdx new file mode 100644 index 0000000..853bc4a --- /dev/null +++ b/docs/bitrise-ci/testing/detecting-and-quarantining-flaky-tests.mdx @@ -0,0 +1,17 @@ +--- +title: "Detecting and quarantining flaky tests" +sidebar_position: 8 +slug: /bitrise-ci/testing/detecting-and-quarantining-flaky-tests +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_QuarantiningFlakyTests from '@site/src/partials/quarantining-flaky-tests.mdx'; +import Partial_DetectingFlakyTests from '@site/src/partials/detecting-flaky-tests.mdx'; + +Flaky tests block PRs even when the code is fine. A single transient failure forces you to dig through logs, hit rerun, and wait, slowing merges and masking real regressions. + + + + diff --git a/docs/bitrise-ci/testing/device-testing-with-firebase/_category_.json b/docs/bitrise-ci/testing/device-testing-with-firebase/_category_.json new file mode 100644 index 0000000..814fb62 --- /dev/null +++ b/docs/bitrise-ci/testing/device-testing-with-firebase/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Device testing with Firebase", + "position": 5, + "description": "Bitrise offers a convenient device testing solution with Firebase Test Labs. You don't need your own Firebase account: you just need to build your iOS and Android apps for testing and then run the dedicated device testing Steps that runs your tests and can export them to the Tests tab.", + "link": { + "type": "doc", + "id": "bitrise-ci/testing/device-testing-with-firebase/index" + } +} diff --git a/docs/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android.mdx b/docs/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android.mdx new file mode 100644 index 0000000..d729989 --- /dev/null +++ b/docs/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android.mdx @@ -0,0 +1,28 @@ +--- +title: "Device testing for Android" +description: "With Bitrise’s Android virtual device testing solution, you can run UI tests on emulators without having to set up and register your own devices." +sidebar_position: 2 +slug: /bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RunningTests from '@site/src/partials/running-tests.mdx'; +import Partial_RunningInstrumentationTests from '@site/src/partials/running-instrumentation-tests.mdx'; + +With Bitrise’s Android virtual device testing solution, you can run UI tests on emulators without having to set up and register your own devices. + +:::note[Limitations] + +The maximum duration for virtual device testing is 30 minutes. + +A single build can contain only one **Virtual Device Testing** Step performing one type of test (`instrumentation`, `robo` or `gameloop`). + +::: + +Our device testing solution is based on [Firebase Test Lab](https://firebase.google.com/docs/test-lab/). You can find the resulting logs, videos and screenshots on Bitrise. + + + + diff --git a/docs/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.mdx b/docs/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.mdx new file mode 100644 index 0000000..c956b0a --- /dev/null +++ b/docs/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.mdx @@ -0,0 +1,25 @@ +--- +title: "Device testing for iOS" +description: "With Bitrise’s iOS device testing solution, you can run iOS tests on physical devices without having to set up and register your own devices." +sidebar_position: 1 +slug: /bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RunningDeviceTestsForIOSApps from '@site/src/partials/running-device-tests-for-ios-apps.mdx'; + +With Bitrise’s iOS device testing solution, you can run UI tests for iOS apps on physical devices without having to set up and register your own devices: you just need to use our dedicated Steps and set the device type(s) on which you want to test your app. There are no limits to using the Step, other than your overall build time limit. It also works for iOS apps developed using other frameworks, such as Flutter or React Native. + +Our device testing solution is based on [Firebase Test Lab](https://firebase.google.com/docs/test-lab/): it uses real, production devices running in a Google data center to test your app. The devices are flashed with updated APIs and have customizable locale settings. You can find the resulting logs, videos and screenshots on Bitrise. + +For iOS apps, Firebase Test Lab runs [XCTest](https://developer.apple.com/documentation/xctest) tests. Find the list of the available devices [here](https://firebase.google.com/docs/test-lab/ios/available-testing-devices). + +:::note[Limitations] + +You might be limited by your overall build time. Also note that a single build can contain only one [**iOS Device Testing**](https://github.com/bitrise-steplib/steps-virtual-device-testing-for-ios) Step, performing one type of test. This is because Bitrise sends the build slug to Firebase Test Lab. Sending the same build slug results in a `Build already exists`error. + +::: + + diff --git a/docs/bitrise-ci/testing/device-testing-with-firebase/index.mdx b/docs/bitrise-ci/testing/device-testing-with-firebase/index.mdx new file mode 100644 index 0000000..1987961 --- /dev/null +++ b/docs/bitrise-ci/testing/device-testing-with-firebase/index.mdx @@ -0,0 +1,18 @@ +--- +title: "Device testing with Firebase" +description: "Bitrise offers a convenient device testing solution with Firebase Test Labs. You don't need your own Firebase account: you just need to build your iOS and Android apps for testing and then run the dedicated device testing Steps that runs your tests and can export them to the Tests tab." +sidebar_position: 5 +slug: /bitrise-ci/testing/device-testing-with-firebase +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Bitrise offers a convenient device testing solution with Firebase Test Labs. You don't need your own Firebase account, nor do you need any complex configuration: you just need to build your iOS and Android apps for testing and then run the dedicated device testing Steps that runs your tests and can export them to the **Tests** tab. + +The solution also works for multiplatform projects, such as Flutter and React Native. + +- [Device testing for iOS](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.html): Build a test bundle from your `.xcodeproj` or `.xcworkspace` file and run device tests on real devices on Firebase. +- [Device testing for Android](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android.html): Build an APK and then run robo-, instrumented-, and gameloop tests with the device testing Step. +- [Device testing for multiplatform apps](/en/bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps.html): Learn how to configure your multiplatform apps for device tests with Firebase. diff --git a/docs/bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps.mdx b/docs/bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps.mdx new file mode 100644 index 0000000..c8c82f1 --- /dev/null +++ b/docs/bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps.mdx @@ -0,0 +1,34 @@ +--- +title: "Running device tests with Firebase for multiplatform apps" +description: "Run native device tests for Flutter and React Native apps using Bitrise's device testing solution." +sidebar_position: 3 +slug: /bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +You can run native device tests for Flutter and React Native apps using Bitrise's device testing solution. + +## Testing the iOS app + +1. Add tests using the [XCTest](https://developer.apple.com/documentation/xctest) framework to the iOS app of the project. +1. [Build your app for testing](/en/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.html) with the [**Xcode Build for testing for iOS**](https://github.com/bitrise-steplib/steps-xcode-build-for-test) Step. + + Make sure that the **Project path** input of the Step points to the `.xcodeproj` or `.xcworkspace` file of your project. You can find these in the `iOS` folder. If you used automatic configuration to add your React Native app to Bitrise, you don't need to modify the default value of the input ($BITRISE_PROJECT_PATH. +1. Run your device tests with the **Device testing for iOS** Step. + + For detailed information on configuring an iOS app for device testing, see [Running device tests for iOS apps](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios/running-device-tests-for-ios-apps). + +## Testing the Android app + +You can run robo-, instrumentation- and gameloop tests using the [**Virtual Device Testing for Android**](https://github.com/bitrise-steplib/steps-virtual-device-testing-for-android) Step. However, one instance of the Step can only run one type of test. If you need to run multiple test types, you need multiple instances of the Step. + +1. Add tests to the Android app of the project. +1. Build the app for UI testing with the [**Android Build for UI Testing**](https://github.com/bitrise-steplib/bitrise-step-android-build-for-ui-testing) Step. + + Make sure the **Project Location** input of the Step points to the root directory of the Android app. For example, `./android`. +1. Run your device tests with the **Device testing for Android** Step. + + For detailed information on configuring an Android app for device testing, see [Device testing for Android](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android). diff --git a/docs/bitrise-ci/testing/index.md b/docs/bitrise-ci/testing/index.md new file mode 100644 index 0000000..3f5009f --- /dev/null +++ b/docs/bitrise-ci/testing/index.md @@ -0,0 +1,7 @@ +--- +title: "Testing" +sidebar_position: 7 +slug: /bitrise-ci/testing +--- + +Testing diff --git a/docs/bitrise-ci/testing/measuring-your-code-coverage-with-codecov.mdx b/docs/bitrise-ci/testing/measuring-your-code-coverage-with-codecov.mdx new file mode 100644 index 0000000..43161d9 --- /dev/null +++ b/docs/bitrise-ci/testing/measuring-your-code-coverage-with-codecov.mdx @@ -0,0 +1,31 @@ +--- +title: "Measuring your code coverage with Codecov" +sidebar_position: 9 +slug: /bitrise-ci/testing/measuring-your-code-coverage-with-codecov +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ViewingYourCoverageReportsOnCodecov from '@site/src/partials/viewing-your-coverage-reports-on-codecov.mdx'; +import Partial_WhatSNext from '@site/src/partials/whats-next.mdx'; +import Partial_IntegratingCodecovWithBitrise from '@site/src/partials/integrating-codecov-with-bitrise.mdx'; + +[Codecov](https://about.codecov.io/product/features/) is the leading code coverage solution for CI/CD pipelines, delivering coverage metrics right into your workflow. It integrates directly with Bitrise to provide valuable insights on code quality in order to allow users to ship healthier code with less risk. + +Codecov provides many features that make test coverage more available and actionable to speed up your development process and to deliver high-quality applications. + +Some of these features include: + +- Coverage changes overlaid with your source code, making it even easier to identify needed test areas. +- [Multi-language](https://about.codecov.io/product/features/#multi-lang-multi-ci-cd) support so you can use Codecov right out of the box. +- Summary of coverage information directly in your Workflow so that you can add and update tests quickly and effectively. +- [Status checks](https://docs.codecov.com/docs/commit-status) to block underperforming pull requests from being merged. +- Seamless coverage [report merging](https://docs.codecov.com/docs/merging-reports) for Workflows that upload multiple reports across jobs. +- Custom coverage information based on groupings using [Codecov Flags](https://docs.codecov.com/docs/flags). + + + + + + diff --git a/docs/bitrise-ci/testing/test-sharding.mdx b/docs/bitrise-ci/testing/test-sharding.mdx new file mode 100644 index 0000000..5b0c478 --- /dev/null +++ b/docs/bitrise-ci/testing/test-sharding.mdx @@ -0,0 +1,25 @@ +--- +title: "Test sharding" +description: "Bitrise provides easy to use test sharding optimization features out of the box, depending on your project type and whether you want Bitrise to provide the the sharding optimization calculation." +sidebar_position: 6 +slug: /bitrise-ci/testing/test-sharding +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ShardingWithABitriseStepCalculatingTheTestSplit from '@site/src/partials/sharding-with-a-bitrise-step-calculating-the-test-split.mdx'; +import Partial_ShardingWithYourOwnTestSplitCalculation from '@site/src/partials/sharding-with-your-own-test-split-calculation.mdx'; + +Test sharding is the process of dividing a large suite of automated tests into smaller pieces (shards), which can be executed in parallel on different runners. This significantly reduces the time it takes to provide developers with feedback on their changes, allowing them to maintain focus and iterate fast. + +Bitrise offers easy to use test sharding optimization features out of the box, depending on your project type and whether you want Bitrise to provide the sharding optimization calculation. + +| Project type | Sharding with your own shard optimization calculation | Sharding with shard optimization calculation provided by Bitrise | +| --- | --- | --- | +| iOS | [Parallelism](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines) | Parallelism + Xcode Test Shard Calculation Step | +| Android | [Parallelism](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines) | Parallelism + [Gradle Runner](https://github.com/bitrise-io/steps-gradle-runner) Step | + + + + diff --git a/docs/bitrise-ci/testing/testing-android-apps/_category_.json b/docs/bitrise-ci/testing/testing-android-apps/_category_.json new file mode 100644 index 0000000..bcf444f --- /dev/null +++ b/docs/bitrise-ci/testing/testing-android-apps/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Testing Android apps", + "position": 2, + "description": "Run unit tests, instrumented tests, and device tests for Android apps, using Bitrise's dedicated Android Steps. You can view your results in one location, in the **Tests** tab.", + "link": { + "type": "doc", + "id": "bitrise-ci/testing/testing-android-apps/index" + } +} diff --git a/docs/bitrise-ci/testing/testing-android-apps/android-unit-tests.mdx b/docs/bitrise-ci/testing/testing-android-apps/android-unit-tests.mdx new file mode 100644 index 0000000..0f2ce5a --- /dev/null +++ b/docs/bitrise-ci/testing/testing-android-apps/android-unit-tests.mdx @@ -0,0 +1,138 @@ +--- +title: "Android unit tests" +description: "You can perform unit tests using the Android Unit Test Step, and view the results on the **Tests** tab." +sidebar_position: 1 +slug: /bitrise-ci/testing/testing-android-apps/android-unit-tests +sidebar_label: Running Android unit tests +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Unit tests are useful if you want to verify individual code blocks, catch bugs or prevent crashes as early as possible. On Bitrise, you can run Android unit tests easily with the [**Android Unit Test**](https://github.com/bitrise-steplib/bitrise-step-android-unit-test) Step. The Step finds and runs all unit tests included in the specified module and variant of your Android project. + +:::tip[Running multiple tests in parallel] + +You can run multiple unit tests in parallel, for different devices or shards, by using the Pipelines feature: [Currently supported use cases for the Android platform](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform). + +::: + +To run your unit tests: + +Workflow Editor + +bitrise.yml + +1. Make sure you included [unit tests](https://developer.android.com/training/testing/local-tests) in your Android project. +1. Add the [**Android Unit Test**](https://github.com/bitrise-steplib/bitrise-step-android-unit-test) Step to your Workflow. +1. Make sure the **Project Location** input points to the root directory of your Android project. + + The root directory is the directory where your `build.gradle` file exists. If you configured your Android project automatically when [adding it as an app](/en/bitrise-ci/getting-started/adding-a-new-project.html) on Bitrise, you don't have to change the default value. +1. In the **Module** and **Variant** inputs, set the module and the variant you want to test. Leave the inputs blank to test all modules and/or variants. + + You can check the available modules and variants of your project in [the Project window in Android Studio](https://developer.android.com/studio/projects). + + ![android-unit-test.png](/img/_paligo/uuid-6affd72d-61b9-8755-539a-5b26f62516a5.png) +1. In the **Options** input group, you can [pass additional Gradle arguments](https://docs.gradle.org/current/userguide/custom_tasks.html#sec:declaring_and_using_command_line_options) to the build task in the **Additional Gradle Arguments** input. +1. If you have custom output directories configured for the test results of the tests in your project, configure the Step to look for the test results in the correct location when exporting them: + + The **Local unit test HTML result directory pattern** input sets the directory for HTML test results. + + The **Local unit test XML result directory pattern** input sets the directory for XML test results. + + ![local-result-pattern.png](/img/_paligo/uuid-2e0224cb-0d48-8c50-3bb4-c5a126fff586.png) + + Both directories are zipped and exported to BITRISE_DEPLOY_DIR. This ensures that your test results can be viewed, for example, in the **Tests** tab. + + If you don't have custom output directories configured, you do not need to change these inputs: the default values will work. +1. Add the **Deploy to Bitrise.io** Step to your Workflow to be able to view your test results: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + +1. Make sure you included [unit tests](https://developer.android.com/training/testing/local-tests) in your Android project. +1. Add the `android-unit-test` Step to your Workflow. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-unit-test: + inputs: + ``` +1. Make sure the `project_location` input points to the root directory of your Android project. + + The root directory is the directory where your `build.gradle` file exists. If you configured your Android project automatically when [adding it as an app](/en/bitrise-ci/getting-started/adding-a-new-project.html) on Bitrise, you don't have to change the default value. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-unit-test: + inputs: + - project_location: $BITRISE_SOURCE_DIR + ``` +1. In the `module` and `variant` inputs, set the module and the variant you want to test. If you don't set these inputs, the Step will test all modules and/or variants. + + You can check the available modules and variants of your project in [the Project window in Android Studio](https://developer.android.com/studio/projects). + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-unit-test: + inputs: + - module: app + - variant: debug + - project_location: $BITRISE_SOURCE_DIR + ``` +1. In the `arguments` input, you can [pass additional Gradle arguments](https://docs.gradle.org/current/userguide/custom_tasks.html#sec:declaring_and_using_command_line_options) to the build task. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-unit-test: + inputs: + - module: app + - variant: debug + - arguments: --task + - project_location: $BITRISE_SOURCE_DIR + ``` +1. If you have custom output directories configured for the test results of the tests in your project, configure the Step to look for the test results in the correct location when exporting them: + + The `report_path_pattern` input sets the directory for HTML test results. + + The `result_path_pattern` input sets the directory for XML test results. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-unit-test: + inputs: + - module: app + - variant: debug + - arguments: --task + - report_path_pattern: '*build/reports/tests' + - result_path_pattern: '*build/test-results' + - project_location: $BITRISE_SOURCE_DIR + ``` + + Both directories are zipped and exported to BITRISE_DEPLOY_DIR. This ensures that your test results can be viewed, for example, in the **Tests** tab. + + If you don't have custom output directories configured, you do not need to change these inputs: the default values will work. +1. Add the `deploy-to-bitrise-io` Step to your Workflow to be able to view your test results: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-unit-test: + inputs: + - module: app + - variant: debug + - arguments: --task + - report_path_pattern: '*build/reports/tests' + - result_path_pattern: '*build/test-results' + - project_location: $BITRISE_SOURCE_DIR + - deploy-to-bitrise-io: {} + ``` diff --git a/docs/bitrise-ci/testing/testing-android-apps/index.mdx b/docs/bitrise-ci/testing/testing-android-apps/index.mdx new file mode 100644 index 0000000..11fb01b --- /dev/null +++ b/docs/bitrise-ci/testing/testing-android-apps/index.mdx @@ -0,0 +1,15 @@ +--- +title: "Testing Android apps" +description: "Run unit tests, instrumented tests, and device tests for Android apps, using Bitrise's dedicated Android Steps. You can view your results in one location, in the **Tests** tab." +sidebar_position: 2 +slug: /bitrise-ci/testing/testing-android-apps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +- [Run unit tests for Android apps](/en/bitrise-ci/testing/testing-android-apps/android-unit-tests) with our [**Android Unit Test**](https://github.com/bitrise-steplib/bitrise-step-android-unit-test) Step. You can configure the Step to run tests on certain modules and variants, and you can pass additional arguments to the Gradle task running the tests. The Step can also export the test results to the **Tests** tab. +- [Run instrumented tests](/en/bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps.html) using the [**Android Build for UI Testing**](https://github.com/bitrise-steplib/bitrise-step-android-build-for-ui-testing) and the [**Android Instrumented Test**](https://github.com/bitrise-steplib/bitrise-step-android-instrumented-test) Steps. The Steps generate and export an APK and a test APK and then run your instrumented tests using `adb`. + +You can easily run multiple tests in parallel with Pipelines.You can find some advanced recipes for such scenarios in our GitHub repository: [Workflow recipes](https://github.com/bitrise-io/workflow-recipes/tree/main/recipes). diff --git a/docs/bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps.mdx b/docs/bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps.mdx new file mode 100644 index 0000000..1ff8c7f --- /dev/null +++ b/docs/bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps.mdx @@ -0,0 +1,194 @@ +--- +title: "Running instrumented tests for Android apps" +description: "Instrumented tests run on Android devices, whether physical or emulated. On Bitrise, you can run instrumented tests using the adb tool." +sidebar_position: 2 +slug: /bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +[Instrumented tests](https://developer.android.com/training/testing/instrumented-tests) run on Android devices, whether physical or emulated. On Bitrise, you can run instrumented tests using [the adb tool](https://developer.android.com/tools/adb). To run your instrumented tests, you need two Steps in your Workflow: + +- The [**Android Build for UI testing**](https://github.com/bitrise-steplib/bitrise-step-android-build-for-ui-testing) Step builds both an APK and a test APK. For example, `MyappDebug.apk` and `MyAppDebugAndroidTest.apk`. The Step stores the path to these APKs in two output Environment Variables: BITRISE_APK_PATH and BITRISE_TEST_APK_PATH. You can use these Env Vars to access the APKs in subsequent Steps in the same Workflow. +- The [**Android Instrumented Test**](https://github.com/bitrise-steplib/bitrise-step-android-instrumented-test) Step runs the instrumented tests using the APKs built in the previous Step. + +To run instrumented tests for Android: + +Workflow Editor + +bitrise.yml + +1. Add the [**Android Build for UI testing**](https://github.com/bitrise-steplib/bitrise-step-android-build-for-ui-testing) Step to your Workflow. +1. Make sure the **Project location** input points to the root directory of your Android app. +1. Set the module and the variant you want to build in the **Module** and the **Variant** input. + + You can check the available modules and variants of your project in [the Project window in Android Studio](https://developer.android.com/studio/projects). + + ![build-forui-tsting.png](/img/_paligo/uuid-9de8c3bc-abac-16bb-8a19-be18a97ac998.png) +1. In the **Options** input group, you can set the location for the generated APK files in the **APK location pattern** input. + + The input takes a file pattern as a value. The default value is `*/build/outputs/apk/*.apk`. +1. Optionally, you can [pass additional Gradle arguments](https://docs.gradle.org/current/userguide/custom_tasks.html#sec:declaring_and_using_command_line_options) to the build task in the **Additional Gradle Arguments** input. +1. Add the [**Android Instrumented Test**](https://github.com/bitrise-steplib/bitrise-step-android-instrumented-test) Step to the Workflow, at some point after the [**Android Build for UI testing**](https://github.com/bitrise-steplib/bitrise-step-android-build-for-ui-testing) Step. +1. Make sure that the **Main APK path** and the **Test APK path** inputs point to the correct location. + + By default, the values of the two inputs are the BITRISE_APK_PATH and the BITRISE_TEST_APK_PATH Environment Variables, respectively. These variables are exported by the [**Android Build for UI testing**](https://github.com/bitrise-steplib/bitrise-step-android-build-for-ui-testing) Step. As such, in the vast majority of cases, you don't have to modify the value of these inputs. + + ![android-instrumented.png](/img/_paligo/uuid-ab9cf08d-eb9e-d46d-7bb2-740827ec96b9.png) +1. In the **Test runner class** input, specify the test runner you wish to use. + + The default runner is [the AndroidJUnitRunner class](https://developer.android.com/training/testing/instrumented-tests/androidx-test-libraries/runner). +1. Optionally, you can pass additional options to the test runner with the **Additional testing options** input. + + With this input, you issue commands to the activity manager tool of the `adb` shell. For more information about the commands you can issue, see [the official documentation for adb](https://developer.android.com/tools/adb#issuingcommands). +1. Add the **Deploy to Bitrise.io** Step to your Workflow to view test results: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + +1. Add the `android-build-for-ui-testing` Step to your Workflow. + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - deploy-to-bitrise-io: {} + ``` +1. Make sure the `project_location` input points to the root directory of your Android app. + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - project_location: $BITRISE_SOURCE_DIR + - deploy-to-bitrise-io: {} + ``` +1. Set the module and the variant you want to build in the `module` and the `variant` input. + + You can check the available modules and variants of your project in [the Project window in Android Studio](https://developer.android.com/studio/projects). + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - module: app + - variant: debug + - project_location: $BITRISE_SOURCE_DIR + - deploy-to-bitrise-io: {} + ``` +1. In the `apk_path_pattern` input, you can set the location for the generated APK files. + + The input takes a file pattern as a value. The default value is `*/build/outputs/apk/*.apk`. + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - arguments: flag + - module: app + - variant: debug + - apk_path_pattern: '*/build/outputs/apk/*.apk' + - project_location: $BITRISE_SOURCE_DIR + - deploy-to-bitrise-io: {} + ``` +1. Optionally, you can [pass additional Gradle arguments](https://docs.gradle.org/current/userguide/custom_tasks.html#sec:declaring_and_using_command_line_options) to the build task in the `arguments` input. + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - arguments: --task + - module: app + - variant: debug + - apk_path_pattern: '*/build/outputs/apk/*.apk' + - project_location: $BITRISE_SOURCE_DIR + - deploy-to-bitrise-io: {} + ``` +1. Add the `android-instrumented-test` Step to the Workflow, at some point after the `android-build-for-ui-testing` Step. + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - arguments: flag + - module: app + - variant: debug + - apk_path_pattern: '*/build/outputs/apk/*.apk' + - cache_level: all + - project_location: $BITRISE_SOURCE_DIR + - android-instrumented-test: + inputs: + - deploy-to-bitrise-io: {} + ``` +1. Make sure that the `main_apk_path` and the `test_apk_path` inputs point to the correct location. + + By default, the values of the two inputs are the BITRISE_APK_PATH and the BITRISE_TEST_APK_PATH Environment Variables, respectively. These variables are exported by the `android-build-for-ui-testing` Step. As such, in the vast majority of cases, you don't have to set the value of these inputs. + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - arguments: flag + - module: app + - variant: debug + - apk_path_pattern: '*/build/outputs/apk/*.apk' + - cache_level: all + - project_location: $BITRISE_SOURCE_DIR + - android-instrumented-test: + inputs: + - main_apk_path: $BITRISE_APK_PATH + - test_apk_path: $BITRISE_TEST_APK_PATH + - deploy-to-bitrise-io: {} + ``` +1. In the `test_runner_class` input, specify the test runner you wish to use. + + The default runner is [the AndroidJUnitRunner class](https://developer.android.com/training/testing/instrumented-tests/androidx-test-libraries/runner). + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - arguments: flag + - module: app + - variant: debug + - apk_path_pattern: '*/build/outputs/apk/*.apk' + - cache_level: all + - project_location: $BITRISE_SOURCE_DIR + - android-instrumented-test: + inputs: + - test_runner_class: androidx.test.runner.AndroidJUnitRunner + - main_apk_path: $BITRISE_APK_PATH + - test_apk_path: $BITRISE_TEST_APK_PATH + - deploy-to-bitrise-io: {} + ``` +1. Optionally, you can pass additional options to the test runner with the `additional_testing_options` input. + + With this input, you issue commands to the activity manager tool of the `adb` shell. For more information about the commands you can issue, see [the official documentation for adb](https://developer.android.com/tools/adb#issuingcommands). For example, the value `KEY1 true KEY2 false` will be passed to adb as `adb shell am instrument -e "KEY1" "true" "KEY2" "false" [...]`. + + ```yaml + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - arguments: flag + - module: app + - variant: debug + - apk_path_pattern: '*/build/outputs/apk/*.apk' + - cache_level: all + - project_location: $BITRISE_SOURCE_DIR + - android-instrumented-test: + inputs: + - test_runner_class: androidx.test.runner.AndroidJUnitRunner + - additional_testing_options: KEY1 true KEY2 false + - main_apk_path: $BITRISE_APK_PATH + - test_apk_path: $BITRISE_TEST_APK_PATH + - deploy-to-bitrise-io: {} + ``` +1. Add the **Deploy to Bitrise.io** Step to your Workflow to view test results: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). diff --git a/docs/bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps.mdx b/docs/bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps.mdx new file mode 100644 index 0000000..e95ec96 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps.mdx @@ -0,0 +1,97 @@ +--- +title: "Running lint for your Android apps" +description: "On Bitrise, you can run lint checks with our dedicated Step called Android Lint. It runs the same lint function that is built into Android Studio. To perform lint checks, you don't need to write test cases or execute your app." +sidebar_position: 3 +slug: /bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps +sidebar_label: Running lint checks for your Android apps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Android Studio provides [a code scanning tool called lint](https://developer.android.com/studio/write/lint) that can help you identify and correct problems with the structural quality of your code. When using Android Studio, configured lint checks run automatically when building your app. Lint checks don't require test cases. + +On Bitrise, you can run lint checks with our dedicated Step called [**Android Lint**](https://github.com/bitrise-steplib/bitrise-step-android-lint). To do so: + +Workflow Editor + +Configuration YAML + +1. Add the [**Android Lint**](https://github.com/bitrise-steplib/bitrise-step-android-lint) Step to your Android app's Workflow. + + It should come before any Step that builds your app (for example, [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build)), if you have such a Step in your Workflow. +1. Make sure the **Project Location** input points to the root directory of your Android project, where the top level `build.gradle` file is located. +1. In the **Module** and **Variant** inputs, specify the module and variant of the app you want to check. + + ![android-lint.png](/img/_paligo/uuid-624b318c-ddc6-58e7-4c58-e426c2f3db50.png) + + If you are unsure about the exact names of modules and variants in your project, you can check them [in the Project view in Android Studio](https://developer.android.com/studio/projects). +1. In the **Options** input group, the **Report location pattern** input allows you to specify where the lint report should be found once the Step has run. + + The input accepts asterisks as a wildcard. You can set the input to return the results either as html or xml. +1. In the **Options** input group, the **Additional Gradle Arguments** input allows you to pass arguments to the Gradle task. + +1. In the Configuration YAML file, add the `android-lint` Step to your Android app's Workflow. + + It should come before any Step that builds your app (for example, [**Android Build**](https://github.com/bitrise-steplib/bitrise-step-android-build)), if you have such a Step in your Workflow. + + ``` + my-workflow: + steps: + - git-clone: {} + - android-lint: + ``` +1. Make sure the `project_location` input points to the root directory of your Android project, where the top level `build.gradle` or `build.gradle.kts` file is located. + + ``` + my-workflow: + steps: + - git-clone: {} + - android-lint: + inputs: + - project_location: $BITRISE_SOURCE_DIR + ``` +1. In the `module` and `variant` inputs, specify the module and variant of the app you want to check. + + If you are unsure about the exact names of modules and variants in your project, you can check them [in the Project view in Android Studio](https://developer.android.com/studio/projects). + + ``` + my-workflow: + steps: + - git-clone: {} + - android-lint: + inputs: + - module: module + - variant: variant + - project_location: $BITRISE_SOURCE_DIR + ``` +1. The `report_path_pattern` input allows you to specify where the lint report should be found once the Step has run. + + The input accepts asterisks as a wildcard. You can set the input to return the results either as html or xml. + + ``` + my-workflow: + steps: + - git-clone: {} + - android-lint: + inputs: + - module: module + - variant: variant + - report_path_pattern: '*/build/reports/lint-results*.xml' + - project_location: $BITRISE_SOURCE_DIR + ``` +1. The `argument` input allows you to pass arguments to the Gradle task. + + ``` + my-workflow: + steps: + - git-clone: {} + - android-lint: + inputs: + - module: module + - variant: variant + - report_path_pattern: '*/build/reports/lint-results*.xml' + - argument: arg + - project_location: $BITRISE_SOURCE_DIR + ``` diff --git a/docs/bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstacks-app-automate.md b/docs/bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstacks-app-automate.md new file mode 100644 index 0000000..2a6e4e5 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstacks-app-automate.md @@ -0,0 +1,47 @@ +--- +title: "Testing your app with Browserstack's App Automate" +description: "[BrowserStack](https://www.browserstack.com/)’s App Automate Espresso lets you test your native and hybrid apps on a variety of Android mobile and tablet devices. You can use App Automate in your Bitrise builds by utilizing our dedicated integration." +sidebar_position: 4 +slug: /bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstack-s-app-automate +--- + +[BrowserStack](https://www.browserstack.com/)’s App Automate Espresso lets you test your native and hybrid apps on a variety of Android mobile and tablet devices. You can use App Automate in your Bitrise builds by utilizing our dedicated integration. + +## Setting up App Automate Espresso + +To configure the Browserstack integration: + +1. Make sure you have a Browserstack Username and Access key. +1. On Bitrise, open the Workflow Editor and add the **Android Build for UI testing** Step to your Workflow. +1. Make sure the **Project location** input points to the root directory of your Android app. +1. Set the module and the variant you want to build in the **Module** and the **Variant** input. + + :::note[Gradle arguments] + + Optionally, you can pass additional Gradle arguments to the build task in the **Additional Gradle Arguments** input. + + ::: +1. Add the **BrowserStack App Automate - Espresso** Step to your Workflow. It should follow the **Android Build for UI testing** Step. +1. Configure the required Step inputs: + + | Input group | Input name | Input value | + | --- | --- | --- | + | **Authentication** | **BrowserStack username** | Your BrowserStack username in a string format. | + | **BrowserStack access key** | Your BrowserStack Access Key. | | + | **App & Test Suite** | **Android app under test** | The path to your test APK file. By default. you don't need to modify it: the **Android Build for UI testing** Step exports the path as an Env Var which is used as the default value. | + | **Espresso test suite** | The path to your test suite file. By default. you don't need to modify it: the **Android Build for UI testing** Step exports the path as an Env Var which is used as the default value. | | + | **Devices** | **Devices** | Set to one or more device-OS combinations in a new line. You can find the possible combinations [in this list](https://www.browserstack.com/list-of-browsers-and-platforms/app_automate). | +1. Optionally, [set advanced configuration options](#section-idm234784175354164). + +## Advanced configuration for App Automate Espresso + +The **BrowserStack App Automate - Espresso** Step provides advanced configuration options. All of these options are available in the **Test configuration** input group. + +| Input name | Description | Values | +| --- | --- | --- | +| **Filter tests** | Provide a comma-separated list of class or test names followed by supported filtering strategies. Only the filtered test cases will be executed. | Key-value pairs of filters. Possible filters include: class, package, annotation, size. For example: `class com.foo.AddToCartClass,class com.foo.CheckoutClass` | +| **Project name** | Provide [a project name](https://www.browserstack.com/docs/app-automate/espresso/organize-tests) for the tests. You can logically group multiple Espresso test executions under a single project. This helps you easily access all related test executions on the App Automate dashboard on Browserstack. | A string. Valid characters are: letters (A-Z, a-z), digits (0-9), periods (.), colons (:), hiphens (-), square brackets ([]), forward slashes (/), asperands (@), ampersands (&), single quotes (‘), and underscores (_). Any other characters are ignored. | +| **Test sharding** | Enable [test sharding](https://www.browserstack.com/docs/app-automate/espresso/test-sharding) to split test cases into different groups instead of running them sequentially. | Set key-value pairs to specify the number of shards and configure its behaviour. There are three types of sharding strategies, each requiring different configuration: - Auto strategy: ``` {"numberOfShards": 2}, "devices": ["Google Pixel 3-9.0"] ``` - Package strategy: ``` {"numberOfShards": 2, "mapping": [{"name": "Shard 1", "strategy": "package", "values": ["com.foo.login", "com.foo.logout"]}, {"name": "Shard 2", "strategy": "package", "values": ["com.foo.dashboard"]}]} ``` - Class strategy: ``` {"numberOfShards": 2, "mapping": [{"name": "Shard 1", "strategy": "class", "values": ["com.foo.login.user", "com.foo.login.admin"]}, {"name": "Shard 2", "strategy": "class", "values": ["com.foo.logout.user"]}]} ``` | +| **Single runner invocation** | Enable [single runner inovcation](https://www.browserstack.com/docs/app-automate/espresso/single-runner-invocation) to run all tests in a single instrumentation process to reduce overall build time. | `true` or `false` The default value is `false`. | +| **Local testing** | Enable [Local testing](https://www.browserstack.com/docs/app-automate/espresso/get-started-with-local-testing) to retrieve app data hosted on local/private servers. | `true` or `false` `false` The default value is `false`. | +| **Mock server** | A mock web server mocks the behavior of an actual remote server. This makes it easy to test different scenarios without depending on your remote server and without having to make changes to your remote server. Local testing will not work with a mock server. | `true` or `false` The default value is `false`. | diff --git a/docs/bitrise-ci/testing/testing-flutter-apps/_category_.json b/docs/bitrise-ci/testing/testing-flutter-apps/_category_.json new file mode 100644 index 0000000..a6f1b41 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-flutter-apps/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Testing Flutter apps", + "position": 3, + "link": { + "type": "doc", + "id": "bitrise-ci/testing/testing-flutter-apps/index" + } +} diff --git a/docs/bitrise-ci/testing/testing-flutter-apps/index.md b/docs/bitrise-ci/testing/testing-flutter-apps/index.md new file mode 100644 index 0000000..3008a60 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-flutter-apps/index.md @@ -0,0 +1,8 @@ +--- +title: "Testing Flutter apps" +sidebar_position: 3 +slug: /bitrise-ci/testing/testing-flutter-apps +--- + +- [Run unit and UI tests for Flutter apps](/en/bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps.html) with the **Flutter Test** Step. The Step simply runs the `flutter test` command on your app: you can configure it to run only specific tests or to run all tests it can find. You can see the test results in the Tests tab. +- [Perform static code analysis with the Dart analyzer](/en/bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise.html): our **Flutter Analyze** Step runs the `flutter analyze` command with the required fail severity and the additional parameters you wish to append to it. diff --git a/docs/bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise.md b/docs/bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise.md new file mode 100644 index 0000000..3c661f7 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise.md @@ -0,0 +1,144 @@ +--- +title: "Running the Dart analyzer on Bitrise" +sidebar_position: 2 +slug: /bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise +--- + +You can perform static analysis of your Flutter code with [the Dart analyzer](https://docs.flutter.dev/testing/debugging#the-dart-analyzer) by using the **Flutter Analyze** Step on Bitrise. The Step runs the `flutter analyze` command that makes heavy use of type annotations that you put in your code to help track problems down. + +To run the analyzer: + +Workflow Editor + +bitrise.yml + +1. Add the **Flutter Install** Step to your Workflow. + + This Step runs the initial setup of the Flutter SDK and installs any missing components. + + ![flutter-install-step.png](/img/_paligo/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png) +1. Make sure that the **Flutter Install** Step installs the correct version of the Flutter SDK for your app: check the **Flutter SDK Git repository version** input. + + ![flutter-install-step.png](/img/_paligo/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png) + + The input's default value is **stable**, which installs the latest stable version of the SDK. You can, however, set the value to either a specific version tag or a branch label: + + - You can find the available version tags here: [Version tags](https://github.com/flutter/flutter/tags). + - You can find the available branch labels here: [Branch labels](https://github.com/flutter/flutter/branches). + + :::tip[Installation bundle URL] + + You can also install the Flutter SDK from an installation bundle URL: you just need to specify the URL in the **Flutter SDK installation bundle URL** input. Please note that if you do so, the **Flutter SDK Git repository version** input will be ignored entirely! + + ::: +1. Add the **Flutter Analyze** Step to your Workflow. +1. Make sure the **Project Location** input points to the root directory of your Flutter project. + + - If the project scanner automatically detected it as a Flutter project when [adding it as an app](/en/bitrise-ci/getting-started/adding-a-new-project.html) on Bitrise, you don't have to change the default value. + - If you configured the app manually, check that the location is correct. +1. Set the **Fail Severity** input to the desired level. + + The input determines the minimum severity to fail the Step. Any issue with a severity at least as high as the specified fails the Step. It has three possible settings, from minimum to maximum severity: + + - **info**: When this setting is selected, info-, warning-, and error-level issues all fail the Step. + - **warning**: When this setting is selected, only warning- and error-level issues fail the Step. + - **error**: This is the default value. Only error-level issues fail the Step. + + ![fail-severity.png](/img/_paligo/uuid-23a8ca33-3d33-1a67-07d4-273f1c69e194.png) +1. Optionally, add additional flag to the `flutter analyze` command in the **Additional Parameters** input. + + For a list of available flags, run `flutter help analyze`. For example, you can use the `--no-congratulate` flag if you don't want to see any output if there are no errors, warnings, hints or lints. + +1. Add the `flutter-installer` Step to your Workflow. + + This Step runs the initial setup of the Flutter SDK and installs any missing components. + + ``` + primary: + description: | + Builds project and runs tests. + steps: + - activate-ssh-key: {} + - git-clone: {} + - flutter-installer: + inputs: + ``` +1. Make sure that the Step installs the correct version of the Flutter SDK for your app: you can specify the version using the `version` input. + + The input's default value is `stable` which installs the latest stable version of the SDK. If you do not see the `version` input in your `bitrise.yml` file, it is set to the default value. You can, however, set the value to either a specific version tag or a branch label: + + - You can find the available version tags here: [Version tags](https://github.com/flutter/flutter/tags). + - You can find the available branch labels here: [Branch labels](https://github.com/flutter/flutter/branches). + + ``` + # Installing version 3.7.7 of the Flutter SDK + - flutter-installer: + inputs: + - version: 3.7.7 + ``` + + :::tip[Installation bundle URL] + + You can also install the Flutter SDK from an installation bundle URL: you just need to specify the URL in the `installation-bundle-url` input. Please note that if you do so, the `version` input will be ignored entirely! + + The URL is expected to begin with `https://storage.googleapis.com/flutter_infra`. For example: + + ``` + - flutter-installer: + inputs: + - installation_bundle_url: https://storage.googleapis.com/flutter_infra/releases/beta/macos/flutter_macos_v1.6.3-beta.zip + ``` + + ::: +1. Add the `flutter-analyze` Step to your Workflow. + + ``` + primary: + description: | + Builds project and runs tests. + steps: + - activate-ssh-key: {} + - git-clone: {} + - flutter-installer: + inputs: + - version: stable + - flutter-analyze: + inputs: + ``` +1. Make sure the `project-location` input points to the root directory of your Flutter project. + + ``` + - flutter-analyze: + inputs: + - project_location: "$BITRISE_SOURCE_DIR" + ``` + + - If the project scanner automatically detected it as a Flutter project when [adding it as an app](/en/bitrise-ci/getting-started/adding-a-new-project.html) on Bitrise, you don't have to change the default value. + - If you configured the app manually, check that the location is correct. +1. Set the `fail_severity` input to the desired level. + + The input determines the minimum severity to fail the Step. Any issue with a severity at least as high as the specified fails the Step. It has three possible settings, from minimum to maximum severity: + + - `info`: When this setting is selected, info-, warning-, and error-level issues all fail the Step. + - `warning`: When this setting is selected, only warning- and error-level issues fail the Step. + - `error`: This is the default value. Only error-level issues fail the Step. + + ``` + - flutter-analyze: + inputs: + - project_location: "$BITRISE_SOURCE_DIR" + - fail_severity: error + ``` +1. Optionally, add additional flag to the `flutter analyze` command in the `additional_params` input. + + For a list of available flags, run `flutter help analyze`. For example, you can use the `--no-congratulate` flag if you don't want to see any output if there are no errors, warnings, hints or lints. + + ``` + - flutter-analyze: + inputs: + - project_location: "$BITRISE_SOURCE_DIR" + - fail_severity: error + - additional_params: --no-congratulate + ``` + +Once your build has run, you can check the Step's output in the [build logs](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html). diff --git a/docs/bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps.md b/docs/bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps.md new file mode 100644 index 0000000..e6e5272 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps.md @@ -0,0 +1,196 @@ +--- +title: "Running unit and UI tests on Flutter apps" +sidebar_position: 1 +slug: /bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps +--- + +The **Flutter Test** Step allows you to run unit tests, widget tests, and integration (also referred to as end-to-end or UI testing) tests on your Flutter app on Bitrise. The Step runs the `flutter test` command and saves the `json` file that is generated by the command. You can then view the test results at any time: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + +:::tip[Code coverage] + +The **Flutter Test** Step can also generate code coverage reports. + +::: + +To run tests using **Flutter Test**: + +Workflow Editor + +Configuration YAML + +1. Include tests in your Flutter project. + + For more information on how to write tests and include them in your Flutter project, check the official Flutter documentation: [Testing Flutter apps](https://docs.flutter.dev/testing). +1. Add the **Flutter Install** Step to your Workflow. + + This Step runs the initial setup of the Flutter SDK and installs any missing components. +1. Make sure that the **Flutter Install** Step installs the correct version of the Flutter SDK for your app: check the **Flutter SDK Git repository version** input. + + ![flutter-install-step.png](/img/_paligo/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png) + + The input's default value is **stable**, which installs the latest stable version of the SDK. You can, however, set the value to either a specific version tag or a branch label: + + - You can find the available version tags here: [Version tags](https://github.com/flutter/flutter/tags). + - You can find the available branch labels here: [Branch labels](https://github.com/flutter/flutter/branches). + + :::tip[Installation bundle URL] + + You can also install the Flutter SDK from an installation bundle URL: you just need to specify the URL in the **Flutter SDK installation bundle URL** input. Please note that if you do so, the **Flutter SDK Git repository version** input will be ignored entirely! + + ::: +1. Add the **Flutter Test** Step to your Workflow. It should be after the **Flutter Install** Step. + + The Step runs the `flutter test` command with optional flags. It can also check code coverage. +1. Make sure the **Project Location** input points to the root directory of your Flutter project. + + ![flutter-test-step.png](/img/_paligo/uuid-58597c24-04b0-d59c-c007-abd9c802360a.png) + + - If the project scanner automatically detected it as a Flutter project when [adding it as an app](/en/bitrise-ci/getting-started/adding-a-new-project.html) on Bitrise, you don't have to change the default value. + - If you configured the app manually, check that the location is correct. You can do so by going to the **Env Vars** tab on the Workflow Editor, and checking the BITRISE_FLUTTER_PROJECT_LOCATION [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html). +1. By default, the Step will find and run all tests. But you can configure it to run only selected tests: use the **Test files pattern** input to tell the Step which tests to run. + + The input accepts both * and ** glob formats. For example, `lib/**/*_test.dart` is a valid input. + + ![flutter-test-files-pattern.png](/img/_paligo/uuid-64d8fb90-4d9e-e19e-6a2c-754caca6b060.png) +1. Optionally, use the **Additional parameters** input to append flags to the `flutter test` command. + + To see the available options, run the `flutter help test` command. You can do so on your own device or in a **Script** Step on Bitrise. +1. Optionally, set the **Generate code coverage files?** input to **yes** to generate code coverage files. + + With this input turned on, the `--coverage` flag is appended to the `flutter test` command. +1. Optionally, you can access the generated json test report and the code coverage file (`lcov.info`) in subsequent Steps by using the BITRISE_FLUTTER_TESTRESULT_PATH and the BITRISE_FLUTTER_COVERAGE_PATH [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables/exposing-env-vars-and-using-them-in-another-step-or-workflow). +1. Add the **Deploy to Bitrise.io** Step to your Workflow to view test results: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + +1. Include tests in your Flutter project. + + For more information on how to write tests and include them in your Flutter project, check the official Flutter documentation: [Testing Flutter apps](https://docs.flutter.dev/testing). +1. Add the `flutter-installer` Step to your Workflow. + + This Step runs the initial setup of the Flutter SDK and installs any missing components. + + ``` + primary: + description: | + Builds project and runs tests. + steps: + - activate-ssh-key: {} + - git-clone: {} + - flutter-installer: + inputs: + ``` +1. Make sure that the Step installs the correct version of the Flutter SDK for your app: you can specify the version using the `version` input. + + The input's default value is `stable`, which installs the latest stable version of the SDK. If you do not see the `version` input in your Configuration YAML file, it is set to the default value. You can, however, set the value to either a specific version tag or a branch label: + + - You can find the available version tags here: [Version tags](https://github.com/flutter/flutter/tags). + - You can find the available branch labels here: [Branch labels](https://github.com/flutter/flutter/branches). + + ``` + # Installing version 3.7.7 of the Flutter SDK + - flutter-installer: + inputs: + - version: 3.7.7 + ``` + + :::tip[Installation bundle URL] + + You can also install the Flutter SDK from an installation bundle URL: you just need to specify the URL in the `installation-bundle-url` input. Please note that if you do so, the `version` input will be ignored entirely! + + The URL is expected to begin with `https://storage.googleapis.com/flutter_infra`. For example: + + ``` + - flutter-installer: + inputs: + - installation_bundle_url: https://storage.googleapis.com/flutter_infra/releases/beta/macos/flutter_macos_v1.6.3-beta.zip + ``` + + ::: +1. Add the `flutter-test` Step to your Workflow. It should be after the `flutter-installer` Step. + + The Step runs the `flutter test` command with optional flags. It can also check code coverage. + + ``` + primary: + description: | + Builds project and runs tests. + steps: + - activate-ssh-key: {} + - git-clone: {} + - flutter-installer: + inputs: + - version: stable + - is_update: false + - restore-dart-cache: {} + - flutter-test: + inputs: + ``` +1. Make sure the `project_location` input points to the root directory of your Flutter project. + + ``` + - flutter-test: + inputs: + - project_location: "$BITRISE_FLUTTER_PROJECT_LOCATION" + ``` + + - If the project scanner automatically detected it as a Flutter project when [adding it as an app](/en/bitrise-ci/getting-started/adding-a-new-project.html) on Bitrise, you don't have to change the default value, which is BITRISE_FLUTTER_PROJECT_LOCATION. + - If you configured the app manually, check that the location is correct. You can check where BITRISE_FLUTTER_PROJECT_LOCATION points in the `envs` property of the `app`: + + ``` + # Pointing to the root directory + app: + envs: + - opts: + is_expand: false + BITRISE_FLUTTER_PROJECT_LOCATION: . + ``` +1. By default, the Step will find and run all tests. But you can configure it to run only selected tests: use the `tests_path_pattern` input to tell the Step which tests to run. + + The input accepts both * and ** glob formats. For example, `lib/**/*_test.dart` is a valid input. + + ``` + - flutter-test: + inputs: + - tests_path_pattern: /lib/*_test.dart + ``` +1. Optionally, use the `additional_params` input to append flags to the `flutter test` command. + + To see the available options, run the `flutter help test` command. You can do so on your own device or in a **Script** Step on Bitrise. + + ``` + - flutter-test: + inputs: + # setting a test timeout of 60 seconds + - additional_params: --timeout 60s + ``` +1. Optionally, set the `generate_code_coverage_files` input to `'yes'` to generate code coverage files. + + With this input turned on, the `--coverage` flag is appended to the `flutter test` command. + + ``` + - flutter-test: + inputs: + - generate_code_coverage_files: 'yes' + ``` +1. Optionally, you can access the generated json test report and the code coverage file (`lcov.info`) in subsequent Steps by using the BITRISE_FLUTTER_TESTRESULT_PATH and the BITRISE_FLUTTER_COVERAGE_PATH [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables/exposing-env-vars-and-using-them-in-another-step-or-workflow). +1. Add the `deploy-to-bitrise-io` Step to view test results: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + + ``` + primary: + description: | + Builds project and runs tests. + steps: + - activate-ssh-key: {} + - git-clone: {} + - flutter-installer: + inputs: + - version: stable + - is_update: false + - restore-dart-cache: {} + - flutter-test: + inputs: + - project_location: "$BITRISE_FLUTTER_PROJECT_LOCATION" + - generate_code_coverage_files: 'yes' + - tests_path_pattern: /lib/*_test.dart + - save-dart-cache: {} + - deploy-to-bitrise-io: {} + ``` diff --git a/docs/bitrise-ci/testing/testing-ios-apps/_category_.json b/docs/bitrise-ci/testing/testing-ios-apps/_category_.json new file mode 100644 index 0000000..3445bc0 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-ios-apps/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Testing iOS apps", + "position": 1, + "link": { + "type": "doc", + "id": "bitrise-ci/testing/testing-ios-apps/index" + } +} diff --git a/docs/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator.md b/docs/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator.md new file mode 100644 index 0000000..02bf9b7 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator.md @@ -0,0 +1,136 @@ +--- +title: "Building an iOS app for a simulator" +sidebar_position: 3 +slug: /bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator +--- + +You can build an iOS app for an iOS or tvOS simulator platform. + +To do this, you'll need the **Xcode Build for Simulator** Step. The Step creates an `.app` file which you can install on any macOS device or send to, for example, testers. This requires no code signing at all, so it is an easy way to create a distributable version of your iOS app. + +The Step also creates an `.xctestrun` file which you can use to run tests. Both the `.app` file and the `.xctestrun` file can be accessed by subsequent Steps referring to their output variable, and they can be [downloaded as a build artifact](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html). + +To build the app for a simulator: + +Workflow Editor + +Configuration YAML + +1. Make sure you install all necessary dependencies in your Workflow. + + We have dedicated Steps for many different dependency managers, including: + + - [Carthage](https://bitrise.io/integrations/steps/carthage) + - [CocoaPods](https://bitrise.io/integrations/steps/cocoapods-install) + - [Homebrew](https://bitrise.io/integrations/steps/brew-install) +1. Add the **Xcode Build for Simulator** Step to your Workflow after the Step(s) installing dependencies. +1. Make sure the **Project path** input points to either your `.xcodeproj` or `.xcworkspace` file. + + The input sets the `-project` or `-workspace` option of the `xcodebuild` command. In most cases, if your app has been automatically configured by the project scanner during the [process of adding the app](/en/bitrise-ci/getting-started/adding-a-new-project.html), the default value does not need to be changed. +1. In the **Scheme** input, set the name of the [Xcode scheme](https://developer.apple.com/documentation/xcode/customizing-the-build-schemes-for-a-project/) you want to use to build the app. + + ![scheme-input.png](/img/_paligo/uuid-2700f022-4822-82fe-77e4-1a0995b41ab6.png) + + The input sets the `-scheme` option of the `xcodebuild` command. The default value is an Environment Variable created when adding the app and performing the first-time configuration. If you need to use a different scheme, you can type its name here. + + :::tip[Build configuration] + + By default, the Step will use the build configuration specified in the scheme. However, you can override it and use a different build configuration: add the name of the desired build configuration to the **Configuration name** input. This input is optional and you only need it if you don't want to use the build configuration specified in the selected scheme. + + You can create new build configurations in your Xcode project at any time: [Adding a build configuration file to your project](https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project). + + ::: +1. In the **Device destination specifier** input, select **generic/platform=iOS Simulator** + + ![ios-simulator-destination.png](/img/_paligo/uuid-7235d345-4190-c1be-6ee3-fc25e1eb183e.png) +1. Optionally, set the **Build settings (xcconfig), allow code signing** input to **CODE_SIGNING_ALLOWED=YES**. This allows code signing files to be installed during the build. + + In most cases, you don't need code signing for an app built for a simulator. It might be required for certain test cases or third-party dependencies. To set up code signing, see [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing). +1. To access your app as a build artifact, add the **Deploy to Bitrise.io** Step to the end of your Workflow. By default, you don't have to modify anything in the Step's configuration. + +1. Make sure you install all necessary dependencies in your Workflow. + + We have dedicated Steps for many different dependency managers, including: + + - [Carthage](https://bitrise.io/integrations/steps/carthage) + - [CocoaPods](https://bitrise.io/integrations/steps/cocoapods-install) + - [Homebrew](https://bitrise.io/integrations/steps/brew-install) +1. Add the `[xcode-build-for-simulator](https://github.com/bitrise-steplib/steps-xcode-build-for-simulator)` Step to your Workflow after the Step(s) installing dependencies. + + ```yaml + workflows: + primary: + steps: + - cocoapods-install + - xcode-build-for-simulator: + inputs: + ``` +1. Make sure the `project_path` input points to either your `.xcodeproj` or `.xcworkspace` file. + + The input sets the `-project` or `-workspace` option of the `xcodebuild` command. In most cases, if your app has been automatically configured by the project scanner during the [process of adding the app](/en/bitrise-ci/getting-started/adding-a-new-project.html), the default value does not need to be changed. + + ```yaml + - xcode-build-for-simulator: + inputs: + - project_path: $BITRISE_PROJECT_PATH + ``` +1. In the `scheme` input, set the name of the [Xcode scheme](https://developer.apple.com/documentation/xcode/customizing-the-build-schemes-for-a-project/) you want to use to build the app. + + The input sets the `-scheme` option of the `xcodebuild` command. The default value is an Environment Variable created when adding the app and performing the first-time configuration. If you need to use a different scheme, make sure to type the name of the scheme correctly. + + ```yaml + - xcode-build-for-simulator: + inputs: + - scheme: $BITRISE_SCHEME + - project_path: $BITRISE_PROJECT_PATH + ``` + + :::tip[Build configuration] + + By default, the Step will use the build configuration specified in the scheme. However, you can override it and use a different build configuration: add the name of the desired build configuration to the `configuration` input. This input is optional and you only need it if you don't want to use the build configuration specified in the selected scheme. + + You can create new build configurations in your Xcode project at any time: [Adding a build configuration file to your project](https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project). + + ::: +1. Set the `destination` input to `generic/platform=iOS Simulator`. + + ```yaml + - xcode-build-for-simulator: + inputs: + - scheme: $BITRISE_SCHEME + - destination: generic/platform=iOS Simulator + - project_path: $BITRISE_PROJECT_PATH + ``` +1. Optionally, set the `xcconfig_content` input with the value `CODE_SIGNING_ALLOWED=YES`. This allows code signing files to be installed during the build. + + In most cases, you don't need code signing for an app built for a simulator. It might be required for certain test cases or third-party dependencies. To set up code signing, see [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing). + + ```yaml + - xcode-build-for-simulator: + inputs: + - scheme: $BITRISE_SCHEME + - destination: generic/platform=iOS Simulator + - xcconfig_content: |- + CODE_SIGNING_ALLOWED=YES + COMPILER_INDEX_STORE_ENABLE = NO + - project_path: $BITRISE_PROJECT_PATH + ``` +1. To access your app as a build artifact, add the `deploy-to-bitrise-io` Step to the end of your Workflow. By default, you don't have to modify anything in the Step's configuration. + + ```yaml + primary: + steps: + - generate-cordova-build-configuration@0: {} + - xcode-build-for-test@2: {} + - xcode-test@4: {} + - xcode-build-for-simulator@0.12: + inputs: + - scheme: $BITRISE_SCHEME + - destination: generic/platform=iOS Simulator + - configuration: debug + - xcconfig_content: |- + CODE_SIGNING_ALLOWED=YES + COMPILER_INDEX_STORE_ENABLE = NO + - project_path: $BITRISE_PROJECT_PATH + - deploy-to-bitrise-io + ``` diff --git a/docs/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.mdx b/docs/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.mdx new file mode 100644 index 0000000..913981e --- /dev/null +++ b/docs/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.mdx @@ -0,0 +1,270 @@ +--- +title: "Building an iOS app for testing" +description: "You can build an iOS app specifically for testing: our dedicated Step builds your app and its associated tests and also exports an `.xctestrun` file. Once built, you can upload the app to a third-party testing service or install it on a simulator or a physical device. You can also use this Step to set up [virtual device testing with Firebase](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.html)." +sidebar_position: 2 +slug: /bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +You can build an iOS app specifically for testing: our dedicated Step builds your app and its associated tests and also exports an `.xctestrun` file. Once built, you can upload the app to a third-party testing service or install it on a simulator or a physical device. You can also use this Step to set up [virtual device testing with Firebase](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.html). + +The Step uses the `build-for-testing` action of `xcodebuild`. To learn more about it, see [How do I implement the Build For Testing and Test Without Building features from the command line?](https://developer.apple.com/library/archive/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-PRODUCT) + +:::important[Code signing] + +Installing the app on a test device requires [code signing](/en/bitrise-ci/code-signing/ios-code-signing.html). The [**Xcode Build for testing for iOS**](https://github.com/bitrise-steplib/steps-xcode-build-for-test) Step has a built in code signing configuration: it allows [code signing with automatic provisioning](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning). In most use cases, you don't need any other Step to code sign your app for testing. + +::: + +To build your iOS app for testing: + +Workflow Editor + +bitrise.yml + +1. For code signing, make sure you have connected your [Apple service account](/en/bitrise-platform/integrations/apple-services-connection.html) to Bitrise. + + The Step accepts Apple ID and API key authentication for automatic code signing. We recommend using API key authentication. + + :::tip[Manual code signing] + + You can also use [manual code signing](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning): in that case, do not configure the automatic code signing options of the Step. + + ::: +1. Make sure [you install all of the app's dependencies](/en/bitrise-ci/dependencies-and-caching/ios-dependencies.html) in your Workflow. +1. Add the [**Xcode Build for testing for iOS**](https://github.com/bitrise-steplib/steps-xcode-build-for-test) Step to your Workflow after the Step or Steps installing dependencies. +1. Make sure the **Project path** input points to the correct location. + + The input asks for the path to your `.xcodeproj` or `.xcworkspace` file. In most cases, you don't need to change this input: when adding a new app, the project scanner automatically finds the relevant file and stores its location in the [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) that is the default value of the input. + + :::note[Checking the default value] + + If you are not sure whether the default value of the **Project path** input points to the right location, go to the **Env Vars** tab and check that the $BITRISE_PROJECT_PATH variable's value is the correct path to your `.xcodeproj` or `.xcworkspace` file. + + ::: + + :::important[CocoaPods] + + If you use CocoaPods as your dependency manager, the **Project path** input must point to the `.xcworkspace` file. + + ::: +1. Make sure the **Scheme** input points to the scheme you want to use to build the app. + + The default value is the Environment Variable that stores the scheme you set during the initial configuration of the app. If you wish to use a different scheme, type its name into the input field. +1. Set [the build configuration](https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project) you want to build in the **Build Configuration** input. + + The default value is `Debug`. + + ![build-for-testing-step.png](/img/_paligo/uuid-2a3bef35-3d78-72e7-102b-8aa11def397f.png) +1. Configure the device destination in the **Device destination specifier** input: the input takes comma-separated key-value pairs. + + Since the `build-for-testing` action can be performed without an actual specific device, we recommend targeting a platform generically: + + ```yaml + // building for physical iOS devices + generic/platform=iOS + + // building for simulators + generic/platform=iOS Simulator + ``` + + The input sets the `-destination` option of `xcodebuild`. Read more about the possible options: [How do I run unit tests from the command line?](https://developer.apple.com/library/archive/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-UNIT) +1. Optionally, set a specific [test plan](https://developer.apple.com/documentation/xcode/organizing-tests-to-improve-feedback?changes=_8) in the **Test plan** input. + + The input sets the `-testPlan` option of the `build-for-testing` action of `xcodebuild`. If you leave this empty, the test plan specified in the Xcode scheme will be used. +1. If you need code signing, we recommend using the [automatic code signing](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning) option: find the **Automatic code signing** input group, and choose a method from the dropdown menu of the **Automatic code signing method** input. + + ![auto-code-signing-input.png](/img/_paligo/uuid-cae7939a-c5e3-917f-5121-e7ef852362d5.png) + + :::note[Code signing certificates] + + Keep in mind that you need to upload [code signing certificates](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning/uploading-ios-code-signing-certificates) to Bitrise in order to successfully sign your app. + + ::: + + We recommend using [API key authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key/adding-api-key-authentication-data-on-bitrise): a Bitrise-managed authentication method configured on the **App settings** page. + + If you want to control API authentication on a Step level instead, you can override the default Bitrise-managed connection by setting all three inputs that define a different API key authentication in the **App Store Connect connection override** input group: + + ![api-connect-override.png](/img/_paligo/uuid-a41c4d89-eb5f-0913-ac80-a0af31f99b54.png) +1. Add the **Deploy to Bitrise.io** Step to the end of your Workflow to be able to access the generated artifacts either [on the **Artifacts** tab](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html) or in the **Tests** tab. + +1. For code signing, make sure you have connected your [Apple service account](/en/bitrise-platform/integrations/apple-services-connection.html) to Bitrise. + + The Step accepts Apple ID and API key authentication for automatic code signing. We recommend using API key authentication. + + :::tip[Manual code signing] + + You can also use [manual code signing](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning): in that case, do not configure the automatic code signing options of the Step. + + ::: +1. Make sure [you install all of the app's dependencies](/en/bitrise-ci/dependencies-and-caching/ios-dependencies.html) in your Workflow. +1. Add the `xcode-build-for-test` Step to your Workflow after the Step or Steps installing dependencies. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: {} + ``` +1. Make sure the `project_path` input points to the correct location. + + The input asks for the path to your `.xcodeproj` or `.xcworkspace` file. In most cases, you don't need to change this input: when adding a new app, the project scanner automatically finds the relevant file and stores its location in the [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) that is the default value of the input. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: {} + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + ``` + + :::note[Checking the default value] + + If you are not sure whether the default value of the **Project path** input points to the right location, go to the **Env Vars** tab and check that the $BITRISE_PROJECT_PATH variable's value is the correct path to your `.xcodeproj` or `.xcworkspace` file. + + ::: + + :::important[CocoaPods] + + If you use CocoaPods as your dependency manager, the **Project path** input must point to the `.xcworkspace` file. + + ::: +1. Make sure the `scheme` input points to the scheme you want to use to build the app. + + The default value is the Environment Variable that stores the scheme you set during the initial configuration of the app. If you wish to use a different scheme, type its name into the input field. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - project_path: $BITRISE_PROJECT_PATH + ``` +1. Set [the build configuration](https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project) you want to build in the `configuration` input. + + The default value is `Debug`: if you do not set a value for the input, the build will target the **Debug** configuration. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - project_path: $BITRISE_PROJECT_PATH + ``` +1. Configure the device destination in the `destination` input: the input takes comma-separated key-value pairs. + + Since the `build-for-testing` action can be performed without an actual specific device, we recommend targeting a platform generically: + + ```yaml + // building for physical iOS devices + - destination: generic/platform=iOS + + // building for simulators + - destination: generic/platform=iOS Simulator + ``` + + The input sets the `-destination` option of `xcodebuild`. Read more about the possible options: [How do I run unit tests from the command line?](https://developer.apple.com/library/archive/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-UNIT) + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS Simulator + - project_path: $BITRISE_PROJECT_PATH + ``` +1. Optionally, set a specific [test plan](https://developer.apple.com/documentation/xcode/organizing-tests-to-improve-feedback?changes=_8) in the `test_plan` input. + + The input sets the `-testPlan` option of the `build-for-testing` action of `xcodebuild`. If you leave this empty, the test plan specified in the Xcode scheme will be used. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS Simulator + - test_plan: my_plan + - project_path: $BITRISE_PROJECT_PATH + ``` +1. If you need code signing, we recommend using the [automatic code signing](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning) option: set the `automatic-code-signing` input to either of two values: + + `apple-id`: Use [Apple ID authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.html) to manage code signing. + + `api-key`: Use [API key authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html) to manage code signing. + + :::note[Code signing certificates] + + Keep in mind that you need to upload [code signing certificates](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning/uploading-ios-code-signing-certificates) to Bitrise in order to successfully sign your app. + + ::: + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS Simulator + - test_plan: my_plan + - automatic_code_signing: api-key + - project_path: $BITRISE_PROJECT_PATH + ``` + + We recommend using [API key authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key/adding-api-key-authentication-data-on-bitrise): a Bitrise-managed authentication method configured on the **App settings** page. + + If you want to control API authentication on a Step level instead, you can override the default Bitrise-managed connection by setting three inputs that define a different API key authentication: + + - `api_key_path`: Local path or remote URL to the private key (p8 file) for the App Store Connect API. + - `api_key_id`: Private key ID used for App Store Connect authentication. + - `api_key_issuer_id`: Private key issuer ID used for App Store Connect authentication. + + :::important[All inputs required] + + All three inputs must be set for the authentication override to work! + + ::: + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - api_key_path: path/to/p8 + - api_key_id: key_id + - api_key_issuer_id: issuer_id + ``` +1. Add the `deploy-to-bitrise-io` Step to the end of your Workflow to be able to access the generated artifacts either [on the **Artifacts** tab](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html) or in the **Tests** tab. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS Simulator + - test_plan: my_plan + - automatic_code_signing: api-key + - project_path: $BITRISE_PROJECT_PATH + - deploy-to-bitrise-io: {} + ``` diff --git a/docs/bitrise-ci/testing/testing-ios-apps/index.md b/docs/bitrise-ci/testing/testing-ios-apps/index.md new file mode 100644 index 0000000..3e8d0b3 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-ios-apps/index.md @@ -0,0 +1,11 @@ +--- +title: "Testing iOS apps" +sidebar_position: 1 +slug: /bitrise-ci/testing/testing-ios-apps +--- + +- [Run UI and unit tests with Xcode](/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.html) using our **Xcode Test for iOS** Step. With this Step, you don't need code signing and you can easily export your test results to the **Tests** tab. +- [Build an iOS app for testing](/en/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.html) with the **Xcode Build for testing for iOS** Step. The Step uses the `build-for-testing` action of `xcodebuild` to build your test targets and exports the resulting bundle. You can use this bundle, for example, to perform device testing with Firebase. +- [Build an iOS app for a simulator](/en/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator.html) with the **Xcode Build for Simulator** Step. The Step builds an `.app` file that you can install on an iOS simulator. This requires no code signing, and as such it is a simple way to provide a testable app for your testers. + +You can easily run multiple tests in parallel with Pipelines: [Currently supported use cases for the iOS platform](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform). diff --git a/docs/bitrise-ci/testing/testing-ios-apps/registering-a-test-device.mdx b/docs/bitrise-ci/testing/testing-ios-apps/registering-a-test-device.mdx new file mode 100644 index 0000000..f6585a3 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-ios-apps/registering-a-test-device.mdx @@ -0,0 +1,39 @@ +--- +title: "Registering a test device" +description: "You can register a test device easily by opening Safari on your iOS device and accessing the Test devices page from your Profile. With other browsers, you can manually register one using the Register device manually button." +sidebar_position: 5 +slug: /bitrise-ci/testing/testing-ios-apps/registering-a-test-device +sidebar_label: Registering test devices for iOS apps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RegisterAnIOSDeviceUsingSafari from '@site/src/partials/register-an-ios-device-using-safari.mdx'; +import Partial_RegisterATestDeviceManually from '@site/src/partials/register-a-test-device-manually.mdx'; +import Partial_RegisteringDevicesWithTheXcodeArchiveStep from '@site/src/partials/registering-devices-with-the-xcode-archive-step.mdx'; +import Partial_CheckingTheAvailableTestDevicesForAnApp from '@site/src/partials/checking-the-available-test-devices-for-an-app.mdx'; + +You have multiple options to register test devices on [bitrise.io](http://bitrise.io): + +- [Open Safari on your iOS device and access the **Test devices** tab from your **Profile settings** page](#UUID-396a5bdf-f35f-cb12-30b3-bff3606db38e). +- [Manually register a device from the **Test devices** tab from your **Profile settings** page](#UUID-7324669b-9b5e-1b90-9df3-92ddce0b3b5a). + +After registering your device on Bitrise, make sure to register it on the [Apple Developer Portal](https://developer.apple.com/) as well. We recommend using the [Xcode Archive & Export for iOS](https://github.com/bitrise-steplib/steps-xcode-archive) Step which can: + +- [Register all available test devices of the app](#section-idm4551371088020833759178339553). +- [Register a selection of test devices, defined in a text file that contains a list of their UDIDs](#section-idm4606595255272033759179376662). + +:::important[Apple Developer Portal device limit] + +There is a limit on registrable devices on the Apple Developer Portal, so make sure to [check the list of available test devices of an app](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device/checking-the-available-test-devices-for-an-app) before you use the [Xcode Archive & Export for iOS](https://github.com/bitrise-steplib/steps-xcode-archive) Step to register devices! + +::: + + + + + + + + diff --git a/docs/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.mdx b/docs/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.mdx new file mode 100644 index 0000000..a5c7160 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.mdx @@ -0,0 +1,187 @@ +--- +title: "Running unit and UI tests for iOS apps" +description: "You need two Steps to run Xcode tests and view their results: Xcode Test for iOS, and Deploy to Bitrise.io." +sidebar_position: 1 +slug: /bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RerunningFailedTestsNotAvailableInXcode13 from '@site/src/partials/rerunning-failed-tests-not-available-in-xcode-13.mdx'; +import Partial_TestRepetitions from '@site/src/partials/test-repetitions.mdx'; + +You can run both unit and UI tests for iOS apps on Bitrise with our dedicated Step. The Step runs the [test targets you defined](https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods/) in your Xcode project and [exports the results for you to view it in detail](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). + +To run Xcode tests on Bitrise, you need two Steps to run Xcode tests and view their results: + +[**Xcode Test for iOS**](https://github.com/bitrise-steplib/steps-xcode-test). + +**Deploy to**[**Bitrise.io**](http://Bitrise.io). + +:::note[Code signing files] + +Running Xcode tests and deploying their results to Bitrise do not require any [code signing](/en/bitrise-ci/code-signing/ios-code-signing.html) files. So don’t worry about them just yet! + +::: + +The [**Xcode Test for iOS**](https://github.com/bitrise-steplib/steps-xcode-test) Step runs your tests, exports your test results, the `.xcresult` file, all test attachments, and the log of the `xcodebuild test` command. + +:::tip[Xcode test results in HTML] + +You can also view your Xcode test results in a rich HTML format, using the [**Generate Xcode test report html**](https://github.com/bitrise-steplib/bitrise-step-generate-xcode-html-report) Step: [Viewing Xcode test results in rich HTML format](/en/bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format). + +::: + +To run tests using the Step: + +Workflow Editor + +bitrise.yml + +1. Make sure [you install all of the app's dependencies](/en/bitrise-ci/dependencies-and-caching/ios-dependencies.html) in your Workflow. +1. Add the [**Xcode Test for iOS**](https://github.com/bitrise-steplib/steps-xcode-test) Step to the Workflow. +1. Make sure the **Project path** input points to the correct location. + + The input asks for the path to your `.xcodeproj,``.xcworkspace` , or `Package.swift` file. In most cases, you don't need to change this input: when adding a new app, the project scanner automatically finds the relevant file and stores its location in the [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) that is the default value of the input. + + ![xcode-test-for-ios.png](/img/_paligo/uuid-bba07440-4913-8b44-0391-1dd275534500.png) +1. Make sure the **Scheme** input points to the scheme you want to use to build the app. + + The default value is the [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) that stores the scheme you set during the initial configuration of the app. If you wish to use a different scheme, type its name to the input field. + + :::important[Shared scheme only] + + The scheme must be a shared Xcode scheme! + + ::: +1. Configure the device destination in the **Device destination specifier** input: the input takes comma-separated key-value pairs. For example, if you wish to build an app to test on an iPhone 14 with the latest available OS: + + ``` + platform=iOS,name=iPhone 14 Plus,OS=latest + ``` + + The input sets the `-destination` option of `xcodebuild`. Read more about the possible options: [How do I run unit tests from the command line?](https://developer.apple.com/library/archive/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-UNIT) +1. Optionally, set a specific [test plan](https://developer.apple.com/documentation/xcode/organizing-tests-to-improve-feedback?changes=_8) in the **Test plan** input. + + The input sets the `-testPlan` option of the `test` action of `xcodebuild`. If you leave this empty, the test plan specified in the Xcode scheme will be used. +1. Add the **Deploy to Bitrise.io** Step to the end of your Workflow to be able to access the test results and other outputs: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + +1. Make sure [you install all of the app's dependencies](/en/bitrise-ci/dependencies-and-caching/ios-dependencies.html) in your Workflow. +1. Add the `xcode-test` Step to the Workflow. + + ``` + your-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - xcode-test: + inputs: + ``` +1. Make sure the `project_path` input points to the correct location. + + The input asks for the path to your `.xcodeproj,``.xcworkspace` , or `Package.swift` file. In most cases, you don't need to change this input: when adding a new app, the project scanner automatically finds the relevant file and stores its location in the [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) that is the default value of the input. + + ``` + your-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - xcode-test: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + ``` +1. Make sure the `scheme` input points to the scheme you want to use to build the app. + + The default value is the [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) that stores the scheme you set during the initial configuration of the app. If you wish to use a different scheme, type its name to the input field. + + ``` + your-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - xcode-test: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: test + ``` + + :::important[Shared scheme only] + + The scheme must be a shared Xcode scheme! + + ::: +1. Configure the device destination in the `destination` input: the input takes comma-separated key-value pairs. For example, if you wish to build an app to test on an iPhone 14 with the latest available OS: + + ``` + your-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - xcode-test: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: test + - destination: platform=iOS Simulator,name=iPhone 14 Plus,OS=latest + ``` + + The input sets the `-destination` option of `xcodebuild`. Read more about the possible options: [How do I run unit tests from the command line?](https://developer.apple.com/library/archive/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-UNIT) +1. Optionally, set a specific [test plan](https://developer.apple.com/documentation/xcode/organizing-tests-to-improve-feedback?changes=_8) in the `test_plan` input. + + The input sets the `-testPlan` option of the `test` action of `xcodebuild`. If you leave this empty, the test plan specified in the Xcode scheme will be used. + + ``` + your-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - xcode-test: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: test + - destination: platform=iOS Simulator,name=iPhone 11 Plus,OS=latest + - test_plan: my_plan + ``` +1. Add the `deploy-to-bitrise-io` Step to the end of your Workflow to be able to access the test results and other outputs: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + + ``` + your-workflow: + steps: + - activate-ssh-key: {} + - git-clone: {} + - xcode-test: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: test + - destination: platform=iOS Simulator,name=iPhone 11 Plus,OS=latest + - test_plan: my_plan + - deploy-to-bitrise-io: + ``` + +:::note[Headless mode] + +From Xcode 9 onwards, tests are run in headless mode by default: this means that the simulator will run in the background only. To change it, go to the Step’s Debug input group and set the **Run the simulator in headless mode** input’s value to `no`. However, with this option, tests will take more time. + +``` +- xcode-test: + inputs: + - headless_mode: 'no' +``` + +::: + +:::important[Using xcpretty] + +The `xcpretty` output tool does not support parallel tests. If parallel tests are enabled in your project, go to the Step’s **xcodebuild log formatting** input group and set the **Log formatter** input’s value to `xcodebuild` or `xcbeautify`. + +``` +- xcode-test: + inputs: + - log_formatter: xcbeautify +``` + +::: + + + + diff --git a/docs/bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format.md b/docs/bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format.md new file mode 100644 index 0000000..5cac2de --- /dev/null +++ b/docs/bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format.md @@ -0,0 +1,163 @@ +--- +title: "Viewing Xcode test results in rich HTML format" +description: "Enhanced Xcode reporting allows you to immediately view your Xcode test results in a rich HTML format. It will show both successful and failed test cases, as well as any videos and screenshots generated by the test." +sidebar_position: 4 +slug: /bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format +--- + +Enhanced Xcode reporting allows you to immediately view your Xcode test results in a rich HTML format. It will show both successful and failed test cases, as well as any videos and screenshots generated by the test. + +To use it, your build needs to do two things: + +- Run your Xcode tests and place the `.xcresult` file in the correct location. The **Xcode Test for iOS** and the **Xcode Test for Building** Steps do this by default and require no further configuration. You can also use other Steps, for example, **fastlane**, but you need to specify where Xcode should place the `.xcresult` file. +- Run the **Generate Xcode HTML report** Step: it takes the `.xcresult` file and generates the report. If you use the **Xcode Test for iOS** Step to run your tests, this Step requires no configuration. When using other Steps, you have to manually set the location of your `.xcresult` file. + +We strongly recommend using the official **Xcode Test for iOS** Step to run your tests: this Step generates an `.xcresult` file and the **Generate Xcode HTML report** Step finds it without any additional configuration. + +To view the rich test results: + +Workflow Editor + +bitrise.yml + +1. Add a Step that runs your Xcode tests to your Workflow. + + :::note[We recommend using the Xcode Test for iOS Step] + + Using our **Xcode Test for iOS** Step (as well as the **Xcode Test without building** Step) means you don't need any additional configuration to export your results. + + You can use other Steps to run your tests and then view the rich results afterwards. In that case, you have to make sure that the Step generates an `.xcresult` file and point the **Generate Xcode HTML report** Step to its location. For example, you can use the **fastlane** Step or your own **Script** Step. + + ::: + + For more information on configuring the Step to run your Xcode tests, see [Running unit and UI tests for iOS apps](/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps). +1. Add the **Generate Xcode HTML report** Step to your Workflow. + + It should, of course, come after the Step that runs your tests. +1. Make sure the **Xcresult file paths** input points to the location of your `.xcresult` files. + + You can add multiple `.xcresult` files to this input, either by specifying one or more directories or by specifying filepaths, separated by a newline (/n). Each file will have its own report. + + :::important[No configuration required] + + If you use the **Xcode Test for iOS** Step, you don't have to modify this input! + + ::: + + ![generate-xcode-reports_input.png](/img/_paligo/uuid-a928eed7-d498-758b-6a6c-5a8ef7b202d1.png) +1. Make sure the Workflow includes the **Deploy to Bitrise.io** Step at the end. + + Without this Step, the results won't be exported. + + :::important[Version requirement] + + The Step must be of version 2.6.0 or older. + + ::: +1. After the build is finished, go to the build summary page. + + :::note[Failed builds] + + The test results will be available even if the build fails. + + ::: +1. Select the **Tests** tab to view the results. + + :::important[Expiry date] + + The HTML test reports are available for seven days after they are generated. After seven days, you can no longer access them. + + ::: + + ![html-test-result.png](/img/_paligo/uuid-bf85c17c-277e-088a-13b0-3fe96e79cc7d.png) + +1. Add a Step that runs your Xcode tests to your Workflow. + + We strongly recommend using the `xcode-test` Step for this. + + ``` + my-workflow: + steps: + - xcode-test: {} + ``` + + :::note[We recommend using the xcode-test Step] + + Using our `xcode-test` Step (as well as the `xcode-test-without-building` Step) means you don't need any additional configuration to export your results. + + You can use other Steps to run your tests and then view the rich results afterwards. In that case, you have to make sure that the Step generates an `.xcresult` file and point the `generate-xcode-html-report` Step to its location. For example, you can use the `fastlane` Step or your own `script` Step. + + ::: + + For more information on configuring the Step to run your Xcode tests, see [Running unit and UI tests for iOS apps](/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps). +1. Add the `generate-xcode-html-report` Step to your Workflow. + + It should, of course, come after the Step that runs your tests. + + ``` + my-workflow: + steps: + - xcode-test: {} + - generate-xcode-html-report: {} + ``` +1. Make sure the `xcresult_patterns` input points to the location of your `.xcresult` files. + + You can add multiple `.xcresult` files to this input, either by specifying one or more directories or by specifying filepaths, separated by a newline (/n). Each file will have its own report. + + ``` + my-workflow: + steps: + - xcode-test: {} + - generate-xcode-html-report: + is_always_run: true + inputs: + - xcresult_patterns: /path/to/MyApp.xcresult + ``` + + :::important[No configuration required] + + If you use the **Xcode Test for iOS** Step, you don't have to modify this input! + + ::: +1. Make sure the Workflow includes the `deploy-to-bitrise-io` Step at the end. + + Without this Step, the results won't be exported. + + :::important[Version requirement] + + The Step must be of version 2.6.0 or older. + + ::: + + ``` + my-workflow: + steps: + - xcode-test: {} + - generate-xcode-html-report: + is_always_run: true + inputs: + - xcresult_patterns: /path/to/MyApp.xcresult + - deploy-to-bitrise-io: {} + ``` +1. After the build is finished, go to the build summary page. + + :::note[Failed builds] + + The test results will be available even if the build fails. + + ::: +1. Select the **Tests** tab to view the results. + + :::important[Expiry date] + + The HTML test reports are available for seven days after they are generated. After seven days, you can no longer access them. + + ::: + + ![html-test-result.png](/img/_paligo/uuid-bf85c17c-277e-088a-13b0-3fe96e79cc7d.png) + +:::caution + +Please note that the generated HTML report is not official Bitrise content! It is generated entirely according to your Workflow configuration. Bitrise has no direct control over what appears in the report. + +::: diff --git a/docs/bitrise-ci/testing/testing-react-native-apps/_category_.json b/docs/bitrise-ci/testing/testing-react-native-apps/_category_.json new file mode 100644 index 0000000..c0dcf6c --- /dev/null +++ b/docs/bitrise-ci/testing/testing-react-native-apps/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Testing React Native apps", + "position": 4, + "link": { + "type": "doc", + "id": "bitrise-ci/testing/testing-react-native-apps/index" + } +} diff --git a/docs/bitrise-ci/testing/testing-react-native-apps/index.mdx b/docs/bitrise-ci/testing/testing-react-native-apps/index.mdx new file mode 100644 index 0000000..06c3ec7 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-react-native-apps/index.mdx @@ -0,0 +1,14 @@ +--- +title: "Testing React Native apps" +sidebar_position: 4 +slug: /bitrise-ci/testing/testing-react-native-apps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +- [Run unit and UI tests for React Native apps](/en/bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps) by either `npm test` or `yarn test`. The Steps run the `tests` script in the `scripts` object of your package. +- [Perform end-to-end testing with Detox](/en/bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise.html), a gray box end-to-end tests and automation library for mobile apps built with React Native. + +You can also use Bitrise's device testing solution, using Firebase Test Labs, to run device tests on both the iOS and Android apps of a React Native project: [Running device tests with Firebase for multiplatform apps](/en/bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps). diff --git a/docs/bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise.mdx b/docs/bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise.mdx new file mode 100644 index 0000000..fbe50dd --- /dev/null +++ b/docs/bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise.mdx @@ -0,0 +1,21 @@ +--- +title: "Running Detox tests on Bitrise" +description: "Detox is a gray box end-to-end tests and automation library for mobile apps built with React Native. If you have a React Native app on Bitrise, you can run Detox tests." +sidebar_position: 2 +slug: /bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RunningADetoxTest from '@site/src/partials/running-a-detox-test.mdx'; +import Partial_BeforeYouStart from '@site/src/partials/before-you-start.mdx'; +import Partial_TroubleshootingDetoxTests from '@site/src/partials/troubleshooting-detox-tests.mdx'; + +Detox is a gray box end-to-end tests and automation library for mobile apps built with React Native. It supports both iOS and Android apps. If you have a React Native app on Bitrise, you can run Detox tests. + + + + + + diff --git a/docs/bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps.mdx b/docs/bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps.mdx new file mode 100644 index 0000000..b082167 --- /dev/null +++ b/docs/bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps.mdx @@ -0,0 +1,56 @@ +--- +title: "Running unit and UI tests for React Native apps" +description: "You can run all kinds of tests for your React Native app on Bitrise: unit tests, integration tests, or component tests. You can use [Jest](https://jestjs.io/), for example, to write all your tests and then run them during the build process with either [npm](https://www.npmjs.com/) or [Yarn](https://yarnpkg.com/)." +sidebar_position: 1 +slug: /bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps +sidebar_label: Running tests for React Native apps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +You can run all kinds of tests for your React Native app on Bitrise: unit tests, integration tests, or component tests. You can use [Jest](https://jestjs.io/), for example, to write all your tests and then run them during the build process with either [npm](https://www.npmjs.com/) or [Yarn](https://yarnpkg.com/). + +:::tip[E2E testing] + +For end-to-end testing, check out Detox: [Running Detox tests on Bitrise](/en/bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise). + +::: + +Workflow Editor + +Configuration YAML + +1. Write your tests and add them to your React Native project. +1. On Bitrise, add either the [**Run npm command**](https://github.com/bitrise-steplib/steps-npm) or the [**Run yarn command**](https://github.com/bitrise-community/steps-yarn) Step to your Workflow, depending on which package manager you use in your project. +1. Configure the Step to run the `test` command: + + For Yarn, find the **Arguments for running yarn commands** input and add `test`. + + For npm, find the **The npm command with arguments to run** input and add `test`. + + ![npm-test.png](/img/_paligo/uuid-195577ac-fbba-5fe4-810b-3749e614682c.png) + + In either case, the Step will run the `test` script in the `scripts` object of your package. + +1. Write your tests and add them to your React Native project. +1. In the Configuration YAML file, add either the `npm` or the `yarn` Step to your Workflow, depending on which package manager you use in your project. +1. Configure the Step of your choice to run the `test` command: for either Step, set the `command` input to `test`. + + ``` + empty: + steps: + - git-clone: {} + - npm: + inputs: + - command: test + - yarn@0: + inputs: + - command: test + - deploy-to-bitrise-io: {} + ``` + + Either Step will run the `test` script in the `scripts` object of your package. + +Run the tests and view their results: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). diff --git a/docs/bitrise-ci/workflows-and-pipelines/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/_category_.json new file mode 100644 index 0000000..f64361b --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Workflows and Pipelines", + "position": 2, + "link": null +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/_category_.json new file mode 100644 index 0000000..7bcd0e5 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Pipelines", + "position": 3, + "description": "Pipelines allow you to define dependencies between your Workflows. This can reduce build time by running CI tasks in parallel whenever possible.", + "link": null +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.md b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.md new file mode 100644 index 0000000..a1c41ff --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.md @@ -0,0 +1,20 @@ +--- +title: "About Pipelines" +description: "Pipelines allow you to define dependencies between your Workflows. This can reduce build time by running CI tasks in parallel whenever possible." +sidebar_position: 1 +slug: /bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines +--- + +A Bitrise Pipeline is the top level of our CI/CD configuration. Pipelines can be used to organize the entire CI/CD process and to set up advanced configurations with multiple different tasks running parallel and/or sequentially. + +A Pipeline allows you to configure dependencies between Workflows. Each Workflow starts executing when its parent Workflows are done. Workflows on the same level are executed in parallel: + +![pipeline-example.png](/img/_paligo/uuid-e85b689a-0101-6664-7f58-6e9ae5c851a7.png) + +In this example, B and C are executed, in parallel, once A is successful. D is executed once B and C are both successful. + +Read more about Pipelines: + +- [Configuring a Bitrise Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline) +- [Pipeline builds](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds) +- [Default Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines) diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq.md b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq.md new file mode 100644 index 0000000..0f79bfb --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq.md @@ -0,0 +1,27 @@ +--- +title: "Build Pipelines FAQ" +description: "Frequently asked questions about the Pipeline feature on Bitrise." +sidebar_position: 5 +slug: /bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq +sidebar_label: Pipeline Management FAQ +--- + +**Can I use Pipelines if I store my bitrise.yml file in my own repository?** + +Yes, absolutely. It makes no difference to Pipelines. + +**How can I set the stack for my Pipeline?** + +In the current version, you can set the default stack for your app, or you can set Workflow-specific stacks, just like with standalone builds: [Setting the stack for your builds](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds). + +**How can I use Environment Variables with a Pipeline?** + +You can keep using project-level and Workflow-level [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html). + +**Can I rerun a failed Pipeline?** + +Yes. Go to the **Pipeline details** page, and click the **Rerun** button. From there you have the option to rerun failed and subsequent Workflows or to rerun the entire Pipeline. + +**Does the Rolling Builds feature work on Pipelines?** + +Yes! You don’t have to worry about wasting credits with builds that are no longer necessary because of new commits or pull requests. diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline.mdx b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline.mdx new file mode 100644 index 0000000..4000dd1 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline.mdx @@ -0,0 +1,299 @@ +--- +title: "Configuring a Bitrise Pipeline" +description: "Configure a Bitrise Pipeline by adding Workflows and optionally, defining dependencies between the Workflows." +sidebar_position: 2 +slug: /bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline +sidebar_label: Configuring Pipelines +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_PipelinePriority from '@site/src/partials/pipeline-priority.mdx'; +import Partial_WorkflowPropertiesInPipelines from '@site/src/partials/workflow-properties-in-pipelines.mdx'; +import Partial_ParallelismInPipelines from '@site/src/partials/parallelism-in-pipelines.mdx'; +import Partial_UsingThePullPipelineIntermediateFilesStep from '@site/src/partials/using-the-pull-pipeline-intermediate-files-step.mdx'; + +:::important[Pipelines with stages] + +If you have an existing Pipeline configuration from before December 2024, you probably have stages in your Pipeline. We strongly recommend to stop using stages and instead focus on configuring dependencies between Workflows. These dependencies determine the order of execution in a Pipeline. This eliminates unnecessary waiting time in stages and allows you to create more flexible CI configurations. + +You can keep using Pipelines with stages but they will receive no updates in the future. You can have both types of Pipelines in the same configuration YAML file but you can't mix and match the two types: you can't have both stages and Workflow dependencies in the same Pipeline. + +You can find the documentation for Pipelines with stages here: [Pipelines with stages](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages). + +You can convert a Pipeline with stages into the new format: [Converting a Pipeline with stages into a graph Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline). + +::: + +You can define your Pipelines under a `pipelines` element in a configuration YAML file. You can use the following elements to set up a Pipeline: + +- A Pipeline name: the human readable identifier of the Pipeline. +- The `workflows` element: this contains a list of the Workflows that are part of the Pipeline. +- The `depends_on` property: This is a property of the `workflows element` and accepts an array of Workflow names. It defines the dependencies between Workflows. + +For example, here's a simple Pipeline configuration: + +![pipeline-example.png](/img/_paligo/uuid-e85b689a-0101-6664-7f58-6e9ae5c851a7.png) + +In this Pipeline, we have four Workflows: + +1. Workflow A runs first. +1. Once Workflow A is finished, Workflows B and C start at the same time. +1. Workflow D starts only when both Workflows B and C are successfully finished. + +## Creating a Pipeline + +Workflow Editor + +Configuration YAML + +Open the Workflow Editor and select **Pipelines** on the left. Click **Create Pipeline** and set a name, then click **Create Pipeline** again. + +To add your first Workflow, click **Workflows**. + +![add-workflow-pipeline.png](/img/_paligo/uuid-6f5bdb24-c8e6-3923-723f-07a33eae84bc.png) + +You can keep adding Workflows this way. This method creates no dependencies between Workflows: they will all run at the same time. + +![basic-pipeline.png](/img/_paligo/uuid-13e965a3-cef3-17c5-970b-b4308460ae26.png) + +A Workflow can depend on one or more Workflows: if any of the Workflows it depends on fails, the Workflow won't run. To create Workflow dependencies, hover over the right end of a Workflow and click the plus sign: + +![add-dependent-workflow.png](/img/_paligo/uuid-cc676406-6eb6-010a-1daa-9a687d3902ea.png) + +You can add multiple dependent Workflows to the same Workflow this way: + +![multiple-dependent-flows.png](/img/_paligo/uuid-9e8845d9-aa8e-6c98-642a-4e13fddf93ea.png) + +The same Workflow can depend on two or more different Workflows: you can create a path by dragging from the plus sign to another Workflow already in the Pipeline: + +![drag-and-drop-dep.png](/img/_paligo/uuid-636d0224-45fb-307d-a1d5-69a7d8e84d9f.png) + +A bare minimum Pipeline configuration consists of a single Workflow: + +``` +pipelines: + example: + workflows: + A: {} +``` + +You can have multiple Workflows that all run in parallel: + +``` +pipelines: + example: + workflows: + A: {} + B: {} + C: {} +``` + +A Workflow can depend on one or more Workflows: if any of the Workflows it depends on fails, the Workflow won't run. To create Workflow dependencies, you need to use the `depends_on` property: + +``` +pipelines: + example: + workflows: + A: {} + B: + depends_on: + - A + C: + depends_on: + - A + D: + depends_on: + - B + - C +``` + +If a Workflow depends on multiple Workflows, both YAML array syntaxes can be used: + +``` +# Option 1 +D: + depends_on: + - B + - C +# Option 2 +D: + depends_on: [A, B] +``` + +## Configuration restrictions + +- A Pipeline can have a maximum of 200 Workflows. Each must be an existing Workflow under the root level `workflows` element. +- [Utility Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/utility-workflows) can't be added to a Pipeline. If you want to use utility Workflows, include them as part of a regular Workflow. +- Each Workflow can be added to the same Pipeline only once. You can't include the same Workflow in multiple different parts of a Pipeline. +- Any Workflow defined in the dependency list must be part of the same Pipeline. +- The dependency graph resulting from your configuration can't contain a circle or loop. You can't start builds with an invalid Pipeline configuration. + +## Conditional Workflow execution in a Pipeline + +Use `run_if` expressions to control Workflow execution: you can set conditions under which a Workflow should or should not run. + + + + +1. +1. In the **Additional running conditions** input, add a valid [Go template](https://pkg.go.dev/text/template). + + The input accepts three helper functions: + + - `getenv`: Accesses an Environment Variable's value. + - `enveq`: Compares an Environment Variable to a given value. + - `envcontain`: Checks whether an Environment Variable contains a given string. + + ![run-if-template.png](/img/_paligo/uuid-4ababac0-1bb5-1f86-165a-f31d14fa9f28.png) +1. Close the Edit Workflow dialog, and click **Save changes**. + + + + +In Pipelines, the `run_if` property needs an `expression` field that contains a [Go template](https://pkg.go.dev/text/template): + +``` +pipelines: + example: + workflows: + A: {} + B: + run_if: + expression: {{ enveq "EXAMPLE_KEY" "example value" }} + depends_on: [A] +``` + +The `expression` field accepts three helper functions: + +- `getenv`: Accesses an Environment Variable's value. +- `enveq`: Compares an Environment Variable to a given value. +- `envcontain`: Checks whether an Environment Variable contains a given string. + +The Bitrise CLI evaluates the expression during runtime: a Workflow only runs if its `run_if` expression evaluates to `true`. A Workflow that is skipped because of a `run_if` expression is counted as a successful Workflow so its dependent Workflows will run. + +In this example, B will only run if the EXAMPLE_KEY Environment Variable has the value `example value`. + +## Always executing a Workflow in a Pipeline + +You can mark a Workflow to make sure it runs even if a Workflow it depends on failed. + +:::important[Transitive dependency] + +Even if a Workflow is configured to always run, its dependent Workflows might not run. If one or more of its parent Workflows failed, the Workflow in question will still run but its dependent Workflows might not. + +For example, let's say we have Workflow C that depends on Workflow B. Workflow B depends on Workflow A. Of the three Workflows, only B is set to always run: + +- If A fails, B will run but regardless of its result, C won't run because by depending on B, it also depends on A. +- C only runs if both A and B are successful. + +::: + + + + +1. +1. Set the **Always run** input to **Workflow**. + + This setting means the Workflow will run even if one or more of its parent Workflows fail. However, its dependent Workflows might not run! + + + + +Use the `should_always_run` property. It requires a string to specify the scope of the configuration. It has two available values: + +- `none`: If a parent Workflow fails, the Workflow will not run. This is the default value. +- `workflow`: If a parent Workflow fails, the Workflow will run anyway. + +``` +pipelines: + example: + workflows: + A: {} + B: + depends_on: [ A ] + should_always_run: workflow + C: + depends_on: [ B ] + D: + depends_on: [ C ] + should_always_run: workflow +``` + +In this example: + +- If A fails, B still runs. +- If either A or B fails, C won't run. +- If C won't run or runs but fails, D will still run. + +## Aborting the Pipeline on Workflow failure + +You can configure the Pipeline to immediately terminate when any given Workflow fails. By default, the Pipeline won't terminate + + + + +1. +1. Toggle the **Abort Pipeline on failure** input on. + + If the Workflow in question fails, the Pipeline will immediately stop running. + + + + +Add the `abort_on_fail` field set to `true` to the selected Workflows: + +``` +pipelines: + example: + workflows: + A: {} + B: + abort_on_fail: true +``` + +In this example, the Pipeline stops running if Workflow B fails: Workflow A will be aborted and no subsequent Workflows will run. + + + + + +## Sharing Env Vars between Workflows + +You can reuse any environment variable from a Workflow and reuse it in subsequent Workflows using the [Share Pipeline variables](https://github.com/bitrise-steplib/bitrise-step-share-pipeline-variable) Step. + +:::tip[Optional Workflows using run_if conditions] + +You can easily combine the [**Share Pipeline variables**](https://github.com/bitrise-steplib/bitrise-step-share-pipeline-variable) Step with `run_if` expressions to create Pipelines with optional Workflows. For more information, check out [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). + +::: + +To do so: + +1. Add the [**Share Pipeline variables**](https://github.com/bitrise-steplib/bitrise-step-share-pipeline-variable) Step to the Workflow. +1. Optionally, you can define additional run conditions in the **Additional run conditions** input. The Step will only run if the conditions you specify here are true. +1. Add the Env Var(s) you would like to use in subsequent Workflows in the **Variables to share between Pipeline Workflows** input. + + :::tip[Using environment variable keys] + + You can define Env Vars using a `{key}={value}` syntax. For example, `MY_ENV_KEY=value`, or `INSTALL_PAGE_URL=$BITRISE_PUBLIC_PAGE_URL`. + + If you want to use the default environment variable keys, you can use a shorthand syntax. For example, `EXISTING_ENV_KEY`. + + Sharing Env Vars using this Step does not override existing Env Vars defined in the app. + + ::: + + + +## Supported use cases for Pipelines + +We have prepared some Pipeline recipes based on common iOS and Android use cases. These contain some of the most frequent tasks our users need to run. You can find them in our [GitHub repository](https://github.com/bitrise-io/workflow-recipes/tree/main/recipes). + +## Troubleshooting a Pipeline + +If a Pipeline build fails, you have two main options: + +- [Rebuild the Pipeline](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build/rebuilding-a-failed-pipeline). You can rebuild either the entire Pipeline, or the failed Workflows. +- Rebuild with [remote access](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access.html) which allows you to access the build machine while the build is running. diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline.md b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline.md new file mode 100644 index 0000000..a9ece13 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline.md @@ -0,0 +1,33 @@ +--- +title: "Converting a Pipeline with stages into a graph Pipeline" +description: "You can convert your old, existing Bitrise Pipelines that contain stages into graph Pipelines without stages. This unlocks the full benefits of using Pipelines: faster build times, more granular configuration, and a full editing capability in the GUI of the Workflow Editor." +sidebar_position: 7 +slug: /bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline +--- + +You can convert your old, existing Pipelines that contain stages into graph Pipelines without stages. This unlocks the full benefits of using Pipelines: faster build times, more granular configuration, and a full editing capability in the GUI of the Workflow Editor. + +To convert a Pipeline, you need to create a new Pipeline based on an old Pipeline. The old Pipeline won't be removed and it will still work if you need it so your builds will not break. You can switch to using the new Pipeline when all your configurations are ready for it. + +:::note + +Be aware that all new Pipeline features and improvements will only be available for graph Pipelines. Pipelines with stages will have no further features added. + +::: + +To convert a Pipeline + +1. Open the Workflow Editor. +1. Open the dropdown menu at the top. +1. Click **Create Pipeline**. +1. Name your new Pipeline. +1. In the **Based on** dropdown menu, select a Pipeline that contains stages. +1. Click **Save changes**. + + :::important[No cycles allowed] + + If your Pipeline conversion creates a cycle in the graph, you won't be able to save the Pipeline. You have to manually edit the configuration to remove the cycle, as they aren't allowed. + + ::: + +That's it: the new Pipeline will no longer have stages but will contain the same Workflows as the old one. diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines.mdx b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines.mdx new file mode 100644 index 0000000..32bc08e --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines.mdx @@ -0,0 +1,23 @@ +--- +title: "Default Pipelines" +sidebar_position: 4 +slug: /bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +When you add a new project on [bitrise.io](https://www.bitrise.io), we create initial Pipelines and Workflows for you. + +You can use these to run your tests or create installable binaries such as IPAs or APKs. Feel free to modify the default Pipelines and Workflows to suit your needs. + +Default Pipelines are created for all new iOS and Android projects. These Pipelines consist of automatically created default Workflows. + +| Pipeline ID | Pipeline summary | Workflows within the Pipeline | +| --- | --- | --- | +| `run_tests` | Builds your iOS project, runs your Xcode tests in two [parallel shards](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines). The number of shards is specified in the env var $TEST_SHARD_COUNT. | `build_for_testing` `test_without_building` | + +| Pipeline ID | Pipeline summary | Workflows within the Pipeline | +| --- | --- | --- | +| `run_tests` | Run your Android instrumented tests in [two parallel test shards](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines) and get a test report. The number of shards is specified in the env var $TEST_SHARD_COUNT. | `run_instrumented_tests` | diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/index.md b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/index.md new file mode 100644 index 0000000..433b457 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/index.md @@ -0,0 +1,11 @@ +--- +title: "Build Pipelines" +description: "Pipelines allow you to define dependencies between your Workflows. This can reduce build time by running CI tasks in parallel whenever possible." +sidebar_position: 3 +slug: /bitrise-ci/workflows-and-pipelines/build-pipelines +sidebar_label: Pipelines +--- + +Pipelines + +Pipelines allow you to define dependencies between your Workflows. This can reduce build time by running CI tasks in parallel whenever possible. diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds.md b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds.md new file mode 100644 index 0000000..beadf8e --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds.md @@ -0,0 +1,18 @@ +--- +title: "Pipeline builds" +description: "Bitrise Pipeline builds can be triggered the same way as Workflow builds, they can send status reports, and all their artifacts are available on the Artifacts page. You can use Pipeline builds to upload installable artifact's to Release Management." +sidebar_position: 3 +slug: /bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds +--- + +You can run Pipeline builds the same way you would run builds of standalone Workflows: + +- [You can start Pipeline builds manually](/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html). +- [Schedule Pipeline builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.html). +- [Trigger Pipeline builds automatically](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html). For now, Pipeline triggers must be configured in YAML, however: [YAML syntax for build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers). + +Pipeline builds are capable of sending build status reports: a Pipeline build will send a status report of the Pipeline itself and of any Steps that export test results: [Reporting the build status to your Git hosting provider](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider). + +All artifacts of a Pipeline build are available on the **Artifacts** page: [Build artifacts online](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online). + +You can use Pipeline builds to upload installable artifacts to Release Management, in order to distribute your mobile app to testers and release the app in an online store. All you need is a Workflow that generates an installable APK, AAB or IPA file: [see topic](urn:resource:component:92027). diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/_category_.json new file mode 100644 index 0000000..f49f22c --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Pipelines with stages", + "position": 6, + "description": "Pipelines with stages are the older way of configuring Pipelines. We recommend switching to the new way where you can define Workflow dependencies to create more flexible configurations, and you no longer have to waste time waiting for a stage to finish.", + "link": { + "type": "doc", + "id": "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/index" + } +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages.mdx b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages.mdx new file mode 100644 index 0000000..7467b6e --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages.mdx @@ -0,0 +1,22 @@ +--- +title: "Configuring a Pipeline with stages" +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DefiningPipelinesStepsAndWorkflows from '@site/src/partials/defining-pipelines-steps-and-workflows.mdx'; +import Partial_SharingEnvVarsBetweenStages from '@site/src/partials/sharing-env-vars-between-stages.mdx'; +import Partial_ConfiguringAStageToAlwaysRun from '@site/src/partials/configuring-a-stage-to-always-run.mdx'; +import Partial_AbortingWorkflowsOfAFailedStage from '@site/src/partials/aborting-workflows-of-a-failed-stage.mdx'; + +Configuring a Pipeline that contains stages is only possible by directly editing the bitrise.yml file. You can create and modify Workflows in the graphical Workflow Editor but you need to define Pipelines and Stages in YAML format. + + + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform.mdx b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform.mdx new file mode 100644 index 0000000..177e6b8 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform.mdx @@ -0,0 +1,19 @@ +--- +title: "Currently supported use cases for the Android platform" +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RunUITestsInParallelOnMultipleDevicesOrShards from '@site/src/partials/run-ui-tests-in-parallel-on-multiple-devices-or-shards.mdx'; +import Partial_AndroidUnitTestShardingByModule from '@site/src/partials/android-unit-test-sharding-by-module.mdx'; +import Partial_AndroidRunningUnitAndUITestsInParallel from '@site/src/partials/android-running-unit-and-ui-tests-in-parallel.mdx'; + +We have prepared some Pipeline recipes based on common Android use cases. These contain some of the most frequent tasks our users need to run. The examples include entire Workflows that can be copied and pasted for the most part. + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform.mdx b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform.mdx new file mode 100644 index 0000000..515fac6 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform.mdx @@ -0,0 +1,16 @@ +--- +title: "Currently supported use cases for the iOS platform" +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RunIOSTestsInParallelOnMultipleSimulators from '@site/src/partials/run-ios-tests-in-parallel-on-multiple-simulators.mdx'; +import Partial_RunIOSTestGroupsInParallel from '@site/src/partials/run-ios-test-groups-in-parallel.mdx'; + +We have prepared some Pipeline recipes based on common iOS use cases. These contain some of the most frequent tasks our users need to run. + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/index.mdx b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/index.mdx new file mode 100644 index 0000000..be7a5dc --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/index.mdx @@ -0,0 +1,23 @@ +--- +title: "Pipelines with stages" +description: "Pipelines with stages are the older way of configuring Pipelines. We recommend switching to the new way where you can define Workflow dependencies to create more flexible configurations, and you no longer have to waste time waiting for a stage to finish." +sidebar_position: 6 +slug: /bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ConfiguringAPipelineWithStages from '@site/src/partials/configuring-a-pipeline-with-stages.mdx'; + +Pipelines with stages are the older way of configuring Pipelines. We recommend switching to the new way where you can define Workflow dependencies to create more flexible configurations, and you no longer have to waste time waiting for a stage to finish. + +You can convert a Pipeline with stages into the new format: [Converting a Pipeline with stages into a graph Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline). + +However, if you need to, you can keep using Pipelines with stages. Such Pipelines have three main building blocks: + +- Steps: Blocks of script execution, each defining a single task in a CI/CD process. +- Workflows: Collections of Steps. When a build of an app is running, the Steps will be executed in the order that is defined in the Workflow. +- Stages: Collections of Workflows. A Stage can contain multiple Workflows which all run in parallel in the same Stage. If all Workflows are successful in a Stage, the Pipeline moves on to the next Stage. If any of the Workflows fail, the Pipeline ends without running the other Stages unless you configure a given Stage to always run. + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/_category_.json new file mode 100644 index 0000000..88b6e32 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Developing your own Bitrise Step", + "position": 4, + "description": "You can develop your own Bitrise Steps and your own project scanner, and submit them to Bitrise so that other users can use them, too.", + "link": null +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner.mdx b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner.mdx new file mode 100644 index 0000000..a85585f --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner.mdx @@ -0,0 +1,71 @@ +--- +title: "Creating your own Bitrise project scanner" +description: "A Bitrise project scanner must have a scan result model. Every platform scanner writes its possible options, configurations, and warnings into this model. These will be translated into Step input values by choosing the desired values for the given options." +sidebar_position: 4 +slug: /bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_Scanners from '@site/src/partials/scanners.mdx'; +import Partial_Options from '@site/src/partials/options.mdx'; + +The project scanner is a tool that identifies the given project’s type and generates a basic Bitrise configuration. Each supported project type has its own scanner: these scanners are stored as separate packages. + +A project type scanner defines at least two Workflows: one for testing (`primary`) and one for building (`deploy`). [It includes the minimal amount of Steps to successfully run them](). + +:::important[Build and test Steps] + +Build Steps and test Steps have specific requirements: + +- A build Step must build your app so that it is ready for deployment and it must output an Environment Variable that points to the output file(s). For example, a build Step to build an iOS app must output an .ipa file (not, say, `.xcodearchive`) and the path to this .ipa file. +- A test Step must output the test results so that they are available for viewing on the build page on bitrise.io. + +::: + +When adding a new project on the website or initializing a project on your own machine, the [bitrise-init](https://github.com/bitrise-core/bitrise-init) tool iterates through every scanner, calls the scanner interface methods on each of them and collects their outputs. Based on these outputs, a basic configuration is generated. + +The possible Workflows are described in a scan result model. The model consists of: + +- options +- configs +- warnings + +Here is the basic structure of the model, in YAML: + +``` +options: + DETECTED_PLATFORM_1: OptionModel + DETECTED_PLATFORM_2: OptionModel + ... + +configs: + DETECTED_PLATFORM_1: + CONFIG_NAME_1: ConfigModel + CONFIG_NAME_2: ConfigModel + ... + DETECTED_PLATFORM_2: + CONFIG_NAME_1: ConfigModel + CONFIG_NAME_2: ConfigModel + ... + ... + +warnings: + DETECTED_PLATFORM_1: + - "warning message 1" + - "warning message 2" + ... + DETECTED_PLATFORM_2: + - "warning message 1" + - "warning message 2" + ... +``` + +- Every platform scanner writes its possible options, configurations and warnings into this model. These will be translated into Step input values by choosing the desired values for the given options. +- Every option chain’s last option selects a configuration. +- Warnings display the issues with the given project setup. + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step.mdx b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step.mdx new file mode 100644 index 0000000..7431b8a --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step.mdx @@ -0,0 +1,65 @@ +--- +title: "Developing a new Step" +description: "To develop a Bitrise Step and get it integrated in our Step library, you need to write a code, create the description, and submit everything for review." +sidebar_position: 1 +slug: /bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_BeforeYouStartDevelopingANewStep from '@site/src/partials/before-you-start-developing-a-new-step.mdx'; +import Partial_AddingAStepIcon from '@site/src/partials/adding-a-step-icon.mdx'; +import Partial_StepCategories from '@site/src/partials/step-categories.mdx'; +import Partial_NamingAndDescribingAStep from '@site/src/partials/naming-and-describing-a-step.mdx'; +import Partial_CreatingTheStep from '@site/src/partials/creating-the-step.mdx'; +import Partial_StepOutputs from '@site/src/partials/step-outputs.mdx'; +import Partial_StepInputs from '@site/src/partials/step-inputs.mdx'; +import Partial_TheStepYmlFile from '@site/src/partials/the-stepyml-file.mdx'; +import Partial_SubmodulesAndStepDependencies from '@site/src/partials/submodules-and-step-dependencies.mdx'; +import Partial_ConfiguringStepInputs from '@site/src/partials/configuring-step-inputs.mdx'; +import Partial_SettingConditionsForRunningTheStep from '@site/src/partials/setting-conditions-for-running-the-step.mdx'; + +:::important[Duplicate Steps] + +Before deciding to develop a new Step, please make sure that there’s no already existing Step that performs the same function. + +You can search for Steps on our [Integrations](https://www.bitrise.io/integrations/steps) page or in the [Step Library](https://github.com/bitrise-io/bitrise-steplib) on GitHub. + +::: + +A Step is a build task: for example, the **Git Clone** Step clones your Git repository at the start of a build while the [**Manage iOS Code Signing**](https://github.com/bitrise-steplib/bitrise-step-manage-ios-code-signing) Step is performing code signing for your iOS app. + +A Step contains the code that performs the build task. You can configure the inputs and parameters that define the task, and view and reuse the outputs a Step generates. Reusing the output means that another Step can use it as the value of one of its inputs. + +Our Steps are written in [Go](https://golang.org/) or Bash. Steps are contained in their own Git repositories: that includes the code and the `step.yml` file that defines the configuration of the Step. If you wish to make the Step available to other users, the `step.yml` file needs to be included in the `bitrise-steplib` repository so that other users can find the Step on our website, in the Workflow Editor. + +:::tip[Sharing Steps] + +Sharing your custom Steps is optional: a Step with a use case that is specific to a single user will not be much help to others. As you can run a Step from your own machine or from any Git repository, your custom Steps do not have to be part of the Bitrise Step Library. + +For more info on sharing Steps with other users, check out the [Sharing Steps]() guide. + +::: + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/index.mdx b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/index.mdx new file mode 100644 index 0000000..03f37ca --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/index.mdx @@ -0,0 +1,18 @@ +--- +title: "Developing your own Bitrise Step" +description: "You can develop your own Bitrise Steps and your own project scanner, and submit them to Bitrise so that other users can use them, too." +sidebar_position: 4 +slug: /bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CreatingYourOwnStep from '@site/src/partials/creating-your-own-step.mdx'; +import Partial_CreatingYourOwnScanner from '@site/src/partials/creating-your-own-scanner.mdx'; + +Contributing to Bitrise is easy: develop an open source integration, submit it and you’re done! In this section, we’ll be focusing on technical contributions: creating a new Step and creating your very own project scanner. + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users.mdx b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users.mdx new file mode 100644 index 0000000..8fdccb2 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users.mdx @@ -0,0 +1,29 @@ +--- +title: "Sharing Steps with all Bitrise users" +description: "If you think your Bitrise Step can be of use to others, you can share it via a CLI command or a Bitrise Workflow. Shared Steps must be actively maintained and they must be open to contributors." +sidebar_position: 2 +slug: /bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ReportingStepIssues from '@site/src/partials/reporting-step-issues.mdx'; +import Partial_SharingANewStep from '@site/src/partials/sharing-a-new-step.mdx'; +import Partial_AbandonedSteps from '@site/src/partials/abandoned-steps.mdx'; + +If you think your Step can be of use to others, you can share it! Before doing so, however, please check that there are no other Steps that solve the same problem. You can check: + +- In the list of [released Steps](https://www.bitrise.io/integrations/steps). +- In the list of [open pull requests](https://github.com/bitrise-io/bitrise-steplib/pulls) in our StepLib. +- In the list of [closed pull requests](https://github.com/bitrise-io/bitrise-steplib/pulls?q=is%3Apr+is%3Aclosed) in our StepLib. + +If you find a Step which is missing a particular feature, please try to contribute to it before developing or sharing a brand new Step for that feature. You can use our [Integrations page](https://www.bitrise.io/integrations/steps) to search for Steps in the Bitrise StepLib. By clicking the GitHub source button on a given Step’s page you will be taken to the Step’s repository, where you can submit a feature request or open a pull request. + +Also, please keep in mind that shared Steps must be actively maintained and they must be open to contributors. + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps.mdx b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps.mdx new file mode 100644 index 0000000..fb8e417 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps.mdx @@ -0,0 +1,22 @@ +--- +title: "Verified Steps" +description: "Verified Steps are Bitrise Steps whose owner guarantees secure, maintained, consistent, and high-quality performance for any Bitrise user. To have your Step verified, you must apply for the Verified badge." +sidebar_position: 3 +slug: /bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ManagingContributions from '@site/src/partials/managing-contributions.mdx'; +import Partial_AboutVerifiedSteps from '@site/src/partials/about-verified-steps.mdx'; +import Partial_HowDoWeGoAboutStepDuplications from '@site/src/partials/how-do-we-go-about-step-duplications.mdx'; +import Partial_OurRequestsToVerifiedStepMaintainers from '@site/src/partials/our-requests-to-verified-step-maintainers.mdx'; + + + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/index.md b/docs/bitrise-ci/workflows-and-pipelines/index.md new file mode 100644 index 0000000..4f1f056 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/index.md @@ -0,0 +1,7 @@ +--- +title: "Workflows and Pipelines" +sidebar_position: 2 +slug: /bitrise-ci/workflows-and-pipelines +--- + +Workflows and Pipelines diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/steps/_category_.json new file mode 100644 index 0000000..749bdb1 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Steps", + "position": 2, + "link": null +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow.mdx new file mode 100644 index 0000000..34ed86b --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow.mdx @@ -0,0 +1,23 @@ +--- +title: "Adding Steps to a Workflow" +description: "Steps can be added or removed any time from your Workflows. You can add any Step to your Workflow - there are absolutely no restrictions. It’s possible to add a Step specific to, for example, iOS apps to a Workflow of an Android app." +sidebar_position: 2 +slug: /bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AddingStepsInTheWorkflowEditor from '@site/src/partials/adding-steps-in-the-workflow-editor.mdx'; +import Partial_AddingStepsFromAlternativeSources from '@site/src/partials/adding-steps-from-alternative-sources.mdx'; +import Partial_RemovingAStepFromAWorkflow from '@site/src/partials/removing-a-step-from-a-workflow.mdx'; + +Steps can be added or removed any time from your Workflows. When adding a new app to Bitrise, the project scanner generates at least one Workflow with some default Steps but you don't have to use these at all: it's up to you what Steps you want to include. + +You can add any Step to your Workflow - there are absolutely no restrictions. Please note that this means that it’s possible to add a Step specific to, for example, iOS apps to a Workflow of an Android app. Always make sure you only add the relevant Steps to your Workflow! + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps.mdx new file mode 100644 index 0000000..0adcf5d --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps.mdx @@ -0,0 +1,25 @@ +--- +title: "Detecting and aborting hanging Steps" +sidebar_position: 10 +slug: /bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps +sidebar_label: Detecting and aborting hanging Steps without output +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_EnablingTheNoOutputTimeoutFunctionForSpecificSteps from '@site/src/partials/enabling-the-no-output-timeout-function-for-specific-steps.mdx'; +import Partial_EnableTheNoOutputTimeoutFunctionGloballyForAllSteps from '@site/src/partials/enable-the-no-output-timeout-function-globally-for-all-steps.mdx'; + +You can detect and abort hanging Steps that do not produce any log output for a certain amount of time using the **No Output Timeout** function. You can use this function to automatically abort hung builds after a configurable timeout period to save credits and to enable Bitrise to gather data on hanging builds. + +You can use the **No Output Timeout** function in two ways: + +- [Enable globally for all Steps](#UUID-9eea37c4-370c-0a0d-d5cc-8195e68503ac). +- [Enable for specific Steps only](#UUID-1c0c1c6e-5b20-80ee-580c-85d38fab0d04). + +The **No Output Timeout** function can be used alongside other timeout functionalities, such as the one described in the [M1 Hanging builds issue guide](https://devcenter.bitrise.io/en/infrastructure/build-stacks/apple-silicon-m1-stacks.html#hanging-builds-issue) or in [Setting a time limit for Steps](/en/bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.html). + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace.mdx new file mode 100644 index 0000000..f5b5455 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace.mdx @@ -0,0 +1,27 @@ +--- +title: "Disabling third-party Steps in a workspace" +sidebar_position: 7 +slug: /bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DisablingThirdPartySteps from '@site/src/partials/disabling-third-party-steps.mdx'; +import Partial_RequestingAnEmailReportOfThirdPartySteps from '@site/src/partials/requesting-an-email-report-of-third-party-steps.mdx'; +import Partial_ThirdPartyStepRestrictions from '@site/src/partials/third-party-step-restrictions.mdx'; + +You can configure your workspace to only allow official Bitrise Steps in its projects. + +By default, you can place any Step in your Workflows, including community Steps and custom Steps. However, you can disable third-party Steps, including: + +- [Verified Steps](/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps.html) +- Community Steps + +![settings-third-party-steps.png](/img/_paligo/uuid-f06634d9-f49d-0cc1-0c09-3d660920c3ba.png) + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally.mdx new file mode 100644 index 0000000..fe3780b --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally.mdx @@ -0,0 +1,49 @@ +--- +title: "Enabling or disabling a Step conditionally" +description: "You can enable or disable a Step in any given Workflow, and you can also set conditions for Steps. You can do so, either on your own computer, with the Bitrise CLI or by using the **bitrise.yml** tab of the Workflow Editor." +sidebar_position: 6 +slug: /bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingUpRunIfConditionsWithScriptSteps from '@site/src/partials/setting-up-run-if-conditions-with-script-steps.mdx'; +import Partial_RunningAStepOnlyIfTheBuildFailed from '@site/src/partials/running-a-step-only-if-the-build-failed.mdx'; +import Partial_IgnoringAFailedStepWithoutFailingTheBuild from '@site/src/partials/ignoring-a-failed-step-without-failing-the-build.mdx'; +import Partial_ExamplesOfRunIfExpressions from '@site/src/partials/examples-of-run-if-expressions.mdx'; +import Partial_RunningAStepOnlyInACIEnvironment from '@site/src/partials/running-a-step-only-in-a-ci-environment.mdx'; +import Partial_DisablingAStep from '@site/src/partials/disabling-a-step.mdx'; + +You can enable or disable a Step in any given Workflow, and you can also set conditions for Steps. You can do it either on your own computer, with the Bitrise CLI or by using the **bitrise.yml** tab of the Workflow Editor. + +We mostly use `run_if` expressions to do these things. Check out the examples for possible template expressions: [see topic](#UUID-7d2bc43d-cb09-d711-38ce-01c35278fdc4). + +You can also view the examples on GitHub: [Template expression examples](https://github.com/bitrise-io/bitrise/blob/master/_examples/experimentals/templates/bitrise.yml). + +:::note[A `run_if` can be any valid Go template] + +A `run_if` can be any valid [Go template](https://golang.org/pkg/text/template/), as long as it evaluates to `true` or `false` (or any of the String representation, for example `True`, `t`, `yes` or `y` are all considered to be `true`). If the template evaluates to `true`, the Step will run, otherwise it won’t. + +::: + +An example `run_if` to check a custom [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html): + +``` +run_if: |- + {{enveq "CUSTOM_ENV_VAR_KEY" "test value to test against"}} +``` + +This `run_if` will skip the Step if the value of `CUSTOM_ENV_VAR_KEY` is not `test value to test against`. + + + + + + + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/index.md b/docs/bitrise-ci/workflows-and-pipelines/steps/index.md new file mode 100644 index 0000000..f0b5e4c --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/index.md @@ -0,0 +1,7 @@ +--- +title: "Steps" +sidebar_position: 2 +slug: /bitrise-ci/workflows-and-pipelines/steps +--- + +Steps diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.mdx new file mode 100644 index 0000000..bc22b6e --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.mdx @@ -0,0 +1,27 @@ +--- +title: "Setting a time limit for Steps" +description: "A Step timeout, defined in seconds, sets a maximum time a Step is allowed to run. If the Step exceeds that limit, the Workflow moves on to the next Step." +sidebar_position: 9 +slug: /bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Ensure that your builds do not exceed the time limit by setting up Step timeout for Steps that might cause builds to hang. + +A Step timeout, defined in seconds, sets a maximum time a Step is allowed to run. If the Step exceeds that limit, the Workflow moves on to the next Step. This is useful if, for example, your builds hang for not immediately obvious reasons - you can set timeouts for the Step or Steps which are suspected to have caused the problem. + +1. Find the Step in the `bitrise.yml` file. + + You can edit the file locally, or on the **bitrise.yml** tab of the Workflow Editor. +1. Add a `timeout` property before the other Step inputs and specify its value in seconds: + + ``` + - xcode-test@1.18.14: + timeout: 120 + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: "$BITRISE_SCHEME" + ``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/skipping-steps.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/skipping-steps.mdx new file mode 100644 index 0000000..e0ba28e --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/skipping-steps.mdx @@ -0,0 +1,28 @@ +--- +title: "Skipping Steps" +description: "You can configure Steps in your Bitrise builds so that they don't run if the previous Step in the Workflow failed. This can help with avoiding wasting build time and credits." +sidebar_position: 5 +slug: /bitrise-ci/workflows-and-pipelines/steps/skipping-steps +sidebar_label: Configuring a Step to always run +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkflowEditorAndSelectingAWorkflow from '@site/src/partials/opening-the-workflow-editor-and-selecting-a-workflow.mdx'; + +You can configure a Step to run even if a previous Step in the Workflow failed. For example, if the **Cache:Pull** Step fails, there is no reason not to run the subsequent Steps. + +:::note[Enabling a Step conditionally] + +You can also configure Steps to run only in certain conditions: [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). + +::: + +To set a given Step to run even if a previous Step failed: + +1. +1. Select the Step you want to configure to always run. +1. On the right, find and open the **When to run** section and toggle the **Run if previous Step failed** option. + + ![run-if-previous-failed.png](/img/_paligo/uuid-26832e7b-a5be-8098-d683-cd04a9d2cc04.png) diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/step-bundles.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/step-bundles.mdx new file mode 100644 index 0000000..1299ff7 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/step-bundles.mdx @@ -0,0 +1,316 @@ +--- +title: "Step bundles" +description: "Step bundles allow you to reuse Steps and sequences of Steps in any Workflow in a convenient way, without having to manually copy and paste Steps from a YAML file." +sidebar_position: 8 +slug: /bitrise-ci/workflows-and-pipelines/steps/step-bundles +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_NestedStepBundles from '@site/src/partials/nested-step-bundles.mdx'; + +Step bundles allow you to group multiple Steps into a single unit. With Step bundles, you can reuse Steps and sequences of Steps without manually copying and pasting from a YAML configuration file. + +Step bundles are configured with a root level entity called `step_bundles`. You can insert Step bundles into any Workflow. Unlike utility Workflows and [Workflow chaining](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together), Step Bundles can be placed anywhere in a Workflow. + +When running a build, each Step within the bundle will run at the position the bundle is inserted. + +## Creating a Step bundle + + + + +1. Open the Workflow Editor. +1. On the left, select **Step bundles**. +1. Click **Create Step bundle** if you don't have any bundles. + + If you already have at least one Step bundle, open the dropdown menu in the middle and click **Create Step bundle**. + + ![create-step-bundle.png](/img/_paligo/uuid-955d7e00-c03b-fa26-f239-dcf2f2b2708a.png) +1. In the dialog, provide a name for your bundle. + + ![create-bundle-dialog.png](/img/_paligo/uuid-35da65f6-1384-de64-328a-42f8232d2574.png) +1. If you have existing Step bundles, you can select one from the dropdown menu: your new Step bundle will be a copy of the existing one. +1. When done, click **Create Step bundle**. +1. Add your first Step by clicking **Add Step or Step bundle**. + + Adding a Step bundle within another Step bundle is called nesting: [Nested Step bundles](/en/bitrise-ci/workflows-and-pipelines/steps/step-bundles/nested-step-bundles). +1. Add additional Steps or bundles by hovering above or under an already added Step or bundle and clicking on the plus sign. +1. Configure new bundle inputs under the **Configuration** tab by clicking **+ Add input**. In the **New bundle input**dialog you can define input variables to manage multiple Steps within a bundle. Reference their keys in Steps and assign custom values for each Workflow. + + ![bundleinput.png](/img/_paligo/uuid-b51f2636-2f9d-89c2-595e-db6ab80d5416.png) + + + + +1. [Open the configuration YAML of your project](/en/bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file). +1. Add a `step_bundles` entity to the top level of the YAML file and give it a name. You will refer to the bundle by this name. + + ``` + format_version: 11 + step_bundles: + install_deps: + ``` +1. Add a `steps` property under your bundle and add the Steps you want to run. You can [reference Steps](/en/bitrise-ci/references/steps-reference/step-reference-id-format.html) here the same way as in a Workflow. + + In this example, we add the *restore-cache* Step and an `npm` Step. + + ``` + format_version: 11 + step_bundles: + install_deps: + steps: + - restore-cache@1: {} + - npm@1: {} + ``` +1. Add your Step bundle to an existing Workflow. The syntax works like this: `bundle::`. + + ``` + workflows: + ci: + steps: + - git-clone@8.1: {} + - bundle::install_deps: {} + - deploy-to-bitrise-io@2: {} + ``` + + + + +## Creating a Step bundle based on a utility Workflow + +You can create a Step bundle based on a [utility Workflow](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/utility-workflows). The bundle will contain all the Steps that were part of the utility Workflow. But unlike a utility Workflow, you can place the Step bundle anywhere within another Workflow. + +1. Open the Workflow Editor. +1. On the left, select **Step bundles**. +1. From the **Based on** dropdown menu, choose a utility Workflow. + + ![Screenshot_2025-03-25_at_09_59_54.png](/img/_paligo/uuid-8b6d8a17-8028-3064-a48d-9a43b0328391.png) +1. Click **Create Step bundle**. + +## Naming Step bundle instances + +You can add optional metadata fields to Step bundle instances to make your Workflow configs and build logs easier to read in Workflows. + +:::note[Step bundle instance] + +Step bundles are reusable config blocks - you define them once and can use them (instantiate them) across Workflows or in the same Workflow. + +::: + +You can set three optional metadata fields: **title**, **summary** and **description** in your Step bundle. These attributes override the generic information from the bundle's definition for that specific instance only, giving you granular control over how it's displayed in a particular Workflow. If you use these attributes, you don't need to add comments to Step bundles to distinguish two instances from each other. + +A Step bundle instance can include: + +- **title**: a human-readable name for this specific usage. +- **summary**: a brief description. +- **description**: detailed information about what this instance does. + +![stepbundleinstance.png](/img/_paligo/uuid-9cf7ca34-d643-d13c-d241-42cefd6dc847.png) + +These fields show up in the Bitrise UI and build logs, making it immediately clear what each instance is doing. + +``` +- step-bundle-id: + title: "A clear, human-readable title for this instance" + summary: "A short summary of what this instance does." + description: "A more detailed markdown-supported description if needed." + inputs: + - ... +``` + +**Additional attributes for Step bundle instances** + +Let's say you have a Step bundle defined with the ID `run-my-tests` that builds and tests a specific scheme. You want to use it twice in your primary Workflow: once for unit tests on an iPhone simulator, and again for UI tests on an iPad simulator. + +``` +workflows: + primary: + steps: + - run-my-tests: + title: "Run unit tests on iPhone" + summary: Runs the UnitTests test plan. + inputs: + - scheme: "MyApp" + - destination: "platform=iOS Simulator,name=iPhone 14" + - test_plan: "UnitTests" + - run-my-tests: + title: "Run UI tests on iPad" + summary: Runs the UITests test plan. + inputs: + - scheme: "MyApp" + - destination: "platform=iOS Simulator,name=iPad Pro (12.9-inch)" + - test_plan: "UITests" +``` + +The build log and Workflow editor now displays `"Run unit tests on iPhone"` and `"Run UI tests on iPad"` as the Step titles. If the UI tests fail, you'll know immediately without having to inspect the logs. + + + +## Step bundle inputs + +In any Step bundle, a list of inputs can be defined under the `inputs` key. These are the only inputs you can set for a Step bundle: you can't define additional inputs outside the bundle definition. + +You can, however, set values for the predefined inputs of a Step bundle outside the bundle definition: [see topic](#section-idm234472988354083). + +Step bundle inputs share the same model as Step inputs. You can read more about Step inputs and their format: [Step inputs reference](/en/bitrise-ci/references/steps-reference/step-inputs-reference). + +1. In your configuration YAML file, add the `inputs` property to your Step bundle. + + ``` + format_version: 11 + step_bundles: + install_deps: + inputs: + ``` +1. Under `inputs`, add key-value pairs that will be used for Step inputs. + + ``` + format_version: 11 + step_bundles: + install_deps: + inputs: + - cache_key: "npm-cache-{{ checksum "package-lock.json" }}" + - npm_command: install + ``` +1. Add the keys to the appropriate Step inputs. + + In our example, we configured default inputs for the `key` input of the `restore-cache` Step and the `command` input of the `npm` Step. + + ``` + format_version: 11 + step_bundles: + install_deps: + inputs: + - cache_key: "npm-cache-{{ checksum "package-lock.json" }}" + - npm_command: install + steps: + - restore-cache@1: + inputs: + - key: $cache_key + - npm@1: {} + inputs: + - command: $npm_command + ``` + +## Configuring Step bundle inputs + +You define Step bundle inputs in the Step bundle definition and you can't add new inputs outside the definition. + +You can set new values for Step bundle inputs defined in the Step bundle in the Step list of the Workflow: + +1. In your configuration YAML file, find your Workflow and the Step bundle in its `steps` list. +1. Add an `inputs` property where your Step bundle is referenced, and add a key-value pair to it. + + In this example, we set a new value of the `cache_key` input instead of its default value defined in the Step bundle. When the Workflow runs, the `restore-cache` Step will use the `npm-cache` value instead of `npm-cache-{{ checksum "package-lock.json" }}`. + + ``` + format_version: 11 + step_bundles: + install_deps: + inputs: + - cache_key: "npm-cache-{{ checksum "package-lock.json" }}" + - npm_command: install + steps: + - restore-cache@1: + inputs: + - key: $cache_key + - npm@1: + inputs: + - command: $npm_command + workflows: + ci: + steps: + - git-clone@8: {} + - bundle::install_deps: + inputs: + - cache_key: "npm-cache" + - deploy-to-bitrise-io@2: {} + ``` + +## Step bundle outputs + +Steps can generate output variables. When Steps are included in a Step bundle, their output variables are available to all Steps in the Workflow after the Step bundle. + +For example, if the Step bundle used in the Workflow uses the `xcode-archive` Step, the next Steps after the bundle will have access to the BITRISE_IPA_PATH output variable which is exposed by the Step. + +## Step Bundle conditional execution with run_if + +Using `run_if` condition with Step bundles allows you to conditionally execute entire bundles based on Environment Variables or other criteria. When you apply `run_if` directly to Step bundle calls in your workflow, the condition is evaluated before the bundle executes. If it evaluates to false, the entire bundle and all its Steps are skipped. + +The `run_if` syntax works the same as it does for individual Steps. All the `run_if` [template expressions and custom template functions](https://docs.bitrise.io/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally.html#examples-of-run_if-expressions), for example, `getenv`, `enveq`, and `envcontain` are supported for Steps. + +**Skip deployment bundles for draft PRs** + +In this example, the `deploy-to-staging` bundle would run only if the PR is not a draft PR. Similarly, the `notify-slack` bundle would run only if it is a successful build. + +``` +workflows: + deploy: + steps: + - bundle::build-and-test: {} + - bundle::deploy-to-staging: + run_if: '{{ not (envcontain "BITRISE_GIT_MESSAGE" "[draft]") }}' + - bundle::notify-slack: + run_if: '{{ not .IsBuildFailed }}' +``` + +1. Open your project's Workflow Editor. +1. Click **Step Bundles** on the left. +1. Select the **Configuration** tab and enter a value under **Additional run conditions**. + + ![2025_08_15_step_bundle_conditional_execution_runif.png](/img/_paligo/uuid-d84d9f1d-68d7-2706-a7cb-b2023ffe96a5.png) + +You can specify a `run_if` in the definition or in the Step bundle instance as well: + +- When the `run_if` is in the definition, then it serves as the default run_if for all instances. +- When the `run_if` is in the instance, it overrides the definition, and that single instance will have the `run_if`. + + If a Step bundle is usually executed conditionally, it is better to define `run_if` on the definition, so that all instances will get the sensible default `run_if` . Like a repo clone and setup bundle that usually only make sense in a CI environment (that's why the git-clone Step itself has a `run_if: .IsCI`). + +Learn more about how to [enable/disable and set conditions for a Step](https://docs.bitrise.io/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally.html#examples-of-run_if-expressions) with `run_if` expressions. + +### Migration + +If you currently have identical `run_if` conditions on multiple Steps within a bundle, here is how you can streamline your workflow with `run_if` on Step bundles. + +Before: + +``` +workflows: + test: + steps: + - bundle::my-test-suite: {} +step_bundles: + my-test-suite: + steps: + - script: + run_if: '{{ enveq "RUN_TESTS" "true" }}' + # ... + - gradle-runner: + run_if: '{{ enveq "RUN_TESTS" "true" }}' + # ... + - deploy-to-bitrise-io: + run_if: '{{ enveq "RUN_TESTS" "true" }}' + # ... +``` + +After: + +``` +workflows: + test: + steps: + - bundle::my-test-suite: + run_if: '{{ enveq "RUN_TESTS" "true" }}' +step_bundles: + my-test-suite: + steps: + - script: + # ... + - gradle-runner: + # ... + - deploy-to-bitrise-io: + # ... +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/step-inputs.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/step-inputs.mdx new file mode 100644 index 0000000..41ef1cb --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/step-inputs.mdx @@ -0,0 +1,23 @@ +--- +title: "Step inputs" +description: "Step inputs are the way to configure the Steps for your build. Steps have required inputs that must have a valid value and optional inputs that provide more options to customize your build." +sidebar_position: 4 +slug: /bitrise-ci/workflows-and-pipelines/steps/step-inputs +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Step inputs are the way to configure the Steps for your build. Steps have required inputs that must have a valid value and optional inputs that provide more options to customize your build. + +Click on a Step to bring up its input variables on the right of the currently selected Workflow. Required inputs are marked as such in the Workflow Editor. If required inputs do not have valid values, the Step will fail. + +![Adding_step_input.png](/img/_paligo/uuid-c09d6420-4a98-85f8-8bdc-c96e59c07779.png) + +Modify a Step input by either: + +- Clicking into the input field. +- Clicking the **CHANGE** option next to the input field. + +You can also use [Environment Variables (Env Vars) as Step inputs.](/en/bitrise-ci/configure-builds/environment-variables/using-an-env-var-as-a-step-input) diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/step-versions.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/step-versions.mdx new file mode 100644 index 0000000..0c62b67 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/step-versions.mdx @@ -0,0 +1,26 @@ +--- +title: "Step versions" +description: "Bitrise Step versions follow semantic versioning: a version number looks like MAJOR.MINOR.PATCH. For example, version 3.2.1 is the first patch of the second minor version of the third major version." +sidebar_position: 3 +slug: /bitrise-ci/workflows-and-pipelines/steps/step-versions +sidebar_label: Step versioning +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_LockingAStepToAMajorOrMinorVersion from '@site/src/partials/locking-a-step-to-a-major-or-minor-version.mdx'; +import Partial_UsingASpecificStepVersion from '@site/src/partials/using-a-specific-step-version.mdx'; +import Partial_UsingTheLatestAvailableVersionOfTheStep from '@site/src/partials/using-the-latest-available-version-of-the-step.mdx'; + +Bitrise Step versions follow semantic versioning: a version number looks like MAJOR.MINOR.PATCH. For example, version 3.2.1 is the first patch of the second minor version of the third major version. + +You can use any existing version of a Step in your Workflows, and different versions of the same Step in different Workflows. + +We regularly update our Steps to make sure they are fully equipped for our users’ needs. However, you don’t have to use the latest version if you don’t want to: if an old version is stable and compatible with your build, feel free to continue using that, or roll back to it any time. + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/steps/steps-overview.mdx b/docs/bitrise-ci/workflows-and-pipelines/steps/steps-overview.mdx new file mode 100644 index 0000000..c11c3ed --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/steps/steps-overview.mdx @@ -0,0 +1,29 @@ +--- +title: "Steps overview" +description: "A Step is a block of script execution that encapsulates a build task on Bitrise: the code to perform that task, the inputs and parameters you can define for the task, and the outputs the task generates." +sidebar_position: 1 +slug: /bitrise-ci/workflows-and-pipelines/steps/steps-overview +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TypesOfSteps from '@site/src/partials/types-of-steps.mdx'; + +Steps are the heart of Bitrise. A Step is a build task: for example, the **Git Clone** Step clones your Git repository at the start of a build while the [**Google Play Deploy**](https://github.com/bitrise-io/steps-google-play-deploy) Step can deploy your finished app to the Play Store. + +A Step contains the code that performs the build task. You can configure the inputs and parameters that define the task, and view and reuse the outputs a Step generates. Reusing the output means that another Step can use it as the value of one of its inputs. + +Our Steps are defined in YAML format, and written in either bash or Go. + +You can find a list of our Steps in: + +- [The Integrations page](https://www.bitrise.io/integrations). +- [The Bitrise StepLib](https://github.com/bitrise-io/bitrise-steplib). +- The Workflow Editor. + +You can also create and run any custom script you want as part of your Bitrise build using the [**Script**](https://github.com/bitrise-io/steps-script) Step. All you need to do is specify the script runner (the default is bash), add the script, and run a build. For more information on how to set up these custom scripts, check out [Bitrise Script Step - Running (Bash, Python, NodeJS, Ruby, Swift, Kotlin)](https://support.bitrise.io/hc/en-us/articles/8932506599955-Bitrise-Script-Step-Running-Bash-Python-NodeJS-Ruby-Swift-Kotlin-). + +For the purposes of your builds, Steps can be managed directly from the Workflow Editor. You can rearrange them, set their versions, add or remove Steps at any time. + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/workflows/_category_.json new file mode 100644 index 0000000..86b0f4a --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Workflows", + "position": 1, + "link": null +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another.mdx b/docs/bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another.mdx new file mode 100644 index 0000000..04184dd --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another.mdx @@ -0,0 +1,29 @@ +--- +title: "Copying Workflows from one app to another" +description: "You can copy an existing Bitrise Workflow from any `bitrise.yml` file, including your local files." +sidebar_position: 5 +slug: /bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another +sidebar_label: Copying Workflows from one project to another +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkflowEditor from '@site/src/partials/opening-the-workflow-editor.mdx'; + +If you have a lot of projects, you might not want to spend time with setting up Workflows for each and every one of them separately, especially if there’s little difference between the Workflows you want to run for them. If so, the easiest thing to do is to simply copy an existing Workflow. + +:::important[YAML mode only] + +Copying a Workflow to another project is only possible in YAML mode. [You can create a new Workflow based on an existing one](/en/bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.html) but only for the same app. + +::: + +You can copy a Workflow from any [configuration YAML file](/en/bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview), including your local files. To copy an existing Workflow from one Bitrise project to another on our website: + +1. +1. On the left, select **Configuration YAML** from the navigation menu. +1. Select the Workflow you want and copy it. +1. Open the project you want to copy it to. +1. Go to **Workflows** and then select **Configuration YAML** from the navigation menu. +1. Paste the Workflow under the `workflows` property. diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.mdx b/docs/bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.mdx new file mode 100644 index 0000000..b9eff6b --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.mdx @@ -0,0 +1,38 @@ +--- +title: "Creating a Workflow" +description: "You can create new Bitrise Workflows based on any of the existing ones, or you can simply create an empty Workflow and add the Steps yourself." +sidebar_position: 3 +slug: /bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkflowEditor from '@site/src/partials/opening-the-workflow-editor.mdx'; + +:::note[Workflows in YAML] + +This guide is about creating a Workflow in the Workflow Editor. For YAML configuration syntax, check out [Workflow level properties](/en/bitrise-ci/references/configuration-yaml-reference/workflow-level-properties). + +::: + +It’s very simple to create your own Workflow with the Workflow Editor. You can create new Workflows based on any of the existing ones, or you can simply create an empty Workflow and add the Steps yourself. + +If, for example, you create a Workflow based on your **primary** one, it means that it will be created with the exact same Steps and input values as the **primary** Workflow. + +1. +1. Click the **+** sign on the top. + + ![create-workflow.png](/img/_paligo/uuid-67fb8500-b869-116e-8e97-2b1427eec451.png) +1. In the dialog, give your Workflow a name. + + The name can be as long as you wish since longer titles get broken into multiple lines so that you can read the whole title conveniently. + + ![create-workflow-dialog.png](/img/_paligo/uuid-ca83e0fe-3980-65b0-809c-86ab6bd95b36.png) +1. From the dropdown menu labeled **Based on**, select the Workflow you want to use as the basis for the new one. + + Alternatively, choose the **An empty workflow** option to create an empty Workflow. +1. Add the Steps you need to your Workflow. + + Click the **+** symbol between two Steps to insert a Step at that position. Remove Steps you do not need by clicking on the Step and clicking the little trash bin symbol. +1. Click **Save changes** in the top right corner. diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/default-workflows.mdx b/docs/bitrise-ci/workflows-and-pipelines/workflows/default-workflows.mdx new file mode 100644 index 0000000..93904ee --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/default-workflows.mdx @@ -0,0 +1,41 @@ +--- +title: "Default Workflows" +description: "When you add a new project on [bitrise.io](https://www.bitrise.io), one or two Workflows are created automatically, depending on your project." +sidebar_position: 2 +slug: /bitrise-ci/workflows-and-pipelines/workflows/default-workflows +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DefaultWorkflowsForAnAndroidProject from '@site/src/partials/default-workflows-for-an-android-project.mdx'; +import Partial_DefaultWorkflowsForARubyProject from '@site/src/partials/default-workflows-for-a-ruby-project.mdx'; +import Partial_DefaultWorkflowsForAJavaProject from '@site/src/partials/default-workflows-for-a-java-project.mdx'; +import Partial_DefaultWorkflowsForANodeJsProject from '@site/src/partials/default-workflows-for-a-nodejs-project.mdx'; +import Partial_DefaultWorkflowsForMultiplatformProjects from '@site/src/partials/default-workflows-for-multiplatform-projects.mdx'; +import Partial_DefaultWorkflowsForAnIOSProject from '@site/src/partials/default-workflows-for-an-ios-project.mdx'; +import Partial_DefaultWorkflowsForKotlin from '@site/src/partials/default-workflows-for-kotlin.mdx'; + +When you add a new project on [bitrise.io](https://www.bitrise.io), we create initial Pipelines and Workflows for you. These are called default Pipelines and Workflows. A default Pipeline consists of default Workflows. + +You can use these to run your tests or create installable binaries such as IPAs or APKs. Feel free to modify the default Pipelines and Workflows to suit your needs. + +:::tip[Default Pipelines] + +We also create default Pipelines: [Default Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines). + +::: + + + + + + + + + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/_category_.json new file mode 100644 index 0000000..a87348f --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Generic Workflow recipes", + "position": 9, + "description": "Workflow recipes that aren't specific to any platform type (such as iOS, Android, Flutter, and so on) but provide help with the CI/CD process and using Bitrise in general.", + "link": { + "type": "doc", + "id": "bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/index" + } +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/cloning-a-git-repository.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/cloning-a-git-repository.md new file mode 100644 index 0000000..342228b --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/cloning-a-git-repository.md @@ -0,0 +1,23 @@ +--- +title: "Cloning a Git repository" +sidebar_position: 2 +--- + +## Description + +Clone a Git repository. + +## Instructions + +1. Add the **[Activate SSH key (RSA private key)](https://github.com/bitrise-steplib/steps-activate-ssh-key)** Step. This allows the Git client on the build VM to access private repositories. +1. Add the **[Git Clone Repository](https://github.com/bitrise-steplib/steps-git-clone)** Step. + +Check out other options in the Step documentation or in the Workflow Editor. + +## bitrise.yml + +``` +- activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' +- git-clone@6: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/example-workflow-create-gitflow-release-branch.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/example-workflow-create-gitflow-release-branch.md new file mode 100644 index 0000000..9d7ecdd --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/example-workflow-create-gitflow-release-branch.md @@ -0,0 +1,34 @@ +--- +title: "Example Workflow: Create Gitflow release branch" +sidebar_position: 3 +--- + +## Description + +An example Workflow that creates a Gitflow release branch for a specific version. The version can be passed on as an [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) for the Workflow. + +## Prerequisites + +Make sure that Bitrise has **write** access to your repository by [manually adding an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) with **write** permission on GitHub. + +## bitrise.yml + +``` +# Run the workflow with $VERSION env set up to, for examaple, '2.4.3' +create-release-branch: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - script@1: + inputs: + - content: |- + #!/usr/bin/env bash + # fail if any commands fails + set -e + # debug log + set -x + + git checkout -b release-$VERSION + git push origin release-$VERSION +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/github-pull-request-send-the-build-qr-code.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/github-pull-request-send-the-build-qr-code.md new file mode 100644 index 0000000..b775cb3 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/github-pull-request-send-the-build-qr-code.md @@ -0,0 +1,42 @@ +--- +title: "GitHub pull request: send the build QR code" +sidebar_position: 7 +--- + +## Description + +Send a comment to the GitHub pull request with a QR code to the build uploaded to bitrise.io. + +## Prerequisites + +- You have your iOS or Android app archived. +- You have a GitHub personal access token with the `repo` scope and you've added it as a [Secret](/en/bitrise-ci/configure-builds/secrets.html) ($GITHUB_ACCESS_TOKEN) to your Bitrise app. + +## Instructions + +1. Add the **[Deploy to Bitrise.io - Apps, Logs, Artifacts](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step. +1. Add the **[Create install page QR code](https://www.bitrise.io/integrations/steps/create-install-page-qr-code)** Step. +1. Add the **Comment on GitHub Pull Request** Step and set the following input variables: + + - **GitHub personal access token**: Set it to the previously created Secret, $GITHUB_ACCESS_TOKEN. + - **Body**: Add the following: + + ``` + ![QR code]($BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL) + + $BITRISE_PUBLIC_INSTALL_PAGE_URL + ``` + +## bitrise.yml + +``` +- deploy-to-bitrise-io@2: {} +- create-install-page-qr-code@1: {} +- comment-on-github-pull-request@0: + inputs: + - body: |- + ![QR code]($BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL) + + $BITRISE_PUBLIC_INSTALL_PAGE_URL + - personal_access_token: "$GITHUB_ACCESS_TOKEN" +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/index.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/index.md new file mode 100644 index 0000000..8219c9a --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/index.md @@ -0,0 +1,10 @@ +--- +title: "Generic Workflow recipes" +description: "Workflow recipes that aren't specific to any platform type (such as iOS, Android, Flutter, and so on) but provide help with the CI/CD process and using Bitrise in general." +sidebar_position: 9 +slug: /bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes +--- + +Workflow Recipes provide ready-made solutions for common Workflow tasks: a range of different Recipes along with examples of entire Workflows. + +Here you can find Workflow recipes that aren't specific to any platform type (such as iOS, Android, Flutter, and so on) but provide help with the CI/CD process and using Bitrise in general. diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-build-status-to-slack.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-build-status-to-slack.md new file mode 100644 index 0000000..e519ca4 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-build-status-to-slack.md @@ -0,0 +1,30 @@ +--- +title: "(iOS/Android) Send build status to Slack" +sidebar_position: 1 +--- + +## Description + +Send a message to Slack with the build status after a build has finished. + +## Prerequisites + +You have set up a Slack webhook and added it to [Env Vars](/en/bitrise-ci/configure-builds/environment-variables.html) (for example, $SLACK_WEBHOOK). See [Configuring Slack integration](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration) for details. + +## Instructions + +Add the **[Send a Slack message](https://www.bitrise.io/integrations/steps/slack)** Step. Set the input variables: + +- **Slack Webhook URL**: for example, $SLACK_WEBHOOK. +- **Target Slack channel, group or username**: for example, `#build-notifications`. + +Check out other options in the Step documentation or in the Workflow Editor. + +## bitrise.yml + +``` +- slack@3: + inputs: + - channel: "#build-notifications" + - webhook_url: $SLACK_WEBHOOK +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-qr-code-to-slack.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-qr-code-to-slack.md new file mode 100644 index 0000000..88f00f0 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-qr-code-to-slack.md @@ -0,0 +1,35 @@ +--- +title: "(iOS/Android) Send QR code to Slack" +sidebar_position: 4 +--- + +## Description + +Send a QR code of the iOS or Android build uploaded to bitrise.io to Slack. + +## Prerequisites + +- You have your iOS or Android app archived. +- You have set up a Slack webhook and added it to [Env Vars](/en/bitrise-ci/configure-builds/environment-variables.html) (for example, $SLACK_WEBHOOK). See [Configuring Slack integration](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration) for details. + +## Instructions + +1. Add the [**Deploy to Bitrise.io - Apps, Logs, Artifacts**](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io) Step. +1. Add the [**Create install page QR code**](https://www.bitrise.io/integrations/steps/create-install-page-qr-code) Step. +1. Add the [**Send a Slack message**](https://www.bitrise.io/integrations/steps/slack) Step. Set the input variables: + + - **Slack Webhook URL**: for example, $SLACK_WEBHOOK. + - **Target Slack channel, group or username**: for example, `#build-notifications`. + - **A URL to an image file that will be displayed as a thumbnail**: $BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL. + +## bitrise.yml + +``` +- deploy-to-bitrise-io@2: {} +- create-install-page-qr-code@1: {} +- slack@3: + inputs: + - channel: "#build-notifications" + - thumb_url: $BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL + - webhook_url: $SLACK_WEBHOOK +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/make-caching-efficient-for-pull-request-builds.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/make-caching-efficient-for-pull-request-builds.md new file mode 100644 index 0000000..108acb1 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/make-caching-efficient-for-pull-request-builds.md @@ -0,0 +1,39 @@ +--- +title: "Make caching efficient for pull request builds" +sidebar_position: 6 +--- + +## Description + +Bitrise caching is branch-based. You can optimize cache efficiency by keeping the cache up-to-date on a given branch. + +If a branch doesn't have a cache entry yet, the repository's default branch is used as a fallback to pull a cache entry. If a pull request targets the main branch, this fallback mechanism is used to pull the default branch's cache (as the pull request branch doesn't have any cache entry yet). This means that caching can still be efficient if the pull request destination is the default branch and the cache is up-to-date on the default branch. + +## Instructions + +1. Make sure that any Workflow that runs frequently on the default branch contains the **[Bitrise.io Cache:Push](https://www.bitrise.io/integrations/steps/cache-push)** Step. This will keep the cache up to date with content from successful builds. We recommend one of two approaches: + + - Run the Workflow after every commit (for example, a merge) to the default branch, triggered by the push event on the default branch. + - Run the Workflow as a scheduled nightly build every day. This warms up the cache by pushing content based on the latest state of the default branch. +1. (Optional) Set the **Compress cache** input variable to `true`. This can be useful if your cache folders are large and you are experiencing slow build times. +1. Make sure that the Workflow which runs the pull requests contains the [**Bitrise.io Cache:Pull**](https://www.bitrise.io/integrations/steps/cache-pull) Step. + + This pulls the cache from successful builds on the default branch. We don't recommend pushing content into the cache for pull request builds for security and efficiency reasons. Even if the Workflow contains the **[Bitrise.io Cache:Push](https://www.bitrise.io/integrations/steps/cache-push)** Step, it's skipped by default for pull request builds. + +## bitrise.yml + +Workflow running on the default branch: + +``` +# Add steps that produce the cached content (e.g. dependecies, builds) + +- cache-push@2: {} +``` + +Pull request Workflow: + +``` +- cache-pull@2: {} + +# Add steps that can utilise the restored cache content +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/start-parallel-builds-from-the-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/start-parallel-builds-from-the-workflow.md new file mode 100644 index 0000000..1389cda --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/start-parallel-builds-from-the-workflow.md @@ -0,0 +1,47 @@ +--- +title: "Start (parallel) builds from the Workflow" +sidebar_position: 5 +--- + +## Description + +Start one or more builds in parallel with specified Workflows from a parent Workflow. You can add a Step to wait for their completion. + +:::tip[Start builds for different apps] + +Using this method, you can only start builds for the same app. If you would like to start another build for a different app, you can use the **[Trigger Bitrise workflow](https://www.bitrise.io/integrations/steps/trigger-bitrise-workflow)** Step. + +::: + +## Prerequisites + +- Make sure you have a valid Bitrise API key in your [Secrets](/en/bitrise-ci/configure-builds/secrets.html) ($BITRISE_API_KEY). See [Personal access tokens](/en/bitrise-platform/accounts/personal-access-tokens) for more details. +- A Workflow or multiple Workflows you would like to run in parallel (for example, `workflow-1` and `workflow-2`). + +## Instructions + +1. Add a **[Bitrise Start Build](https://www.bitrise.io/integrations/steps/build-router-start)** Step. Set the following input variables: + + - **Workflows**: The Workflow(s) to start. Insert only one Workflow per line. + - **Bitrise Access Token**: $BITRISE_API_KEY +1. (Optional) Add any Step you would like to run in parallel while the triggered Workflows are running in the parent Workflow. +1. (Optional) Add a **[Bitrise Wait for Build](https://www.bitrise.io/integrations/steps/build-router-wait)** Step. Set the **Bitrise Access Token** input variable: $BITRISE_API_KEY + +## bitrise.yml + +``` +parent-workflow: + steps: + - build-router-start@0: + inputs: + - workflows: |- + workflow-1 + workflow-2 + - access_token: "$BITRISE_API_KEY" + - script@1: + inputs: + - content: echo "Doing something else..." + - build-router-wait@0: + inputs: + - access_token: "$BITRISE_API_KEY" +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/index.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/index.md new file mode 100644 index 0000000..818e8e0 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/index.md @@ -0,0 +1,7 @@ +--- +title: "Workflows" +sidebar_position: 1 +slug: /bitrise-ci/workflows-and-pipelines/workflows +--- + +Workflows diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows.mdx b/docs/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows.mdx new file mode 100644 index 0000000..f9738da --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows.mdx @@ -0,0 +1,30 @@ +--- +title: "Managing Workflows" +description: "You can chain multiple Workflows and rearrange the order of Workflows in a chain in the Bitrise Workflow Editor. Take advantage of utility Workflows to reuse components in multiple different contexts." +sidebar_position: 4 +slug: /bitrise-ci/workflows-and-pipelines/workflows/managing-workflows +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UtilityWorkflows from '@site/src/partials/utility-workflows.mdx'; +import Partial_ChainingWorkflowsTogether from '@site/src/partials/chaining-workflows-together.mdx'; +import Partial_RearrangingChainedWorkflows from '@site/src/partials/rearranging-chained-workflows.mdx'; +import Partial_WorkflowPriority from '@site/src/partials/workflow-priority.mdx'; + +You can chain multiple Workflows and rearrange the order of Workflows in a chain in the Bitrise Workflow Editor. Take advantage of utility Workflows to reuse components in multiple different contexts. + +:::tip[Offline Workflow Editor] + +Everything described here is also available in the [offline Workflow Editor](/en/bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.html). + +::: + + + + + + + + diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/_category_.json new file mode 100644 index 0000000..3fc1727 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Workflow recipes for Android apps", + "position": 6, + "description": "Workflow recipes specifically for iOS apps. Some of these can be used for the iOS versions of cross-platform apps, while others are specifically meant for native iOS apps.", + "link": { + "type": "doc", + "id": "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/index" + } +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-bitriseio.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-bitriseio.md new file mode 100644 index 0000000..7f5e0ab --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-bitriseio.md @@ -0,0 +1,32 @@ +--- +title: "(Android) Deploy to Bitrise.io" +sidebar_position: 4 +--- + +## Instructions + +:::important[Deploying a release build] + +If you want to deploy a release build, don't forget to set up code signing on Bitrise to build and sign the APK with your release key. + +::: + +1. Add the **Android Build** Step and set the following inputs: + + - **Build type**: Set this to **apk**. + - **Variant**: Use `release`, `debug`, or one of your custom variants if you have any. +1. If you build a release variant, add the **Android Sign** Step. + + You can skip this if you plan to deploy an unsigned debug variant. +1. Add a **Deploy to Bitrise.io - Apps, Logs, Artifacts** Step. + +## bitrise.yml + +``` +- android-build@1: + inputs: + - variant: release + - build_type: apk +- sign-apk@1: {} +- deploy-to-bitrise-io@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-firebase-app-distribution.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-firebase-app-distribution.md new file mode 100644 index 0000000..42ade30 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-firebase-app-distribution.md @@ -0,0 +1,49 @@ +--- +title: "(Android) Deploy to Firebase App Distribution" +sidebar_position: 2 +--- + +## Description + +Build and distribute your app to testers via Firebase App Distribution. This example builds and deploys an APK, but the Workflow can be tweaked to distribute AAB instead. + +## Prerequisites + +- An existing Firebase project where your exact package name is registered. See [the Firebase documentation](https://firebase.google.com/docs/app-distribution/android/distribute-console?apptype=apk) for details. +- Obtain a token from Firebase by running `firebase login:ci` locally. See [the Firebase CLI docs](https://firebase.google.com/docs/cli#sign-in-test-cli) for details. +- Add this token as a [Secret](/en/bitrise-ci/configure-builds/secrets.html) to your Bitrise app with the name FIREBASE_TOKEN. +- Get your Firebase App ID from your project's **General Settings** page and pass this value as an input to the **Firebase App Distribution** Step. +- If you want to deploy a release build, don't forget [to set up code signing on Bitrise](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html) to build and sign the APK with your release key. + +## Instructions + +1. Add the **Android Build** Step and set the following inputs: + + - **Build type**: Set this to **apk**. + - **Variant**: Use `release`, `debug`, or one of your custom variants if you have any. +1. If you build a release variant, add the **Android Sign** Step. + + You can skip this if you plan to deploy an unsigned debug variant. +1. Add the [Firebase App Distribution](https://github.com/guness/bitrise-step-firebase-app-distribution) Step and set the following inputs: + + - **Firebase token**: use the secret Env var previously defined: $FIREBASE_TOKEN. + - **App path**: this should point to the APK that the previous steps have built and signed. By default, it's located at `$BITRISE_DEPLOY_DIR/app-release-bitrise-signed.apk`, but the exact file name might be different based on your project config. + - **Firebase App ID**: get your Firebase App ID from your project's **General Settings** page and pass this value as an input to the **Firebase App Distribution** Step. + - **Optional**: you can define test groups or individual testers in the Step inputs + +## bitrise.yml + +``` +- android-build@1: + inputs: + - variant: release + - build_type: apk +- sign-apk@1: {} +- firebase-app-distribution@0: + inputs: + - firebase_token: $FIREBASE_TOKEN + - app_path: $BITRISE_DEPLOY_DIR/app-release-bitrise-signed.apk + - app: your_app_id_from_firebase + - testers: email@company.com # optional + - groups: qa-team #optional +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-google-play-internal-alpha-beta-production.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-google-play-internal-alpha-beta-production.md new file mode 100644 index 0000000..43a36a0 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-google-play-internal-alpha-beta-production.md @@ -0,0 +1,69 @@ +--- +title: "(Android) Deploy to Google Play (Internal, Alpha, Beta, Production)" +sidebar_position: 3 +--- + +## Description + +Build an Android app and upload to Google Play to internal, alpha, beta or production track. + +## Prerequisites + +- An [Android keystore file is uploaded](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html) to Bitrise. +- [Google Play API Access](/en/bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play/setting-up-google-play-api-access) is set up. + +## Instructions + +1. (Optional) Add the [**Change Android versionCode and versionName**](https://www.bitrise.io/integrations/steps/change-android-versioncode-and-versionname) Step. Set the input variables: + + - **Path to the build.gradle file**: The default value is `$PROJECT_LOCATION/$MODULE/build.gradle` and in most cases you don't have to change it. + - **New versionName**: for example, `1.0.1` + - **New versionCode**: for example, `42`. +1. Add the **[Android Build](https://github.com/bitrise-steplib/bitrise-step-android-build)** Step and set the following inputs: + + - **Build type**: Set this to **aab**. + - **Variant**: Use `release`, `debug`, or one of your custom variants if you have any. + - **Module**: for example $MODULE. +1. Add the **[Android Sign](https://github.com/bitrise-steplib/steps-sign-apk)** Step. +1. Add the **[Google Play Deploy](https://github.com/bitrise-steplib/steps-google-play-deploy)** Step and set the following inputs: + + - **Service Account JSON key file path**: $BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL. + - **Package name**: for example, `com.your.package.name`. + - **Track**: Choose one of **internal**, **alpha**, **beta**, or **production**. + - **Status**: The status of a release. For more information, see the [Google API reference](https://developers.google.com/android-publisher/api-ref/rest/v3/edits.tracks#Status). Recommended `draft` for production and `completed` for internal test builds. + - Check the other options in the Workflow Editor or in the Step documentation. + + :::tip[Deploy to Google Play fails with Error 403] + + You might experience that Deploy to Google Play Step fails with error: + + ``` + "error: Failed to perform edit insert call, error: googleapi: Error 403: The caller does not have permission, forbidden" + ``` + + For possible solutions, check out our [Knowledge Base article](https://support.bitrise.io/hc/en-us/articles/360015780538-Deploy-to-Google-Play-fails-with-403-error). + + ::: + +## bitrise.yml + +``` +- change-android-versioncode-and-versionname@1: + inputs: + - new_version_name: 1.0.1 + - new_version_code: '42' + - build_gradle_path: "$PROJECT_LOCATION/$MODULE/build.gradle" +- android-build@1: + inputs: + - project_location: "$PROJECT_LOCATION" + - module: "$MODULE" + - build_type: aab + - variant: release +- sign-apk@1: {} +- google-play-deploy@3: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + - package_name: io.bitrise.sample.android + - status: completed + - track: internal +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-visual-studio-app-center.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-visual-studio-app-center.md new file mode 100644 index 0000000..5316a72 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-visual-studio-app-center.md @@ -0,0 +1,47 @@ +--- +title: "(Android) Deploy to Visual Studio App Center" +sidebar_position: 1 +--- + +## Description + +Build and distribute your app to testers via Visual Studio App Center. + +## Prerequisites + +1. An existing [Visual Studio App Center](https://docs.microsoft.com/en-us/appcenter/dashboard/) project where your app is registered. +1. Adding the API token as a [Secret](/en/bitrise-ci/configure-builds/secrets.html) to your Bitrise app with the name APPCENTER_API_TOKEN. +1. If you want to deploy a release build, don't forget to set up code signing on Bitrise to build and sign the APK with your release key. + +## Instructions + +1. Add the **[Android Build](https://www.bitrise.io/integrations/steps/android-build)** Step and set the following inputs: + + - **Build type**: set this to **apk**. + - **Variant**: use release, debug, or one of your custom variants if you have any. +1. If you build a release variant, add the [Android Sign Step](https://github.com/bitrise-steplib/steps-sign-apk). + + You can skip this if you plan to deploy an unsigned debug variant. +1. Add the **[AppCenter iOS Deploy](https://www.bitrise.io/integrations/steps/appcenter-deploy-ios)** Step and set the following inputs: + + - **API Token**: $APPCENTER_API_TOKEN + - **Owner name**: for example, `my-company`. + - **App name**: For example, `my-app`. Use the App Center CLI to get the app name since it might not be the same as the one you can see on the Visual Studio App Center website. + +Check out other options in the Step documentation or in the Workflow Editor. + +## bitrise.yml + +``` +- android-build@1: + inputs: + - variant: release + - build_type: apk + - sign-apk@1: {} + - appcenter-deploy-android@2: + inputs: + - owner_name: my-company + - app_name: my-app + - app_path: "$BITRISE_APK_PATH" + - api_token: "$APPCENTER_API_TOKEN" +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-ci-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-ci-workflow.md new file mode 100644 index 0000000..042ecda --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-ci-workflow.md @@ -0,0 +1,70 @@ +--- +title: "(Android) Example CI Workflow" +sidebar_position: 5 +--- + +## Description + +Example Workflow for commits on the main branch of an Android app. The Workflow contains: + +1. [Running unit tests](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-unit-tests). +1. [Running UI tests on a virtual device](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-instrumentation-tests-on-virtual-devices). +1. [Running Lint](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-lint). +1. [Building a test app](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-bitriseio). +1. [Sending a Slack notification with the build status](/en/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-build-status-to-slack). +1. Filling the cache for upcoming pull request builds. + +## bitrise.yml + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: android +workflows: + ci: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - cache-pull@2: {} + - android-unit-test@1: + inputs: + - project_location: $PROJECT_LOCATION + - variant: $VARIANT + - android-build-for-ui-testing@0: + inputs: + - variant: $VARIANT + - module: $MODULE + - virtual-device-testing-for-android@1: + inputs: + - test_type: instrumentation + - android-lint@0: + inputs: + - variant: "$VARIANT" + - android-build@1: + inputs: + - project_location: "$PROJECT_LOCATION" + - module: "$MODULE" + - variant: "$VARIANT" + - deploy-to-bitrise-io@2: {} + - slack@3: + inputs: + - channel: "#build-notifications" + - webhook_url: "$SLACK_WEBHOOK" + - cache-push@2: {} +app: + envs: + - opts: + is_expand: false + PROJECT_LOCATION: "." + - opts: + is_expand: false + MODULE: app + - VARIANT: debug + opts: + is_expand: false +trigger_map: +- push_branch: main + workflow: ci +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-nightly-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-nightly-workflow.md new file mode 100644 index 0000000..d517424 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-nightly-workflow.md @@ -0,0 +1,72 @@ +--- +title: "(Android) Example nightly Workflow" +sidebar_position: 6 +--- + +## Description + +Example Workflow for nightly builds of an Android app. The Workflow contains: + +1. [Setting the version code and version name](https://www.bitrise.io/integrations/steps/change-android-versioncode-and-versionname). + + By default the app will get the build number ($BITRISE_BUILD_NUMBER) as the version code. +1. [Building a release Android App Bundle and uploading to Google Play internal testing](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-google-play-internal-alpha-beta-production). +1. [Building a test app and uploading to bitrise.io](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-bitriseio). +1. [Sending the QR code of the test build to Slack](/en/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-qr-code-to-slack). + +## bitrise.yml + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: android +workflows: + nightly: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - cache-pull@2: {} + - change-android-versioncode-and-versionname@1: + inputs: + - new_version_name: 1.0.0 + - build_gradle_path: "$PROJECT_LOCATION/$MODULE/build.gradle" + - android-build@1: + inputs: + - project_location: "$PROJECT_LOCATION" + - module: "$MODULE" + - build_type: aab + - variant: release + - sign-apk@1: {} + - google-play-deploy@3: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + - package_name: io.bitrise.sample.android + - status: completed + - track: internal + - android-build@1: + inputs: + - project_location: "$PROJECT_LOCATION" + - module: "$MODULE" + - variant: "$VARIANT" + - deploy-to-bitrise-io@2: {} + - create-install-page-qr-code@1: {} + - slack@3: + inputs: + - channel: "#build-notifications" + - thumb_url: "$BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL" + - webhook_url: "$SLACK_WEBHOOK" + - cache-push@2: {} +app: + envs: + - opts: + is_expand: false + PROJECT_LOCATION: "." + - opts: + is_expand: false + MODULE: app + - VARIANT: debug + opts: + is_expand: false +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-pull-request-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-pull-request-workflow.md new file mode 100644 index 0000000..8e158d7 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-pull-request-workflow.md @@ -0,0 +1,74 @@ +--- +title: "(Android) Example pull request Workflow" +sidebar_position: 7 +--- + +## Description + +Example Workflow for Android pull request validation. The Workflow contains: + +1. [Running unit tests](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-unit-tests). +1. [Running UI tests on a virtual device](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-instrumentation-tests-on-virtual-devices). +1. [Running Lint](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-lint). +1. [Building a test app and uploading to bitrise.io](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-bitriseio). +1. [Sending the QR code of the test build to the pull request](/en/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-qr-code-to-slack). +1. Triggering the Workflow for pull requests. + +## bitrise.yml + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: android +workflows: + pull-request: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - cache-pull@2: {} + - android-unit-test@1: + inputs: + - project_location: $PROJECT_LOCATION + - variant: $VARIANT + - android-build-for-ui-testing@0: + inputs: + - variant: $VARIANT + - module: $MODULE + - virtual-device-testing-for-android@1: + inputs: + - test_type: instrumentation + - android-lint@0: + inputs: + - variant: "$VARIANT" + - android-build@1: + inputs: + - project_location: "$PROJECT_LOCATION" + - module: "$MODULE" + - variant: "$VARIANT" + - deploy-to-bitrise-io@2: {} + - create-install-page-qr-code@1: {} + - comment-on-github-pull-request@0: + inputs: + - body: |- + ![QR code]($BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL) + + $BITRISE_PUBLIC_INSTALL_PAGE_URL + - personal_access_token: "$GITHUB_ACCESS_TOKEN" + - cache-push@2: {} +app: + envs: + - opts: + is_expand: false + PROJECT_LOCATION: "." + - opts: + is_expand: false + MODULE: app + - VARIANT: debug + opts: + is_expand: false +trigger_map: +- pull_request_source_branch: "*" + workflow: pull-request +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-release-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-release-workflow.md new file mode 100644 index 0000000..8b8a148 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-example-release-workflow.md @@ -0,0 +1,55 @@ +--- +title: "(Android) Example Release Workflow" +sidebar_position: 9 +--- + +## Description + +Example Workflow for uploading a release draft of an app to Google Play. The Workflow contains: + +1. Setting the version name based on [Env Vars passed to the build](/en/bitrise-ci/configure-builds/environment-variables/setting-a-custom-env-var-when-starting-a-build) ($VERSION_NAME). +1. [Creating a release Android App Bundle and uploading it to Google Play](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-deploy-to-google-play-internal-alpha-beta-production). + +## bitrise.yml + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: android +workflows: + release: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - change-android-versioncode-and-versionname@1: + inputs: + - new_version_name: "$VERSION_NAME" + - new_version_code: "$BITRISE_BUILD_NUMBER" + - build_gradle_path: "$PROJECT_LOCATION/$MODULE/build.gradle" + - android-build@1: + inputs: + - project_location: "$PROJECT_LOCATION" + - module: "$MODULE" + - build_type: aab + - variant: release + - sign-apk@1: {} + - google-play-deploy@3: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + - package_name: io.bitrise.sample.android + - status: draft + - track: production +app: + envs: + - opts: + is_expand: false + PROJECT_LOCATION: "." + - opts: + is_expand: false + MODULE: app + - VARIANT: debug + opts: + is_expand: false +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-instrumentation-tests-on-virtual-devices.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-instrumentation-tests-on-virtual-devices.md new file mode 100644 index 0000000..9402d84 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-instrumentation-tests-on-virtual-devices.md @@ -0,0 +1,43 @@ +--- +title: "(Android) Run instrumentation tests on virtual devices" +sidebar_position: 8 +--- + +## Description + +Run instrumentation (for example, Espresso) or robo/gameloop tests on virtual devices. [Our device testing solution](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android.html) is based on Firebase Test Lab. You can find the resulting logs, videos and screenshots on Bitrise. + +## Instructions + +1. Add an **Android Build for UI Testing** Step. Set the input variables: + + - **Project Location**: Use the default $BITRISE_SOURCE_DIR or $PROJECT_LOCATION. You can set a specific path but the automatically exposed Environment Variables are usually the best option. + - **Variant**: Use the $VARIANT [Enviromment Variable](/en/bitrise-ci/configure-builds/environment-variables.html), or specify a variant manually. + - **Module**: Specify one or leave it blank to run tests in all of the modules. +1. Add a **Virtual Device Testing for Android** Step. Set the input variables: + + - **Test type**: **instrumentation** (or **robo** or **gameloop**) + - **(Optional) Test devices** (default: **NexusLowRes,24,en,portrait**). +1. Add a **Deploy to Bitrise.io** Step that makes the test results available in the [test reports](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). + +:::tip[Potential issues with running instrumentation tests on virtual devices] + +You might encounter some unexpected issues while running instrumentation tests on virtual devices. You can find some examples and possible solutions in our Knowledge Base: + +- [Tips for flaky Android emulator tests](https://support.bitrise.io/hc/en-us/articles/360019478817-Tips-for-flaky-Android-emulator-tests) +- [Test failed with Virtual Device Testing for Android Step](https://support.bitrise.io/hc/en-us/articles/360014446058-Test-failed-with-BETA-Virtual-Device-Testing-for-Android-step) + +::: + +## bitrise.yml + +``` +- android-build-for-ui-testing@0: + inputs: + - variant: $VARIANT + - module: $MODULE +- virtual-device-testing-for-android@1: + inputs: + - test_type: instrumentation +- deploy-to-bitrise-io@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-lint.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-lint.md new file mode 100644 index 0000000..74144a2 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-lint.md @@ -0,0 +1,28 @@ +--- +title: "(Android) Run Lint" +sidebar_position: 10 +--- + +## Description + +Runs Lint on your Android project. + +## Instructions + +1. Add the **[Android Lint](https://www.bitrise.io/integrations/steps/android-lint)** Step. Set the input variables: + + - **Project Location**: Use the default $BITRISE_SOURCE_DIR or $PROJECT_LOCATION. + + You can set a specific path but the automatically exposed [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) are usually the best option. + - **Variant**: Use the $VARIANT Enviromment Variable, or specify a variant manually. + - **Module**: Specify one or leave it blank to run lint in all of the modules. +1. Add a **[Deploy to Bitrise.io](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step. This Step uploads the lint report as a [build artifact](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html). + +## bitrise.yml + +``` +- android-lint@0: + inputs: + - variant: $VARIANT +- deploy-to-bitrise-io@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-tests-using-the-emulator.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-tests-using-the-emulator.md new file mode 100644 index 0000000..3864e19 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-tests-using-the-emulator.md @@ -0,0 +1,47 @@ +--- +title: "(Android) Run tests using the emulator" +sidebar_position: 13 +--- + +## Description + +Run any kind of tests (unit, instrumentation) on a local emulator instance. + +## Instructions + +1. Add an **[AVD Manager](https://www.bitrise.io/integrations/steps/avd-manager)** Step. To customize the emulator, see the Step configuration. + + :::tip[Using the AVD Manager Step] + + The **AVD Manager** starts in the background, which can take several minutes. Because of that, we recommend adding the AVD Manager Step at the beginning of your Workflow (before **Activate SSH key (RSA private key)** Step and the **Git Clone** Step) to speed up your builds. + + ::: +1. Add a [**Android Build for UI Testing**](https://www.bitrise.io/integrations/steps/android-build-for-ui-testing) Step, and configure the required inputs. +1. Add a **[Wait for Android emulator](https://www.bitrise.io/integrations/steps/wait-for-android-emulator)** Step. +1. Add an **Android Instrumented Test** Step, and configure the required inputs. +1. Add an **[Export test results to Test Reports](https://www.bitrise.io/integrations/steps/custom-test-results-export)** Step with the following inputs: + + - **The name of the test**: `Emulator tests`. + - **Test result base path**: `$BITRISE_SOURCE_DIR/app/build/outputs/androidTest-results`. + + You might want to adjust the path based on the module name(s) in your project. + - **Test result search pattern**: `*.xml`. +1. Add a **[Deploy to Bitrise.io](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step that makes the test results available in the **Tests** tab. + +## bitrise.yml + +``` +- avd-manager@1: {} +- android-build-for-ui-testing@0: + inputs: + - module: "$ANDROID_TESTING_MODULE" + - variant: "$ANDROID_V_DEBUG" +- wait-for-android-emulator@1: +- android-instrumented-test@0: {} +- custom-test-results-export@0: + inputs: + - search_pattern: "*.xml" + - base_path: $BITRISE_SOURCE_DIR/app/build/outputs/androidTest-results + - test_name: Emulator tests +- deploy-to-bitrise-io@2: +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-unit-tests.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-unit-tests.md new file mode 100644 index 0000000..c856897 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/android-run-unit-tests.md @@ -0,0 +1,30 @@ +--- +title: "(Android) Run unit tests" +sidebar_position: 12 +slug: /bitrise-ci/testing/testing-android-apps/android-unit-tests +--- + +## Description + +[Run unit tests](/en/bitrise-ci/testing/testing-android-apps/android-unit-tests) (for example, `testDebugUnitTest`) for an Android app. + +## Instructions + +1. Add an **[Android Unit Test](https://www.bitrise.io/integrations/steps/android-unit-test)** Step. + + Set the input variables: + + - **Project Location**: Use the default $BITRISE_SOURCE_DIR or $PROJECT_LOCATION. You can set a specific path but the automatically exposed Environment Variables are usually the best option. + - **Variant**: Use the $VARIANT [Enviromment Variable](/en/bitrise-ci/configure-builds/environment-variables.html), or specify a variant manually. + - **Module**: Specify one or leave it blank to run tests in all of the modules. +1. Add a **[Deploy to Bitrise.io](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step that makes the test results available in the **Tests** tab. + +## bitrise.yml + +``` +- android-unit-test@1: + inputs: + - project_location: $PROJECT_LOCATION + - variant: $VARIANT +- deploy-to-bitrise-io@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/index.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/index.md new file mode 100644 index 0000000..59d619d --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/index.md @@ -0,0 +1,11 @@ +--- +title: "Workflow recipes for Android projects" +description: "Workflow recipes specifically for iOS apps. Some of these can be used for the iOS versions of cross-platform apps, while others are specifically meant for native iOS apps." +sidebar_position: 6 +slug: /bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects +sidebar_label: Workflow recipes for Android apps +--- + +Workflow Recipes provide ready-made solutions for common Workflow tasks. + +Here you can find Workflow recipes specifically for iOS apps. Some of these can be used for the iOS versions of cross-platform apps, too while some are specifically meant for native iOS apps. diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/turn-on-gradle-build-profiling.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/turn-on-gradle-build-profiling.md new file mode 100644 index 0000000..1482b4d --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects/turn-on-gradle-build-profiling.md @@ -0,0 +1,66 @@ +--- +title: "Turn on Gradle build profiling" +sidebar_position: 11 +--- + +## Description + +Generate and store a performance report of every Gradle build to spot build speed issues or compare different builds. + +## Instructions + +No matter what Android or Gradle Step you use in your Bitrise Workflow, there is an option to define additional command line arguments for Gradle. Add `--profile` to the relevant input variable to generate a performance report of the Gradle tasks. In the example below, we are adding the argument to the **[Android Unit Test](https://www.bitrise.io/integrations/steps/android-unit-test)** Step. + +1. Add the [**Android Unit Test**](https://www.bitrise.io/integrations/steps/android-unit-test) Step to your Workflow and set the necessary input variables: + + - **Project location**: $PROJECT_LOCATION. + - **Module**: $MODULE. + - **Variant**: $VARIANT. + - **Arguments**: `--profile2`. +1. Add a **[Script](https://www.bitrise.io/integrations/steps/script)** Step to the end of the Workflow to compress the report files and copy the ZIP file to the deploy directory: + + ``` + #!/usr/bin/env bash + # fail if any commands fails + set -e + # debug log + set -x + + zip -r $BITRISE_DEPLOY_DIR/gradle-profile.zip $PROJECT_LOCATION/build/reports/profile + ``` + + Gradle creates the HTML report in `build/reports/profile/`, so we need to take all files in that folder (HTML, CSS and JS files), compress them, and move the ZIP archive to $BITRISE_DEPLOY_DIR. Files in this folder can be accessed on the build page’s **Artifacts** tab. +1. Trigger a manual build of your app. +1. Download and unarchive the `gradle-profile.zip` file, then open the HTML report in your browser. +1. Go to the **Artifacts** tab and check the various aspects of the build in the report: + + - The **Summary** tab shows time spent on things other than task execution. + - The **Task execution** tab lists all tasks sorted by execution time. + - Cached tasks are marked as **UP-TO-DATE**. This helps to fine-tune the [Bitrise Cache Steps](/en/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.html) by comparing the reports of multiple builds. + + For Gradle optimization ideas, [check out this article by Google](https://developer.android.com/studio/build/profile-your-build#using-the-gradle---profile-option). + + If you only want to display task execution times only in the build log, you can use the [build-time-tracker](https://github.com/asarkar/build-time-tracker) plugin. + +## bitrise.yml + +``` +- android-unit-test@1: + inputs: + - project_location: $PROJECT_LOCATION + - module: $MODULE + - arguments: "--profile" + - variant: $VARIANT +- script@1: + title: Collect Gradle profile report + inputs: + - content: |- + #!/usr/bin/env bash + # fail if any commands fails + set -e + # debug log + set -x + + zip -r $BITRISE_DEPLOY_DIR/gradle-profile.zip $PROJECT_LOCATION/build/reports/profile +- deploy-to-bitrise-io@1: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/_category_.json new file mode 100644 index 0000000..099bff5 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Workflow recipes for cross-platform apps", + "position": 8, + "description": "Workflow recipes for apps built with cross-platform frameworks, such as Flutter or React Native.", + "link": { + "type": "doc", + "id": "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/index" + } +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-install-flutter-sdk.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-install-flutter-sdk.md new file mode 100644 index 0000000..648a33b --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-install-flutter-sdk.md @@ -0,0 +1,48 @@ +--- +title: "(Flutter) Install Flutter SDK" +sidebar_position: 6 +--- + +## Description + +Installs the latest stable/beta or a specific version of Flutter. + +## Instructions + +1. Add the **[Flutter Install](https://www.bitrise.io/integrations/steps/flutter-installer)** Step. Use this step before the Cache Pull step to make sure caching works correctly. +1. Install either the latest stable/beta versions or a specific version. + + - By default, the Step installs the latest stable version. + - To install the latest beta, set the Flutter SDK git repository version input to beta. + - To install a specific version, set the Flutter SDK installation bundle URL input. You can find the list of [Flutter installation bundles here](http://flutter.dev/docs/development/tools/sdk/releases). Make sure you set the bundle based on the stack (MacOS or Linux). + + :::tip[Best practice] + + We recommend using a specific version. + + ::: + +## bitrise.yml + +Specific version: + +``` +--- +- flutter-installer@0: + inputs: + - installation_bundle_url: https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_2.5.3-stable.zip +``` + +Latest stable version: + +``` +- flutter-installer@0: {} +``` + +Latest beta version: + +``` +- flutter-installer@0: + inputs: + - version: beta +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-run-dart-analyzer.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-run-dart-analyzer.md new file mode 100644 index 0000000..3ac4a06 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-run-dart-analyzer.md @@ -0,0 +1,20 @@ +--- +title: "(Flutter) Run Dart Analyzer" +sidebar_position: 7 +--- + +## Description + +Runs the Dart Analyzer for Flutter apps. + +## Instructions + +Add the **[Flutter Analyze](https://www.bitrise.io/integrations/steps/flutter-analyze)** Step to your Workflow. + +## bitrise.yml + +``` +- flutter-analyze@0: + inputs: + - project_location: $BITRISE_FLUTTER_PROJECT_LOCATION +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-run-tests.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-run-tests.md new file mode 100644 index 0000000..2a332c9 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/flutter-run-tests.md @@ -0,0 +1,25 @@ +--- +title: "(Flutter) Run tests" +sidebar_position: 5 +--- + +## Description + +Runs any test in a Flutter project. + +## Instructions + +1. Add the **[Flutter Test](https://www.bitrise.io/integrations/steps/flutter-test)** Step to your Workflow. Set the input variables: + + - **Project Location**: For example, $BITRISE_FLUTTER_PROJECT_LOCATION. + - Check out optional inputs in the Workflow Editor or in the Step description. +1. Add a **[Deploy to Bitrise.io](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step that makes the test results available in the Tests tab. + +## bitrise.yml + +``` +- flutter-test@1: + inputs: + - project_location: "$BITRISE_FLUTTER_PROJECT_LOCATION" +- deploy-to-bitrise-io@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/index.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/index.md new file mode 100644 index 0000000..3596cc1 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/index.md @@ -0,0 +1,11 @@ +--- +title: "Workflow recipes for cross-platform projects" +description: "Workflow recipes for apps built with cross-platform frameworks, such as Flutter or React Native." +sidebar_position: 8 +slug: /bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects +sidebar_label: Workflow recipes for cross-platform apps +--- + +Workflow Recipes provide ready-made solutions for common Workflow tasks. + +Here you can find Workflow recipes for apps built with cross-platform frameworks, such as Flutter or React Native. diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-cache-dependencies-node-modules.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-cache-dependencies-node-modules.md new file mode 100644 index 0000000..f6315d2 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-cache-dependencies-node-modules.md @@ -0,0 +1,46 @@ +--- +title: "(React Native) Cache dependencies (node_modules)" +sidebar_position: 1 +--- + +## Description + +Set up caching for dependencies (`node_modules` folder) of a React Native app. + +## Instructions + +1. Add the **[Bitrise.io Cache:Pull](https://www.bitrise.io/integrations/steps/cache-pull)**Step. +1. Add either the **[Run yarn command](https://www.bitrise.io/integrations/steps/yarn)** or the **[Run npm command](https://github.com/bitrise-steplib/steps-npm)** Step to your Workflow based on your project setup. Set the input variables: + + - Set the **The yarn command to run** or **The npm command with arguments to run** input variable to `install`. + - Set **Cache node_modules** to `yes`. +1. Add the **[Bitrise.io Cache:Push](https://www.bitrise.io/integrations/steps/cache-push)** Step. +1. (Optional) Set the **Compress cache** input variable to `true`. This can be useful if your cache folders are large and you are experiencing slow build times. + +## bitrise.yml + +Using `yarn`: + +``` +- cache-pull@2: {} +- yarn@0: + inputs: + - cache_local_deps: 'yes' + - command: install +- cache-push@2: + inputs: + - compress_archive: 'true' +``` + +Using `npm`: + +``` +- cache-pull@2: {} +- npm@1: + inputs: + - cache_local_deps: 'yes' + - command: install +- cache-push@2: + inputs: + - compress_archive: 'true' +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-expo-build-using-turtle-cli.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-expo-build-using-turtle-cli.md new file mode 100644 index 0000000..31eb657 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-expo-build-using-turtle-cli.md @@ -0,0 +1,116 @@ +--- +title: "(React Native) Expo: Build using Turtle CLI" +sidebar_position: 2 +--- + +## Description + +Publish an app to Expo's servers and build an iOS App Store `.ipa` and an Android `.aab` file from your Expo project using [Turtle CLI](https://docs.expo.dev/classic/turtle-cli/). + +## Prerequisites + +1. Generate an iOS Distribution Certificate and an App Store Provisioning Profile based on the [Generating iOS code signing files guide](/en/bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files.html). +1. Generate an Android Keystore by following the [Android code signing with Android Studio guide](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio.html). +1. Make sure you can [Publish your Expo project](https://docs.expo.dev/classic/turtle-cli/#publish-your-project) locally. + +## Instructions + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Go to the **Code Signing & Files** tab. +1. Make sure that the project's iOS Distribution Certificate and App Store Provisioning Profile are uploaded. + + If not, add them in the **Add Provisioning Profile(s)** and the **Add a certificate (.p12 file) for code signing**, respectively. +1. Make sure that the project's Android Keystore file is uploaded. + + If not, drag-and-drop your keystore file to the **Upload file (max. 5 MB)** field of the **ANDROID KEYSTORE FILE** section. +1. Go to the **Secrets** tab. +1. Create a Secret (IOS_DEVELOPMENT_TEAM) with the ID of the iOS Development Team issued in the project's Certificate and Provisioning Profile. +1. Store the Expo account's username and password used for publishing in EXPO_USERNAME and EXPO_PASSWORD [Secrets](/en/bitrise-ci/configure-builds/secrets.html). +1. On the left, select **Configuration YAML** from the navigation menu. +1. Copy paste `envs` from `bitrise.yml` below to your Workflow. +1. Copy paste `steps` from `bitrise.yml` below to your Workflow. + + The built `.ipa` and `.aab` files are exposed via BITRISE_IPA_PATH and BITRISE_AAB_PATH Env Vars. + +## bitrise.yml + +``` +turtle_build: + envs: + - KEYSTORE_PATH: /tmp/keystore.jks + - KEYSTORE_ALIAS: $BITRISEIO_ANDROID_KEYSTORE_ALIAS + - EXPO_ANDROID_KEYSTORE_PASSWORD: $BITRISEIO_ANDROID_KEYSTORE_PASSWORD + - EXPO_ANDROID_KEY_PASSWORD: $BITRISEIO_ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD + - PROFILE_PATH: /tmp/profile.mobileprovision + - CERTIFICATE_PATH: /tmp/certificate.p12 + - EXPO_IOS_DIST_P12_PASSWORD: $BITRISE_CERTIFICATE_PASSPHRASE + # Define these in your secrets + - IOS_DEVELOPMENT_TEAM: $IOS_DEVELOPMENT_TEAM + - EXPO_USERNAME: $EXPO_USERNAME + - EXPO_PASSWORD: $EXPO_PASSWORD + steps: + - script@1: + title: Install dependencies + inputs: + - content: |- + #!/usr/bin/env bash + set -ex + + node --version + fastlane --version + + npm install -g turtle-cli + turtle --version + + npm install -g expo-cli + expo --version + - file-downloader@1: + title: Download Android Keystore + inputs: + - destination: $KEYSTORE_PATH + - source: $BITRISEIO_ANDROID_KEYSTORE_URL + - file-downloader@1: + title: Download iOS Certificate + inputs: + - destination: $CERTIFICATE_PATH + - source: $BITRISE_CERTIFICATE_URL + - file-downloader@1: + title: Download iOS Provisioning Profile + inputs: + - destination: $PROFILE_PATH + - source: $BITRISE_PROVISION_URL + - npm@1: + title: Install project dependencies + inputs: + - command: install + - set-java-version@1: + title: Set Java version to Java 8 + inputs: + - set_java_version: "8" + - script@1: + title: Run Expo publish + inputs: + - content: |- + #!/usr/bin/env bash + set -ex + + expo login -u $EXPO_USERNAME -p $EXPO_PASSWORD --non-interactive + expo publish + - script@1: + title: Run Turtle build + inputs: + - content: |- + #!/usr/bin/env bash + set -ex + + turtle setup:android + aab_path=$BITRISE_DEPLOY_DIR/expo-project.aab + turtle build:android --type app-bundle --keystore-path $KEYSTORE_PATH --keystore-alias $KEYSTORE_ALIAS -o $aab_path + envman add --key BITRISE_AAB_PATH --value $aab_path + + turtle setup:ios + ipa_path=$BITRISE_DEPLOY_DIR/expo-project.ipa + turtle build:ios --team-id $IOS_DEVELOPMENT_TEAM --dist-p12-path $CERTIFICATE_PATH --provisioning-profile-path $PROFILE_PATH -o $ipa_path + envman add --key BITRISE_IPA_PATH --value $ipa_path +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-install-dependencies.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-install-dependencies.md new file mode 100644 index 0000000..451fe96 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-install-dependencies.md @@ -0,0 +1,33 @@ +--- +title: "(React Native) Install dependencies" +sidebar_position: 4 +slug: /bitrise-ci/dependencies-and-caching/react-native-dependencies +sidebar_label: React Native dependencies +--- + +## Description + +Install dependencies using either yarn or npm. + +## Instructions + +1. Add either the **[Run yarn command](https://www.bitrise.io/integrations/steps/yarn)** or the **[Run npm command](https://github.com/bitrise-steplib/steps-npm)** Step to your Workflow based on your project setup. +1. Set the **The yarn command to run** or **The npm command with arguments to run** input variable to `install`. + +## bitrise.yml + +Using `yarn`: + +``` +- yarn@0: + inputs: + - command: install +``` + +Using `npm`: + +``` +- npm@1: + inputs: + - command: install +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-run-tests.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-run-tests.md new file mode 100644 index 0000000..452ae3c --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-run-tests.md @@ -0,0 +1,31 @@ +--- +title: "(React Native) Run tests" +sidebar_position: 3 +--- + +## Description + +Run tests, for example, in Jest. + +## Instructions + +1. Add either the **[Run yarn command](https://www.bitrise.io/integrations/steps/yarn)** or the **[Run npm command](https://github.com/bitrise-steplib/steps-npm)** Step to your Workflow based on your project setup. +1. Set the **The yarn command to run** or **The npm command with arguments to run** input variable to `test`. + +## bitrise.yml + +Using `yarn`: + +``` +- yarn@0: + inputs: + - command: test +``` + +Using `npm`: + +``` +- npm@1: + inputs: + - command: test +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/_category_.json b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/_category_.json new file mode 100644 index 0000000..eb296c0 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Workflow recipes for iOS apps", + "position": 7, + "description": "Workflow recipes specifically for iOS apps. Some of these can be used for the iOS versions of cross-platform apps, too while some are specifically meant for native iOS apps.", + "link": { + "type": "doc", + "id": "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/index" + } +} diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/index.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/index.md new file mode 100644 index 0000000..a7e0b96 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/index.md @@ -0,0 +1,11 @@ +--- +title: "Workflow recipes for iOS projects" +description: "Workflow recipes specifically for iOS apps. Some of these can be used for the iOS versions of cross-platform apps, too while some are specifically meant for native iOS apps." +sidebar_position: 7 +slug: /bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects +sidebar_label: Workflow recipes for iOS apps +--- + +Workflow Recipes provide ready-made solutions for common Workflow tasks. + +Here you can find Workflow recipes specifically for iOS apps. Some of these can be used for the iOS versions of cross-platform apps, too while some are specifically meant for native iOS apps. diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-cache-cocoapods-dependencies.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-cache-cocoapods-dependencies.md new file mode 100644 index 0000000..6914b39 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-cache-cocoapods-dependencies.md @@ -0,0 +1,24 @@ +--- +title: "(iOS) Cache CocoaPods dependencies" +sidebar_position: 1 +--- + +## Description + +Cache the content of the `Pods` folder of your iOS project. + +## Instructions + +1. Add the **[Bitrise.io Cache:Pull](https://www.bitrise.io/integrations/steps/cache-pull)** Step. +1. Add the **[Run CocoaPods install](https://www.bitrise.io/integrations/steps/cocoapods-install)** Step. +1. Add the **[Bitrise.io Cache:Push](https://www.bitrise.io/integrations/steps/cache-push)** Step. + + Optionally you can set **Compress Archive** to **true**. This is useful if your cached folders are bigger. + +## bitrise.yml + +``` +- cache-pull@2: {} +- cocoapods-install@2: {} +- cache-push@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-app-store-connect-testflight.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-app-store-connect-testflight.md new file mode 100644 index 0000000..1b9da4a --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-app-store-connect-testflight.md @@ -0,0 +1,52 @@ +--- +title: "(iOS) Deploy to App Store Connect / TestFlight" +sidebar_position: 2 +--- + +## Description + +Archive the app and upload to App Store Connect to either release it to App Store or to TestFlight. + +## Prerequisites + +1. The source code is cloned and the dependencies (for example, Cocoapods, Carthage) are installed. +1. You have code signing set up. See [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing.html) for more details. +1. You have Apple Developer connection set up. See [Apple services connection](/en/bitrise-platform/integrations/apple-services-connection.html) for more details. + +## Instructions + +1. (Optional) Add the **[Set Xcode Project Build Number](http://bitrise.io/integrations/steps/set-xcode-build-number)** Step. Set the input variables: + + - **Info.plist file path**: for example, `MyApp/Info.plist`. + - **Build Number**: for example, `42`. + - **Version Number**: for example, `1.1`. +1. Add the **[Xcode Archive & Export for iOS](https://www.bitrise.io/integrations/steps/xcode-archive)** Step. Set the input variables: + + - **Project path**: by default, $BITRISE_PROJECT_PATH. + - **Scheme**: by default $BITRISE_SCHEME. + - **Distribution method**: it must be set to **app-store**. +1. Add the **[Deploy to App Store Connect - Application Loader (formerly iTunes Connect)](https://www.bitrise.io/integrations/steps/deploy-to-itunesconnect-application-loader)** Step. Set the input variable **Bitrise Apple Developer Connection**: for example, **api_key**. + + :::tip[Even more options with Deploy to App Store Connect with Deliver (formerly iTunes Connect)] + + Alternatively you can use the **[Deploy to App Store Connect with Deliver (formerly iTunes Connect)](https://www.bitrise.io/integrations/steps/deploy-to-itunesconnect-deliver)** Step as well, which gives you more options. + + ::: + +## bitrise.yml + +``` +- set-xcode-build-number@1: + inputs: + - build_short_version_string: '1.0' + - plist_path: BitriseTest/Info.plist +- xcode-archive@4: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: "$BITRISE_SCHEME" + - automatic_code_signing: api_key + - distribution_method: app-store +- deploy-to-itunesconnect-application-loader@1: + inputs: + - connection: api_key +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-bitriseio.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-bitriseio.md new file mode 100644 index 0000000..88b773b --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-bitriseio.md @@ -0,0 +1,33 @@ +--- +title: "(iOS) Deploy to bitrise.io" +sidebar_position: 4 +--- + +## Description + +Build and distribute your app to testers via Bitrise.io Ship. + +## Prerequisites + +You have code signing set up. See [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing.html) for more details. + +## Instructions + +1. Add the **[Xcode Archive & Export for iOS](https://www.bitrise.io/integrations/steps/xcode-archive)** Step. Set the input variables: + + - **Project path**: by default, $BITRISE_PROJECT_PATH. + - **Scheme**: by default, $BITRISE_SCHEME. + - **Distribution method**: **development**, **ad-hoc** or **enterprise**. +1. Add the **[Deploy to Bitrise.io - Apps, Logs, Artifacts](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step. + +## bitrise.yml + +``` +- xcode-archive@4: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: "$BITRISE_SCHEME" + - automatic_code_signing: apple-id + - distribution_method: development + - deploy-to-bitrise-io@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-firebase-app-distribution.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-firebase-app-distribution.md new file mode 100644 index 0000000..d4c1782 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-firebase-app-distribution.md @@ -0,0 +1,41 @@ +--- +title: "(iOS) Deploy to Firebase App Distribution" +sidebar_position: 6 +--- + +## Description + +Build and distribute your app to testers via Firebase App Distribution. + +## Prerequisites + +1. An existing Firebase project where your exact bundle ID is registered. Follow the [Firebase documentation](https://firebase.google.com/docs/app-distribution/ios/distribute-console) for details. +1. Obtain a token from Firebase by running firebase `login:ci` locally. See the [Firebase CLI](https://firebase.google.com/docs/cli#sign-in-test-cli) docs for more details. +1. Add this token as a Secret to your Bitrise project with the name FIREBASE_TOKEN. +1. Get your Firebase App ID from your project's **General Settings** page and pass this value as an input variable to the **[BETA] Firebase App Distribution** Step. +1. You have code signing set up. See [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing.html) for more details. + +## Instructions + +1. Add the **[Xcode Archive & Export for iOS](https://www.bitrise.io/integrations/steps/xcode-archive)** Step and set the required input variables, such as **Scheme**, **Distribution method** and the desired code signing method. +1. Add the **[[BETA] Firebase App Distribution](https://github.com/guness/bitrise-step-firebase-app-distribution)** Step and set the following input variables: + + - **Firebase token**: use the secret env var previously defined: $FIREBASE_TOKEN. + - **Firebase App ID**: see the Prerequisites section above for details. + - Optionally, you can define test groups or individual testers in the Step input variables. + +## bitrise.yml + +``` +- xcode-archive@6: + inputs: + - distribution_method: development + - scheme: # your scheme goes here + - automatic_code_signing: api-key +- firebase-app-distribution@0: + inputs: + - firebase_token: $FIREBASE_TOKEN + - app: # your app ID from Firebase + - testers: email@company.com # optional + - groups: qa-team #optional +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-ci-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-ci-workflow.md new file mode 100644 index 0000000..a817154 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-ci-workflow.md @@ -0,0 +1,67 @@ +--- +title: "(iOS) Example CI Workflow" +sidebar_position: 3 +--- + +## Description + +Example Workflow for commits on the main branch of an iOS app. The Workflow contains: + +1. Installing [Cocoapods](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-cocoapods-dependencies) and [Carthage](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-carthage-dependencies) dependecies. +1. [Running all unit and UI tests in simulator](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-run-tests-on-a-simulator). +1. [Building a test app and uploading to bitrise.io](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-bitriseio). +1. [Sending a Slack notification with the build status.](/en/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-build-status-to-slack) +1. [Filling the cache for upcoming pull request builds](/en/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/make-caching-efficient-for-pull-request-builds) + +## bitrise.yml + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: ios +workflows: + ci: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - cache-pull@2: {} + - cocoapods-install@2: {} + - carthage@3: + inputs: + - carthage_options: "--use-xcframeworks --platform iOS" + - recreate-user-schemes@1: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - xcode-test@4: + inputs: + - log_formatter: xcodebuild + - xcodebuild_options: "-enableCodeCoverage YES" + - xcode-archive@4: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: "$BITRISE_SCHEME" + - automatic_code_signing: apple-id + - distribution_method: development + - deploy-to-bitrise-io@2: {} + - slack@3: + inputs: + - channel: "#build-notifications" + - webhook_url: "$SLACK_WEBHOOK" + - cache-push@2: {} +app: + envs: + - opts: + is_expand: false + BITRISE_PROJECT_PATH: BitriseTest.xcworkspace + - opts: + is_expand: false + BITRISE_SCHEME: BitriseTest + - opts: + is_expand: false + BITRISE_DISTRIBUTION_METHOD: development +trigger_map: +- push_branch: main + workflow: ci +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-nightly-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-nightly-workflow.md new file mode 100644 index 0000000..d3e9b44 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-nightly-workflow.md @@ -0,0 +1,78 @@ +--- +title: "(iOS) Example nightly Workflow" +sidebar_position: 7 +--- + +## Description + +Example Workflow for nightly builds for iOS apps. The Workflow contains: + +1. Installing [Cocoapods](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-cache-cocoapods-dependencies) and [Carthage](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-carthage-dependencies) dependencies. +1. **[Setting the version and build number](https://www.bitrise.io/integrations/steps/set-ios-version)**. By default, the app will get the build number ($BITRISE_BUILD_NUMBER) as the version code. +1. [Building a release build and uploading to TestFlight](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-app-store-connect-testflight). +1. [Building a test app and uploading to bitrise.io](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-bitriseio). +1. [Sending the QR code of the test build to Slack](/en/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/iosandroid-send-qr-code-to-slack). + +Check out our [guide](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.html) to run scheduled builds. + +## bitrise.yml + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: ios +workflows: + nightly: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - cache-pull@2: {} + - cocoapods-install@2: {} + - carthage@3: + inputs: + - carthage_options: "--use-xcframeworks --platform iOS" + - set-xcode-build-number@1: + inputs: + - build_short_version_string: '1.0' + - plist_path: BitriseTest/Info.plist + - recreate-user-schemes@1: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - xcode-archive@4: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: "$BITRISE_SCHEME" + - automatic_code_signing: apple-id + - distribution_method: app-store + - deploy-to-itunesconnect-application-loader@1: + inputs: + - connection: apple_id + - xcode-archive@4: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: "$BITRISE_SCHEME" + - automatic_code_signing: apple-id + - distribution_method: development + - deploy-to-bitrise-io@2: {} + - deploy-to-bitrise-io@2: {} + - create-install-page-qr-code@1: {} + - slack@3: + inputs: + - channel: "#build-notifications" + - thumb_url: "$BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL" + - webhook_url: "$SLACK_WEBHOOK" + - cache-push@2: {} +app: + envs: + - opts: + is_expand: false + BITRISE_PROJECT_PATH: BitriseTest.xcworkspace + - opts: + is_expand: false + BITRISE_SCHEME: BitriseTest + - opts: + is_expand: false + BITRISE_DISTRIBUTION_METHOD: development +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-pull-request-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-pull-request-workflow.md new file mode 100644 index 0000000..9697135 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-pull-request-workflow.md @@ -0,0 +1,71 @@ +--- +title: "(iOS) Example Pull Request Workflow" +sidebar_position: 5 +--- + +## Description + +Example Workflow for iOS pull request validation. The Workflow contains: + +1. Installing [Cocoapods](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-cache-cocoapods-dependencies) and [Carthage](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-carthage-dependencies) dependencies. +1. [Running all unit and UI tests on simulator](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-run-tests-on-a-simulator). +1. [Building a test app and uploading to bitrise.io](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-bitriseio). +1. [Sending the QR code of the test build to the pull request](/en/bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes/github-pull-request-send-the-build-qr-code). +1. Triggering the Workflow for pull requests. + +## bitrise.yml + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: ios +workflows: + pull-request: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - cache-pull@2: {} + - cocoapods-install@2: {} + - carthage@3: + inputs: + - carthage_options: "--use-xcframeworks --platform iOS" + - recreate-user-schemes@1: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - xcode-test@4: + inputs: + - log_formatter: xcodebuild + - xcodebuild_options: "-enableCodeCoverage YES" + - xcode-archive@4: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: "$BITRISE_SCHEME" + - automatic_code_signing: apple-id + - distribution_method: development + - deploy-to-bitrise-io@2: {} + - create-install-page-qr-code@1: {} + - comment-on-github-pull-request@0: + inputs: + - body: |- + ![QR code]($BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL) + + $BITRISE_PUBLIC_INSTALL_PAGE_URL + - personal_access_token: "$GITHUB_ACCESS_TOKEN" + - cache-push@2: {} +app: + envs: + - opts: + is_expand: false + BITRISE_PROJECT_PATH: BitriseTest.xcworkspace + - opts: + is_expand: false + BITRISE_SCHEME: BitriseTest + - opts: + is_expand: false + BITRISE_DISTRIBUTION_METHOD: development +trigger_map: +- pull_request_source_branch: "*" + workflow: pull-request +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-release-workflow.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-release-workflow.md new file mode 100644 index 0000000..aa04722 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-example-release-workflow.md @@ -0,0 +1,59 @@ +--- +title: "(iOS) Example Release Workflow" +sidebar_position: 12 +--- + +## Description + +Example Workflow for uploading a release draft of an iOS app to the App Store. The Workflow contains: + +1. Installing [Cocoapods](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-cache-cocoapods-dependencies) and [Carthage](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-carthage-dependencies) dependencies. +1. [Setting the version number](https://www.bitrise.io/integrations/steps/set-ios-version) based on [Env Vars passed to build](/en/bitrise-ci/configure-builds/environment-variables/setting-a-custom-env-var-when-starting-a-build) ($VERSION_NUMBER). +1. [Building a release build and uploading to App Store](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-deploy-to-app-store-connect-testflight). + +## bitrise.yml + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: ios +workflows: + release: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@6: {} + - cocoapods-install@2: {} + - carthage@3: + inputs: + - carthage_options: "--use-xcframeworks --platform iOS" + - set-xcode-build-number@1: + inputs: + - build_short_version_string: "$VERSION_NUMBER" + - build_version: "$BITRISE_BUILD_NUMBER" + - plist_path: BitriseTest/Info.plist + - recreate-user-schemes@1: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - xcode-archive@4: + inputs: + - project_path: "$BITRISE_PROJECT_PATH" + - scheme: "$BITRISE_SCHEME" + - automatic_code_signing: apple-id + - distribution_method: app-store + - deploy-to-itunesconnect-application-loader@1: + inputs: + - connection: apple_id +app: + envs: + - opts: + is_expand: false + BITRISE_PROJECT_PATH: BitriseTest.xcworkspace + - opts: + is_expand: false + BITRISE_SCHEME: BitriseTest + - opts: + is_expand: false + BITRISE_DISTRIBUTION_METHOD: development +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-carthage-dependencies.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-carthage-dependencies.md new file mode 100644 index 0000000..01e2e22 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-carthage-dependencies.md @@ -0,0 +1,29 @@ +--- +title: "(iOS) Install Carthage Dependencies" +sidebar_position: 11 +--- + +## Description + +Install Carthage dependencies. + +## Instructions + +Add the **[Carthage](https://www.bitrise.io/integrations/steps/carthage)** Step. Set the input variables: + +- **Github Personal Access Token**: We recommend adding a GitHub access token to your **Secrets** ($GITHUB_ACCESS_TOKEN). We need this token to avoid GitHub rate limit issue. See the GitHub guide: [Creating an access token for command-line use](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) on how to create Personal Access Token. Uncheck every scope box when creating this token. There is no reason this token needs access to private information. +- (Optional) Set **Additional options for carthage command**: see the [Carthage docs](https://github.com/Carthage/Carthage) for the available options, for example, `--use-xcframeworks --platform iOS`. + +:::tip[Setting a specific Carthage version in your builds] + +If your project needs a Carthage version currently unavailable on our stacks, check out [Setting a specific Carthage version in your builds](https://support.bitrise.io/hc/en-us/articles/360018894138-Setting-a-specific-Carthage-version-in-your-builds). + +::: + +## bitrise.yml + +``` +- carthage@3: + inputs: + - carthage_options: "--use-xcframeworks --platform iOS" +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-cocoapods-dependencies.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-cocoapods-dependencies.md new file mode 100644 index 0000000..d98b7f9 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-install-cocoapods-dependencies.md @@ -0,0 +1,19 @@ +--- +title: "(iOS) Install CocoaPods dependencies" +sidebar_position: 10 +--- + +## Description + +Install CocoaPods dependencies. Make sure that you are using the workspace and not the project file in your Steps. To do so, check the value of $BITRISE_PROJECT_PATH Env Var. + +## Instructions + +1. Add the **[Run CocoaPods install](https://www.bitrise.io/integrations/steps/cocoapods-install)** Step. +1. (Optional) If your Podfile is not in the root, set the **Podfile path** input variable. + +## bitrise.yml + +``` +- cocoapods-install@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-override-the-app-store-connect-connection.mdx b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-override-the-app-store-connect-connection.mdx new file mode 100644 index 0000000..0b732a7 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-override-the-app-store-connect-connection.mdx @@ -0,0 +1,46 @@ +--- +title: "(iOS) Override the App Store Connect connection" +sidebar_position: 13 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Description + +You can override the Apple service connection credentials configured in the **App Settings** by setting the inputs under the **App Store Connect connection override** input group in the [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive) Step. + +This can be useful if your team uses multiple App Store accounts or if you manage multiple apps in a single Bitrise app and would like to use different Apple service connections based on your Workflow. + +## Prerequisites + +Before starting, generate or get the following using **[App Store Connect](https://appstoreconnect.apple.com/login)**: + +- App Store Connect API private key. +- App Store Connect API key ID. +- App Store Connect API issuer ID. + +For more information, check out [Creating App Store Connect API private keys](https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api). + +## Instructions + +1. Upload your App Store Connect API private key file (.p8 file) to the [**Generic File Storage**](https://github.com/bitrise-steplib/steps-generic-file-storage) in the **Code Signing** tab. +1. Add the [**Xcode Archive & Export for iOS**](https://github.com/bitrise-steplib/steps-xcode-archive) Step (version 4.6.0 or newer) to your Workflow. +1. Set the **Automatic code signing method** input to `api-key`. +1. Set the following Step inputs under the **App Store Connect connection override** input group: + + - **App Store Connect API private key**: Local path or remote URL to the private key (.p8 file) for App Store Connect API. Set this input to the automatically generated Env Var connected to the App Store Connect API private key file (.p8 file) you uploaded to the [**Generic File Storage**](https://github.com/bitrise-steplib/steps-generic-file-storage) in step 1. + - **App Store Connect API key ID**: Private key ID used for App Store Connect authentication. + - **App Store Connect API issuer ID**: Private key issuer ID used for App Store Connect authentication. + +## bitrise.yml + +``` +- xcode-archive@4: + inputs: + - automatic_code_signing: api-key + - api_key_path: "$BITRISEIO_APP_STORE_CONNECT_API_ID_URL" + - api_key_id: "$APP_STORE_API_ID" + - api_key_issuer_id: "$APP_STORE_API_ISSUER_ID" +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-run-tests-on-a-physical-device.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-run-tests-on-a-physical-device.md new file mode 100644 index 0000000..97a200c --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-run-tests-on-a-physical-device.md @@ -0,0 +1,29 @@ +--- +title: "(iOS) Run tests on a physical device" +sidebar_position: 8 +--- + +## Description + +Run unit or UI tests on a physical device. Our [device testing solution](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.html) is based on [Firebase Test Lab](https://firebase.google.com/docs/test-lab/). You can find the resulting logs, videos and screenshots on Bitrise. + +## Prerequisites + +1. The source code is cloned and the dependencies (for example, Cocoapods, Carthage) are installed. +1. You have code signing set up. See [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing.html) for more details. + +## Instructions + +1. Add an **[Xcode Build for testing for iOS](https://www.bitrise.io/integrations/steps/xcode-build-for-test)** Step. +1. Add a **[[BETA] iOS Device Testing](https://www.bitrise.io/integrations/steps/virtual-device-testing-for-ios)** Step and setup code signing. +1. Add a **[Deploy to Bitrise.io - Apps, Logs, Artifacts](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step that makes the test results available in [test reports](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). + +## bitrise.yml + +``` +- xcode-build-for-test@1: + inputs: + - automatic_code_signing: api_key +- virtual-device-testing-for-ios@1: {} +- deploy-to-bitrise-io@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-run-tests-on-a-simulator.md b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-run-tests-on-a-simulator.md new file mode 100644 index 0000000..dae4b55 --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects/ios-run-tests-on-a-simulator.md @@ -0,0 +1,30 @@ +--- +title: "(iOS) Run tests on a simulator" +sidebar_position: 9 +--- + +## Description + +Run unit or UI tests of an iOS app on a simulator. + +## Instructions + +1. Add an **[Xcode Test for iOS](https://www.bitrise.io/integrations/steps/xcode-test)** Step. Set the input variables: + + - **Project path**: The default value is $BITRISE_PROJECT_PATH and in most cases you don't have to change it. + - **Scheme**: The default value is $BITRISE_SCHEME, this variable stores the scheme that you set when adding the app on Bitrise. You can specify a different scheme if you want but it must be a shared scheme. + - **Device destination specifier**: (default: `platform=iOS Simulator,name=iPhone 8 Plus,OS=latest`). + + :::tip[Installing additional simulators for Xcode UI tests] + + If you need a simulator for your Xcode UI tests that is unavailable on the stack you are using, check out [this article](https://support.bitrise.io/hc/en-us/articles/360019999198-Installing-additional-simulators-for-Xcode-UI-tests) on Knowledge Base for a guide. + + ::: +1. Add a **[Deploy to Bitrise.io - Apps, Logs, Artifacts](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step that makes the test results available in [test reports](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). + +## bitrise.yml + +``` +- xcode-test@4: {} +- deploy-to-bitrise-io@2: {} +``` diff --git a/docs/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.mdx b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.mdx new file mode 100644 index 0000000..b04ae7e --- /dev/null +++ b/docs/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.mdx @@ -0,0 +1,21 @@ +--- +title: "Workflows overview" +description: "A Bitrise Workflow is a collection of Steps. When a build of an app is running, each Step will be executed in the order that is defined in the Workflow." +sidebar_position: 1 +slug: /bitrise-ci/workflows-and-pipelines/workflows/workflows-overview +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +A Bitrise Workflow is a collection of Steps. When a build of a project is running, each Step will be executed in the order that is defined in the Workflow. Workflows can be created, defined and modified in two ways: + +- Using the graphical Workflow Editor on [bitrise.io](https://www.bitrise.io), or [the offline version on your own device](/en/bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.html). +- Directly editing the `bitrise.yml` file of your project. + +Ultimately, both methods modify the `bitrise.yml` file - the **Workflow Editor** is simply a friendlier way of doing so! + +By default, a single build is a single Workflow. But you can also chain Workflows together so they run in succession, as well as to trigger multiple Workflow to run simultaneously. + +Workflows can also be arranged into [Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html). A Pipeline consists of multiple Stages and each Stage consists of one or more Workflows which run in parallel. diff --git a/docs/bitrise-platform/_category_.json b/docs/bitrise-platform/_category_.json new file mode 100644 index 0000000..b1abdb5 --- /dev/null +++ b/docs/bitrise-platform/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Bitrise as a Platform", + "position": 1, + "link": { + "type": "doc", + "id": "bitrise-platform/index" + } +} diff --git a/docs/bitrise-platform/accounts/_category_.json b/docs/bitrise-platform/accounts/_category_.json new file mode 100644 index 0000000..3ef42ff --- /dev/null +++ b/docs/bitrise-platform/accounts/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Account", + "position": 3, + "link": null +} diff --git a/docs/bitrise-platform/accounts/accounts-overview.md b/docs/bitrise-platform/accounts/accounts-overview.md new file mode 100644 index 0000000..e7d94bf --- /dev/null +++ b/docs/bitrise-platform/accounts/accounts-overview.md @@ -0,0 +1,35 @@ +--- +title: "Accounts overview" +description: "When you sign up for Bitrise, you create your own individual user account. By itself, having a user account isn’t enough to add apps and run builds. For that, you must be part of a Workspace." +sidebar_position: 1 +slug: /bitrise-platform/accounts/accounts-overview +sidebar_label: About personal accounts +--- + +When you sign up for Bitrise, you create your own individual user account. By itself, having a user account isn’t enough to add projects and run builds. For that, you must be part of a workspace or invited to a project as an outside contributor. + +You can connect your personal account to: + +- Your Git provider accounts via OAuth, allowing you to log in to Bitrise through your Git provider and to configure repository access for Bitrise CI: [Repository access with OAuth](/en/bitrise-platform/repository-access/repository-access-with-oauth). +- The Bitrise GitHub App, allowing authentication and repository access without the need for SSH keys: [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). +- Your Apple ID, allowing you to connect Bitrise projects to an Apple service: [Connecting to an Apple service with Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id). + +## Account settings page + +Your Bitrise account is managed from your [Account settings page](http://app.bitrise.io/me/account). From this page, you can: + +- [Edit your profile](/en/bitrise-platform/accounts/editing-your-profile-settings.html), including username, email address, password, and avatar. +- Set up [Apple ID connection](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id/adding-apple-id-authentication-data-on-bitrise). +- [Enable two-factor authentication](/en/bitrise-platform/accounts/two-factor-authentication/enabling-two-factor-authentication). +- Connect [LaunchDarkly feature flags](/en/release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags.html) for Release Management. +- Create and manage personal access tokens used to access the [Bitrise API](/en/bitrise-ci/api/api-overview.html). +- [Register test devices](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device). + +## SAML SSO + +You can log in to Bitrise via SAML SSO. Bitrise supports multiple SAML identity providers. To log in via SAML SSO: + +- Your workspace must have SAML SSO enabled. +- Make sure the email address belonging to your personal Bitrise account is also registered to your SAML identity provider. + +For detailed information on how to set it up, see: [Configuring SAML SSO on Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise). diff --git a/docs/bitrise-platform/accounts/deleting-your-bitrise-account.mdx b/docs/bitrise-platform/accounts/deleting-your-bitrise-account.mdx new file mode 100644 index 0000000..be00d1a --- /dev/null +++ b/docs/bitrise-platform/accounts/deleting-your-bitrise-account.mdx @@ -0,0 +1,22 @@ +--- +title: "Deleting your Bitrise account" +description: "We’re always sad to see you go but if you wish to delete your Bitrise account, you can do so from the Profile settings." +sidebar_position: 8 +slug: /bitrise-platform/accounts/deleting-your-bitrise-account +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToYourProfileSettings from '@site/src/partials/getting-to-your-profile-settings.mdx'; + +We’re always sad to see you go but if you wish to delete your Bitrise account, it’s quite simple. + +:::caution[Workspace ownership] + +If you are the only confirmed owner of a Workspace, you must transfer the ownership of the Workspace to another account, or delete it before deleting your account. + +::: + +1. +1. On the bottom of the **Profile** page, click the **Delete account** button and follow the instructions. diff --git a/docs/bitrise-platform/accounts/editing-your-profile-settings.mdx b/docs/bitrise-platform/accounts/editing-your-profile-settings.mdx new file mode 100644 index 0000000..c25cb12 --- /dev/null +++ b/docs/bitrise-platform/accounts/editing-your-profile-settings.mdx @@ -0,0 +1,25 @@ +--- +title: "Editing your profile settings" +description: "You can edit your profile settings, such as your username, password, account avatar, etc., on the Profile settings page." +sidebar_position: 3 +slug: /bitrise-platform/accounts/editing-your-profile-settings +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UnselectingNotificationPreferences from '@site/src/partials/unselecting-notification-preferences.mdx'; +import Partial_AddingAnAvatarToYourAccount from '@site/src/partials/adding-an-avatar-to-your-account.mdx'; +import Partial_ChangingYourBitriseUsernameEmailAndPassword from '@site/src/partials/changing-your-bitrise-username-email-and-password.mdx'; + +On the **Profile settings** page, you can: + +- Change your username and associated email address. +- Change your password. +- Update your personal and company information. + + + + + + diff --git a/docs/bitrise-platform/accounts/github-token-scanning.md b/docs/bitrise-platform/accounts/github-token-scanning.md new file mode 100644 index 0000000..96812df --- /dev/null +++ b/docs/bitrise-platform/accounts/github-token-scanning.md @@ -0,0 +1,23 @@ +--- +title: "GitHub token scanning" +description: "Bitrise is a partner of GitHub's secret scanning program: GitHub scans repositories for known secret formats to prevent fraudulent use of credentials that were committed accidentally." +sidebar_position: 7 +slug: /bitrise-platform/accounts/github-token-scanning +--- + +Bitrise is a partner of [GitHub's secret scanning program](https://docs.github.com/en/code-security/secret-scanning/secret-scanning-partnership-program/secret-scanning-partner-program): GitHub scans repositories for known secret formats to prevent fraudulent use of credentials that were committed accidentally. + +Bitrise uses this scanning to look for your [personal access tokens](/en/bitrise-platform/accounts/personal-access-tokens.html) and [Workspace API tokens](/en/bitrise-platform/workspaces/workspace-api-token.html) in your repositories. If a scan finds either type of token committed to your repository, Bitrise sends you both an email and an in-app notification to remove it for security reasons. + +Scanning is automatically turned on if your tokens are in the correct format. No configuration is required. + +:::important[Regenerating tokens] + +If you generated your tokens before November 2024, regenerate them to make sure they are in the correct format. + +We recommend regenerating your tokens if you encounter any other issues, too. + +- [Regenerating a personal access token](/en/bitrise-platform/accounts/personal-access-tokens/regenerating-a-personal-access-token). +- [Regenerating a Workspace API token](/en/bitrise-platform/workspaces/workspace-api-token/regenerating-a-workspace-api-token). + +::: diff --git a/docs/bitrise-platform/accounts/index.md b/docs/bitrise-platform/accounts/index.md new file mode 100644 index 0000000..465b0dd --- /dev/null +++ b/docs/bitrise-platform/accounts/index.md @@ -0,0 +1,8 @@ +--- +title: "Accounts" +sidebar_position: 3 +slug: /bitrise-platform/accounts +sidebar_label: Account +--- + +Account diff --git a/docs/bitrise-platform/accounts/personal-access-tokens.mdx b/docs/bitrise-platform/accounts/personal-access-tokens.mdx new file mode 100644 index 0000000..58d4298 --- /dev/null +++ b/docs/bitrise-platform/accounts/personal-access-tokens.mdx @@ -0,0 +1,18 @@ +--- +title: "Personal access tokens" +description: "You can use a personal access token to authenticate to the Bitrise API. You can create a new personal access token at any time but once you created it, you can never view or copy its value again." +sidebar_position: 6 +slug: /bitrise-platform/accounts/personal-access-tokens +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RegeneratingAPersonalAccessToken from '@site/src/partials/regenerating-a-personal-access-token.mdx'; +import Partial_CreatingAPersonalAccessToken from '@site/src/partials/creating-a-personal-access-token.mdx'; + +You can use a personal access token to authenticate to the Bitrise API. You can create a new personal access token at any time but once you created it, you can never view or copy its value again. + + + + diff --git a/docs/bitrise-platform/accounts/resetting-your-password.md b/docs/bitrise-platform/accounts/resetting-your-password.md new file mode 100644 index 0000000..23bb93d --- /dev/null +++ b/docs/bitrise-platform/accounts/resetting-your-password.md @@ -0,0 +1,28 @@ +--- +title: "Resetting your password" +description: "If you forgot your password, you can reset it by clicking on the Forgot your Password on the Bitrise Login page. You will receive an email with further instructions." +sidebar_position: 4 +slug: /bitrise-platform/accounts/resetting-your-password +--- + +You can log into Bitrise in many ways: + +- with your Bitrise username and password +- with your Gitlab/Github/Bitbucket account +- with your Bitrise Workspace name if SAML SSO has been set up to and enforced on your Bitrise Workspace + +If you try to log in but you forgot your password: + +1. Click **Forgot your password** on our [Login page](https://app.bitrise.io/users/sign_in). +1. Provide your **Email** or **Username** so that we know where to send password recovery link. +1. Check your inbox for the **Reset password instructions** sent by letsconnect. +1. Click **Reset Password** or copy the URL into your browser. +1. Add your new password and hit **Save**. +1. Once your password has been changed, click **Log in** to access our login page again. +1. Add your **Username** and new **Password** to log into your Bitrise Dashboard. + +If you failed to log in for the third time, [reCAPTCHA](https://developers.google.com/recaptcha/) will get enabled to check if you are a human. + +If you failed to log in for an excessive amount of attempts, you will automatically get locked out. Check your inbox for our **Unlock Instructions** email! + +![Resetting_your_password.png](/img/_paligo/uuid-6466da39-be6a-66e4-fc28-662201fbb0b2.png) diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/_category_.json b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/_category_.json new file mode 100644 index 0000000..85900f5 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "SAML SSO on Bitrise", + "position": 2, + "description": "Velocity and Enterprise users can create and log in to a Bitrise workspace using their own SAML SSO provider\u2019s system to provide an extra layer of security.", + "link": null +} diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.mdx new file mode 100644 index 0000000..058e512 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.mdx @@ -0,0 +1,38 @@ +--- +title: "Configuring SAML SSO on Bitrise" +description: "Workspace members can log in to a Bitrise workspace using their own SAML SSO provider’s system. With SAML SSO, workspaces will be able to apply the security guidelines of their SAML SSO provider when accessing their Bitrise workspace." +sidebar_position: 1 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UpdatingSAMLSSOConfiguration from '@site/src/partials/updating-saml-sso-configuration.mdx'; +import Partial_AddingANewUserToAWorkspaceWithEnforcedSAMLSSO from '@site/src/partials/adding-a-new-user-to-a-workspace-with-enforced-saml-sso.mdx'; +import Partial_CheckingSAMLSSOStatusesOnBitrise from '@site/src/partials/checking-saml-sso-statuses-on-bitrise.mdx'; +import Partial_DisablingAWorkspaceMemberSSAMLSSO from '@site/src/partials/disabling-a-workspace-members-saml-sso.mdx'; +import Partial_SettingUpSAMLSSOForABitriseWorkspace from '@site/src/partials/setting-up-saml-sso-for-a-bitrise-workspace.mdx'; +import Partial_DisablingAWorkspaceSSAMLSSO from '@site/src/partials/disabling-a-workspaces-saml-sso.mdx'; +import Partial_EnforcingSAMLSSOOnAWorkspace from '@site/src/partials/enforcing-saml-sso-on-a-workspace.mdx'; +import Partial_VerifiedDomain from '@site/src/partials/verified-domain.mdx'; + +Workspace members can log in to a Bitrise workspace using their own SAML SSO provider’s system. With SAML SSO, workspaces will be able to apply the security guidelines of their SAML SSO provider when accessing their Bitrise workspace. + +SAML SSO can also be enforced on a workspace: enforcing makes SAML SSO the only way for logging in to the workspace. + + + + + + + + + + + + + + + + diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.mdx new file mode 100644 index 0000000..4107a4e --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.mdx @@ -0,0 +1,31 @@ +--- +title: "Configuring SCIM" +description: "The System for Cross-domain Identity Management (SCIM) specification is designed to make managing user identities in cloud-based applications and services easier. On Bitrise, SCIM provisioning is supported for [Okta](https://www.okta.com/) and [Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity/)." +sidebar_position: 3 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkspaceSettingsPage from '@site/src/partials/opening-the-workspace-settings-page.mdx'; + +The System for Cross-domain Identity Management (SCIM) specification is designed to make managing user identities in cloud-based applications and services easier. + +On Bitrise, SCIM provisioning is supported for [Okta](https://www.okta.com/) and [Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity/). + +SCIM provisioning requires a verified domain, and SCIM credentials: a SCIM base URL and an authentication token. The process of configuring these on Bitrise is the same for both Okta and Entra ID. + +1. +1. On the left, select **Single sign-on**. +1. [Set up a verified domain](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise/verified-domain). +1. Select the **SCIM** tab. +1. In the **SCIM credentials** section, click **Generate SCIM credentials** to open the SCIM credentials dialog box. +1. Save your SCIM credentials. In the dialog box, you will see: + + - Your SCIM base URL. + - Your SCIM authentication token. + + Copy and save both. You need them for SCIM provisioning. + + For Okta, check out our [SCIM provisioning guide](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise/setting-up-scim-provisioning-in-okta). diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/index.md b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/index.md new file mode 100644 index 0000000..d81d9a9 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/index.md @@ -0,0 +1,30 @@ +--- +title: "SAML SSO in Bitrise" +description: "Velocity and Enterprise users can create and log in to a Bitrise workspace using their own SAML SSO provider’s system to provide an extra layer of security." +sidebar_position: 2 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise +sidebar_label: SAML SSO on Bitrise +--- + +Workspace members can log in to a Bitrise workspace using their own SAML SSO provider’s system. With SAML SSO, workspaces will be able to apply the security guidelines of their SAML SSO provider when accessing their Bitrise workspace: [Configuring SAML SSO on Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise). + +For users, logging in via SAML SSO eliminates the need for providing an email address and passwords: [Logging in via SAML SSO](/en/bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso). + +You can also configure SCIM to to make managing user identities in cloud-based applications and services easier. SCIM provisioning requires a verified domain and SCIM credentials: [Configuring SCIM](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim). + +:::note[Plans and pricing] + +To check whether SAML SSO is available on your plan, check [our pricing page](https://bitrise.io/pricing)! + +::: + +We support multiple different identity providers and have detailed guides for all of them: + +- [Setting up AD FS SSO for Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise) +- [Setting up Auth0 SSO for Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise) +- [Setting up Azure AD SSO for Bitrise](/en/bitrise-docs-20/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise) +- [Setting up Google SSO for Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise) +- [Setting up Idaptive SAML SSO for Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise) +- [Setting up Okta SSO for Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise) +- [Setting up OneLogin SSO for Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise) +- [Setting up Ping Identity SSO for Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise) diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso.mdx new file mode 100644 index 0000000..2fa336f --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso.mdx @@ -0,0 +1,59 @@ +--- +title: "Logging in via SAML SSO" +description: "You can log in via SAML SSO if a workspace with [a working SAML SSO configuration](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.html) added you as [a member](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration). With a SAML SSO login, you don't need an email address and a password." +sidebar_position: 2 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::note[Adding new users to workspaces with enforced SAML SSO] + +This page is for users trying to log in via SAML SSO after getting an invite. For workspace admins looking to add users to workspaces that have SAML SSO enforced, check out [Adding a new user to a Workspace with enforced SAML SSO](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise/adding-a-new-user-to-a-workspace-with-enforced-saml-sso). + +::: + +You can log in via SAML SSO if a workspace with [a working SAML SSO configuration](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.html) added you as [a member](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration). With a SAML SSO login, you don't need an email address and a password. + +The exact process depends on how SAML SSO is configured for the workspace and whether the workspace has a [verified domain](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.html). + +## Logging in via SAML for new users + +1. Open the Bitrise [sign-up](https://app.bitrise.io/users/sign_up) page and click **Sign up with SSO**. +1. Enter your work email address and click **Continue with SSO**. + + ![sign-up-saml.png](/img/_paligo/uuid-d696a899-d634-978b-1d7d-037f0a01ee5b.png) +1. Follow the instructions: + + - If your workspace has a [verified domain](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.html) matching your email's domain, you will be redirected to log in to the identity provider. After logging in, you will be redirected to Bitrise: provide a username and click **Finalize account**. You will receive an email with a confirmation link. + - If your workspace doesn't have a verified domain or if it doesn't match your email's domain, you will be asked to check your inbox. An email is sent with a secure login link that contains the available workspaces that use SAML SSO. To finish signing in to the workspaces, click the links in the email. You will be redirected to Bitrise to enter your username and finalize the account. + + :::note[SAML SSO unavailable] + + If you haven't been invited to a workspace and no workspace has your email domain verified, you will receive an error message at this stage that states you tried to use SAML SSO without a valid target. You can only sign up or log in without SSO. + + ::: + +## Logging in to SAML SSO for existing users + +If a workspace switches to using SAML SSO to log in, members might need to authorize SAML SSO separately, depending on the workspace configuration. + +1. Open the [Bitrise login](https://app.bitrise.io/users/sign_in) page. +1. Click **Continue with SSO**. +1. Enter your email address. +1. Follow the instructions: + + - If your workspace has a [verified domain](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.html) matching your email's domain, you will be redirected to the identity provider's site to log in. After successfully logging in, you will be redirected to Bitrise. + - If your workspace doesn't have a verified domain or if it doesn't match your email's domain, you will need to authorize SAML SSO before logging in. When the workspace enabled SAML SSO, you received a confirmation email: find this email and click **Authorize SSO access**. Alternatively, if you are already logged in when SAML SSO is enabled, you will see the authorization screen on the website itself. + +## Multiple workspaces with the same verified domain + +When a new user tries to log in via SSO the first time, Bitrise looks for a verified domain matching the user's email domain. If multiple workspaces share the same verified domain, Bitrise might not automatically be able to redirect a new user to the correct workspace. In this case, you will receive an email stating that we couldn't find an existing workspace associated with that address in our system. + +We recommend one of the following workarounds: + +- **Launch Bitrise directly from the identity provider's site**: For example, create a tile in Okta for Bitrise and use that to log in. In this way, the user will be redirected to the correct workspace. +- **Add the user to the correct Workspace**: A workspace owner should add the user as a member to the workspace they need before attempting to log in: [Workspace collaboration](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration). +- **Find and copy the login URL from the Workspace settings page**: Open the page, select **Single Sign-on** on the left, and go to the **SAML SSO** tab. Find the **Login URL to the Workspace** and click **Copy**. diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise.mdx new file mode 100644 index 0000000..f61ac60 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise.mdx @@ -0,0 +1,42 @@ +--- +title: "Setting up AD FS SSO for Bitrise" +description: "Add SAML SSO to your Bitrise Workspace using Microsoft Active Directory Federation Services." +sidebar_position: 4 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AddingTheIdentityProviderSignOnURL from '@site/src/partials/adding-the-identity-provider-sign-on-url.mdx'; +import Partial_ExportingAnADFSCertificate from '@site/src/partials/exporting-an-ad-fs-certificate.mdx'; +import Partial_SAMLSSOBeforeYouStart from '@site/src/partials/saml-sso-before-you-start.mdx'; +import Partial_CAUTIONSAMLSSORestrictions from '@site/src/partials/caution-saml-sso-restrictions.mdx'; +import Partial_ConfiguringClaimRules from '@site/src/partials/configuring-claim-rules.mdx'; +import Partial_AddingBitriseAsARelyingPartyTrustToADFS from '@site/src/partials/adding-bitrise-as-a-relying-party-trust-to-ad-fs.mdx'; + +This guide provides step-by-step instructions on setting up SAML SSO using [Microsoft Active Directory Federation Services](https://docs.microsoft.com/en-us/windows-server/identity/active-directory-federation-services) (AD FS). + + + +Before connecting SAML SSO to your Workspace: + +- Make sure the AD FS administrator is at hand during the SAML SSO configuration process. +- + +In this tutorial we will be jumping back and forth between Bitrise and AD FS so it is recommended that both tools are available during this process. + +To configure SAML SSO with AD FS, you'll need to: + +1. [Add the **Identity provider sign-on URL** from AD FS on Bitrise](#N1634909054878). +1. [Export a certificate generated by AD FS and add it on Bitrise](#UUID-21ee6750-1150-cc58-58f6-69935e84aab7). +1. [Add Bitrise as a relying party trust to AD FS](#UUID-c508edfd-be98-e02b-c337-a24b9e0f19ea). +1. [Configure claim rules](#UUID-bb90ca91-8ed6-df95-d070-a8691a9f1ce3). + + + + + + + + diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise.mdx new file mode 100644 index 0000000..a15b387 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise.mdx @@ -0,0 +1,36 @@ +--- +title: "Setting up Auth0 SSO for Bitrise" +description: "Add SAML SSO to your Bitrise Workspace using Auth0." +sidebar_position: 5 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CreatingBitriseAsAWebApplicationOnAuth0 from '@site/src/partials/creating-bitrise-as-a-web-application-on-auth0.mdx'; +import Partial_SettingUpAMappingRuleForYourBitriseAppSClientID from '@site/src/partials/setting-up-a-mapping-rule-for-your-bitrise-apps-client-id.mdx'; +import Partial_SAMLSSOBeforeYouStart from '@site/src/partials/saml-sso-before-you-start.mdx'; +import Partial_CAUTIONSAMLSSORestrictions from '@site/src/partials/caution-saml-sso-restrictions.mdx'; +import Partial_RetrievingSAMLSSOInformationFromAuth0 from '@site/src/partials/retrieving-saml-sso-information-from-auth0.mdx'; + +This guide provides instructions on setting up SAML SSO using [Auth0](https://auth0.com). + + + +Before connecting SAML SSO to your Workspace: + +- An Auth0 administrator who is logged into Auth0 is at hand. +- + +You will need to: + +1. [Create Bitrise as a web application on Auth0](#UUID-1a93225f-4206-5a6c-e8d4-f7f19d39c562). +1. [Retrieve SAML SSO information from Auth0](#UUID-938da393-7cf0-7f97-1ad5-5103c02e47fa). +1. [Setting up a mapping rule for your Bitrise app's Client ID](#UUID-5ad937bd-80dd-5e14-c301-eafa0b61f775). + + + + + + diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise.mdx new file mode 100644 index 0000000..13f373a --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise.mdx @@ -0,0 +1,35 @@ +--- +title: "Setting up Azure AD SSO for Bitrise" +description: "Add SAML SSO to your Bitrise Workspace using Microsoft Entra ID." +sidebar_position: 6 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise +sidebar_label: Setting up Entra ID (former Azure AD) SSO for Bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingUpSAMLSSOBetweenBitriseAndAzureAD from '@site/src/partials/setting-up-saml-sso-between-bitrise-and-azure-ad.mdx'; +import Partial_AddingBitriseToAzureADAsANewApplication from '@site/src/partials/adding-bitrise-to-azure-ad-as-a-new-application.mdx'; +import Partial_SAMLSSOBeforeYouStart from '@site/src/partials/saml-sso-before-you-start.mdx'; +import Partial_AddingUsersGroupsToTheAppOnAzureAD from '@site/src/partials/adding-users-groups-to-the-app-on-azure-ad.mdx'; +import Partial_CAUTIONSAMLSSORestrictions from '@site/src/partials/caution-saml-sso-restrictions.mdx'; + + + +Before connecting SAML SSO to your Workspace: + +- Make sure an Entra ID administrator who is logged into Entra ID is at hand. +- + +You will need to: + +1. [Add Bitrise to Entra ID as a new application](#UUID-2b28c9c0-a414-77f8-3856-45a4948cba07). +1. [Add users and groups to the Bitrise app on Entra ID](#UUID-82bcb618-a90d-e704-d87c-a422c14a3950). +1. [Set up SAML SSO between Bitrise and Entra ID](#UUID-0d2aba0c-a421-2a54-1f26-34077b134c12). + + + + + + diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise.mdx new file mode 100644 index 0000000..5c87706 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise.mdx @@ -0,0 +1,32 @@ +--- +title: "Setting up Google SSO for Bitrise" +description: "Add SAML SSO to your Bitrise Workspace using Google Workspace." +sidebar_position: 7 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SAMLSSOBeforeYouStart from '@site/src/partials/saml-sso-before-you-start.mdx'; +import Partial_EnablingBitriseAppForAGroupOrAnOrganizationalUnit from '@site/src/partials/enabling-bitrise-app-for-a-group-or-an-organizational-unit.mdx'; +import Partial_CAUTIONSAMLSSORestrictions from '@site/src/partials/caution-saml-sso-restrictions.mdx'; +import Partial_GettingConfigurationInformationFromGSuiteAndBitrise from '@site/src/partials/getting-configuration-information-from-g-suite-and-bitrise.mdx'; + +This guide provides step-by-step instructions on setting up Bitrise as a SAML application on Google Workspace. + + + +Before connecting SAML SSO to your Workspace: + +- Make sure you have a Google administrator account where you can add Bitrise as a SAML app. The Google Workspace administrator can help setting up SAML SSO on Google Workspace. +- + +You'll need to: + +1. [Get configuration information from Google Workspace and Bitrise.](#UUID-de5e723b-c807-4ddf-2972-9c3a6e06566e) +1. [Enable the Bitrise app for a group or an organizational unit.](#UUID-70891c9c-c28f-4c32-1d5a-f7b22cb9d74b) + + + + diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise.mdx new file mode 100644 index 0000000..abf7538 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise.mdx @@ -0,0 +1,54 @@ +--- +title: "Setting up Idaptive SAML SSO for Bitrise" +description: "Add SAML SSO to your Bitrise Workspace using Idaptive." +sidebar_position: 8 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SAMLSSOBeforeYouStart from '@site/src/partials/saml-sso-before-you-start.mdx'; +import Partial_CAUTIONSAMLSSORestrictions from '@site/src/partials/caution-saml-sso-restrictions.mdx'; + +This guide provides step-by-step instructions on setting up Bitrise as a SAML application on [Idaptive](https://www.idaptive.com/). + + + +Before connecting SAML SSO to your Workspace: + +- +- You must be logged into your Admin Portal on [Idaptive](https://www.idaptive.com/) to set up Bitrise as a SAML SSO app and establish the connection between Bitrise and Idaptive. If you are using the **User Portal**, **Switch to** **Admin Portal** by clicking your avatar on Idaptive. + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg](/img/_paligo/uuid-27ceb4dd-22a3-a162-b569-73261ba2fef7.jpg) + +1. Log into Idaptive as an Admin. +1. Go to **Apps,** then to **Web Apps**. Click the **Add Web Apps** button on the right. + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.png](/img/_paligo/uuid-9d5b8607-e8f3-2fa7-aa78-8891c184533e.png) +1. On the **Custom** tab and select **SAML**, and click **Add**. On the **Add Web App** popup hit **Yes**. **Close** the window. You will be automatically directed to the **Settings** page. + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.png](/img/_paligo/uuid-7389987f-3a26-24d3-6298-787eb51002e0.png) +1. Add Bitrise to the **Name** and **Application ID** fields on the **Settings** page and click **Save**. + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg](/img/_paligo/uuid-81638e95-5198-7da7-ecb8-f2d9835f64be.jpg) + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg](/img/_paligo/uuid-175bfd17-e0a5-d198-a2f9-36dc24735c28.jpg) +1. Click **Trust** on the left menu bar and select the **Manual configuration** under **Identity Provider Configuration**. +1. Click the **Signing Certificate** dropdown and download the certificate. Open it with a text editor so that you can copy the full content of the certificate. You can also upload the file. + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg](/img/_paligo/uuid-904a51d4-081b-8a05-0b56-3522007e3a46.jpg) +1. Insert the content or upload the file itself in the **SAML SSO provider certificate** text box on the **Enable Single Sign-On** page of Bitrise. +1. Copy the **Single Sign On URL** from the **Trust** page of Idaptive. Insert it on the **SAML SSO provider Single Sing-On URL (SSO URL)** field on the **Enable Single Sign-On** page of Bitrise. +1. While on the **Single Sign-On page** of Bitrise, copy the **Assertion Consumer Service URL (ACS URL)** URL and click **Configure SSO**. +1. Now let’s head back to Idaptive! Under **Service Provider Configuration** click **Manual Configuration**. Type **Bitrise** in the **SP Entity ID / Issuer / Audience** and paste the **Assertion Consumer Service URL (ACS URL)** from Bitrise to the **Assertion Consumer Service (ACS) URL** on Idaptive. + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg](/img/_paligo/uuid-97ca8e78-eae6-ff2b-f6b5-523718161a8e.jpg) +1. Scroll down to **NameID Format** and select **emailAddress**. Click **Save**. + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg](/img/_paligo/uuid-5b529235-9f88-8b16-64c4-9438f3cc9498.jpg) +1. Go to **Permissions** and click the **Add** button. In the **Select User, Group, or Role** popup, type the user name you want to add to the SAML app. Select it and hit **Add**. Save your changes. This will change the status of your Bitrise SAML app to **Deployed**. + + ![Setting_up_Idaptive_SAML_SSO_for_Bitrise.png](/img/_paligo/uuid-fb6f7300-1ac4-523d-0a04-b6c2850e5621.png) + +You are now ready to use Idaptive as your SAML SSO provider on Bitrise. diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise.mdx new file mode 100644 index 0000000..f24d576 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise.mdx @@ -0,0 +1,40 @@ +--- +title: "Setting up Okta SSO for Bitrise" +description: "Add SAML SSO to your Bitrise Workspace using Okta." +sidebar_position: 9 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingUpSCIMProvisioningInOkta from '@site/src/partials/setting-up-scim-provisioning-in-okta.mdx'; +import Partial_AddingBitriseToOkta from '@site/src/partials/adding-bitrise-to-okta.mdx'; +import Partial_SynchronizingGroupsAndUsersBetweenOktaAndBitrise from '@site/src/partials/synchronizing-groups-and-users-between-okta-and-bitrise.mdx'; +import Partial_SAMLSSOBeforeYouStart from '@site/src/partials/saml-sso-before-you-start.mdx'; +import Partial_ConfiguringBitriseAsASAMLAppForOkta from '@site/src/partials/configuring-bitrise-as-a-saml-app-for-okta.mdx'; +import Partial_CAUTIONSAMLSSORestrictions from '@site/src/partials/caution-saml-sso-restrictions.mdx'; +import Partial_PushingOktaGroupsToBitriseUsingSCIM from '@site/src/partials/pushing-okta-groups-to-bitrise-using-scim.mdx'; + +This guide provides step-by-step instructions on setting up Bitrise as a SAML application on [Okta](https://www.okta.com/). + + + +Before connecting SAML SSO to your Workspace: + +- Make sure you have an Okta administrator who is logged into Okta at hand. +- + +1. [Add Bitrise to Okta](#UUID-26bfa809-15ef-524d-3251-de7df446bf2d). +1. [Configure Bitrise as a SAML app](#UUID-8713b566-8a20-bd3c-deda-1e59badceb1c). +1. [Set up SCIM previsioning in Okta](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise/setting-up-scim-provisioning-in-okta). + + + + + + + + + + diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise.mdx new file mode 100644 index 0000000..e5dad23 --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise.mdx @@ -0,0 +1,56 @@ +--- +title: "Setting up OneLogin SSO for Bitrise" +description: "Add SAML SSO to your Bitrise Workspace using OneLogin." +sidebar_position: 10 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SAMLSSOBeforeYouStart from '@site/src/partials/saml-sso-before-you-start.mdx'; +import Partial_CAUTIONSAMLSSORestrictions from '@site/src/partials/caution-saml-sso-restrictions.mdx'; + +This guide provides step-by-step instructions on setting up Bitrise as a SAML application on [OneLogin](https://www.onelogin.com/). + + + +Before connecting SAML SSO to your Workspace: + +- Make sure the administrator to OneLogin is at hand while setting up SAML SSO connection on Bitrise. +- + +To configure Bitrise on OneLogin: + +1. Log into [OneLogin](https://www.onelogin.com/) as an Administrator. +1. Click **Administration** on the top bar. + + ![Setting_up_OneLogin_SSO_for_Bitrise.png](/img/_paligo/uuid-e05bd9fd-2b96-f6dd-9d2b-b3ad8ba5510e.png) +1. Select **Applications** and click **Add App**. This will take you to the **Find Applications** page. + + ![Setting_up_OneLogin_SSO_for_Bitrise.png](/img/_paligo/uuid-90d0f8f9-8de5-2c9c-f8e7-2279dc5d48ef.png) +1. Type `Bitrise` in the search bar and select the **SAML2.0** type from the search results. + + ![Setting_up_OneLogin_SSO_for_Bitrise.jpg](/img/_paligo/uuid-ba3b2ff2-116c-1ae2-0e8d-72c0e73826ee.jpg) +1. Click the **Configuration** tab on the left sidebar. You can change the icon and add descriptions if you wish. Make sure **Organization (Bitrise)** is ticked. Hit **Save**. + + ![Setting_up_OneLogin_SSO_for_Bitrise.jpg](/img/_paligo/uuid-97037eee-6e35-4a1f-1e4e-a252c78b2317.jpg) +1. Click the **Configuration** tab again and paste the **Assertion Consumer Service URL (ACS URL)** from your Bitrise Workspace’s **Single Sign-On** tab to the **Single Sign-On URL** field on OneLogin. Hit **Save** in **OneLogin**. + + ![Setting_up_OneLogin_SSO_for_Bitrise.jpg](/img/_paligo/uuid-74f65dc6-6662-db11-e97a-9ba3d039cea9.jpg) +1. Select **SSO** on the left sidebar. +1. Click the **View details** for the X.509 Certificate. Copy the content of the **X.509 Certificate** and paste it to the **SAML SSO provider certificate** field on the **Enable Single Sign-On** page of Bitrise. +1. Go back to the **SSO** page on OneLogin and copy the **SAML 2.0 Endpoint (HTTP)** link. Paste it in the **SAML SSO provider Single Sign-On URL (SSO URL)** field on Bitrise. +1. Go back to Bitrise and click **Configure SSO**. + + ![enablesinglesignonpage.png](/img/_paligo/uuid-11509388-3538-06e7-23f3-7ef27a956386.png) + +:::important[Users on OneLogin and Bitrise] + +Make sure the users in your Bitrise Workspace are all added to the **Users** page on OneLogin. If not, go to **Users**, then **New User** and add the new user. Don’t forget to send out an invite (**More actions** drop-down menu, **Send Invitation**) to a new user so that the user can activate their account on OneLogin. Users must be added to the newly created Bitrise app by clicking **Applications** under **User Info** and clicking the **+** sign. Make sure the added users are all Workspace members on Bitrise. + +![application-onelogin.jpg](/img/_paligo/uuid-f6505a6f-5c4e-7cf1-8a81-f8325898b1be.jpg) + +::: + +If you’ve completed setting up Bitrise on OneLogin and connected it with your Bitrise Workspace, then all Workspace members will get an email from Bitrise which contains a link to activate their SSO connection to the Bitrise Workspace. diff --git a/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise.mdx b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise.mdx new file mode 100644 index 0000000..07bb8ea --- /dev/null +++ b/docs/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise.mdx @@ -0,0 +1,60 @@ +--- +title: "Setting up Ping Identity SSO for Bitrise" +description: "Add SAML SSO to your Bitrise Workspace using Ping Identity." +sidebar_position: 11 +slug: /bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SAMLSSOBeforeYouStart from '@site/src/partials/saml-sso-before-you-start.mdx'; +import Partial_CAUTIONSAMLSSORestrictions from '@site/src/partials/caution-saml-sso-restrictions.mdx'; + +This guide provides step-by-step instructions on setting up Bitrise as a SAML SSO application in [Ping Identity](https://www.pingidentity.com/en.html). + + + +Before connecting SAML SSO to your Workspace: + +- A PingOne administrator who is logged into [PingOne](https://admin.pingone.com/web-portal/login). +- + +To add Bitrise to Ping Identity: + +1. Click **APPLICATIONS** on the top bar of [PingOne](https://admin.pingone.com/web-portal/login). +1. On **My Applications** tab, make sure **SAML** is selected. Click the **Add Application** drop-down and select **New SAML Application**. + + ![Setting_up_Ping_Identity_SSO_for_Bitrise.jpg](/img/_paligo/uuid-ba20e7c6-49cf-1ec0-ca6a-5630eb89c357.jpg) +1. At **Application Details,** fill out the required fields and click **Continue to Next Step**. + + ![Setting_up_Ping_Identity_SSO_for_Bitrise.jpg](/img/_paligo/uuid-6ebb926e-6275-81b7-fdb8-559128c87944.jpg) +1. At **Application Configuration**, leave the **I have the SAML configuration** selected. Fill out the following: + + - **Assertion Consumer Service (ACS)** field: Insert the **Assertion Consumer Service URL (ACS URL)** link here from your Bitrise Workspace’s **Single Sign-On** tab. + + ![enablesinglesignonpage.png](/img/_paligo/uuid-11509388-3538-06e7-23f3-7ef27a956386.png) + - **Entity ID field**: Type `Bitrise`. + - **Signing**: Click the **Sign Response** option. + + Here is an overview of the above settings: ![Setting_up_Ping_Identity_SSO_for_Bitrise.jpg](/img/_paligo/uuid-b3f12826-15e7-22c6-5688-9f3be3f519fd.jpg) +1. Continue to the next step. +1. At **SSO Attribute Mapping**, you don’t have to change anything, proceed to the next step. +1. At **Group Access**, add the group(s) to your application. These groups will be able to access Bitrise through SAML SSO. Continue to the next step. + + ![Setting_up_Ping_Identity_SSO_for_Bitrise.jpg](/img/_paligo/uuid-cfafb8d7-1a0e-d967-5609-385cc5db90e2.jpg) +1. At the **Review Setup** page, you can doublecheck the details you provided in the previous steps. Make sure you download the following files from this review page: + + - Click **Download** to get the **Signing Certificate** and **SAML Metadata** files. + + ![Setting_up_Ping_Identity_SSO_for_Bitrise.jpg](/img/_paligo/uuid-d626ceb8-0cf3-d459-5cd7-9e59e0fef81a.jpg) +1. Click **Finish**. +1. Let’s open the two files. + + - Copy the entire content of the **SAML Metadata** file and paste it in the **SAML SSO provider** **certificate** field of your Bitrise **Single Sign-On** page. + - Open the **Signing Certificate** file and copy the `HTTP-POST` `SingleSignOnService Location` link and paste it in the **SAML SSO provider Single Sign-On URL (SSO URL)** field on Bitrise. + + ![enablesinglesignonpage.png](/img/_paligo/uuid-11509388-3538-06e7-23f3-7ef27a956386.png) +1. Click **Configure SSO** on Bitrise. + +Now you have set up SAML SSO on your Bitrise Workspace. diff --git a/docs/bitrise-platform/accounts/two-factor-authentication.mdx b/docs/bitrise-platform/accounts/two-factor-authentication.mdx new file mode 100644 index 0000000..2e78190 --- /dev/null +++ b/docs/bitrise-platform/accounts/two-factor-authentication.mdx @@ -0,0 +1,23 @@ +--- +title: "Two-factor authentication" +description: "You can add two-factor authentication (2FA) on Bitrise as an extra layer of security from the Profile settings." +sidebar_position: 5 +slug: /bitrise-platform/accounts/two-factor-authentication +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_HaveYouLostYourAuthenticatorAndRecoveryCodes from '@site/src/partials/have-you-lost-your-authenticator-and-recovery-codes.mdx'; +import Partial_DisablingTwoFactorAuthentication from '@site/src/partials/disabling-two-factor-authentication.mdx'; +import Partial_EnablingTwoFactorAuthentication from '@site/src/partials/enabling-two-factor-authentication.mdx'; + +We provide an extra layer of security to your account if you enable two-factor authentication (2FA) on your Bitrise account. + +We recommend that you check your connected accounts (GitHub, Bitbucket, GitLab) and enable 2FA if you haven’t already. + + + + + + diff --git a/docs/bitrise-platform/ai/_category_.json b/docs/bitrise-platform/ai/_category_.json new file mode 100644 index 0000000..23a8e04 --- /dev/null +++ b/docs/bitrise-platform/ai/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "AI", + "position": 9, + "link": null +} diff --git a/docs/bitrise-platform/ai/ai-faq-how-bitrise-leverages-ai-technologies-in-its-features-and-services.mdx b/docs/bitrise-platform/ai/ai-faq-how-bitrise-leverages-ai-technologies-in-its-features-and-services.mdx new file mode 100644 index 0000000..c338a62 --- /dev/null +++ b/docs/bitrise-platform/ai/ai-faq-how-bitrise-leverages-ai-technologies-in-its-features-and-services.mdx @@ -0,0 +1,52 @@ +--- +title: "AI FAQ – How Bitrise leverages AI technologies in its features and services" +description: "Bitrise leverages AI and large language models responsibly by classifying customer data to ensure security and privacy, using only anonymized or non-sensitive data for training and analysis. Customers can control AI feature usage across their organization, with AI augmenting human decision-making without replacing it." +sidebar_position: 1 +slug: "/bitrise-platform/ai/ai-faq---how-bitrise-leverages-ai-technologies-in-its-features-and-services" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_WhichLargeLanguageModelsLLMsDoesBitriseUse from '@site/src/partials/which-large-language-models-llms-does-bitrise-use.mdx'; +import Partial_HowIsCustomerDataUsedWithAIOnBitrise from '@site/src/partials/how-is-customer-data-used-with-ai-on-bitrise.mdx'; +import Partial_DoesBitriseRetainCustomerDataForTraining from '@site/src/partials/does-bitrise-retain-customer-data-for-training.mdx'; +import Partial_WhoOwnsTheIntellectualPropertyGeneratedByLLMs from '@site/src/partials/who-owns-the-intellectual-property-generated-by-llms.mdx'; +import Partial_IsItPossibleToDisableAIFeaturesOnBitrise from '@site/src/partials/is-it-possible-to-disable-ai-features-on-bitrise.mdx'; +import Partial_WhereDoesBitriseRunItsLLMInference from '@site/src/partials/where-does-bitrise-run-its-llm-inference.mdx'; +import Partial_WhichBitriseFeaturesUseAILLMs from '@site/src/partials/which-bitrise-features-use-aillms.mdx'; +import Partial_HowOftenDoesBitriseUpdateItsAIModels from '@site/src/partials/how-often-does-bitrise-update-its-ai-models.mdx'; +import Partial_HowDoesBitriseApproachUsingAICapabilitiesInTheirServices from '@site/src/partials/how-does-bitrise-approach-using-ai-capabilities-in-their-services.mdx'; +import Partial_FurtherQuestionsInComplianceAndSecurity from '@site/src/partials/further-questions-in-compliance-and-security.mdx'; + +As AI technologies are getting more and more popular, we collected answers of the most frequent questions on how Bitrise is leveraging these technologies. In this article, you can find detailed information on how AI and LLM tools are supported across Bitrise features and services. + +## At a glance + +Artificial Intelligence (AI) and more specifically large language models (LLMs) are rapidly becoming essential tools across the tech industry. Bitrise is actively investing in these new technologies that can enhance our platform and deliver smarter, more efficient solutions to our customers. + +Security and reliability are paramount at Bitrise. We are dedicated to ensuring that our products or features using AI, like all our technologies, are employed responsibly and adhere to the industry standards. + +This document should help understand how Bitrise implements AI, how Customer Content (defined below) is categorized and how customers can make choices whether to use or not use the features where AI functions are implemented. + +Below we collected the most frequent questions we have received on how Bitrise is using AI technologies. We will update this document as we receive additional questions from customers. + + + + + + + + + + + + + + + + + + + + diff --git a/docs/bitrise-platform/ai/ai-features-on-bitrise.md b/docs/bitrise-platform/ai/ai-features-on-bitrise.md new file mode 100644 index 0000000..5dde95e --- /dev/null +++ b/docs/bitrise-platform/ai/ai-features-on-bitrise.md @@ -0,0 +1,54 @@ +--- +title: "AI features on Bitrise" +description: "Bitrise offers several AI features that you can toggle on and off at any time to enhance your Mobile DevOps processes." +sidebar_position: 2 +slug: /bitrise-platform/ai/ai-features-on-bitrise +--- + +:::tip[AI FAQ] + +This page offers a short summary of the available AI features on Bitrise. For a detailed breakdown of how Bitrise uses AI and how we handle customer data related to AI features, see the [AI FAQ](/en/bitrise-platform/ai/ai-faq---how-bitrise-leverages-ai-technologies-in-its-features-and-services.html). + +::: + +Bitrise offers multiple AI features to help enhance your Mobile DevOps processes. You can enable or disable any individual feature, or completely disable AI features altogether: [Enabling AI features on Bitrise](/en/bitrise-platform/ai/enabling-ai-features-on-bitrise). + +The following features are available: + +## Code reviewer + +The AI [code reviewer](/en/bitrise-platform/integrations/ai-code-reviewer.html) creates a comment every time a new pull request is opened on GitHub, and every time a user adds a new commit to the pull request. It can provide: + +- A summary: Highlights key code changes and their potential impact. +- Walkthrough: Generates context-aware documentation to help team members quickly understand code changes. +- Code review: Detects potential issues, suggests improvements, and enhances code quality. + +The code reviewer only works with a GitHub connection, either via the Bitrise GitHub app or an OAuth connection. + +:::note[Code reviewer and credit usage] + +You can enable the code reviewer on three projects if you have the [Pro or the Enterprise plans](https://bitrise.io/pricing). Running the code reviewer consumes one AI credit per review. + +If you need more projects or AI credits, go to **Workspace settings** →**Plan and billing** →**Bitrise AI** and subscribe to the add-on. For example, if you subscribe for an extra project, you will have 4 projects and an extra 100 AI credits along with your base plan AI credit. + +::: + +## AI build summary + +The [AI build summary](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.html) gives you a summary of why a CI build failed and suggests the fix right there on the build page. You can turn off the feature at any time. + +![2025-09-30-ai-summary.png](/img/_paligo/uuid-09bb51b3-e156-8f2e-4141-e71b46951f5c.png) + +## AI build fixer + +If you have a failed build, the [AI build fixer](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer.html) corrects it right on the build’s details page without you having to switch to other tools and processes. The AI build fixer executes the suggested code changes and pushes a PR to your GitHub repository. You can check the changes through a link to the repo. Based on your configured build triggers, Bitrise kicks off a new CI build to validate the AI changes. This means less fragmented work and quicker debugging. + +## Bitrise MCP + +The [Bitrise Model Context Protocol (MCP) Server](/en/bitrise-platform/ai/bitrise-mcp.html) lets you talk to Bitrise via an AI client of your choice. It enables seamless interaction with your existing CI setup. + +- Troubleshoot issues by directly asking about failure reasons. The AI analyzes logs and configurations, providing actionble recommendations. +- Optimize configurations by instructing the AI to suggest improvements. You will receive instant insights and practical suggestions. +- Automate manual tasks such as handling permissions, inviting members to a project, or looking for old builds. Tell the AI agent about your requirements: it will send you the proposed steps for review and ask for permission before executing each action. You can review the results at each step of the process. + +For now, the Bitrise MCP is supported for the Claude desktop app. You can find the [Bitrise MCP repository on GitHub](https://github.com/bitrise-io/bitrise-mcp). diff --git a/docs/bitrise-platform/ai/bitrise-mcp.md b/docs/bitrise-platform/ai/bitrise-mcp.md new file mode 100644 index 0000000..f356626 --- /dev/null +++ b/docs/bitrise-platform/ai/bitrise-mcp.md @@ -0,0 +1,20 @@ +--- +title: "Bitrise MCP" +description: "The Bitrise Model Context Protocol (MCP) Server lets you talk to Bitrise via an AI client of your choice. It enables seamless interaction with your existing CI setup, including troubleshooting and automation." +sidebar_position: 4 +slug: /bitrise-platform/ai/bitrise-mcp +--- + +The Bitrise Model Context Protocol (MCP) Server lets you talk to Bitrise via an AI client of your choice. It enables seamless interaction with your existing CI setup: + +- Troubleshoot issues by directly asking about failure reasons. The AI analyzes logs and configurations, providing actionble recommendations. +- Optimize configurations by instructing the AI to suggest improvements. You will receive instant insights and practical suggestions. +- Automate manual tasks such as handling permissions, inviting members to a project, or looking for old builds. Tell the AI agent about your requirements: it will send you the proposed steps for review and ask for permission before executing each action. You can review the results at each step of the process. + +The remote MCP server is hosted at mcp.bitrise.io. You can authenticate by passing the HTTP header `Authorization: Bearer`. + +You can find [the Bitrise MCP repository on GitHub](https://github.com/bitrise-io/bitrise-mcp). Among other things, it includes: + +- Install guides for specific MCP clients. The currently supported clients are: VS Code, GitHub Copilot in other IDEs , Claude Applications (Desktop and Code CLI), Cursor, Windsurf, AWS Kiro, and Gemini CLI. +- How to use local MCP server instead of the remote one. +- What tools are available and how you can limit their usage. diff --git a/docs/bitrise-platform/ai/enabling-ai-features-on-bitrise.mdx b/docs/bitrise-platform/ai/enabling-ai-features-on-bitrise.mdx new file mode 100644 index 0000000..f4e36d9 --- /dev/null +++ b/docs/bitrise-platform/ai/enabling-ai-features-on-bitrise.mdx @@ -0,0 +1,18 @@ +--- +title: "Enabling AI features on Bitrise" +sidebar_position: 3 +slug: /bitrise-platform/ai/enabling-ai-features-on-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkspaceSettingsPage from '@site/src/partials/opening-the-workspace-settings-page.mdx'; + +To enable AI features: + +1. +1. On the left, select **AI Settings**. +1. Toggle **Enable AI Features**. + + ![2025-09-30-enable-ai-features.png](/img/_paligo/uuid-122c50be-0438-4aad-87f8-cc148ee26d49.png) diff --git a/docs/bitrise-platform/ai/index.md b/docs/bitrise-platform/ai/index.md new file mode 100644 index 0000000..eb5f447 --- /dev/null +++ b/docs/bitrise-platform/ai/index.md @@ -0,0 +1,7 @@ +--- +title: "AI" +sidebar_position: 9 +slug: /bitrise-platform/ai +--- + +AI diff --git a/docs/bitrise-platform/getting-started/_category_.json b/docs/bitrise-platform/getting-started/_category_.json new file mode 100644 index 0000000..50db76e --- /dev/null +++ b/docs/bitrise-platform/getting-started/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Getting started", + "position": 2, + "link": null +} diff --git a/docs/bitrise-platform/getting-started/collaboration.mdx b/docs/bitrise-platform/getting-started/collaboration.mdx new file mode 100644 index 0000000..3bf9cc3 --- /dev/null +++ b/docs/bitrise-platform/getting-started/collaboration.mdx @@ -0,0 +1,28 @@ +--- +title: "Collaboration" +description: "Collaboration is the way different people can work on Bitrise projects together. Bitrise offers multiple levels of collaboration options, with different product solutions having their own fine-grained collaboration features." +sidebar_position: 4 +slug: /bitrise-platform/getting-started/collaboration +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CollaborationInWorkspaces from '@site/src/partials/collaboration-in-workspaces.mdx'; +import Partial_ProductAccess from '@site/src/partials/product-access.mdx'; +import Partial_CollaborationInProjects from '@site/src/partials/collaboration-in-projects.mdx'; + +Collaboration is the way different people can work on Bitrise projects together. Bitrise offers multiple levels of collaboration options, with different product solutions having their own fine-grained collaboration features. + +Collaboration covers: + +- Membership in Bitrise workspaces, including workspace groups. +- Roles and permissions in Bitrise workspaces: actions that users with different access levels can perform. +- Product access: you can restrict users to access only Bitrise CI or Release Management. +- Roles and permissions in projects, including CI configurations and Release Management apps. + + + + + + diff --git a/docs/bitrise-platform/getting-started/getting-started-with-the-bitrise-platform.md b/docs/bitrise-platform/getting-started/getting-started-with-the-bitrise-platform.md new file mode 100644 index 0000000..9c0cac2 --- /dev/null +++ b/docs/bitrise-platform/getting-started/getting-started-with-the-bitrise-platform.md @@ -0,0 +1,51 @@ +--- +title: "Getting started with the Bitrise platform" +description: "The Bitrise platform is organized around accounts, workspaces, and projects. We'll quickly go through how to start using them." +sidebar_position: 3 +slug: /bitrise-platform/getting-started/getting-started-with-the-bitrise-platform +sidebar_label: Getting started with the platform +--- + +The Bitrise platform is organized around accounts, workspaces, and projects. We'll quickly go through how to start using them. + +## Signing up + +You can sign up via email or via one of three Git providers: GitHub, GitLab, or Bitbucket: [Signing up for Bitrise](/en/bitrise-platform/getting-started/signing-up-for-bitrise). + +Bitrise also supports SAML SSO: [SAML SSO in Bitrise](/en/bitrise-docs-20/bitrise-platform/accounts/saml-sso-in-bitrise). + +After signing up, you receive a limited trial: + +## First workspace + +After signing up, we automatically create your first workspace. This workspace is owned by your user account. You can create additional workspaces at any point and be invited to other workspaces. + +Workspaces are very important in Bitrise: all your work is organized in workspaces. You can: + +- Add users and organize them into user groups: [Workspace collaboration](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration) +- Configure workspace-level integrations for third-party services such as the Apple Store or Google Play: [About integrations](/en/bitrise-platform/integrations/about-integrations). +- Create projects for Bitrise CI and Release Management. + +## Projects + +When you have your first workspace, you will be prompted to add your first project. + +![gettingstarted.png](/img/_paligo/uuid-4f8203e0-c79b-b9ec-7537-53e96b0f1924.png) + +There are two ways of creating a new project: + +- Starting with Bitrise CI: you will be automatically taken to the **Add new project** flow. This creates a CI project with a linked Git repository: [Adding a new project](/en/bitrise-ci/getting-started/adding-a-new-project). +- Starting with Release Management: you can add a new app to Release Management and Bitrise will automatically link it to a new project: [Adding a new app to Release Management](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management). + + This project will not have a CI configuration but you can extend it with one. + +Configure your project by entering **Project settings**. You can access it from both Bitrise CI and from Release Management. + +## Integrations + +Integrating to third-party tools and services is a vital part of the Mobile DevOps process. We recommend setting up the most important integrations once your first project is up and running: + +- [The service credential user](/en/bitrise-platform/integrations/the-service-credential-user) +- [Repository access with OAuth](/en/bitrise-platform/repository-access/repository-access-with-oauth) +- [About connecting to Apple services](/en/bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services) +- [Connecting a Google service account to Bitrise](/en/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise) diff --git a/docs/bitrise-platform/getting-started/index.md b/docs/bitrise-platform/getting-started/index.md new file mode 100644 index 0000000..9169dcf --- /dev/null +++ b/docs/bitrise-platform/getting-started/index.md @@ -0,0 +1,6 @@ +--- +title: "Getting started" +sidebar_position: 2 +--- + +Getting started diff --git a/docs/bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform.md b/docs/bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform.md new file mode 100644 index 0000000..2d1e1f2 --- /dev/null +++ b/docs/bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform.md @@ -0,0 +1,31 @@ +--- +title: "Key concepts of the Bitrise platform" +description: "The Bitrise Mobile DevOps platform equips users for every step of the mobile development process, from planning to monitoring. It has a few key concepts that help understanding the overall structure of the platform." +sidebar_position: 2 +slug: /bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform +--- + +The Bitrise Mobile DevOps platform equips users for every step of the mobile development process, from planning to monitoring. It has a few key concepts that help understanding the overall structure of the platform. + +## Workspaces + +[A workspace](/en/bitrise-platform/workspaces/workspaces-overview) is an environment that allows you to manage your Bitrise projects and the team members working on the projects. To use any of the Bitrise product solutions, you need a workspace. Everything you see on the Bitrise Dashboard belongs to a selected workspace. + +Workspaces have owners, managers, and members. They can be sorted into groups: groups allow owners to quickly assign large teams to specific projects. + +## Projects + +[A Bitrise project](/en/bitrise-platform/projects/projects-overview.html) is the container for the entire Mobile DevOps process of your development work. Each workspace can own multiple projects. A project allows you to: + +- Create a CI configuration: a project's CI configuration is tied to a Git repository. +- Set up Release Management to distribute your mobile app to testers and to online stores. + +Projects can add individual users and workspace groups as collaborators with granular access rights. + +## Accounts + +A user account belongs to an individual user. User accounts can't own projects: each user account must be part of a workspace to be able to work on the Bitrise platform. + +User accounts don't have subscription plans or Release Management licenses: these are tied to workspaces, and Release Management apps, respectively. + +You can invite individual users to both project teams and workspaces. diff --git a/docs/bitrise-platform/getting-started/signing-up-for-bitrise.mdx b/docs/bitrise-platform/getting-started/signing-up-for-bitrise.mdx new file mode 100644 index 0000000..e807e08 --- /dev/null +++ b/docs/bitrise-platform/getting-started/signing-up-for-bitrise.mdx @@ -0,0 +1,21 @@ +--- +title: "Signing up for Bitrise" +description: "You can sign up for Bitrise either via an email address or by authenticating yourself with your GitHub, Bitbucket or GitLab account." +sidebar_position: 1 +slug: /bitrise-platform/getting-started/signing-up-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SigningUpWithAGitProvider from '@site/src/partials/signing-up-with-a-git-provider.mdx'; +import Partial_SigningUpWithEmail from '@site/src/partials/signing-up-with-email.mdx'; +import Partial_NOTESigningUpWithEmail from '@site/src/partials/note-signing-up-with-email.mdx'; + +You can sign up for Bitrise either via an email address or by authenticating yourself with your GitHub, Bitbucket or GitLab account. Signing up using a Git provider account brings some practical benefits, like logging in with one click and of course you won’t have to authorize your Git account when adding repositories hosted by these providers again. + + + + + + diff --git a/docs/bitrise-platform/index.mdx b/docs/bitrise-platform/index.mdx new file mode 100644 index 0000000..65ff8cc --- /dev/null +++ b/docs/bitrise-platform/index.mdx @@ -0,0 +1,82 @@ +--- +title: "Bitrise as a Platform" +hide_table_of_contents: true +hide_title: true +unlisted: true +sidebar_class_name: sidebar-hidden-item +--- + +import ProductHomepage from '@site/src/components/ProductHomepage'; + +
+ +
diff --git a/docs/bitrise-platform/infrastructure/_category_.json b/docs/bitrise-platform/infrastructure/_category_.json new file mode 100644 index 0000000..3455095 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Infrastructure", + "position": 8, + "link": null +} diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/_category_.json b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/_category_.json new file mode 100644 index 0000000..10b77fb --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Bitrise on AWS: Cloud Controller", + "position": 10, + "description": "The Cloud Controller enables you to enjoy the benefits of a Bitrise-managed infrastructure on your AWS environment. With the Cloud Controller, you can manage your build infrastructure even without deep knowledge about AWS.", + "link": null +} diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/aws-cloudformation-templates.md b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/aws-cloudformation-templates.md new file mode 100644 index 0000000..e0baa7e --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/aws-cloudformation-templates.md @@ -0,0 +1,179 @@ +--- +title: "AWS CloudFormation templates" +description: "[AWS CloudFormation](https://aws.amazon.com/cloudformation/) simplifies the one-click provisioning and management of the Bitrise Cloud Controller on AWS. When the CloudFormation template is deployed into a customer VPC, it creates the Bitrise Cloud Controller and the accompanying infrastructure." +sidebar_position: 4 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/aws-cloudformation-templates +--- + +[AWS CloudFormation](https://aws.amazon.com/cloudformation/) simplifies the one-click provisioning and management of the Bitrise Cloud Controller on AWS. When the CloudFormation template is deployed into a customer VPC, it creates the Bitrise Cloud Controller and the accompanying infrastructure. + +![cloudformation.png](/img/_paligo/uuid-f52635e0-c0c6-f09a-042a-4d8e785fb35c.png) + +Bitrise maintains CloudFormation templates for different use cases: + +- **Deploy Cloud Controller to an existing VPC:** Choose this template if the user has an established AWS presence with already built-out networking. +- **Deploy Cloud Controller into a brand new VPC**: Choose this template if the user is new to AWS or doesn’t have an already built-out networking. This template creates a new VPC first (based on customer preferences) and then deploys the controller into it. +- **Deploy Airgapped Cloud Controller to an existing VPC**: Choose this template if the user has an established AWS presence with already built-out networking and would like to run the controller in a strictly [airgapped environment](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html). This is not fully automated: some [manual configuration is needed](#section-idm234367326684698). +- **Deploy Airgapped Cloud Controller into a brand new VPC**: Choose this template if the user is new to AWS or doesn’t have an already built-out networking and would like to run the controller in a strictly [airgapped environment](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html). This template creates a new VPC first with the correct airgapped configuration and then deploys the controller into it. + +## Deploy CloudController to an existing VPC + +Template parameters: + +- **Stack Name** (required): Identifies the Bitrise Cloud Controller parent stack within the AWS Account. +- **Latest AMI ID**: This AMI ID is used as a base AMI to run the Cloud Controller on. +- **BitriseControllerToken** (required): The controller token the user receives when creating a controller on the Bitrise Website. +- **BitriseWorkspaceID** (required): The workspace ID belonging to the customer’s Bitrise account. +- **ControllerLogGroupClass** (required): The controller saves error logs to a CloudWatch log group within the customer AWS Account. The customer controls which [Log Group Class](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html) fits their budget the most. The default value should be suitable for most of the cases. Default: `INFREQUENT_ACCESS`. +- **ControllerLogRetentionInDays** (required): The number of days CloudWatch should retain the Controller error logs. Default: 7 (days). +- **ControllerSshKey** (required): Provides SSH access for the Cloud Controller instance. +- **SubnetIds** (required): At least two subnets within the same region but in different AZs. We recommend using private subnets, but public subnets work as well. +- **VpcId** (required): The VPC where the controller will be deployed. +- **VpcCidrBlock** (required): The CIDR block of the selected VPC. +- **CustomBashScript** (optional): Custom bash script to run on instance startup +- **UseHostNetwork (required)**: Use host network mode for Docker container (--net=host) + +### Infrastructure provisioned by the template + +- **Internal Application Load Balancer**: Servers have no traffic and only perform periodic health checks on the Cloud Controller instance. In all cases the Controller and the build machines will initiate network calls toward the Bitrise control plane, no external inbound traffic is required. +- **Autoscaling Group**: Makes sure that a healthy Cloud Controller instance is running at a time.Instance: a t2.small instance on which the Cloud Controller runs. +- **LaunchTemplate**: Cloud Controller instance configuration. Also needed for the controller self-update feature. +- **IAM role, instance profile, and policy**: Certain permissions are necessary for the controller to query the build node states. +- **AWS Secrets Manager**: The template creates two secrets, respectively, for storing the WorkspaceID and the Controller Token. +- **CloudWatch log group**: The template creates a CloudWatch log group for storing Controller error logs. +- **Security groups**: The template creates two security groups: one for the LoadBalancer and one for the instance. + +## Deploy Cloud Controller to a new VPC + +Template parameters: + +- **Stack Name** (required): Identifies the Bitrise Cloud Controller parent stack within the AWS Account. +- **Latest AMI ID**: This AMI ID is used as a base AMI to run the Cloud Controller on. +- **BitriseControllerToken** (required): The controller token the user receives when creating a controller on the Bitrise Website. +- **BitriseWorkspaceID** (required): The workspace ID belonging to the customer’s Bitrise account. +- **ControllerLogGroupClass** (required): The controller saves error logs to a CloudWatch log group within the customer AWS Account. The customer controls which [Log Group Class](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html) fits their budget the most. The default value should be suitable for most of the cases. Default: `INFREQUENT_ACCESS`. +- **ControllerLogRetentionInDays** (required): The number of days CloudWatch should retain the Controller error logs. Default: 7 (days). +- **ControllerSshKey** (required): Provides SSH access for the Cloud Controller instance. +- **EnvironmentName** (optional): Adds a prefix to each piece of Bitrise-related infrastructure with the Environment Name. In case the customer has a vast number of resources, it might come in handy to be able to distinguish Bitrise-related resources from the rest. +- **PrivateSubnet1CIDR** (required): CIDR range of the first private subnet of the new VPC. Default: 10.192.32.0/20. +- **PrivateSubnet2CIDR** (required): CIDR range of the second private subnet of the new VPC. Default: 10.192.64.0/20. +- **PublicSubnet1CIDR** (required): CIDR range of the first public subnet of the new VPC. Default: 10.192.0.0/20. +- **PublicSubnet2CIDR** (required): CIDR range of the second public subnet of the new VPC. Default: 10.192.16.0/20 +- **VpcCidrBlock** (required): The CIDR block of the selected VPC. +- **CustomBashScript** (optional): Custom bash script to run on instance startup +- **UseHostNetwork (required)**: Use host network mode for Docker container (--net=host) + +### Infrastructure provisioned by the template + +- **Internal Application Load Balancer**: Servers have no traffic and only perform periodic health checks on the Cloud Controller instance. In all cases the Controller and the build machines will initiate network calls toward the Bitrise control plane, no external inbound traffic is required. +- **Autoscaling Group**: Makes sure that a healthy Cloud Controller instance is running at a time. +- **Instance**: a `t2.small` instance on which the Cloud Controller runs. +- **LaunchTemplate**: Cloud Controller instance configuration. Also needed for the controller self-update feature. +- **IAM role, instance profile, and policy**: Certain permissions are necessary for the controller to query the build node states. +- **AWS Secrets Manager**: The template creates two secrets, respectively, for storing the WorkspaceID and the Controller Token. +- **CloudWatch log group**: The template creates a CloudWatch log group for storing Controller error logs. +- **Security groups**: The template creates two security groups: one for the LoadBalancer and one for the instance. +- **VPC**: A standard, general-purpose VPC based on best practices. Choosing the default CIDR block results in subnets with 4096 available IP addresses. The list of VPC-related resources the template creates: + + - One VPC. + - Two public subnets. + - Two private subnets. + - One NAT Gateway + one Elastic IP. + - One Internet Gateway + one Elastic IP. + - Routing tables. +- **Bitrise Agent Logs**: This functionality allows for seamless sending of Bitrise Agent build logs to AWS CloudWatch. It leverages CloudFormation to automatically set up the necessary IAM roles and policies, ensuring the Bitrise Agent has appropriate permissions. Moreover, it creates a specific log group in CloudWatch named `bitrise-agent-log`, facilitating organized log management and real-time analysis within the AWS environment. + +## Deploy Airgapped Cloud Controller to an existing VPC + +Template parameters: + +- **Stack Name** (required): Identifies the Bitrise Cloud Controller parent stack within the AWS Account. +- **BitriseControllerToken** (required): The controller token the user receives when creating a controller on the Bitrise Website. +- **BitriseWorkspaceID** (required): The workspace ID belonging to the customer’s Bitrise account. +- **ControllerLogGroupClass** (required): The controller saves error logs to a CloudWatch log group within the customer AWS Account. The customer controls which [Log Group Class](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html) fits their budget the most. The default value should be suitable for most of the cases. Default: `INFREQUENT_ACCESS`. +- **ControllerLogRetentionInDays** (required): The number of days CloudWatch should retain the Controller error logs. Default: 7 (days). +- **ControllerSshKey** (required): Provides SSH access for the Cloud Controller instance. +- **SubnetIds** (required): At least two subnets within the same region but in different AZs. We recommend using private subnets, but public subnets work as well. +- **VpcId** (required): The VPC where the controller will be deployed. +- **VpcCidrBlock** (required): The CIDR block of the selected VPC. +- **CustomBashScript** (optional): Custom bash script to run on instance startup +- **UseHostNetwork (required)**: Use host network mode for Docker container (--net=host) + +### Infrastructure provisioned by the template + +- **Internal Application Load Balancer**: Servers have no traffic and only perform periodic health checks on the Cloud Controller instance. In all cases the Controller and the build machines will initiate network calls toward the Bitrise control plane, no external inbound traffic is required. +- **Autoscaling Group**: Makes sure that a healthy Cloud Controller instance is running at a time.Instance: a t2.small instance on which the Cloud Controller runs. +- **Airgapped LaunchTemplate**: Cloud Controller instance configuration. Also needed for the controller self-update feature. +- **Airgapped IAM role, instance profile, and policy**: Certain permissions are necessary for the controller to query the build node states and access required Bitrise private ECR. +- **AWS Secrets Manager**: The template creates two secrets, respectively, for storing the WorkspaceID and the Controller Token. +- **CloudWatch log group**: The template creates a CloudWatch log group for storing Controller error logs. +- **Airgapped security groups**: The template creates two security groups: one for the LoadBalancer and one for the instance. +- **Bitrise Agent Logs**: This functionality allows for seamless sending of Bitrise Agent build logs to AWS CloudWatch. It leverages CloudFormation to automatically set up the necessary IAM roles and policies, ensuring the Bitrise Agent has appropriate permissions. Moreover, it creates a specific log group in CloudWatch named `bitrise-agent-log`, facilitating organized log management and real-time analysis within the AWS environment. + +### Manual configuration for the airgapped template + +1. Create the following interface-type VPC endpoints using the configured subnet: + + Ensure that the private DNS is enabled for all. + + - `com.amazonaws.${AWS::Region}.autoscaling`: Used for controller self-update. + - `com.amazonaws.${AWS::Region}.ec2`: Used for EC2 instance and dedicated host management. + - `com.amazonaws.${AWS::Region}.ecr.api`: Used for downloading controller binary from Bitrise private ECR. + - `com.amazonaws.${AWS::Region}.ecr.dkr`: Used for downloading controller binary from Bitrise private ECR. + - `com.amazonaws.${AWS::Region}.logs`: Used for sending controller logs to CloudWatch. + - `com.amazonaws.${AWS::Region}.secretsmanager`: Used for accessing secrets. +1. Apply the created endpoints to the Instance Security group. + +## Deploy Airgapped Cloud Controller to a new VPC + +Template parameters: + +- **Stack Name** (required): Identifies the Bitrise Cloud Controller parent stack within the AWS Account. +- **Latest AMI ID**: This AMI ID is used as a base AMI to run the Cloud Controller on. +- **BitriseControllerToken** (required): The controller token the user receives when creating a controller on the Bitrise Website. +- **BitriseWorkspaceID** (required): The workspace ID belonging to the customer’s Bitrise account. +- **ControllerLogGroupClass** (required): The controller saves error logs to a CloudWatch log group within the customer AWS Account. The customer controls which [Log Group Class](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html) fits their budget the most. The default value should be suitable for most of the cases. Default: `INFREQUENT_ACCESS`. +- **ControllerLogRetentionInDays** (required): The number of days CloudWatch should retain the Controller error logs. Default: 7 (days). +- **ControllerSshKey** (required): Provides SSH access for the Cloud Controller instance. +- **EnvironmentName** (optional): Adds a prefix to each piece of Bitrise-related infrastructure with the Environment Name. In case the customer has a vast number of resources, it might come in handy to be able to distinguish Bitrise-related resources from the rest. +- **PrivateSubnet1CIDR** (required): CIDR range of the first private subnet of the new VPC. Default: 10.192.32.0/20. +- **PrivateSubnet2CIDR** (required): CIDR range of the second private subnet of the new VPC. Default: 10.192.64.0/20. +- **PublicSubnet1CIDR** (required): CIDR range of the first public subnet of the new VPC. Default: 10.192.0.0/20. +- **PublicSubnet2CIDR** (required): CIDR range of the second public subnet of the new VPC. Default: 10.192.16.0/20 +- **VpcCidrBlock** (required): The CIDR block of the selected VPC. +- **CustomBashScript** (optional): Custom bash script to run on instance startup +- **UseHostNetwork (required)**: Use host network mode for Docker container (--net=host) + +### Infrastructure provisioned by the template + +- **Internal Application Load Balancer**: Servers have no traffic and only perform periodic health checks on the Cloud Controller instance. In all cases the Controller and the build machines will initiate network calls toward the Bitrise control plane, no external inbound traffic is required. +- **Autoscaling Group**: Makes sure that a healthy Cloud Controller instance is running at a time.Instance: a t2.small instance on which the Cloud Controller runs. +- **Instance**: a `t2.small` instance on which the Cloud Controller runs. +- **Airgapped LaunchTemplate**: Cloud Controller instance configuration. Also needed for the controller self-update feature. +- **IAM role, instance profile, and policy**: Certain permissions are necessary for the controller to query the build node states. +- **AWS Secrets Manager**: The template creates two secrets, respectively, for storing the WorkspaceID and the Controller Token. +- **CloudWatch log group**: The template creates a CloudWatch log group for storing Controller error logs. +- **Airgapped security groups**: The template creates two security groups: one for the LoadBalancer and one for the instance. +- **VPC**: A standard, general-purpose VPC based on best practices. Choosing the default CIDR block results in subnets with 4096 available IP addresses. The list of VPC-related resources the template creates: + + - One VPC. + - Two public subnets. + - Two private subnets. + - One NAT Gateway + one Elastic IP. + - One Internet Gateway + one Elastic IP. + - Routing tables. +- **VPC Endpoints**: The template creates 6 interface type endpoints and connects them to the instance security group to enable controller access to AWS resources: + + - `com.amazonaws.${AWS::Region}.autoscaling`: Used for controller self-update. + - `com.amazonaws.${AWS::Region}.ec2`: Used for EC2 instance and dedicated host management. + - `com.amazonaws.${AWS::Region}.ecr.api`: Used for downloading controller binary from Bitrise private ECR. + - `com.amazonaws.${AWS::Region}.ecr.dkr`: Used for downloading controller binary from Bitrise private ECR. + - `com.amazonaws.${AWS::Region}.logs`: Used for sending controller logs to CloudWatch. + - `com.amazonaws.${AWS::Region}.secretsmanager`: Used for accessing secrets. +- **Bitrise Agent Logs**: This functionality allows for seamless sending of Bitrise Agent build logs to AWS CloudWatch. It leverages CloudFormation to automatically set up the necessary IAM roles and policies, ensuring the Bitrise Agent has appropriate permissions. Moreover, it creates a specific log group in CloudWatch named `bitrise-agent-log`, facilitating organized log management and real-time analysis within the AWS environment. + +## Necessary AWS permissions and connectivity + +The controller needs certain AWS permissions to perform actions on the build nodes. We did our best to limit the required permissions to a minimal scope. We even made [our CloudFormation template repository](https://github.com/bitrise-io/cloud-controller-cloudformation/blob/production/iam/roles.yaml) public to build trust. Please see the [entire list of (up-to-date) required permissions](https://github.com/bitrise-io/cloud-controller-cloudformation/blob/production/iam/roles.yaml) in the repository. + +The controller requires connectivity to certain Bitrise endpoints. See more [in the controller documentation](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller.html). diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/bitrise-on-aws-overview.mdx b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/bitrise-on-aws-overview.mdx new file mode 100644 index 0000000..45ad90e --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/bitrise-on-aws-overview.mdx @@ -0,0 +1,24 @@ +--- +title: "Bitrise on AWS overview" +description: "The Cloud Controller enables you to enjoy the benefits of a Bitrise-managed infrastructure on your AWS environment. With the Cloud Controller, you can manage your build infrastructure even without deep knowledge about AWS." +sidebar_position: 1 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/bitrise-on-aws-overview +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AWSOfferingTypes from '@site/src/partials/aws-offering-types.mdx'; +import Partial_WhenToChooseTheAWSOption from '@site/src/partials/when-to-choose-the-aws-option.mdx'; +import Partial_CloudControllerOverview from '@site/src/partials/cloud-controller-overview.mdx'; +import Partial_AirGappedModeForTheController from '@site/src/partials/air-gapped-mode-for-the-controller.mdx'; + +The Cloud Controller enables you to enjoy the benefits of a Bitrise-managed infrastructure on your AWS environment. With the Cloud Controller, you can manage your build infrastructure even without deep knowledge about AWS. + + + + + + + + diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/configuring-a-machine-pool.md b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/configuring-a-machine-pool.md new file mode 100644 index 0000000..5b63e4b --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/configuring-a-machine-pool.md @@ -0,0 +1,89 @@ +--- +title: "Configuring a machine pool" +description: "After [you created an AWS controller](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller.html), you can configure a machine pool. The pool is a group of instances that share the same configuration and can run Bitrise builds. The Controller ensures that the necessary amounts of matching resources are started on AWS." +sidebar_position: 5 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/configuring-a-machine-pool +--- + +After [you created an AWS controller](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller.html), you can configure a machine pool. The pool is a group of instances that share the same configuration and can run Bitrise builds. The Controller ensures that the necessary amounts of matching resources are started on AWS. + +## Creating a new pool + +Creating a new pool is happening through a multi-stage wizard, where you need to provide details about the pool: + +1. Open your **Workspace settings** page. +1. Select **Self-hosted infrastructure** and go to the **Bitrise on AWS** tab, then click **Create pool**. + + ![create-pool.png](/img/_paligo/uuid-4defa7e8-2933-8118-8b32-414f4a4994d2.png) +1. On the first screen, configure your agent pool settings: + + - **Pool name** (required): The pool name will appear on the **Stacks & Machines** tab of the Workflow Editor to allow you to select the pool to run builds. The name must be unique within the Workspace, across other pools and Bitrise agent pools. If the name is not unique, the pool cannot be created. + - **Number of machines** (required): The number of machines created. The higher the number, the more builds can run parallel within the available concurrency. + - **Rolling update percentage** (required): Rolling update percentage configures the expected system availability during machine restarts. The lower the number, the more machines will be available during a change rollout, but the overall time required for the rollout could be significantly higher. The provided values should be between 1% and 100% inclusive. The system rounds up the percentage-based values. If you have five machines with a 95% rolling update percentage, all five machines will be attempted to restart simultaneously. We recommend keeping this number high in case a breaking or blocking change is released (like SSH key rotation) and could be lower for smaller changes (like decreased disk size). +1. After clicking **Next**, provide the machine parameters on the next screen: + + ![create-machine-pool.png](/img/_paligo/uuid-12b52688-9137-1a9a-47d8-2944653f1d74.png) + + - **Amazon Machine Image (AMI) ID** (required): AMI is the Bitrise-built environment with all required tools preinstalled to run mobile builds. The provided ID of the AMI you subscribed to must be configured here. Only the Bitrise-managed AMIs are accepted in the current version. + - **Stack** (required for VM-based AMIs): Stack selector becomes available only if the selected AMI is a VM-based MacOS AMI. In this case, the user must select one stack from the dropdown. + - **Number of virtual machines**: Number of VM selector becomes available only if the selected AMI is a VM-based MacOS AMI. In this case, the user must select how many VM should run on the build machines (1 or 2). + - **Availability zone** (required): The availability zone will define where the resources will be reserved. The Controller is going to start resources with the **mac2.metal** or **mac2-m2.metal** or **mac2-m2pro.metal** instance families, which are not available in every AWS availability zone. Make sure to select a valid availability zone [from the list](https://aws.amazon.com/about-aws/whats-new/2021/10/amazon-ec2-mac-instances-additional-regions/). + - **Machine type (required)**: Machine type selector becomes available only after the Availability zone is provided. The Controller will start the build machines according to the selected machine type. + + :::note[Select the right region] + + The Controller is able to start resources only in the same region where it is located. If the selected availability zone is not in the same region, the machines are not going to start. + + ::: +1. On the next screen, under **Network & security settings**, you can specify further details about the machines: + + ![create-pool-security.png](/img/_paligo/uuid-ac4d6375-b153-bb6a-d78d-f0bd9bebf824.png) + + - **Subnet ID** (required): Specify the subnet ID you want to use for your machines from the availability zone configured before. All created machines will run under the same subnet. The machines must be able to reach Bitrise services from the subnet, but it doesn’t need to be a public subnet as Bitrise is not going to initiate communication. Make sure that your instance can access the following endpoints: + + - https://exec.bitrise.io + - https://build-log.services.bitrise.io + + Without accessing these endpoints, you won't be able to run builds even after connecting the instance. This means the subnet must be able to access the internet, either via a NAT Gateway or an Internet Gateway. For more details about subnets, check [the official AWS documentation](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html). + - **Auto-assign public IP address**: Enabling the this field will ensure that a public IPv4 address is created for the EC2 instances. Enable it only when the configured subnet is public: that is, it has an internet gateway to directly communicate to the internet. If the subnet can't access the internet, disable this option. + - **Security groups** (required): You can specify one or more security group IDs. With the security groups, you can control traffic to your AWS resources. + + At a minimum, an `empty-default` security group is required, which is empty from the incoming side and allows 0.0.0.0/0 for the outgoing side. If you want to use SSH to access your instances, the security groups must have an incoming port 22 open. If SSH access capability is not required, we recommend removing the related security group. + + For more details about security groups, check [the official AWS documentation](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html). + + :::note[Network configuration] + + Make sure that the selected subnet and security group belongs to the same network, otherwise the machines will not start. + + ::: + - **Instance profile** (optional): You can configure extra IAM roles for your machines with the instance profile. This is necessary if you wish to access any other resources in AWS. For example, if you want to use your S3 bucket as an artifact store. If such capabilities are not needed, leave the profile empty. + + This option can be used to include permissions for streaming [Bitrise agent logs directly to CloudWatch](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller/enabling-cloudwatch-bitrise-agent-logging), offering a centralized solution for log management and monitoring. If the AWS CloudFormation parameters have been set correctly, an instance profile called `bitrise-agent-log-instance-profile` has been generated. On AWS, you can get the generated ARN of that profile to use here. + - **SSH key** (optional): Facilitates debugging of the instances. You can access the created instances via SSH if an SSH key is provided and the correct security group settings are configured. If debugging is not required, we recommend leaving this field empty. +1. After clicking **Next**, configure storage requirements: + + ![prewarm.png](/img/_paligo/uuid-8dad9adf-f9a7-fe6b-e598-972b45ecca27.png) + + - **Disk type** (required): You can select from different root volume types. We recommend going with at least the gp3 setting. For details, check out [the AWS documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html). + - **Storage size** (required): Specify the root volume size in GB. Different images are created with different disk sizes that are the required minimum disk size. For the virtualized AMI with 1 VM per host, we recommend 700GB. For the virtualized AMI with 2 VMs per host, we recommend 1000GB. For bare metal, we recommend setting the disk size at least 50GB more than the minimum. + - **Prewarming the disk**: Disk prewarming is suggested for every Amazon EBS device in order to work reliably. This prewarming could take significant time, up to multiple hours in the case of a bigger storage size configuration. The prewarming can be disabled but then the first few builds running on the build machine will fail. +1. When done, click **Create pool** + +Once a pool is created, the pool details appear on the screen: + +![pool-detail.png](/img/_paligo/uuid-a30a61ec-5dea-3792-44ea-3e6d9c96b19d.png) + +In the header, you can see the name of the pool and its state. If the desired state of the pool has not been reached yet, then the state is Updating. A fully working pool’s status is Up-to-date. + +You can also see a section about the pool configuration, followed by the individual machines. Each machine also has a state, indicating if and what build is running on it. + +## Reconfiguring a pool + +If the pool configuration is incorrect (for example, you need to investigate something that needs a different SSH key and a different subnet), hit the **Edit** button for any configured pools and reconfigure the pool. + +When a reconfiguration is requested, the Controller will terminate some running and incorrectly configured resources. When such termination is completed, a new resource will be created instead. This approach aims to reduce your costs as much as possible. + +We recommend reviewing the **Rolling update percentage** setting during the configuration, as it can create reduced availability if the setting is high. However, it can also slow rollout if the setting is low. + +When a reconfiguration starts, the pool status becomes **Updating**, which stays in this status until all the resources are running according to the new configuration. At that time, the pool status becomes **Up-to-date** again. diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller.mdx b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller.mdx new file mode 100644 index 0000000..f20a701 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller.mdx @@ -0,0 +1,146 @@ +--- +title: "Creating and configuring a controller" +description: "To create and configure an AWS Cloud Controller to run Bitrise builds, you need to configure it on Bitrise first and then set up an instance running the controller agent on AWS." +sidebar_position: 3 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_EnablingCloudWatchBitriseAgentLogging from '@site/src/partials/enabling-cloudwatch-bitrise-agent-logging.mdx'; + +You must create and connect a Cloud Controller to take advantage of our Controller-managed AWS offering. The process has two stages: + +1. [Configuring the Controller on Bitrise.](#section-idm4581984681929634205158136836) +1. Setting up an instance running the controller agent on AWS. + +## Configuring the controller on Bitrise + +1. Get access to the AWS controller feature from the Bitrise team. +1. Log in to your Bitrise Workspace as a Workspace owner. + + Only Workspace owners can access and configure this feature. +1. Open the **Workspace settings** page of the Workspace. +1. Select **Self-hosted infrastructure** and go to the **Bitrise on AWS** tab. + + ![create-controller-1.png](/img/_paligo/uuid-bfadf366-bdfc-4440-d2db-5e9f68843f9f.png) +1. Click **Connect with AWS**. This should bring up a dialog box. +1. Set a name for your controller and specify if you want to use the controller in an air-gapped network. + + For more information on air-gapped mode, see [Bitrise on AWS: Cloud Controller](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller). + + ![create-controller-1.png](/img/_paligo/uuid-a4204c31-4165-2af9-290e-e3116ef784a3.png) +1. Copy and save your token. + + :::important[Save the token] + + This token is only accessible only right after creation. If the token is lost, you need to delete the controller and create a new one which would generate a new token. + + ::: + +After successful creation, the Bitrise on AWS screen should indicate that the controller on the Bitrise side is prepared, and it’s waiting for an AWS connection. In all cases the Controller and the build machines will initiate network calls toward the Bitrise control plane, no external inbound traffic is required. + +## Setting up the controller instance on AWS + +After a successful controller creation on Bitrise, go to AWS and create an instance running the Controller Agent. + +:::note[New or existing VPC] + +The configuration will need a Virtual Private Cloud (VPC). Every AWS region contains a default VPC but if necessary, you can create your own VPC within each region. If you wish to share your VPC between Bitrise-specific resources and your other resources you can reuse the already existing and configured VPC. If you prefer to separate resources, you can create a new VPC with the provided template. + +For more information, read [the official AWS documentation on VPCs](https://docs.aws.amazon.com/vpc/latest/userguide/configure-your-vpc.html). + +::: + + + + +1. Log in to your AWS account. +1. Select the template option you need and you'll get the HTTP link to your template. You can read more about templates on the [AWS CloudFormation templates](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/aws-cloudformation-templates.html) page. + + - [Link to the base template](https://bitrise-cloudformation-templates.s3.amazonaws.com/cloud-controller-with-existing-vpc.yaml). + - [Link to the airgapped template](https://bitrise-cloudformation-templates.s3.amazonaws.com/cloud-controller-with-existing-vpc-airgapped.yaml). Use this if the Bitrise Controller is expected to run [in airgapped mode](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html). + + :::note[Additional manual configuration] + + The airgapped support requires some manual configuration in AWS that is not automated via CloudFormation. For details, please check the [AWS CloudFormation templates](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/aws-cloudformation-templates.html) page. + + ::: +1. Navigate to CloudFormation and select **Create stack with new resources (standard)**. + + ![controller-create-stack.png](/img/_paligo/uuid-336544f8-0f74-08ad-8a5d-616f33d62736.png) +1. Create a stack using the **Template is ready** and **Amazon S3 URL** options. +1. In the **Amazon S3 URL** field, provide the URL gathered in the previous step and click **Next**. + + ![create-stack-template.png](/img/_paligo/uuid-d2e802df-0b0d-afba-f36c-ad6a9af244bb.png) +1. On the following prompt, specify the following fields: + + - **Stack name**: Any value works here. This helps to identify the stack if you have multiple stacks. + - **Latest AMI ID**: This AMI ID is used as a base AMI to run the Cloud Controller on. + - **Bitrise Controller Token**: The token is generated as part of controller creation on Bitrise: [see topic](#section-idm4581984681929634205158136836). + - **Bitrise Workspace ID**: [Identifying Workspaces and apps with their slugs](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs). + - **Controller Log Group Class** : The Cloud Controller generates logs that are accessible to the customers in AWS. This configuration specifies what features the customer wants to use during log analysis. The default is **Infrequent access**, which provides a limited log analyzing capability at a lower cost. + - **Controller Log Retention In Days** : Determines how long AWS stores the Cloud Controller logs. + - **Controller SSH Key** : Select one previously configured SSH key. With this key, you can log into the created instance and, if needed, investigate. + - **Subnet IDs** : Choose at least two subnets in two different Availability Zones from the previously configured subnets, but make sure not to select more than one subnet from the same Availability Zone. The selected subnets should belong to the selected VPC. The subnets should have a route table configuration enabling the created instances to communicate to the Bitrise Services. There is no incoming communication required for the Controller. + - **VPC CIDR Block** : Default value is provided. Make sure you select a CIDR Block matching the VPC’s CIDR Block. For more info, see [the official AWS docs](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-cidr-blocks.html). + - **VPC ID** : Select from the previously configured VPCs. + + :::note[Only one controller per VPC/region] + + We do not recommend running more than one Controller in one VPC/one region. These Controllers could start more resources than necessary which can cost money. + + ::: +1. The other stack option configurations are optional. For details, check [AWS’s official documentation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-add-tags.html). +1. Review your previous settings on the **Review** screen. If everything looks correct, acknowledge your CloudFormation capabilities at the bottom and then submit your request. +1. Once the AWS CloudFormation successfully creates the instance running the Controller (this process can take 5-7 minutes), go back to your Workspace page on Bitrise to confirm the connectivity between the instance and AWS. If the Controller’s status is **Connected**, the connection works correctly. + + ![controller-ready.png](/img/_paligo/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png) + + + + +1. Log in to your AWS account. +1. Select the template option you need and you'll get the HTTP link to your template. You can read more about templates on the [AWS CloudFormation templates](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/aws-cloudformation-templates.html) page. + + - [Link to the base template](https://bitrise-cloudformation-templates.s3.amazonaws.com/cloud-controller-with-new-vpc.yaml). + - [Link to the airgapped template](https://bitrise-cloudformation-templates.s3.amazonaws.com/cloud-controller-with-new-vpc-airgapped.yaml). Use this if the Bitrise Controller is expected to run [in airgapped mode](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html). + + :::note[Additional manual configuration] + + The airgapped support requires some manual configuration in AWS that is not automated via CloudFormation. For details, please check the [AWS CloudFormation templates](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/aws-cloudformation-templates.html) page. + + ::: +1. Navigate to CloudFormation and select **Create stack with new resources (standard)**. + + ![controller-create-stack.png](/img/_paligo/uuid-336544f8-0f74-08ad-8a5d-616f33d62736.png) +1. Create a stack using the **Template is ready** and **Amazon S3 URL** options. +1. In the **Amazon S3 URL** field, provide the URL gathered in the previous step and click **Next**. + + ![create-stack-template.png](/img/_paligo/uuid-d2e802df-0b0d-afba-f36c-ad6a9af244bb.png) +1. On the following prompt, specify the following fields (all mentioned fields are required unless specified otherwise): + + - **Stack name**: Any value works here. This helps to identify the stack if you have multiple stacks. + - **Latest AMI ID**: This AMI ID is used as a base AMI to run the Cloud Controller on. + - **Bitrise Controller Token**: The token is generated as part of controller creation on Bitrise: [see topic](#section-idm4581984681929634205158136836). + - **Bitrise Workspace ID**: [Identifying Workspaces and apps with their slugs](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs). + - **Controller Log Group Class** : The Cloud Controller generates logs that are accessible to the customers in AWS. This configuration specifies what features the customer wants to use during log analysis. The default is **Infrequent access**, which provides a limited log analyzing capability at a lower cost. + - **Controller Log Retention In Days** : Determines how long AWS stores the Cloud Controller logs. + - **Controller SSH Key** : Select one previously configured SSH key. With this key, you can log into the created instance and, if needed, investigate. + - **Environment Name**: Optional. The provided value will appear in the names of the created VPC, subnets, and route tables. + - **Private Subnet 1 CIDR**: Default value is provided. IP range (CIDR notation) for the private subnet of the new VPC in the first Availability Zone. The value must be between a /28 netmask and /16 netmask. + - **Private Subnet 2 CIDR**: Default value is provided. IP range (CIDR notation) for the private subnet of the new VPC in the second Availability Zone. The value must be between a /28 netmask and /16 netmask. + - **Public Subnet 1 CIDR**: Default value is provided. IP range (CIDR notation) for the public subnet of the new VPC in the first Availability Zone. The value must be between a /28 netmask and /16 netmask. + - **Public Subnet 2 CIDR**: Default value is provided. IP range (CIDR notation) for the public subnet of the new VPC in the second Availability Zone. The value must be between a /28 netmask and /16 netmask. + - **VPC CIDR**: Default value is provided. Select the Classless Inter-Domain Routing (CIDR) for the new VPC. +1. The other stack option configurations are optional. For details, check [AWS’s official documentation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-add-tags.html). +1. Review your previous settings on the **Review** screen. If everything looks correct, acknowledge your CloudFormation capabilities at the bottom and then submit your request. +1. Once the AWS CloudFormation successfully creates the instance running the Controller (this process can take 5-7 minutes), go back to your Workspace page on Bitrise to confirm the connectivity between the instance and AWS. If the Controller’s status is **Connected**, the connection works correctly. + + ![controller-ready.png](/img/_paligo/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png) + + + + + diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/index.md b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/index.md new file mode 100644 index 0000000..295a180 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/index.md @@ -0,0 +1,10 @@ +--- +title: "Bitrise on AWS: Cloud Controller" +description: "The Cloud Controller enables you to enjoy the benefits of a Bitrise-managed infrastructure on your AWS environment. With the Cloud Controller, you can manage your build infrastructure even without deep knowledge about AWS." +sidebar_position: 10 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller +--- + +Bitrise on AWS: Cloud Controller + +The Cloud Controller enables you to enjoy the benefits of a Bitrise-managed infrastructure on your AWS environment. With the Cloud Controller, you can manage your build infrastructure even without deep knowledge about AWS. diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami.md b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami.md new file mode 100644 index 0000000..1297831 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami.md @@ -0,0 +1,37 @@ +--- +title: "Subscribing to the Bitrise on AWS AMI" +description: "Bitrise on AWS is sold via AWS Private Offer and a Bitrise account is required before you can use Bitrise-provided AMIs. Please don't purchase the offerings via the public AWS Marketplace." +sidebar_position: 2 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/subscribing-to-the-bitrise-on-aws-ami +sidebar_label: Subscribing to the Bitrise on AWS AMIs +--- + +The Bitrise on AWS AMI is now available for both Linux and macOS. It enables running Bitrise builds on Amazon EC2 instances. + +Bitrise on AWS is sold via AWS Private Offer and a Bitrise account is required before you can use Bitrise-provided AMIs. Please don't purchase the offerings via the public AWS Marketplace. + +You can get a private offer of the Bitrise on AWS listings: + +1. After [contacting Bitrise](https://bitrise.io/contact), we will send the order in a pdf format. This document contains all the details of our Bitrise on AWS offering, including the relevant customer data, the service provided, and the price of the service. +1. Once satisfied with the terms, contact Bitrise again to give up permission to create the AWS private offer. The offer will be visible on the AWS Marketplace. +1. Next you will receive a link to an AWS private offer which will also contain the order form attached. The link should take you to the AWS Marketplace. + + ![aws-offer-1.png](/img/_paligo/uuid-286c4817-1c22-6e11-06ec-26a34ce81273.png) +1. Optionally, you can enter a purchase order ID for invoicing purposes here: click **Add a purchase order**. + + To learn more about purchase orders, check out the official AWS documentation: [Managing your purchase orders](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/manage-purchaseorders.html). +1. Review the terms of the agreement. The pdf document will be available under the End User License Agreement link below the **Create Contract** button. + + Note that on the bottom right, you might see other available offers, including the Bitrise public offer. These are not relevant: the link you received took you straight to your private offer. +1. If everything is in order, click **Create Contract** on the right. After this point, the contract can’t be modified on the AWS page. + + ![aws-offer-2.png](/img/_paligo/uuid-dd9a98bf-41aa-d933-c06f-34d69bb56148.png) +1. Once the contract is ready, AWS should display a message about receiving a license. At this point you can proceed to configure your AMI by clicking **Continue to Configuration**. + + ![license-mgt.png](/img/_paligo/uuid-594370f7-8b76-f5b1-3042-d09c9f06bfe7.png) +1. Choose a fulfillment option, a version and your region before launching. You can read more about launching software from the AWS Marketplace in the official AWS documentation: [Launching container software from AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-configuring-a-product.html). +1. Once ready, click **Continue to Launch** to launch the software. + + ![continue-to-launch.png](/img/_paligo/uuid-d1f6b886-e707-4116-3eb6-331b765507ba.png) + +To read more about configuring your Amazon EC2 instance and running builds there: [Launching an EC2 instance for the Bitrise AMI](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami). diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/troubleshooting-the-cloud-controller.md b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/troubleshooting-the-cloud-controller.md new file mode 100644 index 0000000..1449104 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/troubleshooting-the-cloud-controller.md @@ -0,0 +1,132 @@ +--- +title: "Troubleshooting the cloud controller" +sidebar_position: 6 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/troubleshooting-the-cloud-controller +--- + +We've listed some of the potential issues you might run into when attempting to use a cloud controller to run Bitrise builds on AWS. If you're experiencing problems, check this page for your issue. + +Can't see the Bitrise on AWS screen + +Make sure you’re looking at the correct place on the **Workspace settings** page. + +If the page is not there, contact [Bitrise](https://bitrise.io/). You might need additional access rights. + +I see the Bitrise on AWS screen, but I cannot create a new controller + +Only Workspace Owners can create a new controller. Please make sure you have the correct access rights. + +The CloudFormation fails to create the stack when setting up the instance on AWS + +Please open a [support ticket](https://bitrise.io/)! + +The controller instance cannot connect to Bitrise + +1. Confirm that your configuration is correct: + + - Check the CloudWatch logs for any errors. If the controller starts working but fails to execute anything, you will find the related logs there. + - Under AWS Secrets Manager & Secrets, validate that both the workspace ID and the controller token are provided correctly. + + If any of the above is not configured correctly, destroy the CloudFormation stack and recreate it with the correct settings. +1. If the instance started but cannot connect to Bitrise: + + - Check the System Logs of the instance: + + If you see an `Error response from daemon: Get "https://public.ecr.aws/v2/": context deadline exceeded` message, you probably don’t have internet access on your instance. Double-check your route table configuration and make sure the configured subnets are able to access the internet. + - Ensure that egress communication to the Bitrise URLs works. You can validate it in the following way: + + SSH into the created instance. In the terminal, use `telnet`, `curl`, or `wget` to access `cloud-controller-aws-internal.services.bitrise.io:443`. + + If the request runs to timeout, collect the evidence and notify our support. + + If you get 404, the egress communication is good. +1. If none of the above works, get in touch with Bitrise. + +The controller instance is randomly recreating + +This could be part of the normal workflow. A built-in functionality keeps the registered controllers in a fresh version to ensure the controller is compatible with the constantly evolving Bitrise. + +The controller also has a built-in health check functionality, which ensures that the instance is always working and working correctly. As part of that, to solve intermittent issues, the instances can occasionally restart. This is not going to prevent the controller from working correctly. + +If the controller is still restarting frequently or the user suspects issues with the controller’s behavior, please get in touch with Bitrise. + +I forgot the controller’s Secret before creating the controller in AWS + +You can read the token from the AWS Secrets. + +I cannot delete the controller from Bitrise + +You can delete the controller by clicking the **Remove** button next to the controller on the **Workspace settings** page. Only Owners of the Workspace can delete a controller. + +:::important[Removing the controller from AWS] + +Deleting the controller from Bitrise does not remove the controller from AWS. That needs to happen separately. After deleting a connected controller from Bitrise, the controller running in AWS will no longer be able to operate. + +::: + +I cannot create a new machine pool + +Only Workspace Owners can create machine pools. Please make sure you have the correct access rights. + +I created a pool, but nothing happens + +Make sure the controller is in a **Connected** state: + +![controller-ready.png](/img/_paligo/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png) + +If the Controller is in a Connected state, please check the CloudWatch logs for any errors. The CloudWatch logs could hold information about the misconfigured settings. For example: + +- Image availability and access. +- Disk size requirement. +- Security group and subnet configuration issues. + +I have configured the pool and see a machine, but its status has been Starting for over 3 minutes now + +When a new MacOS instance starts in AWS, it could take 5-10 minutes to start the underlying infrastructure. + +Open the instance details and check the **Created at** field under **Machine details**: + +If you see that the host details are filled after minutes, but the instance details are empty, that probably means the pool configuration was incorrect. That could be confirmed under AWS CloudWatch logs. Possible issues include a non-existent SSH key, an incorrect subnet or security group, and an unavailable AMI ID configured. Based on the findings, update the machine pool configuration. + +![pool-detail.png](/img/_paligo/uuid-a30a61ec-5dea-3792-44ea-3e6d9c96b19d.png) + +The instance has started on the AWS infrastructure if the machine details are filled in. If you see that the machine was created more than 8-9 minutes ago and the machine’s status is still **Starting**, start investigating: + +- Ensure all the configurations and the AWS resources are correctly provided. +- Ensure the created instance can reach out to Bitrise: log in to the instance via the provided SSH key and ping exec.bitrise.io. + +I have created a pool, and machines are in the Running state, but I can't start builds on them + +Make sure that your builds are targeting the correct pool. In the Workflow Editor, every pool is selectable; make sure the correct `agent-pool-***` is selected for the builds. + +I have manually added a security group to one of the Bitrise-managed instances, but in a few seconds, the instance status becomes shutting-down + +The controller is responsible for achieving a state of machines configured on the Bitrise page. If any instances deviate from the required configuration, the controller identifies that and restarts the misconfigured resource. + +Please reconfigure the pool if you want to change such a configuration. + +I would like to reconfigure the pool to have fewer/more instances, but I don’t see the Edit button + +Only Workspace Owners can edit the pool configuration. Please make sure you have the correct access rights. + +I requested fewer machines, but in AWS, I still see Bitrise-managed dedicated hosts in pending/available status + +When a dedicated host is reserved, it cannot be released until 24 hours. The controller tries to free up the oldest dedicated hosts, but the dedicated host cannot be released if the 24-hour window has not passed. + +The controller is going to make sure to release the unneeded resources. + +I requested fewer machines 5 minutes ago, but there are still as many machines as I had before in the Running state + +Make sure that the controller is still in the **Connected** state. + +If the controller is connected, the system might prevent machine termination if builds are still running on the machines. If all the machines are running builds, the system marks the machine with the oldest dedicated host to be terminated. The machine termination will also start as soon as the running build finishes. + +The above logic does not target the build expected to finish first. Instead, it targets the dedicated host that could be released soonest to save you extra costs. + +I cannot delete the machine pool I have created + +Only Workspace Owners can delete a machine pool. Workspace Owners can also reconfigure the pools if any of the settings are incorrect, like the desired number of replicas. + +I need to access Bitrise Agent logs + +To obtain Bitrise Agent logs, configure CloudWatch Bitrise Agent logging. This is an optional feature but we highly recommend using it for better troubleshooting capabilities. diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/_category_.json b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/_category_.json new file mode 100644 index 0000000..6c452c4 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Bitrise on AWS: manual setup", + "position": 11, + "link": null +} diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/advanced-options-for-ec2-instances.mdx b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/advanced-options-for-ec2-instances.mdx new file mode 100644 index 0000000..99e754f --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/advanced-options-for-ec2-instances.mdx @@ -0,0 +1,28 @@ +--- +title: "Advanced options for EC2 instances" +sidebar_position: 4 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances +sidebar_label: Advanced options for Amazon EC2 Mac and Linux instances +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_IncreasingDiskSizeOnAMacInstance from '@site/src/partials/increasing-disk-size-on-a-mac-instance.mdx'; +import Partial_PreWarmingTheDiskAfterBooting from '@site/src/partials/pre-warming-the-disk-after-booting.mdx'; +import Partial_ConnectivityAndSecurityForYourEC2Instance from '@site/src/partials/connectivity-and-security-for-your-ec2-instance.mdx'; +import Partial_CleaningUpYourAWSBuildEnvironment from '@site/src/partials/cleaning-up-your-aws-build-environment.mdx'; + +For optimal use of the EC2 Mac and Linux instances, we recommend additional configuration that is not strictly required for the instances to run Bitrise builds. Some of these configuration options are best set during instance creation. + + + + + + + + + +## Using secrets in your builds running on AWS + +You can use secret Environment Variables even if your organization's security policy doesn't allow you to host them on bitrise.io: [Secrets in self-hosted environments](/en/bitrise-ci/configure-builds/secrets/secrets-in-self-hosted-environments). diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/allocating-a-dedicated-host-for-mac-instances.md b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/allocating-a-dedicated-host-for-mac-instances.md new file mode 100644 index 0000000..05f937b --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/allocating-a-dedicated-host-for-mac-instances.md @@ -0,0 +1,44 @@ +--- +title: "Allocating a dedicated host for Mac instances" +sidebar_position: 2 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/allocating-a-dedicated-host-for-mac-instances +sidebar_label: Allocating a dedicated host for EC2 Mac instances +--- + +Every Amazon EC2 Mac instance needs to run on a dedicated host. To be able to run the Bitrise AMI on an EC2 Mac instance, you'll need to allocate a dedicated host and launch the EC2 Mac instance on that host. Doing that requires knowing the host ID which AWS automatically generates when you allocate a host. + +:::note[AWS pricing for Mac dedicated hosts] + +For macOS instances, a dedicated host must be allocated. On-Demand EC2 Mac Dedicated Hosts have a minimum host allocation and billing duration of 24 hours. For more details, check out the official AWS documentation: [Amazon EC2 Dedicated Hosts Pricing](https://aws.amazon.com/ec2/dedicated-hosts/pricing/#Pricing_for_Dedicated_Hosts). + +::: + +:::important[Service quotas] + +Make sure you have enough service quotas in your selected region to be able to launch a dedicated host. + +- [Viewing current quotas](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html#view-limits). +- [Request an increase](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html#request-increase). + +::: + +1. On the EC2 Dashboard, find the **Instances** menu on the left navigation bar. +1. Select **Dedicated Hosts**. +1. Click **Allocate dedicated host**. +1. Fill out the required fields: + + - **Name tag**: This will be the name of your host. + + :::note[Host ID] + + The name is not the same as the host ID which you need to launch an EC2 instance on the dedicated host. The host ID is automatically generated by AWS. + + ::: + - **Instance family**: **mac2** + - **Instance type**: **mac2.metal, mac2-m2.metal, mac2-m2pro.metal** + - **Availability Zone**: It depends on the subnets you plan to use. AWS will tell you if there is no node capacity in your chosen zone. + - **Quantity**: The number of hosts you want to create. + - **Host maintenance**: Disabled. The `mac2` instance family does not support host maintenance +1. When you're ready, click **Allocate**. + +Once the host is ready, you can proceed to launch an EC2 Mac instance. diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview.mdx b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview.mdx new file mode 100644 index 0000000..dbc88b3 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview.mdx @@ -0,0 +1,28 @@ +--- +title: "AWS manual setup overview" +description: "Bitrise is available as an Amazon Machine Image (AMI) in the AWS Marketplace. With the Bitrise AMI, you can run Bitrise builds using your own AWS resources on Amazon EC2 instances connected to a Bitrise workspace." +sidebar_position: 1 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/aws-manual-setup-overview +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_IMPORTANTNoInboundTrafficRequired from '@site/src/partials/important-no-inbound-traffic-required.mdx'; +import Partial_SettingUpTheEC2Instance from '@site/src/partials/setting-up-the-ec2-instance.mdx'; + +Bitrise is available as an Amazon Machine Image (AMI) in the AWS Marketplace. With the Bitrise AMI, you can run Bitrise builds using your own AWS resources on Amazon EC2 instances connected to a Bitrise workspace. This section focuses on how to manually set up a fully customized AWS configuration for Bitrise builds. + + + +![aws-manual-setup-diagram.png](/img/_paligo/uuid-035193f8-4a3b-65de-4c0b-8054d2e63586.png) + +The manual setup also requires an active subscription to a Bitrise AMI: [Subscribing to the Bitrise on AWS AMI](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/subscribing-to-the-bitrise-on-aws-ami). + +:::note[Cloud Controller] + +Instead of the manual setup, we strongly recommend using the Cloud Controller to set up AWS for Bitrise builds: [Bitrise on AWS: Cloud Controller](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller). + +::: + + diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/index.md b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/index.md new file mode 100644 index 0000000..14bbd6c --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/index.md @@ -0,0 +1,7 @@ +--- +title: "Bitrise on AWS: manual setup" +sidebar_position: 11 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--manual-setup +--- + +Bitrise on AWS: manual setup diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami.mdx b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami.mdx new file mode 100644 index 0000000..4432f69 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami.mdx @@ -0,0 +1,27 @@ +--- +title: "Launching an EC2 instance for the Bitrise AMI" +sidebar_position: 3 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami +sidebar_label: Launching an EC2 Mac or Linux instance for the Bitrise AMI +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ConfiguringTheInstance from '@site/src/partials/configuring-the-instance.mdx'; +import Partial_PreparingYourEC2Instance from '@site/src/partials/preparing-your-ec2-instance.mdx'; +import Partial_ConnectingTheInstanceToYourBitriseWorkspace from '@site/src/partials/connecting-the-instance-to-your-bitrise-workspace.mdx'; + +We offer a dedicated Bitrise Amazon Machine Image (AMI) to run the Bitrise agent on your own Amazon EC2 Mac or Linux instance. + +This document guides you through launching an instance on the Amazon EC2 console UI. The process has three main phases but you can complete it in one sitting: + +1. [Preparing your EC2 Mac or Linux instance.](#UUID-b2a5e92d-ce72-cc4b-4484-3b4cac624f92) +1. [Configuring the instance on AWS.](#UUID-46863fa3-5c94-b0db-d8a5-d396b4fcb890) +1. [Connecting the instance to your Bitrise workspace.](#UUID-d16b94cd-ccca-3236-0163-c2689669e442) + + + + + + diff --git a/docs/bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching.mdx b/docs/bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching.mdx new file mode 100644 index 0000000..a14da90 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching.mdx @@ -0,0 +1,32 @@ +--- +title: "Bitrise on AWS: OS security patching" +description: "The responsibilities regarding OS security patching on AWS are shared between Bitrise and the customer. The exact responsibilities differ based on the AWS environment: different policies apply to macOS and Linux environments." +sidebar_position: 12 +slug: /bitrise-platform/infrastructure/bitrise-on-aws--os-security-patching +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_PatchingOnMacOSBareMetalEnvironment from '@site/src/partials/patching-on-macos-bare-metal-environment.mdx'; +import Partial_PatchingOnLinuxEnvironment from '@site/src/partials/patching-on-linux-environment.mdx'; +import Partial_SecurityPatchingReference from '@site/src/partials/security-patching-reference.mdx'; +import Partial_PatchingScenariosOnAWS from '@site/src/partials/patching-scenarios-on-aws.mdx'; +import Partial_PatchingOnMacOSVirtualizedEnvironment from '@site/src/partials/patching-on-macos-virtualized-environment.mdx'; + +On AWS, security patching and maintenance are governed by the [Shared Responsibility Model](https://aws.amazon.com/compliance/shared-responsibility-model/). For Bitrise, the most important issues are the following: + +- Host AMI updates +- Bitrise VM image updates (if applicable) + +The responsibilities regarding these tasks are shared between Bitrise and the customer. The exact responsibilities differ based on the AWS environment: different policies apply to macOS and Linux environments. + + + + + + + + + + diff --git a/docs/bitrise-platform/infrastructure/build-machines/_category_.json b/docs/bitrise-platform/infrastructure/build-machines/_category_.json new file mode 100644 index 0000000..5bbf8d0 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-machines/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Build machines", + "position": 2, + "description": "Bitrise offers Xcode and Linux stacks. Each stack has a large number of pre-installed tools.", + "link": null +} diff --git a/docs/bitrise-platform/infrastructure/build-machines/about-build-machines.mdx b/docs/bitrise-platform/infrastructure/build-machines/about-build-machines.mdx new file mode 100644 index 0000000..08bf0fb --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-machines/about-build-machines.mdx @@ -0,0 +1,24 @@ +--- +title: "About build machines" +description: "Bitrise offers Xcode and Linux stacks. Each stack has a large number of pre-installed tools." +sidebar_position: 1 +slug: /bitrise-platform/infrastructure/build-machines/about-build-machines +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +For [Bitrise CI](urn:resource:publication:94442), both Linux and Xcode stacks are available on several different build machine types. Each machine type offers several options with varying computing power, depending on [your subscription plan](http://www.bitrise.io/pricing). + +You can configure a default machine type for each of your projects and you can also set Workflow-specific machine types. You can do this when selecting stacks for your project: [Setting the stack for your builds](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds). + +:::tip[Changing machine types using the API] + +You can also change build machine types for all projects owned by a single user or workspace using the API: [Changing machine types in all apps at the same time](/en/bitrise-ci/api/adding-and-managing-apps/changing-machine-types-in-all-apps-at-the-same-time). + +::: + +Each Bitrise build machine has its own IP address range: you can allowlist these IP addresses to be able to access our build machines from, for example, a private cloud: [Configuring your network to access our build machines](/en/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines) + +For more information about build and code security, see [Code security](/en/bitrise-platform/infrastructure/code-security). diff --git a/docs/bitrise-platform/infrastructure/build-machines/build-machine-types.md b/docs/bitrise-platform/infrastructure/build-machines/build-machine-types.md new file mode 100644 index 0000000..7dccaca --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-machines/build-machine-types.md @@ -0,0 +1,37 @@ +--- +title: "Build machine types" +description: "Bitrise offers multiple build machines with different specifications. You can choose between them based on your needs." +sidebar_position: 4 +--- + +Bitrise offers multiple build machines with different specifications You can choose between them based on your needs. + +You can track how much time you spent building your apps on each machine type with Insights: [Bitrise CI metrics](/en/insights/available-metrics-in-insights/bitrise-ci-metrics). + +:::tip[Machine availability by subscription plan] + +Not all machines are available on all subscription plans. Visit [the pricing page](http://www.bitrise.io/pricing) to find out which machines are available on your plan! + +::: + +Machine types are divided into resource classes. The same resource class offers multiple machine types with broadly similar performances. Bitrise automatically assigns machine types from a resource class, which means that on the same day, your builds might run on different machine types. + +| Operating system | Resource class | Hardware types | Specs | Machine type ID for [YAML configuration](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds/setting-the-stack-in-the-bitriseyml-file) | +| --- | --- | --- | --- | --- | +| macOS | | | | | +| Medium | - M2 Pro Medium - M4 Medium | - 4 CPU @3.49GHz and 6 GB RAM - 5 CPU @4.4 GHz and 6 GB RAM | `g2.mac.medium` | | +| Large | - M2 Pro Large - M4 Large | - 6 CPU @3.49GHz and 14 GB RAM - 5 CPU @4.4 GHz and 14 GB RAM | `g2.mac.large` | | +| X Large | - M2 Pro X Large - M4 X Large | - 12 CPU @3.49GHz and 28 GB RAM - 10 CPU @4.4 GHz and 28 GB RAM | `g2.mac.x-large` | | +| 4Large | M4 Pro Large | 7 CPU @4.52GHz and 27 GB RAM | `g2.mac.4large` | | +| 4X Large | M4 Pro X Large | 14 CPU @4.52GHz and 54 GB RAM | `g2.mac.4x-large` | | +| Linux | Medium | 4 vCPU @ 3.1 GHz | 4 vCPU @3.1 GHz and 16 GB RAM | `standard` | +| Large | 8 vCPU @ 3.1 GHz | 8 vCPU @3.1 GHz and 32 GB RAM | `elite` | | +| X Large | 16 vCPU @ 3.1 GHz | 16 vCPU @3.1 GHz and 64 GB RAM | `elite-xl` | | +| M | AMD EPYC Zen 4 and Zen 5 | 4 vCPU @3.7 GHz and 16 GB RAM | `g2.linux.medium` | | +| 2M | AMD EPYC Zen 4 and Zen 5 | 6 vCPU @3.7 GHz and 24 GB RAM | `g2.linux.2medium` | | +| L | AMD EPYC Zen 4 and Zen 5 | 8 vCPU @3.7 GHz and 32 GB RAM | `g2.linux.large` | | +| 4L | AMD EPYC Zen 4 and Zen 5 | 14 vCPU @3.7 GHz and 56 GB RAM | `g2.linux.4large` | | +| XL | AMD EPYC Zen 4 and Zen 5 | 16 vCPU @3.7 GHz and 64 GB RAM | `g2.linux.x-large` | | +| 3XL | AMD EPYC Zen 4 and Zen 5 | 24 vCPU @3.7 GHz and 96 GB RAM | `g2.linux.3x-large` | | +| 5XL | AMD EPYC Zen 4 and Zen 5 | 32 vCPU @3.7 GHz and 128 GB RAM | `g2.linux.5x-large` | | +| 7XL | AMD EPYC Zen 4 and Zen 5 | 48 vCPU @3.7 GHz and 192 GB RAM | `g2.linux.7x-large` | | diff --git a/docs/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines.mdx b/docs/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines.mdx new file mode 100644 index 0000000..d94ea41 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines.mdx @@ -0,0 +1,24 @@ +--- +title: "Configuring your network to access our build machines" +description: "You can access Bitrise virtual machines from behind a private network or a firewall. To do so, allowlist our build machine IP addresses in your network." +sidebar_position: 2 +slug: /bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines +sidebar_label: Configuring network access with IP allowlists +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_IPAddressesForTheBuildMachines from '@site/src/partials/ip-addresses-for-the-build-machines.mdx'; +import Partial_IPAddressesForTheBitriseWebsite from '@site/src/partials/ip-addresses-for-the-bitrise-website.mdx'; +import Partial_DocumentChangelog from '@site/src/partials/document-changelog.mdx'; + +Our datacenters are behind a set of public static IP addresses, with the virtual machines having their own internal subnets behind these addresses. Depending on your company security policy, you may need to allowlist the public IP addresses to be able to access the build machine: [see topic](#UUID-0b5a9be7-1d03-edc2-cb48-01c84787cb86). + +Similarly, the Bitrise background workers powering [app.bitrise.io](http://app.bitrise.io) UI and related control plane, configuration management, signaling to your services are accessible at a set of static IP addresses. Allowlisting these addresses can ensure you can still receive build status updates or that Bitrise can access the `bitrise.yml` file: [see topic](#UUID-4e9b4482-a432-cb19-6e7c-4179abfa2a1e) of your app. + + + + + + diff --git a/docs/bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines.mdx b/docs/bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines.mdx new file mode 100644 index 0000000..8fcc7b8 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines.mdx @@ -0,0 +1,42 @@ +--- +title: "Freeing up storage space on build machines" +description: "To free up additional disk space on Bitrise build machines, delete unneeded tools and resources by using a Script Step in your build." +sidebar_position: 3 +slug: /bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkflowEditorAndSelectingAWorkflow from '@site/src/partials/opening-the-workflow-editor-and-selecting-a-workflow.mdx'; + +If you need additional disk space on Bitrise build machines, you can always delete tools and resources that you do not use. You just need to use a **Script** Step at the start of your build. + +:::note[java.io.IOException: No space left on device] + +If you get the `java.io.IOException: No space left on device` error during a build, you can try to free up additional space with the below method - the error indicates there's no more space available on the build machine. + +::: + +1. Check your stack's [System Report on GitHub](http://stacks.bitrise.io/). + + The System Report includes the list of [pre-installed tools](/en/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.html) and their version on the stack. +1. Find the tools you don't need in your build. +1. +1. Add a [**Script**](https://github.com/bitrise-io/steps-script) Step to the beginning of your Workflow. +1. In the **Script content** input of the Step, add the necessary commands to uninstall the tools. + +**Uninstalling unneeded tools** + +If your app doesn't need Android SDK tools, you can remove them with the following commands in your [**Script**](https://github.com/bitrise-io/steps-script) Step: + +``` +sudo rm -rf /usr/local/share/android-sdk +sudo rm -rf /opt/android-ndk +``` + +You can delete iOS simulators that you don't use: + +``` +sudo rm -rf ~/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\\ 10.3.simruntime/ +``` diff --git a/docs/bitrise-platform/infrastructure/build-machines/index.md b/docs/bitrise-platform/infrastructure/build-machines/index.md new file mode 100644 index 0000000..a06995c --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-machines/index.md @@ -0,0 +1,10 @@ +--- +title: "Build machines" +description: "Bitrise offers Xcode and Linux stacks. Each stack has a large number of pre-installed tools." +sidebar_position: 2 +slug: /bitrise-platform/infrastructure/build-machines +--- + +Build machines + +Bitrise offers Xcode and Linux stacks. Each stack has a large number of pre-installed tools. diff --git a/docs/bitrise-platform/infrastructure/build-stacks/_category_.json b/docs/bitrise-platform/infrastructure/build-stacks/_category_.json new file mode 100644 index 0000000..02e3b47 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Build stacks", + "position": 3, + "description": "The Bitrise build stack defines the virtual machine version used to run your builds. The main types are macOS stacks and Android & Docker stacks.", + "link": null +} diff --git a/docs/bitrise-platform/infrastructure/build-stacks/about-build-stacks.mdx b/docs/bitrise-platform/infrastructure/build-stacks/about-build-stacks.mdx new file mode 100644 index 0000000..8b18d2d --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/about-build-stacks.mdx @@ -0,0 +1,43 @@ +--- +title: "About build stacks" +description: "The Bitrise build stack defines the virtual machine version used to run your builds. The main types are macOS stacks and Android & Docker stacks." +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +The build stack indicates the virtual machine version that we will use to run your build. The main stack types are: + +- **macOS stacks**: These stacks run on a macOS operating system and each one includes multiple Xcode versions. Ideal for building iOS apps. They also have Android tools installed if you want to use them to build a cross-platform app. +- The **Android & Docker** stack: These stacks run on Linux operating system in a Docker environment. They have all Android tools installed and they are ideal for building native Android apps. + +:::note[Free disk space] + +Each stack has at least 100 GB of free disk space. You can check each stack's exact available disk space on the relevant stack report page: [Bitrise stack reports](https://stacks.bitrise.io/stack_reports/). + +::: + +Each build runs in its own virtual machine and the virtual machine is rolled back to a saved state, the “base box” state, after the build is finished. This way **your builds are always protected** by changes made by others and by your previous builds and you can use a **stable environment** to define your build workflow, since no state persists between builds. + +:::note[Passwordless sudo enabled] + +The user account that is used for the builds is configured to have **passwordless sudo** enabled. This way you are able to install all the extra things you need for your builds and for other automation. If a tool is not preinstalled on your stack of choice, you can install it yourself - see the guide. + +::: + +After adding your app to Bitrise we will select an appropriate stack for it. You can change the stack at any time on the **Stacks & Machines** tab of the Workflow Editor. + +![xcode_image.png](/img/_paligo/uuid-fc53715a-add5-8c4c-d4a6-9a04f5da6d3b.png) + +After selecting the stack you want to use, you’ll see a short description of the stack with an additional link to learn more about that specific one (for example, to see what tools are preinstalled, and which versions, on the selected stack). + +| Type | Description | +| --- | --- | +| Stable | Generally available and expected to be supported for the foreseeable future. Updated when an update for the stack’s primary tool is available. Example: when Xcode 7.3.1 was released, the Xcode 7.3 stack was updated to have 7.3.1 instead of 7.3(.0). | + +| Type | Description | +| --- | --- | +| Pre-booted | If a stack is available as pre-booted, and there’s enough pre-booted machines with that stack configuration, your build can start right away, without waiting for the build environment to boot. In case there’s no more available pre-booted machine with that stack configuration, your build will start on an on-demand configuration. | +| On-demand | If a stack is available as on-demand configuration and there’s no (available) pre-booted configuration for the stack, our system will have to create a virtual machine for your selected configuration when your build starts. This means that your build will be in preparing environment state while the related virtual machine is created & booted. For a macOS configuration the boot process usually takes about 1 - 1.5 minutes. The prepare time (of course) is not counted into the build time, it won’t affect how long your build can run. | diff --git a/docs/bitrise-platform/infrastructure/build-stacks/changelog.md b/docs/bitrise-platform/infrastructure/build-stacks/changelog.md new file mode 100644 index 0000000..d41d0c3 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/changelog.md @@ -0,0 +1,36 @@ +--- +title: "Changelog" +sidebar_position: 5 +--- + +## June 2025 + +**Changed** + +Mentions of Linux stack update policy has been moved on its own page, [Linux stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.html), with more information on Edge, Stable and Frozen stacks. It also describes the yearly cadence of new Linux stacks, as well as the deprecation and removal of older Linux stacks. + +Removed how to use previous versions of a stack from this page and added it to [Stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.html). + +## July 2024 + +**Removed**: + +Mentions of dependency manager cache updates. Both Cocoapods and Homebrew have better mechanisms now than cloning the entire registry git repo, and these newer mechanisms (Cocoapods CDN, Homebrew API) are enabled on stacks now. When stacks are updated, you can expect the on-disk repos to be up-to-date, but Stable stacks are no longer strictly updated weekly if there are no other changes to release. + +**Changed**: + +The breaking changes to stable macOS stacks (once a year when a new Xcode major version is released) no longer apply to older, existing stable stacks, only the newly released stable stack. For example, when Xcode 16.0 is released, the planned breaking changes only apply to the Xcode 16.0 stable stack. Xcode 14.x and 15.x stable stacks won’t receive breaking changes. + +## March 2024 + +**New**: + +Define what happens when an Edge stack is phased out in favor of a newer edge stack. + +**Removed**: + +When a new Xcode Edge stack is released, it no longer brings tooling changes to the Stable stacks. + +**Changed**: + +New, simpler simulator runtime policy. The same number of older iOS major versions are installed, but only the latest minor version is installed for each. diff --git a/docs/bitrise-platform/infrastructure/build-stacks/index.md b/docs/bitrise-platform/infrastructure/build-stacks/index.md new file mode 100644 index 0000000..ed93846 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/index.md @@ -0,0 +1,9 @@ +--- +title: "Build stacks" +description: "The Bitrise build stack defines the virtual machine version used to run your builds. The main types are macOS stacks and Android & Docker stacks." +sidebar_position: 3 +--- + +Build stacks + +The Bitrise build stack defines the virtual machine version used to run your builds. The main types are macOS stacks and Android & Docker stacks. diff --git a/docs/bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy.md b/docs/bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy.md new file mode 100644 index 0000000..3187a60 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy.md @@ -0,0 +1,94 @@ +--- +title: "Linux stack update policy" +sidebar_position: 4 +--- + +Linux stacks on Bitrise are based on Ubuntu LTS releases. Each Bitrise stack is based on one Ubuntu LTS version and never gets upgraded to another. Instead, we release new stacks and sunset older ones over time. + +:::note[Previous version of a stack] + +Updating a stack to a new version might cause problems with some builds. To help ease the transition, you can use the previous version of a stack for 2-3 days after an update: [Using the previous version of a stack](/en/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy/using-the-previous-version-of-a-stack). + +::: + +For macOS specific information, check out [macOS stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html). + +## Linux stack offerings + +Bitrise offers multiple Linux stacks to handle different use-cases. + +You can check the available stacks at any given time [here](https://bitrise.io/stacks/). + +Each stack is based on one release of a Linux distribution. At the moment, we offer stacks based on Ubuntu LTS releases. Tools are installed on this base image, creating the Bitrise edition of a system. + +The stack name and ID contains all of the above parameters and looks like this in practice: + +- Name: Ubuntu Noble 24.04 - Bitrise 2025 Edition +- ID: `ubuntu-noble-24.04-bitrise-2025-android` + +There are subtle differences between the different Linux stacks and their update frequency. You need to be aware of these details in order to pick the right stack and to avoid sudden broken builds. + +## Linux stack updates + +A new Bitrise edition and a new stack is created each year. This is always based on the latest Ubuntu LTS release. + +Besides the new Ubuntu release, this new yearly Bitrise edition contains breaking changes that would have been too disruptive to ship in existing stacks. For example: + +- Upgrading a preinstalled tool to a new version with breaking changes. +- When multiple versions of a tool are installed (for example, Ruby, Node.js,), removing an old version that reached its end-of-life and no longer receives security fixes. +- Configuration changes that could be breaking to some or all user workflows. + +| Year of stack release | Stack name | Ubuntu base | +| --- | --- | --- | +| 2024 | Ubuntu Jammy 22.04 - Bitrise 2024 Edition | Ubuntu 22.04 LTS | +| 2025 | Ubuntu Noble 24.04 - Bitrise 2025 Edition | Ubuntu 24.04 LTS | +| **Future releases** (release codenames are unknown at this point) | | | +| 2026 | Ubuntu 26.04 - Bitrise 2026 Edition | Ubuntu 26.04 | +| 2027 | Ubuntu 26.04 - Bitrise 2027 Edition | | +| 2028 | Ubuntu 28.04 - Bitrise 2028 Edition | Ubuntu 28.04 | +| 2029 | Ubuntu 28.04 - Bitrise 2029 Edition | | + +## Stack lifecycle + +Similar to macOS Bitrise stacks, the Linux ones have the following lifecycle: Edge, Stable, Frozen, Removed. + +A new stack is introduced as an edge stack first, then, after a year of testing and feedback, it becomes a stable stack. One year later it’s marked as frozen, then completely removed after one more year. + +Different stages of a single stack: + +![stack-state-change.svg](/img/_paligo/uuid-5169df38-e851-52da-fb4f-d37c3f98e8d8.svg) + +Every year, around April and the release of the new Ubuntu version: + +- A new stack is introduced as an edge stack. +- Last year’s edge stack becomes stable. +- Last year’s stable stack becomes frozen. +- Last year’s frozen stack gets removed. + +Changing states presented with previous and future stacks: + +![multiple-stack-state-change.svg](/img/_paligo/uuid-bcc68f5e-feec-8292-2e57-1bfb0dd9d9b9.svg) + +Before a stack is removed, it’s flagged for removal, and you see the final removal date throughout the UI. Additionally, the remaining users of the stack receive an email notification from Bitrise. + +## Which stack to choose? + +At any given time, you can choose from at least one edge, stable and frozen stack. The following table helps make this choice: + +| | Edge | Stable | Frozen | +| --- | --- | --- | --- | +| Stable stack ID which can be included in bitrise.yml | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Security updates to OS components, system libraries and preinstalled tools | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Updates to OS components and system libraries | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Addition of new tools and tool versions | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Breaking changes in stack updates to existing tools and tool versions | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| New experimental features and configuration changes | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Removal of tools and tool versions | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | + +## Changelog + +June 2025 + +**New** + +Introduced the concept of Edge, Stable and Frozen stacks with regards to Linux, similar to the [macOS stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html). Defined the yearly cadence of new Linux stacks, as well as the deprecation and removal of older Linux stacks. diff --git a/docs/bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy.mdx b/docs/bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy.mdx new file mode 100644 index 0000000..121e866 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy.mdx @@ -0,0 +1,14 @@ +--- +title: "macOS stack update policy" +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_Changelog from '@site/src/partials/changelog.mdx'; +import Partial_XcodeStackUpdates from '@site/src/partials/xcode-stack-updates.mdx'; + + + + diff --git a/docs/bitrise-platform/infrastructure/build-stacks/managing-java-versions.mdx b/docs/bitrise-platform/infrastructure/build-stacks/managing-java-versions.mdx new file mode 100644 index 0000000..fabaa07 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/managing-java-versions.mdx @@ -0,0 +1,23 @@ +--- +title: "Managing Java versions" +description: "All Bitrise virtual machines have multiple Java versions ready to use." +sidebar_position: 8 +slug: /bitrise-platform/infrastructure/build-stacks/managing-java-versions +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SettingJavaVersionWithTheSetJavaVersionStep from '@site/src/partials/setting-java-version-with-the-set-java-version-step.mdx'; + +By default, every Bitrise stack comes with [multiple Java versions](https://stacks.bitrise.io/tools/java/) pre-installed and ready to use. If you do not switch to another version, your build will use the default Java versions. + +You can switch between the versions at any time. You can also install a different Java version. + +:::tip[Configuring other tools] + +For other tools, you can specify the version you want to use in your builds: [Configuring tool versions](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions). + +::: + + diff --git a/docs/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.mdx b/docs/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.mdx new file mode 100644 index 0000000..2453a1f --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.mdx @@ -0,0 +1,27 @@ +--- +title: "Preinstalled tools on Bitrise stacks" +description: "Every Bitrise stack comes up with a large number of preinstalled tools and applications. Check the list in the system reports repository." +sidebar_position: 9 +slug: /bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Every Bitrise stack comes up with a large number of preinstalled tools and applications to make sure the build process of your projects is as smooth and fast as possible. + +Every time we create or update a stack we publish a stack report for it as well. The stack reports include the list of preinstalled tools and their version on the stack. + +Both macOS and Linux stacks are updated regularly to provide the latest installed tool versions: + +- [macOS stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy). +- [Linux stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy). + +You can find every available stack’s stack report on our dedicated page: [Bitrise stack reports](https://stacks.bitrise.io/stack_reports/). + +:::tip[Configuring tool versions] + +You can tell Bitrise which tool versions to use or to install tools not found on the build machines. For more information, see: [Configuring tool versions](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions). + +::: diff --git a/docs/bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy.mdx b/docs/bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy.mdx new file mode 100644 index 0000000..7e09c61 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy.mdx @@ -0,0 +1,21 @@ +--- +title: "Stack deprecation and removal policy" +description: "On Bitrise, Android stacks are supported for around two years; Xcode stacks are deprecated gradually as new Xcode versions are released." +sidebar_position: 6 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_MaintainingMacOSStacks from '@site/src/partials/maintaining-macos-stacks.mdx'; +import Partial_DeprecatingAndroidDockerStacks from '@site/src/partials/deprecating-android-docker-stacks.mdx'; + +We don't keep all stacks around forever: our aim is to provide you with the latest tools to help you build the best app you can. However, we don't expect you to rework your build configuration every time a stack update comes out: you can keep using your reliable older stacks for a long time. + +Some older stacks are frozen when a new major version of Xcode is released. When a stack is frozen, you can still keep using it, but the stack will no longer get any updates, and at that point, we strongly recommend switching to a newer, active stack. + +After stacks have been frozen for a year, they are removed when the next major version of Xcode is released. + + + + diff --git a/docs/bitrise-platform/infrastructure/build-stacks/stack-update-policy.mdx b/docs/bitrise-platform/infrastructure/build-stacks/stack-update-policy.mdx new file mode 100644 index 0000000..1a814fb --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/stack-update-policy.mdx @@ -0,0 +1,34 @@ +--- +title: "Stack update policy" +description: "Bitrise stacks are updated every week: some stacks are completely rebuilt while on others only certain cache archives are updated." +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UsingThePreviousVersionOfAStack from '@site/src/partials/using-the-previous-version-of-a-stack.mdx'; + +Bitrise stacks include the most important tools for mobile development pre-installed and ready for use. Our goal is to make Workflows simple and make your builds fast and efficient. These tools change continuously: old versions become deprecated and unsupported while new versions are released with new features and breaking changes. + +Stacks on [bitrise.io](https://www.bitrise.io) are updated regularly. The updates contain one or more of the following kinds of changes: + +- Tool upgrade: An already installed tool is upgraded to the latest version (for example, the git CLI is upgraded from 2.9.1 to 2.9.5). +- Tool addition: A new tool is added (for example, the latest Android emulator system image becomes preinstalled when a new Android version is released). +- Tool removal: A tool version is removed if it reaches end-of-life and poses a security risk, making another version of the tool the default (for example, Ruby 2.7 is removed, making Ruby 3.0 the new default). +- Platform changes: Changes to major components, like Xcode on macOS stacks, OS versions, Android SDK. + +If you wish to read more on our Linux and MacOS stack update policies, check out: + +- [macOS stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy) +- [Linux stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy) + +:::note[Using the previous version of a stack] + +Updating a stack to a new version might cause problems with some builds. To help ease the transition, you can use the previous version of a stack for 2-3 days after an update: [Using the previous version of a stack](/en/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy/using-the-previous-version-of-a-stack). + +::: + +For more information on what tools are available on the different stacks, check out our relevant guide: [Preinstalled tools on Bitrise stacks](/en/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks) + + diff --git a/docs/bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment.md b/docs/bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment.md new file mode 100644 index 0000000..8bc6c4a --- /dev/null +++ b/docs/bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment.md @@ -0,0 +1,36 @@ +--- +title: "The Android/Linux/Docker environment" +description: "Bitrise's Android stacks run on Linux-based virtual machines that are created from Docker images. You can find all the image files on GitHub." +sidebar_position: 7 +slug: /bitrise-platform/infrastructure/build-stacks/the-android-linux-docker-environment +--- + +For our Linux-based stacks, we use standard Docker images, hosted on [Docker Hub](https://hub.docker.com/). You can find the available stacks, called **Ubuntu for Android & Docker**, in our [stack reports](https://stacks.bitrise.io/stack_reports/). + +:::note[Pre-installed tools] + +All stacks have a large number of pre-installed tools available: [Preinstalled tools on Bitrise stacks](/en/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks) + +::: + +Every build runs in a new VM, not just in a new container. The VM is destroyed right after the build. This allows us to grant you full control over `Docker` and the whole environment. + +When your build starts on a Docker-based stack, we volume mount the `/var/run/docker.sock` socket into your container (similar to calling `docker run -v /var/run/docker.sock:/var/run/docker.sock ...`. You can find a description about this access granting method [here](https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/)). + +The `docker` binary has to be installed inside the base Docker image because docker started to migrate from a single-binary solution to dynamically loaded components, and simply sharing the `docker` binary is not sufficient anymore. + +We install Docker in every one of our Docker images so that you don’t have to do anything if you use our image, or you base your own image on our Docker images. + +This means that you have access to `docker` in your container, and can use other tools which use docker, like [docker-compose](https://docs.docker.com/compose). You can, for example, configure and run tests and other automations on website projects using `docker-compose`. + +You can call `docker info`, `docker build`, `docker run`, `docker login`, `docker push` exactly how you would on your own machine. + +:::note[Shared volumes] + +If you want to run `docker` in your build and share volumes, please note that only those volumes can be shared that are shared with the base docker container (the one your build is running in). This is due to how `docker` handles volume sharing. Everything under `/bitrise` can be mounted as a volume, but no other path is guaranteed to work with `--volume` mapping. + +It means that if you use the standard paths and you use relative paths to mount volumes, it’ll work as expected, as the default source code directory is located inside `/bitrise` (by default it’s `/bitrise/src` in our Docker images). + +What WON’T WORK, however, is if you change the source code directory to be located outside of `/bitrise`, or you want to mount a folder with an absolute path outside of `/bitrise`. + +::: diff --git a/docs/bitrise-platform/infrastructure/cleaning-up-persistent-build-environments.mdx b/docs/bitrise-platform/infrastructure/cleaning-up-persistent-build-environments.mdx new file mode 100644 index 0000000..0bc6821 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/cleaning-up-persistent-build-environments.mdx @@ -0,0 +1,199 @@ +--- +title: "Cleaning up persistent build environments" +description: "You can configure the Bitrise CLI to run in agent mode: this allows cleaning up persistent build environments when running builds on self-hosted agents." +sidebar_position: 13 +slug: /bitrise-platform/infrastructure/cleaning-up-persistent-build-environments +sidebar_label: Cleaning up a persistent build environment +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_NOTESecretsInSelfHostedEnvironments from '@site/src/partials/note-secrets-in-self-hosted-environments.mdx'; + +On Bitrise, a new virtual machine is created every time a build starts and it is destroyed when the build is finished. You can, however run Bitrise builds in a persistent build environment: for example, you can use [our on-premise runner](/en/bitrise-platform/infrastructure/running-bitrise-builds-on-premise.html) or [run builds on an Amazon EC2 instance](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup.html). In such an environment, the products of one build might affect subsequent builds. + +On self-hosted infrastructure, one Bitrise runner executes multiple builds. This allows sharing data between builds on the local filesystem, but it also requires care in order to avoid one build affecting another. + +To avoid the problem, you can configure the Bitrise CLI to run in **agent mode**. Agent mode requires placing an `agent-config.yml` in the host machine's `~/.bitrise/` directory. In the file, you can specify which directories to clean up when starting a new build or at the end of a build. It also allows you to run your own custom scripts if you have a more advanced use case than a simple cleanup. + + + +## Configuring agent mode + + + + +1. Add the `agent-config.yml` file to your `~/.bitrise/` directory. +1. If you wish to configure the exact folders in which you want to do cleanup operations, define a `bitrise_dirs` property. + + The property overrides the default settings: for example, you can set a different path for the BITRISE_DEPLOY_DIR environment variable than the default. +1. Under `bitrise_dirs`, define the directories that you wish to perform some action on at the start or at the end of builds in a `KEY: path` format. + + For example, you can define separate directories for all source code checkout, deployable artifacts, and deployable test result artifacts. + + ``` + # Customize the common Bitrise directories + bitrise_dirs: + # Root directory for all Bitrise data produced at runtime + BITRISE_DATA_HOME_DIR: /Users/ec2-user/bitrise + + # Directory for source code checkout. + BITRISE_SOURCE_DIR: /Users/ec2-user/bitrise/workspace/$BITRISE_APP_SLUG + + # Directory for deployable artifacts. + BITRISE_DEPLOY_DIR: /Users/ec2-user/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/artifacts + + # Directory for deployable test result artifacts. + BITRISE_TEST_DEPLOY_DIR: /Users/ec2-user/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/test_results + + # Directory for the html reports + BITRISE_HTML_REPORT_DIR: /Users/ec2-user/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/html_reports + ``` + + :::caution[Multiple projects of the same Workspace] + + Don’t forget that multiple projects of the same Workspace could run on the same agent. Make sure to always include $BITRISE_APP_SLUG in the directory hierarchy to separate projects and their source code checkouts. + + ``` + # wrong: + BITRISE_SOURCE_DIR: /opt/bitrise/workspace + # correct: + BITRISE_SOURCE_DIR: /opt/bitrise/workspace/$BITRISE_APP_SLUG + ``` + + ::: +1. Add a `hooks` property to the `agent-config.yml` file. This property will define the actions to perform at the start or end of builds. It has four different parameters: + + - `cleanup_on_build_start`: Defines a directory that is cleaned up when a new build is started. + - `cleanup_on_build_end`: Defines a directory that is cleaned up whenever a build is finished. Not guaranteed to run in the case of build failure. + - `do_on_build_start`: Defines a custom script that runs when a new build is started. + - `do_on_build_end`: Defines a custom script that runs when a build is finished. Not guaranteed to run in the case of build failure. + + :::important[Nested Workflows] + + A [**Script**](https://github.com/bitrise-io/steps-script) Step in a Workflow can execute `bitrise run nested_workflow` and trigger a nested workflow. This nested Workflow inherits all the envs and parameters of the parent Workflow, and the parent Workflow waits for the completion of the nested Workflow. When the nested Workflow is launched this way, hooks and directory cleanups are not executed in this process to avoid unexpected behavior. + + ::: +1. To test the agent mode, start a build. The log should show the following message at the top: + + ``` + Running in agent mode + Config file: .bitrise/agent-config.yml + ``` + + + + +1. Add the `agent-config.yml` file to your `~/.bitrise/` directory. +1. If you wish to configure the exact folders in which you want to do cleanup operations, define a `bitrise_dirs` property. + + The property overrides the default settings: for example, you can set a different path for the BITRISE_DEPLOY_DIR environment variable than the default. +1. Under `bitrise_dirs`, define the directories that you wish to perform some action on at the start or at the end of builds in a `KEY: path` format. + + For example, you can define separate directories for all source code checkout, deployable artifacts, and deployable test result artifacts. + + ``` + # Customize the common Bitrise directories + bitrise_dirs: + # Root directory for all Bitrise data produced at runtime + BITRISE_DATA_HOME_DIR: /opt/bitrise + + # Directory for source code checkout. + BITRISE_SOURCE_DIR: /opt/bitrise/workspace/$BITRISE_APP_SLUG + + # Directory for deployable artifacts. + BITRISE_DEPLOY_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/artifacts + + # Directory for deployable test result artifacts. + BITRISE_TEST_DEPLOY_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/test_results + + # Directory for the html reports + BITRISE_HTML_REPORT_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/html_reports + ``` + + :::caution[Multiple projects of the same Workspace] + + Don’t forget that multiple projects of the same Workspace could run on the same agent. Make sure to always include $BITRISE_APP_SLUG in the directory hierarchy to separate projects and their source code checkouts. + + ``` + # wrong: + BITRISE_SOURCE_DIR: /opt/bitrise/workspace + # correct: + BITRISE_SOURCE_DIR: /opt/bitrise/workspace/$BITRISE_APP_SLUG + ``` + + ::: +1. Add a `hooks` property to the `agent-config.yml` file. This property will define the actions to perform at the start or end of builds. It has four different parameters: + + - `cleanup_on_build_start`: Defines a directory that is cleaned up when a new build is started. + - `cleanup_on_build_end`: Defines a directory that is cleaned up whenever a build is finished. Not guaranteed to run in the case of build failure. + - `do_on_build_start`: Defines a custom script that runs when a new build is started. + - `do_on_build_end`: Defines a custom script that runs when a build is finished. Not guaranteed to run in the case of build failure. + + :::important[Nested Workflows] + + A [**Script**](https://github.com/bitrise-io/steps-script) Step in a Workflow can execute `bitrise run nested_workflow` and trigger a nested workflow. This nested Workflow inherits all the envs and parameters of the parent Workflow, and the parent Workflow waits for the completion of the nested Workflow. When the nested Workflow is launched this way, hooks and directory cleanups are not executed in this process to avoid unexpected behavior. + + ::: +1. To test the agent mode, start a build. The log should show the following message at the top: + + ``` + Running in agent mode + Config file: .bitrise/agent-config.yml + ``` + + + + +## Common configuration examples + +**Fully isolated builds** + +To minimize state and maximize reliability, each build is assigned unique directories. Source code is checked out from scratch in each build. + +``` +bitrise_dirs: + BITRISE_DATA_HOME_DIR: /opt/bitrise + BITRISE_SOURCE_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/workspace + BITRISE_DEPLOY_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/artifacts + BITRISE_TEST_DEPLOY_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/test_results + BITRISE_HTML_REPORT_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/html_reports + +hooks: + # Since dirs are unique to each build, there is nothing to clean up here: + cleanup_on_build_start: [] + + # Clean up everything after the build ends: + cleanup_on_build_end: + - $BITRISE_SOURCE_DIR + - $BITRISE_DEPLOY_DIR + - $BITRISE_TEST_DEPLOY_DIR + - $BITRISE_HTML_REPORT_DIR +``` + +**Shared source code directory for warm checkouts** + +For faster source code checkouts, it’s possible to reuse a previous build’s source code directory. + +``` +bitrise_dirs: + BITRISE_DATA_HOME_DIR: /opt/bitrise + # Use a warm clone of the repo for all builds: + BITRISE_SOURCE_DIR: /opt/bitrise/$BITRISE_APP_SLUG/workspace + # For artifacts and test results, it's still a good idea to place them into unique dirs + BITRISE_DEPLOY_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/artifacts + BITRISE_TEST_DEPLOY_DIR: /opt/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/test_results + BITRISE_HTML_REPORT_DIR: /Users/ec2-user/bitrise/$BITRISE_APP_SLUG/$BITRISE_BUILD_SLUG/html_reports + +hooks: + # Since dirs are unique to each build, there is nothing to clean up here: + cleanup_on_build_start: [] + + # Optional: clean up artifacts and test results. + # Note that $BITRISE_SOURCE_DIR is NOT clean up here! + cleanup_on_build_end: + - $BITRISE_DEPLOY_DIR + - $BITRISE_TEST_DEPLOY_DIR + - $BITRISE_HTML_REPORT_DIR +``` diff --git a/docs/bitrise-platform/infrastructure/code-security.mdx b/docs/bitrise-platform/infrastructure/code-security.mdx new file mode 100644 index 0000000..bd10f14 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/code-security.mdx @@ -0,0 +1,25 @@ +--- +title: "Code security" +description: "Every Bitrise build runs in a new virtual machine that has no access to previous builds. We do not store your source code and you can set up how it is accessed." +sidebar_position: 4 +slug: /bitrise-platform/infrastructure/code-security +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SourceCode from '@site/src/partials/source-code.mdx'; +import Partial_Passwords from '@site/src/partials/passwords.mdx'; +import Partial_CodeSigningAndOtherFiles from '@site/src/partials/code-signing-and-other-files.mdx'; + +To guarantee the security of your code, every Bitrise build runs in its own, clean virtual machine and we discard the whole virtual machine after the build finishes, erasing every file your build uses and every change you make during your build. + +This is also true for the Android & Docker stacks, which use Docker containers to run the build. The build itself still gets a full virtual machine where no other Docker container is started, only the one used as the environment of the build. In short, we only use Docker containers to manage the environment, not for build environment isolation - that’s ensured by using full virtual machines for every build. + +This way your builds are always protected from changes made by others and from your previous builds, no one else can access your code and you can use a stable environment to define your build Workflow. Every build is completed in an isolated environment, unrelated to any previous or parallelly running builds. + + + + + + diff --git a/docs/bitrise-platform/infrastructure/configuring-runner-pools.mdx b/docs/bitrise-platform/infrastructure/configuring-runner-pools.mdx new file mode 100644 index 0000000..1b5ccf5 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/configuring-runner-pools.mdx @@ -0,0 +1,42 @@ +--- +title: "Configuring runner pools" +description: "Running Bitrise on self-hosted infrastructure requires setting up agent pools in your Bitrise Workspace. This reserves build agents for use in your self-hosted builds, and provides a token to authenticate the agent to Bitrise." +sidebar_position: 8 +slug: /bitrise-platform/infrastructure/configuring-runner-pools +sidebar_label: Configuring runner pools for self-hosted builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkspaceSettingsPage from '@site/src/partials/opening-the-workspace-settings-page.mdx'; + +You can run Bitrise builds on hardware you control. We offer two different options: + +- [Running builds on Amazon EC2 instances](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup.html). +- [Using our on-premise runner](/en/bitrise-platform/infrastructure/running-bitrise-builds-on-premise.html) to run builds on your own machines, or at other cloud providers. + +Both options require setting up runner pools in your Bitrise Workspace. This reserves build runners for use in your self-hosted builds. Each reserved pool comes with a unique token: this token is required for both an Amazon EC2 instance and the on-premise runner to be able to connect to your Bitrise Workspace and run builds of the apps owned by the Workspace. You can configure and run these builds from the Workflow Editor, as any other build. + +To do so: + +1. +1. On the left, select **Self-hosted infrastructure**. +1. Select the **Bitrise runners** tab. +1. In the **Runner pools** section, click **Add new**. + + ![_2025-11-03-runner-pool.png](/img/_paligo/uuid-3ca810bc-4569-859b-f0be-784644322a22.png) +1. Type a name into the **Name** field then click **Next**. + + ![add-pool.png](/img/_paligo/uuid-e5387f19-bcbb-472b-a2fa-9c9d9aeb1c6d.png) +1. You will receive a token. Copy this token: you will need it for authentication. +1. Open the app you need on Bitrise and click **Workflows**. +1. Click **Edit bitrise.yml** to go the Workflow Editor, and select **Stacks & Machines** on the left navigation menu. +1. Find your own stack in the stack selection dropdown menus: it will be called **Self-hosted Runner: **. + + ![stack-select.png](/img/_paligo/uuid-1ec5901d-3577-8321-6e4f-faa9fa366c21.png) + + For example, if you named your pool `my-pool`, the stack will be called **Self-hosted Runner: my-pool**. +1. Click **Save** in the top right corner. + +Now your builds will run using the reserved runner pools diff --git a/docs/bitrise-platform/infrastructure/customizable-enterprise-build-platforms.md b/docs/bitrise-platform/infrastructure/customizable-enterprise-build-platforms.md new file mode 100644 index 0000000..9928541 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/customizable-enterprise-build-platforms.md @@ -0,0 +1,31 @@ +--- +title: "Customizable enterprise build platforms" +description: "Bitrise offers two types of custom build platforms for enterprises: dedicated build platforms behind the Bitrise firewall and private build platforms on the user's own environment." +sidebar_position: 5 +slug: /bitrise-platform/infrastructure/customizable-enterprise-build-platforms +--- + +Bitrise offers fully-managed build platforms tailored to the needs of [enterprise](https://bitrise.io/pricing) customers. Using a custom enterprise build platform means running your Bitrise builds on virtual machines (VM) dedicated and specifically configured to your needs. With a private cloud, you have complete control over how and when your builds run. + +Bitrise offers three types of custom build platforms for enterprises: + +- Dedicated build platform: a set of dedicated machines behind the Bitrise firewall that serve our public and dedicated pools. These virtual build machines will be seen from [the same public IP address as any Bitrise build machine](/en/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines) but the build nodes (the hypervisors running the virtual build machines) are reserved for your exclusive use during the build. +- Dedicated plus build platform: same setup as the dedicated build platform with additional IP range reserved for the customer for increased network secure connection. +- Private build platform: the private machines are reserved for your exclusive use at all times. The solution also is provisioned to you and includes your own firewall, more flexible storage capacity options, and a more flexible computing environment setup. It allows you to create custom virtualization configuration, as well as includes [site-to-site VPN option](https://docs.bitrise.io/en/bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.html). + +The private build platform is an advanced set-up with plenty of configuration options. To learn more about the details, [contact us](https://bitrise.io/contact)! + +Check out the most important differences between the dedicated and the private build platforms: + +| Available service | Dedicated build platform | Dedicated plus build platform | Private build platform | +| --- | --- | --- | --- | +| Reserved IP address | - | Yes | Yes | +| Private network with a dedicated firewall | - | - | Yes | +| High Availability continental US setup, served by multiple Bitrise Data Centers for redundancy | Yes | Yes | Yes | +| Served from single EU Bitrise Data Center without redundancy | Yes | Yes | Yes | +| macOS virtual machines tailored to unique Enterprise requirements | Served by M4 Pro 14-core, M4 10-core or M2 Pro 12-core machines up to 54 GB RAM | | | +| Linux virtual machines tailored to unique Enterprise requirements | Offering machine types between 2 vCPU 8 GB RAM and 192 vCPU 768 GB RAM powered by AMD EPYC Zen5 and Zen4 architectures. | | | +| Dedicated Customer Success Engineer, who is an expert in Mobile CI/CD. | Yes | Yes | Yes | +| Initial onboarding assistance for the first month with weekly calls. | Yes | Yes | Yes | +| Continued CI/CD best practices mentoring with monthly check-ins from Bitrise Account Managers and Customer Success Engineers. | Yes | Yes | Yes | +| Weekly Infrastructure maintenance that includes licenses for virtualization, orchestration, and data storage. | Yes | Yes | Yes | diff --git a/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/_category_.json b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/_category_.json new file mode 100644 index 0000000..45b2b02 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Docker containers on Bitrise", + "position": 6, + "description": "Customers using the Bitrise-managed Linux machines can take advantage of advanced capabilities with Docker containers.", + "link": null +} diff --git a/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise.mdx b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise.mdx new file mode 100644 index 0000000..4e2cc00 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise.mdx @@ -0,0 +1,38 @@ +--- +title: "About Docker containers on Bitrise" +description: "Container support enables the use of any Docker container image as an execution environment for a group of Steps within a Workflow. It also enables running background services : this can be used, for example, to run advanced testing scenarios." +sidebar_position: 1 +slug: /bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ContainerResourceOptions from '@site/src/partials/container-resource-options.mdx'; +import Partial_DockerAuthenticationCredentials from '@site/src/partials/docker-authentication-credentials.mdx'; +import Partial_ContainerNestingRules from '@site/src/partials/container-nesting-rules.mdx'; + +Use any Docker image as the execution environment for your Steps or as a background service: spin up a database, HTTP server, or any dependency your tests need. + +Using containers comes with several potential benefits: + +- Full control over your build environment. Install any tool, any version, without waiting on Bitrise to support it. +- Dependencies live in the image. This reduces build times and complexity. No need to install them during the build itself. This reduces build times and complexity. +- You can use the same environment that you use locally to test and build the app. + +There are two types of containers supported on Bitrise: + +- [Execution containers](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers): You can run Steps or Step bundles within execution containers. This provides an easy, clean and reliable way to provision a build environment. +- [Service containers](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers.html): Define service containers and refer to them in Steps or Step bundles to run services in the background while running a Step or Step bundle. Examples of services might include an HTTP server, a database, or any other type of executable program that you wish to run in a distributed environment. + +:::important[Linux only] + +This is a Linux-only feature. macOS-based environments are not supported. + +::: + + + + + + diff --git a/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image.md b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image.md new file mode 100644 index 0000000..1ddb1f3 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image.md @@ -0,0 +1,132 @@ +--- +title: "Building your own Docker image" +description: "You can create your own Docker image and push it to a container registry during a Bitrise build with the [Docker Build & Push Step](https://github.com/bitrise-steplib/bitrise-step-docker-build-push/blob/main/step.yml)." +sidebar_position: 4 +slug: /bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image +sidebar_label: Building your own Docker image on Bitrise +--- + +You can create your own Docker image and push it to a container registry during a Bitrise build with the [Docker Build & Push Step](https://github.com/bitrise-steplib/bitrise-step-docker-build-push/blob/main/step.yml). + +The Step uses the `docker build` [command](https://docs.docker.com/engine/reference/commandline/image_build/): it requires a [Dockerfile](https://docs.docker.com/engine/reference/builder/) that contains the build instructions and a build context. Build context means the set of files located at the specified path. The Step allows you to pass [options](https://docs.docker.com/engine/reference/commandline/image_build/#options) and [build arguments](https://docs.docker.com/build/guide/build-args/) to the build. + +To speed up your builds, the Step also supports [key-based caching](/en/bitrise-ci/dependencies-and-caching/key-based-caching.html). + +To build the image with build options, build arguments and caching used: + +Workflow Editor + +bitrise.yml + +1. Add the **Docker Build & Push** Step to your Workflow. +1. Configure the required inputs for the Step: + + - **Image tags**: A list of tags to be applied to the name of the built image. You can add one tag per line. For more information about image tags, their function, and their required format, check out [the Docker documentation](https://docs.docker.com/engine/reference/commandline/image_tag/). + - **Build context path**: The path to the files that constitute your build context. It should be relative to your Bitrise working directory. + - **Dockerfile path**: The path to the Dockerfile you wish to use. It should be relative to your Bitrise working directory. +1. If you want to push the built image to a container registry, set the **Push docker image** input to **true**. +1. To cache the image, set the **Use Bitrise key-value cache** input to **true**. + + The input uses the following cache keys: + + - `docker-imagename-{{ .OS }}-{{ .Arch }}-{{ .Branch }}-{{ .CommitHash }}` + - `docker-imagename-{{ .OS }}-{{ .Arch }}-{{ .Branch }}` + - `docker-imagename-{{ .OS }}-{{ .Arch }}` + + :::caution[Alternative caching method] + + The Step also supports caching using the `--cache-from` and the `--cache-to` options of the `docker build` command. The **Cache from arguments** and **Cache to arguments** inputs provide this function. + + If using key-based caching, do NOT use these inputs! Leave them empty. + + ::: +1. Optionally, customize the build command with build arguments and options. + + - Add [build arguments](https://docs.docker.com/build/guide/build-args/) in the **Build arguments** input: one argument per line in a `MY_ARG=my_value` format. + - Add [options](https://docs.docker.com/engine/reference/commandline/image_build/#options) in the **Extra options** input: one extra option per line in the format of `--option value` or `--option=value`. + + :::caution[Values with quotes] + + When using values with quotes in them (for example, when the value contains spaces) do not use the equal sign. Separate it with spaces instead: `--option "value with spaces"`. + + ::: + +1. Add the `docker-build-push` Step to your Workflow. +1. Configure the required inputs for the Step: + + - `tags`: A list of tags to be applied to the name of the built image. You can add one tag per line. For more information about image tags, their function, and their required format, check out [the Docker documentation](https://docs.docker.com/engine/reference/commandline/image_tag/). + - `context`: The path to the files that constitute your build context. It should be relative to your Bitrise working directory. + - `file`: The path to the Dockerfile you wish to use. It should be relative to your Bitrise working directory. + + ``` + workflow: + steps: + - docker-build-push: + inputs: + - tags: myregistry.com/myimage:latest + - context: "./path" + - file: "./Dockerfile" + ``` +1. If you want to push the built image to a container registry, set the `push` input to **true**. + + ``` + workflow: + steps: + - docker-build-push: + inputs: + - tags: myregistry.com/myimage:latest + - context: "./path" + - file: "./Dockerfile" + - push: "true" + ``` +1. To cache the image, set the `use_bitrise_cache` input to **true**. + + The input uses the following cache keys: + + - `docker-imagename-{{ .OS }}-{{ .Arch }}-{{ .Branch }}-{{ .CommitHash }}` + - `docker-imagename-{{ .OS }}-{{ .Arch }}-{{ .Branch }}` + - `docker-imagename-{{ .OS }}-{{ .Arch }}` + + :::caution[Alternative caching method] + + The Step also supports caching using the `--cache-from` and the `--cache-to` options of the `docker build` command. The `cache_from` and `cache_to` inputs provide this function. + + If using key-based caching, do NOT use these inputs! Leave them empty. + + ::: + + ``` + workflow: + steps: + - docker-build-push: + inputs: + - tags: myregistry.com/myimage:latest + - context: "./path" + - file: "./Dockerfile" + - push: "true" + - use_bitrise_cache: "true" + ``` +1. Optionally, customize the build command with build arguments and options. + + - Add [build arguments](https://docs.docker.com/build/guide/build-args/) in the `build_arg` input: one argument per line in a `MY_ARG=my_value` format. + - Add [options](https://docs.docker.com/engine/reference/commandline/image_build/#options) in the `extra_options` input: one extra option per line in the format of `--option value` or `--option=value`. + + :::caution[Values with quotes] + + When using values with quotes in them (for example, when the value contains spaces) do not use the equal sign. Separate it with spaces instead: `--option "value with spaces"`. + + ::: + + ``` + workflow: + steps: + - docker-build-push: + inputs: + - tags: myregistry.com/myimage:latest + - context: "./path" + - file: "./Dockerfile" + - push: "true" + - use_bitrise_cache: "true" + - build_arg: BUILD_ARG=my_value + - extra_options: "--option value" + ``` diff --git a/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers.mdx b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers.mdx new file mode 100644 index 0000000..505ba6f --- /dev/null +++ b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers.mdx @@ -0,0 +1,54 @@ +--- +title: "Execution containers" +sidebar_position: 2 +slug: /bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers +sidebar_label: Step execution containers +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DefiningAnExecutionContainer from '@site/src/partials/defining-an-execution-container.mdx'; +import Partial_RunningAnExecutionContainer from '@site/src/partials/running-an-execution-container.mdx'; + +Step execution containers can be defined for any Bitrise project. You define the container in the top level of the configuration file and then refer to it in a Step or a [Step bundle](/en/bitrise-ci/workflows-and-pipelines/steps/step-bundles.html). The Step or the Step bundle will run in the referred execution container. Within the same Workflow or Pipeline, you can run different Steps and Step bundles in different execution containers. + +:::important + +Containers apply to individual Steps and Step bundles, not to entire Workflows or Pipelines. + +::: + +To define the execution container, you need to set the following: + +- The ID of the container. It will be used to reference this container. +- The type of the container: `execution`. +- The name and version of the Docker image you want to use. + + :::important[Getting images] + + You can use any public Docker image from [Docker Hub](https://hub.docker.com/). + + ::: + +After the containers are defined, you can refer to them in a Step or Step bundle which will then run in the referred container during your build. + +## File sharing across containers + +To enable file sharing across different containers and the host Bitrise environment, the following folders are shared each time you run a Docker container on Bitrise: + +- `/bitrise` +- `/root/.bitrise:/root/.bitrise/` +- `tmp:/tmp` + +By default, Bitrise will use `/bitrise/src` as its working directory, and everything created in either of these folders will be available across all Step execution containers. + +:::important[Step execution containers only] + +This applies only to Step execution containers. Volumes and file sharing with [service containers](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers.html) are not supported. + +::: + + + + diff --git a/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/index.md b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/index.md new file mode 100644 index 0000000..63d719c --- /dev/null +++ b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/index.md @@ -0,0 +1,18 @@ +--- +title: "Docker containers on Bitrise" +description: "Customers using the Bitrise-managed Linux machines can take advantage of advanced capabilities with Docker containers." +sidebar_position: 6 +slug: /bitrise-platform/infrastructure/docker-containers-on-bitrise +--- + +Customers using the Bitrise-managed Linux machines can take advantage of advanced capabilities with Docker containers: + +- We deliver our Linux build environment with all Android-related tools and technologies preinstalled so native and cross-platform Android Workflows can be run efficiently. With the new Services feature, Android mobile apps can be end-to-end tested by running the emulator and the required back-end Service on the same machine. +- Our customers can start up Bitrise-managed builds using their own Docker image stored in their private repository to ensure all third-party and in-house custom tools are present at runtime. Using the same local and CI Docker image for development becomes easy, reducing complexity and the chance of issues due to different environments. +- With the Container feature, customers can use any Docker image stored in a public or private repository, powering all web development CI/CD builds. + +[About Docker containers on Bitrise](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise) + +[Building your own Docker image](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image) + +[see topic](urn:resource:component:85610) diff --git a/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers.mdx b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers.mdx new file mode 100644 index 0000000..63f8188 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers.mdx @@ -0,0 +1,49 @@ +--- +title: "Service containers" +sidebar_position: 3 +slug: /bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DefiningAServiceContainer from '@site/src/partials/defining-a-service-container.mdx'; +import Partial_RunningAServiceContainer from '@site/src/partials/running-a-service-container.mdx'; + +Service containers are Docker containers that host services you might need to test or operate your apps during a Bitrise Workflow. The services will run in the background and the containers are cleaned up when all Steps are finished. + +When defining a service container, you need: + +- The ID of the container. +- The type of the container: `service`. +- The image name and version of the service. + + :::important[Getting images] + + You can use any public Docker image from [Docker Hub](https://hub.docker.com/). + + ::: + +You can then refer to the container within a Step or a Step bundle: the container will run during the execution of these Steps or Step bundles. + +For detailed configuration options, check out [Docker container properties](/en/bitrise-ci/references/configuration-yaml-reference/docker-container-properties). + + + + + +## Network access for service containers + +Service containers are all joined to the same [docker network](https://docs.docker.com/network/) called `bitrise`. This ensures that all of them are accessible from any other service container and Step execution container. + +:::tip[Running your own background workers] + +You can run your own background workers by executing the Docker commands yourself or by using something like `docker-compose` but make sure you use the same network. + +::: + +Service containers can be used even when the Step group is not using a Step execution container. The only difference is how to access the services. + +Use the `` (name of the service) to access it when you are using Step execution container. For example, `http://postgres:5432`. + +Use localhost to access your service if you are not using a Step execution container. For example, `http://localhost:5432`. diff --git a/docs/bitrise-platform/infrastructure/index.md b/docs/bitrise-platform/infrastructure/index.md new file mode 100644 index 0000000..efd20e6 --- /dev/null +++ b/docs/bitrise-platform/infrastructure/index.md @@ -0,0 +1,6 @@ +--- +title: "Infrastructure" +sidebar_position: 8 +--- + +Infrastructure diff --git a/docs/bitrise-platform/infrastructure/infrastructure-overview.md b/docs/bitrise-platform/infrastructure/infrastructure-overview.md new file mode 100644 index 0000000..9169cdb --- /dev/null +++ b/docs/bitrise-platform/infrastructure/infrastructure-overview.md @@ -0,0 +1,14 @@ +--- +title: "Infrastructure overview" +sidebar_position: 1 +slug: /bitrise-platform/infrastructure/infrastructure-overview +sidebar_label: About infrastructure +--- + +Bitrise is a platform, above all: you do not have to download anything to use it, you do not have to run it on your own computer or servers - we take care of all of that. + +That also means you do not have to worry about infrastructure, either: maintenance, tools, virtualization are all our job and our concern. + +On Bitrise, we use virtual machines (VM) to run your builds: every build runs in a new VM, and each VM is discarded immediately after the build has finished. + +A stack is the type of virtual machine we can use to run your build. For example, for a native iOS app, the best stack is one of our Xcode stacks. Stacks come with all of the necessary tools pre-installed, and are regularly updated to make sure they will serve all of your needs. diff --git a/docs/bitrise-platform/infrastructure/running-bitrise-builds-on-premise.mdx b/docs/bitrise-platform/infrastructure/running-bitrise-builds-on-premise.mdx new file mode 100644 index 0000000..d46f6bb --- /dev/null +++ b/docs/bitrise-platform/infrastructure/running-bitrise-builds-on-premise.mdx @@ -0,0 +1,20 @@ +--- +title: "Running Bitrise builds on-premise" +description: "You can run Bitrise builds on your own hardware or virtual environment by installing the Bitrise agent and connect it to your Bitrise Workspace. You can install the agent on both macOS and Linux." +sidebar_position: 9 +slug: /bitrise-platform/infrastructure/running-bitrise-builds-on-premise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_WhenToUseTheOnPremiseOption from '@site/src/partials/when-to-use-the-on-premise-option.mdx'; +import Partial_SettingUpBitriseOnPremise from '@site/src/partials/setting-up-bitrise-on-premise.mdx'; + +You can run Bitrise builds on self-hosted infrastructure - that is, that hardware or virtualized environments that you control - while taking advantage of every feature the Bitrise website offers. To do so, you just need to install the Bitrise agent on your own infrastructure and connect it to your Workspace. Once that is done, you can run builds from your Bitrise account, using the Bitrise UI as usual. + +![bitrise-runner-diagram.png](/img/_paligo/uuid-d50cbc2f-3b77-a344-44dc-2a45449893e1.png) + + + + diff --git a/docs/bitrise-platform/infrastructure/running-your-build-locally-in-docker.mdx b/docs/bitrise-platform/infrastructure/running-your-build-locally-in-docker.mdx new file mode 100644 index 0000000..c9a7b9a --- /dev/null +++ b/docs/bitrise-platform/infrastructure/running-your-build-locally-in-docker.mdx @@ -0,0 +1,42 @@ +--- +title: "Running your build locally in Docker" +description: "You can run a Bitrise build in Docker on your own machines: you need Docker, the Bitrise CLI, and a Bitrise Docker image." +sidebar_position: 7 +slug: /bitrise-platform/infrastructure/running-your-build-locally-in-docker +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DownloadingDockerImagesFromQuayIo from '@site/src/partials/downloading-docker-images-from-quayio.mdx'; +import Partial_RunningTheBuild from '@site/src/partials/running-the-build.mdx'; + +:::warning[Docker Hub rate limit] + +From July 15, 2024, rate limiting will apply on downloads from Docker Hub. If you pull a Docker image from Docker Hub without authentication during a Bitrise build on our Linux machines, you may run into issues because of rate limiting. + +Bitrise is mirroring some of the popular public docker images, but to avoid these potential issues with rate limiting, you can either: + +- Authenticate your Docker image pulling requests towards Docker Hub. For the details and Docker's full policy, refer to [Docker Hub rate limit](https://docs.docker.com/docker-hub/download-rate-limit/). +- Switch to another Docker registry to store your images. + +::: + +To be able to run your Linux stack builds locally, you’ll need [docker](https://www.docker.com/): + +- For Linux, just follow the [official install instructions](https://docs.docker.com/engine/installation/linux/). +- For Mac, you can use Docker for Mac, which is the easiest way to get started. + +In this guide, we’ll use [this Bitrise Android sample project](https://github.com/bitrise-samples/sample-apps-android-sdk22). + +:::caution[Large images ahead] + +The official Bitrise Docker images are quite large because they include a wide variety of preinstalled tools. You’ll need at least 20-25 GB FREE DISC SPACE! + +::: + +If you’re not familiar with the [Bitrise CLI](https://www.bitrise.io/cli), you should try that first. You don’t have to master the CLI, if you know what `bitrise run WORKFLOW` does, that should be enough for this tutorial. + + + + diff --git a/docs/bitrise-platform/integrations/_category_.json b/docs/bitrise-platform/integrations/_category_.json new file mode 100644 index 0000000..f417af1 --- /dev/null +++ b/docs/bitrise-platform/integrations/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Integrations", + "position": 7, + "link": null +} diff --git a/docs/bitrise-platform/integrations/about-integrations.mdx b/docs/bitrise-platform/integrations/about-integrations.mdx new file mode 100644 index 0000000..af1abe2 --- /dev/null +++ b/docs/bitrise-platform/integrations/about-integrations.mdx @@ -0,0 +1,40 @@ +--- +title: "About integrations" +description: "Connect your Git provider account to Bitrise and use SSH keys to allow Bitrise to access your code during a build. You can also use a VPN to connect to your repository. Use Webhooks to notify Bitrise about code events." +sidebar_position: 1 +slug: /bitrise-platform/integrations/about-integrations +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +After your Bitrise account and your Workspaces are set up, the next step is to make sure that you can connect your Bitrise account to other services and that Bitrise can access your code during [a CI build](/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html). + +## Connecting to services + +Each Bitrise user can connect their account to a GitHub, Bitbucket, and GitLab account. Doing so ensures that you can easily and quickly [add new projects](/en/bitrise-ci/getting-started/adding-a-new-project.html) from repositories at those Git provider accounts without having to manually enter the URL: [Repository access with OAuth](/en/bitrise-platform/repository-access/repository-access-with-oauth). + +If you ever develop iOS apps, you need to be able to connect to Apple services. On Bitrise, you can connect to an Apple account via either an projectle ID or by API key authentication: [Apple services connection](/en/bitrise-platform/integrations/apple-services-connection). + +An important part of communicating with other services is the service credential user. It is a user with a connected Git account which is used to, for example, [send status reports](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html) back to the Git provider: [The service credential user](/en/bitrise-platform/integrations/the-service-credential-user). + +## Accessing your code during a build + +Bitrise needs to be able to access and clone your repositories during the build process. We recommend using SSH keys for authentication for private projects. You can automatically generate and add SSH keys to your Git account during the process of adding a new project, or at any point in the **Project settings** menu: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). + +:::note[Public projects] + +[Public projects](/en/bitrise-platform/projects/public-projects.html) can't have SSH keys as they do not require authentication and always use HTTP URLs. + +::: + +You can use repositories with submodules or private repo dependencies, too. In this case we recommend adding the same SSH key to all repository dependencies, or use a machine user: [Apps with submodules or private repo dependencies](/en/bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies). + +You might need to use a VPN to be able to connect to your code. Bitrise allows you to do this and we have examples for connecting with several different VPN services: [Connecting to a VPN during a build](/en/bitrise-platform/integrations/connecting-to-a-vpn-during-a-build). + +## Webhooks + +Webhooks are an important part of using Bitrise: an incoming webhook set up in your repository notifies Bitrise about code events (such as pushes, tags, and pull requests) and allows [automatically triggering builds](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html). Incoming webhooks can be set up at a number of different Git providers, both manually and automatically: [Adding incoming webhooks](/en/bitrise-platform/integrations/webhooks/adding-incoming-webhooks). + +Outgoing webhooks configured on Bitrise allows you to send build event notifications to any service. You can configure custom headers for the webhook payload, and check the deliveries of the webhooks on the web interface: [Adding outgoing webhooks](/en/bitrise-platform/integrations/webhooks/adding-outgoing-webhooks). diff --git a/docs/bitrise-platform/integrations/ai-code-reviewer.mdx b/docs/bitrise-platform/integrations/ai-code-reviewer.mdx new file mode 100644 index 0000000..12db999 --- /dev/null +++ b/docs/bitrise-platform/integrations/ai-code-reviewer.mdx @@ -0,0 +1,28 @@ +--- +title: "AI code reviewer" +description: "The Bitrise AI code reviewer creates a comment every time a new pull request is opened on GitHub, and every time a user adds a new commit to the pull request." +sidebar_position: 7 +slug: /bitrise-platform/integrations/ai-code-reviewer +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_HowTheCodeReviewerWorks from '@site/src/partials/how-the-code-reviewer-works.mdx'; +import Partial_EnablingTheAICodeReviewer from '@site/src/partials/enabling-the-ai-code-reviewer.mdx'; + +Bitrise now helps you unblock your teams by providing helpful information and suggestions for every pull request via an AI code reviewer. + +The AI code reviewer creates a comment every time a new pull request is opened on GitHub, and every time a user adds a new commit to the pull request. + +The code reviewer can provide the following features: + +- A summary: Highlights key code changes and their potential impact. +- Walkthrough: Generates context-aware documentation to help team members quickly understand code changes. +- Code review: Detects potential issues, suggests improvements, and enhances code quality. + +When you enable the code review, you can select which of the above features you want to use. + + + + diff --git a/docs/bitrise-platform/integrations/apple-services-connection/_category_.json b/docs/bitrise-platform/integrations/apple-services-connection/_category_.json new file mode 100644 index 0000000..ab5b6ee --- /dev/null +++ b/docs/bitrise-platform/integrations/apple-services-connection/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Apple services connection", + "position": 3, + "description": "Connect your Bitrise builds to Apple services using either API key authentication or Apple ID authentication in order to manage iOS code signing and deployment.", + "link": null +} diff --git a/docs/bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.mdx b/docs/bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.mdx new file mode 100644 index 0000000..6e56fa8 --- /dev/null +++ b/docs/bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.mdx @@ -0,0 +1,23 @@ +--- +title: "About connecting to Apple services" +description: "Connect your Bitrise builds to Apple services using either API key authentication or Apple ID authentication in order to manage iOS code signing and deployment." +sidebar_position: 1 +slug: /bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AppleServicePermissions from '@site/src/partials/apple-service-permissions.mdx'; +import Partial_AppleTwoFactorAuthenticationRequirements from '@site/src/partials/apple-two-factor-authentication-requirements.mdx'; +import Partial_StepsThatRequireConnectingToYourAppleDeveloperAccount from '@site/src/partials/steps-that-require-connecting-to-your-apple-developer-account.mdx'; + +Both [Bitrise CI](urn:resource:publication:94442) and [Release Management](urn:resource:publication:90740) helps you automate Mobile DevOps processes that require Apple's online services. To connect to these services, such as the Apple Developer Portal or App Store Connect, you need to provide authentication data to Bitrise and select the established authentication method for your project. + +You can authenticate with Apple’s official API key or with Apple ID and password. + + + + + + diff --git a/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.mdx b/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.mdx new file mode 100644 index 0000000..dc1d37e --- /dev/null +++ b/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.mdx @@ -0,0 +1,26 @@ +--- +title: "Connecting to an Apple service with API key" +description: "Connect to an Apple service with API key to manage iOS code signing and deployment. The API key authentication is the recommended way when connecting Bitrise to Apple Services." +sidebar_position: 2 +slug: /bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_IMPORTANTNoStepInputModificationsNeeded from '@site/src/partials/important-no-step-input-modifications-needed.mdx'; +import Partial_APIAuthenticationForAppleEnterpriseUsers from '@site/src/partials/api-authentication-for-apple-enterprise-users.mdx'; +import Partial_AddingAPIKeyAuthenticationDataOnBitrise from '@site/src/partials/adding-api-key-authentication-data-on-bitrise.mdx'; +import Partial_AssigningAPIKeyAuthenticationToYourApp from '@site/src/partials/assigning-api-key-authentication-to-your-app.mdx'; + +[Connecting to an Apple service](/en/bitrise-platform/integrations/apple-services-connection.html) (such as the App Store Connect or the Apple Developer Portal) with the API key requires generating an API key, adding the authentication data on Bitrise, and assigning the key to the app. + +The API key authentication is the recommended way when connecting Bitrise to Apple Services. You can have 50 API keys added to the **Apple Services connection** page but your app can use only one. + + + + + + + + diff --git a/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.mdx b/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.mdx new file mode 100644 index 0000000..1b573e0 --- /dev/null +++ b/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.mdx @@ -0,0 +1,28 @@ +--- +title: "Connecting to an Apple service with Apple ID" +description: "Connect to an Apple service with Apple ID to manage iOS code signing and deployment." +sidebar_position: 3 +slug: /bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AssigningAppleIDAuthenticationToYourApp from '@site/src/partials/assigning-apple-id-authentication-to-your-app.mdx'; +import Partial_AddingAppleIDAuthenticationDataOnBitrise from '@site/src/partials/adding-apple-id-authentication-data-on-bitrise.mdx'; + +Connecting to an Apple service (such as the App Store Connect or the Apple Developer Portal) with the Apple ID requires that you first add your Apple ID and password on the **Apple Service connection** page, then select an app to use Apple ID authentication while the build is running. + +If you cannot use the API key authentication, we recommend you try this option. Please note that you can only connect one Apple ID to Bitrise. + +:::important[Apple accounts with two-factor authentication enabled] + +If two-factor authentication is enabled on your Apple account, you will have to provide the App-specific password during this process. Learn [how to generate an app-specific password on the Security section of your Apple ID account page](https://support.apple.com/en-us/HT204397). + +![appspecificpassword.jpg](/img/_paligo/uuid-635b3416-2294-9063-b841-674935c2f4ab.jpg) + +::: + + + + diff --git a/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs.mdx b/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs.mdx new file mode 100644 index 0000000..3bf477a --- /dev/null +++ b/docs/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs.mdx @@ -0,0 +1,26 @@ +--- +title: "Connecting to an Apple Service with Step inputs" +description: "If you want to deploy to a team where authentication is different from the connected one you’ve been using, then you can add your preferred authentication into the Step’s inputs." +sidebar_position: 4 +slug: /bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AuthenticatingInAStepWithAppleIDAndPassword from '@site/src/partials/authenticating-in-a-step-with-apple-id-and-password.mdx'; +import Partial_AuthenticatingInAStepWithAPIKey from '@site/src/partials/authenticating-in-a-step-with-api-key.mdx'; + +If you wish to deploy to multiple teams or deploy to a team where authentication is different from the connected one you’ve been using, then you can add your preferred authentication into the Step’s inputs. This will override the connection previously set in **Bitrise Developer Connection**. + +This way connection is restricted to the given Step where you set up authentication. + +:::important[2FA and Apple ID authentication] + +If 2FA is required for your Apple ID, then you must use the Apple ID authentication with the [**Deploy to App Store Connect with Deliver (formerly iTunes Connect)**](https://github.com/bitrise-steplib/steps-deploy-to-itunesconnect-deliver) and the [**fastlane**](https://github.com/bitrise-io/steps-fastlane) Steps instead of authenticating through Step inputs. + +::: + + + + diff --git a/docs/bitrise-platform/integrations/apple-services-connection/index.md b/docs/bitrise-platform/integrations/apple-services-connection/index.md new file mode 100644 index 0000000..f930409 --- /dev/null +++ b/docs/bitrise-platform/integrations/apple-services-connection/index.md @@ -0,0 +1,10 @@ +--- +title: "Apple services connection" +description: "Connect your Bitrise builds to Apple services using either API key authentication or Apple ID authentication in order to manage iOS code signing and deployment." +sidebar_position: 3 +slug: /bitrise-platform/integrations/apple-services-connection +--- + +Apple services connection + +Connect your Bitrise builds to Apple services using either API key authentication or Apple ID authentication in order to manage iOS code signing and deployment. diff --git a/docs/bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication.mdx b/docs/bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication.mdx new file mode 100644 index 0000000..fb41a86 --- /dev/null +++ b/docs/bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication.mdx @@ -0,0 +1,100 @@ +--- +title: "Steps requiring Apple authentication" +description: "Check out all the Bitrise Steps that require a connection to an Apple service using either an API key or an Apple ID." +sidebar_position: 5 +slug: /bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +In this guide we list all the Steps that require authentication and the authentication methods that you can choose from depending on your app’s requirement. + +## [Manage iOS Code Signing](https://github.com/bitrise-steplib/bitrise-step-manage-ios-code-signing) Step + +[This Step](https://www.bitrise.io/integrations/steps/manage-ios-code-signing) takes care of setting up the required code signing assets before your project is built on Bitrise. The Step uses your API key or your Apple ID and password authentication to connect to an Apple service. Once connection is configured, the Step will: + +- Generate, update and download the provisioning profiles needed for your iOS project. +- Verify and register the project's Bundle IDs on the Apple Developer Site. +- Register the iOS devices connected to your Bitrise account with the App Store Connect. + +[Connecting to an Apple service with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key) + +[Connecting to an Apple service with Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id) + +[Authenticating in a Step with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs/authenticating-in-a-step-with-api-key) + +## [Xcode Archive & Export for iOS](https://github.com/bitrise-steplib/steps-xcode-archive) Step + +The Step archives your Xcode project by running the `xcodebuild archive` command and then exports the archive into an IPA file with the `xcodebuild -exportArchive` command. This IPA file can be shared, installed on test devices, or uploaded to the App Store Connect. + +The Step can also perform iOS code signing if the **Automatic code signing method** input specifies a method. By default, it's turned off. To perform iOS code signing, it can use API key or Apple ID authentication. + +[Connecting to an Apple service with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key) + +[Connecting to an Apple service with Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id) + +[Authenticating in a Step with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs/authenticating-in-a-step-with-api-key) + +## [Export iOS and tvOS Xcode archive](https://github.com/bitrise-steplib/steps-export-xcarchive) Step + +Exports an IPA from an existing iOS and tvOS .xcarchive file. You can add multiple [Export iOS and tvOS Xcode archive](https://github.com/bitrise-steplib/steps-export-xcarchive) Steps to your Workflows to create multiple different signed IPA files. + +The Step can also perform iOS code signing if the **Automatic code signing method** input specifies a method. By default, it's turned off. To perform iOS code signing, it can use API key or Apple ID authentication. + +[Connecting to an Apple service with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key) + +[Connecting to an Apple service with Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id) + +[Authenticating in a Step with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs/authenticating-in-a-step-with-api-key) + +## [Xcode Build for testing for iOS](https://github.com/bitrise-steplib/steps-xcode-build-for-test) Step + +The Step runs Xcode's `xcodebuild` command with the build-for-testing option. This builds your app and associated tests so that you can, for example, upload it to a third-party testing service to run your tests on a real device. The Step also creates an `.xctestrun` file. To be able to run your tests on a real device it needs code signing. + +The **Automatic code signing method** Step input allows you to log you into your Apple Developer account based on the Apple service connection you provide on Bitrise and download any provisioning profiles needed for your project based on the **Distribution method**. + +[Connecting to an Apple service with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key) + +[Connecting to an Apple service with Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id) + +[Authenticating in a Step with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs/authenticating-in-a-step-with-api-key) + +## Deploy to App Store Connect with Deliver Step + +With [this Step](https://www.bitrise.io/integrations/steps/deploy-to-itunesconnect-deliver), you can upload screenshots, metadata and binaries to [https://appstoreconnect.apple.com/](https://appstoreconnect.apple.com/) and submit your app for App Store review using the fastlane [deliver](https://docs.fastlane.tools/actions/deliver/) action. The [**Deploy to App Store Connect with Deliver (formerly iTunes Connect)**](https://github.com/bitrise-steplib/steps-deploy-to-itunesconnect-deliver) Step can connect to your Apple Developer Account either with Apple ID or with the App Store Connect API, or through Step inputs. Please note that in the case of 2FA enabled Apple ID, the [**Deploy to App Store Connect with Deliver (formerly iTunes Connect)**](https://github.com/bitrise-steplib/steps-deploy-to-itunesconnect-deliver) Step can only work with Apple ID authentication which you can set on the Apple Service page of your profile. The default method is the API key authentication. Choose the connection method that works with your project: + +[Connecting to an Apple service with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key) + +[Connecting to an Apple service with Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id) + +[Connecting to an Apple Service with Step inputs](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs) + +## Deploy to App Store Connect - Application Loader (formerly iTunes Connect) Step + +With [this Step](https://www.bitrise.io/integrations/steps/deploy-to-itunesconnect-application-loader), you can upload binaries (.ipa or .pkg files) to [https://appstoreconnect.apple.com/](https://appstoreconnect.apple.com/). The [**Deploy to App Store Connect - Application Loader (formerly iTunes Connect)**](https://github.com/bitrise-steplib/steps-deploy-to-itunesconnect-application-loader) Step can connect to your Apple Developer Account either with the App Store Connect API, the Apple ID and password, or through Step inputs. Choose the connection method that works with your project: + +[Connecting to an Apple service with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key) + +[Connecting to an Apple service with Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id) + +[Connecting to an Apple Service with Step inputs](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs) + +## [fastlane](https://github.com/bitrise-io/steps-fastlane) Step + +With this Step you can run your [*fastlane*](https://fastlane.tools/) lanes on Bitrise just like you would locally. Check out our guide about [Integrating fastlane to Bitrise](urn:resource:component:77300) for more information. + +Please note that in the case of 2FA enabled Apple ID, the [**Fastlane**](https://github.com/bitrise-io/steps-fastlane) Step can only work with Apple ID authentication which you can set on the **Apple Service** page of your profile. + +:::note[Two-factor authentication fails with the Fastlane Step] + +In some cases, the [**Fastlane**](https://github.com/bitrise-io/steps-fastlane) Step doesn't get the value of the FASTLANE_SESSION variable correctly when attempting to connect to the Apple Developer portal, causing two-factor authentication to fail. Check out the [potential workaround](https://support.bitrise.io/hc/en-us/articles/360017174577) for this issue. + +::: + +[Connecting to an Apple service with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key) + +[Connecting to an Apple service with Apple ID](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id) + +[Connecting to an Apple Service with Step inputs](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs) diff --git a/docs/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise.mdx b/docs/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise.mdx new file mode 100644 index 0000000..4fc02af --- /dev/null +++ b/docs/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise.mdx @@ -0,0 +1,55 @@ +--- +title: "Connecting a Google service account to Bitrise" +sidebar_position: 4 +slug: /bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise +sidebar_label: Connecting a Google Play Console service account to Bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkspaceSettingsPage from '@site/src/partials/opening-the-workspace-settings-page.mdx'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +You can connect a Google Console Service account to a Workspace. The service account will be available to use for all the projects owned by that Workspace. It allows you to seamlessly deploy your Android apps to Google Play with [Release Management](urn:resource:component:77516). + +You can add multiple service accounts to a Workspace but a Bitrise project can only have a single service account connected to it at any given time. However, you can change the connected account at any time. + +## Connecting a Google service account to a Workspace + +To create a new service account and link it to a Bitrise Workspace: + +1. Set up a Google Play service account in Google Play console: [Using a service account](https://developers.google.com/android-publisher/getting_started#service-account). +1. Grant the necessary rights to the service account with your [Google Play Console](https://play.google.com/apps/publish). Go to **Settings**, then **Users & permissions**, then **Invite new user**. Due to the way the Google Play Publisher API works, you have to grant at least the following permissions to the service account: + + - Access level: View app information. + - Release management: Manage production releases, manage testing track releases. + - Store presence: Edit store listing, pricing & distribution. +1. Create a JSON key for the service account: [Create a service account key](https://cloud.google.com/iam/docs/keys-create-delete#creating). +1. +1. On the left, select **Integrations**. +1. Find and click **Google Play**. + + ![google-service-account_png.png](/img/_paligo/uuid-86e5dd1c-f147-0a08-49bb-da4f53b9a960.png) +1. Click **Add service account**. +1. Type a name in the **Name** field. +1. In the **Credentials** section, drag and drop your JSON key file or click **Upload a JSON file** to upload it from your computer. + + ![add-json-file.png](/img/_paligo/uuid-48a9ebfc-c07d-81f3-7b87-09f6fdcc1794.png) +1. Once done, click **Add account**. + +## Connecting a Google service account to a project + +To configure a Bitrise project to use a given Google Play Console service account: + +1. +1. On the left, select the **Integrations** menu option. +1. Go to the **Stores** tab. +1. Find the **Google Play Store** section. +1. Click the **Select...** button. + + ![select-button.png](/img/_paligo/uuid-d9ad5624-810e-4fbf-507a-f900e03620e5.png) +1. In the pop-up window, select an account from the dropdown menu labeled with **Select an account**. + + ![attach-service-account.png](/img/_paligo/uuid-f8d70389-5398-fa2c-3a98-db70ffa63853.png) +1. Click **Save**. diff --git a/docs/bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.mdx b/docs/bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.mdx new file mode 100644 index 0000000..a5ad467 --- /dev/null +++ b/docs/bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.mdx @@ -0,0 +1,32 @@ +--- +title: "Connecting to a VPN during a build" +description: "To connect to a VPN during a build, make sure that you have a Step establishing a VPN connection, such as Set up OpenVPN server." +sidebar_position: 6 +slug: /bitrise-platform/integrations/connecting-to-a-vpn-during-a-build +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AccessingARepositoryViaVPN from '@site/src/partials/accessing-a-repository-via-vpn.mdx'; +import Partial_ExampleVPNConfigurations from '@site/src/partials/example-vpn-configurations.mdx'; + +You might require a VPN connection for your build, to be able to connect to your server, either to `git clone` your repository or to access a private API. + +To connect to a VPN, you need to: + +1. Make sure your local network address space does not clash with the [Bitrise virtual machines' address space](/en/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines) as this can cause an error with the VPN. +1. Install and configure the required VPN components. +1. Connect to the VPN. + +You can configure and connect a VPN anywhere in your Workflow - BEFORE you would use the VPN connection, of course. For example, if you require a VPN connection to access your repository, you have to connect before the **Git Clone** Step. + +:::caution[SSH sessions] + +When you choose your VPN tool and do the setup/configuration, you have to be careful NOT TO RESTART OR ABORT existing SSH sessions! The [bitrise.io](https://www.bitrise.io) workers will abort the build if the SSH connection between the build’s Control/Master machine and the build virtual machine terminates! + +::: + + + + diff --git a/docs/bitrise-platform/integrations/endpoint-detection-and-response.md b/docs/bitrise-platform/integrations/endpoint-detection-and-response.md new file mode 100644 index 0000000..7a15e3e --- /dev/null +++ b/docs/bitrise-platform/integrations/endpoint-detection-and-response.md @@ -0,0 +1,37 @@ +--- +title: "Endpoint Detection and Response" +description: "Endpoint Detection and Response (EDR) tools monitor endpoint activity and alert security teams about suspicious behavior. They are commonly used on employee laptops and long‑lived servers. Bitrise does not use EDR agents on Bitrise‑hosted CI runners." +sidebar_position: 9 +slug: /bitrise-platform/integrations/endpoint-detection-and-response +--- + +## No EDR on Bitrise CI runners + +Endpoint Detection and Response (EDR) tools monitor endpoint activity and alert security teams about suspicious behavior. They are commonly used on employee laptops and long‑lived servers. + +Bitrise does use EDR internally as part of our corporate security program. This use does not extend to EDR agents on Bitrise‑hosted CI runners. Bitrise build VMs are ephemeral, short‑lived environments optimized for CI/CD performance. Running EDR in this context introduces tradeoffs: + +- Performance and reliability impact: EDR agents consume CPU, memory, and I/O, and can slow down or interfere with performance‑sensitive builds. Since Bitrise build VMs commonly run at or near 100% CPU during builds, additional overhead can negatively affect build times and reliability. +- Most commercial EDR solutions are primarily optimized for long‑lived endpoints. On short‑lived, compute‑intensive CI/CD runners, their effectiveness is more limited, while the performance and operational costs remain. +- Alternative controls: Instead of EDR on build VMs, Bitrise focuses on other security controls better suited to the CI/CD context (for example, hardened base images and image scanning). + +## Options for users who require EDR + +Customers with strict EDR requirements can deploy and manage their own EDR solution on suitable Bitrise infrastructure. + +Customers using private or dedicated clusters can: + +- Use pre‑warm or similar mechanisms to install and configure their own EDR agents before builds start. +- Use their own EDR licenses, policies, and backend systems. + +In this model: + +- The customer is responsible for selecting, installing, configuring, and maintaining the EDR solution. +- All alerts, telemetry, and incident response activities are handled by the customer’s own security operations capabilities. +- Bitrise does not operate, monitor, or manage the customer’s EDR agents. + +:::tip[Contact us] + +If you have any questions regarding your security requirements, contact us at letsconnect@bitrise.io. + +::: diff --git a/docs/bitrise-platform/integrations/index.md b/docs/bitrise-platform/integrations/index.md new file mode 100644 index 0000000..b8c59d2 --- /dev/null +++ b/docs/bitrise-platform/integrations/index.md @@ -0,0 +1,7 @@ +--- +title: "Integrations" +sidebar_position: 7 +slug: /bitrise-platform/integrations +--- + +Integrations diff --git a/docs/bitrise-platform/integrations/oidc-authentication/_category_.json b/docs/bitrise-platform/integrations/oidc-authentication/_category_.json new file mode 100644 index 0000000..13c3036 --- /dev/null +++ b/docs/bitrise-platform/integrations/oidc-authentication/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "OIDC authentication", + "position": 5, + "link": null +} diff --git a/docs/bitrise-platform/integrations/oidc-authentication/index.md b/docs/bitrise-platform/integrations/oidc-authentication/index.md new file mode 100644 index 0000000..8df2a10 --- /dev/null +++ b/docs/bitrise-platform/integrations/oidc-authentication/index.md @@ -0,0 +1,7 @@ +--- +title: "OIDC authentication" +sidebar_position: 5 +slug: /bitrise-platform/integrations/oidc-authentication +--- + +OIDC authentication diff --git a/docs/bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview.mdx b/docs/bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview.mdx new file mode 100644 index 0000000..4848a38 --- /dev/null +++ b/docs/bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview.mdx @@ -0,0 +1,27 @@ +--- +title: "OIDC authentication overview" +description: "On Bitrise, OIDC enables your builds to authenticate to external systems (such as AWS, GCP, Azure, container registries, secret management or artifact stores) without embedding long-lived credentials in your Workflows." +sidebar_position: 1 +slug: /bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AuthenticationToExternalServicesWithOIDC from '@site/src/partials/authentication-to-external-services-with-oidc.mdx'; +import Partial_AuthenticationToBitriseWithOIDC from '@site/src/partials/authentication-to-bitrise-with-oidc.mdx'; + +OpenID Connect (OIDC) is an identity authentication layer built on the OAuth 2.0 framework. It allows third-party applications to verify the identity of the end user, including using Single Sign-On across applications. + +OIDC works by issuing ID tokens (typically JSON Web Tokens or JWTs) that provide information about the authentication operation's outcome and about the user's identity. The data about the authentication outcome and the user information are called claims. + +The service that receives the token evaluates the token's claims against its OIDC policy. If the token's claims match the policy, the request is permitted; if they don't, it is rejected. + +Bitrise supports the use of OIDC tokens in two ways: + +- To enable your Bitrise builds to authenticate to external systems such as AWS, GCP, Azure, container registries, secret management or artifact stores. +- To use foreign OIDC tokens to authenticate to Bitrise and receive short-lived Bitrise tokens. + + + + diff --git a/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-aws.mdx b/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-aws.mdx new file mode 100644 index 0000000..414ae8f --- /dev/null +++ b/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-aws.mdx @@ -0,0 +1,28 @@ +--- +title: "OIDC for AWS" +description: "Generate OIDC tokens during your Bitrise build to exchange them for scoped access tokens with" +sidebar_position: 2 +slug: /bitrise-platform/integrations/oidc-authentication/oidc-for-aws +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AddingACustomTrustPolicy from '@site/src/partials/adding-a-custom-trust-policy.mdx'; +import Partial_FetchingAndExchangingTokens from '@site/src/partials/fetching-and-exchanging-tokens.mdx'; +import Partial_AddingAnOIDCIdentityProviderInIAM from '@site/src/partials/adding-an-oidc-identity-provider-in-iam.mdx'; + +Generate OpenID Connect (OIDC) tokens during your Bitrise build to exchange them for AWS Identity and Access Management (IAM) roles with AWS-scoped permissions. + +To use OIDC tokens for AWS, you'll need to: + +- Create an IAM OIDC provider in your AWS account. +- Add a custom trust policy: this means writing the rules for the identity tokens. + +On Bitrise, you can get the tokens by using either the [**Get OIDC identity token**](https://github.com/bitrise-steplib/bitrise-step-get-identity-token) Step or the **Authenticate with AWS** Step. + + + + + + diff --git a/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise.mdx b/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise.mdx new file mode 100644 index 0000000..3a5c483 --- /dev/null +++ b/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise.mdx @@ -0,0 +1,20 @@ +--- +title: "OIDC for Bitrise" +description: "Create an Open ID Connect (OIDC) trust policy and send an OIDC token with `app.bitrise.io` as the audience for an OIDC credential exchange. This allows third-party services to authenticate to your Bitrise workspace and access Bitrise resources." +sidebar_position: 4 +slug: /bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CreatingATrustPolicyOnBitrise from '@site/src/partials/creating-a-trust-policy-on-bitrise.mdx'; +import Partial_CraftingATokenRequest from '@site/src/partials/crafting-a-token-request.mdx'; + +Create an Open ID Connect (OIDC) trust policy and send an OIDC token with `app.bitrise.io` as the audience for an OIDC credential exchange. This allows third-party services to authenticate to your Bitrise workspace and access Bitrise resources. + +For more information on how OIDC works, see [Authentication to Bitrise with OIDC](/en/bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview/authentication-to-bitrise-with-oidc). + + + + diff --git a/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-gcp.mdx b/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-gcp.mdx new file mode 100644 index 0000000..53b2b0b --- /dev/null +++ b/docs/bitrise-platform/integrations/oidc-authentication/oidc-for-gcp.mdx @@ -0,0 +1,28 @@ +--- +title: "OIDC for GCP" +description: "Generate OIDC tokens during your Bitrise build to exchange them for scoped access tokens with Google Cloud Platform" +sidebar_position: 3 +slug: /bitrise-platform/integrations/oidc-authentication/oidc-for-gcp +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ConnectingAGoogleServiceAccountToTheWorkloadIdentityPool from '@site/src/partials/connecting-a-google-service-account-to-the-workload-identity-pool.mdx'; +import Partial_FetchingAndExchangingTokensWithGCP from '@site/src/partials/fetching-and-exchanging-tokens-with-gcp.mdx'; +import Partial_CreatingAWorkloadIdentityPool from '@site/src/partials/creating-a-workload-identity-pool.mdx'; + +Generate OIDC tokens during your Bitrise build to exchange them for scoped access tokens with Google Cloud Platform (GCP). + +To use OIDC tokens for GCP, you'll need to: + +- Create a workload identity pool. +- Connect a Google service account to the identity pool. + +On Bitrise, you can get the tokens by using either the **Get OICD identity token** Step or the **Authenticate with GCP** Step. + + + + + + diff --git a/docs/bitrise-platform/integrations/the-service-credential-user.mdx b/docs/bitrise-platform/integrations/the-service-credential-user.mdx new file mode 100644 index 0000000..a183d85 --- /dev/null +++ b/docs/bitrise-platform/integrations/the-service-credential-user.mdx @@ -0,0 +1,40 @@ +--- +title: "The service credential user" +description: "The service credential is a user whose connected Git provider account (GitHub, GitLab or Bitbucket) is used to access those services for the purposes of Bitrise builds." +sidebar_position: 2 +slug: /bitrise-platform/integrations/the-service-credential-user +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ChangingTheServiceCredentialUser from '@site/src/partials/changing-the-service-credential-user.mdx'; +import Partial_ServiceCredentialUserActionsAndTheirRequiredRepositoryAccess from '@site/src/partials/service-credential-user-actions-and-their-required-repository-access.mdx'; + +The service credential is a user whose connected Git provider account (GitHub, GitLab or Bitbucket) is used to access those Git services for certain actions that Bitrise can execute. + +:::important[GitHub project] + +The service credential user is NOT required if you use the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration) to connect to your Git repositories. + +::: + +You need to set a service credential user, among other things, to: + +- Send [build status reports](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html) back to your Git provider. +- Use the [Selective builds](/en/bitrise-ci/configure-builds/configuring-build-settings/selective-builds) feature that allows you to specify certain files or directories in your repository that need to be modified to trigger an automatic Bitrise build. +- [Store the `bitrise.yml` file in your repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository). + +:::tip[Actions and requirements] + +For the full list of actions and their access requirements, see [Service credential user actions and their required repository access](/en/bitrise-platform/integrations/the-service-credential-user/service-credential-user-actions-and-their-required-repository-access). + +::: + +By default, the user who added the project to Bitrise is set as the service credential user. Even if you change it, it should always be a user who has access to the project's repository. + +It isn't mandatory to have a service credential user: you can use the **No service credential user** setting to not have one. You'll still be able to run builds and trigger builds automatically but Bitrise won't be able to send build status reports to your Git provider, you won't be able to use the [Selective builds](/en/bitrise-ci/configure-builds/configuring-build-settings/selective-builds.html) feature or to store the bitrise.yml file in your repository. + + + + diff --git a/docs/bitrise-platform/integrations/webhooks/_category_.json b/docs/bitrise-platform/integrations/webhooks/_category_.json new file mode 100644 index 0000000..a907998 --- /dev/null +++ b/docs/bitrise-platform/integrations/webhooks/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Webhooks", + "position": 8, + "description": "Bitrise makes extensive use of incoming webhooks to automatically trigger builds on Bitrise and outgoing webhooks to send reports of build events to other services, such as Slack.", + "link": null +} diff --git a/docs/bitrise-platform/integrations/webhooks/adding-incoming-webhooks.mdx b/docs/bitrise-platform/integrations/webhooks/adding-incoming-webhooks.mdx new file mode 100644 index 0000000..23c0960 --- /dev/null +++ b/docs/bitrise-platform/integrations/webhooks/adding-incoming-webhooks.mdx @@ -0,0 +1,24 @@ +--- +title: "Adding incoming webhooks" +description: "An incoming webhook on Bitrise serves one purpose: to start builds automatically when a certain code event (code push, Git Tag, pull request) happens. You can setup incoming webhooks manually or automatically when adding your project to Bitrise." +sidebar_position: 2 +slug: /bitrise-platform/integrations/webhooks/adding-incoming-webhooks +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RegisteringAnIncomingWebhookAutomatically from '@site/src/partials/registering-an-incoming-webhook-automatically.mdx'; +import Partial_RegisteringAnIncomingWebhookManually from '@site/src/partials/registering-an-incoming-webhook-manually.mdx'; + +An incoming webhook on Bitrise serves one purpose: to start builds automatically when a certain code event (code push, Git Tag, pull request) happens. You need to register an incoming webhook to your repository and [configure build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html). + +:::note[Webhook issues] + +If your builds triggers don't work, there might be a problem with your webhooks: [Builds aren't getting triggered](https://support.bitrise.io/hc/en-us/articles/360014238237). + +::: + + + + diff --git a/docs/bitrise-platform/integrations/webhooks/adding-outgoing-webhooks.mdx b/docs/bitrise-platform/integrations/webhooks/adding-outgoing-webhooks.mdx new file mode 100644 index 0000000..bdf6cc4 --- /dev/null +++ b/docs/bitrise-platform/integrations/webhooks/adding-outgoing-webhooks.mdx @@ -0,0 +1,39 @@ +--- +title: "Adding outgoing webhooks" +description: "You can create outgoing webhooks so that Bitrise automatically sends build event notifications to any service you would like." +sidebar_position: 3 +slug: /bitrise-platform/integrations/webhooks/adding-outgoing-webhooks +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CheckingAndResendingWebhookDeliveries from '@site/src/partials/checking-and-resending-webhook-deliveries.mdx'; +import Partial_AddingAnOutgoingWebhookToAnApp from '@site/src/partials/adding-an-outgoing-webhook-to-an-app.mdx'; +import Partial_AddingCustomHeadersToOutgoingWebhooks from '@site/src/partials/adding-custom-headers-to-outgoing-webhooks.mdx'; + +You can configure Bitrise CI to send build event notifications to any service you would like. A build event is: + +- When a build is started. +- When a build ends. + +You can also configure outgoing webhooks for Bitrise Release Management. These webhooks are triggered by release management events: [Outgoing webhooks in Release Management](/en/release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management). + +You can use this notification to share build statuses with your Git provider if we don’t support it yet, notify only the right team about build success or failure, or use it to automate your in-house release pipeline. + +You can add, remove and edit your webhooks on the website interface. + +:::tip[Accessing services that are behind a firewall] + +If you need to access a service that is behind a firewall, you can't use outgoing webhooks: the payload won't get past the firewall. To access such a service, we recommend configuring the firewall to allow the Bitrise build machines to access it, and then make the request from within the build machine. For more information on how to do so, check out the relevant guides: + +- [Configuring your network to access our build machines](/en/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines) +- [Connecting to a VPN during a build](/en/bitrise-platform/integrations/connecting-to-a-vpn-during-a-build) + +::: + + + + + + diff --git a/docs/bitrise-platform/integrations/webhooks/index.md b/docs/bitrise-platform/integrations/webhooks/index.md new file mode 100644 index 0000000..0a03603 --- /dev/null +++ b/docs/bitrise-platform/integrations/webhooks/index.md @@ -0,0 +1,10 @@ +--- +title: "Webhooks" +description: "Bitrise makes extensive use of incoming webhooks to automatically trigger builds on Bitrise and outgoing webhooks to send reports of build events to other services, such as Slack." +sidebar_position: 8 +slug: /bitrise-platform/integrations/webhooks +--- + +Webhooks + +Bitrise makes extensive use of incoming webhooks to automatically trigger builds on Bitrise and outgoing webhooks to send reports of build events to other services, such as Slack. diff --git a/docs/bitrise-platform/integrations/webhooks/webhooks-overview.mdx b/docs/bitrise-platform/integrations/webhooks/webhooks-overview.mdx new file mode 100644 index 0000000..8ec8dda --- /dev/null +++ b/docs/bitrise-platform/integrations/webhooks/webhooks-overview.mdx @@ -0,0 +1,25 @@ +--- +title: "Webhooks overview" +description: "Bitrise makes extensive use of incoming webhooks to automatically trigger builds on Bitrise and outgoing webhooks to send reports of build events to other services, such as Slack." +sidebar_position: 1 +slug: /bitrise-platform/integrations/webhooks/webhooks-overview +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +A webhook is a user-defined callback that is triggered by some event, such as pushing code to a repository. Bitrise makes extensive use of webhooks: + +- Incoming webhooks, registered with your Git service provider, are used to [automatically trigger builds](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) on Bitrise and to enable the use of [Git Insights](/en/insights/git-insights.html). + + :::note[Webhook issues] + + If your builds triggers don't work, there might be a problem with your webhooks: [Builds aren't getting triggered](https://support.bitrise.io/hc/en-us/articles/360014238237). + + ::: +- Outgoing webhooks are used to send reports of build events to other services, such as Slack. + +You can add an incoming webhook automatically either when creating an app or later; it’s also possible to manually add a webhook to any supported service. + +Outgoing webhooks can be added either on the website or [via the Bitrise API](/en/bitrise-ci/api/incoming-and-outgoing-webhooks.html). diff --git a/docs/bitrise-platform/mobile-devops-platform.md b/docs/bitrise-platform/mobile-devops-platform.md new file mode 100644 index 0000000..cdbb375 --- /dev/null +++ b/docs/bitrise-platform/mobile-devops-platform.md @@ -0,0 +1,22 @@ +--- +title: "Mobile DevOps Platform" +description: "Bitrise is a Mobile DevOps platform for every step of the mobile development process, from planning to monitoring. The platform equips mobile development teams with the necessary resources to build high-quality applications using their preferred tools, all while eliminating the interruptions and overhead that come with managing infrastructure and environments." +sidebar_position: 1 +slug: /bitrise-platform/mobile-devops-platform +--- + +Bitrise is a Mobile DevOps platform for every step of the mobile development process, from planning to monitoring. The platform equips mobile development teams with the necessary resources to build high-quality applications using their preferred tools, all while eliminating the interruptions and overhead that come with managing infrastructure and environments. + +Signing up and creating a workspace provides the basis for everything Bitrise offers: + +- [Bitrise CI](urn:resource:publication:94442): Save time spent on testing, onboarding, and maintenance with automated workflows and triggers. +- [Release Management](urn:resource:publication:90740): Simplify distributing your iOS and Android apps to testers or directly to app stores—all from one platform, from the CI you choose. +- [Build Cache](urn:resource:publication:94853): A fully managed remote caching solution that reduces CI build and test durations for applications built with Gradle and Bazel build tools. +- [Insights](urn:resource:publication:94879): With Insights’ build, test, and credit data, know what to prioritize and optimize your CI/CD workflows. + +The platform documentation provides information on the shared structure of these products. This includes: + +- [Accounts](/en/bitrise-docs-20/bitrise-platform/accounts/accounts-overview): How to sign up for a Bitrise account and what options you have to manage them. +- [Workspaces](/en/bitrise-platform/workspaces/workspaces-overview): Workspaces allow you to manage your projects and collaborate with team members. You need a workspace to run CI builds, to manage Release Management apps, or to utilize the Bitrise Build Cache. +- [Projects](/en/bitrise-platform/projects/projects-overview.html): A Bitrise project can handle all stages of the Mobile DevOps process, including building, testing, and distributing mobile apps. +- [Integrations](/en/bitrise-platform/integrations/about-integrations.html): Bitrise supports a number of integrations to make sure you can use your preferred tools and environments every step of the way. diff --git a/docs/bitrise-platform/projects/_category_.json b/docs/bitrise-platform/projects/_category_.json new file mode 100644 index 0000000..f42a913 --- /dev/null +++ b/docs/bitrise-platform/projects/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Projects", + "position": 5, + "link": null +} diff --git a/docs/bitrise-platform/projects/changing-the-owner-of-a-project.mdx b/docs/bitrise-platform/projects/changing-the-owner-of-a-project.mdx new file mode 100644 index 0000000..7a53c44 --- /dev/null +++ b/docs/bitrise-platform/projects/changing-the-owner-of-a-project.mdx @@ -0,0 +1,36 @@ +--- +title: "Changing the owner of a project" +description: "You can change the owner of a project from the Workspace profile page or from the project's project settings page." +sidebar_position: 4 +slug: /bitrise-platform/projects/changing-the-owner-of-a-project +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TransferringAProjectOnTheProjectSettingsPage from '@site/src/partials/transferring-a-project-on-the-project-settings-page.mdx'; +import Partial_TransferringMultipleProjectsAtTheSameTime from '@site/src/partials/transferring-multiple-projects-at-the-same-time.mdx'; + +Workspaces own projects. When you add a project to Bitrise, you select the workspace that will act as the owner of the project. From that point, only the owners of the workspace can change the ownership of the project. + +It can happen that you need to transfer a project on [Bitrise](https://www.bitrise.io) to another workspace. This can be done in two ways: + +- You can select the projects you want to transfer from the **Workspace settings** page's **Projects** menu. +- Any given project can be transferred from the project's **Project settings** page. + +When transferring a project, its custom settings are also transferred. These include: + +- All Workflows and Pipelines. +- Build triggers. +- Environment Variables. +- Build artifacts. + +Users on the project's team might lose their access in the event of a transfer. + +- Users of the project who are owners of the workspace that receives the project will retain access. +- Contributors will be transferred and retain their access if the workspace that receives the project allows outside contributors. If the workspace doesn't allow outside contributors, they will lose their access. +- Users belonging to groups listed on the **Groups** tab will lose their access to the project, as the groups belong to the workspace that previously owned the project. + + + + diff --git a/docs/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch.mdx b/docs/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch.mdx new file mode 100644 index 0000000..a6e5938 --- /dev/null +++ b/docs/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch.mdx @@ -0,0 +1,21 @@ +--- +title: "Configuring the repository URL and the default branch" +description: "When adding a new project to Bitrise, you specify a repository that is used to store your source code, and a branch that Bitrise uses as the default branch. You can change these at any time from Project Settings." +sidebar_position: 7 +slug: /bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch +sidebar_label: Configuring the repository URL and default branch +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ChangingTheDefaultBranch from '@site/src/partials/changing-the-default-branch.mdx'; +import Partial_ChangingTheRepositoryURL from '@site/src/partials/changing-the-repository-url.mdx'; + +When adding a new project to Bitrise, you specify a repository that is used to store your source code, and a branch that Bitrise uses as the default branch. + +Once the project is set up, you can change these at any time. + + + + diff --git a/docs/bitrise-platform/projects/creating-white-label-app-versions.mdx b/docs/bitrise-platform/projects/creating-white-label-app-versions.mdx new file mode 100644 index 0000000..df86cc4 --- /dev/null +++ b/docs/bitrise-platform/projects/creating-white-label-app-versions.mdx @@ -0,0 +1,26 @@ +--- +title: "Creating white label app versions" +description: "You can create different versions of your white label project and build all or just one version by chaining Workflows and setting differences in Environment Variables." +sidebar_position: 9 +slug: /bitrise-platform/projects/creating-white-label-app-versions +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_PreppingWorkflowsOfAWhiteLabelApp from '@site/src/partials/prepping-workflows-of-a-white-label-app.mdx'; +import Partial_ChainingWorkflowsForAWhiteLabelApp from '@site/src/partials/chaining-workflows-for-a-white-label-app.mdx'; + +This guide explains how to create different versions of your white label project and build all or just one version by chaining Workflows and setting differences in [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables). + +In this article, we’re building three individual versions (red, green, white) of our white label project. + +What you’ll need for this setup: + +- A main Workflow that launches each version-specific Workflow. +- One or more version-specific Workflow(s) where you can set all the parameters that distinguish your versions from each other. +- A utility Workflow which describes your build logic, and refers to the version-specific options as parameters. [Utility Workflows are Workflows that have an underscore before their Workflow ID](urn:resource:component:43026). Utility Workflows cannot be executed with the `bitrise_run` command: you need to reference them with the `before_run` or `after_run` properties. You can [chain utility Workflows with your regular Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together) in the Workflow Editor. + + + + diff --git a/docs/bitrise-platform/projects/embedding-a-project-status-badge.mdx b/docs/bitrise-platform/projects/embedding-a-project-status-badge.mdx new file mode 100644 index 0000000..80b6d3f --- /dev/null +++ b/docs/bitrise-platform/projects/embedding-a-project-status-badge.mdx @@ -0,0 +1,43 @@ +--- +title: "Embedding a project status badge" +sidebar_position: 6 +slug: /bitrise-platform/projects/embedding-a-project-status-badge +sidebar_label: Embedding a build status badge to your site +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +You can embed a Bitrise status badge on your site and show visitors the state of your latest build. You can choose to display the status of any build, regardless of the repository branch it was built from, or you can select a specific branch. + +You can get the embed code from the **Project settings** page of the app, using a status image API token. + +1. +1. On the left, select **Builds**. +1. Scroll down to the **Build status badge** section and click **Get code**. + + ![build-status-badge.png](/img/_paligo/uuid-b2225b17-758e-9676-2e0a-615aebd28335.png) +1. Optionally, type a branch name in the **Branch** field. + + If you type a valid branch name, the status of builds from this branch will be shown. If you leave the field empty, the status of any build of the project will be shown. + + ![status-badge-dialog.png](/img/_paligo/uuid-a3ebc86e-b8db-eedf-bcff-64947885e344.png) +1. Choose the format of the embed code in the **Format** menu: you can choose between a simple HTTPS URL or you can get the code in Markdown. +1. Copy the embed code from the **Embed** section. +1. Paste the code to your website. + +## The status image API token + +The status image API token is a special token which can only be used for the status badge update. No other information can be retrieved with this token. It returns a simple JSON object. For example, if the latest build is successful: + +``` +{ "status": "success" } +``` + +The possible status responses are: + +- `success`: If the last finished build was successful. +- `error`: If the last finished build failed or was aborted. +- `unknown`: In any other case, for example, if there was no finished build. diff --git a/docs/bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project.mdx b/docs/bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project.mdx new file mode 100644 index 0000000..5528f5b --- /dev/null +++ b/docs/bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project.mdx @@ -0,0 +1,40 @@ +--- +title: "Enabling the Bitrise Support user for your project" +description: "You can enable the Bitrise Support Access from the Project settings page. This way, our support team can have access to your project, specifically your Workflow, build log, project settings, and your bitrise.yml." +sidebar_position: 5 +slug: /bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project +sidebar_label: Enabling the Bitrise Support Access for your project +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +In this article we describe how you can enable the **Bitrise Support Access** so that our Support team can have access to your project, specifically your Workflow, build log, project settings or your `bitrise.yml` file. With the toggle function, you can easily turn the **Bitrise Support Access** on and off. No need to add us as a user to your project's Team. + +The Bitrise Support user, when enabled, has Admin access to your project. That means it can do anything that a regular user with Admin access rights on a project can do: it has access to your builds and Workflows, to all the settings in the Workflow Editor and to the **Project settings** page. + +:::important[No access to billing information] + +The Bitrise Support user can’t see your **Account information** or any **Billing** information. Only the owner of the account has access to this information and has the right to modify any account-related records. + +The Support user can’t see your other projects where the Support user is not enabled. For details, see [What the Bitrise Support user can/can't do?](https://support.bitrise.io/hc/en-us/articles/4405741488017) + +::: + +:::note[How long does the Bitrise Support Access remain active?] + +Due to security reasons once you toggle the Bitrise Support Access on, it will remain active for two weeks after which it automatically gets revoked. + +::: + +Let’s see how to set it up! + +1. +1. On the left, select **General** from the menu options. +1. Scroll down to the **Support Access** and toggle the switch to the right to enable it. It might take a couple of seconds to work and you might need to refresh your page to see the enabled status. + + ![support_access.png](/img/_paligo/uuid-c26b5123-a015-a06f-1e80-0845b40a2895.png) + +In case of a failing Workflow, our best practice is to create a new and correct version of the failing Workflow called `support-testing`. You can compare our `support-testing` with your own and update yours or keep the `support-testing` Workflow, rename it as you wish, and develop it further. diff --git a/docs/bitrise-platform/projects/index.md b/docs/bitrise-platform/projects/index.md new file mode 100644 index 0000000..d1f38c1 --- /dev/null +++ b/docs/bitrise-platform/projects/index.md @@ -0,0 +1,7 @@ +--- +title: "Projects" +sidebar_position: 5 +slug: /bitrise-platform/projects +--- + +Projects diff --git a/docs/bitrise-platform/projects/managing-user-access-to-a-project.mdx b/docs/bitrise-platform/projects/managing-user-access-to-a-project.mdx new file mode 100644 index 0000000..8a8eaa9 --- /dev/null +++ b/docs/bitrise-platform/projects/managing-user-access-to-a-project.mdx @@ -0,0 +1,35 @@ +--- +title: "Managing user access to a project" +description: "To collaborate on a project, users must be part of the project. You can add workspace groups to a project from the Workspace settings page or the Project settings page." +sidebar_position: 2 +slug: /bitrise-platform/projects/managing-user-access-to-a-project +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AddingOutsideContributorToAProject from '@site/src/partials/adding-outside-contributor-to-a-project.mdx'; +import Partial_AddingWorkspaceGroupsToAProject from '@site/src/partials/adding-workspace-groups-to-a-project.mdx'; +import Partial_RevokingAccessToAnAppFromAGroup from '@site/src/partials/revoking-access-to-an-app-from-a-group.mdx'; +import Partial_RevokingAccessToAnAppFromASingleUser from '@site/src/partials/revoking-access-to-an-app-from-a-single-user.mdx'; + +Each Bitrise project is owned by a workspace - but this doesn't mean that all members belonging to that workspace have access to a given project. In order to be able to collaborate on a project, users must be assigned to the project. + +There are three ways to be invited to collaborate on a project: + +- [Adding outside contributors](#UUID-31b59ff1-1c2f-4b90-ba57-3d0643aef261). +- [Adding one of the groups from the workspace that owns the project](#UUID-8fe04035-1454-48b3-9962-88e39d4bf4f4). +- [Assigning a workspace member to the project](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration). This also allows to set [user roles](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) at the same time. + +Similarly, there are two ways to revoke access to a project: + +- [Revoking access from a group](#UUID-b9539044-9756-8289-bf5b-ba8e6f417fef). +- [Revoking access from a user](#UUID-e6e5e8fc-9348-c16b-595b-40f3315404df). + + + + + + + + diff --git a/docs/bitrise-platform/projects/projects-overview.md b/docs/bitrise-platform/projects/projects-overview.md new file mode 100644 index 0000000..a6c7c28 --- /dev/null +++ b/docs/bitrise-platform/projects/projects-overview.md @@ -0,0 +1,20 @@ +--- +title: "Projects overview" +description: "Projects are the main building blocks of your Bitrise experience: a Git repository that stores source code is added to Bitrise as a project." +sidebar_position: 1 +slug: /bitrise-platform/projects/projects-overview +--- + +[A Bitrise project](/en/bitrise-platform/projects/projects-overview.html) is the container for the entire Mobile DevOps process of your development work. Each workspace can own multiple projects. A project allows you to: + +- Create a CI configuration: a project's CI configuration is tied to a Git repository. +- Set up Release Management to distribute your mobile app to testers and to online stores. + +Projects can add individual users and workspace groups as collaborators with granular access rights. + +Once you have access to a [workspace](/en/bitrise-platform/workspaces/workspaces-overview), you can start adding and managing projects. You can configure pretty much every aspect of your project at any time after the initial setup. Among other things, you can: + +- [Change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch/changing-the-repository-url). +- [Setting up service credentials](/en/bitrise-platform/integrations/the-service-credential-user/changing-the-service-credential-user). +- [Update your project's SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys.html). +- [Register new webhooks and update existing ones](/en/bitrise-platform/integrations/webhooks.html). diff --git a/docs/bitrise-platform/projects/public-projects.md b/docs/bitrise-platform/projects/public-projects.md new file mode 100644 index 0000000..bff903e --- /dev/null +++ b/docs/bitrise-platform/projects/public-projects.md @@ -0,0 +1,32 @@ +--- +title: "Public projects" +description: "To create a public project, simply add a new project to Bitrise and at the start of the process, set the privacy of the project to Public. If your Bitrise project is public, anyone who has the build URL can see the build logs." +sidebar_position: 8 +slug: /bitrise-platform/projects/public-projects +--- + +Open source projects are great - we all love them! They can be a pain to maintain, however, especially with CI/CD in the picture. That’s why we have introduced the Public projects feature for Bitrise: to make everyone’s life a lot easier! + +If your Bitrise project is public, anyone who has the build URL can see the build logs. For example, if the CI status check on GitHub fails on a pull request, anyone can click on the build URL and view the build logs. + +To create a public project, simply [add a new project](/en/bitrise-ci/getting-started/adding-a-new-project.html) to Bitrise and at the start of the process, set the privacy of the project to **Public**. + +:::warning[Can't modify privacy later] + +You can't change this setting later! Once you've added an project as a public project, you can't set it back to private. You would have to add the project again. + +::: + +When you have a public project, outside contributors can troubleshoot issues easier, find out why, for example, a pull request of theirs resulted in a failed build. They do not have to be invited to a Bitrise team to be able to view Bitrise logs and they do not need the help of a Bitrise team member, either. + +Of course, this does not mean anyone can do anything with your public project on Bitrise. If the user viewing the logs is not invited to work on the project in [some role](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html), they will only be able to: + +- View the [build logs](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html). +- Download the build logs. +- View [the build’s `bitrise.yml` file](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file). + +:::caution[Public project’s build logs are available for anyone] + +Remember: a public project’s build logs and `bitrise.yml` file can be seen by anyone - make sure these files do not expose anything you do not want to be seen! + +::: diff --git a/docs/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.mdx b/docs/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.mdx new file mode 100644 index 0000000..e9452be --- /dev/null +++ b/docs/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.mdx @@ -0,0 +1,54 @@ +--- +title: "Roles and permissions for Bitrise CI" +description: "Bitrise apps have user roles defined on their team. They limit what you can and cannot do with an application. The same user can have different roles on different projects." +sidebar_position: 3 +slug: /bitrise-platform/projects/roles-and-permissions-for-bitrise-ci +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_Owners from '@site/src/partials/owners.mdx'; +import Partial_Developers from '@site/src/partials/developers.mdx'; +import Partial_TestersQA from '@site/src/partials/testersqa.mdx'; +import Partial_PlatformEngineers from '@site/src/partials/platform-engineers.mdx'; +import Partial_Admins from '@site/src/partials/admins.mdx'; + +Roles provide access control on Bitrise: they limit what actions a user can and cannot perform on a Bitrise project. Bitrise CI has its own dedicated roles. + +:::note[Release Management] + +This page is about roles and permissions for Bitrise CI. + +Release Management has its own roles and permissions: the only role they share with Bitrise CI is that of the project admin. For more information, see [Release Management roles and permissions](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). + +::: + +Roles work on a project basis: the same user can have different roles on different projects. + +You can also assign roles to [workspace groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.html). The roles work the same way and each user within a group receives all permissions associated with the group's assigned role. + +There are four types of roles that you can assign to a user on a project's team: + +- [Admin](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci/admins) + + :::note[Full access to Release Management] + + A project admin has full access to both the project's Bitrise CI configuration and its Release Management apps, too! + + ::: +- [Platform Engineer](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci/platform-engineers) +- [Developer](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci/developers) +- [Tester/QA](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci/testersqa) + +In addition, each project has Owners. + + + + + + + + + + diff --git a/docs/bitrise-platform/repository-access/_category_.json b/docs/bitrise-platform/repository-access/_category_.json new file mode 100644 index 0000000..6fe448b --- /dev/null +++ b/docs/bitrise-platform/repository-access/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Repository access", + "position": 6, + "link": null +} diff --git a/docs/bitrise-platform/repository-access/about-repository-access.mdx b/docs/bitrise-platform/repository-access/about-repository-access.mdx new file mode 100644 index 0000000..8f2498b --- /dev/null +++ b/docs/bitrise-platform/repository-access/about-repository-access.mdx @@ -0,0 +1,42 @@ +--- +title: "About repository access" +description: "To run builds, Bitrise CI must be able to access a Git repository: when a build starts, we create a virtual machine and clone your repository on it, which requires authentication." +sidebar_position: 1 +slug: /bitrise-platform/repository-access/about-repository-access +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OAuthConnection from '@site/src/partials/oauth-connection.mdx'; +import Partial_SSHKeyAuthorization from '@site/src/partials/ssh-key-authorization.mdx'; +import Partial_HTTPSAuthorization from '@site/src/partials/https-authorization.mdx'; +import Partial_GitHubApp from '@site/src/partials/github-app.mdx'; + +To run builds, Bitrise CI must be able to access a Git repository: when a build starts, we create a virtual machine and clone your repository on it, which requires authentication. Bitrise can authenticate to the Git repository in one of three ways: + +- [GitHub app](#UUID-f63c866f-8db0-f608-e9a1-7ec0ff6d4d97): Bitrise provides a GitHub app for both GitHub Cloud and GitHub Enterprise. +- [SSH keys](#UUID-2673ae04-f37e-a718-1b8f-87add20451a4): Create a public and private key, and register the public key at your Git provider, allowing Bitrise to authenticate when running builds. +- [Personal access token](#UUID-2db72292-9f7b-1811-f972-4743e65c494f): Generate a personal access token at your Git provider and register it at Bitrise. You can use this for HTTPS authorization. + +You configure repository access when adding a new project but you can change every setting, including the authentication method and the repository URL itself, later. + +There are two ways to select a repository when [adding a new project](/en/bitrise-ci/getting-started/adding-a-new-project.html): + +- Manually pasting a repository URL. +- Connect your Bitrise account to a Git provider account. This allows you to select from a list of available repositories when adding a new project. + +Selecting a repository URL is not final: you can always [change it later](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch/changing-the-repository-url). + +If you connect your Bitrise account to a Git provider account, authentication depends on the connection type: + +- The GitHub app uses short-lived access tokens and therefore doesn't require either an SSH key or a personal access token. +- The OAuth connection requires either an SSH key or a personal access token, depending on the repository URL. + + + + + + + + diff --git a/docs/bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies.mdx b/docs/bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies.mdx new file mode 100644 index 0000000..9c5d325 --- /dev/null +++ b/docs/bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies.mdx @@ -0,0 +1,52 @@ +--- +title: "Apps with submodules or private repo dependencies" +description: "Bitrise needs access to all repositories or submodules for a successful build, so if your project has submodules or private repo dependencies, you must grant Bitrise access to those as well." +sidebar_position: 9 +slug: /bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies +sidebar_label: Projects with submodules or private repo dependencies +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UsingAMachineUserToAccessPrivateRepositories from '@site/src/partials/using-a-machine-user-to-access-private-repositories.mdx'; +import Partial_GitCloningSubmodulesAndRepositoryDependencies from '@site/src/partials/git-cloning-submodules-and-repository-dependencies.mdx'; + +:::note[GitHub App integration] + +If your project uses a GitHub App installation to connect to your repository, you can simply [link additional repositories](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories). You don't need any of the workarounds described in this document. + +::: + +If you have a project with one or more submodules or other private repository dependencies (for example, CocoaPods repositories), Bitrise needs access to all repositories or submodules for a successful build. + +For private projects with OAuth connections, Bitrise uses SSH to access Git repositories: to grant access, you need to make sure all the repositories can be accessed with the public [SSH key generated](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) for your Bitrise project. + +There are two ways to achieve this: + +- [Register the same SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) for every repository you have to access during the build. +- Register the SSH key with a bot user and add that user to all repositories. + +Registering the same SSH key for every repository is the best, most secure way - but not all services support it. GitLab and Bitbucket does support it, GitHub, however, doesn’t. If your code is stored on GitHub and you use an OAuth connection, read on! + +We’ll go through the other option, using a bot user or machine user - GitHub calls them machine users - in detail. In brief, the concept is simple: you register the Bitrise public SSH key to a user and add that user to all repositories that have to be accessed for your Bitrise build. + +:::note[Machine user with read only access] + +It is not required to use a special bot/machine user: you can add the SSH key to your own account on the git hosting service. The best practice, however, is to use a machine user, with read only access, for those repositories you want to access during the build. + +::: + +[GitHub recommends this method](https://docs.github.com/en/developers/overview/managing-deploy-keys#machine-users) for accessing multiple repositories. Let’s quickly go through an example. + +**The MultiBit project** + +We have a Bitrise project we’ll call MultiBit. It has a main repository and it needs to pull additional data from two other, private repositories during a Bitrise build. Our main user is called BitMan and his GitHub account is linked to his Bitrise account. To access the private repositories during the build, BitMan creates another user on GitHub, called BitBot. BitBot will be the machine user. + +Now, BitMan accesses the **Project settings** page of his Bitrise project, and copies the public SSH key. BitMan then adds the SSH key to the BitBot user on GitHub and adds BitBot to the two private repositories as a collaborator. Now BitBot has the Bitrise public key and has access to the private repositories as necessary. It’s time to test if BitMan’s setup works. + +BitMan goes to Bitrise and opens the Workflow Editor. He has the **Activate SSH Key** Step in his repository so the SSH key will work. BitMan adds a [**Script**](https://github.com/bitrise-io/steps-script) Step to clone the private repositories - as the **Git Clone** Step only works with the main repository! Once all that is done, the build should work as expected. + + + + diff --git a/docs/bitrise-platform/repository-access/configuring-https-authorization-credentials.mdx b/docs/bitrise-platform/repository-access/configuring-https-authorization-credentials.mdx new file mode 100644 index 0000000..8093d65 --- /dev/null +++ b/docs/bitrise-platform/repository-access/configuring-https-authorization-credentials.mdx @@ -0,0 +1,48 @@ +--- +title: "Configuring HTTPS authorization credentials" +description: "For private projects, you can authorize Bitrise to access your repository via an HTTPS URL, using a Personal Access Token. This is necessary for Bitrise to be able to clone your repository to the [virtual machine](/en/bitrise-platform/infrastructure/build-machines.html) when starting a new build." +sidebar_position: 8 +slug: /bitrise-platform/repository-access/configuring-https-authorization-credentials +sidebar_label: Configuring HTTPS authorization +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToTheProjectSettingsPage from '@site/src/partials/getting-to-the-project-settings-page.mdx'; + +For private projects, you can authorize Bitrise to access your repository via an HTTPS URL, using a Personal Access Token. This is necessary for Bitrise to be able to clone your repository to the [virtual machine](/en/bitrise-platform/infrastructure/build-machines.html) when starting a new build. You can set up authorization: + +- [When adding a new project](/en/bitrise-ci/getting-started/adding-a-new-project.html). +- At any time on the **Project settings** page. + +To configure authorization for a repository with HTTPS URL on the **Project settings** page: + +1. Create a Personal Access Token at your Git provider and save it. + + - [GitHub](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) + - [Gitlab](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html) + - [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/create-a-repository-access-token/) + + :::note[Fine-grained access] + + The Personal Access Token needs to have **read** access to the repository. We recommend using fine-grained Personal Access Tokens that do not have any additional rights to the repository or your Git provider account. + + ::: +1. +1. Make sure you have an HTTPS URL: on the left, select **General**, and in the **Basic settings** section, find the **Repository URL**. +1. On the left, select **Integrations**. +1. Select the **Git provider** tab. +1. In the **Personal Access Token** card, click **Add**. + + ![SCR-20260331-prho.png](/img/_paligo/uuid-3de8dcba-e678-997e-20f0-3055cd889bb0.png) +1. In the dialog, add the Personal Access Token. + + :::note[Bitbucket username] + + If your repository is on Bitbucket, you'll also have to provide your Bitbucket username. + + ::: + + ![change-https-credentials.png](/img/_paligo/uuid-c1bacf0c-d211-9674-a2d6-625665e9b381.png) +1. Once done, click **Save changes**. diff --git a/docs/bitrise-platform/repository-access/configuring-ssh-keys.mdx b/docs/bitrise-platform/repository-access/configuring-ssh-keys.mdx new file mode 100644 index 0000000..02bdb5b --- /dev/null +++ b/docs/bitrise-platform/repository-access/configuring-ssh-keys.mdx @@ -0,0 +1,34 @@ +--- +title: "Configuring SSH keys" +description: "To access your app's repository, Bitrise needs an SSH key. You can add an SSH key when you first add an app to Bitrise but you can update your keys at any point in App settings." +sidebar_position: 7 +slug: /bitrise-platform/repository-access/configuring-ssh-keys +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ConfiguringSSHKeysForYourBitriseApp from '@site/src/partials/configuring-ssh-keys-for-your-bitrise-app.mdx'; +import Partial_GeneratingYourOwnSSHKeypair from '@site/src/partials/generating-your-own-ssh-keypair.mdx'; + +SSH keys are the primary method of authentication. To access your project's repository, Bitrise needs a public-private SSH keypair, with the public key registered to your project's Git repository. + +There is one exception to this: if you use the [Bitrise GitHub App](/en/bitrise-platform/repository-access/github-app-integration) to connect your Bitrise Workspace to GitHub, you do not need an SSH key. + +:::tip[Using an HTTPS URL] + +You can use HTTPS Git URLs, using a personal access token for authorization: in this case, you don't need an SSH key: [Configuring HTTPS authorization credentials](/en/bitrise-platform/repository-access/configuring-https-authorization-credentials). + +::: + +You can add an SSH key when you first add a project to Bitrise but you can update your keys at any point. You can even skip SSH key configuration when adding the project and register SSH keys later. + +:::tip[Accessing multiple repositories] + +If your project needs to access multiple repositories during the build, the best practice is to generate an SSH keypair, and register the public key to every repository you need. Alternatively, you can create a machine user and register the SSH key to that user. To learn more, see [Apps with submodules or private repo dependencies](/en/bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies). + +::: + + + + diff --git a/docs/bitrise-platform/repository-access/connecting-bitbucket-server-instances.md b/docs/bitrise-platform/repository-access/connecting-bitbucket-server-instances.md new file mode 100644 index 0000000..4360a83 --- /dev/null +++ b/docs/bitrise-platform/repository-access/connecting-bitbucket-server-instances.md @@ -0,0 +1,36 @@ +--- +title: "Connecting Bitbucket Server instances" +description: "Connect your Bitrise workspace to Bitbucket Server to access your privately hosted repositories for CI builds." +sidebar_position: 6 +slug: /bitrise-platform/repository-access/connecting-bitbucket-server-instances +--- + +Connect your Bitrise workspace to Bitbucket Server to access your privately hosted repositories for CI builds. You need to: + +- Create a new Application Link on your server. +- Authorize Bitrise and assign the required permissions. +- Copy the necessary credentials to your workspace settings. + +1. Log in to your Bitbucket Server instance with **admin** privileges. +1. Click the settings icon on the top menu bar to access **Administration**. +1. On the left menu bar, find the Integrations section, and select **Application Links**. +1. Click **Create link**. + + ![2025-11-13-bitbucket-app-links.png](/img/_paligo/uuid-f87af39b-bb44-1167-0051-389e3b38c612.png) +1. Select **External Application**, and **Incoming** as the direction. +1. In the Name field, enter a name that clearly identifies the application. For the sake of simplicity, we recommend **Bitrise**. +1. In the **Redirect URL** field, enter https://app.bitrise.io/users/auth/bitbucket_server/callback. +1. Under **Application permissions**, find **Repositories** and select **Admin**. +1. Click **Save**. You will be taken to the **Credentials** page. + + ![20251113-bitbucket-credentials.png](/img/_paligo/uuid-dbf18dae-38c9-f32a-fb61-6afbb08edb2f.png) +1. Copy the **Client ID** and the **Client secret**. +1. Open the **Workspace settings** page on Bitrise and select **Integrations**. +1. Select **Bitbucket Server** and then click **Add credentials**. + + ![2025-11-13-bitbucket-server-integration.png](/img/_paligo/uuid-6657cf32-779e-915b-aaea-453f88b28ec8.png) +1. Add your credentials: + + - **Client ID** + - **Client secret** + - **URL**: Your server's base URL diff --git a/docs/bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances.mdx b/docs/bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances.mdx new file mode 100644 index 0000000..51f9c80 --- /dev/null +++ b/docs/bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances.mdx @@ -0,0 +1,20 @@ +--- +title: "Connecting self-hosted GitLab instances" +description: "For Workspaces, Bitrise supports connecting to self-hosted GitLab instances. Once it’s done, you can add apps to Bitrise from privately hosted repositories." +sidebar_position: 5 +slug: /bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AddingANewAppFromASelfHostedGitLabRepository from '@site/src/partials/adding-a-new-app-from-a-self-hosted-gitlab-repository.mdx'; +import Partial_ConfiguringTheGitLabConnection from '@site/src/partials/configuring-the-gitlab-connection.mdx'; + +For Workspaces, Bitrise supports connecting to self-hosted GitLab instances. Connecting is simple, and once it’s done, you can add projects to Bitrise from privately hosted repositories. All functions that you got used to with publicly hosted repositories will be available! + +Bitrise needs to be authorized as an application for the entire GitLab instance and then the **Application Id** and the **Secret** value belonging to the Bitrise OAuth application must be added to the Workspace on [bitrise.io](https://www.bitrise.io). + + + + diff --git a/docs/bitrise-platform/repository-access/github-app-integration.mdx b/docs/bitrise-platform/repository-access/github-app-integration.mdx new file mode 100644 index 0000000..73173df --- /dev/null +++ b/docs/bitrise-platform/repository-access/github-app-integration.mdx @@ -0,0 +1,50 @@ +--- +title: "GitHub app integration" +description: "The Bitrise GitHub App allows users to connect their Bitrise Workspace to a GitHub account or organization with a GitHub App that provides granular access with increased security and automatic status updates." +sidebar_position: 3 +slug: /bitrise-platform/repository-access/github-app-integration +sidebar_label: GitHub app integration for GitHub Cloud +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_RunningGitCloneWithLinkedRepositories from '@site/src/partials/running-git-clone-with-linked-repositories.mdx'; +import Partial_ExtendingGitHubAppPermissionsToTheBuilds from '@site/src/partials/extending-github-app-permissions-to-the-builds.mdx'; +import Partial_InstallingTheGitHubAppIntegration from '@site/src/partials/installing-the-github-app-integration.mdx'; +import Partial_UsingAPrivateStepLibraryViaTheGitHubApp from '@site/src/partials/using-a-private-step-library-via-the-github-app.mdx'; +import Partial_SwitchingFromOAuthConnectionToTheGitHubApp from '@site/src/partials/switching-from-oauth-connection-to-the-github-app.mdx'; +import Partial_RevertingToAnOAuthConnection from '@site/src/partials/reverting-to-an-oauth-connection.mdx'; +import Partial_AdditionalLinkedRepositories from '@site/src/partials/additional-linked-repositories.mdx'; + +:::important[Supported for GitHub Cloud users] + +The Bitrise GitHub app is supported for all GitHub Cloud users. GitHub Enterprise Server users need to create and install a different GitHub app, as described in our [GH Enterprise integration guide](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise). + +::: + +The best way to connect your Bitrise account to your GitHub repositories is by integrating with [a GitHub app](https://docs.github.com/en/apps/overview). The Bitrise GitHub app has a number of features that make integration easier: + +- The app eliminates the need for an SSH key, a Personal Access Token, and a service credential user. For access, it generates a temporary access token before every build, significantly increasing security. +- It provides granular access to your repositories: no need to grant access to an entire GitHub organization, instead select the specific repositories the app can access. +- With the app installed, you automatically receive Bitrise status updates directly on GitHub with the GitHub Checks app. No need for configuring status reports separately. Note that while only one GitHub account can be connected to a Bitrise Workspace, GitHub Checks can still be configured for repositories owned by other GitHub accounts. + +:::important[HTTPS URL required] + +The GitHub App requires an HTTPS URL for your repository instead of an SSH one. Normally, you don't have to worry about this: setting up the GitHub App connection changes the URL of your project. If there's an issue, you can change the URL manually: [Changing the repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch/changing-the-repository-url). + +::: + + + + + + + + + + + + + + diff --git a/docs/bitrise-platform/repository-access/index.md b/docs/bitrise-platform/repository-access/index.md new file mode 100644 index 0000000..b719fc3 --- /dev/null +++ b/docs/bitrise-platform/repository-access/index.md @@ -0,0 +1,7 @@ +--- +title: "Repository access" +sidebar_position: 6 +slug: /bitrise-platform/repository-access +--- + +Repository access diff --git a/docs/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise.mdx b/docs/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise.mdx new file mode 100644 index 0000000..9c71bca --- /dev/null +++ b/docs/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise.mdx @@ -0,0 +1,31 @@ +--- +title: "Integrating GitHub Enterprise with Bitrise" +description: "Bitrise offers an integration to GitHub Enterprise Server (GHES). The main benefit of the integration is that GHES users can store the `bitrise.yml` file in their repository." +sidebar_position: 4 +slug: /bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise +sidebar_label: GitHub app integration for GitHub Enterprise Server +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AboutTheGitHubEnterpriseServerIntegration from '@site/src/partials/about-the-github-enterprise-server-integration.mdx'; +import Partial_CreatingTheGitHubApp from '@site/src/partials/creating-the-github-app.mdx'; +import Partial_AdditionalLinkedRepositoriesForGitHubEnterpriseServerIntegration from '@site/src/partials/additional-linked-repositories-for-github-enterprise-server-integration.mdx'; +import Partial_ExtendingGitHubAppPermissionsForEnterpriseServerUsers from '@site/src/partials/extending-github-app-permissions-for-enterprise-server-users.mdx'; +import Partial_TroubleshootingTheGHESIntegration from '@site/src/partials/troubleshooting-the-ghes-integration.mdx'; +import Partial_ConnectingToTheGHESInstance from '@site/src/partials/connecting-to-the-ghes-instance.mdx'; + +Bitrise offers an integration for self-hosted GitHub Enterprise Server (GHES) instances. The main benefit of the integration is that self-hosted GHES users can [store the `bitrise.yml` file in their repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository). Storing the file in the repository allows for full version control and maintenance of your configuration file. + + + + + + + + + + + + diff --git a/docs/bitrise-platform/repository-access/repository-access-with-oauth.mdx b/docs/bitrise-platform/repository-access/repository-access-with-oauth.mdx new file mode 100644 index 0000000..99b9228 --- /dev/null +++ b/docs/bitrise-platform/repository-access/repository-access-with-oauth.mdx @@ -0,0 +1,38 @@ +--- +title: "Repository access with OAuth" +description: "To take full advantage of all the features Bitrise offers, including automatic webhook registration, you need to connect your GitHub/GitLab/Bitbucket account to your Bitrise account." +sidebar_position: 2 +slug: /bitrise-platform/repository-access/repository-access-with-oauth +sidebar_label: OAuth connection +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DisconnectingAGitProviderAccount from '@site/src/partials/disconnecting-a-git-provider-account.mdx'; +import Partial_SwitchingFromOAuthConnectionToTheGitHubApp from '@site/src/partials/switching-from-oauth-connection-to-the-github-app.mdx'; +import Partial_ConnectingAGitProviderAccountWhenAddingAnApp from '@site/src/partials/connecting-a-git-provider-account-when-adding-an-app.mdx'; +import Partial_ConnectingAGitProviderAccountFromTheProfileSettingsPage from '@site/src/partials/connecting-a-git-provider-account-from-the-profile-settings-page.mdx'; + +Bitrise needs access to your code in a Git repository to be able to build. You can provide access on a project-by-project basis but we recommend connecting your Bitrise account to your Git provider accounts (GitHub, GitLab, and Bitbucket). + +One of the ways to connect your accounts is by setting up an OAuth connection. You can connect all three Git provider accounts using OAuth, by either: + +- Connecting the account when adding a new Bitrise project. +- Connecting the account from your [Account settings](http://app.bitrise.io/me/profile#/edit_profile) page. + +:::important[One account per Git provider] + +Please note that you cannot connect two accounts from the same Git provider (for example, two GitHub accounts) to Bitrise. + +::: + +Connecting one Git provider account is not final. You can disconnect an account and connect a different one at any time. + + + + + + + + diff --git a/docs/bitrise-platform/workspaces/_category_.json b/docs/bitrise-platform/workspaces/_category_.json new file mode 100644 index 0000000..8d7b233 --- /dev/null +++ b/docs/bitrise-platform/workspaces/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Workspaces", + "position": 4, + "link": null +} diff --git a/docs/bitrise-platform/workspaces/changing-the-owners-of-a-workspace.mdx b/docs/bitrise-platform/workspaces/changing-the-owners-of-a-workspace.mdx new file mode 100644 index 0000000..04c3919 --- /dev/null +++ b/docs/bitrise-platform/workspaces/changing-the-owners-of-a-workspace.mdx @@ -0,0 +1,26 @@ +--- +title: "Changing the owners of a Workspace" +description: "Workspace owners can access and delete all apps linked to the Workspace and can manage the billing details of the Workspace. Only owners can add or remove other owners." +sidebar_position: 4 +slug: /bitrise-platform/workspaces/changing-the-owners-of-a-workspace +sidebar_label: Managing the owners of a workspace +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkspaceSettingsPage from '@site/src/partials/opening-the-workspace-settings-page.mdx'; + +Workspace owners can access and delete all projects linked to the Workspace, can manage the billing details of a Workspace and can add or remove other owners. + +Every Workspace must have at least one owner. + +1. +1. On the left, select **Collaboration** from the menu options. +1. Select the **Owners** tab. + + ![owners-tab-workspace-settings.png](/img/_paligo/uuid-d0da76d5-0ec1-fd85-9ebd-b8d529c150be.png) +1. Click **+ Add owner** to add a new owner to the Workspace. +1. Enter an email address or add an existing member to the owners group using the radio buttons in the dialogue box. The account in question will become an owner of the Workspace. + + ![add-owner.png](/img/_paligo/uuid-820b4fbc-df87-77b2-04c1-8f688d9f6433.png) diff --git a/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/_category_.json b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/_category_.json new file mode 100644 index 0000000..2a70895 --- /dev/null +++ b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Collaboration and permissions", + "position": 3, + "link": null +} diff --git a/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/index.md b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/index.md new file mode 100644 index 0000000..238bb4d --- /dev/null +++ b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/index.md @@ -0,0 +1,8 @@ +--- +title: "Collaboration and permissions in workspaces" +sidebar_position: 3 +slug: /bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces +sidebar_label: Collaboration and permissions +--- + +Collaboration and permissions diff --git a/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces.mdx b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces.mdx new file mode 100644 index 0000000..755037b --- /dev/null +++ b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces.mdx @@ -0,0 +1,23 @@ +--- +title: "Roles and permissions in workspaces" +sidebar_position: 1 +slug: /bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UpdatingRolesAndPermissions from '@site/src/partials/updating-roles-and-permissions.mdx'; +import Partial_ProjectLevelRoles from '@site/src/partials/project-level-roles.mdx'; +import Partial_WorkspaceLevelRoles from '@site/src/partials/workspace-level-roles.mdx'; + +Roles determine the permissions of the workspace members. There are two main types of roles that can be assigned to workspace members: + +- **Workspace-level roles**: These roles determine what actions a user can perform within a workspace. Workspace-level roles can be assigned to individual members of a workspace. +- **Project-level roles**: These roles determine what actions a user can perform on a project. Project-level roles can be assigned to workspace groups. The roles are different based on the product: Bitrise CI and Release Management have their own set of roles. + + + + + + diff --git a/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration.mdx b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration.mdx new file mode 100644 index 0000000..fb07321 --- /dev/null +++ b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration.mdx @@ -0,0 +1,32 @@ +--- +title: "Workspace collaboration" +description: "A Bitrise Workspace allows seamless collaboration on Bitrise projects. You can manage Workspace membership on the **Collaboration** page of the Workspace settings. A member can be an owner, a regular member or an outside contributor." +sidebar_position: 2 +slug: /bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration +sidebar_label: Workspace members +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CheckingWorkspaceMemberStatus from '@site/src/partials/checking-workspace-member-status.mdx'; +import Partial_AddingIndividualMembersToWorkspaces from '@site/src/partials/adding-individual-members-to-workspaces.mdx'; +import Partial_RemovingOtherUsersFromWorkspaces from '@site/src/partials/removing-other-users-from-workspaces.mdx'; + +Your workspace isn't just an environment to manage projects: it also allows seamless collaboration with other Bitrise users. You can invite other users to your workspaces, and of course you can be invited to other workspaces, too. + +You can manage workspace membership on the **Collaboration** page of the workspace settings. You can add members to a workspace in three ways: + +- Invite individual members: [see topic](#UUID-6acbac23-040e-8ead-9609-dcd88af3111d). +- Add them to a project as outside contributors. +- Organize them into [workspace groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.html). + +Workspace members can have different roles in a workspace. Workspace roles determine the different actions that the members have permissions for. You can configure product access for workspace members: each member can have access to Bitrise CI, Release Management, or both. For each project within a product, you can set up different project-level roles for all workspace members: [Roles and permissions in workspaces](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces). + +If SAML SSO is enabled and configured for a Bitrise workspace, workspace members can use SAML SSO to log in to their Bitrise account: [Configuring SAML SSO on Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise). + + + + + + diff --git a/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.mdx b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.mdx new file mode 100644 index 0000000..83b19b3 --- /dev/null +++ b/docs/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.mdx @@ -0,0 +1,40 @@ +--- +title: "Workspace groups" +description: "Being the member of a workspace's Team means being a member in one of the workspace groups. Groups can be assigned to the apps that are owned by the workspace." +sidebar_position: 3 +slug: /bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AddingWorkspaceGroupsToAProject from '@site/src/partials/adding-workspace-groups-to-a-project.mdx'; +import Partial_GlobalAccessGroups from '@site/src/partials/global-access-groups.mdx'; +import Partial_AddingMembersToAWorkspaceGroup from '@site/src/partials/adding-members-to-a-workspace-group.mdx'; +import Partial_CreatingGroupsForWorkspaces from '@site/src/partials/creating-groups-for-workspaces.mdx'; + +Members of a Bitrise workspace can be organized into workspace groups. Groups allow flexible allocation of Workspace members between apps, simplifying the process of managing workspaces that own multiple projects. + +Workspace members can belong to multiple different groups. Groups can be assigned user roles on any project's team: each member of the group will have the group's role and the access rights that come with that role. + +:::note[Difference between project collaborators and workspace groups] + +Collaborators on a project are handled on a project basis, while workspace groups are handled globally within a workspace. + +A workspace group has no inherent roles on its own. [You can assign groups to projects](/en/bitrise-platform/projects/managing-user-access-to-a-project/adding-workspace-groups-to-a-project) and choose their [role](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) there, which means the same group can have different roles on different projects. + +::: + +Workspace groups can have three main types of product access: + +- **Admin access**: Gives access to all aspects of the selected projects with the project admin role. This doesn't necessarily mean access to all projects owned by the workspace! +- **Bitrise CI access**: The group can only access the Bitrise CI configuration of a project, with the specific [Bitrise CI roles and permissions](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +- **Release Management access**: The group can only access the Release Management apps of the project, with the specific [Release Management permissions](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). + + + + + + + + diff --git a/docs/bitrise-platform/workspaces/creating-workspaces.mdx b/docs/bitrise-platform/workspaces/creating-workspaces.mdx new file mode 100644 index 0000000..716fe81 --- /dev/null +++ b/docs/bitrise-platform/workspaces/creating-workspaces.mdx @@ -0,0 +1,38 @@ +--- +title: "Creating Workspaces" +description: "Create a Bitrise Workspace to be able to add new apps or run builds. When you sign up for Bitrise, you are automatically prompted to create your first Workspace." +sidebar_position: 2 +slug: /bitrise-platform/workspaces/creating-workspaces +sidebar_label: Creating workspaces +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +A Workspace is an environment that allows you to manage your Bitrise apps and the team members working on the apps. You can create multiple Workspaces, and you can be invited to Workspaces by other Bitrise users. + +You must have access to at least one Workspace to be able to use Bitrise. When you create a new account, you can’t add new apps or run builds. To be able to do so, you need to either create a Workspace, or to be invited to an existing one. + +When you sign up for Bitrise, you are automatically prompted to create a new Workspace. If you skip creating a Workspace, or you want to create additional Workspaces later, you can do it: + +1. Log in to [bitrise.io](https://www.bitrise.io). +1. Hover over the left navigation bar. +1. Open the dropdown menu next to your Workspace name. + + ![workspace-menu.png](/img/_paligo/uuid-c9c66545-e909-2236-e073-d55e134d6548.png) +1. Select **Create Workspace**. This takes you to the **Create a new Workspace** page. +1. Find the **Workspace name** input field, and add a name. + + ![create-workspace.png](/img/_paligo/uuid-09615e71-c7e5-0a43-b41d-b611e25b0c29.png) +1. Click **Create**. + + This creates the Workspace - everything that comes after is optional and can be completed at a later point. However, without a subscription plan - either free or paid - your Workspace will be inactive and won't be able to own apps or run builds. +1. Choose a plan. + + If you’re interested in the details, or you want to find out more about our other plans, check out our [Pricing page](https://www.bitrise.io/pricing/) for more info. +1. Select a paid subscription plan, and follow the instructions to configure the details of the plan and set up payment methods. + + Alternatively, select the free plan for now and [add a subscription later](/en/bitrise-platform/workspaces/workspace-billing-and-invoicing). + +And that’s it. You can start adding apps and inviting people to your Workspace. diff --git a/docs/bitrise-platform/workspaces/index.md b/docs/bitrise-platform/workspaces/index.md new file mode 100644 index 0000000..a499363 --- /dev/null +++ b/docs/bitrise-platform/workspaces/index.md @@ -0,0 +1,7 @@ +--- +title: "Workspaces" +sidebar_position: 4 +slug: /bitrise-platform/workspaces +--- + +Workspaces diff --git a/docs/bitrise-platform/workspaces/workspace-api-token.mdx b/docs/bitrise-platform/workspaces/workspace-api-token.mdx new file mode 100644 index 0000000..b5a98ac --- /dev/null +++ b/docs/bitrise-platform/workspaces/workspace-api-token.mdx @@ -0,0 +1,22 @@ +--- +title: "Workspace API token" +description: "A Bitrise Workspace API token allows Workspace members to access the Bitrise API without each member having to set up their own [Personal Access Token](/en/bitrise-platform/accounts/personal-access-tokens.html). For API authentication, the Workspace token functions the exact same way as the Personal Access Token." +sidebar_position: 7 +slug: /bitrise-platform/workspaces/workspace-api-token +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CreatingAWorkspaceAPIToken from '@site/src/partials/creating-a-workspace-api-token.mdx'; +import Partial_RegeneratingAWorkspaceAPIToken from '@site/src/partials/regenerating-a-workspace-api-token.mdx'; + +A Workspace API token allows Workspace members to access the [Bitrise API](/en/bitrise-ci/api/api-overview.html) without each member having to set up their own [Personal Access Token](/en/bitrise-platform/accounts/personal-access-tokens.html). For API authentication, the Workspace token functions the exact same way as the Personal Access Token. + +A Workspace owner can set up multiple Workspace API tokens, each with different access rights to the apps owned by the Workspace. The access rights are determined by [user roles](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html), just as it is for [Workspace members](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration) or [Workspace groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.html). + +We recommend setting up any integrations that require an access token for API access using a Workspace API token instead of individual users' Personal Access Token. + + + + diff --git a/docs/bitrise-platform/workspaces/workspace-billing-and-invoicing.mdx b/docs/bitrise-platform/workspaces/workspace-billing-and-invoicing.mdx new file mode 100644 index 0000000..a2fd2c7 --- /dev/null +++ b/docs/bitrise-platform/workspaces/workspace-billing-and-invoicing.mdx @@ -0,0 +1,27 @@ +--- +title: "Workspace billing and invoicing" +description: "You can modify your subscription plan and billing information at any time on the Workspace page. You can also find and download past invoices." +sidebar_position: 5 +slug: /bitrise-platform/workspaces/workspace-billing-and-invoicing +sidebar_label: Workspace billing +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ChangingASubscriptionPlan from '@site/src/partials/changing-a-subscription-plan.mdx'; +import Partial_ChangingYourBillingEmail from '@site/src/partials/changing-your-billing-email.mdx'; +import Partial_DownloadingWorkspaceInvoices from '@site/src/partials/downloading-workspace-invoices.mdx'; +import Partial_CancelingYourSubscription from '@site/src/partials/canceling-your-subscription.mdx'; + +You can modify your subscription plan and billing information at any time on the Workspace page. + +You can set up a credit card as payment method. We'll send you invoices to your email address but you can also download them from the **Workspace settings** page. Please note that direct debit is only available for Workspaces via our [Sales team](https://bitrise.io/contact). + + + + + + + + diff --git a/docs/bitrise-platform/workspaces/workspace-faq.md b/docs/bitrise-platform/workspaces/workspace-faq.md new file mode 100644 index 0000000..4a3b9e4 --- /dev/null +++ b/docs/bitrise-platform/workspaces/workspace-faq.md @@ -0,0 +1,40 @@ +--- +title: "Workspace FAQ" +description: "The most frequently asked questions about Bitrise workspaces: what are they, how to manage its projects, what can members and groups do?" +sidebar_position: 8 +slug: /bitrise-platform/workspaces/workspace-faq +--- + +**What is a workspace on Bitrise?** + +Workspaces are used to seamlessly manage bigger teams and members inside a company. It is a place to gather all the people working on each of your company’s projects and delegate them through creating different groups. + +**How do I add a project to a workspace?** + +[Adding a new project](/en/bitrise-ci/getting-started/adding-a-new-project) + +**How do I migrate/transfer my existing projects to a workspace?** + +After you’ve created a workspace, you can transfer any of your projects to it at any time: [Changing the owner of a project](/en/bitrise-platform/projects/changing-the-owner-of-a-project). + +**What are owners inside a workspace?** + +Workspaces can have more than one owner. owners can manage billing, delete projects and change the billing email, create, delete and assign groups to projects. + +**What can members of a workspace do?** + +Workspace members have access to different projects and different products, depending on their roles and permissions: [Roles and permissions in workspaces](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces) + +**What are groups good for?** + +By creating [groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.html), you can assign multiple workspace members to each project at once, making it faster and easier to setup new projects on Bitrise. It also make it faster to reassign, remove and change role of multiple members. + +Groups can be assigned to a project, the group’s role can be set, and by removing the group from the project, you can revoke the access of every member of that group from the project. + +**Who are the Outside contributors?** + +Outside contributors are invited to work on a project owned by the workspace. They aren't members of the workspace and they only have access to the project they are invited to. + +**Can I have multiple workspaces?** + +One user can have as many workspaces as they like, but each workspace has to have an active subscription to be able to run CI builds or create Release Management apps. diff --git a/docs/bitrise-platform/workspaces/workspace-slack-integration.mdx b/docs/bitrise-platform/workspaces/workspace-slack-integration.mdx new file mode 100644 index 0000000..f5e1e16 --- /dev/null +++ b/docs/bitrise-platform/workspaces/workspace-slack-integration.mdx @@ -0,0 +1,71 @@ +--- +title: "Workspace Slack integration" +description: "You can configure a Slack integration for your Bitrise workspace that can send notification messages to selected Slack channels." +sidebar_position: 6 +slug: /bitrise-platform/workspaces/workspace-slack-integration +sidebar_label: Slack integration for workspaces +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningTheWorkspaceSettingsPage from '@site/src/partials/opening-the-workspace-settings-page.mdx'; + +You can configure a Slack integration for your workspace that can send notification messages to selected Slack channels. You can use this integration to send messages of: + +- Build events in Bitrise CI, with the **[Send a Slack message](https://github.com/bitrise-io/steps-slack-message)** Step. +- Release events in Release Management. +- Alerts in Insights. + +The integration is an OAuth application with an incoming Slack webhook. You can configure the integration for multiple channels: if, for example, you want Release Management events posted to a different channel than CI notifications, you can do that. + +The integration can view basic information about public channels in your Slack workspace and post to both public and private channels without being a member of the channel. + +If you are logged in to Slack, you can use the below button to connect the Bitrise Slack app to your Slack workspace: + +[Add to Slack](https://app.bitrise.io/workspace/integrations/slack/oauth) + +Read the [Bitrise privacy policy](https://go.bitrise.io/privacy-policy) before connecting the Slack app and check out our [Pricing page](https://bitrise.io/pricing) to learn about the Bitrise plans available for your workspace. + +You can also configure the Slack integration from the **Workspace settings** page: + +## Configuring the Slack integration + +To set up the Slack integration for a given channel: + +1. +1. Select **Integrations** and then select the Slack card. + + ![slack-inte.png](/img/_paligo/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png) +1. Click **Add configuration**. +1. In the dialog, view the permissions of the integration and select a channel. + + You can select private and public channels, as well as direct messages with Slack users. +1. Click **Allow**. + +## Renaming the configuration + +By default, the integration gets an automatically generated name. You can rename it at any time to create an easily identifiable configuration. + +1. Open the **Workspace settings** page. +1. Select **Integrations** and then the Slack card. + + ![slack-inte.png](/img/_paligo/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png) +1. Find your configuration and click the vertical ellipsis next to its name. +1. Select **Rename**. + + ![rename-int.png](/img/_paligo/uuid-a5864e82-1efc-0191-b37c-a162cfcb8f42.png) +1. Type a new name and click **Save changes**. + +## Getting the integration ID + +The integration ID identifies the Slack integration: it allows you to use it with the [**Send a Slack message**](https://github.com/bitrise-io/steps-slack-message) Step. To get it: + +1. Open the **Workspace settings** page. +1. Select **Integrations** and then the Slack card. + + ![slack-inte.png](/img/_paligo/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png) +1. Find your configuration and click the vertical ellipsis next to its name. +1. Select **Copy integration ID**. + + ![integrations-id.png](/img/_paligo/uuid-3b1378b0-3006-c0d1-a710-7c4a51821841.png) diff --git a/docs/bitrise-platform/workspaces/workspaces-overview.mdx b/docs/bitrise-platform/workspaces/workspaces-overview.mdx new file mode 100644 index 0000000..1df39d0 --- /dev/null +++ b/docs/bitrise-platform/workspaces/workspaces-overview.mdx @@ -0,0 +1,17 @@ +--- +title: "Workspaces overview" +description: "A Workspace is an environment that allows you to manage your Bitrise projects and the team members working on the projects. You can create multiple workspaces, and you can be invited to workspaces by other Bitrise users." +sidebar_position: 1 +slug: /bitrise-platform/workspaces/workspaces-overview +sidebar_label: About workspaces +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +A workspace is an environment that allows you to manage your Bitrise projects and the team members working on the projects. You can create multiple workspaces, and you can be invited to workspaces by other Bitrise users. + +To be able to add projects and run builds, you either need to be part of a workspace, or you have to be an outside contributor on an project's team. + +You also need a workspace to have [a paid subscription plan](https://www.bitrise.io/pricing) on Bitrise. Each of your workspaces can have a different subscription plan which determines how many credits your workspace's projects can use. diff --git a/docs/insights/_category_.json b/docs/insights/_category_.json new file mode 100644 index 0000000..65b4167 --- /dev/null +++ b/docs/insights/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Insights", + "position": 1, + "link": { + "type": "doc", + "id": "insights/index" + } +} diff --git a/docs/insights/available-metrics-in-insights/_category_.json b/docs/insights/available-metrics-in-insights/_category_.json new file mode 100644 index 0000000..a4d355a --- /dev/null +++ b/docs/insights/available-metrics-in-insights/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Available metrics", + "position": 2, + "link": null +} diff --git a/docs/insights/available-metrics-in-insights/bitrise-ci-metrics.mdx b/docs/insights/available-metrics-in-insights/bitrise-ci-metrics.mdx new file mode 100644 index 0000000..3e0e234 --- /dev/null +++ b/docs/insights/available-metrics-in-insights/bitrise-ci-metrics.mdx @@ -0,0 +1,61 @@ +--- +title: "Bitrise CI metrics" +description: "There are numerous available metrics in Insights, such as build success rate, the number of builds, the median time of a successful builds, etc." +sidebar_position: 1 +slug: /insights/available-metrics-in-insights/bitrise-ci-metrics +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Insights allows you to track three main categories of CI metrics: + +- Build metrics. +- Test metrics. +- Utilization. + +In addition, Insights can provide data for: + +- The [Bitrise Build Cache](urn:resource:publication:94853). +- Git operations: [Git Insights](/en/insights/git-insights). + +## Build metrics + +You can access build metrics from the charts on the **Overview** page or by selecting **Builds** on the left. The build metrics are available on app-, Pipeline, Stage, Workflow-, and Step level as well: + +- **Top build time (p90):** The 90th percentile of build times of successful builds. In other words, out of 100 successful builds, the 90th slowest build took this long. This metric is calculated based on your Pipelines' run time if you don't have any filters selected. +- **Typical build time (p50):** The median time of a successful build. In other words, out of 100 successful builds, the 50th slowest build took this long. This metric is calculated based on your Pipelines' run time if you don't have any filters selected. +- **Failure rate:** The rate of failed builds, or the rate at which a given Workflow failed. For example, if a Workflow failed six times out of ten, its failure rate is 60%. This metric is calculated based on your Pipelines' failure rate if you don't have any filters selected. +- **Build count:** The total number of builds started of the app or Workflow, based on the filters and the timeframe you set. +- **Total duration:** The total duration of all builds of the app or Workflow, based on the filters and the timeframe you set. + +## Test metrics + +Access testing metrics by opening the main Insights page and selecting **Tests** on the left. Similarly to basic build metrics, you can apply filters to test runs: you can filter for individual test suites, test cases, or modules, as well as to branches of your app's repository. + +- **Top duration (p90):** The 90th percentile of a test suite or a test case duration. If you filter on a specific test case, **Top duration (p90)** shows the 90th percentile duration of the specific test case. Otherwise, it shows the 90th percentile duration of the test suite(s) of the app or Workflow, based on the filters and the timeframe you set. 90th percentile means that out of 100 successful test executions, the 90th slowest took this much time to finish. +- **Typical duration (p50):** The median (50th percentile) of a test suite or a test case duration. If you filter on a specific test case, **Typical duration (p50)** shows the 50th percentile duration of the specific test case. Otherwise, it shows the 50th percentile duration of the test suite(s) of the app or Workflow, based on the filters and the timeframe you set. 50th percentile means that out of 100 successful test executions, the 50th slowest took this much time to finish. +- **Failure rate:** Test failure rate shows you how frequently a test suite or test case fails. For example, if you performed the test suite or test case 100 times, if 10 out of 100 failed, that's a 10% failure rate. If you filter on a specific test case, **Failure rate** shows the failure rate of the specific test case. Otherwise, it shows the failure rate of the test suite(s) of the app or Workflow based on the filters and the timeframe you set. +- **Total duration:** The total duration of all tests of the app or Workflow, based on the filters and the timeframe you set. +- **Test runs**: The total number of test runs. +- **Flaky runs**: The number of test runs that produce inconsistent results despite no changes in the code. + +## Utilization metrics + +:::important[Availability] + +The full utilization data described here is only available to users on a custom Enterprise plan. On other plans, you can only see your credit usage. + +::: + +Access utilization metrics by opening the main Insights page and selecting **Utilization** on the left. The **Utilization** page shows the resources used for Bitrise builds, enabling efficient tracking of your costs. + +By default, the page shows all metrics based on your billing cycle. This helps to track commitments and spending during a cycle without having to do any calculations of your own. The page also shows how much time remains of the current cycle. You can change this default frame of reference in the dropdown menu in the top right corner. + +The **Utilization** page always shows your overall infrastructure utilization. This metric aggregates all your infrastructure utilization, including build minutes, cache storage, artifacts storage and network egress. The page compares this aggregate total to your total commitment, displaying both a monetary value and a percentage value. + +- **Credit usage**: Insights tracks the amount of credits used on each app and, if you need it, each Workflow of a given app. +- **Build minutes**: Track how much time you spent building on the different machine types, enabling efficient tracking of computing resource consumption. You can set filters to show the data on multiple levels: build minutes per app, Pipeline, Stage, or Workflow. +- **Cached invocations**: This metric shows the number of build tool invocations using the build cache. Only those invocations are counted which downloaded data from the cache. +- **Network egress**: Data transfer from the build cache to external networks or clients to retrieve build artifacts. This includes data downloaded to a local development environment or to any other CI environment other than Bitrise. You can set filters and create a breakdown view of the data based on username to see how much egress is consumed by local users. diff --git a/docs/insights/available-metrics-in-insights/build-cache-metrics.md b/docs/insights/available-metrics-in-insights/build-cache-metrics.md new file mode 100644 index 0000000..f2107de --- /dev/null +++ b/docs/insights/available-metrics-in-insights/build-cache-metrics.md @@ -0,0 +1,43 @@ +--- +title: "Build cache metrics" +description: "Build cache metrics provide data-based visibility into the [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching) system. You can achieve more consistent and reliable CI/CD workflows by reducing the unpredictability that comes with inefficient caching." +sidebar_position: 3 +slug: /insights/available-metrics-in-insights/build-cache-metrics +--- + +Build cache metrics provide data-based visibility into the [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching) system. You can achieve more consistent and reliable CI/CD workflows by reducing the unpredictability that comes with inefficient caching. + +If your Bitrise Build Cache is correctly set up, you need no additional configuration to access data in Insights. The following Build Cache metrics are available: + +- **Invocation count**: This metric shows how frequently the cache is used in your builds and helps you understand the frequency and type of commands being executed. A high invocation count indicates strong cache adoption while a low count might mean caching isn't utilized to its full effect. +- **Uploads/downloads**: This measures the amount of data transfer to and from the build cache per each command. High data transfer volumes can point to excessive uploads or downloads which might slow down your builds. If downloads aren't significantly lower than uploads, it might indicate inefficient caching. Insights shows the p50 (median) value and the p90 value per invocation for both uploads and downloads: that is, how much data a given invocation uploads and downloads. + + ![p90-uploads.png](/img/_paligo/uuid-cb1811cf-42dd-3707-9288-42d1291a9780.png) +- **Cache hit rate**: This measures the percentage of data requests that can be served by the build cache. Insights shows the p10 hit rate (meaning only 10% of cases will have an equivalent or lower hit rate) and the median (p50) hit rate. The p10 value is particularly important because a low hit rate suggests suboptimal cache configuration or incorrectly defined cache keys. + +For Build Cache metrics - like any other metrics in Insights - you can: + +- [Create a dashboard](/en/insights/getting-started-with-insights/the-dashboards-page/creating-a-new-dashboard). +- [Set alerts](/en/insights/configuring-alerts-in-insights) for specific thresholds. + +## Common use cases for build cache metrics + +If your metrics show sudden and significant variation, you can check each related invocation to find out when the issue started. Filter to the relevant item/time period and then select the **Related invocations** tab. This can be useful for both uploads/downloads or cache hit rate. + +For example, if there is a sudden spike in uploads compared to downloads, it might mean that data is being repeatedly generated and stored but rarely reused, reducing efficiency: + +![trends.png](/img/_paligo/uuid-5d4f1f7c-0ca9-93fb-251c-4b63c26f1f4b.png) + +![issues-list.png](/img/_paligo/uuid-7d6dc7a5-d2ad-0a24-e940-6ce654e08db4.png) + +For another example, here's a sudden change in cache hit rate for a given Workflow, suggesting a weak spot in the caching setup: + +![cache-hit-rate-workflow.png](/img/_paligo/uuid-cf5db37b-0d3a-2292-c706-28a35c9c342e.png) + +You can look at the invocation count to identify when a project started (when the invocation count suddenly spikes) or stopped (when the invocation count suddenly drops) using the Build Cache: + +![started-build-cache.png](/img/_paligo/uuid-d2661447-265a-5f94-41dc-40c36c7acad6.png) + +![stopped-using-cache.png](/img/_paligo/uuid-8f7bf7cb-1d82-dacf-ecc0-b3e98438c118.png) + +This can help, for example, detecting and fixing configuration issues that break the cache setup. diff --git a/docs/insights/available-metrics-in-insights/command-metrics.md b/docs/insights/available-metrics-in-insights/command-metrics.md new file mode 100644 index 0000000..db25bf8 --- /dev/null +++ b/docs/insights/available-metrics-in-insights/command-metrics.md @@ -0,0 +1,27 @@ +--- +title: "Command metrics" +description: "Command metrics provides data-driven visibility into your Gradle and Bazel command performance. Command metrics are available as part of the [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching): if you have a working Build Cache setup, you will have access to these metrics in Insights." +sidebar_position: 2 +slug: /insights/available-metrics-in-insights/command-metrics +--- + +Command metrics provides data-driven visibility into your Gradle and Bazel command performance. Command metrics are available as part of the [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching): if you have a working Build Cache setup, you will have access to these metrics in Insights. + +:::note[Caching performance] + +Even though command metrics are available only with the Bitrise Build Cache, they don't measure cache performance. For that, see [Build cache metrics](/en/insights/available-metrics-in-insights/build-cache-metrics). + +::: + +You can view command performance by logging into Insights and selecting **Commands** on the left navigation menu. + +The following metrics are available: + +- **Duration (p50 and p90)**: The duration metric measures command execution times. Knowing how long your commands are running help pinpoint bottlenecks, optimize build times, and improve productivity. For example, you can identify which commands are taking longer than expected and focus your optimization efforts there. +- **Error rate**: The rate of commands that fail. A lower error rate means more reliable builds and fewer disruptions to your CI/CD pipeline. High error rates on specific commands can flag a need for action, to dive deeper and resolve the cause of any instability. +- **Invocation count**: This metric measures how often specific Gradle and Bazel commands are executed. It can highlight commands that are overused or run reduntantly. If you see a certain command running too often, it may be worth investigating if you can restructure your pipeline to avoid overusing commands. + +Like for any other metrics in Insights, you can: + +- [Create a dashboard](/en/insights/getting-started-with-insights/the-dashboards-page). +- [Set alerts](/en/insights/configuring-alerts-in-insights) for specific thresholds. diff --git a/docs/insights/available-metrics-in-insights/index.md b/docs/insights/available-metrics-in-insights/index.md new file mode 100644 index 0000000..2271faa --- /dev/null +++ b/docs/insights/available-metrics-in-insights/index.md @@ -0,0 +1,8 @@ +--- +title: "Available metrics in Insights" +sidebar_position: 2 +slug: /insights/available-metrics-in-insights +sidebar_label: Available metrics +--- + +Available metrics diff --git a/docs/insights/configuring-alerts-in-insights.mdx b/docs/insights/configuring-alerts-in-insights.mdx new file mode 100644 index 0000000..75d29bc --- /dev/null +++ b/docs/insights/configuring-alerts-in-insights.mdx @@ -0,0 +1,36 @@ +--- +title: "Configuring alerts in Insights" +description: "Insights allows you to configure alerts. Alerts monitor specified metrics and notify you when they reach a certain threshold. For example, you can configure an alert to notify you when a build of any of your apps exceeds 15 minutes or consumes more than a 1000 credits." +sidebar_position: 3 +slug: /insights/configuring-alerts-in-insights +sidebar_label: Alerts +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_EditingAnExistingAlert from '@site/src/partials/editing-an-existing-alert.mdx'; +import Partial_DuplicatingAnExistingAlert from '@site/src/partials/duplicating-an-existing-alert.mdx'; +import Partial_CreatingANewAlert from '@site/src/partials/creating-a-new-alert.mdx'; + +Insights allows you to configure alerts. Alerts monitor specified metrics and notify you when they reach a certain threshold. For example, you can configure an alert to notify you when a build of any of your apps exceeds 15 minutes or consumes more than a 1000 credits. + +You can configure alerts for: + +- Builds +- Tests +- Credit usage + +For each category, you can set alerts for any of the available metrics: [Bitrise CI metrics](/en/insights/available-metrics-in-insights/bitrise-ci-metrics). + +For each alert, you have to choose how to receive the notification. There are three options: + +- Microsoft Teams: The alert will post a notification to a Teams channel of your choice. [You need to configure incoming webhooks in Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=dotnet). +- Slack: The alert will post a notification to a Slack channel of your choice. You need [a Slack app with incoming webhooks enabled](https://api.slack.com/messaging/webhooks). +- Email: The alert will notify you via email. + + + + + + diff --git a/docs/insights/getting-started-with-insights.mdx b/docs/insights/getting-started-with-insights.mdx new file mode 100644 index 0000000..467c9eb --- /dev/null +++ b/docs/insights/getting-started-with-insights.mdx @@ -0,0 +1,96 @@ +--- +title: "Getting started with Insights" +description: "The Insights Overview page offers both aggregated and app-level metrics to check the CI/CD health of your app. Compare values of the same point in time across charts and quickly assess whether there are any negative trends that need your immediate attention." +sidebar_position: 1 +sidebar_label: Getting started +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TheDashboardsPage from '@site/src/partials/the-dashboards-page.mdx'; +import Partial_CreatingAlerts from '@site/src/partials/creating-alerts.mdx'; +import Partial_ViewingDataFromASpecificTimeframe from '@site/src/partials/viewing-data-from-a-specific-timeframe.mdx'; + +Insights constantly tracks the performance of all the projects of your Workspaces. You can get aggregated build data of all your projects, detailed metrics of each project, and you can even categorize the metrics as you see fit using dashboards. Insights also allows you to view bottlenecks: it shows you the Workflows and tests that take the most time or cost you the highest amount of credits. + +To get to your Workspace's Insights page: + +1. Log in to your Bitrise account. +1. In the top right corner, open the account selector dropdown menu and select a Workspace. +1. On the header, click **Insights**. This takes you to the **Overview** page of the selected Workspace. + +## The Overview page + +On the **Overview**, you can see aggregated build data of the selected Workspace. You can see both aggregated build data and project-level build data in the form of charts that cover the [selected timeframe](/en/insights/getting-started-with-insights/viewing-data-from-a-specific-timeframe). + +![Insights_overview.gif](/img/_paligo/uuid-dbb181a9-053e-bed3-133f-11e485313efa.gif) + +You can switch between Workspaces at any time: in the top right corner, open the account selector dropdown menu and select a Workspace. + +## Accessing the build metrics + +You can get to the detailed build metrics of your Workspace or a specific app in two ways: you can simply select **Builds** on the left, or you can choose a specific metric from the **Overview** page of the Workspace. We'll go through the second method: + +1. Open the **Overview** page of your Workspace. +1. Find the metric you need. For example, **Build failure rate**. +1. Click **View details**. + + If you have more than one project in the Workspace, on the Details page you will see the aggregated metrics for all projects of the Workspace by default. +1. From the leftmost dropdown menu, select the project you need. +1. Optionally, you can dig deeper by adding filters using the **Add filter** button to view specific data. You can filter for: + + - Pipelines: metrics of builds that ran with a specific Pipeline of the project. + - Stages: metric of builds that ran with a specific Stage of a Pipeline. + - Workflows: metrics of builds that ran with a specific Workflow of the project. + - Branches: metrics of builds of a specific branch. + - Machine types: metrics of builds that ran on a specific machine type. + - Stacks: metrics of builds that ran on a specific stack. + + ![filtering_highlight.png](/img/_paligo/uuid-0242fdf7-4025-4aca-215a-ffbecf5e62b9.png) +1. Scroll down to see individual builds, their data, including the Steps they ran with. + +For the available build metrics, check out [Bitrise CI metrics](/en/insights/available-metrics-in-insights/bitrise-ci-metrics). + +## Accessing the testing metrics of an app + +Insights allows you to keep track of testing metrics, right down to the level of individual testing modules. To do this, you need a testing Step that exports its results to the **Deploy to Bitrise.io** Step. The following Steps do this automatically, without any need for additional configuration: + +- [**Xcode Test for iOS**](https://github.com/bitrise-steplib/steps-xcode-test) +- [**Android Unit Test**](https://github.com/bitrise-steplib/bitrise-step-android-unit-test) +- [**iOS Device Testing**](https://github.com/bitrise-steplib/steps-virtual-device-testing-for-ios) +- [**Virtual Device Testing for Android**](https://github.com/bitrise-steplib/steps-virtual-device-testing-for-android) +- [**Flutter Test**](https://github.com/bitrise-steplib/bitrise-step-flutter-test) + +If you use any of these Steps to run your tests, you can check your metrics in Insights: + +1. Open Insights. +1. On the left, select **Tests**. +1. From the leftmost dropdown menu, select the project you need. +1. Optionally, you can dig deeper by using filters to view specific testing data. You can filter for: + + - Test suites + - Test cases + - Modules + - Branches + + ![testing_metrics.png](/img/_paligo/uuid-ce8ef015-6c7d-9b31-d3ce-69669a18b4ac.png) +1. Scroll down to see the individual test cases. + +For the available test metrics, check out [Bitrise CI metrics](/en/insights/available-metrics-in-insights/bitrise-ci-metrics). + +## Bottlenecks + +The **Bottlenecks** section helps you understand where you can save the most time or credits. We show you which of your Workflows and tests take the longest time and cost the highest amount of credits. + +To access the Bottlenecks page, simply select **Bottlenecks** on the left. The bottlenecks are divided into the three basic categories we use for all metrics: **Builds**, **Tests**, and **Credits**. Each category has three metrics: + +- **Failing Workflows/Failing tests**: these are the failing Workflows or test cases that have the highest impact on the time or credits used on your builds. +- **Build time/Run time**: Workflows with increasing build times, or test cases with increasing run times. +- **Usage/Flakiness**: Workflows that consumed the highest amount of resources (either time or credits), or test cases with the most flaky runs. + + + + + + diff --git a/docs/insights/git-insights.mdx b/docs/insights/git-insights.mdx new file mode 100644 index 0000000..d9a5132 --- /dev/null +++ b/docs/insights/git-insights.mdx @@ -0,0 +1,68 @@ +--- +title: "Git Insights" +description: "Git Insights enables Bitrise users to quantify and optimize Git collaboration. It provides crucial metrics like pull request cycle time and merge frequency." +sidebar_position: 4 +slug: /insights/git-insights +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ConfiguringWebhooksForGitInsights from '@site/src/partials/configuring-webhooks-for-git-insights.mdx'; + +Git Insights enables you to quantify and optimize Git collaboration. It provides crucial metrics like pull request cycle time and merge frequency. + +:::important[Git provider requirements] + +Git Insights is only available if your repository is hosted on one of three Git providers: + +- GitHub +- GitLab +- Bitbucket. + +::: + + + +## Accessing Git Insights + +To access Git Insights: + +1. Log in to Bitrise. +1. Select a Workspace in the top right corner of the Dashboard. +1. On the menubar on the top, select **Insights**. +1. On the left, select **Git**. + + ![git_-insights.png](/img/_paligo/uuid-33016129-6c3c-5427-c4ac-8dca1c01770d.png) + +## Using Git Insights + +Git Insights can show aggregated metrics for all apps of a Workspace, or metrics for each individual app: + +![apps-filter.png](/img/_paligo/uuid-0b5537ea-42ab-780f-cd11-05072d508a72.png) + +You can also filter for the target branch of the pull requests: once you selected an app, click **Add filter** next to the app dropdown menu. + +Git Insights offers two main metrics for now: cycle time and merge frequency. + +**Cycle time** means the time elapsed between opening a PR and merging it. It is further broken down into two separate metrics: + +- **Development time**: The time between the first commit of a PR and opening the PR. +- **Review time**: The time it takes from opening the PR to the PR being merged into the target branch. + +**Merge frequency** means the number of times a PR has been merged in a given period. + +You can see these metrics on the main chart where you can switch between displaying cycle time and merge frequency: + +![git-main-chart.png](/img/_paligo/uuid-ef391d65-8868-242c-c6b6-380d117676b7.png) + +The **Breakdown** tab allows users to view detailed information for each application or target branch by time period. For example, you can check the total merge frequency for a target branch in any given week over a month: + +![breakdown-tab.png](/img/_paligo/uuid-7bf083ec-108e-2c84-cb3e-b47a85b69a48.png) + +The content depends on your settings and filters: + +- If you look at the aggregated data of all applications, the **Breakdown** tab displays data on a per application basis. +- If you filter the data for a specific application, the **Breakdown** tab displays data on a per target branch basis. + +The **Related PRs** tab shows relevant metrics for each individual PR that is represented in the dataset. By clicking anywhere in the row, you can go to the PR's page. diff --git a/docs/insights/index.mdx b/docs/insights/index.mdx new file mode 100644 index 0000000..b74ea95 --- /dev/null +++ b/docs/insights/index.mdx @@ -0,0 +1,67 @@ +--- +title: "Insights" +hide_table_of_contents: true +hide_title: true +unlisted: true +sidebar_class_name: sidebar-hidden-item +--- + +import ProductHomepage from '@site/src/components/ProductHomepage'; + +
+ +
diff --git a/docs/insights/insights-tutorials/_category_.json b/docs/insights/insights-tutorials/_category_.json new file mode 100644 index 0000000..832f7f9 --- /dev/null +++ b/docs/insights/insights-tutorials/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorials", + "position": 5, + "link": null +} diff --git a/docs/insights/insights-tutorials/credit-usage.mdx b/docs/insights/insights-tutorials/credit-usage.mdx new file mode 100644 index 0000000..3e2595c --- /dev/null +++ b/docs/insights/insights-tutorials/credit-usage.mdx @@ -0,0 +1,23 @@ +--- +title: "Credit usage" +sidebar_position: 5 +slug: /insights/insights-tutorials/credit-usage +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CreditUsageByAppWorkflowOrStep from '@site/src/partials/credit-usage-by-app-workflow-or-step.mdx'; +import Partial_TrackingOverallCreditUsage from '@site/src/partials/tracking-overall-credit-usage.mdx'; + +:::important[Credit-based plans only] + +This article is only relevant if you are on a [credit based (pay-by-minute) subscription plan](http://www.bitrise.io/pricing). Users who aren’t on a credit based plan don’t see the Credits page on Insights. + +::: + +Keeping an eye on your credit usage can help to avoid surprises caused by changes which result in increased credit usage. Using Bitrise Insights you can see your credit usage trends and if you notice any negative trend you can use Insights to track down what is causing that. + + + + diff --git a/docs/insights/insights-tutorials/index.md b/docs/insights/insights-tutorials/index.md new file mode 100644 index 0000000..cf5ee71 --- /dev/null +++ b/docs/insights/insights-tutorials/index.md @@ -0,0 +1,8 @@ +--- +title: "Insights tutorials" +sidebar_position: 5 +slug: /insights/insights-tutorials +sidebar_label: Tutorials +--- + +Tutorials diff --git a/docs/insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds.mdx b/docs/insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds.mdx new file mode 100644 index 0000000..8c9c7fa --- /dev/null +++ b/docs/insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds.mdx @@ -0,0 +1,27 @@ +--- +title: "Monitoring and optimizing your slowest mobile builds" +sidebar_position: 1 +slug: /insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DiagnosingBottlenecksCausingSlowBuilds from '@site/src/partials/diagnosing-bottlenecks-causing-slow-builds.mdx'; +import Partial_FindingSlowBuilds from '@site/src/partials/finding-slow-builds.mdx'; + +Slow builds result in people having to wait for the build to finish. Even if they switch to do something else while the build is running, there will be a context switch when they have to switch back once the build is done. + +During a pull request review, you might have to do multiple builds, as you do changes and improvements based on the reviewer’s feedback or based on automatic linters. The slower the mobile build, the more you’ll have to wait throughout the pull request process. + +Slow builds are even worse if the build fails afterward. In that case, you’ll have to fix or change something and then do the build again — costing you even more build time. If the build takes a long time, you’ll have to wait a lot for the build to fail, and then fix the issue and start a new build, and wait for that too. This is especially bad if a release or deploy build fails, where you usually have to fix it as soon as possible and try it again. + +Another impact of slow builds is how quickly you can iterate on the mobile build’s configuration. Whenever you make changes you’ll want to test the new configuration by starting a new build. If that build takes a long time your iterations will be slow. This is even more important if you then have to do follow-up changes, either because that test build fails, or because you forget to add something to the configuration — or maybe you’ll just want to clean up a few things. If the build is slow you’ll have to wait a long time between every iteration. The faster you can iterate the more things you can try, the more improvements you can do, and the more chances you’ll have to make mistakes and fix them in a given amount of time. + +The main goal is to reduce the wait time throughout the development process. If you have mobile builds which take a long time to finish that means that sooner or later you’ll have to wait for it, and most likely lose time either 1) because of context switching or, 2) because you can’t do anything useful while you’re waiting for the results of that build. + + + + + +If you have any questions or feedback, please let us know using the Give feedback button in the bottom left corner on any of the Bitrise Insights pages! diff --git a/docs/insights/insights-tutorials/tracking-build-failure-rate.mdx b/docs/insights/insights-tutorials/tracking-build-failure-rate.mdx new file mode 100644 index 0000000..f3f614c --- /dev/null +++ b/docs/insights/insights-tutorials/tracking-build-failure-rate.mdx @@ -0,0 +1,23 @@ +--- +title: "Tracking build failure rate" +sidebar_position: 2 +slug: /insights/insights-tutorials/tracking-build-failure-rate +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_FindingFrequentlyFailingBuilds from '@site/src/partials/finding-frequently-failing-builds.mdx'; +import Partial_DiagnosingBottlenecksCausingBuildsToFail from '@site/src/partials/diagnosing-bottlenecks-causing-builds-to-fail.mdx'; + +For every failed build, you’ll most likely have to 1) spend time to fix the failure, 2) then try the build again, and 3) then wait for the retried build to finish. Even if you can switch to do something else while the build is running there will be a context switch when you have to switch back once the build is done. + +If your build failure rate is high on a specific app’s or Workflow’s builds, that means people frequently spend time on debugging, fixing and then retrying builds. + +Failure rate is especially crucial for long builds, as the engineers will have to wait even more when they do a fix and then run a new build. Tracking and reducing the frequency of failed builds can help minimizing the time and effort spent on resolving build failures and increase the overall efficiency and productivity of your team. + +The main goal is to reduce the wait time throughout the development process. If you have builds which fail frequently that means that sooner rather than later you’ll have a failing build, where you’ll have to check why it failed, fix the issue, and then try it again and wait for the build to hopefully pass. As part of this you’ll likely lose time either because of context switching or because you can’t do anything useful while you’re waiting for the results of that build. + + + + diff --git a/docs/insights/insights-tutorials/tracking-flaky-tests.mdx b/docs/insights/insights-tutorials/tracking-flaky-tests.mdx new file mode 100644 index 0000000..ab72639 --- /dev/null +++ b/docs/insights/insights-tutorials/tracking-flaky-tests.mdx @@ -0,0 +1,17 @@ +--- +title: "Tracking flaky tests" +sidebar_position: 4 +slug: /insights/insights-tutorials/tracking-flaky-tests +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_FindingFlakyTests from '@site/src/partials/finding-flaky-tests.mdx'; +import Partial_TheImportanceOfTrackingFlakyTests from '@site/src/partials/the-importance-of-tracking-flaky-tests.mdx'; + +Flaky tests are a persistent issue that can make a mobile developer's life frustrating and challenging. Failing tests that produce different results even when the code hasn’t changed can cause confusion and setbacks, leading to time-consuming and frustrating debugging sessions. Eliminating flaky tests is essential for ensuring a stable and reliable testing process. This article explores the importance of tracking flaky tests with Bitrise Insights, and how to diagnose the causes behind them. Additionally, it also discusses how Bitrise Insights can detect flaky tests, and how developers can use the tool to track, identify, and diagnose the flakiness of their tests. + + + + diff --git a/docs/insights/insights-tutorials/tracking-test-failure-rate.mdx b/docs/insights/insights-tutorials/tracking-test-failure-rate.mdx new file mode 100644 index 0000000..9aa8ebb --- /dev/null +++ b/docs/insights/insights-tutorials/tracking-test-failure-rate.mdx @@ -0,0 +1,17 @@ +--- +title: "Tracking test failure rate" +sidebar_position: 3 +slug: /insights/insights-tutorials/tracking-test-failure-rate +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TheImportanceOfTestFailureRate from '@site/src/partials/the-importance-of-test-failure-rate.mdx'; +import Partial_FindingFrequentlyFailingTests from '@site/src/partials/finding-frequently-failing-tests.mdx'; + +When your mobile app’s tests fail in a continuous integration (CI) environment, it typically indicates that the build has also failed. This means that someone will need to make code changes or fixes and then retry the build and test it again, leading to a cycle of iterations. Even if someone switches to other tasks while the test and build are running, there will be a context switch when they have to return to the task once the test and build are done. + + + + diff --git a/docs/release-management/_category_.json b/docs/release-management/_category_.json new file mode 100644 index 0000000..703a116 --- /dev/null +++ b/docs/release-management/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Release Management", + "position": 1, + "link": { + "type": "doc", + "id": "release-management/index" + } +} diff --git a/docs/release-management/build-distribution/_category_.json b/docs/release-management/build-distribution/_category_.json new file mode 100644 index 0000000..58dffcf --- /dev/null +++ b/docs/release-management/build-distribution/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Build distribution for testing", + "position": 4, + "link": null +} diff --git a/docs/release-management/build-distribution/distributing-builds-to-testers.mdx b/docs/release-management/build-distribution/distributing-builds-to-testers.mdx new file mode 100644 index 0000000..ff0a02b --- /dev/null +++ b/docs/release-management/build-distribution/distributing-builds-to-testers.mdx @@ -0,0 +1,74 @@ +--- +title: "Distributing builds to testers" +sidebar_position: 1 +slug: /release-management/build-distribution/distributing-builds-to-testers +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AddingInstructionsForTesters from '@site/src/partials/adding-instructions-for-testers.mdx'; + +Release Management offers a convenient, secure solution to distribute the builds of your mobile apps to testers without having to engage with either TestFlight or Google Play. Once you have installable artifacts, Bitrise can generate both private and public install links that testers or other stakeholders can use to install the app on real devices via over-the-air installation. + +You can access all your distributable builds on the **Build distribution** page: these are the builds you can distribute to internal testers. Distributable builds are the following: + +- For iOS apps, they are IPAs with Development, Ad-hoc, or Enterprise provisioning. +- For Android apps, only APKs are distributable to testers. AABs are not. + +Each distributable build has its own page that includes installation instructions and metadata. The metadata includes, among other things, the source of the artifact, its creation time, size, and supported device types. + +You can set up tester groups so that testers can get access to the build details page and install the app from there. Workspace owners, Workspace managers and project admins can also send notification emails to tester groups from the build page. For details, see [Tester groups](/en/release-management/build-distribution/tester-groups). + +You can upload installable artifacts to the page from Bitrise CI builds or via our dedicated API. For details, see [Installable artifacts](/en/release-management/installable-artifacts). + +## Accessing the build details page + +To access the build details page on Bitrise: + +:::note[Login required] + +You need a Bitrise user account to access the build details page. The account must be a member of the project's team. + +::: + +1. Open your connected app in Release Management. +1. Select **Build distribution** on the left. +1. Select the **Builds** tab. +1. Find the build you need and click the arrow on the right. + + ![build-details-access.png](/img/_paligo/uuid-55dc2023-f61b-5331-f1af-94924727ff25.png) + +## Installing artifacts + +You can install build artifacts from its build details page. To do so: + +1. [Access the build details page](#N1733414517840) of the build. + + You can also access the build details page from a notification email. +1. Click **Download artifact** on the top right. + + ![build-details-page.png](/img/_paligo/uuid-60a84ba2-ab5d-e077-877b-a2be85014efc.png) + + - If your app is an Android app, the download will start immediately. + - If your app is an iOS app, you'll see a dialog that provides instructions for installing the app on a device. + + ![ios-download-rm.png](/img/_paligo/uuid-58a8bc7f-8220-32ed-3cc3-193aa78e8cf4.png) + +## Enabling the public install page + +The public install page allows you to distribute your installable artifacts to testers who don't have Bitrise accounts. + +1. Access the build details page of the build. +1. In the **Install this version** section, toggle the **Public install page** option on. + + :::important[Required access] + + Only Workspace owners, Workspace managers, and project admins have the right to enable or disable the public install page for a build. + + ::: + + ![build-details-page.png](/img/_paligo/uuid-60a84ba2-ab5d-e077-877b-a2be85014efc.png) +1. Click **Get link** to open a dialog that contains both a URL and a QR code. + + diff --git a/docs/release-management/build-distribution/index.md b/docs/release-management/build-distribution/index.md new file mode 100644 index 0000000..b2265bf --- /dev/null +++ b/docs/release-management/build-distribution/index.md @@ -0,0 +1,8 @@ +--- +title: "Build distribution" +sidebar_position: 4 +slug: /release-management/build-distribution +sidebar_label: Build distribution for testing +--- + +Build distribution for testing diff --git a/docs/release-management/build-distribution/tester-groups.mdx b/docs/release-management/build-distribution/tester-groups.mdx new file mode 100644 index 0000000..d46e2d5 --- /dev/null +++ b/docs/release-management/build-distribution/tester-groups.mdx @@ -0,0 +1,125 @@ +--- +title: "Tester groups" +sidebar_position: 2 +slug: /release-management/build-distribution/tester-groups +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Create tester groups in Release Management to to be able to distribute installable artifacts to testers automatically. When a new installable artifact is available, the tester groups can be: + +- Automatically notified via email. +- Manually notified via email. + +The notification email contains a link to the build page in Release Management. + +A connected app can have multiple tester groups. You can select testers from the project team members of the connected app. + +:::important[Required access level] + +Users with the following roles can manage tester groups: + +- Workspace owner +- Workspace manager +- Project admin + +::: + +## Creating tester groups + +To create a new tester group: + +1. Open your connected app in Release Management. +1. Select **Build distribution** and then the **Tester groups** tab. + + ![tester-group.png](/img/_paligo/uuid-5d668c02-0f6c-cbcb-3206-b2e5a711979f.png) +1. Click **+ New group**. +1. Enter a group name. + + The name must be unique: no other tester group can have the same name. You can change the name later. +1. Optionally, check the **Send notifications automatically** box. + + With this setting, every group member receives a notification when a new installable artifact is available. You can change this later. + +## Adding members to tester groups + +A newly created tester group is empty. You can add [members of the Bitrise project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) the app belongs to. + +To add members to a tester group: + +1. Open your connected app in Release Management. +1. Select **Build distribution** and then the **Tester groups** tab. +1. Find the group and click the vertical ellipsis (⋮) on the right. + + ![manage-tester-group.png](/img/_paligo/uuid-fd63cf77-e2f7-bfce-3000-4a80b87f158f.png) +1. Select **Manage testers**. +1. In the group page, click **Add testers**. +1. Select all the testers you need and click **Add**. + +## Removing members from tester groups + +You can remove members from testing groups in two ways: + +- Removing them from a specific testing group. +- Removing them from all testing groups at the same time. + + + + +1. Open your connected app in Release Management. +1. Select **Build distribution** and then the **Tester groups** tab. +1. Find the group and click the vertical ellipsis (⋮) on the right. + + ![manage-tester-group.png](/img/_paligo/uuid-fd63cf77-e2f7-bfce-3000-4a80b87f158f.png) +1. Select **Manage testers**. +1. In the **Testers in this group** list, find the tester you want to remove and click the remove button. + + + + +1. Open your connected app in Release Management. +1. Select **Build distribution** and then the **Testers** tab. +1. In the **All testers** list, find the tester you want to remove and click the remove button. + + + + +## Configuring notification settings for tester groups + +Tester groups can be notified automatically via email: whenever a new installable artifact is available for the app, each member of a tester group gets an email notification. + +The notification email contains a link to the build page in Release Management, from where you can install the app on a mobile device. + +:::note[New members] + +You can only send a notification once. If you add new members to the group after a notification email has been sent, those new members won't get a notification email. + +::: + +To configure automatic notifications: + +1. Open your connected app in Release Management. +1. Select **Build distribution** and then the **Tester groups** tab. +1. Find the group and click the vertical ellipsis (⋮) on the right. +1. Select **Configure notifications**. +1. Toggle on **Automatic notifications**. + +## Sending notifications to tester groups manually + +You can notify a tester group manually about a new installable build artifact. + +:::note[New members] + +You can only send a notification once. If you add new members to the group after a notification email has been sent, those new members won't get a notification email. + +::: + +1. Open your connected app in Release Management. +1. Select **Build distribution** and then the **Builds** tab. +1. Find the build you need from the list and click the arrow on the right. +1. On the build page, select the **Testing** tab. + + ![tester-settings-page.png](/img/_paligo/uuid-c8b3be87-8669-d4d7-d100-ad03c3055645.png) +1. Find the tester group and click **Send**. diff --git a/docs/release-management/codepush/_category_.json b/docs/release-management/codepush/_category_.json new file mode 100644 index 0000000..9fc7324 --- /dev/null +++ b/docs/release-management/codepush/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Bitrise CodePush", + "position": 6, + "link": null +} diff --git a/docs/release-management/codepush/about-codepush.mdx b/docs/release-management/codepush/about-codepush.mdx new file mode 100644 index 0000000..7a45b6d --- /dev/null +++ b/docs/release-management/codepush/about-codepush.mdx @@ -0,0 +1,22 @@ +--- +title: "About CodePush" +description: "Bitrise offers a hosted CodePush Server, integrated with Bitrise authentication. You can use it with your React Native and Expo apps in Release Management." +sidebar_position: 1 +slug: /release-management/codepush/about-codepush +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_CodePushPlansAndTiers from '@site/src/partials/codepush-plans-and-tiers.mdx'; + +Bitrise offers a hosted CodePush Server, integrated with Bitrise authentication. You can use it with your React Native and Expo apps in Release Management. + +CodePush enables React Native developers to deploy mobile app updates directly to their users' devices. The service consists of two parts: + +- CodePush Server, where developers can publish app updates. Accessing the Bitrise CodePush Server requires setting up a CodePush deployment: [Creating a CodePush deployment](/en/release-management/codepush/creating-a-codepush-deployment). +- The open source [React Native Module for CodePush](https://github.com/CodePushNext/react-native-code-push) that enables querying for updates from within an app. The SDK supports React Native New Architecture and Expo: [Configuring your app for CodePush](/en/release-management/codepush/configuring-your-app-for-codepush). + +Bitrise CodePush Server is based on the Microsoft CodePush Server and it is part of Release Management. You need a Release Management [app](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management) to be able to push update packages to the Bitrise CodePush Server via your CodePush deployment. + + diff --git a/docs/release-management/codepush/codepush-updates-with-bitrise-ci.mdx b/docs/release-management/codepush/codepush-updates-with-bitrise-ci.mdx new file mode 100644 index 0000000..4b45a09 --- /dev/null +++ b/docs/release-management/codepush/codepush-updates-with-bitrise-ci.mdx @@ -0,0 +1,24 @@ +--- +title: "CodePush updates with Bitrise CI" +description: "You can release your CodePush updates via a [Bitrise CI](urn:resource:publication:94442) Workflow that creates the update packages for both iOS and Android, and updates both to the Bitrise CodePush Server." +sidebar_position: 5 +slug: /release-management/codepush/codepush-updates-with-bitrise-ci +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_AutomatingTheCodePushUpdateRelease from '@site/src/partials/automating-the-codepush-update-release.mdx'; +import Partial_ConfiguringCodePushCredentialsOnBitrise from '@site/src/partials/configuring-codepush-credentials-on-bitrise.mdx'; +import Partial_CreatingAWorkflowForCodePushUpdates from '@site/src/partials/creating-a-workflow-for-codepush-updates.mdx'; + +You can release your CodePush updates via a [Bitrise CI](urn:resource:publication:94442) Workflow. The process requires: + +- Setting up CodePush credentials: create Secrets and [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) that hold the deployment ID and the deployment key from Bitrise CodePush. +- Creating a Workflow that creates the update packages for both iOS and Android, and updates both to the Bitrise CodePush Server. + + + + + + diff --git a/docs/release-management/codepush/configuring-your-app-for-codepush.mdx b/docs/release-management/codepush/configuring-your-app-for-codepush.mdx new file mode 100644 index 0000000..8378924 --- /dev/null +++ b/docs/release-management/codepush/configuring-your-app-for-codepush.mdx @@ -0,0 +1,20 @@ +--- +title: "Configuring your app for CodePush" +description: "Install the CodePush SDK and add the deployment keys and the CodePush Server URL to the app configuration. The process is different for React Native and Expo apps." +sidebar_position: 3 +slug: /release-management/codepush/configuring-your-app-for-codepush +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ConfiguringCodePushForExpoApps from '@site/src/partials/configuring-codepush-for-expo-apps.mdx'; +import Partial_ConfiguringCodePushForReactNativeApps from '@site/src/partials/configuring-codepush-for-react-native-apps.mdx'; + +Install the CodePush SDK and add the deployment keys and the CodePush Server URL to the app configuration. The process is different for React Native and Expo apps. + +The CodePush SDK is an open-source SDK. Bitrise actively participates in its maintenance to make sure it serves our customers' needs. + + + + diff --git a/docs/release-management/codepush/creating-a-codepush-deployment.mdx b/docs/release-management/codepush/creating-a-codepush-deployment.mdx new file mode 100644 index 0000000..508b2ee --- /dev/null +++ b/docs/release-management/codepush/creating-a-codepush-deployment.mdx @@ -0,0 +1,74 @@ +--- +title: "Creating a CodePush deployment" +description: "Create a CodePush deployment to get your deployment key. You need the deployment key to release CodePush updates to your apps." +sidebar_position: 2 +slug: /release-management/codepush/creating-a-codepush-deployment +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_ReleaseManagementConfiguration from '@site/src/partials/release-management-configuration.mdx'; + +Create a CodePush deployment to get your deployment key. You need the deployment key to release CodePush updates to your apps. + +You can create a deployment either via the [API](/en/release-management/release-management-api.html) or on the Release Management GUI. + +GUI + +API + +1. For each React Native project, make sure you have [two apps](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management) in Release Management: one for iOS, one for Android. +1. +1. Select **Deployments**. +1. Click **New deployment**. +1. Enter a name. + + If you have multiple deployments, each must have a unique name. We recommend including the target of the deployment in the name (for example, Staging Deployment). +1. In the **Deployment key** field, you can paste an existing deployment key. + + If you leave it blank, Bitrise generates a secure deployment key for you. + +1. Make sure you have a [personal access token](/en/bitrise-platform/accounts/personal-access-tokens/creating-a-personal-access-token) or a [workspace API token](/en/bitrise-platform/workspaces/workspace-api-token/creating-a-workspace-api-token). + + A token is required for authorization with the [Release Management API](/en/release-management/release-management-api.html). +1. For each React Native project, make sure you have [two apps](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management) in Release Management: one for iOS, one for Android. +1. Get the app ID for each app. You can see it in the URL of the app page: https://app.bitrise.io/release-management/workspaces//connected-apps/. + + :::tip[ID from the API] + + You can [use the API to add apps](https://api.bitrise.io/release-management/api-docs/index.html#/Connected%20Apps/CreateConnectedApp). The response of the `/connected-apps` endpoint contains an `id` field: this is the app ID you need. + + ::: +1. Create a CodePush deployment for each app by calling the `/connected-apps/{connected_app_id}/code-push/deployments` endpoint. The request requires: + + - The connected app ID. + - A token for authorization. + - A name you will use for the deployment. + + In this example, we're using the name `prod`: + + ``` + curl -X 'POST' \ + 'https://api.bitrise.io/release-management/v1/connected-apps//code-push/deployments' \ + -H 'accept: application/json' \ + -H 'authorization: ' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "prod" + }' + ``` + + :::tip[Existing deploymentKey] + + If you already have a `deploymentKey` (for example, if you are migrating your setup from Microsoft App Center), you can use the `key` parameter in the API request: + + ``` + { + "name": "prod", + "key": "" + } + ``` + + ::: +1. Copy the base64-encoded `key` returned in the response. This is the CodePush deployment key: you need this to [configure your app for CodePush](/en/release-management/codepush/configuring-your-app-for-codepush.html). diff --git a/docs/release-management/codepush/creating-and-releasing-codepush-updates.mdx b/docs/release-management/codepush/creating-and-releasing-codepush-updates.mdx new file mode 100644 index 0000000..eb46def --- /dev/null +++ b/docs/release-management/codepush/creating-and-releasing-codepush-updates.mdx @@ -0,0 +1,170 @@ +--- +title: "Creating and releasing CodePush updates" +description: "Create an update bundle and upload it to the Bitrise CodePush Server to push updates to your users' devices." +sidebar_position: 4 +slug: /release-management/codepush/creating-and-releasing-codepush-updates +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_TargetVersions from '@site/src/partials/target-versions.mdx'; +import Partial_GettingYourCodePushCredentials from '@site/src/partials/getting-your-codepush-credentials.mdx'; + +Create an update bundle and upload it to the Bitrise CodePush Server to push updates to your users' devices. + +:::important + +This guide describes the general process of releasing your CodePush updates. We recommend using Bitrise CI to automate the process: [CodePush updates with Bitrise CI](/en/release-management/codepush/codepush-updates-with-bitrise-ci). + +::: + + + +## Creating an update bundle + + + + +1. Make the updates to your code. +1. Create an update bundle for both iOS and Android: + + - iOS: + + ```bash + npx react-native bundle \ + --platform ios \ + --dev false \ + --entry-file index.js \ + --bundle-output ./build/main.jsbundle \ + --assets-dest ./build + ``` + - Android: + + ```bash + npx react-native bundle \ + --platform android \ + --dev false \ + --entry-file index.js \ + --bundle-output ./build/index.android.bundle \ + --assets-dest ./build + ``` +1. Zip the build folder: + + ``` + zip -r update.zip ./build + ``` + + + + +1. Make the updates to your code. +1. Create an update bundle for both iOS and Android: + + - iOS: + + ```bash + npx expo export:embed \ + --entry-file index.js \ + --platform ios \ + --dev false \ + --reset-cache \ + --bundle-output ./build/main.jsbundle \ + --assets-dest ./build \ + --minify false + ``` + - Android: + + ```bash + npx expo export:embed \ + --entry-file index.js \ + --platform android \ + --dev false \ + --reset-cache \ + --bundle-output ./build/index.android.bundle \ + --assets-dest ./build \ + --minify false + ``` +1. Zip the build folder: + + ``` + zip -r update.zip ./build + ``` + + + + +## Uploading the package to the Bitrise CodePush Server + +You can upload the package either via the Release Management GUI or the Release Management API. + + + + +1. Open your app in Release Management. +1. Select **CodePush** on the left. +1. Select your deployment. + + ![20251217-rm-deployments.png](/img/_paligo/uuid-87908768-bac5-5e86-6412-826381a0b8a4.png) +1. Click **New update**. +1. In the **Target versions** field, add the version range of the update. + + You can use range expressions: [see topic](#UUID-6710284d-898a-775e-ed09-9b665bae52a7). +1. Optionally, add an update description. +1. Check **Enabled** to make sure users can download the update. + + ![20251217-new-codepush-update-dialog.png](/img/_paligo/uuid-8e971849-b560-9393-f308-ed2587195b2c.png) +1. Optionally, check **Mandatory** to prompt users to update immediately. +1. Drag and drop the update file to the drag-and-drop area or click the area and select a file. + + :::important[File requirements] + + - Upload a `.bundle`, `.jsbundle`, or `.zip` file. + - The maximum file size is 50 MB. + + ::: +1. Set the percentage of users that will receive the update in the **Rollout percentage** field. + + You can increase the percentage value later. The default value is 100%. +1. Click **Release update**. + + + + +1. Make sure your CodePush credentials are available: [see topic](#UUID-79825ccf-c3be-5aba-c3d9-927109b02147). +1. Clone the `release-management-recipes` repository from Bitrise. + + The repository contains a helper script that we will use to upload the update package. + + ``` + git clone https://github.com/bitrise-io/release-management-recipes + ``` +1. Go in to the `release-management-recipes` folder: + + ``` + cd release-management-recipes + ``` +1. Run the script to upload. + + The script requires the following input data: + + - The path of the `update.zip` file. + - Your Bitrise API token: this can be either a [personal access token](/en/bitrise-platform/accounts/personal-access-tokens/creating-a-personal-access-token) or a [workspace API token](/en/bitrise-platform/workspaces/workspace-api-token.html). + - The app ID of your Release Management app. + - A deployment ID. + - The version of your app. For more information, see [Target versions](/en/release-management/codepush/creating-and-releasing-codepush-updates/target-versions). + + The final command should look something like this: + + ``` + PACKAGE_PATH=../update.zip \ + AUTHORIZATION_TOKEN= \ + CONNECTED_APP_ID= \ + DEPLOYMENT_ID= \ + APP_VERSION= /bin/bash ./api/upload_code_push_package.sh + ``` + + + + + diff --git a/docs/release-management/codepush/index.md b/docs/release-management/codepush/index.md new file mode 100644 index 0000000..b706df1 --- /dev/null +++ b/docs/release-management/codepush/index.md @@ -0,0 +1,8 @@ +--- +title: "CodePush" +sidebar_position: 6 +slug: /release-management/codepush +sidebar_label: Bitrise CodePush +--- + +Bitrise CodePush diff --git a/docs/release-management/configuring-connected-apps/_category_.json b/docs/release-management/configuring-connected-apps/_category_.json new file mode 100644 index 0000000..6321c09 --- /dev/null +++ b/docs/release-management/configuring-connected-apps/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Apps", + "position": 2, + "link": null +} diff --git a/docs/release-management/configuring-connected-apps/about-connected-apps.md b/docs/release-management/configuring-connected-apps/about-connected-apps.md new file mode 100644 index 0000000..dd8e535 --- /dev/null +++ b/docs/release-management/configuring-connected-apps/about-connected-apps.md @@ -0,0 +1,22 @@ +--- +title: "About connected apps" +description: "You can [connect an app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) from Apple's App Store or Google Play to a Bitrise app that has already been authenticated to access and manage data through the APIs of these services. Such an app is called a connected app. You need to have at least one connected app to use Release Management." +sidebar_position: 1 +slug: /release-management/configuring-connected-apps/about-connected-apps +sidebar_label: About apps +--- + +Apps are the basic building blocks in Release Management. To do anything, either distributing your installable artifacts to testers, or releasing them to app stores, you need a Release Management app. + +You can set up an app without setting up access to online services. But to take full advantage of everything Release Management offers, set up connections. + +You can [connect an app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) from Apple's App Store or Google Play to a Bitrise project that has already been authenticated to access and manage data through the APIs of these services. Such an app is called a connected app. You need to have at least one connected app to use Release Management. + +Once an app is connected, you can: + +- [Create default release configurations for it called release presets](/en/release-management/releases/release-presets.html). +- [View and modify its API access to online stores](/en/release-management/configuring-connected-apps/configuring-connected-app-integration). +- [Set up team member permissions](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). +- [Connect your LaunchDarkly account and select a project and environment to use its feature flags](/en/release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags.html). + +Configurations of a connected app apply to all [releases added](/en/release-management/releases/adding-a-new-release.html) to that particular app. diff --git a/docs/release-management/configuring-connected-apps/changing-connected-app-appearance.mdx b/docs/release-management/configuring-connected-apps/changing-connected-app-appearance.mdx new file mode 100644 index 0000000..13710fe --- /dev/null +++ b/docs/release-management/configuring-connected-apps/changing-connected-app-appearance.mdx @@ -0,0 +1,37 @@ +--- +title: "Changing connected app appearance" +description: "All apps in Release Management have a title and app icon. You can edit the title and use your own custom icon." +sidebar_position: 4 +slug: /release-management/configuring-connected-apps/changing-connected-app-appearance +sidebar_label: Changing the app title and the app icon +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningAnAppInReleaseManagement from '@site/src/partials/opening-an-app-in-release-management.mdx'; + +All apps in Release Management have a title and app icon. You can edit the title and use your own custom icon. + +:::important[App icon requirements] + +The supported formats for the app icon are JPEG and PNG. It must have a non-transparent background. The maximum file size is 1 MB. + +::: + +1. +1. On the left, select **App settings**. Note that only **Project Admins** and **Workspace Owners** can access the **App settings** menu for an application. +1. In the **Appearance** section, you can: + + - Click **Edit title** to change the title. Set the new title in the dialog and then click **Save**. + + ![2025-08-08-rm-add-new-app-title.png](/img/_paligo/uuid-a8e8da8b-6759-e159-5aa4-6a97f83896dc.png) + - Click **Change icon** to change the app icon. In the dialog, drag-and-drop a new icon. It must be a JPEG or a PNG with a non-transparent background, no bigger than 1 MB. + + ![2025-08-08-rm-change-app-icon.png](/img/_paligo/uuid-80fbbf58-d67b-34af-96aa-4b5124ef844e.png) + +:::note[App icons and our API] + +If you prefer, you can also change the app icon using our [API](https://api.bitrise.io/release-management/api-docs/index.html#/Connected%20Apps%20-%20Public%20Assets/GeneratePublicAssetUploadUrl). + +::: diff --git a/docs/release-management/configuring-connected-apps/configuring-connected-app-integration.mdx b/docs/release-management/configuring-connected-apps/configuring-connected-app-integration.mdx new file mode 100644 index 0000000..56337ff --- /dev/null +++ b/docs/release-management/configuring-connected-apps/configuring-connected-app-integration.mdx @@ -0,0 +1,98 @@ +--- +title: "Configuring connected app integration" +description: "A connected app in Release Management uses a Google Play Console service account to connect to Google Play and an App Store Connect account to connect to the App Store." +sidebar_position: 3 +slug: /release-management/configuring-connected-apps/configuring-connected-app-integration +sidebar_label: Modifying a connected app's store connection +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +A connected app in Release Management uses a [Google Play Console service account](/en/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise) to connect to Google Play and an [App Store Connect account](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html) to connect to the App Store. When [connecting an app for the first time](/en/release-management/getting-started-with-release-management/connecting-an-app.html), you have to set up the store connections. You can modify these settings at any time. + +You can add multiple service accounts or API keys to your workspace. Each project and each connected app in Release Management can use different service accounts or API keys. + +An app in Release Management can either use: + +- The store connection of its project. +- A store connection specific to the app. + +If, for example, you have multiple App Store Connect API keys set up in your Workspace, you can set one as your project's API key but use a different one for the connected app in Release Management. + +## Using a project-level store connection + +:::important[Changing the connection] + +If you use a project-level store connection, changing the project's service account or API key will change the connected app's connection, too. This can break your releases! + +::: + + + + +1. [Set up an API key for your project](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html). +1. On the Release Management home page, select your app in the **Connected apps** list. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. On the left, select **Integrations**. +1. On the **Store** tab, find the **API key** card and click **Replace**. + + ![app-store-api-rm.png](/img/_paligo/uuid-e39aa886-e484-fe54-2563-8d5295796112.png) +1. In the dialog, select **Use project's API key**. +1. Click **Save changes**. + + + + +1. [Set up a service account for your project](/en/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise). +1. On the Release Management home page, select your app in the **Connected apps** list. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. On the left, select **Integrations**. +1. On the **Store** tab, find the **Service account** card and click **Replace**. + + ![service-account-rm.png](/img/_paligo/uuid-14a7856e-16ca-8a64-04fa-acf92ba93cc2.png) +1. In the dialog, select **Use project's service account**. +1. Click **Save changes**. + + + + +## Using an app-level store connection + +An app-level store connection means you set the service account or API key specifically for a given connected app. The app-level connection can be different from the project's configured connection. + + + + +1. [Set up an API key for your project](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html). +1. On the Release Management home page, select your app in the **Connected apps** list. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. On the left, select **Integrations**. +1. On the **Store** tab, find the **API key** card and click **Replace**. + + ![app-store-api-rm.png](/img/_paligo/uuid-e39aa886-e484-fe54-2563-8d5295796112.png) +1. In the dialog, select **Set app-level API key**. +1. Select an API key from the **API key** dropdown menu. +1. Click **Save changes**. + + + + +1. [Set up a service account for your project](/en/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise). +1. On the Release Management home page, select your app in the **Connected apps** list. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. On the left, select **Integrations**. +1. On the **Store** tab, find the **Service account** card and click **Set service account**. +1. In the dialog, select **Set app-level service account**. + + ![service-account-rm.png](/img/_paligo/uuid-14a7856e-16ca-8a64-04fa-acf92ba93cc2.png) +1. Select the service account from the **Service account** dropdown menu. +1. Click **Save changes**. + + + diff --git a/docs/release-management/configuring-connected-apps/deleting-a-connected-app.md b/docs/release-management/configuring-connected-apps/deleting-a-connected-app.md new file mode 100644 index 0000000..71c9e8e --- /dev/null +++ b/docs/release-management/configuring-connected-apps/deleting-a-connected-app.md @@ -0,0 +1,19 @@ +--- +title: "Deleting a connected app" +sidebar_position: 6 +slug: /release-management/configuring-connected-apps/deleting-a-connected-app +--- + +When you delete a connected app from Release Management, all data related to this app will be removed from Bitrise permanently. + +To delete a connected app: + +1. Log in to Bitrise, and from the left sidebar, select **Releases**. +1. From the **Connected apps** list, select your app. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. On the left, select **App settings**. +1. On the bottom of the **Connected app settings** page, click **Delete app**. This opens the **Delete connected app** dialog. + + ![dialog-delete-app.png](/img/_paligo/uuid-c93bbd2a-6d87-97d3-11ee-ca32475064af.png) +1. Follow the instructions in the dialog to delete the app permanently. diff --git a/docs/release-management/configuring-connected-apps/index.md b/docs/release-management/configuring-connected-apps/index.md new file mode 100644 index 0000000..9746db9 --- /dev/null +++ b/docs/release-management/configuring-connected-apps/index.md @@ -0,0 +1,8 @@ +--- +title: "Configuring connected apps" +sidebar_position: 2 +slug: /release-management/configuring-connected-apps +sidebar_label: Apps +--- + +Apps diff --git a/docs/release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags.mdx b/docs/release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags.mdx new file mode 100644 index 0000000..c43b888 --- /dev/null +++ b/docs/release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags.mdx @@ -0,0 +1,51 @@ +--- +title: "Integrating LaunchDarkly feature flags" +description: "A feature flag in [LaunchDarkly](https://docs.launchdarkly.com/home) describes the different variations of a feature and the rules that allow different entities to access them. You can follow your application's feature flags through the integration between LaunchDarkly and Bitrise." +sidebar_position: 5 +slug: /release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToYourProfileSettings from '@site/src/partials/getting-to-your-profile-settings.mdx'; + +A feature flag in [LaunchDarkly](https://docs.launchdarkly.com/home) describes the different variations of a feature and the rules that allow different entities to access them. You can follow your application's feature flags through the integration between LaunchDarkly and Bitrise. To do so, you'll need to: + +1. [Connect your LaunchDarkly account to Bitrise.](#section-idm4666258160460834108325371458) +1. [Select a LaunchDarkly project and environment for the connected app in Release management](#section-idm4654623445446434108394449052). + +## Connecting your LaunchDarkly account to Bitrise + +1. Make sure you are logged in to LaunchDarkly. +1. Open Bitrise. +1. +1. On the left, select **Feature flags**. +1. In the **LaunchDarkly** section, click the **Connect** button. + + ![connect-launchdarkly.png](/img/_paligo/uuid-56915efe-d16d-4ab6-6535-f2b18d6ee6af.png) +1. You will be redirected to LaunchDarkly. Click **Authorize**. + +You now should have access to your LaunchDarkly project data in Release Management. + +## Selecting your LaunchDarkly project and environment + +After you’ve [connected your LaunchDarkly account to Bitrise](#section-idm4666258160460834108325371458), you will have access to your LaunchDarkly projects in Release Management. + +To select a LaunchDarkly project and environment for your connected app: + +1. Log in to Bitrise, and from the left sidebar, select **Releases**. +1. From the **Connected apps** list, select your app. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. On the left sidebar, select **Feature flags**. +1. Click **Change** in the **Project and environment** section. It opens a dialog where you can edit the LaunchDarkly configuration for this connected app. + + ![launchdarkly.png](/img/_paligo/uuid-9d7fd7fc-e125-4f45-d011-f5ddcabe0106.png) +1. In the dialog window, select the LaunchDarkly project you wish to connect from the list and select the LaunchDarkly project environment you wish to use. +1. Select a LaunchDarkly project and environment. + + ![existing-launchdarkly-config.png](/img/_paligo/uuid-7902ae23-26f7-bcf3-ffee-11dd4e08a183.png) +1. Click **Save changes**. + +Once done, you should be able to see the feature flags of the LaunchDarkly project in each release of the app. diff --git a/docs/release-management/configuring-connected-apps/release-management-roles-and-permissions.md b/docs/release-management/configuring-connected-apps/release-management-roles-and-permissions.md new file mode 100644 index 0000000..2753d5d --- /dev/null +++ b/docs/release-management/configuring-connected-apps/release-management-roles-and-permissions.md @@ -0,0 +1,75 @@ +--- +title: "Release Management roles and permissions" +description: "In Bitrise Release Management, users have permissions based on workspace-level roles and project-level roles. Each role has its own set of permissions. Workspace owners and project admins can manage most aspects of a Release Management app." +sidebar_position: 2 +slug: /release-management/configuring-connected-apps/release-management-roles-and-permissions +sidebar_label: Roles and permissions +--- + +To perform actions in Release Management , your account must have the required access. This access is controlled by permissions. A permission is the ability to perform a specific action, such as adding and connecting apps, creating releases, or changing connected app settings. + +## Roles and permissions overview + +You can assign different roles to different team members. In Release Management, there are five different roles on three different levels: + +- **Workspace-level roles**: These roles aren't tied to a specific Release Management app, nor can you change them in Release Management. [They are fully tied to the Workspace](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration) that owns the Bitrise project that the connected app belongs to. There are two Workspace-level roles: + + - **Workspace owner**: Workspace owners have full administrative control over all aspects of an app in Release Management, without any limits or exceptions. + - **Workspace manager**: The main purpose of workspace managers is to manage workspace collaboration. In Release Management, they can add a new app when creating a new project. They, however, can't add a new RM app under an already existing project. + - **Contributor** and **Viewer**: These Workspace-level roles have no default access to Release Management apps. +- **Project Admin**: The only [project-level role](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) in Release Management. Adding a user to a project doesn't automatically give them any permissions in Release Management, with the exception of users with the Admin role. Project Admins have full administrative rights to apps, builds, Release Management, and app deployment with one exception: the Project Admin cannot add a new app with a new project to Release Management. When adding a new app to Release Management, they can only add it under the project of which they are admin. +- **Release Management-level roles**: These are the roles you can configure within Release Management. + + - **Release manager**: The main purpose of Release Managers is to handle releases to online stores. They can't add new apps or access app settings. + - **App tester**: The App tester role is meant for internal testers. They can access an app and its artifacts, and the [build distribution](urn:resource:component:92118) and [tester groups](/en/release-management/build-distribution/tester-groups.html) menu. They have no other access. + +## Roles and permissions for Release Management apps + +| Actions | Workspace owner | Workspace manager | Project admin | Release manager | App tester | +| --- | --- | --- | --- | --- | --- | +| Access all apps of a project | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Access a specific app | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Access app settings and integrations | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Access release presets | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Access artifacts | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Access the list of release managers | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Access feature flags | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Add a new app to RM with a new project | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | | +| Add a new app to RM with an existing project | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Remove an app from RM | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Assign a license to an app | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Create, edit, and delete: - Feature flag configuration - Release preset | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Upload artifacts | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | + +## Roles and permissions for build distribution and releases + +| Action | Workspace owner | Workspace manager | Project admin | Release manager | App tester | +| --- | --- | --- | --- | --- | --- | +| Access the build distribution menu | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Access the tester groups | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Access the list of testers | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Enable the public install page | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Create, modify, and notify tester groups | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Update, approve, and delete assigned tasks | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Create, modify, pause, and delete releases | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Create and edit instructions for testers in the What to test field | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Create and modify store version and localization | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Submit release for review | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | + +## Roles and permissions for Bitrise CodePush + +For more information on Bitrise CodePush click [here](https://docs.bitrise.io/en/release-management/codepush.html#bitrise-codepush). + +| Action | Workspace owner | Workspace manager | Project admin | Release manager | App tester | +| --- | --- | --- | --- | --- | --- | +| Read CodePush deploy | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Read CodePush packages | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Create CodePush deploy | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Delete CodePush deploy | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Update CodePush deploy | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | +| Upload CodePush packages | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Delete CodePush packages | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Update CodePush packages | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Promote CodePush packages | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Rollback CodePush packages | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | +| Request CodePush access | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | | | | diff --git a/docs/release-management/getting-started-with-release-management/_category_.json b/docs/release-management/getting-started-with-release-management/_category_.json new file mode 100644 index 0000000..a85c93e --- /dev/null +++ b/docs/release-management/getting-started-with-release-management/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Getting started", + "position": 1, + "link": null +} diff --git a/docs/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management.md b/docs/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management.md new file mode 100644 index 0000000..d8de30e --- /dev/null +++ b/docs/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management.md @@ -0,0 +1,36 @@ +--- +title: "Adding a new app to Release Management" +description: "To start using Release Management, you need to add at least one app. It doesn't require any store connection or a code repository. You will need to link the app to a [Bitrise project](urn:resource:component:54460)." +sidebar_position: 2 +slug: /release-management/getting-started-with-release-management/adding-a-new-app-to-release-management +sidebar_label: Adding a new app +--- + +To start using Release Management, you need to add at least one app. It doesn't require any store connection or a code repository. You will need to link the app to a [Bitrise project](/en/bitrise-platform/projects/projects-overview.html). If you don't have an existing Bitrise project, we'll automatically create one for you. + +To add an app: + +1. Log in to Bitrise and select **Releases** from the left navigation menu. +1. If it's your first app, you will see the **Get started with Release Management** page. Start with adding your app. + + If it's not your first app, look for the **New app** button above the list of your apps. +1. Set a project for your app. + + - To link your app to an existing Bitrise project, select the **Existing project** option and choose a project from the dropdown menu. + - To automatically create a new project, select the **New project** option. This project will be a Release Management project but you can add a CI configuration to it at any time. + + ![add-new-app-newproj.png](/img/_paligo/uuid-8821de29-e79d-0932-c3dd-f5deea8eba32.png) +1. On the next page, specify: + + - The app's title. + - A mobile OS. + - A package name or bundle ID, depending on the mobile OS. + + These are not validated at this point. We recommend using a package name or bundle ID that already exists in an online store but you can change it later anyway. + + ![adding-app.png](/img/_paligo/uuid-9073242e-afd9-262e-25cf-395ab1881ea6.png) +1. Click **Add app**. + +Once an app is added, you can start uploading installable artifacts and use our build distribution feature: [Distributing builds to testers](/en/release-management/build-distribution/distributing-builds-to-testers). + +To manage releases, you need to connect the app to an app store: [Connecting an app](/en/release-management/getting-started-with-release-management/connecting-an-app). diff --git a/docs/release-management/getting-started-with-release-management/connecting-an-app.md b/docs/release-management/getting-started-with-release-management/connecting-an-app.md new file mode 100644 index 0000000..c2cf2ea --- /dev/null +++ b/docs/release-management/getting-started-with-release-management/connecting-an-app.md @@ -0,0 +1,57 @@ +--- +title: "Connecting an app" +description: "After successfully adding a new app to Release Management, you need to connect it to an existing app in the App Store or Google Play." +sidebar_position: 3 +slug: /release-management/getting-started-with-release-management/connecting-an-app +--- + +After successfully adding a new app to Release Management, connect it to an app in either the App Store or Google Play to be able to create releases for the app. + +- For iOS, this means an app with a valid bundle ID on App Store Connect. +- For Android, this means an app with a valid package name on Google Play. + +iOS + +Android + +1. Make sure your iOS app is registered on the App Store. + + Later in the connecting process, you will have to enter the bundle ID of the app. +1. Make sure you have a Bitrise CI project. + + If you created your project when adding the app to Release Management, you can extend it with a CI configuration: [Adding a CI configuration to a project](/en/bitrise-ci/getting-started/adding-a-ci-configuration-to-a-project). +1. Make sure you have at least one App Store Connect API key added to your workspace: [Connecting to an Apple service with API key](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key). +1. Open your app in Release Management and select **Releases** in the left navigation. +1. Click **Connect app**. + + If you don't have a valid CI configuration, you will see **Add CI configuration** instead of the **Connect app** button. + + ![release-man-connect-app.png](/img/_paligo/uuid-58be0b4a-94fa-0a4b-1bac-91d7f81078a1.png) +1. Set an App Store Connect API key. You have two options in the dialog: + + **Use the project's API key**: This means connecting to the App Store with the API key set on the project level. Changing the API key of the project changes the API key for the Release Management app, too. + + **Set app-level API key**: You can select any of the API keys added to your workspace from the **API key** dropdown menu. With this option, it doesn't matter what API key is configured on the project level. +1. Enter the bundle ID and click **Validate**. + + The bundle ID must be an exact match of the bundle ID of an existing app on the App Store. If the validation is successful, the **Connect** button will be enabled. +1. Click **Connect**. + +1. Make sure your Android app is registered on Google Play. +1. Make sure you have at least one Google service account added to your workspace: [Connecting a Google service account to Bitrise](/en/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise). +1. Make sure you have a Bitrise CI project. +1. Open your app in Release Management and select **Releases** in the left navigation. +1. Click **Connect app**. + + ![release-man-connect-app.png](/img/_paligo/uuid-58be0b4a-94fa-0a4b-1bac-91d7f81078a1.png) +1. Set a service account. You have two options in the dialog: + + **Use the project's service account**: This means connecting to Google Play with the service account set on the project level. Changing the service account of the project changes the service account for the Release Management app, too. + + **Set app-level service account**: You can select any of the service accounts added to your workspace from the **Service account** dropdown menu. With this option, it doesn't matter what API key is configured on the project level. +1. Enter the Google Play app's package name in the field and click **Validate**. + + If the package name is found on Google Play, the **Connect** button will be enabled. + + If the validation doesn't find a match, check if you typed the package name correctly and make sure your Google Play service account is working. +1. Click **Connect**. diff --git a/docs/release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management.md b/docs/release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management.md new file mode 100644 index 0000000..92c3313 --- /dev/null +++ b/docs/release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management.md @@ -0,0 +1,19 @@ +--- +title: "Connecting another CI service to Release Management" +description: "You can use Release Management even if you don't use Bitrise CI. All you need to do to take advantage of all Release Management features is to upload your app's binary as a release candidate." +sidebar_position: 4 +slug: /release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management +--- + +You can use Release Management even if you don't use Bitrise CI. Upload your app's binary as a release candidate to access all Release Management features. + +For now, using Release Management still requires a Bitrise CI project as it's the only way to set up a [connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html). However, you don't have to run Bitrise CI builds: once the project is added, you can use Release Management without Bitrise CI. In the near future, Release Management will become a standalone solution. + +To connect your CI service to Release Management: + +1. Sign up for Bitrise and [add a new Bitrise CI project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project). +1. [Connect an app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) in Release Management. + + This includes setting up your project's connection to App Store Connect and/or Google Play. +1. [Use our API to upload an installable artifact](/en/release-management/installable-artifacts.html). +1. Select this artifact at the [release candidate stage](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html). diff --git a/docs/release-management/getting-started-with-release-management/getting-started-with-release-management.md b/docs/release-management/getting-started-with-release-management/getting-started-with-release-management.md new file mode 100644 index 0000000..b6bf23b --- /dev/null +++ b/docs/release-management/getting-started-with-release-management/getting-started-with-release-management.md @@ -0,0 +1,21 @@ +--- +title: "Getting started with Release Management" +sidebar_position: 1 +slug: /release-management/getting-started-with-release-management/getting-started-with-release-management +sidebar_label: Getting started +--- + +Bitrise Release Management simplifies distributing your iOS and Android apps to testers or directly to app stores. Release Management works by adding one or more Release Management apps to a Bitrise project. You upload installable artifacts (either IPA or APK/AAB files) to Release Management and then you can distribute the files to testers or release them to an online store. + +You can go to Release Management from the Dashboard or by selecting **Releases** from the left navigation sidebar. Both ways takes you to the **Release Management overview** screen where you will be able to see your apps in the future. + +To start using Release Management: + +1. Learn about the [key concepts of Release Management](/en/release-management/getting-started-with-release-management/release-management-concepts). +1. Make sure you have at least one [Bitrise project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project). +1. [Add one or more new app(s)](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management). +1. Check out [build distribution for testing](/en/release-management/build-distribution/distributing-builds-to-testers.html): you can distribute installable artifacts to testers without involving Google Play or the App Store. +1. [Connect the app(s)](/en/release-management/getting-started-with-release-management/connecting-an-app.html): this requires setting up a connection to App Store Connect or Google Play. +1. Once you have a connected app, [add a new release](/en/release-management/releases/adding-a-new-release.html). +1. [Configure your release](/en/release-management/releases/configuring-a-release.html). +1. [Go through the stages of the release process](/en/release-management/releases/managing-the-release-process.html) to release the app. diff --git a/docs/release-management/getting-started-with-release-management/index.md b/docs/release-management/getting-started-with-release-management/index.md new file mode 100644 index 0000000..6dea3fd --- /dev/null +++ b/docs/release-management/getting-started-with-release-management/index.md @@ -0,0 +1,7 @@ +--- +title: "Getting started with Release Management" +sidebar_position: 1 +sidebar_label: Getting started +--- + +Getting started diff --git a/docs/release-management/getting-started-with-release-management/managing-licenses.md b/docs/release-management/getting-started-with-release-management/managing-licenses.md new file mode 100644 index 0000000..340ede7 --- /dev/null +++ b/docs/release-management/getting-started-with-release-management/managing-licenses.md @@ -0,0 +1,44 @@ +--- +title: "Managing licenses" +description: "Release Management offers additional features beyond the basic functionalities of the free plan. A Standard license must be purchased and assigned to a connected app to enable the features of the Standard plan for that particular connected app." +sidebar_position: 5 +slug: /release-management/getting-started-with-release-management/managing-licenses +--- + +Release Management offers additional features beyond the basic functionalities of the free plan. A Standard license must be purchased and assigned to a connected app to enable the features of the Standard plan for that particular connected app. + +## Licenses and current apps + +You can manage licenses on the Release Management overview page, from the Licences widget above the list of connected apps. For each license, you will see the following numbers: + +- **Current apps**: the number of apps you assigned the license to for the billing period. +- **Apps in plan**: the total number of licenses available in your plan. + +## Assigning licenses to connected apps + +You can start with a Basic license after connecting an app, and upgrade anytime to get access to the additional benefits of the Standard license. A license is non-transferable after it has been assigned to a connected app, it remains bound to that app for the duration of the license term (the billing cycle). + +To assign licenses to connected apps: + +1. Open Release Management. +1. Find the **Licenses** widget above the **Connected apps** list and click **Manage**. +1. Select the license for each connected app. The **Change** column will display if the assigned license of an app will change, and when the change takes effect. +1. On the summary, review the total number of assigned licenses for the current and the next period. +1. Click **Confirm changes**. + +## Exceeding your plan limit + +If the number of assigned licenses exceeds the plan limit, a notification will appear. You can go back to [change assigned licenses](#section-idm4588447990824034242818467543) or change your plan to proceed with the selected configuration. + +To solve the issue: + +1. Click the link in the notification to change your plan. It will open the **Change plan for Release Management** page in a new browser tab. +1. Increase or decrease the number of **Apps in plan** (the licenses you can assign to connected apps). + + If the number of **Current apps** exceeds the new **Apps in plan** limit, you will get a notification, but you can continue to checkout. Make sure to manage licenses before the changes take effect to keep using all features for new releases. + + :::caution + + When **Current apps** exceed the number of **Apps in plan** for Standard licenses, you will not have access to additional benefits of the Standard license for any connected apps in your Workspace. + + ::: diff --git a/docs/release-management/getting-started-with-release-management/release-management-concepts.md b/docs/release-management/getting-started-with-release-management/release-management-concepts.md new file mode 100644 index 0000000..3f6d3d9 --- /dev/null +++ b/docs/release-management/getting-started-with-release-management/release-management-concepts.md @@ -0,0 +1,62 @@ +--- +title: "Release Management concepts" +description: "Release Management offers a high-level overview of your app's release workflow, such as creating release branches or uploading release candidates to TestFlight and Google Play" +sidebar_position: 6 +slug: /release-management/getting-started-with-release-management/release-management-concepts +sidebar_label: Release Management key concepts +--- + +To successfully use Release Management, there are a few concepts you need to be aware of. + +## Connected app + +You [connect your app](https://devcenter.bitrise.io/en/release-management/getting-started-with-release-management/connecting-an-app.html) from the App Store or Google Play to a Bitrise project. This is what we call a connected app. + +You need at least one connected app to be able to add and manage releases in Release Management. To use [build distribution](/en/release-management/build-distribution/distributing-builds-to-testers.html), you don't actually need to connect an app. + +## Releases + +You [manage releases](/en/release-management/releases/adding-a-new-release.html) of a connected app: each release is a new version of an app. An iOS release has a version number, and an Android release has a version name. + +## Release Manager + +A team member in Release Management with the [required permissions](https://devcenter.bitrise.io/en/release-management/configuring-connected-apps/release-management-roles-and-permissions.html) to manage releases. Project admins can [grant the Release Manager role](https://devcenter.bitrise.io/en/release-management/configuring-connected-apps/release-management-roles-and-permissions.html#granting-release-manager-rights) to [team members](https://devcenter.bitrise.io/en/release-management/configuring-connected-apps/release-management-roles-and-permissions.html#team-member-permissions). With this role, Release Managers are the only ones who can do any end-user-facing actions in Release Management: submit an iOS app for review or release an app to an app store. + +## Release presets + +For each connected app, you can define [presets](/en/release-management/releases/release-presets.html), which are configuration values automatically applied in a new blank release. After the presets are applied, you can still edit these values during the release process. + +You can create a [release note preset](/en/release-management/releases/release-presets.html) as well. This means every release will be submitted to the App Store or Google Play with the same release notes. A release note preset can be identical in all localizations or you can manually edit it in the release stage. + +## Release stages + +Once you added a new release to a connected app and configured it, you can go through the different release steps of the release process, called stages. You can only move to the next release stage after completing the current one, but you can return to a previous stage any time. + +iOS + +Android + +1. [Release candidate](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html): In the **Release candidate** stage, specify the release branch and select the Workflow that generates an IPA file. +1. [TestFlight](/en/release-management/releases/managing-the-release-process/testflight-upload-stage/uploading-the-release-candidate-to-testflight): Upload the release candidate to TestFlight, and distribute it for testing. +1. [Approvals](/en/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage): You can create tasks for any stakeholder or team member whose approval is needed to continue with the release to the App Store. +1. [App Store review](/en/release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.html): Submit your update to review in the App Store, and get information on the approval progress. +1. [Release on the App Store](/en/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.html): You can release your app to all users at the same time, or configure a phased release. + +1. [Release candidate](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html): In the **Release candidate** stage, specify the release branch and select the Workflow that generates an AAB file. +1. [Google Play upload and testing](/en/release-management/releases/managing-the-release-process/google-play-upload-stage/uploading-the-release-candidate-to-google-play): Upload the release candidate to Google Play, and distribute it for testing. +1. [Approvals](/en/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage): You can create tasks for any stakeholder or team member whose approval is needed to continue with the release to Google Play. +1. [Release on Google Play](/en/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.html): You can release your app to all users at the same time, or configure a staged rollout. + +## Build distribution + +With Release Management [you can distribute the builds of your mobile apps](/en/release-management/build-distribution/distributing-builds-to-testers.html) to testers without having to engage with either TestFlight or Google Play. + +Once you have installable artifacts, Bitrise can generate both private and public install links that testers and other stakeholders can use to install the app on real devices via over-the-air installation. + +You can [define tester groups](https://devcenter.bitrise.io/en/release-management/build-distribution/tester-groups.html) that can receive notifications about installable artifacts and where those can be accessed. + +## Approval task + +You can [create tasks](/en/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage) for each stakeholder and/or team member whose approval is needed to continue with the release to the App Store Connect or Google Play. + +Optionally, you can assign an approval task to a team member or leave it unassigned. Only the assigned team member can approve the task. You can create and assign as many tasks as necessary. Once the tasks are ticked off, **Approvals** will be ticked off as well on the left navigation bar and you can proceed to App Store Review or releasing your app to Google Play. diff --git a/docs/release-management/index.mdx b/docs/release-management/index.mdx new file mode 100644 index 0000000..83edb3b --- /dev/null +++ b/docs/release-management/index.mdx @@ -0,0 +1,82 @@ +--- +title: "Release Management" +hide_table_of_contents: true +hide_title: true +unlisted: true +sidebar_class_name: sidebar-hidden-item +--- + +import ProductHomepage from '@site/src/components/ProductHomepage'; + +
+ +
diff --git a/docs/release-management/installable-artifacts.mdx b/docs/release-management/installable-artifacts.mdx new file mode 100644 index 0000000..f8a4c4c --- /dev/null +++ b/docs/release-management/installable-artifacts.mdx @@ -0,0 +1,128 @@ +--- +title: "Installable artifacts" +description: "You can upload a binary to Release Management via using our API endpoint, and even automatically select a successfully uploaded app binary as a release candidate. This is particularly useful if you use a different CI service instead of Bitrise." +sidebar_position: 3 +slug: /release-management/installable-artifacts +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_IMPORTANTArtifactRetentionPolicy from '@site/src/partials/important-artifact-retention-policy.mdx'; + + + +There are two ways to upload installable artifacts to Release Management so they can be used as release candidates: + +- Generating them via a Bitrise build of a [connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html). +- Using our API endpoint. This is particularly useful if you use a different CI service instead of Bitrise. +- Use our [premade bash script](https://github.com/bitrise-io/release-management-recipes/blob/main/api/upload_installable_artifact.sh) to use the API endpoint. + +## Using a Bitrise build + +If you use Bitrise CI, getting an installable artifact is only a matter of running a build that generates one: + +1. Make sure you have a [connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) in Release Management. +1. Make sure you have the **Deploy to Bitrise.io** Step in the Bitrise Workflow that generates the installable artifact (IPA, APK or AAB). +1. Run a build. + +All installable artifacts from successful builds will be available on the **Artifacts** page and can be [selected as a release candidate](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html). + +## Using the API + +The API requires two requests to upload an installable artifact: + +1. The first request is to get the upload information. This request must contain: + + - Your API authentication token. [Workspace tokens](/en/bitrise-platform/workspaces/workspace-api-token.html) and [personal access tokens](/en/bitrise-platform/accounts/personal-access-tokens.html) are both accepted. + - The slug of the connected app. This is automatically filled in if you get the request from the Release Management UI. + - The file name and the file size in bytes. +1. The second request is to upload the file to the artifact storage. The request must be built using the response from the previous request's response. It returns: + + - The necessary HTTP headers. + - The HTTP method for the upload. + - The URL to send the request (containing all required information) to. +1. Optionally, you can use a third request to check the status of the upload. + +You can check the relevant endpoints in the [official API documentation](https://api.bitrise.io/release-management/api-docs/index.html#/Installable%20Artifacts%20-%20COMING%20SOON/GenerateInstallableArtifactUploadUrl). + +You can get the API requests from the **Release candidate** stage or the **Artifacts** page. + + + + +1. Make sure you have a [connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) in Release Management. +1. Open your connected app. +1. Select your release and go to the **Release candidate** stage. +1. In the source card, click **Configure**. + + ![configure-source-rm.png](/img/_paligo/uuid-5e506f8a-6c68-cbef-ee53-8e97df232093.png) +1. In the dialog, select **Upload via API**. +1. Get the curl command for the upload URL and then the curl command for the upload file. Replace `[AUTH_TOKEN]`, `[FILE_NAME]`, `[FILE_SIZE]` and `[UPLOAD_URL]` placeholders with the actual values. + + ![upload-url.png](/img/_paligo/uuid-044617c9-e24c-068d-1978-df721db2a9f8.png) + + :::tip[Bash script available] + + You can also find [a link to a bash script](https://github.com/bitrise-io/release-management-recipes/blob/main/api/upload_installable_artifact.sh) that you can use to set up your API calls easily. + + ::: +1. Optionally, check **Automatically select after successful upload** to make sure that your binary is automatically selected as a release candidate once the upload is successful. + + If you do not check this, you can select your release candidate from a list of artifacts. +1. Click **Save changes**. +1. Use the API requests to upload your artifacts. + + + + +1. Make sure you have a [connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) in Release Management. +1. Open your connected app. +1. Select **Build distribution** from the left navigation menu and select the **Builds** tab. +1. Click **Upload via API**. +1. Get the curl command for the upload URL and then the curl command for the upload file. Replace `[AUTH_TOKEN]`, `[FILE_NAME]`, `[FILE_SIZE]` and `[UPLOAD_URL]` placeholders with the actual values. + + :::tip[Bash script available] + + You can also find [a link to a bash script](https://github.com/bitrise-io/release-management-recipes/blob/main/api/upload_installable_artifact.sh) that you can use to set up your API calls easily. + + ::: +1. Click **OK, got it** when you are ready. +1. Use the API requests to upload your artifacts. + + + + +1. Make sure you have a [connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) in Release Management. +1. Open your connected app. +1. Select **Artifacts** from the left navigation menu and go to the **Upload via API** tab. +1. Click **Configure**. + + ![installable-artifacts-api.png](/img/_paligo/uuid-33deefaf-a687-276f-ff84-cb0b6e45e885.png) +1. Get the curl command for the upload URL and then the curl command for the upload file. Replace `[AUTH_TOKEN]`, `[FILE_NAME]`, `[FILE_SIZE]` and `[UPLOAD_URL]` placeholders with the actual values. + + :::tip[Bash script available] + + You can also find [a link to a bash script](https://github.com/bitrise-io/release-management-recipes/blob/main/api/upload_installable_artifact.sh) that you can use to set up your API calls easily. + + ::: +1. Click **OK, got it** when you are ready. +1. Use the API requests to upload your artifacts. + + + + +## Using the bash script + +To make using the API more convenient, we've created a bash script that simplifies the upload process. It supports Linux distributions (alpine, arch, centos, debian, fedora, rhel, ubuntu) and macOS. The script checks your system and then attempts to upload installable artifacts to Release Management. + +To use the script: + +1. Get the [script from GitHub](https://gist.github.com/miklosboros/4855a59213724f6eb5960579e15d285b). +1. Make sure you have `sudo` privileges on your system OR `jq` and `openssl` packages installed. +1. Set up the following Environment Variables in your system: + + - ARTIFACT_PATH: Local path of the artifact to be uploaded. + - AUTHORIZATION_TOKEN: The access token for the Bitrise Release Management API. You can use a Bitrise [personal access token](/en/bitrise-platform/accounts/personal-access-tokens.html) or a [Workspace token](/en/bitrise-platform/workspaces/workspace-api-token.html). + - CONNECTED_APP_ID: The app ID of the [connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) the artifact will be uploaded to. You can get the ID from the URL of the app's page on bitrise.io: https://app.bitrise.io/release-management/workspaces/WORKSPACE_ID/connected-apps/CONNECTED_APP_ID. +1. Run the script. diff --git a/docs/release-management/release-management-api.mdx b/docs/release-management/release-management-api.mdx new file mode 100644 index 0000000..718bc56 --- /dev/null +++ b/docs/release-management/release-management-api.mdx @@ -0,0 +1,48 @@ +--- +title: "Release Management API" +description: "Bitrise offers a REST API for Release Management: you can connect apps, configure presets, manage your releases, and distribute the apps via the API." +sidebar_position: 7 +slug: /release-management/release-management-api +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_SubAPIs from '@site/src/partials/sub-apis.mdx'; +import Partial_MigrationFromV1ToV2 from '@site/src/partials/migration-from-v1-to-v2.mdx'; + +Bitrise offers a REST API for Release Management. The base URL for the API is . + +The API is available in two versions: + +- v1: https://api.bitrise.io/release-management/v1. This is deprecated. +- v2: The current version. It has domain-specific sub APIs, with the URLs described here: [Sub APIs](/en/release-management/release-management-api/sub-apis). + +The API offers the same features that are available on the GUI. You can:. + +- Connect apps. +- Configure presets. +- Manage releases in all stages, including the release candidate stage and the approval stage. +- Distribute your apps. + + + + + +## Authentication + +Authentication works the same way [as the Bitrise API](/en/bitrise-ci/api/authenticating-with-the-bitrise-api.html): you need [a Personal Access Token](/en/bitrise-platform/accounts/personal-access-tokens.html) or [a Workspace token](/en/bitrise-platform/workspaces/workspace-api-token.html) to authenticate your API calls. + +Certain endpoints are only available to users with the **Release manager** role and some endpoints are only available on the Standard plan. Typically, these endpoints are used to access end-user-facing functions, such as submitting the app for App Store review and releasing the app to the App Store or Google Play. + +Trying to access the endpoints tied to these roles will return a `403 Permission denied` response. + +## Documentation + +You can find detailed documentation of the API endpoints: [API docs](https://api.bitrise.io/release-management/api-docs/index.html). You can test all endpoints on the site. + +In addition to the technical details, you can also check whether an endpoint is available on a given Bitrise payment plan. + +## Localization codes for the App Store API + +For certain calls to the App Store API, you might need localization codes: for example, when creating a **What to test** description for an iOS release, you might need that description in several different languages. You can find the supported localization codes [in Apple's documentation](https://developer.apple.com/documentation/appstoreconnectapi/app_store/app_metadata/app_info_localizations/managing_metadata_in_your_app_by_using_locale_shortcodes). diff --git a/docs/release-management/releases/_category_.json b/docs/release-management/releases/_category_.json new file mode 100644 index 0000000..d4087e2 --- /dev/null +++ b/docs/release-management/releases/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Releases", + "position": 5, + "link": null +} diff --git a/docs/release-management/releases/adding-a-new-release.md b/docs/release-management/releases/adding-a-new-release.md new file mode 100644 index 0000000..aa8ca6b --- /dev/null +++ b/docs/release-management/releases/adding-a-new-release.md @@ -0,0 +1,29 @@ +--- +title: "Adding a new release" +description: "In Release Management, you can add a new release to a connected app. Each release has its own configuration that you can modify at any time." +sidebar_position: 2 +slug: /release-management/releases/adding-a-new-release +--- + +To release a connected app to the App Store or Google Play, you need to add a new release. Each app can have multiple releases. + +To add a new release to [a connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html): + +1. Log in to Bitrise, and on the left sidebar, select **Releases**. +1. Select your app from the list. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. Go to **Releases** and click **+ New app version**. This opens the **New app version** page. +1. Enter a version number for iOS apps or a release name for Android apps. Optionally, you can also add a description. + + :::note[Release description is internal only] + + The release description is internal only, and it will not be included in the App Store review submission (metadata). + + ::: +1. Select a template from the **Preset template** dropdown menu. + + You can configure templates in [Release presets](/en/release-management/releases/release-presets.html). +1. Click **Add app version**. + +After successfully adding a release, you can modify its configuration at any time: [Configuring a release](/en/release-management/releases/configuring-a-release). diff --git a/docs/release-management/releases/configuring-a-release/_category_.json b/docs/release-management/releases/configuring-a-release/_category_.json new file mode 100644 index 0000000..79b9571 --- /dev/null +++ b/docs/release-management/releases/configuring-a-release/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Configuring a release", + "position": 3, + "link": null +} diff --git a/docs/release-management/releases/configuring-a-release/configuring-auto-upload.mdx b/docs/release-management/releases/configuring-a-release/configuring-auto-upload.mdx new file mode 100644 index 0000000..99f125c --- /dev/null +++ b/docs/release-management/releases/configuring-a-release/configuring-auto-upload.mdx @@ -0,0 +1,36 @@ +--- +title: "Configuring auto-upload" +description: "You can automatically upload your release to Google Play or TestFlight. When auto-upload is enabled, all successful builds are uploaded automatically." +sidebar_position: 3 +slug: /release-management/releases/configuring-a-release/configuring-auto-upload +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToReleaseConfiguration from '@site/src/partials/getting-to-release-configuration.mdx'; + +You can automatically upload your release to [Google Play](/en/release-management/releases/managing-the-release-process/google-play-upload-stage.html) or [TestFlight](/en/release-management/releases/managing-the-release-process/testflight-upload-stage.html). When auto-upload is enabled, all successful builds are uploaded automatically. + +If auto-upload is disabled, builds will have to be uploaded manually. + +## Configuring auto-upload for a release + +1. +1. Find the **Release process** section. +1. Find **Auto-upload** and toggle it on. + + ![2025-08-08-rm-auto-upload-toggle.png](/img/_paligo/uuid-f316a946-dc82-c3b9-9e73-a65f9f12349c.png) + +## Configuring auto-upload as a release preset + +You can enable auto-upload as part of a release preset template. This will apply to all new releases that use the template. + +1. Open Release Management and select your app from the list. +1. Select **Release presets** from the left navigation menu. + + ![20251216-rm-presets.png](/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png) +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the template you need, and select **Change**. +1. Find **Auto-upload** and toggle it on. + + ![2025-08-08-rm-auto-upload-toggle.png](/img/_paligo/uuid-f316a946-dc82-c3b9-9e73-a65f9f12349c.png) diff --git a/docs/release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications.mdx b/docs/release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications.mdx new file mode 100644 index 0000000..c2dada1 --- /dev/null +++ b/docs/release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications.mdx @@ -0,0 +1,135 @@ +--- +title: "Configuring Slack and Teams notifications" +description: "You can enable Slack and Microsoft Teams notifications for Bitrise Release Management events. You need to create an incoming webhook at your preferred service (or both), and add the webhook URL in Release Management." +sidebar_position: 2 +slug: /release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications +sidebar_label: Configuring Slack and Teams notifications for releases +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToReleaseConfiguration from '@site/src/partials/getting-to-release-configuration.mdx'; + +You can enable Slack and Microsoft Teams notifications for Release Management events. You need to create an incoming webhook at your preferred service (or both), and add the webhook URL in Release Management. + +:::important[Standard plan only] + +Please note that this feature is only available on a [paid plan](https://bitrise.io/pricing). + +::: + +## Configuring notifications for a release + +You can configure notifications for each individual release: + + + + +1. [Configure a Slack integration for your workspace](/en/bitrise-platform/workspaces/workspace-slack-integration). +1. +1. Find the **Release process** section and the **Notifications** card. +1. Click **Show details**. +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to **Slack**. + + ![2025-08-08-rm-slack-notification.png](/img/_paligo/uuid-40c38dac-74da-dcc2-0e07-64366c2732dc.png) +1. In the dialog, select your previously configured Slack configuration. + + :::tip[Test notification] + + Click **Send test notification** to make sure your configuration works. + + ::: + + + + +1. Configure [an incoming webhook for Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=dotnet): +1. +1. Find the **Release process** section and the **Notifications** card. +1. Click **Show details**. +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to **Teams**. +1. Select **Edit webhook URL** + + ![2025-08-08-rm-configure-teams-notification.png](/img/_paligo/uuid-823c9a6f-187a-6778-36eb-130492487193.png) +1. In the dialog, copy and paste your webhook URL in the **URL** field and click **Save**. + + :::tip[Test notification] + + Click **Send test notification** to make sure your webhook works. + + ::: + + + + +## Configuring notifications as a release preset + +You can configure notifications as part of [a release preset template](/en/release-management/releases/release-presets.html). These notification settings will be applied to every new release that uses the template. + + + + +1. [Configure a Slack integration for your workspace](/en/bitrise-platform/workspaces/workspace-slack-integration). +1. Open Release Management and select your app from the list. +1. Select **Release presets** from the left navigation menu. + + ![release-presets-notif.png](/img/_paligo/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png) +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the template you need, and select **Change**. +1. In the **Notifications** section, find Slack, and click the ellipsis next to its name. + + ![slack-int-rm.png](/img/_paligo/uuid-0876f906-f150-c883-a882-3d1da1ae42dc.png) +1. Click **Change configuration**. +1. Select your previously configured integration in the dialog. + + :::tip[Test notification] + + Click **Send test notification** to make sure your configuration works. + + ::: + + + + +1. Configure [an incoming webhook at Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=dotnet). +1. Open Release Management and select your app from the list. +1. Select **Release presets** from the left navigation menu. + + ![release-presets-notif.png](/img/_paligo/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png) +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the template you need, and select **Change**. +1. In the **Notifications** section, find Teams, and click the ellipsis next to it. +1. Click **Edit webhook URL**. +1. In the dialog, copy and paste the webhook URL in the **URL** field and click **Save**. + + :::tip[Test notification] + + Click **Send test notification** to make sure your webhook works. + + ::: + + + + +## Notification events + +| Stage | Event | Event description | +| --- | --- | --- | +| Release candidate | Release candidate set | This event is triggered each time there is a new release candidate is selected in the Release candidate stage. This can happen automatically (a new build generated a new IPA) or manually (the release manager locks a specific artifact on the Release candidate stage). | +| TestFlight upload | Upload and processing finished | This event is triggered when TestFlight processing is finished for an uploaded IPA. First we upload the IPA to TestFlight, then the TestFlight processing starts. When the processing finishes, we trigger the event. | +| Approved by TestFlight App Review | This event is triggered when Apple approves the beta app review that is required for sharing the app with external beta testers. | | +| Rejected by TestFlight App Review | This event is triggered when Apple rejects the beta app review that is required for sharing the app with external beta testers. | | +| Approvals | Release approved | This event is triggered when all tasks are approved at the Approval stage. It will not be triggered for each approval, only when all tasks are done. If there are no approval tasks set, the event will trigger immediately after the previous event. | +| App Store review | Release sent for review | This event happens when the store review submission starts. (Release Manager clicks on the submit button, and Apple accepts it) | +| Status of review submission changed | This event is triggered each time there is a change in the status of the review submission. (Approved, rejected, canceled) | | +| Release | Release started | This event is triggered after the submission was accepted, and the release rollout started (so the new version becomes available in App Store Connect) | +| Release finished | This event is triggered when the release gets a completed status in Release Management (which means the release is fully rolled out to Google Play or the App Store.) | | + +| Stage | Event | Event description | +| --- | --- | --- | +| Release candidate | Release candidate set | This event is triggered each time there is a new release candidate is selected in the Release Candidate stage. This can happen automatically (a new build generated a new AAB) or manually (the release manager locks a specific artifact on the Release candidate stage). | +| Google Play upload | Upload and processing finished | This event is triggered after the AAB is uploaded to Google Play console and is available in the App bundle explorer. | +| Release on testing track | This event is triggered after the release candidate is released on a Google Play testing track. | | +| Approvals | Release approved | This event is triggered when all tasks are approved at the Approval stage. It will not be triggered for each approval, only when all tasks are done. | +| Release | Release started | This event is triggered when a release is started. It can be a full release or a staged rollout. For a staged rollout, it only happens once, at the first rollout. | +| Release finished | This event is triggered when release is completed in Release Management. | | +| Rollout percentage changed | This event is triggered if the rollout percentage changes from any percentage other than 0%. For example, if the rollout percentage goes from 10% to 20%. It is NOT triggered when the first rollout happens. | | diff --git a/docs/release-management/releases/configuring-a-release/deleting-a-release.mdx b/docs/release-management/releases/configuring-a-release/deleting-a-release.mdx new file mode 100644 index 0000000..84d021b --- /dev/null +++ b/docs/release-management/releases/configuring-a-release/deleting-a-release.mdx @@ -0,0 +1,25 @@ +--- +title: "Deleting a release" +description: "You can delete a release in Bitrise Release Management on the release configuration page. Deleting a release is permanent and you lose all data associated with the release." +sidebar_position: 6 +slug: /release-management/releases/configuring-a-release/deleting-a-release +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToReleaseConfiguration from '@site/src/partials/getting-to-release-configuration.mdx'; + +:::warning[Deleting a release is permanent!] + +Deleting a release is irreversible and you will lose all data of the release in Release Management. + +Your data in TestFlight, App Store Connect, or Google Play will not be lost, and ongoing processes in the App Store or the Google Play Store will not be affected. App Store review will not be canceled. App Store phased releases will be automatically finished. Google Play staged rollouts will be stopped but you can finish the process manually on Google Play. + +::: + +To delete a release: + +1. +1. Scroll down to the **Delete release** section, and click **Delete release**. +1. In the dialog, click **Delete** to confirm. diff --git a/docs/release-management/releases/configuring-a-release/editing-the-description-of-a-release.mdx b/docs/release-management/releases/configuring-a-release/editing-the-description-of-a-release.mdx new file mode 100644 index 0000000..92cc126 --- /dev/null +++ b/docs/release-management/releases/configuring-a-release/editing-the-description-of-a-release.mdx @@ -0,0 +1,24 @@ +--- +title: "Editing the description of a release" +sidebar_position: 1 +slug: /release-management/releases/configuring-a-release/editing-the-description-of-a-release +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_GettingToReleaseConfiguration from '@site/src/partials/getting-to-release-configuration.mdx'; + +You can enter a release description when you add a new release. This helps identifying the release later. You can change the description at any time in the release configuration: + +:::tip[Release description is internal only] + +The release description is internal only, and it will not be included in the submission. + +::: + +1. +1. On the release information card, click **Edit**. + + ![2025-08-08-rm-editing-release-description.png](/img/_paligo/uuid-54d3257f-0147-d101-0dde-c0296dcb798a.png) +1. In the **Edit Release details** dialog, update the description and click **Save**. diff --git a/docs/release-management/releases/configuring-a-release/index.md b/docs/release-management/releases/configuring-a-release/index.md new file mode 100644 index 0000000..dfeafcf --- /dev/null +++ b/docs/release-management/releases/configuring-a-release/index.md @@ -0,0 +1,22 @@ +--- +title: "Configuring a release" +sidebar_position: 3 +slug: /release-management/releases/configuring-a-release +--- + +After [adding a new release](/en/release-management/releases/adding-a-new-release.html) in Release Management, you are automatically taken to the stage that is currently in progress. On the left, you can see the navigation menu: select **Configuration** to get to the **Release configuration** page. + +![Managing_releases_new.png](/img/_paligo/uuid-4955154b-d553-bb34-5b96-c1779bfecbed.png) + +When configuring a release, you can: + +- [Edit your release description](/en/release-management/releases/configuring-a-release/editing-the-description-of-a-release.html). +- [Configure Slack and Teams notifications](/en/release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications). +- [Manage release automation](/en/release-management/releases/configuring-a-release/release-automation). +- [Delete the release](/en/release-management/releases/configuring-a-release/deleting-a-release.html). + +:::note[Release presets] + +If you selected the **Start with a blank release** method when creating the release, the release has already been configured based on the presets of the connected app: [Release presets](/en/release-management/releases/release-presets). + +::: diff --git a/docs/release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management.mdx b/docs/release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management.mdx new file mode 100644 index 0000000..b766352 --- /dev/null +++ b/docs/release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management.mdx @@ -0,0 +1,26 @@ +--- +title: "Outgoing webhooks in Release Management" +sidebar_position: 5 +slug: /release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_WebhookEvents from '@site/src/partials/webhook-events.mdx'; +import Partial_AddingAnOutgoingWebhookToARelease from '@site/src/partials/adding-an-outgoing-webhook-to-a-release.mdx'; +import Partial_RemovingAnOutgoingWebhookFromARelease from '@site/src/partials/removing-an-outgoing-webhook-from-a-release.mdx'; + +Outgoing Webhooks are automated messages sent from Bitrise to a specified URL when a particular event occurs. For Release Management, these webhooks allow you to integrate Bitrise with external services and tools, enabling seamless communication and automation across your development pipeline. + +:::note[Standard plan only] + +You can add outgoing Webhooks to a Workspace, but connecting them in a [Release Management](https://docs.bitrise.io/en/release-management.html) project is only possible for projects with [standard license](https://bitrise.io/pricing#release-management). + +::: + + + + + + diff --git a/docs/release-management/releases/configuring-a-release/release-automation.mdx b/docs/release-management/releases/configuring-a-release/release-automation.mdx new file mode 100644 index 0000000..00ec1c5 --- /dev/null +++ b/docs/release-management/releases/configuring-a-release/release-automation.mdx @@ -0,0 +1,89 @@ +--- +title: "Release automation" +description: "You can specify events in the release management process that triggers a selected Workflow or Pipeline. For example, you can create an automation that triggers a Workflow whenever an App Store review is cancelled." +sidebar_position: 4 +slug: /release-management/releases/configuring-a-release/release-automation +sidebar_label: Configuring release automation +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_OpeningAnAppInReleaseManagement from '@site/src/partials/opening-an-app-in-release-management.mdx'; + +You can specify events in the release management process that triggers a selected Workflow or Pipeline. For example, you can create an automation that triggers a Workflow whenever an App Store review is cancelled. + +:::important[Standard plan only] + +Please note that this feature is only available on a [paid plan](https://bitrise.io/pricing). + +::: + +:::note[Env Vars from Release Management] + +Release Management passes over certain Environment Variables to your builds at the Release candidate stage and later at the Release stage: [Available environment variables](/en/bitrise-ci/references/available-environment-variables). You can use these Env Vars in your builds triggered by automations. + +::: + +To configure a release automation: + +## Configuring automations for a release + +You can configure automations separately for each individual release: + +1. +1. Select **Releases** and then select your release. +1. Select **Configuration** on the left navigation bar. +1. In the **Release process** section, find **Automation**. +1. Click **Show details** and then click **Add automation**. + + ![2025-08-08-rm-add-automation.png](/img/_paligo/uuid-7225cae0-64cd-a1cf-b878-270a054e58da.png) +1. Under the **Event** field, select a release management event that will trigger the Workflow or Pipeline. + + ![2025-08-08-rm-add-automation-dialog.png](/img/_paligo/uuid-5e41d5a0-b686-edc7-44a5-42c09bf1b12b.png) +1. Set the automation type to either **Workflow** or **Pipeline**. +1. Click **Add automation**. + +## Configuring automations as a release preset + +You can configure automations as [a release preset](/en/release-management/releases/release-presets.html). These automation settings will be applied to every new release afterwards. + +1. Open Release Management and select your app. +1. Select **Release presets** from the left navigation menu. + + ![release-presets-notif.png](/img/_paligo/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png) +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the name of your preset template and select **Change**. +1. In the **Release process** section, find **Automation**. +1. Click **Show details** and then click **Add automation**. +1. Under the **Event** field, select a release management event that will trigger the Workflow or Pipeline. + + ![2025-08-08-rm-add-release-automation-preset-dialog.png](/img/_paligo/uuid-28812c0e-a307-6879-8d90-d0d516765519.png) +1. Set the automation type to either **Workflow** or **Pipeline**. +1. Click **Add automation**. + +## Automation events + +Here you can find all of the events which can trigger Bitrise CI Workflows. Release automations will have an Environment Variable (Env Var), called $RM_EVENT_ID, which identifies the trigger. You can find more [Release Management Env Vars](https://docs.bitrise.io/en/bitrise-ci/references/available-environment-variables.html#UUID-050f04f2-e7f1-3293-b2c5-64ce644132f3_table-idm23436411389193) in [Available Environment Variables](https://docs.bitrise.io/en/bitrise-ci/references/available-environment-variables.html#available-environment-variables). + +| Stage | Event | Event description | Event ID | +| --- | --- | --- | --- | +| Release candidate | Release candidate set | This event is triggered each time there is a new release candidate is selected in the Release candidate stage. This can happen automatically (a new build generated a new IPA) or manually (the release manager locks a specific artifact on the Release candidate stage). | `release_candidate_set` | +| TestFlight upload | Upload and processing finished | This event is triggered when TestFlight processing is finished for an uploaded IPA. First we upload the IPA to TestFlight, then the TestFlight processing starts. When the processing finishes, we trigger the event. | `testflight_upload_finished` | +| Approved by TestFlight App Review | This event is triggered when Apple approves the beta app review that is required for sharing the app with external beta testers. | `beta_review_approved` | | +| Rejected by TestFlight App Review | This event is triggered when Apple rejects the beta app review that is required for sharing the app with external beta testers. | `beta_review_rejected` | | +| Released to TestFlight/App Store testing group | This event is triggered when an uploaded build gets released to a TestFlight testing group. | `release_for_apple_app_store_testing_group` | | +| Approvals | Release approved | This event is triggered when all tasks are approved at the Approval stage. It will not be triggered for each approval, only when all tasks are done. If there are no approval tasks set, the event will trigger immediately after the previous event. | `approvals_completed` | +| App Store review | Release sent for review | This event happens when the store review submission starts. (Release Manager clicks on the submit button, and Apple accepts it) | `submitted_for_review` | +| Status of review submission changed | This event is triggered each time there is a change in the status of the review submission. (Approved, rejected, canceled) | `review_status_changed` `review_cancelled` | | +| Release | Release started | This event is triggered after the submission was accepted, and the release rollout started (so the new version becomes available in App Store Connect) | `release_started` | +| Release finished | This event is triggered when the release gets a completed status in Release Management (which means the release is fully rolled out to Google Play or the App Store.) | `release_completed` | | + +| Stage | Event | Event description | Event ID | +| --- | --- | --- | --- | +| Release candidate | Release candidate set | This event is triggered each time there is a new release candidate is selected in the Release Candidate stage. This can happen automatically (a new build generated a new AAB) or manually (the release manager locks a specific artifact on the Release candidate stage). | `release_candidate_set` | +| Google Play upload | Upload and processing finished | This event is triggered after the AAB is uploaded to Google Play console and is available in the App bundle explorer. | `google_play_store_upload_finished` | +| Release on testing track | This event is triggered after the release candidate is released on a Google Play testing track. | `release_on_google_play_store_testing_track` | | +| Approvals | Release approved | This event is triggered when all tasks are approved at the Approval stage. It will not be triggered for each approval, only when all tasks are done. | `approvals_completed` | +| Release | Release started | This event is triggered when a release is started. It can be a full release or a staged rollout. For a staged rollout, it only happens once, at the first rollout. | `release_started` | +| Release finished | This event is triggered when release is completed in Release Management. | `release_completed` | | +| Rollout percentage changed | This event is triggered if the rollout percentage changes from any percentage other than 0%. For example, if the rollout percentage goes from 10% to 20%. It is NOT triggered when the first rollout happens. | `release_percentage_changed` | | diff --git a/docs/release-management/releases/index.md b/docs/release-management/releases/index.md new file mode 100644 index 0000000..d006ea9 --- /dev/null +++ b/docs/release-management/releases/index.md @@ -0,0 +1,7 @@ +--- +title: "Releases" +sidebar_position: 5 +slug: /release-management/releases +--- + +Releases diff --git a/docs/release-management/releases/managing-the-release-process/_category_.json b/docs/release-management/releases/managing-the-release-process/_category_.json new file mode 100644 index 0000000..e628eeb --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Managing the release process", + "position": 4, + "link": null +} diff --git a/docs/release-management/releases/managing-the-release-process/about-the-release-process.md b/docs/release-management/releases/managing-the-release-process/about-the-release-process.md new file mode 100644 index 0000000..f4c4732 --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/about-the-release-process.md @@ -0,0 +1,30 @@ +--- +title: "About the release process" +sidebar_position: 1 +slug: /release-management/releases/managing-the-release-process/about-the-release-process +--- + +Once you added a new release to a connected app and successfully configured it, you can go through the different release stages of the release process. You can only move to the next release stage after completing the current one, but you can return to a previous stage any time. + +If you make changes to a previous stage, you must start the process over from that stage. + +iOS + +Android + +1. [Release candidate](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html): In the **Release candidate** stage, specify the release branch and select the Workflow that generates an IPA file. + + :::note[Env Vars from Release Management] + + Release Management passes over certain Environment Variables to pipelines and workflows triggered by a [release automation](/en/release-management/releases/configuring-a-release/release-automation): [Available environment variables](/en/bitrise-ci/references/available-environment-variables). + + ::: +1. [TestFlight](/en/release-management/releases/managing-the-release-process/testflight-upload-stage/uploading-the-release-candidate-to-testflight): Upload the release candidate to TestFlight, and distribute it for testing. +1. [Approvals](/en/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage): You can create tasks for any stakeholder or team member whose approval is needed to continue with the release to the App Store. +1. [App Store review](/en/release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.html): Submit your update to review in the App Store, and get information on the approval progress. +1. [Release on the App Store](/en/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.html): You can release your app to all users at the same time, or configure a phased release. + +1. [Release candidate](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html): In the **Release candidate** stage, specify the release branch and select the Workflow that generates an AAB file. +1. [Google Play upload and testing](/en/release-management/releases/managing-the-release-process/google-play-upload-stage/uploading-the-release-candidate-to-google-play): Upload the release candidate to Google Play, and distribute it for testing. +1. [Approvals](/en/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage): You can create tasks for any stakeholder or team member whose approval is needed to continue with the release to Google Play. +1. [Release on Google Play](/en/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.html): You can release your app to all users at the same time, or configure a staged rollout. diff --git a/docs/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage.md b/docs/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage.md new file mode 100644 index 0000000..af688c8 --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage.md @@ -0,0 +1,51 @@ +--- +title: "Creating tasks for the approvals stage" +sidebar_position: 5 +slug: /release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage +sidebar_label: Creating tasks for the Approvals stage +--- + +In the **Approvals** stage, you can create tasks for each stakeholder and/or team member whose approval is needed to continue with the release to the App Store Connect or Google Play. + +Optionally, you can assign an approval task to a team member. Only the assigned team member can approve the task. + +1. Open your release. +1. Select **Approvals** on the left navigation bar. + + ![approvalpage_tasks.jpg](/img/_paligo/uuid-1c68a37c-df87-a7ef-90e6-37ca83ac1ba2.jpg) +1. Click the **Add New Task** button. +1. Fill out the necessary fields: + + ![add_approval_task.png](/img/_paligo/uuid-97e3fccd-f3f6-fdc8-5f55-75f85a525e95.png) + + - **Title**: Identifies the task. This is required. + - **Description**: A short summary of the task. This is optional. + - **Assign to**: Select a team member to assign the task to. Only that team member will be able to approve the task. This is optional. Leave it on **(not assigned)** if you want anyone on the team to be able to approve the task. + - **Due date**: Select a due date for the task's approval. This is optional. + +You can create as many tasks as you want. + +![approvalteam.png](/img/_paligo/uuid-2b430e36-ee56-c8ce-3599-f267c550062a.png) + +After finishing a task in the approvals stage, you can tick it off using the checkbox next to the task. When all tasks have been ticked off, **Approvals** will be ticked off as well on the left navigation bar. + +When done, you can proceed to: + +- [The App Store Review stage](/en/release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.html) for iOS apps. +- [Releasing your app on Google Play](/en/release-management/releases/managing-the-release-process/releasing-your-app-on-google-play.html) for Android apps. + +## Assigning an approval task to a team member with the REST API + +You can assign an approval task to a team member with the help of our [Release Management API](https://docs.bitrise.io/en/release-management/release-management-api.html#release-management-api). For more information on our API endpoint, check out our [API docs](https://api-docs.bitrise.io/). + +:::note[Limited access] + +Note that you need a Personal Access Token or a Workspace token to [authenticate your API calls](https://docs.bitrise.io/en/bitrise-ci/api/authenticating-with-the-bitrise-api.html). + +Only a [Workspace owner, a Project Admin and a Release Manager](https://docs.bitrise.io/en/release-management/configuring-connected-apps/release-management-roles-and-permissions.html) has the right to assign approval tasks to team members. + +::: + +You can create an approval task with the `POST /releases/{release_id}/approvals` endpoint by providing the user slug, due date, summary and a description. + +You can update an approval task with the `PATCH /releases/{release_id}/approvals/{task_id}`endpoint. diff --git a/docs/release-management/releases/managing-the-release-process/google-play-upload-stage.mdx b/docs/release-management/releases/managing-the-release-process/google-play-upload-stage.mdx new file mode 100644 index 0000000..131ed0b --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/google-play-upload-stage.mdx @@ -0,0 +1,21 @@ +--- +title: "Google Play upload stage" +description: "After selecting a release candidate in Bitrise Release Management, you need to upload your candidate to Google Play. You can configure auto-upload or upload the candidate manually." +sidebar_position: 4 +slug: /release-management/releases/managing-the-release-process/google-play-upload-stage +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_DistributingAndroidReleaseCandidatesForTesting from '@site/src/partials/distributing-android-release-candidates-for-testing.mdx'; +import Partial_UploadingTheReleaseCandidateToGooglePlay from '@site/src/partials/uploading-the-release-candidate-to-google-play.mdx'; + +After selecting a release candidate and creating tasks for approvals, the release process of an Android app reaches the stage where it must access Google Play: + +1. [Google Play upload](/en/release-management/releases/managing-the-release-process/google-play-upload-stage/uploading-the-release-candidate-to-google-play): Upload the release candidate to Google Play. +1. [Distribute for testing](#UUID-39bca3fd-5aad-506c-da5d-201adc592807): You can distribute the release candidate to Google Play testing tracks. + + + + diff --git a/docs/release-management/releases/managing-the-release-process/index.md b/docs/release-management/releases/managing-the-release-process/index.md new file mode 100644 index 0000000..a3ce0ee --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/index.md @@ -0,0 +1,7 @@ +--- +title: "Managing the release process" +sidebar_position: 4 +slug: /release-management/releases/managing-the-release-process +--- + +Managing the release process diff --git a/docs/release-management/releases/managing-the-release-process/releasing-your-app-on-google-play.md b/docs/release-management/releases/managing-the-release-process/releasing-your-app-on-google-play.md new file mode 100644 index 0000000..187060b --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/releasing-your-app-on-google-play.md @@ -0,0 +1,105 @@ +--- +title: "Releasing your app on Google Play" +description: "After your app has gone through all previous stages on Bitrise Release Management, it is ready for release. You can release your app to all users at the same time, or configure staged rollout for Google Play." +sidebar_position: 8 +slug: /release-management/releases/managing-the-release-process/releasing-your-app-on-google-play +--- + +After your app has gone through all previous stages, it is ready for release. You can release your app to all users at the same time, or configure staged rollout for Google Play. + +## Configuring staged rollout for Google Play + +You can release your app to Google Play in staged rollouts. With staged rollout, you release your apps in several different stages, with only a certain percentage of users getting the new version with each stage. Users aren't notified that they are in a staged release. Automating the process means you don't have to manually release the app at each stage to a different segment of users: Release Management takes care of that automatically. + +### Enabling staged rollout for Google Play + +If you choose this option, your version update will be released over a seven-day period to a percentage of your users. Users aren’t notified that they're in a staged release of your app. + +:::note[Failed rollout] + +If the rollout stage fails for any reason, we’ll try it again later, until it succeeds, or you cancel or pause the automation.We try the failed rollout three times in an hour until it succeeds. After the rollout succeeds the rollout time for the stage will show the real rollout time, and not the planned time. + +::: + +1. On the **Release** stage, click Manage release. + + ![manage-release-button.png](/img/_paligo/uuid-bff97bcb-df0b-c062-3f8b-e446d171d6e9.png) +1. Select the **Automatically change rollout percentage over a 7-day period** option. +1. Select the rollout start time and date. The rollout must start at least ten minutes after the current time. +1. Click **Save changes**. + +### Clearing the automated staged rollout schedule + +You can clear the schedule before the first stage of the scheduled rollout is completed. If the first stage fails, you can still clear the rollout schedule, but after it is completed you can only [pause the automation](#section-idm4566296030356834170833265238), or [cancel it](#section-idm4575678678283234170834608148). + +![release-scheduled.png](/img/_paligo/uuid-7b4d08a4-23ee-c089-5e7a-a8f2ea99abda.png) + +1. Open your release. +1. Go to the **Release** stage. +1. Find the **Release summary** section. +1. Click the **Clear schedule** button. + +### Cancelling an automated staged rollout + +You can cancel the automated rollout at any time after the first stage of the rollout is completed. However, once the automation is cancelled, you can't resume it and you can only update it manually in Release Management. + +1. Open your release. +1. Go to the **Release app version** stage. +1. Find the **Release summary** section. +1. Click the **Cancel automation** button. + + ![phased-rollout-cancel.png](/img/_paligo/uuid-29b1db0e-2fa8-8f7e-ba48-da85ed4db64b.png) + +### Pausing automated staged rollout + +You can pause and resume the automated rollout at any time after the first stage of the rollout is completed. There’s no limit to the number of pauses or the duration of the pause. + +1. Open your release. +1. Go to the **Release app version** stage. +1. Go to **Staged rollout**. +1. Click **Pause automation**. + + ![phased-rollout.png](/img/_paligo/uuid-fd923003-5828-07e5-376b-b1d9e05c9652.png) + +### Resuming automated staged rollout + +You can pause and resume the automated rollout at any time after the first stage of the rollout is completed. There’s no limit to the number of pauses or the duration of the pause. + +1. Open your release. +1. Go to the **Release** stage. +1. Find the **Release summary** section. +1. Click the **Resume automation** button. + + ![resume-rollout.png](/img/_paligo/uuid-2da28206-9def-429e-3b2f-d3d769b15c3b.png) +1. Select the resume time and date. + + :::important[Minimum time] + + The time and date must be at least ten minutes after the current time. + + ::: + +## Releasing your app + +Once everything is configured, you can release your app. Depending on your settings, you can either release the app to all your users at the same time, or do a staged rollout. + +1. Open your release. +1. Select **Release** on the left navigation bar. +1. Click **Release app**. It either releases your app to all users or starts a staged rollout, depending on your settings. + +## Editing the release note of an Android app + +If you wish to release an app with a different release note than [what's already set in Release presets](/en/release-management/releases/configuring-a-release/release-automation), you can manually edit the note before rolling out a new app version. This change will not override the default configuration of the **Release presets**, it only affects the current release. + +:::note[Release Managers only] + +Please note that only [Release Managers](https://devcenter.bitrise.io/en/release-management/getting-started-with-release-management/release-management-concepts.html) can edit release notes. + +::: + +To modify the release note of an Android app during the release process: + +1. Go through the **Release candidate**, **Google Play**, and **Approvals** stages, then click **Release app version** on the left. +1. Scroll down to **Release note** and click **Edit**. You can see the default release note content in the text box. +1. Make your changes to the text. This new content will apply for the localization under **Language**. +1. You can copy the new content to additional localizations by clicking **Copy to** and selecting other localizations. diff --git a/docs/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.mdx b/docs/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.mdx new file mode 100644 index 0000000..6f658f8 --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.mdx @@ -0,0 +1,78 @@ +--- +title: "Releasing your app on the App Store" +description: "You can release your app to all users in Release Management, or configure staged releases to only release an app to a percentage of users." +sidebar_position: 7 +slug: /release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +After your app has gone through all previous stages, it is ready for release. You can release your app to all users at the same time, or configure phased release for the Apple Store. + +## Configuring phased releases for the Apple Store + +You can release your app to the Apple Store in phases. With a phased release, you release your apps in several different stages, with only a certain percentage of users getting the new version with each stage. Users aren't notified that they are in a staged release. Automating the process means you don't have to manually release the app at each stage to a different segment of users: Release Management takes care of that automatically. + +:::note[Terminology] + +Google calls this feature a staged rollout while Apple calls it a phased release. + +::: + +### Enabling phased releases for the Apple Store + +If you choose this option, your version update will be released over a seven-day period to a percentage of your users (selected at random by their Apple ID) who has automatic updates turned on. Users aren’t notified that they're in a phased release of your app. + +You can enable phased release before the App Store review stage or during the release stage after a successful App Store review. + + + + +1. On the **App Store review** stage, find **App Store release settings**. +1. On the right of the **Phased release for automatic updates** card, click **Change**. +1. Select the **Release update over 7-day period using phased release** option. + + ![phased-release-7-day.png](/img/_paligo/uuid-05ba3ed0-0f1c-c4be-e46f-cc500b21041c.png) +1. Click **Save changes**. + + + + +1. On the **App Store review** stage or the **Release** stage, find the **Version release** card and click **Change**. +1. In the dialog, choose one of three options: + + - **Manually release this version** + - **Automatically release this version** + - **Automatically release this version after App Review, not earlier than** and set a date. + + ![release-version.png](/img/_paligo/uuid-4f7e400b-3a64-eb42-5b85-c51a3f41da03.png) +1. On the **Release** stage, find the **Phased release for automatic updates** card, and click **Change**. +1. Select the **Release update over 7-day period using phased release** option. + + + + +### Pausing a phased release + +While your app is in phased release, you can choose to pause the release for a total of 30 days. There’s no limit to the number of pauses. + +1. On the **Release** stage, click the **Pause** button. +1. To continue the phased release, click the **Continue** button. + +## Releasing your app + +Once everything is configured, you can release your app. Depending on your settings, you can either release the app to all your users at the same time, or do a staged rollout. + +1. Open your release. +1. Select **Release** on the left navigation bar. +1. Click **Release version**. It either releases your app to all users or starts a phased release, depending on your settings. You can change the settings in the **App Store release settings** section. + + ![app-store-release.png](/img/_paligo/uuid-fafa8157-e6f0-6495-1da6-7112515830d8.png) + +:::note[Changing the date of an automatic release] + +For iOS apps, you can change the date on the **Release** page if you selected **Automatically release this version after App Review, no earlier than** in the App Store review stage. + +::: diff --git a/docs/release-management/releases/managing-the-release-process/selecting-a-release-candidate.md b/docs/release-management/releases/managing-the-release-process/selecting-a-release-candidate.md new file mode 100644 index 0000000..26f7de8 --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/selecting-a-release-candidate.md @@ -0,0 +1,51 @@ +--- +title: "Selecting a release candidate" +description: "Bitrise Release Management asks you to specify a release branch, and select a Workflow that generated an `.ipa` file for iOS apps, or an `.aab` file for Android apps in the release candidate stage." +sidebar_position: 2 +slug: /release-management/releases/managing-the-release-process/selecting-a-release-candidate +--- + +In the release candidate stage you select an installable artifact that will be used during the release process. You have two possible sources of installable artifacts: + +- A Bitrise CI build. If you use this source, you select a branch and a Workflow and then select an artifact generated by a build using those. By default, the artifact of the latest build is used but you can change this. +- [Upload an installable artifact via API](/en/bitrise-ci/api/managing-build-artifacts.html). This is particularly useful if you use a different CI service instead of Bitrise. + +:::important[Signed artifacts only] + +The installable artifact must be a SIGNED artifact (IPA or AAB). Check out our code signing guides: + +- [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing) +- [Android code signing](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html) + +::: + +To select a release candidate: + +1. Open your release. +1. Select **Release candidate** on the left navigation bar. +1. Configure the source of the build artifact: under the **Configuration** section, click **Configure**. + + This will open up the **Build artifact source** dialog. + + ![build-artifact-source.png](/img/_paligo/uuid-ca5383f8-2b6e-a07a-1876-35ad58894b5f.png) +1. Select from one of two options: + + - **Use Bitrise CI builds**: Select a branch and a Workflow to use artifacts generated by a Bitrise CI build. + - **Upload via API**: To be able to select an artifact from this source, [upload one using the API](/en/bitrise-ci/api/managing-build-artifacts.html). +1. Check the **Automatically select** checkbox to use either the latest generated artifact or the latest file uploaded via the API. + + Either way, the artifact must be a signed artifact. +1. Click **Save changes**. +1. If you didn't check automatic selection, go to the **Build artifact** section and click **Select artifact**. You will only be able to select from signed artifacts. + + ![select-artifact.png](/img/_paligo/uuid-9502548e-c9ec-985e-7224-7e06aa0dfbda.png) +1. Select a build artifact in the dialog and click **Select artifact**. + +Once you selected a release candidate, you will see the details of the artifact that will be used under **Build artifact**: + +![locked-artifact.png](/img/_paligo/uuid-4d8bea06-abe3-0ad5-9a37-d840ad2c0875.png) + +You can proceed to: + +- [The TestFlight upload stage](/en/release-management/releases/managing-the-release-process/testflight-upload-stage.html) for iOS apps. +- [The Google Play upload stage](/en/release-management/releases/managing-the-release-process/google-play-upload-stage/uploading-the-release-candidate-to-google-play) for Android apps. diff --git a/docs/release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.md b/docs/release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.md new file mode 100644 index 0000000..5f93468 --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.md @@ -0,0 +1,58 @@ +--- +title: "Sending your app to App Store review" +description: "After you’ve uploaded your release candidate to TestFlight and the build processing is finished, you can submit it for App Store review, where Apple will review your release." +sidebar_position: 6 +slug: /release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review +--- + +:::important[Role requirement] + +To send your app to App Store review, you need to have the Release Manager role for your connected app. + +::: + +After you’ve uploaded your release candidate to TestFlight and the build processing is finished, you can submit it for App Store review, where Apple will review your release: + +1. Open your release. +1. Select **App Store review** on the left navigation bar. +1. Review the **App Store release settings** section. + + ![app-store-review.png](/img/_paligo/uuid-0356f699-7e6f-0169-7fb3-82576e470b62.png) +1. Configure phased release by clicking **Change** on **Phased release for automatic updates**. + + If you opt for a phased release, at first, only some of your users will have access to the contents of your release. Gradually, over a 7-day period, all of your users will get access. +1. Configure version release by clicking **Change** on **Version release**. You can: + + - Release the app manually. + - Release the app automatically: the app will be released as soon as Apple finishes the review. + - Release the app automatically after App Store review but no earlier than a specified date. +1. Review the metadata at the **App Store metadata** section. +1. When done, click **Submit version** on the top right part of the page. + + :::tip[Canceling App Store review] + + You can cancel the App Store review before it finishes by clicking on the **Cancel App Store review** button. + + ::: + +You can monitor the release status on the **Release** page. + +You can proceed to [Releasing your app on the App Store](/en/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store) for manual releases. + +## Editing the release note of an iOS app + +If you wish to release an app with a different release note than what's [already set in release presets](/en/release-management/releases/configuring-a-release/release-automation), you can manually edit the note before rolling out a new app version. This change will not override the default configuration of the **Release presets**, it only affects the current release. + +:::note[Release Managers only] + +Please note that only [Release Managers](https://devcenter.bitrise.io/en/release-management/getting-started-with-release-management/release-management-concepts.html) can edit release notes. + +::: + +To modify the release note of an iOS app during the release process: + +1. Go through the **Release candidate**, **TestFlight**, and **Approvals** stages, then click **App store review** on the left. +1. Scroll down to **App Store Metadata**. +1. Click **What's new in this version**, then **Edit metadata**. Here you can change the release note. It will only apply to the selected localization shown under **Language**. +1. Optionally, you can copy the new content to all localizations by ticking **Use same content for all localizations**. +1. You can copy the new content to additional localizations by clicking **Copy to** and selecting the localizations of your choice. diff --git a/docs/release-management/releases/managing-the-release-process/stop-managing-a-release.md b/docs/release-management/releases/managing-the-release-process/stop-managing-a-release.md new file mode 100644 index 0000000..d098098 --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/stop-managing-a-release.md @@ -0,0 +1,31 @@ +--- +title: "Stop managing a release" +description: "If you have started a release on Bitrise but decided to abandon it or complete it externally, you can stop managing that in-progress release regardless of the stage you are at on Bitrise. When stopped, the release becomes read-only and cannot be restarted." +sidebar_position: 9 +slug: /release-management/releases/managing-the-release-process/stop-managing-a-release +--- + +If you have started a release on Bitrise but decided to abandon it or complete it externally, you can stop managing that in-progress release regardless of the stage you are at on Bitrise. When stopped, the release becomes read-only and cannot be restarted. + +:::note[Feature access] + +Only [Release Managers](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions), [Project Admins](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html), and [workspace owners](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci/owners) have access to this feature. + +::: + +To stop managing a release: + +1. Open your app in Release Management and select **Releases**. +1. Select a release from the list and click the arrow next to its name. +1. Select **Configuration** on the left. +1. Scroll down and click **Stop managing release**. This brings up a dialog. + + ![2025-08-08-rm-stop-managing-release.png](/img/_paligo/uuid-187924e0-afdb-8c78-53fe-809168944982.png) +1. Select a reason for stopping this release. + + ![2025-08-08-rm-stop-managing-release-dialog.png](/img/_paligo/uuid-b2fabd61-e0f2-af2c-3074-70940d45d4cc.png) + + - **Completed externally**: The release will be completed outside of Bitrise, either on App Store Connect or on Google Play Console. + - **Abandoned**: The release is stopped on this stage and will not be completed. In both cases, the release turns to a read-only status on Bitrise. + +After you confirm the changes, you can see a breakdown of all completed and not completed release stages. If you go back to the **Releases** page, you will see the stopped release with the status **Stopped managing** and a short explanation (**Abandoned**, **Completed externally**) you set before. diff --git a/docs/release-management/releases/managing-the-release-process/testflight-upload-stage.mdx b/docs/release-management/releases/managing-the-release-process/testflight-upload-stage.mdx new file mode 100644 index 0000000..46fc0ce --- /dev/null +++ b/docs/release-management/releases/managing-the-release-process/testflight-upload-stage.mdx @@ -0,0 +1,21 @@ +--- +title: "TestFlight upload stage" +description: "After selecting a release candidate on Bitrise Release Management, you can upload the release candidate to TestFlight. This can be configured to happen automatically, or you can upload it manually." +sidebar_position: 3 +slug: /release-management/releases/managing-the-release-process/testflight-upload-stage +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; +import Partial_UploadingTheReleaseCandidateToTestFlight from '@site/src/partials/uploading-the-release-candidate-to-testflight.mdx'; +import Partial_DistributingIOSReleaseCandidatesForTesting from '@site/src/partials/distributing-ios-release-candidates-for-testing.mdx'; + +After selecting a release candidate, the release process of the iOS app reaches the stages where it must access the App Store: + +1. [TestFlight](/en/release-management/releases/managing-the-release-process/testflight-upload-stage/uploading-the-release-candidate-to-testflight): Upload the release candidate to TestFlight. +1. [Distribute for testing](/en/release-management/build-distribution/distributing-builds-to-testers.html): Distribute the release candidate to TestFlight testing groups. + + + + diff --git a/docs/release-management/releases/release-presets.mdx b/docs/release-management/releases/release-presets.mdx new file mode 100644 index 0000000..322ba02 --- /dev/null +++ b/docs/release-management/releases/release-presets.mdx @@ -0,0 +1,147 @@ +--- +title: "Release presets" +description: "Release presets are default values and configurations for new releases of [a connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html) on Bitrise Release Management. Presets are automatically applied when you add a new release." +sidebar_position: 1 +slug: /release-management/releases/release-presets +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +Release presets are default values and configurations for new releases of [a connected app](/en/release-management/getting-started-with-release-management/connecting-an-app.html). To set a preset for a release, you need a preset template. A preset template is a combination of various preset options. You can apply a template to a release when [adding a new release](/en/release-management/releases/adding-a-new-release.html). + +You can configure presets for: + +- [The initial release configuration](#section-idm4583237401084834241447431116). +- [The release candidate stage](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html). + +## Creating a preset template + +1. Log in to Bitrise, and from the left sidebar, select **Releases**. +1. Select your app from the list. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. On the left, select **Release presets**. + + ![20251216-rm-presets.png](/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png) +1. Click **+ New template**. +1. Add a name and click **Create**. +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the name of your template and select **Change**. +1. Select and configure the available [release preset options](#section-idm461340834463843424144832262): + + - In the **Configuration** section, configure preset options for the initial release configuration. + - In the **Release candidate** section, create a build configuration for the release candidate stage. + - **Release rollout/App Store release settings** allow you to configure phased release for Android and iOS apps, respectively. By default, updates are released immediately to all users. + - **Release notes/App Store metadata** allow you to add release notes to your release. + +## Release preset options + +- **Auto-upload**: Enable or disable automatic upload with the toggle switch. Read more: [Configuring auto-upload](/en/release-management/releases/configuring-a-release/configuring-auto-upload). +- **Approvals**: Create default approval tasks for new releases. Read more: [Creating tasks for the approvals stage](/en/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage). +- **Notifications**: Enable Slack and Teams notifications for all new releases with the same settings. Read more: [Configuring Slack and Teams notifications](/en/release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications). +- **Automation**: Configure default automation events with their triggered Workflow or Pipeline. Read more: [Release automation](/en/release-management/releases/configuring-a-release/release-automation). +- **Outgoing webhooks**: Select release events that should send a JSON payload to a service of your choice. Read more: [Outgoing webhooks in Release Management](/en/release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management). + +Preset options for the release candidate stage: + +- **Build configuration**: You can select the release branch for the app and the Workflow that generates the build with a signed IPA or AAB file. + +Preset options for the review and release stage: + +- **Release note**: You can create a release note preset for Android apps. +- **App Store metadata**: You can create a release note preset for iOS apps. + +For details, read [see topic](#section-idm234920614151143). + +## Release note preset + +You can create a release note preset. This means every release will be submitted to the App Store or Google Play with the same release notes. + +A release note preset can be identical in all localizations. + +:::note[Manual edit] + +You can edit a release note in the release stage, before submitting your app to an online store. A manual edit will override the release note preset. + +::: + +### Editing a release note preset + +To create and save a release note preset: + + + + +1. Open your app in Release Management. +1. On the left, select **Release presets**. + + ![20251216-rm-presets.png](/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png) +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the name of your preset template and select **Change**. +1. Find **App Store metadata**. +1. From the dropdown menu, select a localization. + + ![2025-08-07-app-store-metadata.png](/img/_paligo/uuid-e5531ad0-351f-de58-e68e-320c039ab434.png) +1. Click **What's new in this version** and then **Edit metadata**. +1. Add your release note in the **What's in your release** field. +1. Click **Save changes**. + + + + +1. Open your app in Release Management. +1. On the left, select **Release presets**. + + ![20251216-rm-presets.png](/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png) +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the name of your template and select **Change**. +1. Find **Release notes**. +1. From the dropdown menu, select a localization. + + ![release-notes-menu.png](/img/_paligo/uuid-04f62e3f-a98e-7b0f-4b1f-7d592e42db65.png) +1. Click **Edit**. This opens the **Edit release notes** dialog. +1. Add your release note in the **What's in your release** field. + + Optionally, you can check **Use same content for all localizations** to include the same text for all languages. + + ![release-note-preset.png](/img/_paligo/uuid-588d950a-8b3c-1984-18f6-d251651222a2.png) +1. Click **Save changes**. + + + + +### Copying a release note preset to other localizations + +If you don't want to automatically use the same preset for all localizations, you can copy your preset to specific localizations. + + + + +1. Open your app in Release Management. +1. On the left, select **Release presets**. + + ![20251216-rm-presets.png](/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png) +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the name of your template and select **Change**. +1. Find **App Store metadata**. +1. Click into **What's new in this verseion**, and then click **Copy to**. This opens the **Copy metadata dialog**. + + ![copy-metadat.png](/img/_paligo/uuid-55c4990e-7f00-98a4-fa17-c3a9d0e3ba76.png) +1. Open the **Copy to** dropdown menu, and select all localizations you want to copy to. +1. Click **Copy**. + + + + +1. Open your app in Release Management. +1. On the left, select **Release presets**. + + ![20251216-rm-presets.png](/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png) +1. Click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) next to the name of your template and select **Change**. +1. Find **Release notes**. +1. Click **Copy to**. This opens the **Copy metadata** dialog. + + ![copy-metadat.png](/img/_paligo/uuid-55c4990e-7f00-98a4-fa17-c3a9d0e3ba76.png) +1. Open the **Copy to** dropdown menu, and select all localizations you want to copy to. +1. Click **Copy**. + + + diff --git a/docs/test-link-steps.mdx b/docs/test-link-steps.mdx new file mode 100644 index 0000000..09eae83 --- /dev/null +++ b/docs/test-link-steps.mdx @@ -0,0 +1,9 @@ +--- +title: Test link-steps workflow +--- + +This page is used to test the automatic Step name linking workflow. + +Use the **Activate SSH key** Step to authenticate with your repository over SSH. + +After cloning your code, you can cache dependencies with the **Save Gradle Cache** Step to speed up subsequent builds. diff --git a/docusaurus.config.ts b/docusaurus.config.ts new file mode 100644 index 0000000..5c0204d --- /dev/null +++ b/docusaurus.config.ts @@ -0,0 +1,309 @@ +import {themes as prismThemes} from 'prism-react-renderer'; +import type {Config} from '@docusaurus/types'; +import type * as Preset from '@docusaurus/preset-classic'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; + +// Build-time expansion for list-context partial references. +// +// Migration emits `1. ` placeholders in +// consumer pages where Paligo had an `` inside a ``. +// MDX would render that JSX component as a block, breaking step numbering, so +// we splice the partial's actual list items in BEFORE MDX parses the page. +// The partial file remains the canonical source. +const PARTIALS_DIR = path.resolve(__dirname, 'src/partials'); +const PARTIALS_INDEX_FILE = path.resolve(__dirname, 'migration/partials_index.json'); + +let partialsIndex: Record = {}; +try { + partialsIndex = JSON.parse(fs.readFileSync(PARTIALS_INDEX_FILE, 'utf-8')).components ?? {}; +} catch { + // No index yet (first migration run not done) — preprocessor becomes a no-op. +} + +const partialContentCache = new Map(); + +/** + * Read a partial file once and extract the items of its first contiguous + * Markdown list (numbered or bulleted). Each returned string is one item with + * the leading prefix removed; multi-line items keep their indented + * continuation lines (3-space for ordered, 2-space for bulleted). + */ +function extractPartialItems(component: string): string[] | null { + if (partialContentCache.has(component)) return partialContentCache.get(component)!; + const slug = partialsIndex[component]; + if (!slug) return null; + const file = path.join(PARTIALS_DIR, `${slug}.mdx`); + if (!fs.existsSync(file)) return null; + const text = fs.readFileSync(file, 'utf-8'); + + // Walk lines, skip frontmatter / imports / blank lines, then collect the + // first list block. + const lines = text.split('\n'); + let i = 0; + if (lines[0]?.trim() === '---') { + i++; + while (i < lines.length && lines[i].trim() !== '---') i++; + i++; + } + while (i < lines.length) { + const stripped = lines[i].trim(); + if (stripped === '' || stripped.startsWith('import ') || stripped.startsWith('export ')) { + i++; + continue; + } + break; + } + + const items: string[] = []; + const listLineRe = /^(\d+\.|[-+*])\s+(.*)$/; + let current: string[] | null = null; + let detected: 'ordered' | 'bullet' | null = null; + for (; i < lines.length; i++) { + const line = lines[i]; + const m = line.match(listLineRe); + if (m) { + const isOrdered = /^\d+\./.test(m[1]); + const kind = isOrdered ? 'ordered' : 'bullet'; + if (detected === null) detected = kind; + if (kind !== detected) break; + if (current) items.push(current.join('\n')); + current = [m[2]]; + continue; + } + // Continuation: blank or indented line while we're inside an item + if (current !== null) { + const expectedIndent = detected === 'ordered' ? 3 : 2; + if (line === '' || line.startsWith(' '.repeat(expectedIndent)) || line.startsWith('\t')) { + current.push(line.startsWith(' '.repeat(expectedIndent)) ? line.slice(expectedIndent) : line); + continue; + } + // First non-list, non-continuation line ends the block + break; + } + // Non-list content before any list item — keep scanning until we hit one + } + if (current) items.push(current.join('\n')); + partialContentCache.set(component, items); + return items; +} + +/** + * Replace `1. ` (and bulleted `- `) lines with the + * partial's actual list items, re-prefixed to match the consumer's list style. + */ +function expandListPartials(content: string): string { + const refRe = /^([ \t]*)(\d+\.|[-+*])\s*<(Partial_[A-Za-z0-9_]+)\s*\/>\s*$/gm; + return content.replace(refRe, (match, indent, prefix, name) => { + const items = extractPartialItems(name); + if (!items || items.length === 0) return match; + const isOrdered = /^\d+\./.test(prefix); + const itemPrefix = isOrdered ? '1. ' : '- '; + const itemIndent = isOrdered ? ' ' : ' '; + return items + .map((body) => { + const [first, ...rest] = body.split('\n'); + const lines = [indent + itemPrefix + first]; + for (const r of rest) lines.push(r ? indent + itemIndent + r : ''); + return lines.join('\n'); + }) + .join('\n'); + }); +} + +const config: Config = { + title: 'Bitrise Docs', + tagline: 'Find product documentation, code samples, API & CLI references, and more.', + favicon: 'favicon.ico', + + url: 'https://docs.bitrise.io', + baseUrl: '/', + trailingSlash: false, + + organizationName: 'bitrise-io', + projectName: 'docs', + + onBrokenLinks: 'warn', + onBrokenMarkdownLinks: 'warn', + + markdown: { + format: 'detect', + hooks: { + onBrokenMarkdownImages: 'warn', + }, + // Escape angle-bracket placeholders in MDX bodies so things like + // `` or `` don't get parsed as JSX. + // Real components we use (Tabs/TabItem/GlossTerm) are left alone. + preprocessor: ({filePath, fileContent}) => { + if (!filePath.endsWith('.mdx')) return fileContent; + // Step 1: expand `1. ` placeholders (list-context partials) + // BEFORE we do tag escaping below, so the inlined items are subject to + // the same escape rules as inline content. + fileContent = expandListPartials(fileContent); + const ALLOWED = new Set([ + 'Tabs', 'TabItem', 'GlossTerm', + 'br', 'hr', 'sup', 'sub', 'strong', 'em', 'code', 'pre', 'p', + 'div', 'span', 'a', 'img', 'ul', 'ol', 'li', + 'table', 'thead', 'tbody', 'tr', 'th', 'td', + 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'dl', 'dt', 'dd', 'details', 'summary', 'figure', 'figcaption', + ]); + // Strip frontmatter and import block so we don't touch them + const fmEnd = fileContent.indexOf('\n---', 3); + if (fmEnd < 0) return fileContent; + const head = fileContent.slice(0, fmEnd + 4); + let body = fileContent.slice(fmEnd + 4); + // Replace `` and `` with escaped versions when Word + // isn't in our allow-list. Skip code fences and inline code. + const lines = body.split('\n'); + let inFence = false; + for (let i = 0; i < lines.length; i++) { + const stripped = lines[i].trimStart(); + if (stripped.startsWith('```')) { + inFence = !inFence; + continue; + } + if (inFence) continue; + // Process line, skipping inline `code` segments + const segments = lines[i].split('`'); + for (let s = 0; s < segments.length; s += 2) { + // Escape `` placeholders that aren't real components. + // Real components: allow-list + auto-generated `Partial_*` refs. + segments[s] = segments[s].replace( + /<(\/?)([A-Za-z][A-Za-z0-9_-]*)([^>]*)>/g, + (m, slash, name, rest) => { + if (ALLOWED.has(name) || name.startsWith('Partial_')) return m; + return `<${slash}${name}${rest}>`; + } + ); + // Escape `<` followed by a digit or whitespace+digit (version ranges + // like `<1.2.3`, comparison expressions like `< 5`). MDX otherwise + // tries to read a JSX name and chokes. + segments[s] = segments[s].replace(/<(\s*\d)/g, '<$1'); + // Escape `{kebab-case}` placeholders — they look like JSX expressions + // to MDX but are never valid identifiers because of the hyphen. + segments[s] = segments[s].replace(/\{([a-z][a-z0-9]*-[a-z0-9-]+)\}/g, '\\{$1\\}'); + } + lines[i] = segments.join('`'); + } + return head + lines.join('\n'); + }, + }, + + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + headTags: [ + { + tagName: 'link', + attributes: { + rel: 'preconnect', + href: 'https://fonts.googleapis.com', + }, + }, + { + tagName: 'link', + attributes: { + rel: 'preconnect', + href: 'https://fonts.gstatic.com', + crossorigin: 'anonymous', + }, + }, + { + tagName: 'link', + attributes: { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Figtree:wght@300..900&family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap', + }, + }, + ], + + scripts: [ + ...(process.env.NODE_ENV === 'production' + ? [ + { + src: 'https://cdn.cookielaw.org/consent/74dfda25-8e61-4fab-9330-4718635e7050/OtAutoBlock.js', + }, + { + src: 'https://cdn.cookielaw.org/scripttemplates/otSDKStub.js', + charset: 'UTF-8', + 'data-domain-script': '74dfda25-8e61-4fab-9330-4718635e7050', + }, + ] + : []), + ], + + customFields: { + gtmId: process.env.GTM_ID || '', + genSearchWidgetConfigId: process.env.GEN_SEARCH_WIDGET_ID || '', + intercomAppId: 'e2rdidtm', + }, + + themes: [ + [ + require.resolve('@easyops-cn/docusaurus-search-local'), + { + hashed: true, + language: ['en'], + docsRouteBasePath: 'en', + indexBlog: false, + }, + ], + ], + + presets: [ + [ + 'classic', + { + docs: { + routeBasePath: 'en', + path: 'docs', + sidebarPath: './sidebars.ts', + }, + blog: false, + theme: { + customCss: './src/css/custom.css', + }, + } satisfies Preset.Options, + ], + ], + + themeConfig: { + navbar: { + title: '', + logo: { + alt: 'Bitrise Docs', + src: 'img/brand/bitrise-docs-logo.svg', + href: '/', + }, + items: [ + { + href: 'https://support.bitrise.io/en/', + label: 'Go to Support', + position: 'right', + className: 'navbar-support-link', + }, + { + href: 'https://app.bitrise.io/users/sign_up', + label: 'Start for free', + position: 'right', + className: 'navbar-cta-link', + }, + ], + }, + footer: { + style: 'dark', + links: [], + copyright: `© ${new Date().getFullYear()} Bitrise Ltd.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + additionalLanguages: ['yaml', 'bash', 'json', 'ruby', 'swift', 'kotlin', 'groovy', 'dart'], + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/migration/__pycache__/convert.cpython-314.pyc b/migration/__pycache__/convert.cpython-314.pyc new file mode 100644 index 0000000..584214d Binary files /dev/null and b/migration/__pycache__/convert.cpython-314.pyc differ diff --git a/migration/apply_slugs.py b/migration/apply_slugs.py new file mode 100644 index 0000000..9133c33 --- /dev/null +++ b/migration/apply_slugs.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +""" +Post-processes migrated MD files to inject correct URL slugs. + +Matches by: extracting the canonical URL from each HTML file in the Paligo output, +then finding the MD file whose title matches the HTML page title. +For hub/category index pages, also matches by directory structure. + +Usage: + python3 migration/apply_slugs.py migration/docs /path/to/out/en +""" + +import os +import re +import sys +from pathlib import Path +from difflib import SequenceMatcher + + +def extract_html_info(html_path): + with open(html_path, "r", encoding="utf-8", errors="replace") as f: + content = f.read(5000) + title_match = re.search(r"(.*?)", content, re.IGNORECASE) + title = title_match.group(1).strip() if title_match else "" + return title + + +def parse_frontmatter(content): + if not content.startswith("---"): + return {}, content + end = content.index("---", 3) + fm_text = content[3:end].strip() + body = content[end + 3:].lstrip("\n") + fm = {} + for line in fm_text.split("\n"): + if ":" in line: + key, val = line.split(":", 1) + fm[key.strip()] = val.strip().strip('"') + return fm, body + + +def write_frontmatter(fm, body): + lines = ["---"] + for key, val in fm.items(): + if key in ("title", "description"): + val_escaped = val.replace('"', '\\"') + lines.append(f'{key}: "{val_escaped}"') + else: + lines.append(f"{key}: {val}") + lines.append("---") + lines.append("") + return "\n".join(lines) + "\n" + body + + +def main(): + if len(sys.argv) < 3: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + + docs_dir = Path(sys.argv[1]) + html_dir = Path(sys.argv[2]) + + # Build index of all HTML pages: title -> URL path, and dir -> URL path + html_pages = {} + html_by_title = {} + html_by_dir_and_title = {} + + for root, _dirs, files in os.walk(html_dir): + for fname in files: + if not fname.endswith(".html"): + continue + if fname in ("toc-en.html", "index-en.html"): + continue + full_path = os.path.join(root, fname) + rel_path = os.path.relpath(full_path, html_dir) + title = extract_html_info(full_path) + + html_pages[rel_path] = title + if title: + html_by_title.setdefault(title, []).append(rel_path) + parent_dir = os.path.dirname(rel_path) + html_by_dir_and_title[(parent_dir, title)] = rel_path + + print(f"Indexed {len(html_pages)} HTML pages") + + # Build index of all MD files + md_files = {} + for md_file in sorted(docs_dir.rglob("*.md")): + rel = str(md_file.relative_to(docs_dir)) + content = md_file.read_text() + fm, body = parse_frontmatter(content) + md_files[rel] = { + "path": md_file, + "fm": fm, + "body": body, + "title": fm.get("title", ""), + } + + # Match MD files to HTML URLs + used_urls = set() + matches = {} + unmatched_md = [] + + # Pass 1: exact title + similar directory match + for rel, info in md_files.items(): + title = info["title"] + candidates = html_by_title.get(title, []) + if len(candidates) == 1 and candidates[0] not in used_urls: + matches[rel] = candidates[0] + used_urls.add(candidates[0]) + elif len(candidates) > 1: + # Pick the one with the most similar path + md_parts = rel.replace(".md", "").replace("/index", "").split("/") + best = None + best_score = -1 + for c in candidates: + if c in used_urls: + continue + html_parts = c.replace(".html", "").split("/") + # Score: count matching path segments from the start + score = 0 + for mp, hp in zip(md_parts, html_parts): + if mp == hp: + score += 2 + else: + score += SequenceMatcher(None, mp, hp).ratio() + if score > best_score: + best_score = score + best = c + if best: + matches[rel] = best + used_urls.add(best) + + # Pass 2: for unmatched MD files, try fuzzy title + path match against unused HTML + remaining_html = {path: title for path, title in html_pages.items() if path not in used_urls} + + for rel, info in md_files.items(): + if rel in matches: + continue + title = info["title"] + md_parts = rel.replace(".md", "").replace("/index", "").split("/") + + best = None + best_score = -1 + for html_path, html_title in remaining_html.items(): + html_parts = html_path.replace(".html", "").split("/") + + if md_parts[0] != html_parts[0]: + continue + + title_sim = SequenceMatcher(None, title.lower(), html_title.lower()).ratio() + path_sim = SequenceMatcher(None, + "/".join(md_parts), + "/".join(html_parts)).ratio() + score = title_sim * 2 + path_sim + if score > best_score and title_sim >= 0.35: + best_score = score + best = html_path + + if best and best_score >= 1.5: + matches[rel] = best + used_urls.add(best) + del remaining_html[best] + + # Pass 3: match by HTML filename stem against MD filename stem + remaining_html = {path: title for path, title in html_pages.items() if path not in used_urls} + + md_by_stem = {} + for rel, info in md_files.items(): + if rel in matches: + continue + stem = Path(rel).stem + if stem == "index": + stem = Path(rel).parent.name + md_by_stem.setdefault(stem, []).append(rel) + + for html_path, html_title in list(remaining_html.items()): + html_stem = Path(html_path).stem + candidates = md_by_stem.get(html_stem, []) + if len(candidates) == 1: + matches[candidates[0]] = html_path + used_urls.add(html_path) + del remaining_html[html_path] + elif len(candidates) > 1: + html_parts = html_path.replace(".html", "").split("/") + best = None + best_score = -1 + for c in candidates: + md_parts = c.replace(".md", "").replace("/index", "").split("/") + score = sum(1 for a, b in zip(md_parts, html_parts) if a == b) + if score > best_score: + best_score = score + best = c + if best: + matches[best] = html_path + used_urls.add(html_path) + del remaining_html[html_path] + + # Apply slugs + updated = 0 + for rel, html_url in matches.items(): + info = md_files[rel] + slug_val = html_url.replace(".html", "") + + fm = info["fm"] + if fm.get("slug") == slug_val: + continue + + fm["slug"] = slug_val + info["path"].write_text(write_frontmatter(fm, info["body"])) + updated += 1 + + unmatched_count = len(md_files) - len(matches) + unmatched_html = len(html_pages) - len(used_urls) + + print(f"Matched: {len(matches)} MD files to HTML URLs") + print(f"Updated slugs: {updated}") + print(f"Unmatched MD files: {unmatched_count} (new sub-pages, no HTML equivalent)") + print(f"Unmatched HTML pages: {unmatched_html}") + + if unmatched_html > 0: + print("\nUnmatched HTML pages:") + for path in sorted(html_pages.keys()): + if path not in used_urls: + print(f" {path} -> \"{html_pages[path]}\"") + + +if __name__ == "__main__": + main() diff --git a/migration/apply_slugs_v2.py b/migration/apply_slugs_v2.py new file mode 100644 index 0000000..4c21ff2 --- /dev/null +++ b/migration/apply_slugs_v2.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +""" +Smarter slug applier with strict validation. + +For each HTML page in out/en/, find the best MD file match using: +- Same top-level section (mandatory) +- Title similarity >= 0.5 (mandatory) +- Combined score: title_sim * 3 + path_sim * 2 + parent_match * 2 + +Each MD file gets at most one slug. Each slug used at most once. + +Usage: + python3 migration/apply_slugs_v2.py docs /path/to/out/en +""" + +import os +import re +import sys +from pathlib import Path +from difflib import SequenceMatcher + + +def extract_html_title(path): + with open(path, "r", encoding="utf-8", errors="replace") as f: + content = f.read(5000) + m = re.search(r"(.*?)", content, re.IGNORECASE) + return m.group(1).strip() if m else "" + + +def parse_fm(content): + if not content.startswith("---"): + return None, None + try: + end = content.index("---", 3) + except ValueError: + return None, None + return content[3:end], content[end+3:] + + +def get_title(fm): + m = re.search(r'^title:\s*"(.+?)"', fm, re.MULTILINE) + return m.group(1) if m else "" + + +def main(): + docs_dir = Path(sys.argv[1]) + html_dir = Path(sys.argv[2]) + + # Index HTML pages + html_pages = {} + for root, _dirs, files in os.walk(html_dir): + for fname in files: + if not fname.endswith(".html") or fname in ("toc-en.html", "index-en.html"): + continue + full_path = os.path.join(root, fname) + rel_path = os.path.relpath(full_path, html_dir) + title = extract_html_title(full_path) + if title: + html_pages[rel_path] = title + + print(f"Indexed {len(html_pages)} HTML pages") + + # Index MD files + md_files = {} + for md_file in docs_dir.rglob("*.md"): + content = md_file.read_text() + fm, body = parse_fm(content) + if fm is None: + continue + title = get_title(fm) + rel = str(md_file.relative_to(docs_dir)) + natural = rel.replace(".md", "").replace("/index", "") + md_files[rel] = { + "path": md_file, + "title": title, + "natural": natural, + "fm": fm, + "body": body, + } + + print(f"Indexed {len(md_files)} MD files") + + # Score every (html, md) pair within same section + candidates = [] # list of (score, html_url, md_rel, title_sim) + for url, html_title in html_pages.items(): + url_stem = url.replace(".html", "") + url_parts = url_stem.split("/") + url_section = url_parts[0] + url_parent = "/".join(url_parts[:-1]) + url_basename = url_parts[-1] + + for rel, info in md_files.items(): + md_parts = info["natural"].split("/") + if md_parts[0] != url_section: + continue + md_parent = "/".join(md_parts[:-1]) + md_basename = md_parts[-1] + + title_sim = SequenceMatcher(None, info["title"].lower(), html_title.lower()).ratio() + if title_sim < 0.5: + continue + + path_sim = SequenceMatcher(None, info["natural"].lower(), url_stem.lower()).ratio() + basename_sim = SequenceMatcher(None, md_basename.lower(), url_basename.lower()).ratio() + parent_match = 1.0 if url_parent == md_parent else 0.0 + + score = title_sim * 3 + path_sim * 2 + basename_sim + parent_match * 2 + + candidates.append((score, url_stem, rel, title_sim)) + + # Greedy assignment: highest score first, each url and md used at most once + candidates.sort(reverse=True) + used_urls = set() + used_md = set() + matches = {} # md_rel -> slug (url_stem) + + for score, url_stem, md_rel, title_sim in candidates: + if url_stem in used_urls or md_rel in used_md: + continue + # Don't assign if score is too low (likely a poor match) + if score < 4.0: + break + matches[md_rel] = url_stem + used_urls.add(url_stem) + used_md.add(md_rel) + + # Apply slugs (skip if natural path == slug) + applied = 0 + redundant = 0 + for md_rel, slug in matches.items(): + info = md_files[md_rel] + if info["natural"] == slug: + redundant += 1 + continue + fm = info["fm"] + body = info["body"] + fm = fm.rstrip() + f"\nslug: {slug}\n" + info["path"].write_text("---" + fm + "---" + body) + applied += 1 + + unmatched_html = [url for url in html_pages if url.replace(".html", "") not in used_urls] + print(f"Total matches: {len(matches)} (applied {applied}, redundant {redundant})") + print(f"Unmatched HTML: {len(unmatched_html)}") + for u in sorted(unmatched_html)[:20]: + print(f" {u} -> {html_pages[u]}") + + +if __name__ == "__main__": + main() diff --git a/migration/assets/2025-08-05-project-settings.png b/migration/assets/2025-08-05-project-settings.png new file mode 100644 index 0000000..797b318 Binary files /dev/null and b/migration/assets/2025-08-05-project-settings.png differ diff --git a/migration/assets/2025-08-07-access-in-rm-dialog.png b/migration/assets/2025-08-07-access-in-rm-dialog.png new file mode 100644 index 0000000..7525e7d Binary files /dev/null and b/migration/assets/2025-08-07-access-in-rm-dialog.png differ diff --git a/migration/assets/2025-08-07-add-group-to-project.png b/migration/assets/2025-08-07-add-group-to-project.png new file mode 100644 index 0000000..5ca0270 Binary files /dev/null and b/migration/assets/2025-08-07-add-group-to-project.png differ diff --git a/migration/assets/2025-08-07-app-store-metadata.png b/migration/assets/2025-08-07-app-store-metadata.png new file mode 100644 index 0000000..c2d9651 Binary files /dev/null and b/migration/assets/2025-08-07-app-store-metadata.png differ diff --git a/migration/assets/2025-08-07-assign-group-from-workspace.png b/migration/assets/2025-08-07-assign-group-from-workspace.png new file mode 100644 index 0000000..835f9d7 Binary files /dev/null and b/migration/assets/2025-08-07-assign-group-from-workspace.png differ diff --git a/migration/assets/2025-08-07-rm-your-apps-list.png b/migration/assets/2025-08-07-rm-your-apps-list.png new file mode 100644 index 0000000..26b4527 Binary files /dev/null and b/migration/assets/2025-08-07-rm-your-apps-list.png differ diff --git a/migration/assets/2025-08-08-rm-add-automation-dialog.png b/migration/assets/2025-08-08-rm-add-automation-dialog.png new file mode 100644 index 0000000..1416f43 Binary files /dev/null and b/migration/assets/2025-08-08-rm-add-automation-dialog.png differ diff --git a/migration/assets/2025-08-08-rm-add-automation.png b/migration/assets/2025-08-08-rm-add-automation.png new file mode 100644 index 0000000..f6f332e Binary files /dev/null and b/migration/assets/2025-08-08-rm-add-automation.png differ diff --git a/migration/assets/2025-08-08-rm-add-new-app-title.png b/migration/assets/2025-08-08-rm-add-new-app-title.png new file mode 100644 index 0000000..621ddd9 Binary files /dev/null and b/migration/assets/2025-08-08-rm-add-new-app-title.png differ diff --git a/migration/assets/2025-08-08-rm-add-release-automation-preset-dialog.png b/migration/assets/2025-08-08-rm-add-release-automation-preset-dialog.png new file mode 100644 index 0000000..a45951c Binary files /dev/null and b/migration/assets/2025-08-08-rm-add-release-automation-preset-dialog.png differ diff --git a/migration/assets/2025-08-08-rm-auto-upload-toggle.png b/migration/assets/2025-08-08-rm-auto-upload-toggle.png new file mode 100644 index 0000000..7accdf3 Binary files /dev/null and b/migration/assets/2025-08-08-rm-auto-upload-toggle.png differ diff --git a/migration/assets/2025-08-08-rm-change-app-icon.png b/migration/assets/2025-08-08-rm-change-app-icon.png new file mode 100644 index 0000000..78a8dd9 Binary files /dev/null and b/migration/assets/2025-08-08-rm-change-app-icon.png differ diff --git a/migration/assets/2025-08-08-rm-configure-teams-notification.png b/migration/assets/2025-08-08-rm-configure-teams-notification.png new file mode 100644 index 0000000..06af380 Binary files /dev/null and b/migration/assets/2025-08-08-rm-configure-teams-notification.png differ diff --git a/migration/assets/2025-08-08-rm-editing-release-description.png b/migration/assets/2025-08-08-rm-editing-release-description.png new file mode 100644 index 0000000..834ec53 Binary files /dev/null and b/migration/assets/2025-08-08-rm-editing-release-description.png differ diff --git a/migration/assets/2025-08-08-rm-slack-notification.png b/migration/assets/2025-08-08-rm-slack-notification.png new file mode 100644 index 0000000..935e781 Binary files /dev/null and b/migration/assets/2025-08-08-rm-slack-notification.png differ diff --git a/migration/assets/2025-08-08-rm-stop-managing-release-dialog.png b/migration/assets/2025-08-08-rm-stop-managing-release-dialog.png new file mode 100644 index 0000000..de54211 Binary files /dev/null and b/migration/assets/2025-08-08-rm-stop-managing-release-dialog.png differ diff --git a/migration/assets/2025-08-08-rm-stop-managing-release.png b/migration/assets/2025-08-08-rm-stop-managing-release.png new file mode 100644 index 0000000..9cfd391 Binary files /dev/null and b/migration/assets/2025-08-08-rm-stop-managing-release.png differ diff --git a/migration/assets/2025-09-04-rm-what-to-test.png b/migration/assets/2025-09-04-rm-what-to-test.png new file mode 100644 index 0000000..ce3ed92 Binary files /dev/null and b/migration/assets/2025-09-04-rm-what-to-test.png differ diff --git a/migration/assets/2025-09-16-xcode-tab-invocations.png b/migration/assets/2025-09-16-xcode-tab-invocations.png new file mode 100644 index 0000000..551673e Binary files /dev/null and b/migration/assets/2025-09-16-xcode-tab-invocations.png differ diff --git a/migration/assets/2025-09-30-ai-summary.png b/migration/assets/2025-09-30-ai-summary.png new file mode 100644 index 0000000..08b9a25 Binary files /dev/null and b/migration/assets/2025-09-30-ai-summary.png differ diff --git a/migration/assets/2025-09-30-enable-ai-features.png b/migration/assets/2025-09-30-enable-ai-features.png new file mode 100644 index 0000000..67cf39c Binary files /dev/null and b/migration/assets/2025-09-30-enable-ai-features.png differ diff --git a/migration/assets/2025-10-21-choose-build-tool.png b/migration/assets/2025-10-21-choose-build-tool.png new file mode 100644 index 0000000..b5a807a Binary files /dev/null and b/migration/assets/2025-10-21-choose-build-tool.png differ diff --git a/migration/assets/2025-10-21-create-token.png b/migration/assets/2025-10-21-create-token.png new file mode 100644 index 0000000..308f6af Binary files /dev/null and b/migration/assets/2025-10-21-create-token.png differ diff --git a/migration/assets/2025-10-29-outgoing-webhooks-rm.png b/migration/assets/2025-10-29-outgoing-webhooks-rm.png new file mode 100644 index 0000000..f18ca6a Binary files /dev/null and b/migration/assets/2025-10-29-outgoing-webhooks-rm.png differ diff --git a/migration/assets/2025-10-29-release-presets.png b/migration/assets/2025-10-29-release-presets.png new file mode 100644 index 0000000..e051d4d Binary files /dev/null and b/migration/assets/2025-10-29-release-presets.png differ diff --git a/migration/assets/2025-10-29-releases.png b/migration/assets/2025-10-29-releases.png new file mode 100644 index 0000000..a2270f9 Binary files /dev/null and b/migration/assets/2025-10-29-releases.png differ diff --git a/migration/assets/2025-10-29-remove-webhooks-rm.png b/migration/assets/2025-10-29-remove-webhooks-rm.png new file mode 100644 index 0000000..6f521d1 Binary files /dev/null and b/migration/assets/2025-10-29-remove-webhooks-rm.png differ diff --git a/migration/assets/2025-10-29-rm-add-outgoing-webhook.png b/migration/assets/2025-10-29-rm-add-outgoing-webhook.png new file mode 100644 index 0000000..9ca66e9 Binary files /dev/null and b/migration/assets/2025-10-29-rm-add-outgoing-webhook.png differ diff --git a/migration/assets/2025-11-11-aws-iam-provider.png b/migration/assets/2025-11-11-aws-iam-provider.png new file mode 100644 index 0000000..de2192e Binary files /dev/null and b/migration/assets/2025-11-11-aws-iam-provider.png differ diff --git a/migration/assets/2025-11-11-aws-roles.png b/migration/assets/2025-11-11-aws-roles.png new file mode 100644 index 0000000..7295e12 Binary files /dev/null and b/migration/assets/2025-11-11-aws-roles.png differ diff --git a/migration/assets/2025-11-11-custom-trust-policy.png b/migration/assets/2025-11-11-custom-trust-policy.png new file mode 100644 index 0000000..9d4d31a Binary files /dev/null and b/migration/assets/2025-11-11-custom-trust-policy.png differ diff --git a/migration/assets/2025-11-12-get-oidc-token-step.png b/migration/assets/2025-11-12-get-oidc-token-step.png new file mode 100644 index 0000000..c885ab9 Binary files /dev/null and b/migration/assets/2025-11-12-get-oidc-token-step.png differ diff --git a/migration/assets/2025-11-13-bitbucket-app-links.png b/migration/assets/2025-11-13-bitbucket-app-links.png new file mode 100644 index 0000000..9ee9fc3 Binary files /dev/null and b/migration/assets/2025-11-13-bitbucket-app-links.png differ diff --git a/migration/assets/2025-11-13-bitbucket-server-integration.png b/migration/assets/2025-11-13-bitbucket-server-integration.png new file mode 100644 index 0000000..1bfb9c0 Binary files /dev/null and b/migration/assets/2025-11-13-bitbucket-server-integration.png differ diff --git a/migration/assets/2025-11-18-oidc-gcp.png b/migration/assets/2025-11-18-oidc-gcp.png new file mode 100644 index 0000000..e3daa83 Binary files /dev/null and b/migration/assets/2025-11-18-oidc-gcp.png differ diff --git a/migration/assets/2025-12-10-adding-project-with-cli.png b/migration/assets/2025-12-10-adding-project-with-cli.png new file mode 100644 index 0000000..0a8c17f Binary files /dev/null and b/migration/assets/2025-12-10-adding-project-with-cli.png differ diff --git a/migration/assets/2025-12-10-cli-project-choice.png b/migration/assets/2025-12-10-cli-project-choice.png new file mode 100644 index 0000000..a78e3b9 Binary files /dev/null and b/migration/assets/2025-12-10-cli-project-choice.png differ diff --git a/migration/assets/20250808-build-log-tool-setup.png b/migration/assets/20250808-build-log-tool-setup.png new file mode 100644 index 0000000..3dc8d8b Binary files /dev/null and b/migration/assets/20250808-build-log-tool-setup.png differ diff --git a/migration/assets/20251113-bitbucket-credentials.png b/migration/assets/20251113-bitbucket-credentials.png new file mode 100644 index 0000000..ce0b13f Binary files /dev/null and b/migration/assets/20251113-bitbucket-credentials.png differ diff --git a/migration/assets/20251216-configuration-rm.png b/migration/assets/20251216-configuration-rm.png new file mode 100644 index 0000000..f0a6229 Binary files /dev/null and b/migration/assets/20251216-configuration-rm.png differ diff --git a/migration/assets/20251216-rm-presets.png b/migration/assets/20251216-rm-presets.png new file mode 100644 index 0000000..9b17170 Binary files /dev/null and b/migration/assets/20251216-rm-presets.png differ diff --git a/migration/assets/20251217-new-codepush-update-dialog.png b/migration/assets/20251217-new-codepush-update-dialog.png new file mode 100644 index 0000000..86c0a35 Binary files /dev/null and b/migration/assets/20251217-new-codepush-update-dialog.png differ diff --git a/migration/assets/20251217-rm-deployments.png b/migration/assets/20251217-rm-deployments.png new file mode 100644 index 0000000..1f7ebd7 Binary files /dev/null and b/migration/assets/20251217-rm-deployments.png differ diff --git a/migration/assets/20251219-adding-project-workspace-select.png b/migration/assets/20251219-adding-project-workspace-select.png new file mode 100644 index 0000000..069fbfd Binary files /dev/null and b/migration/assets/20251219-adding-project-workspace-select.png differ diff --git a/migration/assets/20251219-authorize-bitrise.png b/migration/assets/20251219-authorize-bitrise.png new file mode 100644 index 0000000..8080bcb Binary files /dev/null and b/migration/assets/20251219-authorize-bitrise.png differ diff --git a/migration/assets/20251219-choose-branch.png b/migration/assets/20251219-choose-branch.png new file mode 100644 index 0000000..fb0778e Binary files /dev/null and b/migration/assets/20251219-choose-branch.png differ diff --git a/migration/assets/20251219-repo-access.png b/migration/assets/20251219-repo-access.png new file mode 100644 index 0000000..11826d3 Binary files /dev/null and b/migration/assets/20251219-repo-access.png differ diff --git a/migration/assets/2025_08_15_step_bundle_conditional_execution_runif.png b/migration/assets/2025_08_15_step_bundle_conditional_execution_runif.png new file mode 100644 index 0000000..844fd7e Binary files /dev/null and b/migration/assets/2025_08_15_step_bundle_conditional_execution_runif.png differ diff --git a/migration/assets/2026-01-20-ai-build-fixer.png b/migration/assets/2026-01-20-ai-build-fixer.png new file mode 100644 index 0000000..b00c635 Binary files /dev/null and b/migration/assets/2026-01-20-ai-build-fixer.png differ diff --git a/migration/assets/2026-03-11-oicd-new-policy.png b/migration/assets/2026-03-11-oicd-new-policy.png new file mode 100644 index 0000000..ea9ee16 Binary files /dev/null and b/migration/assets/2026-03-11-oicd-new-policy.png differ diff --git a/migration/assets/2026-03-11-oicd-trust-policies.png b/migration/assets/2026-03-11-oicd-trust-policies.png new file mode 100644 index 0000000..90a7b7f Binary files /dev/null and b/migration/assets/2026-03-11-oicd-trust-policies.png differ diff --git a/migration/assets/2fa.png b/migration/assets/2fa.png new file mode 100644 index 0000000..35ee03a Binary files /dev/null and b/migration/assets/2fa.png differ diff --git a/migration/assets/3_dots.png b/migration/assets/3_dots.png new file mode 100644 index 0000000..b6deb18 Binary files /dev/null and b/migration/assets/3_dots.png differ diff --git a/migration/assets/3dots_2.png b/migration/assets/3dots_2.png new file mode 100644 index 0000000..22472d5 Binary files /dev/null and b/migration/assets/3dots_2.png differ diff --git a/migration/assets/616541a82bf14.jpg b/migration/assets/616541a82bf14.jpg new file mode 100644 index 0000000..238651c Binary files /dev/null and b/migration/assets/616541a82bf14.jpg differ diff --git a/migration/assets/Add_To_dashboard.png b/migration/assets/Add_To_dashboard.png new file mode 100644 index 0000000..46b3720 Binary files /dev/null and b/migration/assets/Add_To_dashboard.png differ diff --git a/migration/assets/Add_member_new.png b/migration/assets/Add_member_new.png new file mode 100644 index 0000000..5a608f6 Binary files /dev/null and b/migration/assets/Add_member_new.png differ diff --git a/migration/assets/Adding_Apple_ID.png b/migration/assets/Adding_Apple_ID.png new file mode 100644 index 0000000..a019964 Binary files /dev/null and b/migration/assets/Adding_Apple_ID.png differ diff --git a/migration/assets/Adding_step_input.png b/migration/assets/Adding_step_input.png new file mode 100644 index 0000000..0a79546 Binary files /dev/null and b/migration/assets/Adding_step_input.png differ diff --git a/migration/assets/App_life_cycle_with_Applivery_and_Bitrise.png b/migration/assets/App_life_cycle_with_Applivery_and_Bitrise.png new file mode 100644 index 0000000..e27eb24 Binary files /dev/null and b/migration/assets/App_life_cycle_with_Applivery_and_Bitrise.png differ diff --git a/migration/assets/Applivery_Workflow_Step.png b/migration/assets/Applivery_Workflow_Step.png new file mode 100644 index 0000000..892badb Binary files /dev/null and b/migration/assets/Applivery_Workflow_Step.png differ diff --git a/migration/assets/Approving_Pull_Request_builds.png b/migration/assets/Approving_Pull_Request_builds.png new file mode 100644 index 0000000..3108626 Binary files /dev/null and b/migration/assets/Approving_Pull_Request_builds.png differ diff --git a/migration/assets/Automated_app_distribution_workflow.png b/migration/assets/Automated_app_distribution_workflow.png new file mode 100644 index 0000000..3658f79 Binary files /dev/null and b/migration/assets/Automated_app_distribution_workflow.png differ diff --git a/migration/assets/Bitrise_Checks_on_GitHub_Checks.jpg b/migration/assets/Bitrise_Checks_on_GitHub_Checks.jpg new file mode 100644 index 0000000..381f8cc Binary files /dev/null and b/migration/assets/Bitrise_Checks_on_GitHub_Checks.jpg differ diff --git a/migration/assets/Bitrise_Checks_on_GitHub_Checks.png b/migration/assets/Bitrise_Checks_on_GitHub_Checks.png new file mode 100644 index 0000000..a2a32f4 Binary files /dev/null and b/migration/assets/Bitrise_Checks_on_GitHub_Checks.png differ diff --git a/migration/assets/Bitrise_OTA_app_Deployment.png b/migration/assets/Bitrise_OTA_app_Deployment.png new file mode 100644 index 0000000..012bda3 Binary files /dev/null and b/migration/assets/Bitrise_OTA_app_Deployment.png differ diff --git a/migration/assets/Build_logs.png b/migration/assets/Build_logs.png new file mode 100644 index 0000000..48bc365 Binary files /dev/null and b/migration/assets/Build_logs.png differ diff --git a/migration/assets/Can_I_add_projects_with_submodules_or_with_private_repo_dependencies_.png b/migration/assets/Can_I_add_projects_with_submodules_or_with_private_repo_dependencies_.png new file mode 100644 index 0000000..bac16b2 Binary files /dev/null and b/migration/assets/Can_I_add_projects_with_submodules_or_with_private_repo_dependencies_.png differ diff --git a/migration/assets/Certificate_Assistant.png b/migration/assets/Certificate_Assistant.png new file mode 100644 index 0000000..e69d921 Binary files /dev/null and b/migration/assets/Certificate_Assistant.png differ diff --git a/migration/assets/Configuring_Applivery_App_Token.png b/migration/assets/Configuring_Applivery_App_Token.png new file mode 100644 index 0000000..cdd428f Binary files /dev/null and b/migration/assets/Configuring_Applivery_App_Token.png differ diff --git a/migration/assets/Configuring_notifications.png b/migration/assets/Configuring_notifications.png new file mode 100644 index 0000000..d440302 Binary files /dev/null and b/migration/assets/Configuring_notifications.png differ diff --git a/migration/assets/Connecting_self-hosted_GitLab_instances.png b/migration/assets/Connecting_self-hosted_GitLab_instances.png new file mode 100644 index 0000000..973cf3a Binary files /dev/null and b/migration/assets/Connecting_self-hosted_GitLab_instances.png differ diff --git a/migration/assets/Cordova_apps-1.png b/migration/assets/Cordova_apps-1.png new file mode 100644 index 0000000..f9c4ae4 Binary files /dev/null and b/migration/assets/Cordova_apps-1.png differ diff --git a/migration/assets/Cordova_apps.png b/migration/assets/Cordova_apps.png new file mode 100644 index 0000000..2c9bc0a Binary files /dev/null and b/migration/assets/Cordova_apps.png differ diff --git a/migration/assets/Create_dashboard.png b/migration/assets/Create_dashboard.png new file mode 100644 index 0000000..1662abf Binary files /dev/null and b/migration/assets/Create_dashboard.png differ diff --git a/migration/assets/CrossPlatform.png b/migration/assets/CrossPlatform.png new file mode 100644 index 0000000..c460cad Binary files /dev/null and b/migration/assets/CrossPlatform.png differ diff --git a/migration/assets/Deploying_Android_apps_to_Bitrise_and_Google_Play.png b/migration/assets/Deploying_Android_apps_to_Bitrise_and_Google_Play.png new file mode 100644 index 0000000..01279be Binary files /dev/null and b/migration/assets/Deploying_Android_apps_to_Bitrise_and_Google_Play.png differ diff --git a/migration/assets/Deploying_an_iOS_app_for_simulators.png b/migration/assets/Deploying_an_iOS_app_for_simulators.png new file mode 100644 index 0000000..b070e10 Binary files /dev/null and b/migration/assets/Deploying_an_iOS_app_for_simulators.png differ diff --git a/migration/assets/DevCenter_article_gradle_bazel_local_dev_env_guide_-_Google_Docs.png b/migration/assets/DevCenter_article_gradle_bazel_local_dev_env_guide_-_Google_Docs.png new file mode 100644 index 0000000..26e68c9 Binary files /dev/null and b/migration/assets/DevCenter_article_gradle_bazel_local_dev_env_guide_-_Google_Docs.png differ diff --git a/migration/assets/Device_testing_for_Android-1.png b/migration/assets/Device_testing_for_Android-1.png new file mode 100644 index 0000000..36cb441 Binary files /dev/null and b/migration/assets/Device_testing_for_Android-1.png differ diff --git a/migration/assets/Device_testing_for_Android-2.png b/migration/assets/Device_testing_for_Android-2.png new file mode 100644 index 0000000..cedabbe Binary files /dev/null and b/migration/assets/Device_testing_for_Android-2.png differ diff --git a/migration/assets/Device_testing_for_Android-3.png b/migration/assets/Device_testing_for_Android-3.png new file mode 100644 index 0000000..01e4f0a Binary files /dev/null and b/migration/assets/Device_testing_for_Android-3.png differ diff --git a/migration/assets/Device_testing_for_Android.jpg b/migration/assets/Device_testing_for_Android.jpg new file mode 100644 index 0000000..63ecd1d Binary files /dev/null and b/migration/assets/Device_testing_for_Android.jpg differ diff --git a/migration/assets/Device_testing_for_Android.png b/migration/assets/Device_testing_for_Android.png new file mode 100644 index 0000000..ea7e3fa Binary files /dev/null and b/migration/assets/Device_testing_for_Android.png differ diff --git a/migration/assets/Distribution_Page.png b/migration/assets/Distribution_Page.png new file mode 100644 index 0000000..fbdf49d Binary files /dev/null and b/migration/assets/Distribution_Page.png differ diff --git a/migration/assets/Distribution_in_Applivery.png b/migration/assets/Distribution_in_Applivery.png new file mode 100644 index 0000000..581771b Binary files /dev/null and b/migration/assets/Distribution_in_Applivery.png differ diff --git a/migration/assets/Edit_mode.png b/migration/assets/Edit_mode.png new file mode 100644 index 0000000..d5e8901 Binary files /dev/null and b/migration/assets/Edit_mode.png differ diff --git a/migration/assets/Edit_mode_opened.png b/migration/assets/Edit_mode_opened.png new file mode 100644 index 0000000..41ea52c Binary files /dev/null and b/migration/assets/Edit_mode_opened.png differ diff --git a/migration/assets/Export_certificate-1.png b/migration/assets/Export_certificate-1.png new file mode 100644 index 0000000..ce3b09b Binary files /dev/null and b/migration/assets/Export_certificate-1.png differ diff --git a/migration/assets/Export_certificate.png b/migration/assets/Export_certificate.png new file mode 100644 index 0000000..5e9805d Binary files /dev/null and b/migration/assets/Export_certificate.png differ diff --git a/migration/assets/Generate_and_deploy_multiple_flavor_APKs_in_a_single_workflow.jpg b/migration/assets/Generate_and_deploy_multiple_flavor_APKs_in_a_single_workflow.jpg new file mode 100644 index 0000000..8b84068 Binary files /dev/null and b/migration/assets/Generate_and_deploy_multiple_flavor_APKs_in_a_single_workflow.jpg differ diff --git a/migration/assets/Generating_and_deploying_Android_app_bundles-1.jpg b/migration/assets/Generating_and_deploying_Android_app_bundles-1.jpg new file mode 100644 index 0000000..a49e844 Binary files /dev/null and b/migration/assets/Generating_and_deploying_Android_app_bundles-1.jpg differ diff --git a/migration/assets/Generating_and_deploying_Android_app_bundles-2.jpg b/migration/assets/Generating_and_deploying_Android_app_bundles-2.jpg new file mode 100644 index 0000000..50e8198 Binary files /dev/null and b/migration/assets/Generating_and_deploying_Android_app_bundles-2.jpg differ diff --git a/migration/assets/Generating_and_deploying_Android_app_bundles.jpg b/migration/assets/Generating_and_deploying_Android_app_bundles.jpg new file mode 100644 index 0000000..0c2e0dd Binary files /dev/null and b/migration/assets/Generating_and_deploying_Android_app_bundles.jpg differ diff --git a/migration/assets/Getting_started_with_Flutter_apps.jpg b/migration/assets/Getting_started_with_Flutter_apps.jpg new file mode 100644 index 0000000..1b6ed96 Binary files /dev/null and b/migration/assets/Getting_started_with_Flutter_apps.jpg differ diff --git a/migration/assets/Getting_started_with_Flutter_apps.png b/migration/assets/Getting_started_with_Flutter_apps.png new file mode 100644 index 0000000..2c26dc8 Binary files /dev/null and b/migration/assets/Getting_started_with_Flutter_apps.png differ diff --git a/migration/assets/Getting_started_with_MacOS_apps.png b/migration/assets/Getting_started_with_MacOS_apps.png new file mode 100644 index 0000000..bf43234 Binary files /dev/null and b/migration/assets/Getting_started_with_MacOS_apps.png differ diff --git a/migration/assets/Getting_started_with_React_Native_apps-1.png b/migration/assets/Getting_started_with_React_Native_apps-1.png new file mode 100644 index 0000000..d4458f2 Binary files /dev/null and b/migration/assets/Getting_started_with_React_Native_apps-1.png differ diff --git a/migration/assets/Getting_started_with_React_Native_apps.png b/migration/assets/Getting_started_with_React_Native_apps.png new file mode 100644 index 0000000..b1d7203 Binary files /dev/null and b/migration/assets/Getting_started_with_React_Native_apps.png differ diff --git a/migration/assets/Insights_overview.gif b/migration/assets/Insights_overview.gif new file mode 100644 index 0000000..f394724 Binary files /dev/null and b/migration/assets/Insights_overview.gif differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-1.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-1.jpg new file mode 100644 index 0000000..4448eb3 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-1.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-1.png b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-1.png new file mode 100644 index 0000000..e4bccfb Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-1.png differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-10.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-10.jpg new file mode 100644 index 0000000..7f24736 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-10.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-11.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-11.jpg new file mode 100644 index 0000000..ab59be8 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-11.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-2.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-2.jpg new file mode 100644 index 0000000..a57208b Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-2.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-3.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-3.jpg new file mode 100644 index 0000000..3bf6166 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-3.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-4.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-4.jpg new file mode 100644 index 0000000..50ba665 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-4.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-5.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-5.jpg new file mode 100644 index 0000000..ea38b94 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-5.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-6.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-6.jpg new file mode 100644 index 0000000..085bac8 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-6.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-7.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-7.jpg new file mode 100644 index 0000000..4da8090 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-7.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-8.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-8.jpg new file mode 100644 index 0000000..81a7cb4 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-8.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page-9.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-9.jpg new file mode 100644 index 0000000..2f24a5d Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page-9.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page.jpg b/migration/assets/Installing_an_ipa_file_from_the_public_install_page.jpg new file mode 100644 index 0000000..a5f8dda Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page.jpg differ diff --git a/migration/assets/Installing_an_ipa_file_from_the_public_install_page.png b/migration/assets/Installing_an_ipa_file_from_the_public_install_page.png new file mode 100644 index 0000000..a193992 Binary files /dev/null and b/migration/assets/Installing_an_ipa_file_from_the_public_install_page.png differ diff --git a/migration/assets/Installing_and_upgrading_the_offline_Workflow_Editor.png b/migration/assets/Installing_and_upgrading_the_offline_Workflow_Editor.png new file mode 100644 index 0000000..92e2792 Binary files /dev/null and b/migration/assets/Installing_and_upgrading_the_offline_Workflow_Editor.png differ diff --git a/migration/assets/Logs_delete.png b/migration/assets/Logs_delete.png new file mode 100644 index 0000000..c0bb1b2 Binary files /dev/null and b/migration/assets/Logs_delete.png differ diff --git a/migration/assets/Managing_an_app_s_bitrise.png b/migration/assets/Managing_an_app_s_bitrise.png new file mode 100644 index 0000000..68d7589 Binary files /dev/null and b/migration/assets/Managing_an_app_s_bitrise.png differ diff --git a/migration/assets/Managing_releases_new.png b/migration/assets/Managing_releases_new.png new file mode 100644 index 0000000..25cd6ce Binary files /dev/null and b/migration/assets/Managing_releases_new.png differ diff --git a/migration/assets/New_Application.png b/migration/assets/New_Application.png new file mode 100644 index 0000000..f3f14a4 Binary files /dev/null and b/migration/assets/New_Application.png differ diff --git a/migration/assets/New_Application_settings.png b/migration/assets/New_Application_settings.png new file mode 100644 index 0000000..5e10b77 Binary files /dev/null and b/migration/assets/New_Application_settings.png differ diff --git a/migration/assets/Resetting_your_password.png b/migration/assets/Resetting_your_password.png new file mode 100644 index 0000000..74aca9d Binary files /dev/null and b/migration/assets/Resetting_your_password.png differ diff --git a/migration/assets/SCR-20260309-pxsf.png b/migration/assets/SCR-20260309-pxsf.png new file mode 100644 index 0000000..c3f51bf Binary files /dev/null and b/migration/assets/SCR-20260309-pxsf.png differ diff --git a/migration/assets/SCR-20260313-pnzl.png b/migration/assets/SCR-20260313-pnzl.png new file mode 100644 index 0000000..7946e06 Binary files /dev/null and b/migration/assets/SCR-20260313-pnzl.png differ diff --git a/migration/assets/SCR-20260313-pruq.png b/migration/assets/SCR-20260313-pruq.png new file mode 100644 index 0000000..dee58b8 Binary files /dev/null and b/migration/assets/SCR-20260313-pruq.png differ diff --git a/migration/assets/SCR-20260313-ptnr.png b/migration/assets/SCR-20260313-ptnr.png new file mode 100644 index 0000000..e9ed098 Binary files /dev/null and b/migration/assets/SCR-20260313-ptnr.png differ diff --git a/migration/assets/SCR-20260320-mmwy.png b/migration/assets/SCR-20260320-mmwy.png new file mode 100644 index 0000000..1a7663d Binary files /dev/null and b/migration/assets/SCR-20260320-mmwy.png differ diff --git a/migration/assets/SCR-20260320-nqmt.png b/migration/assets/SCR-20260320-nqmt.png new file mode 100644 index 0000000..fc5ad25 Binary files /dev/null and b/migration/assets/SCR-20260320-nqmt.png differ diff --git a/migration/assets/SCR-20260320-nseo.png b/migration/assets/SCR-20260320-nseo.png new file mode 100644 index 0000000..a5e43ce Binary files /dev/null and b/migration/assets/SCR-20260320-nseo.png differ diff --git a/migration/assets/SCR-20260320-nsxn.png b/migration/assets/SCR-20260320-nsxn.png new file mode 100644 index 0000000..23b3dc7 Binary files /dev/null and b/migration/assets/SCR-20260320-nsxn.png differ diff --git a/migration/assets/SCR-20260331-pmhi.png b/migration/assets/SCR-20260331-pmhi.png new file mode 100644 index 0000000..f6c4d70 Binary files /dev/null and b/migration/assets/SCR-20260331-pmhi.png differ diff --git a/migration/assets/SCR-20260331-prho.png b/migration/assets/SCR-20260331-prho.png new file mode 100644 index 0000000..9692a63 Binary files /dev/null and b/migration/assets/SCR-20260331-prho.png differ diff --git a/migration/assets/SCR-20260331-przw.png b/migration/assets/SCR-20260331-przw.png new file mode 100644 index 0000000..d81dd4c Binary files /dev/null and b/migration/assets/SCR-20260331-przw.png differ diff --git a/migration/assets/SCR-20260401-obcc.png b/migration/assets/SCR-20260401-obcc.png new file mode 100644 index 0000000..580bb1c Binary files /dev/null and b/migration/assets/SCR-20260401-obcc.png differ diff --git a/migration/assets/SCR-20260401-pvvq.png b/migration/assets/SCR-20260401-pvvq.png new file mode 100644 index 0000000..aca2804 Binary files /dev/null and b/migration/assets/SCR-20260401-pvvq.png differ diff --git a/migration/assets/Screenshot_2025-03-25_at_09_59_54.png b/migration/assets/Screenshot_2025-03-25_at_09_59_54.png new file mode 100644 index 0000000..821870a Binary files /dev/null and b/migration/assets/Screenshot_2025-03-25_at_09_59_54.png differ diff --git a/migration/assets/Secrets_and_Env_Vars.png b/migration/assets/Secrets_and_Env_Vars.png new file mode 100644 index 0000000..7af5dc8 Binary files /dev/null and b/migration/assets/Secrets_and_Env_Vars.png differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-1.jpg b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-1.jpg new file mode 100644 index 0000000..6742ce5 Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-1.jpg differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-1.png b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-1.png new file mode 100644 index 0000000..17b5d06 Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-1.png differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-2.jpg b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-2.jpg new file mode 100644 index 0000000..b348e56 Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-2.jpg differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-2.png b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-2.png new file mode 100644 index 0000000..fb2b3d2 Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-2.png differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-3.jpg b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-3.jpg new file mode 100644 index 0000000..5b9712f Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-3.jpg differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-4.jpg b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-4.jpg new file mode 100644 index 0000000..7d1313c Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-4.jpg differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-5.jpg b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-5.jpg new file mode 100644 index 0000000..9bed6f0 Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise-5.jpg differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg new file mode 100644 index 0000000..9b344d1 Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise.jpg differ diff --git a/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise.png b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise.png new file mode 100644 index 0000000..76a5d64 Binary files /dev/null and b/migration/assets/Setting_up_Idaptive_SAML_SSO_for_Bitrise.png differ diff --git a/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-1.jpg b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-1.jpg new file mode 100644 index 0000000..02ae58c Binary files /dev/null and b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-1.jpg differ diff --git a/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-1.png b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-1.png new file mode 100644 index 0000000..ceb41ef Binary files /dev/null and b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-1.png differ diff --git a/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-2.jpg b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-2.jpg new file mode 100644 index 0000000..21ced7e Binary files /dev/null and b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise-2.jpg differ diff --git a/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise.jpg b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise.jpg new file mode 100644 index 0000000..3c820a7 Binary files /dev/null and b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise.jpg differ diff --git a/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise.png b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise.png new file mode 100644 index 0000000..10d3a8f Binary files /dev/null and b/migration/assets/Setting_up_OneLogin_SSO_for_Bitrise.png differ diff --git a/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-1.jpg b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-1.jpg new file mode 100644 index 0000000..e0b7782 Binary files /dev/null and b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-1.jpg differ diff --git a/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-2.jpg b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-2.jpg new file mode 100644 index 0000000..cff313c Binary files /dev/null and b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-2.jpg differ diff --git a/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-3.jpg b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-3.jpg new file mode 100644 index 0000000..bb507c2 Binary files /dev/null and b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-3.jpg differ diff --git a/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-4.jpg b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-4.jpg new file mode 100644 index 0000000..571cfde Binary files /dev/null and b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise-4.jpg differ diff --git a/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise.jpg b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise.jpg new file mode 100644 index 0000000..bf273d9 Binary files /dev/null and b/migration/assets/Setting_up_Ping_Identity_SSO_for_Bitrise.jpg differ diff --git a/migration/assets/Sign_in_to_Xcode.png b/migration/assets/Sign_in_to_Xcode.png new file mode 100644 index 0000000..6112eb5 Binary files /dev/null and b/migration/assets/Sign_in_to_Xcode.png differ diff --git a/migration/assets/Starting_parallel_builds_with_a_single_trigger-1.png b/migration/assets/Starting_parallel_builds_with_a_single_trigger-1.png new file mode 100644 index 0000000..2c16e67 Binary files /dev/null and b/migration/assets/Starting_parallel_builds_with_a_single_trigger-1.png differ diff --git a/migration/assets/Starting_parallel_builds_with_a_single_trigger-2.png b/migration/assets/Starting_parallel_builds_with_a_single_trigger-2.png new file mode 100644 index 0000000..1787010 Binary files /dev/null and b/migration/assets/Starting_parallel_builds_with_a_single_trigger-2.png differ diff --git a/migration/assets/Starting_parallel_builds_with_a_single_trigger-3.png b/migration/assets/Starting_parallel_builds_with_a_single_trigger-3.png new file mode 100644 index 0000000..47f69ac Binary files /dev/null and b/migration/assets/Starting_parallel_builds_with_a_single_trigger-3.png differ diff --git a/migration/assets/Starting_parallel_builds_with_a_single_trigger-4.png b/migration/assets/Starting_parallel_builds_with_a_single_trigger-4.png new file mode 100644 index 0000000..a04c63a Binary files /dev/null and b/migration/assets/Starting_parallel_builds_with_a_single_trigger-4.png differ diff --git a/migration/assets/Starting_parallel_builds_with_a_single_trigger.png b/migration/assets/Starting_parallel_builds_with_a_single_trigger.png new file mode 100644 index 0000000..4ab73b2 Binary files /dev/null and b/migration/assets/Starting_parallel_builds_with_a_single_trigger.png differ diff --git a/migration/assets/StepTypes.png b/migration/assets/StepTypes.png new file mode 100644 index 0000000..0f028d1 Binary files /dev/null and b/migration/assets/StepTypes.png differ diff --git a/migration/assets/Team_selector.png b/migration/assets/Team_selector.png new file mode 100644 index 0000000..efab0d7 Binary files /dev/null and b/migration/assets/Team_selector.png differ diff --git a/migration/assets/Verified_Steps.jpg b/migration/assets/Verified_Steps.jpg new file mode 100644 index 0000000..7d2b3c7 Binary files /dev/null and b/migration/assets/Verified_Steps.jpg differ diff --git a/migration/assets/Workflow_selector.png b/migration/assets/Workflow_selector.png new file mode 100644 index 0000000..85d5c9c Binary files /dev/null and b/migration/assets/Workflow_selector.png differ diff --git a/migration/assets/Xcode_team_details.png b/migration/assets/Xcode_team_details.png new file mode 100644 index 0000000..57b59c1 Binary files /dev/null and b/migration/assets/Xcode_team_details.png differ diff --git a/migration/assets/_2025-11-03-runner-pool.png b/migration/assets/_2025-11-03-runner-pool.png new file mode 100644 index 0000000..c945e14 Binary files /dev/null and b/migration/assets/_2025-11-03-runner-pool.png differ diff --git a/migration/assets/account-settings-page.png b/migration/assets/account-settings-page.png new file mode 100644 index 0000000..201a492 Binary files /dev/null and b/migration/assets/account-settings-page.png differ diff --git a/migration/assets/add-android-keystore.png b/migration/assets/add-android-keystore.png new file mode 100644 index 0000000..5f6cf5c Binary files /dev/null and b/migration/assets/add-android-keystore.png differ diff --git a/migration/assets/add-api-key-apple.png b/migration/assets/add-api-key-apple.png new file mode 100644 index 0000000..4f23f11 Binary files /dev/null and b/migration/assets/add-api-key-apple.png differ diff --git a/migration/assets/add-bundle-to-bundle.png b/migration/assets/add-bundle-to-bundle.png new file mode 100644 index 0000000..9a592bd Binary files /dev/null and b/migration/assets/add-bundle-to-bundle.png differ diff --git a/migration/assets/add-dependent-workflow.png b/migration/assets/add-dependent-workflow.png new file mode 100644 index 0000000..33b9ca4 Binary files /dev/null and b/migration/assets/add-dependent-workflow.png differ diff --git a/migration/assets/add-exclusions.png b/migration/assets/add-exclusions.png new file mode 100644 index 0000000..b44c6f9 Binary files /dev/null and b/migration/assets/add-exclusions.png differ diff --git a/migration/assets/add-json-file.png b/migration/assets/add-json-file.png new file mode 100644 index 0000000..e8d5931 Binary files /dev/null and b/migration/assets/add-json-file.png differ diff --git a/migration/assets/add-new-app-newproj.png b/migration/assets/add-new-app-newproj.png new file mode 100644 index 0000000..dcaedf1 Binary files /dev/null and b/migration/assets/add-new-app-newproj.png differ diff --git a/migration/assets/add-new-file.png b/migration/assets/add-new-file.png new file mode 100644 index 0000000..5b7f340 Binary files /dev/null and b/migration/assets/add-new-file.png differ diff --git a/migration/assets/add-outgoing-webhook.png b/migration/assets/add-outgoing-webhook.png new file mode 100644 index 0000000..7e57e69 Binary files /dev/null and b/migration/assets/add-outgoing-webhook.png differ diff --git a/migration/assets/add-owner.png b/migration/assets/add-owner.png new file mode 100644 index 0000000..e8d4bf6 Binary files /dev/null and b/migration/assets/add-owner.png differ diff --git a/migration/assets/add-pool.png b/migration/assets/add-pool.png new file mode 100644 index 0000000..70ac0f6 Binary files /dev/null and b/migration/assets/add-pool.png differ diff --git a/migration/assets/add-workflow-pipeline.png b/migration/assets/add-workflow-pipeline.png new file mode 100644 index 0000000..1a5e866 Binary files /dev/null and b/migration/assets/add-workflow-pipeline.png differ diff --git a/migration/assets/add_approval_task.png b/migration/assets/add_approval_task.png new file mode 100644 index 0000000..0ab95d1 Binary files /dev/null and b/migration/assets/add_approval_task.png differ diff --git a/migration/assets/addanothertrigger.png b/migration/assets/addanothertrigger.png new file mode 100644 index 0000000..bf8fdba Binary files /dev/null and b/migration/assets/addanothertrigger.png differ diff --git a/migration/assets/addappname.jpg b/migration/assets/addappname.jpg new file mode 100644 index 0000000..3670ebf Binary files /dev/null and b/migration/assets/addappname.jpg differ diff --git a/migration/assets/addappsaml.jpg b/migration/assets/addappsaml.jpg new file mode 100644 index 0000000..257739d Binary files /dev/null and b/migration/assets/addappsaml.jpg differ diff --git a/migration/assets/adding-app.png b/migration/assets/adding-app.png new file mode 100644 index 0000000..c2f4123 Binary files /dev/null and b/migration/assets/adding-app.png differ diff --git a/migration/assets/adding-users.png b/migration/assets/adding-users.png new file mode 100644 index 0000000..a3d19e2 Binary files /dev/null and b/migration/assets/adding-users.png differ diff --git a/migration/assets/addnewtrigger.png b/migration/assets/addnewtrigger.png new file mode 100644 index 0000000..e3b97d2 Binary files /dev/null and b/migration/assets/addnewtrigger.png differ diff --git a/migration/assets/addreplyingpartytrust.jpg b/migration/assets/addreplyingpartytrust.jpg new file mode 100644 index 0000000..6cd5d25 Binary files /dev/null and b/migration/assets/addreplyingpartytrust.jpg differ diff --git a/migration/assets/admin-role.png b/migration/assets/admin-role.png new file mode 100644 index 0000000..99c4368 Binary files /dev/null and b/migration/assets/admin-role.png differ diff --git a/migration/assets/after.gif b/migration/assets/after.gif new file mode 100644 index 0000000..c17dd84 Binary files /dev/null and b/migration/assets/after.gif differ diff --git a/migration/assets/agent-logging.png b/migration/assets/agent-logging.png new file mode 100644 index 0000000..42da41a Binary files /dev/null and b/migration/assets/agent-logging.png differ diff --git a/migration/assets/ai-faq-data.png b/migration/assets/ai-faq-data.png new file mode 100644 index 0000000..bf77e6c Binary files /dev/null and b/migration/assets/ai-faq-data.png differ diff --git a/migration/assets/alert-filters.png b/migration/assets/alert-filters.png new file mode 100644 index 0000000..ea467bd Binary files /dev/null and b/migration/assets/alert-filters.png differ diff --git a/migration/assets/alerts.png b/migration/assets/alerts.png new file mode 100644 index 0000000..c575e5d Binary files /dev/null and b/migration/assets/alerts.png differ diff --git a/migration/assets/android-instrumented.png b/migration/assets/android-instrumented.png new file mode 100644 index 0000000..85e9161 Binary files /dev/null and b/migration/assets/android-instrumented.png differ diff --git a/migration/assets/android-lint.png b/migration/assets/android-lint.png new file mode 100644 index 0000000..dfb9275 Binary files /dev/null and b/migration/assets/android-lint.png differ diff --git a/migration/assets/android-unit-test.png b/migration/assets/android-unit-test.png new file mode 100644 index 0000000..2b098fa Binary files /dev/null and b/migration/assets/android-unit-test.png differ diff --git a/migration/assets/android_example.png b/migration/assets/android_example.png new file mode 100644 index 0000000..55fa770 Binary files /dev/null and b/migration/assets/android_example.png differ diff --git a/migration/assets/android_example2.png b/migration/assets/android_example2.png new file mode 100644 index 0000000..f258db8 Binary files /dev/null and b/migration/assets/android_example2.png differ diff --git a/migration/assets/android_example_3.png b/migration/assets/android_example_3.png new file mode 100644 index 0000000..4783ddf Binary files /dev/null and b/migration/assets/android_example_3.png differ diff --git a/migration/assets/annotation-styles.png b/migration/assets/annotation-styles.png new file mode 100644 index 0000000..b275fbb Binary files /dev/null and b/migration/assets/annotation-styles.png differ diff --git a/migration/assets/annotations-expand.gif b/migration/assets/annotations-expand.gif new file mode 100644 index 0000000..5935736 Binary files /dev/null and b/migration/assets/annotations-expand.gif differ diff --git a/migration/assets/api-connect-override.png b/migration/assets/api-connect-override.png new file mode 100644 index 0000000..8bd3038 Binary files /dev/null and b/migration/assets/api-connect-override.png differ diff --git a/migration/assets/api-key-app-store.png b/migration/assets/api-key-app-store.png new file mode 100644 index 0000000..2ae4ded Binary files /dev/null and b/migration/assets/api-key-app-store.png differ diff --git a/migration/assets/api-key-chart.png b/migration/assets/api-key-chart.png new file mode 100644 index 0000000..69f7d18 Binary files /dev/null and b/migration/assets/api-key-chart.png differ diff --git a/migration/assets/api-key-dialog.png b/migration/assets/api-key-dialog.png new file mode 100644 index 0000000..fb7316f Binary files /dev/null and b/migration/assets/api-key-dialog.png differ diff --git a/migration/assets/api-key-enterprise.png b/migration/assets/api-key-enterprise.png new file mode 100644 index 0000000..33e6e17 Binary files /dev/null and b/migration/assets/api-key-enterprise.png differ diff --git a/migration/assets/app-env-vars.png b/migration/assets/app-env-vars.png new file mode 100644 index 0000000..e8e577d Binary files /dev/null and b/migration/assets/app-env-vars.png differ diff --git a/migration/assets/app-icon.png b/migration/assets/app-icon.png new file mode 100644 index 0000000..59350bb Binary files /dev/null and b/migration/assets/app-icon.png differ diff --git a/migration/assets/app-level-secret.png b/migration/assets/app-level-secret.png new file mode 100644 index 0000000..8f10f4c Binary files /dev/null and b/migration/assets/app-level-secret.png differ diff --git a/migration/assets/app-store-api-rm.png b/migration/assets/app-store-api-rm.png new file mode 100644 index 0000000..f969761 Binary files /dev/null and b/migration/assets/app-store-api-rm.png differ diff --git a/migration/assets/app-store-method.png b/migration/assets/app-store-method.png new file mode 100644 index 0000000..7daf772 Binary files /dev/null and b/migration/assets/app-store-method.png differ diff --git a/migration/assets/app-store-release.png b/migration/assets/app-store-release.png new file mode 100644 index 0000000..f7e4073 Binary files /dev/null and b/migration/assets/app-store-release.png differ diff --git a/migration/assets/app-store-review.png b/migration/assets/app-store-review.png new file mode 100644 index 0000000..21b6b7e Binary files /dev/null and b/migration/assets/app-store-review.png differ diff --git a/migration/assets/app_integration_okta.png b/migration/assets/app_integration_okta.png new file mode 100644 index 0000000..6c0a1b0 Binary files /dev/null and b/migration/assets/app_integration_okta.png differ diff --git a/migration/assets/apple-app-store-connect.png b/migration/assets/apple-app-store-connect.png new file mode 100644 index 0000000..82b2b07 Binary files /dev/null and b/migration/assets/apple-app-store-connect.png differ diff --git a/migration/assets/application-onelogin.jpg b/migration/assets/application-onelogin.jpg new file mode 100644 index 0000000..60a4a28 Binary files /dev/null and b/migration/assets/application-onelogin.jpg differ diff --git a/migration/assets/approvalpage_tasks.jpg b/migration/assets/approvalpage_tasks.jpg new file mode 100644 index 0000000..18eaa8f Binary files /dev/null and b/migration/assets/approvalpage_tasks.jpg differ diff --git a/migration/assets/approvalteam.png b/migration/assets/approvalteam.png new file mode 100644 index 0000000..d6ad4d4 Binary files /dev/null and b/migration/assets/approvalteam.png differ diff --git a/migration/assets/apps-filter.png b/migration/assets/apps-filter.png new file mode 100644 index 0000000..59b76ca Binary files /dev/null and b/migration/assets/apps-filter.png differ diff --git a/migration/assets/apps-repository-url.png b/migration/assets/apps-repository-url.png new file mode 100644 index 0000000..3e7942d Binary files /dev/null and b/migration/assets/apps-repository-url.png differ diff --git a/migration/assets/appsamlapp.jpg b/migration/assets/appsamlapp.jpg new file mode 100644 index 0000000..400188f Binary files /dev/null and b/migration/assets/appsamlapp.jpg differ diff --git a/migration/assets/appspecificpassword.jpg b/migration/assets/appspecificpassword.jpg new file mode 100644 index 0000000..0129e0f Binary files /dev/null and b/migration/assets/appspecificpassword.jpg differ diff --git a/migration/assets/assign_people.png b/migration/assets/assign_people.png new file mode 100644 index 0000000..1594dc6 Binary files /dev/null and b/migration/assets/assign_people.png differ diff --git a/migration/assets/assignments_okta.png b/migration/assets/assignments_okta.png new file mode 100644 index 0000000..934c54c Binary files /dev/null and b/migration/assets/assignments_okta.png differ diff --git a/migration/assets/attach-service-account.png b/migration/assets/attach-service-account.png new file mode 100644 index 0000000..4d5540a Binary files /dev/null and b/migration/assets/attach-service-account.png differ diff --git a/migration/assets/authorize-bitbucket.png b/migration/assets/authorize-bitbucket.png new file mode 100644 index 0000000..cd3b22d Binary files /dev/null and b/migration/assets/authorize-bitbucket.png differ diff --git a/migration/assets/authorize-gitlab.png b/migration/assets/authorize-gitlab.png new file mode 100644 index 0000000..9b6b2ab Binary files /dev/null and b/migration/assets/authorize-gitlab.png differ diff --git a/migration/assets/authorize_github.png b/migration/assets/authorize_github.png new file mode 100644 index 0000000..3efa3ee Binary files /dev/null and b/migration/assets/authorize_github.png differ diff --git a/migration/assets/authorizing-app.png b/migration/assets/authorizing-app.png new file mode 100644 index 0000000..69ff4ba Binary files /dev/null and b/migration/assets/authorizing-app.png differ diff --git a/migration/assets/authzero_addappname2.png b/migration/assets/authzero_addappname2.png new file mode 100644 index 0000000..4ecd692 Binary files /dev/null and b/migration/assets/authzero_addappname2.png differ diff --git a/migration/assets/authzero_addon4.png b/migration/assets/authzero_addon4.png new file mode 100644 index 0000000..4527ad5 Binary files /dev/null and b/migration/assets/authzero_addon4.png differ diff --git a/migration/assets/authzero_createapp1.png b/migration/assets/authzero_createapp1.png new file mode 100644 index 0000000..e5e3640 Binary files /dev/null and b/migration/assets/authzero_createapp1.png differ diff --git a/migration/assets/authzero_downloadcertificateusage9.png b/migration/assets/authzero_downloadcertificateusage9.png new file mode 100644 index 0000000..a8ada32 Binary files /dev/null and b/migration/assets/authzero_downloadcertificateusage9.png differ diff --git a/migration/assets/authzero_samlappenabled8.png b/migration/assets/authzero_samlappenabled8.png new file mode 100644 index 0000000..7b759cb Binary files /dev/null and b/migration/assets/authzero_samlappenabled8.png differ diff --git a/migration/assets/authzero_settingsapplicationurl6.png b/migration/assets/authzero_settingsapplicationurl6.png new file mode 100644 index 0000000..bc77fb9 Binary files /dev/null and b/migration/assets/authzero_settingsapplicationurl6.png differ diff --git a/migration/assets/auto-code-signing-input.png b/migration/assets/auto-code-signing-input.png new file mode 100644 index 0000000..fb324e9 Binary files /dev/null and b/migration/assets/auto-code-signing-input.png differ diff --git a/migration/assets/autocomplete.png b/migration/assets/autocomplete.png new file mode 100644 index 0000000..861acca Binary files /dev/null and b/migration/assets/autocomplete.png differ diff --git a/migration/assets/aws-manual-setup-diagram.png b/migration/assets/aws-manual-setup-diagram.png new file mode 100644 index 0000000..cc059dc Binary files /dev/null and b/migration/assets/aws-manual-setup-diagram.png differ diff --git a/migration/assets/aws-markplace-amis.png b/migration/assets/aws-markplace-amis.png new file mode 100644 index 0000000..477f472 Binary files /dev/null and b/migration/assets/aws-markplace-amis.png differ diff --git a/migration/assets/aws-offer-1.png b/migration/assets/aws-offer-1.png new file mode 100644 index 0000000..c5ea57d Binary files /dev/null and b/migration/assets/aws-offer-1.png differ diff --git a/migration/assets/aws-offer-2.png b/migration/assets/aws-offer-2.png new file mode 100644 index 0000000..cd1acf9 Binary files /dev/null and b/migration/assets/aws-offer-2.png differ diff --git a/migration/assets/azureactivedirstep2-1.jpg b/migration/assets/azureactivedirstep2-1.jpg new file mode 100644 index 0000000..555e6d7 Binary files /dev/null and b/migration/assets/azureactivedirstep2-1.jpg differ diff --git a/migration/assets/azureuser1-1.jpg b/migration/assets/azureuser1-1.jpg new file mode 100644 index 0000000..a841827 Binary files /dev/null and b/migration/assets/azureuser1-1.jpg differ diff --git a/migration/assets/azureuser2-1.jpg b/migration/assets/azureuser2-1.jpg new file mode 100644 index 0000000..6438e59 Binary files /dev/null and b/migration/assets/azureuser2-1.jpg differ diff --git a/migration/assets/azureuser3b-1.jpg b/migration/assets/azureuser3b-1.jpg new file mode 100644 index 0000000..687c66d Binary files /dev/null and b/migration/assets/azureuser3b-1.jpg differ diff --git a/migration/assets/baseencoded.jpg b/migration/assets/baseencoded.jpg new file mode 100644 index 0000000..d534bee Binary files /dev/null and b/migration/assets/baseencoded.jpg differ diff --git a/migration/assets/basic-pipeline.png b/migration/assets/basic-pipeline.png new file mode 100644 index 0000000..a775961 Binary files /dev/null and b/migration/assets/basic-pipeline.png differ diff --git a/migration/assets/bazel-local-printout.png b/migration/assets/bazel-local-printout.png new file mode 100644 index 0000000..2dcd2db Binary files /dev/null and b/migration/assets/bazel-local-printout.png differ diff --git a/migration/assets/bell.png b/migration/assets/bell.png new file mode 100644 index 0000000..d6aad97 Binary files /dev/null and b/migration/assets/bell.png differ diff --git a/migration/assets/beta-testing-google-play.png b/migration/assets/beta-testing-google-play.png new file mode 100644 index 0000000..a9655d0 Binary files /dev/null and b/migration/assets/beta-testing-google-play.png differ diff --git a/migration/assets/beta-testing-testflight.png b/migration/assets/beta-testing-testflight.png new file mode 100644 index 0000000..ce3e1f5 Binary files /dev/null and b/migration/assets/beta-testing-testflight.png differ diff --git a/migration/assets/billing-email.png b/migration/assets/billing-email.png new file mode 100644 index 0000000..e632fbb Binary files /dev/null and b/migration/assets/billing-email.png differ diff --git a/migration/assets/bitrise-ci-landing.png b/migration/assets/bitrise-ci-landing.png new file mode 100644 index 0000000..06f626b Binary files /dev/null and b/migration/assets/bitrise-ci-landing.png differ diff --git a/migration/assets/bitrise-runner-diagram.png b/migration/assets/bitrise-runner-diagram.png new file mode 100644 index 0000000..53d5a44 Binary files /dev/null and b/migration/assets/bitrise-runner-diagram.png differ diff --git a/migration/assets/bitrisedashboard.png b/migration/assets/bitrisedashboard.png new file mode 100644 index 0000000..0732114 Binary files /dev/null and b/migration/assets/bitrisedashboard.png differ diff --git a/migration/assets/bottlenecks-menu-option.png b/migration/assets/bottlenecks-menu-option.png new file mode 100644 index 0000000..89a68c1 Binary files /dev/null and b/migration/assets/bottlenecks-menu-option.png differ diff --git a/migration/assets/bottlenecks-overview.png b/migration/assets/bottlenecks-overview.png new file mode 100644 index 0000000..cceac2f Binary files /dev/null and b/migration/assets/bottlenecks-overview.png differ diff --git a/migration/assets/breakdown-tab.png b/migration/assets/breakdown-tab.png new file mode 100644 index 0000000..2bf09c5 Binary files /dev/null and b/migration/assets/breakdown-tab.png differ diff --git a/migration/assets/build-artifact-source.png b/migration/assets/build-artifact-source.png new file mode 100644 index 0000000..ad31818 Binary files /dev/null and b/migration/assets/build-artifact-source.png differ diff --git a/migration/assets/build-details-access.png b/migration/assets/build-details-access.png new file mode 100644 index 0000000..d9e478a Binary files /dev/null and b/migration/assets/build-details-access.png differ diff --git a/migration/assets/build-details-page.png b/migration/assets/build-details-page.png new file mode 100644 index 0000000..a2cb476 Binary files /dev/null and b/migration/assets/build-details-page.png differ diff --git a/migration/assets/build-for-testing-step.png b/migration/assets/build-for-testing-step.png new file mode 100644 index 0000000..1d5e140 Binary files /dev/null and b/migration/assets/build-for-testing-step.png differ diff --git a/migration/assets/build-forui-tsting.png b/migration/assets/build-forui-tsting.png new file mode 100644 index 0000000..e11c39d Binary files /dev/null and b/migration/assets/build-forui-tsting.png differ diff --git a/migration/assets/build-history.png b/migration/assets/build-history.png new file mode 100644 index 0000000..d110692 Binary files /dev/null and b/migration/assets/build-history.png differ diff --git a/migration/assets/build-log-basic.png b/migration/assets/build-log-basic.png new file mode 100644 index 0000000..66957d2 Binary files /dev/null and b/migration/assets/build-log-basic.png differ diff --git a/migration/assets/build-numbering.png b/migration/assets/build-numbering.png new file mode 100644 index 0000000..d8735f7 Binary files /dev/null and b/migration/assets/build-numbering.png differ diff --git a/migration/assets/build-status-badge.png b/migration/assets/build-status-badge.png new file mode 100644 index 0000000..1df57ec Binary files /dev/null and b/migration/assets/build-status-badge.png differ diff --git a/migration/assets/builds-artifacts-tab.png b/migration/assets/builds-artifacts-tab.png new file mode 100644 index 0000000..38f0a1c Binary files /dev/null and b/migration/assets/builds-artifacts-tab.png differ diff --git a/migration/assets/builds-explore.png b/migration/assets/builds-explore.png new file mode 100644 index 0000000..d0bcc67 Binary files /dev/null and b/migration/assets/builds-explore.png differ diff --git a/migration/assets/builds-pr-build-approval.png b/migration/assets/builds-pr-build-approval.png new file mode 100644 index 0000000..0a86d5d Binary files /dev/null and b/migration/assets/builds-pr-build-approval.png differ diff --git a/migration/assets/builds-remote-access.png b/migration/assets/builds-remote-access.png new file mode 100644 index 0000000..a0ed2e7 Binary files /dev/null and b/migration/assets/builds-remote-access.png differ diff --git a/migration/assets/builds-search.png b/migration/assets/builds-search.png new file mode 100644 index 0000000..65a9373 Binary files /dev/null and b/migration/assets/builds-search.png differ diff --git a/migration/assets/builds-ssh-remote-access-instructions.png b/migration/assets/builds-ssh-remote-access-instructions.png new file mode 100644 index 0000000..568438c Binary files /dev/null and b/migration/assets/builds-ssh-remote-access-instructions.png differ diff --git a/migration/assets/builds_timeframe.png b/migration/assets/builds_timeframe.png new file mode 100644 index 0000000..f14dfc8 Binary files /dev/null and b/migration/assets/builds_timeframe.png differ diff --git a/migration/assets/bundle-tab.png b/migration/assets/bundle-tab.png new file mode 100644 index 0000000..7844075 Binary files /dev/null and b/migration/assets/bundle-tab.png differ diff --git a/migration/assets/bundleinput.png b/migration/assets/bundleinput.png new file mode 100644 index 0000000..9ee2981 Binary files /dev/null and b/migration/assets/bundleinput.png differ diff --git a/migration/assets/cache-hit-rate-workflow.png b/migration/assets/cache-hit-rate-workflow.png new file mode 100644 index 0000000..2bdf4c5 Binary files /dev/null and b/migration/assets/cache-hit-rate-workflow.png differ diff --git a/migration/assets/cache-insights-explore.png b/migration/assets/cache-insights-explore.png new file mode 100644 index 0000000..ca36e89 Binary files /dev/null and b/migration/assets/cache-insights-explore.png differ diff --git a/migration/assets/cache-landing-page.png b/migration/assets/cache-landing-page.png new file mode 100644 index 0000000..e2de69e Binary files /dev/null and b/migration/assets/cache-landing-page.png differ diff --git a/migration/assets/cache-new-connection.png b/migration/assets/cache-new-connection.png new file mode 100644 index 0000000..3ee0255 Binary files /dev/null and b/migration/assets/cache-new-connection.png differ diff --git a/migration/assets/carthage-command.png b/migration/assets/carthage-command.png new file mode 100644 index 0000000..04bbd2a Binary files /dev/null and b/migration/assets/carthage-command.png differ diff --git a/migration/assets/case-report-card.png b/migration/assets/case-report-card.png new file mode 100644 index 0000000..1ae1273 Binary files /dev/null and b/migration/assets/case-report-card.png differ diff --git a/migration/assets/certificate-1.jpg b/migration/assets/certificate-1.jpg new file mode 100644 index 0000000..1ab1bd2 Binary files /dev/null and b/migration/assets/certificate-1.jpg differ diff --git a/migration/assets/certificate_and_profile_installer.png b/migration/assets/certificate_and_profile_installer.png new file mode 100644 index 0000000..5cf2df0 Binary files /dev/null and b/migration/assets/certificate_and_profile_installer.png differ diff --git a/migration/assets/certtoken-1.jpg b/migration/assets/certtoken-1.jpg new file mode 100644 index 0000000..4223ab3 Binary files /dev/null and b/migration/assets/certtoken-1.jpg differ diff --git a/migration/assets/certwizard.jpg b/migration/assets/certwizard.jpg new file mode 100644 index 0000000..fc40c9a Binary files /dev/null and b/migration/assets/certwizard.jpg differ diff --git a/migration/assets/chained-workflows.png b/migration/assets/chained-workflows.png new file mode 100644 index 0000000..95d97b3 Binary files /dev/null and b/migration/assets/chained-workflows.png differ diff --git a/migration/assets/chaining-workflows-menu.png b/migration/assets/chaining-workflows-menu.png new file mode 100644 index 0000000..aba73e0 Binary files /dev/null and b/migration/assets/chaining-workflows-menu.png differ diff --git a/migration/assets/change-android-version.png b/migration/assets/change-android-version.png new file mode 100644 index 0000000..aed71c9 Binary files /dev/null and b/migration/assets/change-android-version.png differ diff --git a/migration/assets/change-https-credentials.png b/migration/assets/change-https-credentials.png new file mode 100644 index 0000000..0f1f153 Binary files /dev/null and b/migration/assets/change-https-credentials.png differ diff --git a/migration/assets/checkout.png b/migration/assets/checkout.png new file mode 100644 index 0000000..bd19f94 Binary files /dev/null and b/migration/assets/checkout.png differ diff --git a/migration/assets/checkyourinbox.png b/migration/assets/checkyourinbox.png new file mode 100644 index 0000000..3d487e5 Binary files /dev/null and b/migration/assets/checkyourinbox.png differ diff --git a/migration/assets/chooseruletype.jpg b/migration/assets/chooseruletype.jpg new file mode 100644 index 0000000..1b94c20 Binary files /dev/null and b/migration/assets/chooseruletype.jpg differ diff --git a/migration/assets/claimsaware.jpg b/migration/assets/claimsaware.jpg new file mode 100644 index 0000000..3465841 Binary files /dev/null and b/migration/assets/claimsaware.jpg differ diff --git a/migration/assets/close-small.svg b/migration/assets/close-small.svg new file mode 100644 index 0000000..9fa0b2f --- /dev/null +++ b/migration/assets/close-small.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/migration/assets/cloudformation.png b/migration/assets/cloudformation.png new file mode 100644 index 0000000..09fad49 Binary files /dev/null and b/migration/assets/cloudformation.png differ diff --git a/migration/assets/compare-config-yaml.png b/migration/assets/compare-config-yaml.png new file mode 100644 index 0000000..352eb31 Binary files /dev/null and b/migration/assets/compare-config-yaml.png differ diff --git a/migration/assets/completewizard.jpg b/migration/assets/completewizard.jpg new file mode 100644 index 0000000..dcc67d5 Binary files /dev/null and b/migration/assets/completewizard.jpg differ diff --git a/migration/assets/config-yaml-source.png b/migration/assets/config-yaml-source.png new file mode 100644 index 0000000..a8b09aa Binary files /dev/null and b/migration/assets/config-yaml-source.png differ diff --git a/migration/assets/config-yaml.png b/migration/assets/config-yaml.png new file mode 100644 index 0000000..5a1847a Binary files /dev/null and b/migration/assets/config-yaml.png differ diff --git a/migration/assets/configure-agent-internet-access-bitrise.png b/migration/assets/configure-agent-internet-access-bitrise.png new file mode 100644 index 0000000..a880a00 Binary files /dev/null and b/migration/assets/configure-agent-internet-access-bitrise.png differ diff --git a/migration/assets/configure-bitrise-okta-1.jpg b/migration/assets/configure-bitrise-okta-1.jpg new file mode 100644 index 0000000..b6b66fc Binary files /dev/null and b/migration/assets/configure-bitrise-okta-1.jpg differ diff --git a/migration/assets/configure-source-rm.png b/migration/assets/configure-source-rm.png new file mode 100644 index 0000000..4312901 Binary files /dev/null and b/migration/assets/configure-source-rm.png differ diff --git a/migration/assets/configurePRcomments_debugginginfoinPRcomments.png b/migration/assets/configurePRcomments_debugginginfoinPRcomments.png new file mode 100644 index 0000000..42df8bb Binary files /dev/null and b/migration/assets/configurePRcomments_debugginginfoinPRcomments.png differ diff --git a/migration/assets/configure_update_sso.png b/migration/assets/configure_update_sso.png new file mode 100644 index 0000000..cd77353 Binary files /dev/null and b/migration/assets/configure_update_sso.png differ diff --git a/migration/assets/configureclaimrule.jpg b/migration/assets/configureclaimrule.jpg new file mode 100644 index 0000000..a35da61 Binary files /dev/null and b/migration/assets/configureclaimrule.jpg differ diff --git a/migration/assets/configureurl-1.jpg b/migration/assets/configureurl-1.jpg new file mode 100644 index 0000000..45ebf36 Binary files /dev/null and b/migration/assets/configureurl-1.jpg differ diff --git a/migration/assets/connect-github-app.png b/migration/assets/connect-github-app.png new file mode 100644 index 0000000..b2c3535 Binary files /dev/null and b/migration/assets/connect-github-app.png differ diff --git a/migration/assets/connect-launchdarkly.png b/migration/assets/connect-launchdarkly.png new file mode 100644 index 0000000..79c8b26 Binary files /dev/null and b/migration/assets/connect-launchdarkly.png differ diff --git a/migration/assets/continue-to-launch.png b/migration/assets/continue-to-launch.png new file mode 100644 index 0000000..e3a0d42 Binary files /dev/null and b/migration/assets/continue-to-launch.png differ diff --git a/migration/assets/controller-create-stack.png b/migration/assets/controller-create-stack.png new file mode 100644 index 0000000..8167661 Binary files /dev/null and b/migration/assets/controller-create-stack.png differ diff --git a/migration/assets/controller-diagram.png b/migration/assets/controller-diagram.png new file mode 100644 index 0000000..25eeeb0 Binary files /dev/null and b/migration/assets/controller-diagram.png differ diff --git a/migration/assets/controller-ready.png b/migration/assets/controller-ready.png new file mode 100644 index 0000000..ee753d7 Binary files /dev/null and b/migration/assets/controller-ready.png differ diff --git a/migration/assets/copy-metadat.png b/migration/assets/copy-metadat.png new file mode 100644 index 0000000..522d28a Binary files /dev/null and b/migration/assets/copy-metadat.png differ diff --git a/migration/assets/costliest-app.png b/migration/assets/costliest-app.png new file mode 100644 index 0000000..293f905 Binary files /dev/null and b/migration/assets/costliest-app.png differ diff --git a/migration/assets/costliest-workflow.png b/migration/assets/costliest-workflow.png new file mode 100644 index 0000000..1919ec6 Binary files /dev/null and b/migration/assets/costliest-workflow.png differ diff --git a/migration/assets/create-alert-button.png b/migration/assets/create-alert-button.png new file mode 100644 index 0000000..83dac16 Binary files /dev/null and b/migration/assets/create-alert-button.png differ diff --git a/migration/assets/create-bundle-dialog.png b/migration/assets/create-bundle-dialog.png new file mode 100644 index 0000000..9f8ab59 Binary files /dev/null and b/migration/assets/create-bundle-dialog.png differ diff --git a/migration/assets/create-controller-1-1.png b/migration/assets/create-controller-1-1.png new file mode 100644 index 0000000..3665596 Binary files /dev/null and b/migration/assets/create-controller-1-1.png differ diff --git a/migration/assets/create-controller-1.png b/migration/assets/create-controller-1.png new file mode 100644 index 0000000..ca864ee Binary files /dev/null and b/migration/assets/create-controller-1.png differ diff --git a/migration/assets/create-machine-pool.png b/migration/assets/create-machine-pool.png new file mode 100644 index 0000000..f02cd69 Binary files /dev/null and b/migration/assets/create-machine-pool.png differ diff --git a/migration/assets/create-per-app.png b/migration/assets/create-per-app.png new file mode 100644 index 0000000..28035fa Binary files /dev/null and b/migration/assets/create-per-app.png differ diff --git a/migration/assets/create-pool-security.png b/migration/assets/create-pool-security.png new file mode 100644 index 0000000..7300959 Binary files /dev/null and b/migration/assets/create-pool-security.png differ diff --git a/migration/assets/create-pool.png b/migration/assets/create-pool.png new file mode 100644 index 0000000..7468bb7 Binary files /dev/null and b/migration/assets/create-pool.png differ diff --git a/migration/assets/create-stack-template.png b/migration/assets/create-stack-template.png new file mode 100644 index 0000000..ff49911 Binary files /dev/null and b/migration/assets/create-stack-template.png differ diff --git a/migration/assets/create-step-bundle.png b/migration/assets/create-step-bundle.png new file mode 100644 index 0000000..1a40685 Binary files /dev/null and b/migration/assets/create-step-bundle.png differ diff --git a/migration/assets/create-token.svg b/migration/assets/create-token.svg new file mode 100644 index 0000000..c44d4ac --- /dev/null +++ b/migration/assets/create-token.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/migration/assets/create-variable.png b/migration/assets/create-variable.png new file mode 100644 index 0000000..dc8237b Binary files /dev/null and b/migration/assets/create-variable.png differ diff --git a/migration/assets/create-workflow-1.png b/migration/assets/create-workflow-1.png new file mode 100644 index 0000000..0dd970e Binary files /dev/null and b/migration/assets/create-workflow-1.png differ diff --git a/migration/assets/create-workflow-dialog.png b/migration/assets/create-workflow-dialog.png new file mode 100644 index 0000000..1b225bb Binary files /dev/null and b/migration/assets/create-workflow-dialog.png differ diff --git a/migration/assets/create-workflow.png b/migration/assets/create-workflow.png new file mode 100644 index 0000000..0dd970e Binary files /dev/null and b/migration/assets/create-workflow.png differ diff --git a/migration/assets/create-workspace.png b/migration/assets/create-workspace.png new file mode 100644 index 0000000..83f837f Binary files /dev/null and b/migration/assets/create-workspace.png differ diff --git a/migration/assets/create_new_app_integration.png b/migration/assets/create_new_app_integration.png new file mode 100644 index 0000000..4bb327e Binary files /dev/null and b/migration/assets/create_new_app_integration.png differ diff --git a/migration/assets/createyourownapp-1.jpg b/migration/assets/createyourownapp-1.jpg new file mode 100644 index 0000000..407f637 Binary files /dev/null and b/migration/assets/createyourownapp-1.jpg differ diff --git a/migration/assets/credential_details_2.png b/migration/assets/credential_details_2.png new file mode 100644 index 0000000..b76d71c Binary files /dev/null and b/migration/assets/credential_details_2.png differ diff --git a/migration/assets/credits-page-home.png b/migration/assets/credits-page-home.png new file mode 100644 index 0000000..5cb9855 Binary files /dev/null and b/migration/assets/credits-page-home.png differ diff --git a/migration/assets/cumulative-credits.png b/migration/assets/cumulative-credits.png new file mode 100644 index 0000000..56ba246 Binary files /dev/null and b/migration/assets/cumulative-credits.png differ diff --git a/migration/assets/dashboard-overview.png b/migration/assets/dashboard-overview.png new file mode 100644 index 0000000..0732114 Binary files /dev/null and b/migration/assets/dashboard-overview.png differ diff --git a/migration/assets/dashboards.png b/migration/assets/dashboards.png new file mode 100644 index 0000000..fae17c0 Binary files /dev/null and b/migration/assets/dashboards.png differ diff --git a/migration/assets/demo-wait-seconds-reason.png b/migration/assets/demo-wait-seconds-reason.png new file mode 100644 index 0000000..489e384 Binary files /dev/null and b/migration/assets/demo-wait-seconds-reason.png differ diff --git a/migration/assets/deployiosapptobitrise.png b/migration/assets/deployiosapptobitrise.png new file mode 100644 index 0000000..d697d7b Binary files /dev/null and b/migration/assets/deployiosapptobitrise.png differ diff --git a/migration/assets/details-tab.png b/migration/assets/details-tab.png new file mode 100644 index 0000000..ea019e4 Binary files /dev/null and b/migration/assets/details-tab.png differ diff --git a/migration/assets/developer.png b/migration/assets/developer.png new file mode 100644 index 0000000..d8ef97b Binary files /dev/null and b/migration/assets/developer.png differ diff --git a/migration/assets/dialog-delete-app.png b/migration/assets/dialog-delete-app.png new file mode 100644 index 0000000..01ddeda Binary files /dev/null and b/migration/assets/dialog-delete-app.png differ diff --git a/migration/assets/disable_sso.png b/migration/assets/disable_sso.png new file mode 100644 index 0000000..1dd0928 Binary files /dev/null and b/migration/assets/disable_sso.png differ diff --git a/migration/assets/download-invoice.png b/migration/assets/download-invoice.png new file mode 100644 index 0000000..061f59e Binary files /dev/null and b/migration/assets/download-invoice.png differ diff --git a/migration/assets/drag-and-drop-dep.png b/migration/assets/drag-and-drop-dep.png new file mode 100644 index 0000000..644248e Binary files /dev/null and b/migration/assets/drag-and-drop-dep.png differ diff --git a/migration/assets/edit-2fa.png b/migration/assets/edit-2fa.png new file mode 100644 index 0000000..8b39ebb Binary files /dev/null and b/migration/assets/edit-2fa.png differ diff --git a/migration/assets/edit-alert.png b/migration/assets/edit-alert.png new file mode 100644 index 0000000..8fe2fd5 Binary files /dev/null and b/migration/assets/edit-alert.png differ diff --git a/migration/assets/edit-button-secrets.png b/migration/assets/edit-button-secrets.png new file mode 100644 index 0000000..262c8f7 Binary files /dev/null and b/migration/assets/edit-button-secrets.png differ diff --git a/migration/assets/edit-config.png b/migration/assets/edit-config.png new file mode 100644 index 0000000..d45083b Binary files /dev/null and b/migration/assets/edit-config.png differ diff --git a/migration/assets/edit-outgoing-webhook.png b/migration/assets/edit-outgoing-webhook.png new file mode 100644 index 0000000..b6c1d6d Binary files /dev/null and b/migration/assets/edit-outgoing-webhook.png differ diff --git a/migration/assets/edit-trigger.png b/migration/assets/edit-trigger.png new file mode 100644 index 0000000..2d7fff9 Binary files /dev/null and b/migration/assets/edit-trigger.png differ diff --git a/migration/assets/edit-webhook.svg b/migration/assets/edit-webhook.svg new file mode 100644 index 0000000..562cb50 --- /dev/null +++ b/migration/assets/edit-webhook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/migration/assets/editclaims.jpg b/migration/assets/editclaims.jpg new file mode 100644 index 0000000..44e56cd Binary files /dev/null and b/migration/assets/editclaims.jpg differ diff --git a/migration/assets/editscope-quarantine.png b/migration/assets/editscope-quarantine.png new file mode 100644 index 0000000..f44bd38 Binary files /dev/null and b/migration/assets/editscope-quarantine.png differ diff --git a/migration/assets/enablesinglesignonpage.png b/migration/assets/enablesinglesignonpage.png new file mode 100644 index 0000000..2286cf3 Binary files /dev/null and b/migration/assets/enablesinglesignonpage.png differ diff --git a/migration/assets/enforce_saml.png b/migration/assets/enforce_saml.png new file mode 100644 index 0000000..2b80fdc Binary files /dev/null and b/migration/assets/enforce_saml.png differ diff --git a/migration/assets/enterpriseapps-1.jpg b/migration/assets/enterpriseapps-1.jpg new file mode 100644 index 0000000..9384881 Binary files /dev/null and b/migration/assets/enterpriseapps-1.jpg differ diff --git a/migration/assets/env-ars-whitelabel.png b/migration/assets/env-ars-whitelabel.png new file mode 100644 index 0000000..1bebbbc Binary files /dev/null and b/migration/assets/env-ars-whitelabel.png differ diff --git a/migration/assets/existing-alert.png b/migration/assets/existing-alert.png new file mode 100644 index 0000000..ae8f521 Binary files /dev/null and b/migration/assets/existing-alert.png differ diff --git a/migration/assets/existing-launchdarkly-config.png b/migration/assets/existing-launchdarkly-config.png new file mode 100644 index 0000000..f68f179 Binary files /dev/null and b/migration/assets/existing-launchdarkly-config.png differ diff --git a/migration/assets/explore-builds-example.png b/migration/assets/explore-builds-example.png new file mode 100644 index 0000000..deefc66 Binary files /dev/null and b/migration/assets/explore-builds-example.png differ diff --git a/migration/assets/extending-ci-config.png b/migration/assets/extending-ci-config.png new file mode 100644 index 0000000..30a5bd3 Binary files /dev/null and b/migration/assets/extending-ci-config.png differ diff --git a/migration/assets/fail-severity.png b/migration/assets/fail-severity.png new file mode 100644 index 0000000..5b6feef Binary files /dev/null and b/migration/assets/fail-severity.png differ diff --git a/migration/assets/failed-build-history.png b/migration/assets/failed-build-history.png new file mode 100644 index 0000000..6b4593d Binary files /dev/null and b/migration/assets/failed-build-history.png differ diff --git a/migration/assets/failure-rate-tab.png b/migration/assets/failure-rate-tab.png new file mode 100644 index 0000000..a1cd596 Binary files /dev/null and b/migration/assets/failure-rate-tab.png differ diff --git a/migration/assets/filenamesave.jpg b/migration/assets/filenamesave.jpg new file mode 100644 index 0000000..669afa8 Binary files /dev/null and b/migration/assets/filenamesave.jpg differ diff --git a/migration/assets/filter-by-workflow.png b/migration/assets/filter-by-workflow.png new file mode 100644 index 0000000..d1c6984 Binary files /dev/null and b/migration/assets/filter-by-workflow.png differ diff --git a/migration/assets/filter-test-suite.png b/migration/assets/filter-test-suite.png new file mode 100644 index 0000000..4b7c675 Binary files /dev/null and b/migration/assets/filter-test-suite.png differ diff --git a/migration/assets/filtering_highlight.png b/migration/assets/filtering_highlight.png new file mode 100644 index 0000000..cac1092 Binary files /dev/null and b/migration/assets/filtering_highlight.png differ diff --git a/migration/assets/finish.jpg b/migration/assets/finish.jpg new file mode 100644 index 0000000..f6b1249 Binary files /dev/null and b/migration/assets/finish.jpg differ diff --git a/migration/assets/fix-build-with-ai.png b/migration/assets/fix-build-with-ai.png new file mode 100644 index 0000000..3188c76 Binary files /dev/null and b/migration/assets/fix-build-with-ai.png differ diff --git a/migration/assets/fix-with-ai.png b/migration/assets/fix-with-ai.png new file mode 100644 index 0000000..944d366 Binary files /dev/null and b/migration/assets/fix-with-ai.png differ diff --git a/migration/assets/flakiest-app.png b/migration/assets/flakiest-app.png new file mode 100644 index 0000000..db7e5d3 Binary files /dev/null and b/migration/assets/flakiest-app.png differ diff --git a/migration/assets/flakiest-test-suite.png b/migration/assets/flakiest-test-suite.png new file mode 100644 index 0000000..9566085 Binary files /dev/null and b/migration/assets/flakiest-test-suite.png differ diff --git a/migration/assets/flakiness-bottlenecks.png b/migration/assets/flakiness-bottlenecks.png new file mode 100644 index 0000000..f451f20 Binary files /dev/null and b/migration/assets/flakiness-bottlenecks.png differ diff --git a/migration/assets/flaky-runs-tab.png b/migration/assets/flaky-runs-tab.png new file mode 100644 index 0000000..b7f3631 Binary files /dev/null and b/migration/assets/flaky-runs-tab.png differ diff --git a/migration/assets/flutter-build-ios-config.png b/migration/assets/flutter-build-ios-config.png new file mode 100644 index 0000000..757fefd Binary files /dev/null and b/migration/assets/flutter-build-ios-config.png differ diff --git a/migration/assets/flutter-build-step.png b/migration/assets/flutter-build-step.png new file mode 100644 index 0000000..53eda29 Binary files /dev/null and b/migration/assets/flutter-build-step.png differ diff --git a/migration/assets/flutter-install-step.png b/migration/assets/flutter-install-step.png new file mode 100644 index 0000000..bb3a09f Binary files /dev/null and b/migration/assets/flutter-install-step.png differ diff --git a/migration/assets/flutter-test-files-pattern.png b/migration/assets/flutter-test-files-pattern.png new file mode 100644 index 0000000..ae738c5 Binary files /dev/null and b/migration/assets/flutter-test-files-pattern.png differ diff --git a/migration/assets/flutter-test-step.png b/migration/assets/flutter-test-step.png new file mode 100644 index 0000000..29bfbe2 Binary files /dev/null and b/migration/assets/flutter-test-step.png differ diff --git a/migration/assets/gen-cordova-build.png b/migration/assets/gen-cordova-build.png new file mode 100644 index 0000000..5545b3b Binary files /dev/null and b/migration/assets/gen-cordova-build.png differ diff --git a/migration/assets/general_settings_okta.png b/migration/assets/general_settings_okta.png new file mode 100644 index 0000000..05c1467 Binary files /dev/null and b/migration/assets/general_settings_okta.png differ diff --git a/migration/assets/generate-xcode-reports_input.png b/migration/assets/generate-xcode-reports_input.png new file mode 100644 index 0000000..32e3ad8 Binary files /dev/null and b/migration/assets/generate-xcode-reports_input.png differ diff --git a/migration/assets/get-started-ci-page.png b/migration/assets/get-started-ci-page.png new file mode 100644 index 0000000..c071bbb Binary files /dev/null and b/migration/assets/get-started-ci-page.png differ diff --git a/migration/assets/get_started_bitrise.png b/migration/assets/get_started_bitrise.png new file mode 100644 index 0000000..d90014e Binary files /dev/null and b/migration/assets/get_started_bitrise.png differ diff --git a/migration/assets/getting-to-workflows.png b/migration/assets/getting-to-workflows.png new file mode 100644 index 0000000..09f936b Binary files /dev/null and b/migration/assets/getting-to-workflows.png differ diff --git a/migration/assets/gettingstarted.png b/migration/assets/gettingstarted.png new file mode 100644 index 0000000..e620eef Binary files /dev/null and b/migration/assets/gettingstarted.png differ diff --git a/migration/assets/git-main-chart.png b/migration/assets/git-main-chart.png new file mode 100644 index 0000000..5ba0850 Binary files /dev/null and b/migration/assets/git-main-chart.png differ diff --git a/migration/assets/git-repo-source.png b/migration/assets/git-repo-source.png new file mode 100644 index 0000000..cd76f34 Binary files /dev/null and b/migration/assets/git-repo-source.png differ diff --git a/migration/assets/git_-insights.png b/migration/assets/git_-insights.png new file mode 100644 index 0000000..b859897 Binary files /dev/null and b/migration/assets/git_-insights.png differ diff --git a/migration/assets/git_credentials.png b/migration/assets/git_credentials.png new file mode 100644 index 0000000..48f9da6 Binary files /dev/null and b/migration/assets/git_credentials.png differ diff --git a/migration/assets/github-account-connection.png b/migration/assets/github-account-connection.png new file mode 100644 index 0000000..c2caee2 Binary files /dev/null and b/migration/assets/github-account-connection.png differ diff --git a/migration/assets/github-fine-grained-token-permissions.png b/migration/assets/github-fine-grained-token-permissions.png new file mode 100644 index 0000000..300f116 Binary files /dev/null and b/migration/assets/github-fine-grained-token-permissions.png differ diff --git a/migration/assets/github-webhook-permissions.png b/migration/assets/github-webhook-permissions.png new file mode 100644 index 0000000..8cb2c4d Binary files /dev/null and b/migration/assets/github-webhook-permissions.png differ diff --git a/migration/assets/github_checks_install.png b/migration/assets/github_checks_install.png new file mode 100644 index 0000000..0f2bbad Binary files /dev/null and b/migration/assets/github_checks_install.png differ diff --git a/migration/assets/gitlab-webhook-settings.png b/migration/assets/gitlab-webhook-settings.png new file mode 100644 index 0000000..f6e4c55 Binary files /dev/null and b/migration/assets/gitlab-webhook-settings.png differ diff --git a/migration/assets/google-play-ready-to-upload.png b/migration/assets/google-play-ready-to-upload.png new file mode 100644 index 0000000..3e1d29d Binary files /dev/null and b/migration/assets/google-play-ready-to-upload.png differ diff --git a/migration/assets/google-service-account_png.png b/migration/assets/google-service-account_png.png new file mode 100644 index 0000000..127317a Binary files /dev/null and b/migration/assets/google-service-account_png.png differ diff --git a/migration/assets/googleadmin-apps.jpg b/migration/assets/googleadmin-apps.jpg new file mode 100644 index 0000000..2cc9c9a Binary files /dev/null and b/migration/assets/googleadmin-apps.jpg differ diff --git a/migration/assets/gradle-cache-image.png b/migration/assets/gradle-cache-image.png new file mode 100644 index 0000000..f40ac46 Binary files /dev/null and b/migration/assets/gradle-cache-image.png differ diff --git a/migration/assets/gradle-runner.png b/migration/assets/gradle-runner.png new file mode 100644 index 0000000..61d2985 Binary files /dev/null and b/migration/assets/gradle-runner.png differ diff --git a/migration/assets/html-test-result.png b/migration/assets/html-test-result.png new file mode 100644 index 0000000..302210b Binary files /dev/null and b/migration/assets/html-test-result.png differ diff --git a/migration/assets/huawei_api.png b/migration/assets/huawei_api.png new file mode 100644 index 0000000..4ba283a Binary files /dev/null and b/migration/assets/huawei_api.png differ diff --git a/migration/assets/huawei_step.png b/migration/assets/huawei_step.png new file mode 100644 index 0000000..bfde7e0 Binary files /dev/null and b/migration/assets/huawei_step.png differ diff --git a/migration/assets/iOS_example_2.png b/migration/assets/iOS_example_2.png new file mode 100644 index 0000000..aa8196f Binary files /dev/null and b/migration/assets/iOS_example_2.png differ diff --git a/migration/assets/iOS_example_modified.png b/migration/assets/iOS_example_modified.png new file mode 100644 index 0000000..4187883 Binary files /dev/null and b/migration/assets/iOS_example_modified.png differ diff --git a/migration/assets/identityproviderdetails.jpg b/migration/assets/identityproviderdetails.jpg new file mode 100644 index 0000000..02f9813 Binary files /dev/null and b/migration/assets/identityproviderdetails.jpg differ diff --git a/migration/assets/image1.png b/migration/assets/image1.png new file mode 100644 index 0000000..81443ce Binary files /dev/null and b/migration/assets/image1.png differ diff --git a/migration/assets/insights-landing.png b/migration/assets/insights-landing.png new file mode 100644 index 0000000..cb4213b Binary files /dev/null and b/migration/assets/insights-landing.png differ diff --git a/migration/assets/insights-quarantine.png b/migration/assets/insights-quarantine.png new file mode 100644 index 0000000..9b1c5a3 Binary files /dev/null and b/migration/assets/insights-quarantine.png differ diff --git a/migration/assets/install-sdk.png b/migration/assets/install-sdk.png new file mode 100644 index 0000000..b22ea0c Binary files /dev/null and b/migration/assets/install-sdk.png differ diff --git a/migration/assets/install-the-app.png b/migration/assets/install-the-app.png new file mode 100644 index 0000000..9361780 Binary files /dev/null and b/migration/assets/install-the-app.png differ diff --git a/migration/assets/installable-artifacts-2.png b/migration/assets/installable-artifacts-2.png new file mode 100644 index 0000000..0248aa2 Binary files /dev/null and b/migration/assets/installable-artifacts-2.png differ diff --git a/migration/assets/installable-artifacts-api.png b/migration/assets/installable-artifacts-api.png new file mode 100644 index 0000000..22ffcfb Binary files /dev/null and b/migration/assets/installable-artifacts-api.png differ diff --git a/migration/assets/integrations-id.png b/migration/assets/integrations-id.png new file mode 100644 index 0000000..79e96d8 Binary files /dev/null and b/migration/assets/integrations-id.png differ diff --git a/migration/assets/inv-compare.png b/migration/assets/inv-compare.png new file mode 100644 index 0000000..84d3a96 Binary files /dev/null and b/migration/assets/inv-compare.png differ diff --git a/migration/assets/invocation-diffing.png b/migration/assets/invocation-diffing.png new file mode 100644 index 0000000..7e95c6d Binary files /dev/null and b/migration/assets/invocation-diffing.png differ diff --git a/migration/assets/invocations-significant.png b/migration/assets/invocations-significant.png new file mode 100644 index 0000000..e93dce3 Binary files /dev/null and b/migration/assets/invocations-significant.png differ diff --git a/migration/assets/ios-certificate-dialog.png b/migration/assets/ios-certificate-dialog.png new file mode 100644 index 0000000..7d047c7 Binary files /dev/null and b/migration/assets/ios-certificate-dialog.png differ diff --git a/migration/assets/ios-device-testing.png b/migration/assets/ios-device-testing.png new file mode 100644 index 0000000..4be6e19 Binary files /dev/null and b/migration/assets/ios-device-testing.png differ diff --git a/migration/assets/ios-download-rm.png b/migration/assets/ios-download-rm.png new file mode 100644 index 0000000..923f739 Binary files /dev/null and b/migration/assets/ios-download-rm.png differ diff --git a/migration/assets/ios-simulator-destination.png b/migration/assets/ios-simulator-destination.png new file mode 100644 index 0000000..565d830 Binary files /dev/null and b/migration/assets/ios-simulator-destination.png differ diff --git a/migration/assets/iosdevicetesting-flakytests.png b/migration/assets/iosdevicetesting-flakytests.png new file mode 100644 index 0000000..64c34b6 Binary files /dev/null and b/migration/assets/iosdevicetesting-flakytests.png differ diff --git a/migration/assets/ipafile.png b/migration/assets/ipafile.png new file mode 100644 index 0000000..5401cc2 Binary files /dev/null and b/migration/assets/ipafile.png differ diff --git a/migration/assets/issues-list.png b/migration/assets/issues-list.png new file mode 100644 index 0000000..2fc5e7c Binary files /dev/null and b/migration/assets/issues-list.png differ diff --git a/migration/assets/keystore-alias.png b/migration/assets/keystore-alias.png new file mode 100644 index 0000000..64fae96 Binary files /dev/null and b/migration/assets/keystore-alias.png differ diff --git a/migration/assets/last-commit.png b/migration/assets/last-commit.png new file mode 100644 index 0000000..fed67f7 Binary files /dev/null and b/migration/assets/last-commit.png differ diff --git a/migration/assets/launchdarkly.png b/migration/assets/launchdarkly.png new file mode 100644 index 0000000..3c015a6 Binary files /dev/null and b/migration/assets/launchdarkly.png differ diff --git a/migration/assets/license-mgt.png b/migration/assets/license-mgt.png new file mode 100644 index 0000000..1cf55c1 Binary files /dev/null and b/migration/assets/license-mgt.png differ diff --git a/migration/assets/license-wfe.png b/migration/assets/license-wfe.png new file mode 100644 index 0000000..97778cb Binary files /dev/null and b/migration/assets/license-wfe.png differ diff --git a/migration/assets/license_pools.png b/migration/assets/license_pools.png new file mode 100644 index 0000000..66e2d17 Binary files /dev/null and b/migration/assets/license_pools.png differ diff --git a/migration/assets/linkGroup.png b/migration/assets/linkGroup.png new file mode 100644 index 0000000..39d51c5 Binary files /dev/null and b/migration/assets/linkGroup.png differ diff --git a/migration/assets/linkadditionalrepositories.png b/migration/assets/linkadditionalrepositories.png new file mode 100644 index 0000000..fce3688 Binary files /dev/null and b/migration/assets/linkadditionalrepositories.png differ diff --git a/migration/assets/local-result-pattern.png b/migration/assets/local-result-pattern.png new file mode 100644 index 0000000..6fee25b Binary files /dev/null and b/migration/assets/local-result-pattern.png differ diff --git a/migration/assets/locked-artifact.png b/migration/assets/locked-artifact.png new file mode 100644 index 0000000..bffc224 Binary files /dev/null and b/migration/assets/locked-artifact.png differ diff --git a/migration/assets/macOS_export_method.png b/migration/assets/macOS_export_method.png new file mode 100644 index 0000000..bd494cb Binary files /dev/null and b/migration/assets/macOS_export_method.png differ diff --git a/migration/assets/machine-type-selector.png b/migration/assets/machine-type-selector.png new file mode 100644 index 0000000..0b18c32 Binary files /dev/null and b/migration/assets/machine-type-selector.png differ diff --git a/migration/assets/manage-ios-code-1.png b/migration/assets/manage-ios-code-1.png new file mode 100644 index 0000000..545f1bf Binary files /dev/null and b/migration/assets/manage-ios-code-1.png differ diff --git a/migration/assets/manage-ios-code.png b/migration/assets/manage-ios-code.png new file mode 100644 index 0000000..545f1bf Binary files /dev/null and b/migration/assets/manage-ios-code.png differ diff --git a/migration/assets/manage-key-based-caching.png b/migration/assets/manage-key-based-caching.png new file mode 100644 index 0000000..07149c9 Binary files /dev/null and b/migration/assets/manage-key-based-caching.png differ diff --git a/migration/assets/manage-release-button.png b/migration/assets/manage-release-button.png new file mode 100644 index 0000000..afbdc60 Binary files /dev/null and b/migration/assets/manage-release-button.png differ diff --git a/migration/assets/manage-tester-group.png b/migration/assets/manage-tester-group.png new file mode 100644 index 0000000..5e648bb Binary files /dev/null and b/migration/assets/manage-tester-group.png differ diff --git a/migration/assets/managingquarantinedtests.png b/migration/assets/managingquarantinedtests.png new file mode 100644 index 0000000..33faaa6 Binary files /dev/null and b/migration/assets/managingquarantinedtests.png differ diff --git a/migration/assets/manual-build-priority.png b/migration/assets/manual-build-priority.png new file mode 100644 index 0000000..12fffa1 Binary files /dev/null and b/migration/assets/manual-build-priority.png differ diff --git a/migration/assets/manual-webhooks.png b/migration/assets/manual-webhooks.png new file mode 100644 index 0000000..c9a61cc Binary files /dev/null and b/migration/assets/manual-webhooks.png differ diff --git a/migration/assets/metric-type.png b/migration/assets/metric-type.png new file mode 100644 index 0000000..e561242 Binary files /dev/null and b/migration/assets/metric-type.png differ diff --git a/migration/assets/most-failing-app-test.png b/migration/assets/most-failing-app-test.png new file mode 100644 index 0000000..0aab2ea Binary files /dev/null and b/migration/assets/most-failing-app-test.png differ diff --git a/migration/assets/most-failing-app.png b/migration/assets/most-failing-app.png new file mode 100644 index 0000000..0b3670d Binary files /dev/null and b/migration/assets/most-failing-app.png differ diff --git a/migration/assets/move-project-button.png b/migration/assets/move-project-button.png new file mode 100644 index 0000000..17545b0 Binary files /dev/null and b/migration/assets/move-project-button.png differ diff --git a/migration/assets/move-project-dialog.png b/migration/assets/move-project-dialog.png new file mode 100644 index 0000000..1fd5c9a Binary files /dev/null and b/migration/assets/move-project-dialog.png differ diff --git a/migration/assets/move-project.png b/migration/assets/move-project.png new file mode 100644 index 0000000..5b2f0d2 Binary files /dev/null and b/migration/assets/move-project.png differ diff --git a/migration/assets/multiple-dependent-flows.png b/migration/assets/multiple-dependent-flows.png new file mode 100644 index 0000000..c367f2a Binary files /dev/null and b/migration/assets/multiple-dependent-flows.png differ diff --git a/migration/assets/multiple-stack-state-change.svg b/migration/assets/multiple-stack-state-change.svg new file mode 100644 index 0000000..4970342 --- /dev/null +++ b/migration/assets/multiple-stack-state-change.svg @@ -0,0 +1,2 @@ +


Ubuntu Jammy - 2025 Edition

Ubuntu Jammy - 2025 Edition


2024
2024
2025
2025
2026
2026
2027
2027
2028
2028
2029
2029

Ubuntu Noble - 2025 Edition

Ubuntu Noble - 202...




Ubuntu 26.04 - 2026 Edition

Ubuntu 26.04 - 2026 E...


Removed
Remov...
Stable
Stab...
Frozen
Froz...
Edge
Edge

Ubuntu Focal - Bitrise Edition 

Ubuntu Focal - Bitrise...

Ubuntu 26.04 - 2027 Edition

Ubuntu 26.04 - 2027 E...


Ubuntu 28.04 - 2027 Edition

Ubuntu 28.04 -...

Ubuntu 26.04 LTS release*

Ubuntu 26.04 LT...

Ubuntu 28.04 LTS release*

Ubuntu 28.04 LT...
 Stack uses Ubuntu Focal 20.04
 Stack uses Ubuntu Focal 20.04
 Stack uses Ubuntu Jammy 22.04
 Stack uses Ubuntu Jammy 22.04
 Stack uses Ubuntu Noble 24.04
 Stack uses Ubuntu Noble 24.04
 Stack uses Ubuntu 26.04
 Stack uses Ubuntu 26.04
 Stack uses Ubuntu 28.04
 Stack uses Ubuntu 28.04
*estimate based on previous years
*estimate based on previ...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/migration/assets/multipleGithuborgs.png b/migration/assets/multipleGithuborgs.png new file mode 100644 index 0000000..c22525b Binary files /dev/null and b/migration/assets/multipleGithuborgs.png differ diff --git a/migration/assets/multipleexport.png b/migration/assets/multipleexport.png new file mode 100644 index 0000000..1769b52 Binary files /dev/null and b/migration/assets/multipleexport.png differ diff --git a/migration/assets/mygreat-project-name.png b/migration/assets/mygreat-project-name.png new file mode 100644 index 0000000..f55b5c6 Binary files /dev/null and b/migration/assets/mygreat-project-name.png differ diff --git a/migration/assets/mygreat-project.png b/migration/assets/mygreat-project.png new file mode 100644 index 0000000..eafcbdb Binary files /dev/null and b/migration/assets/mygreat-project.png differ diff --git a/migration/assets/new-dg-step.png b/migration/assets/new-dg-step.png new file mode 100644 index 0000000..ef157dc Binary files /dev/null and b/migration/assets/new-dg-step.png differ diff --git a/migration/assets/newapplication-jpg.jpg b/migration/assets/newapplication-jpg.jpg new file mode 100644 index 0000000..94578a2 Binary files /dev/null and b/migration/assets/newapplication-jpg.jpg differ diff --git a/migration/assets/newrule.jpg b/migration/assets/newrule.jpg new file mode 100644 index 0000000..f994232 Binary files /dev/null and b/migration/assets/newrule.jpg differ diff --git a/migration/assets/notifications.png b/migration/assets/notifications.png new file mode 100644 index 0000000..b793ed4 Binary files /dev/null and b/migration/assets/notifications.png differ diff --git a/migration/assets/npm-test.png b/migration/assets/npm-test.png new file mode 100644 index 0000000..1ae54b1 Binary files /dev/null and b/migration/assets/npm-test.png differ diff --git a/migration/assets/okta_2.png b/migration/assets/okta_2.png new file mode 100644 index 0000000..e1ae276 Binary files /dev/null and b/migration/assets/okta_2.png differ diff --git a/migration/assets/optionalconfigure.jpg b/migration/assets/optionalconfigure.jpg new file mode 100644 index 0000000..2bc4dca Binary files /dev/null and b/migration/assets/optionalconfigure.jpg differ diff --git a/migration/assets/overview-credits.png b/migration/assets/overview-credits.png new file mode 100644 index 0000000..723ce7c Binary files /dev/null and b/migration/assets/overview-credits.png differ diff --git a/migration/assets/owners-tab-workspace-settings.png b/migration/assets/owners-tab-workspace-settings.png new file mode 100644 index 0000000..9ec1e5c Binary files /dev/null and b/migration/assets/owners-tab-workspace-settings.png differ diff --git a/migration/assets/p90-uploads.png b/migration/assets/p90-uploads.png new file mode 100644 index 0000000..592d39f Binary files /dev/null and b/migration/assets/p90-uploads.png differ diff --git a/migration/assets/permiteveryone.jpg b/migration/assets/permiteveryone.jpg new file mode 100644 index 0000000..d7f17c9 Binary files /dev/null and b/migration/assets/permiteveryone.jpg differ diff --git a/migration/assets/phased-release-7-day.png b/migration/assets/phased-release-7-day.png new file mode 100644 index 0000000..cb13a37 Binary files /dev/null and b/migration/assets/phased-release-7-day.png differ diff --git a/migration/assets/phased-rollout-cancel.png b/migration/assets/phased-rollout-cancel.png new file mode 100644 index 0000000..0a85c23 Binary files /dev/null and b/migration/assets/phased-rollout-cancel.png differ diff --git a/migration/assets/phased-rollout.png b/migration/assets/phased-rollout.png new file mode 100644 index 0000000..8a90c66 Binary files /dev/null and b/migration/assets/phased-rollout.png differ diff --git a/migration/assets/pic1.jpg b/migration/assets/pic1.jpg new file mode 100644 index 0000000..adfff45 Binary files /dev/null and b/migration/assets/pic1.jpg differ diff --git a/migration/assets/pic2.jpg b/migration/assets/pic2.jpg new file mode 100644 index 0000000..7ffd74d Binary files /dev/null and b/migration/assets/pic2.jpg differ diff --git a/migration/assets/pic3.jpg b/migration/assets/pic3.jpg new file mode 100644 index 0000000..780fce0 Binary files /dev/null and b/migration/assets/pic3.jpg differ diff --git a/migration/assets/pic4.png b/migration/assets/pic4.png new file mode 100644 index 0000000..4c4d72c Binary files /dev/null and b/migration/assets/pic4.png differ diff --git a/migration/assets/pipeline-example.png b/migration/assets/pipeline-example.png new file mode 100644 index 0000000..be454ed Binary files /dev/null and b/migration/assets/pipeline-example.png differ diff --git a/migration/assets/pipeline-intermediate.png b/migration/assets/pipeline-intermediate.png new file mode 100644 index 0000000..c644051 Binary files /dev/null and b/migration/assets/pipeline-intermediate.png differ diff --git a/migration/assets/pipeline-priority.png b/migration/assets/pipeline-priority.png new file mode 100644 index 0000000..6830166 Binary files /dev/null and b/migration/assets/pipeline-priority.png differ diff --git a/migration/assets/pipelinebuild-quarantine.png b/migration/assets/pipelinebuild-quarantine.png new file mode 100644 index 0000000..87951b6 Binary files /dev/null and b/migration/assets/pipelinebuild-quarantine.png differ diff --git a/migration/assets/plan-select.png b/migration/assets/plan-select.png new file mode 100644 index 0000000..ce0a57c Binary files /dev/null and b/migration/assets/plan-select.png differ diff --git a/migration/assets/platform-engineer-role.png b/migration/assets/platform-engineer-role.png new file mode 100644 index 0000000..5c13507 Binary files /dev/null and b/migration/assets/platform-engineer-role.png differ diff --git a/migration/assets/platform-landing.png b/migration/assets/platform-landing.png new file mode 100644 index 0000000..5588901 Binary files /dev/null and b/migration/assets/platform-landing.png differ diff --git a/migration/assets/pod-install.png b/migration/assets/pod-install.png new file mode 100644 index 0000000..e132eef Binary files /dev/null and b/migration/assets/pod-install.png differ diff --git a/migration/assets/pool-detail.png b/migration/assets/pool-detail.png new file mode 100644 index 0000000..5d8cff6 Binary files /dev/null and b/migration/assets/pool-detail.png differ diff --git a/migration/assets/prev-vers.png b/migration/assets/prev-vers.png new file mode 100644 index 0000000..963ad60 Binary files /dev/null and b/migration/assets/prev-vers.png differ diff --git a/migration/assets/prewarm.png b/migration/assets/prewarm.png new file mode 100644 index 0000000..d16fe30 Binary files /dev/null and b/migration/assets/prewarm.png differ diff --git a/migration/assets/produced_links-ai-build-fixer.png b/migration/assets/produced_links-ai-build-fixer.png new file mode 100644 index 0000000..f8b4978 Binary files /dev/null and b/migration/assets/produced_links-ai-build-fixer.png differ diff --git a/migration/assets/profile-settings-menu.png b/migration/assets/profile-settings-menu.png new file mode 100644 index 0000000..7bf2b76 Binary files /dev/null and b/migration/assets/profile-settings-menu.png differ diff --git a/migration/assets/project-card-dashboard.png b/migration/assets/project-card-dashboard.png new file mode 100644 index 0000000..a198249 Binary files /dev/null and b/migration/assets/project-card-dashboard.png differ diff --git a/migration/assets/project-list.png b/migration/assets/project-list.png new file mode 100644 index 0000000..6a77186 Binary files /dev/null and b/migration/assets/project-list.png differ diff --git a/migration/assets/project-settings-button-1.png b/migration/assets/project-settings-button-1.png new file mode 100644 index 0000000..4011f11 Binary files /dev/null and b/migration/assets/project-settings-button-1.png differ diff --git a/migration/assets/project-settings-button.png b/migration/assets/project-settings-button.png new file mode 100644 index 0000000..4011f11 Binary files /dev/null and b/migration/assets/project-settings-button.png differ diff --git a/migration/assets/project-settings-main-page.png b/migration/assets/project-settings-main-page.png new file mode 100644 index 0000000..6f0e49e Binary files /dev/null and b/migration/assets/project-settings-main-page.png differ diff --git a/migration/assets/project_selector_arrow.png b/migration/assets/project_selector_arrow.png new file mode 100644 index 0000000..88f552f Binary files /dev/null and b/migration/assets/project_selector_arrow.png differ diff --git a/migration/assets/project_settings_debugginginfoinPRs.png b/migration/assets/project_settings_debugginginfoinPRs.png new file mode 100644 index 0000000..ddf179c Binary files /dev/null and b/migration/assets/project_settings_debugginginfoinPRs.png differ diff --git a/migration/assets/provisioning_settings.png b/migration/assets/provisioning_settings.png new file mode 100644 index 0000000..c66d3a8 Binary files /dev/null and b/migration/assets/provisioning_settings.png differ diff --git a/migration/assets/push-trigger.png b/migration/assets/push-trigger.png new file mode 100644 index 0000000..a79fc14 Binary files /dev/null and b/migration/assets/push-trigger.png differ diff --git a/migration/assets/push_groups.png b/migration/assets/push_groups.png new file mode 100644 index 0000000..860a9f0 Binary files /dev/null and b/migration/assets/push_groups.png differ diff --git a/migration/assets/push_now.png b/migration/assets/push_now.png new file mode 100644 index 0000000..2b241c4 Binary files /dev/null and b/migration/assets/push_now.png differ diff --git a/migration/assets/push_status_active.png b/migration/assets/push_status_active.png new file mode 100644 index 0000000..d69dde9 Binary files /dev/null and b/migration/assets/push_status_active.png differ diff --git a/migration/assets/qr-code-install.png b/migration/assets/qr-code-install.png new file mode 100644 index 0000000..506cd06 Binary files /dev/null and b/migration/assets/qr-code-install.png differ diff --git a/migration/assets/re_run_test.png b/migration/assets/re_run_test.png new file mode 100644 index 0000000..67d5db6 Binary files /dev/null and b/migration/assets/re_run_test.png differ diff --git a/migration/assets/readytoaddtrust.jpg b/migration/assets/readytoaddtrust.jpg new file mode 100644 index 0000000..f70c974 Binary files /dev/null and b/migration/assets/readytoaddtrust.jpg differ diff --git a/migration/assets/recent-deliveries.svg b/migration/assets/recent-deliveries.svg new file mode 100644 index 0000000..7370500 --- /dev/null +++ b/migration/assets/recent-deliveries.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/migration/assets/redeliver.svg b/migration/assets/redeliver.svg new file mode 100644 index 0000000..0bac144 --- /dev/null +++ b/migration/assets/redeliver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/migration/assets/regenerate-token.png b/migration/assets/regenerate-token.png new file mode 100644 index 0000000..955c91f Binary files /dev/null and b/migration/assets/regenerate-token.png differ diff --git a/migration/assets/regex-button.png b/migration/assets/regex-button.png new file mode 100644 index 0000000..9be144c Binary files /dev/null and b/migration/assets/regex-button.png differ diff --git a/migration/assets/register-device-button.png b/migration/assets/register-device-button.png new file mode 100644 index 0000000..46f56b9 Binary files /dev/null and b/migration/assets/register-device-button.png differ diff --git a/migration/assets/register-yes.png b/migration/assets/register-yes.png new file mode 100644 index 0000000..4828de1 Binary files /dev/null and b/migration/assets/register-yes.png differ diff --git a/migration/assets/registering-test-devices.png b/migration/assets/registering-test-devices.png new file mode 100644 index 0000000..9e8228c Binary files /dev/null and b/migration/assets/registering-test-devices.png differ diff --git a/migration/assets/related-builds.png b/migration/assets/related-builds.png new file mode 100644 index 0000000..cd35798 Binary files /dev/null and b/migration/assets/related-builds.png differ diff --git a/migration/assets/related-test-cases-runs-tab.png b/migration/assets/related-test-cases-runs-tab.png new file mode 100644 index 0000000..4dffb80 Binary files /dev/null and b/migration/assets/related-test-cases-runs-tab.png differ diff --git a/migration/assets/related-test-cases.png b/migration/assets/related-test-cases.png new file mode 100644 index 0000000..80a1874 Binary files /dev/null and b/migration/assets/related-test-cases.png differ diff --git a/migration/assets/release-man-connect-app.png b/migration/assets/release-man-connect-app.png new file mode 100644 index 0000000..7db18ff Binary files /dev/null and b/migration/assets/release-man-connect-app.png differ diff --git a/migration/assets/release-management-landing.png b/migration/assets/release-management-landing.png new file mode 100644 index 0000000..81b5ad0 Binary files /dev/null and b/migration/assets/release-management-landing.png differ diff --git a/migration/assets/release-note-preset.png b/migration/assets/release-note-preset.png new file mode 100644 index 0000000..0435722 Binary files /dev/null and b/migration/assets/release-note-preset.png differ diff --git a/migration/assets/release-notes-menu.png b/migration/assets/release-notes-menu.png new file mode 100644 index 0000000..45c641f Binary files /dev/null and b/migration/assets/release-notes-menu.png differ diff --git a/migration/assets/release-presets-notif.png b/migration/assets/release-presets-notif.png new file mode 100644 index 0000000..343c728 Binary files /dev/null and b/migration/assets/release-presets-notif.png differ diff --git a/migration/assets/release-scheduled.png b/migration/assets/release-scheduled.png new file mode 100644 index 0000000..af0d308 Binary files /dev/null and b/migration/assets/release-scheduled.png differ diff --git a/migration/assets/release-version.png b/migration/assets/release-version.png new file mode 100644 index 0000000..9bfbd5e Binary files /dev/null and b/migration/assets/release-version.png differ diff --git a/migration/assets/remove-group.png b/migration/assets/remove-group.png new file mode 100644 index 0000000..26864f0 Binary files /dev/null and b/migration/assets/remove-group.png differ diff --git a/migration/assets/remove-people.png b/migration/assets/remove-people.png new file mode 100644 index 0000000..2b026ab Binary files /dev/null and b/migration/assets/remove-people.png differ diff --git a/migration/assets/remove_member_confirm.png b/migration/assets/remove_member_confirm.png new file mode 100644 index 0000000..798c3a7 Binary files /dev/null and b/migration/assets/remove_member_confirm.png differ diff --git a/migration/assets/remove_png.png b/migration/assets/remove_png.png new file mode 100644 index 0000000..01b9cd2 Binary files /dev/null and b/migration/assets/remove_png.png differ diff --git a/migration/assets/rename-int.png b/migration/assets/rename-int.png new file mode 100644 index 0000000..27c2d15 Binary files /dev/null and b/migration/assets/rename-int.png differ diff --git a/migration/assets/reorder-workflow-chain.png b/migration/assets/reorder-workflow-chain.png new file mode 100644 index 0000000..ff4b601 Binary files /dev/null and b/migration/assets/reorder-workflow-chain.png differ diff --git a/migration/assets/repetition.png b/migration/assets/repetition.png new file mode 100644 index 0000000..3776f71 Binary files /dev/null and b/migration/assets/repetition.png differ diff --git a/migration/assets/replyingidentifiers2.jpg b/migration/assets/replyingidentifiers2.jpg new file mode 100644 index 0000000..872760d Binary files /dev/null and b/migration/assets/replyingidentifiers2.jpg differ diff --git a/migration/assets/reportingbuildproblemsfirstpic.png b/migration/assets/reportingbuildproblemsfirstpic.png new file mode 100644 index 0000000..6fddf5d Binary files /dev/null and b/migration/assets/reportingbuildproblemsfirstpic.png differ diff --git a/migration/assets/reportingbuildproblemssecondpic.png b/migration/assets/reportingbuildproblemssecondpic.png new file mode 100644 index 0000000..23e4960 Binary files /dev/null and b/migration/assets/reportingbuildproblemssecondpic.png differ diff --git a/migration/assets/reportingbuildproblemsthirdpic.png b/migration/assets/reportingbuildproblemsthirdpic.png new file mode 100644 index 0000000..9b2d2e4 Binary files /dev/null and b/migration/assets/reportingbuildproblemsthirdpic.png differ diff --git a/migration/assets/restore-dart-cache.png b/migration/assets/restore-dart-cache.png new file mode 100644 index 0000000..7e6817f Binary files /dev/null and b/migration/assets/restore-dart-cache.png differ diff --git a/migration/assets/restore-gradle.png b/migration/assets/restore-gradle.png new file mode 100644 index 0000000..3218271 Binary files /dev/null and b/migration/assets/restore-gradle.png differ diff --git a/migration/assets/restore-npm-cache.png b/migration/assets/restore-npm-cache.png new file mode 100644 index 0000000..9278060 Binary files /dev/null and b/migration/assets/restore-npm-cache.png differ diff --git a/migration/assets/restore-pods.png b/migration/assets/restore-pods.png new file mode 100644 index 0000000..fb09d89 Binary files /dev/null and b/migration/assets/restore-pods.png differ diff --git a/migration/assets/restore_spm-cache.png b/migration/assets/restore_spm-cache.png new file mode 100644 index 0000000..daaec37 Binary files /dev/null and b/migration/assets/restore_spm-cache.png differ diff --git a/migration/assets/resume-rollout.png b/migration/assets/resume-rollout.png new file mode 100644 index 0000000..c9ce766 Binary files /dev/null and b/migration/assets/resume-rollout.png differ diff --git a/migration/assets/rolling-builds.png b/migration/assets/rolling-builds.png new file mode 100644 index 0000000..07c5271 Binary files /dev/null and b/migration/assets/rolling-builds.png differ diff --git a/migration/assets/run-if-previous-failed.png b/migration/assets/run-if-previous-failed.png new file mode 100644 index 0000000..f20adfa Binary files /dev/null and b/migration/assets/run-if-previous-failed.png differ diff --git a/migration/assets/run-if-template.png b/migration/assets/run-if-template.png new file mode 100644 index 0000000..531a6ca Binary files /dev/null and b/migration/assets/run-if-template.png differ diff --git a/migration/assets/run-npm-command.png b/migration/assets/run-npm-command.png new file mode 100644 index 0000000..f2d7a68 Binary files /dev/null and b/migration/assets/run-npm-command.png differ diff --git a/migration/assets/run_workflow_edit.png b/migration/assets/run_workflow_edit.png new file mode 100644 index 0000000..05cf01f Binary files /dev/null and b/migration/assets/run_workflow_edit.png differ diff --git a/migration/assets/saml_sso_config.png b/migration/assets/saml_sso_config.png new file mode 100644 index 0000000..a8c53ff Binary files /dev/null and b/migration/assets/saml_sso_config.png differ diff --git a/migration/assets/saml_sso_config_samlsso2.png b/migration/assets/saml_sso_config_samlsso2.png new file mode 100644 index 0000000..b1430f2 Binary files /dev/null and b/migration/assets/saml_sso_config_samlsso2.png differ diff --git a/migration/assets/saml_sso_setup.png b/migration/assets/saml_sso_setup.png new file mode 100644 index 0000000..d32af95 Binary files /dev/null and b/migration/assets/saml_sso_setup.png differ diff --git a/migration/assets/saml_sso_url.png b/migration/assets/saml_sso_url.png new file mode 100644 index 0000000..ca85b96 Binary files /dev/null and b/migration/assets/saml_sso_url.png differ diff --git a/migration/assets/saml_status.png b/migration/assets/saml_status.png new file mode 100644 index 0000000..f0b5b36 Binary files /dev/null and b/migration/assets/saml_status.png differ diff --git a/migration/assets/schedule-basic.png b/migration/assets/schedule-basic.png new file mode 100644 index 0000000..8a2c24e Binary files /dev/null and b/migration/assets/schedule-basic.png differ diff --git a/migration/assets/scheduled-build.png b/migration/assets/scheduled-build.png new file mode 100644 index 0000000..64f212f Binary files /dev/null and b/migration/assets/scheduled-build.png differ diff --git a/migration/assets/scheduling-builds.png b/migration/assets/scheduling-builds.png new file mode 100644 index 0000000..9126ccc Binary files /dev/null and b/migration/assets/scheduling-builds.png differ diff --git a/migration/assets/scheme-input.png b/migration/assets/scheme-input.png new file mode 100644 index 0000000..e1733c5 Binary files /dev/null and b/migration/assets/scheme-input.png differ diff --git a/migration/assets/scim_connection_2.png b/migration/assets/scim_connection_2.png new file mode 100644 index 0000000..26eb770 Binary files /dev/null and b/migration/assets/scim_connection_2.png differ diff --git a/migration/assets/scim_provisioning.png b/migration/assets/scim_provisioning.png new file mode 100644 index 0000000..8a56833 Binary files /dev/null and b/migration/assets/scim_provisioning.png differ diff --git a/migration/assets/scim_setting.png b/migration/assets/scim_setting.png new file mode 100644 index 0000000..7d5f39f Binary files /dev/null and b/migration/assets/scim_setting.png differ diff --git a/migration/assets/script-param.png b/migration/assets/script-param.png new file mode 100644 index 0000000..a29cbf1 Binary files /dev/null and b/migration/assets/script-param.png differ diff --git a/migration/assets/secrets-screenshot.png b/migration/assets/secrets-screenshot.png new file mode 100644 index 0000000..69299c1 Binary files /dev/null and b/migration/assets/secrets-screenshot.png differ diff --git a/migration/assets/select-artifact.png b/migration/assets/select-artifact.png new file mode 100644 index 0000000..64c8314 Binary files /dev/null and b/migration/assets/select-artifact.png differ diff --git a/migration/assets/select-branch.png b/migration/assets/select-branch.png new file mode 100644 index 0000000..2ea4539 Binary files /dev/null and b/migration/assets/select-branch.png differ diff --git a/migration/assets/select-button.png b/migration/assets/select-button.png new file mode 100644 index 0000000..ff191a3 Binary files /dev/null and b/migration/assets/select-button.png differ diff --git a/migration/assets/select-repository.png b/migration/assets/select-repository.png new file mode 100644 index 0000000..88c6c5c Binary files /dev/null and b/migration/assets/select-repository.png differ diff --git a/migration/assets/select_branch.png b/migration/assets/select_branch.png new file mode 100644 index 0000000..f24b230 Binary files /dev/null and b/migration/assets/select_branch.png differ diff --git a/migration/assets/select_git_repo.png b/migration/assets/select_git_repo.png new file mode 100644 index 0000000..3f9ecae Binary files /dev/null and b/migration/assets/select_git_repo.png differ diff --git a/migration/assets/selectdatasource.jpg b/migration/assets/selectdatasource.jpg new file mode 100644 index 0000000..92ac4ce Binary files /dev/null and b/migration/assets/selectdatasource.jpg differ diff --git a/migration/assets/selectuve-builds.png b/migration/assets/selectuve-builds.png new file mode 100644 index 0000000..784da2f Binary files /dev/null and b/migration/assets/selectuve-builds.png differ diff --git a/migration/assets/self-hosted-gitlab.png b/migration/assets/self-hosted-gitlab.png new file mode 100644 index 0000000..5d6a9b0 Binary files /dev/null and b/migration/assets/self-hosted-gitlab.png differ diff --git a/migration/assets/service-account-rm.png b/migration/assets/service-account-rm.png new file mode 100644 index 0000000..eafdd5a Binary files /dev/null and b/migration/assets/service-account-rm.png differ diff --git a/migration/assets/service-credential-user.png b/migration/assets/service-credential-user.png new file mode 100644 index 0000000..4910c3f Binary files /dev/null and b/migration/assets/service-credential-user.png differ diff --git a/migration/assets/serviceproviderdetails.jpg b/migration/assets/serviceproviderdetails.jpg new file mode 100644 index 0000000..dcea81f Binary files /dev/null and b/migration/assets/serviceproviderdetails.jpg differ diff --git a/migration/assets/settings-third-party-steps.png b/migration/assets/settings-third-party-steps.png new file mode 100644 index 0000000..852f7d4 Binary files /dev/null and b/migration/assets/settings-third-party-steps.png differ diff --git a/migration/assets/shard-calculate-product-path.png b/migration/assets/shard-calculate-product-path.png new file mode 100644 index 0000000..8cf781f Binary files /dev/null and b/migration/assets/shard-calculate-product-path.png differ diff --git a/migration/assets/shards-deploy-to-bitrise.png b/migration/assets/shards-deploy-to-bitrise.png new file mode 100644 index 0000000..a6e0b18 Binary files /dev/null and b/migration/assets/shards-deploy-to-bitrise.png differ diff --git a/migration/assets/shards-pipeline.png b/migration/assets/shards-pipeline.png new file mode 100644 index 0000000..aa87615 Binary files /dev/null and b/migration/assets/shards-pipeline.png differ diff --git a/migration/assets/shared-res.png b/migration/assets/shared-res.png new file mode 100644 index 0000000..26fc971 Binary files /dev/null and b/migration/assets/shared-res.png differ diff --git a/migration/assets/show-config-yaml.png b/migration/assets/show-config-yaml.png new file mode 100644 index 0000000..4f2da09 Binary files /dev/null and b/migration/assets/show-config-yaml.png differ diff --git a/migration/assets/sign-up-saml.png b/migration/assets/sign-up-saml.png new file mode 100644 index 0000000..57f6175 Binary files /dev/null and b/migration/assets/sign-up-saml.png differ diff --git a/migration/assets/sign_up.png b/migration/assets/sign_up.png new file mode 100644 index 0000000..933a942 Binary files /dev/null and b/migration/assets/sign_up.png differ diff --git a/migration/assets/singlesignonazuread.png b/migration/assets/singlesignonazuread.png new file mode 100644 index 0000000..a596dc1 Binary files /dev/null and b/migration/assets/singlesignonazuread.png differ diff --git a/migration/assets/singlesignonsummary.jpg b/migration/assets/singlesignonsummary.jpg new file mode 100644 index 0000000..0c31401 Binary files /dev/null and b/migration/assets/singlesignonsummary.jpg differ diff --git a/migration/assets/slack-int-rm.png b/migration/assets/slack-int-rm.png new file mode 100644 index 0000000..6f764bf Binary files /dev/null and b/migration/assets/slack-int-rm.png differ diff --git a/migration/assets/slack-inte.png b/migration/assets/slack-inte.png new file mode 100644 index 0000000..54bbe08 Binary files /dev/null and b/migration/assets/slack-inte.png differ diff --git a/migration/assets/specifydisplayname.jpg b/migration/assets/specifydisplayname.jpg new file mode 100644 index 0000000..6034e98 Binary files /dev/null and b/migration/assets/specifydisplayname.jpg differ diff --git a/migration/assets/sso-certificate.png b/migration/assets/sso-certificate.png new file mode 100644 index 0000000..037c449 Binary files /dev/null and b/migration/assets/sso-certificate.png differ diff --git a/migration/assets/sso-setup.png b/migration/assets/sso-setup.png new file mode 100644 index 0000000..ad26008 Binary files /dev/null and b/migration/assets/sso-setup.png differ diff --git a/migration/assets/sso2-1.jpg b/migration/assets/sso2-1.jpg new file mode 100644 index 0000000..d5a6fe8 Binary files /dev/null and b/migration/assets/sso2-1.jpg differ diff --git a/migration/assets/sso2a-1.jpg b/migration/assets/sso2a-1.jpg new file mode 100644 index 0000000..5137176 Binary files /dev/null and b/migration/assets/sso2a-1.jpg differ diff --git a/migration/assets/sso3-2.jpg b/migration/assets/sso3-2.jpg new file mode 100644 index 0000000..8f3998b Binary files /dev/null and b/migration/assets/sso3-2.jpg differ diff --git a/migration/assets/stable-stack.png b/migration/assets/stable-stack.png new file mode 100644 index 0000000..aef76f6 Binary files /dev/null and b/migration/assets/stable-stack.png differ diff --git a/migration/assets/stack-lifecycle.png b/migration/assets/stack-lifecycle.png new file mode 100644 index 0000000..8b621c4 Binary files /dev/null and b/migration/assets/stack-lifecycle.png differ diff --git a/migration/assets/stack-select.png b/migration/assets/stack-select.png new file mode 100644 index 0000000..855dc7f Binary files /dev/null and b/migration/assets/stack-select.png differ diff --git a/migration/assets/stack-state-change.svg b/migration/assets/stack-state-change.svg new file mode 100644 index 0000000..9c2b7b8 --- /dev/null +++ b/migration/assets/stack-state-change.svg @@ -0,0 +1 @@ +
Not updated
Builds cannot be launched on it
Not updated...
Removed
Removed
Tooling changes
Experimental features
Tooling changes...
Edge
Edge
Update frequency: often
Update frequency: often
Reliable with rarely changing tools
Reliable with rarely changing t...
Stable
Stable
Update frequency: only critical and required updates
Update frequency: only critical...
w
Soon to be removed
Consider migrating to a newer stack
Soon to be removed...
Frozen
Frozen
Update frequency: not receiving updates
Update frequency: not re...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/migration/assets/stack-updates-edge-beta.png b/migration/assets/stack-updates-edge-beta.png new file mode 100644 index 0000000..c9bf427 Binary files /dev/null and b/migration/assets/stack-updates-edge-beta.png differ diff --git a/migration/assets/stack-updates-edge-minor.png b/migration/assets/stack-updates-edge-minor.png new file mode 100644 index 0000000..b0b39d4 Binary files /dev/null and b/migration/assets/stack-updates-edge-minor.png differ diff --git a/migration/assets/stack-updates-edge.png b/migration/assets/stack-updates-edge.png new file mode 100644 index 0000000..353acfa Binary files /dev/null and b/migration/assets/stack-updates-edge.png differ diff --git a/migration/assets/stack-updates-stable-xcode-minor.png b/migration/assets/stack-updates-stable-xcode-minor.png new file mode 100644 index 0000000..d7f5996 Binary files /dev/null and b/migration/assets/stack-updates-stable-xcode-minor.png differ diff --git a/migration/assets/start-build-advanced.png b/migration/assets/start-build-advanced.png new file mode 100644 index 0000000..0434eef Binary files /dev/null and b/migration/assets/start-build-advanced.png differ diff --git a/migration/assets/start-build-basic.png b/migration/assets/start-build-basic.png new file mode 100644 index 0000000..bc81a51 Binary files /dev/null and b/migration/assets/start-build-basic.png differ diff --git a/migration/assets/start-build.png b/migration/assets/start-build.png new file mode 100644 index 0000000..3b38cd1 Binary files /dev/null and b/migration/assets/start-build.png differ diff --git a/migration/assets/started-build-cache.png b/migration/assets/started-build-cache.png new file mode 100644 index 0000000..e41bd43 Binary files /dev/null and b/migration/assets/started-build-cache.png differ diff --git a/migration/assets/status-badge-dialog.png b/migration/assets/status-badge-dialog.png new file mode 100644 index 0000000..c112182 Binary files /dev/null and b/migration/assets/status-badge-dialog.png differ diff --git a/migration/assets/step-failed-quickly.png b/migration/assets/step-failed-quickly.png new file mode 100644 index 0000000..efe498c Binary files /dev/null and b/migration/assets/step-failed-quickly.png differ diff --git a/migration/assets/step-force-output.png b/migration/assets/step-force-output.png new file mode 100644 index 0000000..56b39d2 Binary files /dev/null and b/migration/assets/step-force-output.png differ diff --git a/migration/assets/step-took-long.png b/migration/assets/step-took-long.png new file mode 100644 index 0000000..b394a3b Binary files /dev/null and b/migration/assets/step-took-long.png differ diff --git a/migration/assets/step-versions.png b/migration/assets/step-versions.png new file mode 100644 index 0000000..74ac18a Binary files /dev/null and b/migration/assets/step-versions.png differ diff --git a/migration/assets/stepbundleinstance.png b/migration/assets/stepbundleinstance.png new file mode 100644 index 0000000..7141ffc Binary files /dev/null and b/migration/assets/stepbundleinstance.png differ diff --git a/migration/assets/stopped-using-cache.png b/migration/assets/stopped-using-cache.png new file mode 100644 index 0000000..314292e Binary files /dev/null and b/migration/assets/stopped-using-cache.png differ diff --git a/migration/assets/store-bitrise-yml.png b/migration/assets/store-bitrise-yml.png new file mode 100644 index 0000000..883a329 Binary files /dev/null and b/migration/assets/store-bitrise-yml.png differ diff --git a/migration/assets/support_access.png b/migration/assets/support_access.png new file mode 100644 index 0000000..f3f6314 Binary files /dev/null and b/migration/assets/support_access.png differ diff --git a/migration/assets/task-reason.png b/migration/assets/task-reason.png new file mode 100644 index 0000000..c00a1bf Binary files /dev/null and b/migration/assets/task-reason.png differ diff --git a/migration/assets/teams-sub.png b/migration/assets/teams-sub.png new file mode 100644 index 0000000..775b3cf Binary files /dev/null and b/migration/assets/teams-sub.png differ diff --git a/migration/assets/test-case-history.png b/migration/assets/test-case-history.png new file mode 100644 index 0000000..93fbca4 Binary files /dev/null and b/migration/assets/test-case-history.png differ diff --git a/migration/assets/test-cases-list.png b/migration/assets/test-cases-list.png new file mode 100644 index 0000000..1cff949 Binary files /dev/null and b/migration/assets/test-cases-list.png differ diff --git a/migration/assets/test-devices-menu.png b/migration/assets/test-devices-menu.png new file mode 100644 index 0000000..ee1657d Binary files /dev/null and b/migration/assets/test-devices-menu.png differ diff --git a/migration/assets/test-failure-rate-tab.png b/migration/assets/test-failure-rate-tab.png new file mode 100644 index 0000000..bfa8335 Binary files /dev/null and b/migration/assets/test-failure-rate-tab.png differ diff --git a/migration/assets/test-repetition.png b/migration/assets/test-repetition.png new file mode 100644 index 0000000..93b78ae Binary files /dev/null and b/migration/assets/test-repetition.png differ diff --git a/migration/assets/test-run.png b/migration/assets/test-run.png new file mode 100644 index 0000000..a7dc220 Binary files /dev/null and b/migration/assets/test-run.png differ diff --git a/migration/assets/test_connector.png b/migration/assets/test_connector.png new file mode 100644 index 0000000..4ead7d4 Binary files /dev/null and b/migration/assets/test_connector.png differ diff --git a/migration/assets/test_devices.png b/migration/assets/test_devices.png new file mode 100644 index 0000000..ef8322a Binary files /dev/null and b/migration/assets/test_devices.png differ diff --git a/migration/assets/test_reports.png b/migration/assets/test_reports.png new file mode 100644 index 0000000..83f7c3a Binary files /dev/null and b/migration/assets/test_reports.png differ diff --git a/migration/assets/tester-group.png b/migration/assets/tester-group.png new file mode 100644 index 0000000..3b08afd Binary files /dev/null and b/migration/assets/tester-group.png differ diff --git a/migration/assets/tester-qa-role.png b/migration/assets/tester-qa-role.png new file mode 100644 index 0000000..86616dc Binary files /dev/null and b/migration/assets/tester-qa-role.png differ diff --git a/migration/assets/tester-settings-page.png b/migration/assets/tester-settings-page.png new file mode 100644 index 0000000..e629f5e Binary files /dev/null and b/migration/assets/tester-settings-page.png differ diff --git a/migration/assets/testflight-testing-int-ext.png b/migration/assets/testflight-testing-int-ext.png new file mode 100644 index 0000000..0e7893a Binary files /dev/null and b/migration/assets/testflight-testing-int-ext.png differ diff --git a/migration/assets/testflight-upload.png b/migration/assets/testflight-upload.png new file mode 100644 index 0000000..96454ee Binary files /dev/null and b/migration/assets/testflight-upload.png differ diff --git a/migration/assets/testing-google-play-cant-replace.png b/migration/assets/testing-google-play-cant-replace.png new file mode 100644 index 0000000..5baf43e Binary files /dev/null and b/migration/assets/testing-google-play-cant-replace.png differ diff --git a/migration/assets/testing_metrics.png b/migration/assets/testing_metrics.png new file mode 100644 index 0000000..c5d5343 Binary files /dev/null and b/migration/assets/testing_metrics.png differ diff --git a/migration/assets/tick.svg b/migration/assets/tick.svg new file mode 100644 index 0000000..f8b6a47 --- /dev/null +++ b/migration/assets/tick.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/migration/assets/timeframe-artifacts.png b/migration/assets/timeframe-artifacts.png new file mode 100644 index 0000000..6377055 Binary files /dev/null and b/migration/assets/timeframe-artifacts.png differ diff --git a/migration/assets/total-duration.png b/migration/assets/total-duration.png new file mode 100644 index 0000000..a6d5dda Binary files /dev/null and b/migration/assets/total-duration.png differ diff --git a/migration/assets/trends.png b/migration/assets/trends.png new file mode 100644 index 0000000..517dcc6 Binary files /dev/null and b/migration/assets/trends.png differ diff --git a/migration/assets/trigger-in-workflow.png b/migration/assets/trigger-in-workflow.png new file mode 100644 index 0000000..8efe3bc Binary files /dev/null and b/migration/assets/trigger-in-workflow.png differ diff --git a/migration/assets/trigger-priority.png b/migration/assets/trigger-priority.png new file mode 100644 index 0000000..2be4de2 Binary files /dev/null and b/migration/assets/trigger-priority.png differ diff --git a/migration/assets/two-pr-triggers.png b/migration/assets/two-pr-triggers.png new file mode 100644 index 0000000..3848099 Binary files /dev/null and b/migration/assets/two-pr-triggers.png differ diff --git a/migration/assets/upload-code-signing.png b/migration/assets/upload-code-signing.png new file mode 100644 index 0000000..cabfc4b Binary files /dev/null and b/migration/assets/upload-code-signing.png differ diff --git a/migration/assets/upload-complete.png b/migration/assets/upload-complete.png new file mode 100644 index 0000000..5fdad71 Binary files /dev/null and b/migration/assets/upload-complete.png differ diff --git a/migration/assets/upload-url.png b/migration/assets/upload-url.png new file mode 100644 index 0000000..797a2ba Binary files /dev/null and b/migration/assets/upload-url.png differ diff --git a/migration/assets/useraccess.jpg b/migration/assets/useraccess.jpg new file mode 100644 index 0000000..d608744 Binary files /dev/null and b/migration/assets/useraccess.jpg differ diff --git a/migration/assets/view-details-token.png b/migration/assets/view-details-token.png new file mode 100644 index 0000000..59bb9f6 Binary files /dev/null and b/migration/assets/view-details-token.png differ diff --git a/migration/assets/vscode.png b/migration/assets/vscode.png new file mode 100644 index 0000000..b867104 Binary files /dev/null and b/migration/assets/vscode.png differ diff --git a/migration/assets/watching-app.png b/migration/assets/watching-app.png new file mode 100644 index 0000000..86db8f9 Binary files /dev/null and b/migration/assets/watching-app.png differ diff --git a/migration/assets/webhooks-redeliver.png b/migration/assets/webhooks-redeliver.png new file mode 100644 index 0000000..0434a52 Binary files /dev/null and b/migration/assets/webhooks-redeliver.png differ diff --git a/migration/assets/webhooks-tab.png b/migration/assets/webhooks-tab.png new file mode 100644 index 0000000..7f882de Binary files /dev/null and b/migration/assets/webhooks-tab.png differ diff --git a/migration/assets/weekly-view.png b/migration/assets/weekly-view.png new file mode 100644 index 0000000..bf7d0de Binary files /dev/null and b/migration/assets/weekly-view.png differ diff --git a/migration/assets/workflow-breakdown-chart.png b/migration/assets/workflow-breakdown-chart.png new file mode 100644 index 0000000..4460850 Binary files /dev/null and b/migration/assets/workflow-breakdown-chart.png differ diff --git a/migration/assets/workflow-chain-options.png b/migration/assets/workflow-chain-options.png new file mode 100644 index 0000000..f411ae3 Binary files /dev/null and b/migration/assets/workflow-chain-options.png differ diff --git a/migration/assets/workflow-level-status-report.png b/migration/assets/workflow-level-status-report.png new file mode 100644 index 0000000..ea2db41 Binary files /dev/null and b/migration/assets/workflow-level-status-report.png differ diff --git a/migration/assets/workflow-priority.png b/migration/assets/workflow-priority.png new file mode 100644 index 0000000..5b5a8fb Binary files /dev/null and b/migration/assets/workflow-priority.png differ diff --git a/migration/assets/workflow-properties-edit.png b/migration/assets/workflow-properties-edit.png new file mode 100644 index 0000000..0c4730b Binary files /dev/null and b/migration/assets/workflow-properties-edit.png differ diff --git a/migration/assets/workflow-properties-ellipsis.png b/migration/assets/workflow-properties-ellipsis.png new file mode 100644 index 0000000..0ed4133 Binary files /dev/null and b/migration/assets/workflow-properties-ellipsis.png differ diff --git a/migration/assets/workflow-properties.png b/migration/assets/workflow-properties.png new file mode 100644 index 0000000..35b3516 Binary files /dev/null and b/migration/assets/workflow-properties.png differ diff --git a/migration/assets/workflows-button.png b/migration/assets/workflows-button.png new file mode 100644 index 0000000..4711f3e Binary files /dev/null and b/migration/assets/workflows-button.png differ diff --git a/migration/assets/workspace-api-token.svg b/migration/assets/workspace-api-token.svg new file mode 100644 index 0000000..421491d --- /dev/null +++ b/migration/assets/workspace-api-token.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/migration/assets/workspace-insights.png b/migration/assets/workspace-insights.png new file mode 100644 index 0000000..e1ee2ed Binary files /dev/null and b/migration/assets/workspace-insights.png differ diff --git a/migration/assets/workspace-menu.png b/migration/assets/workspace-menu.png new file mode 100644 index 0000000..af655e3 Binary files /dev/null and b/migration/assets/workspace-menu.png differ diff --git a/migration/assets/workspace-settings.png b/migration/assets/workspace-settings.png new file mode 100644 index 0000000..c223dc5 Binary files /dev/null and b/migration/assets/workspace-settings.png differ diff --git a/migration/assets/workspace-slug.png b/migration/assets/workspace-slug.png new file mode 100644 index 0000000..783ce5c Binary files /dev/null and b/migration/assets/workspace-slug.png differ diff --git a/migration/assets/ws-secrets.png b/migration/assets/ws-secrets.png new file mode 100644 index 0000000..6ef4205 Binary files /dev/null and b/migration/assets/ws-secrets.png differ diff --git a/migration/assets/xcode-archive.png b/migration/assets/xcode-archive.png new file mode 100644 index 0000000..1583802 Binary files /dev/null and b/migration/assets/xcode-archive.png differ diff --git a/migration/assets/xcode-test-for-ios.png b/migration/assets/xcode-test-for-ios.png new file mode 100644 index 0000000..023daae Binary files /dev/null and b/migration/assets/xcode-test-for-ios.png differ diff --git a/migration/assets/xcode_image.png b/migration/assets/xcode_image.png new file mode 100644 index 0000000..406aea3 Binary files /dev/null and b/migration/assets/xcode_image.png differ diff --git a/migration/assets/xcodetestforios.png b/migration/assets/xcodetestforios.png new file mode 100644 index 0000000..40a0f5a Binary files /dev/null and b/migration/assets/xcodetestforios.png differ diff --git a/migration/assets/yaml-source-switchback-dialog.png b/migration/assets/yaml-source-switchback-dialog.png new file mode 100644 index 0000000..f562aa5 Binary files /dev/null and b/migration/assets/yaml-source-switchback-dialog.png differ diff --git a/migration/build_url_map.py b/migration/build_url_map.py new file mode 100644 index 0000000..837a406 --- /dev/null +++ b/migration/build_url_map.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +""" +Builds a title → URL mapping from the current Paligo HTML output. + +Walks all HTML files under out/en/, extracts from each, +and outputs a JSON mapping of title → relative URL path. + +Usage: + python3 migration/build_url_map.py /path/to/out/en migration/url_map.json +""" + +import json +import os +import re +import sys + + +def extract_title(html_path): + with open(html_path, "r", encoding="utf-8", errors="replace") as f: + content = f.read(4000) + match = re.search(r"<title>(.*?)", content, re.IGNORECASE) + return match.group(1).strip() if match else "" + + +def build_map(html_dir): + url_map = {} + title_to_url = {} + + for root, _dirs, files in os.walk(html_dir): + for fname in files: + if not fname.endswith(".html"): + continue + if fname in ("toc-en.html", "index-en.html"): + continue + + full_path = os.path.join(root, fname) + rel_path = os.path.relpath(full_path, html_dir) + title = extract_title(full_path) + + if title: + title_to_url[title] = rel_path + url_map[rel_path] = title + + return url_map, title_to_url + + +def main(): + if len(sys.argv) < 3: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + + html_dir = sys.argv[1] + output_path = sys.argv[2] + + print(f"Scanning {html_dir}...") + url_map, title_to_url = build_map(html_dir) + + result = { + "by_path": url_map, + "by_title": title_to_url, + } + + with open(output_path, "w") as f: + json.dump(result, f, indent=2) + + print(f"Mapped {len(url_map)} URLs, {len(title_to_url)} unique titles") + print(f"Output: {output_path}") + + +if __name__ == "__main__": + main() diff --git a/migration/convert.py b/migration/convert.py new file mode 100644 index 0000000..cb9e17e --- /dev/null +++ b/migration/convert.py @@ -0,0 +1,1314 @@ +#!/usr/bin/env python3 +""" +Paligo XML export → Docusaurus-ready Markdown migration. + +Reads the monolithic Paligo export XML, resolves the structure tree and all +text/component resources, and writes out a folder hierarchy of .md files +suitable for Docusaurus. + +Usage: + python3 migration/convert.py [--url-map ] +""" + +import json +import os +import re +import sys +import xml.etree.ElementTree as ET +from pathlib import Path + +NS = { + "e": "http://ns.expertinfo.se/cms/xmlns/export/1.0", + "db": "http://docbook.org/ns/docbook", + "xinfo": "http://ns.expertinfo.se/cms/xmlns/1.0", + "xi": "http://www.w3.org/2001/XInclude", + "xlink": "http://www.w3.org/1999/xlink", +} + +for prefix, uri in NS.items(): + ET.register_namespace(prefix, uri) + + +def ns(prefix, local): + return f"{{{NS[prefix]}}}{local}" + + +TAB_IMPORTS = ( + "import Tabs from '@theme/Tabs';\n" + "import TabItem from '@theme/TabItem';\n" + "import GlossTerm from '@site/src/components/GlossTerm';\n" +) + + +_MDX_ALLOWED_TAGS = { + "Tabs", "TabItem", "GlossTerm", + "br", "hr", "sup", "sub", "strong", "em", "code", "pre", "p", + "div", "span", "a", "img", "ul", "ol", "li", + "table", "thead", "tbody", "tr", "th", "td", + "h1", "h2", "h3", "h4", "h5", "h6", + "dl", "dt", "dd", "details", "summary", "figure", "figcaption", +} + +_TAG_RE = re.compile(r"<(/?)([A-Za-z][A-Za-z0-9_-]*)([^>]*)>") +_NUM_LT_RE = re.compile(r"<(\s*\d)") +# `<>` and `` are React fragment syntax — but in our content they're +# usually literal "<>". Always escape. +_FRAGMENT_RE = re.compile(r"<(/?)>") +# `{app-slug}`, `{org-slug}` etc. — placeholder tokens that look like JSX +# expressions to MDX. Hyphenated names can never be valid JSX expressions, +# so escape them as literal text. +_PLACEHOLDER_RE = re.compile(r"\{([a-z][a-z0-9]*-[a-z0-9-]+)\}") +_PARTIAL_REF_RE = re.compile(r"^\s*\s*$") + + +def escape_mdx_unknown_tags(body): + """Escape ``/`` patterns in an MDX body, leaving allow-listed + components (Tabs, TabItem, GlossTerm, plus our own Partial_* refs) and + code blocks/inline code untouched. Mirrors the preprocessor in + docusaurus.config.ts so partial files (imported directly, not routed by the + docs plugin) parse cleanly. + """ + out_lines = [] + in_fence = False + for line in body.split("\n"): + if line.lstrip().startswith("```"): + in_fence = not in_fence + out_lines.append(line) + continue + if in_fence: + out_lines.append(line) + continue + # Don't touch `` reference lines + if _PARTIAL_REF_RE.match(line): + out_lines.append(line) + continue + + # Process line, skipping inline `code` segments + parts = line.split("`") + for i in range(0, len(parts), 2): + seg = parts[i] + seg = _TAG_RE.sub( + lambda m: m.group(0) if m.group(2) in _MDX_ALLOWED_TAGS or m.group(2).startswith("Partial_") + else f"<{m.group(1)}{m.group(2)}{m.group(3)}>", + seg, + ) + seg = _NUM_LT_RE.sub(r"<\1", seg) + seg = _FRAGMENT_RE.sub(r"<\1>", seg) + seg = _PLACEHOLDER_RE.sub(r"\\{\1\\}", seg) + parts[i] = seg + out_lines.append("`".join(parts)) + return "\n".join(out_lines) + + +# Partial registry — populated by PaligoMigrator._build_partials_index(). +# Maps UUID → {"slug": "opening-the-workflow-editor", +# "component": "Partial_OpeningTheWorkflowEditor", +# "title": "Opening the Workflow Editor"}. +PARTIALS_INDEX = {} + + +def _pascal_case(text): + """Convert 'Opening the Workflow Editor' → 'OpeningTheWorkflowEditor'. + Strips characters that aren't valid in JSX identifiers.""" + text = re.sub(r"[^\w\s-]", " ", text or "") + parts = re.split(r"[\s_-]+", text.strip()) + out = "".join(p[:1].upper() + p[1:] for p in parts if p) + if not out: + out = "Untitled" + if not out[0].isalpha() and out[0] != "_": + out = "P" + out + return out + + +def partial_slug(uuid): + """Filename slug for a partial (without extension).""" + return PARTIALS_INDEX[uuid]["slug"] + + +def partial_component_name(uuid): + """JSX-safe component name for a partial.""" + return PARTIALS_INDEX[uuid]["component"] + + +def partial_import_line(uuid): + info = PARTIALS_INDEX[uuid] + return f"import {info['component']} from '@site/src/partials/{info['slug']}.mdx';" + + +def escape_md_text(text): + """Escape `<` and `>` in plain-text content so they don't get parsed as JSX. + + MDX is strict: `` in a paragraph triggers JSX parsing. Use HTML + entities so the rendered output is identical but MDX leaves it alone. + """ + if not text: + return text + # Avoid double-escaping already-encoded entities + return text.replace("&", "&").replace("<", "<").replace(">", ">") + + +def slugify(text): + text = text.lower().strip() + text = re.sub(r"[^\w\s-]", "", text) + text = re.sub(r"[\s_]+", "-", text) + text = re.sub(r"-+", "-", text) + return text.strip("-") or "untitled" + + +class PaligoMigrator: + def __init__(self, xml_path, url_map=None): + self.tree = ET.parse(xml_path) + self.root = self.tree.getroot() + self.resources = {} + self.resources_by_uuid = {} + self.image_map = {} + self.id_to_path = {} + self.id_to_title = {} + self.url_map = url_map or {} + self.title_to_url = self.url_map.get("by_title", {}) + self.path_to_url = self.url_map.get("by_path", {}) + # Track every UUID referenced via xi:include so write_partials() knows + # exactly which partial files to emit. + self._referenced_uuids = set() + # When True, _resolve_xinclude inlines its target instead of emitting a + # JSX component reference (used while generating the partial file + # itself, so partials are self-contained). + self._inline_xinclude = False + # Partials referenced by the page currently being converted; reset by + # convert_component and consumed by _write_tree to emit imports. + self._partials_used = set() + self._index_resources() + + def _index_resources(self): + for el in self.root: + tag = el.tag.split("}")[-1] if "}" in el.tag else el.tag + if tag == "resource": + rid = el.get("id") + self.resources[rid] = el + ruuid = el.get("uuid") + if ruuid: + self.resources_by_uuid[ruuid] = el + if el.get("type") == "image": + uuid = el.get("uuid") + self.image_map[uuid] = { + "id": rid, + "src": el.get("src", ""), + "filename": el.get("filename", ""), + } + + def get_text(self, text_id, lang="en"): + res = self.resources.get(text_id) + if res is None: + return "" + content_el = None + for child in res: + tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + if tag == "content": + if child.get("lang", "en") == lang: + content_el = child + break + if content_el is None: + content_el = child + if content_el is None: + return "" + return self._render_inline(content_el) + + def _render_inline(self, el): + parts = [] + if el.text: + parts.append(el.text.replace("\n", " ")) + for child in el: + tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + # Resolve XInclude references inline (skipping the fallback text). + if child.tag.startswith("{" + NS["xi"]): + if tag == "include": + parts.append(self._resolve_xinclude(child, 2, None)) + # fallback: ignore + if child.tail: + parts.append(child.tail.replace("\n", " ")) + continue + if tag == "emphasis": + role = child.get("role", "") + inner = self._render_inline(child) + if role in ("bold", "strong"): + parts.append(f"**{inner}**") + else: + parts.append(f"*{inner}*") + elif tag == "link": + href = child.get(ns("xinfo", "href"), "") + xlink_href = child.get(f"{{{NS['xlink']}}}href", "") + inner = self._render_inline(child) + url = xlink_href or href + if url.startswith("urn:resource:"): + url = self.resolve_xref(url) + parts.append(f"[{inner}]({url})") + elif tag == "ulink": + url = child.get("url", "") + inner = self._render_inline(child) + parts.append(f"[{inner}]({url})") + elif tag in ("code", "literal", "filename", "command", "userinput"): + inner = self._render_inline(child) + parts.append(f"`{inner}`") + elif tag in ("guilabel", "guimenu", "guimenuitem", "guibutton"): + inner = self._render_inline(child) + parts.append(f"**{inner}**") + elif tag == "inlinemediaobject": + img_md = self._convert_media(child) + parts.append(img_md) + elif tag == "xref": + parts.append(self._xref_link(child)) + elif tag == "glossterm": + # Inline glossary reference. Render as component + # that shows a hover popover with the definition. + inner = self._render_inline(child) + baseform = child.get("baseform") or inner + # Escape inner content for use as JSX text (no curly braces, etc.) + safe_inner = inner.replace("{", "\\{").replace("}", "\\}") + parts.append(f'{safe_inner}') + # Mark the file as needing MDX + self._needs_mdx = True + elif tag == "superscript": + inner = self._render_inline(child) + parts.append(f"{inner}") + elif tag == "subscript": + inner = self._render_inline(child) + parts.append(f"{inner}") + else: + parts.append(self._render_inline(child)) + if child.tail: + parts.append(child.tail.replace("\n", " ")) + return "".join(parts).strip() + + def resolve_xref(self, href): + match = re.match(r"urn:resource:(component|fork):(\d+)", href) + if match: + res_id = match.group(2) + url = self.id_to_path.get(res_id, "") + if url: + return f"/en/{url}" + return href + + def resolve_xref_label(self, href): + match = re.match(r"urn:resource:(component|fork):(\d+)", href) + if match: + return self.id_to_title.get(match.group(2), "") + return "" + + def _xref_link(self, el): + # Paligo's uses xlink:href; xinfo:href is for . + href = el.get(f"{{{NS['xlink']}}}href") or el.get(ns("xinfo", "href"), "") + target = self.resolve_xref(href) + label = self.resolve_xref_label(href) + # Strip the .html suffix so Docusaurus/MDX treats this as an internal + # doc link and rewrites it appropriately for the configured trailing + # slash / .html behavior. Resolved targets always look like + # `/en/section/path.html`. + if target.endswith(".html"): + target = target[:-len(".html")] + return f"[{label or 'see topic'}]({target})" + + def _resolve_xinclude(self, el, heading_level, list_context): + """Inline the content of a Paligo reference. + + The include's `href` is the UUID of a sibling resource (component/hazard). + We pull the resource's and recursively convert each child, + ignoring the placeholder. + """ + href = el.get("href", "") + target = self.resources_by_uuid.get(href) + if target is None: + return "" + + # Default mode: emit a JSX component reference and let write_partials + # generate the actual content. Avoids duplicating the chunk into every + # consumer. + if not self._inline_xinclude: + self._referenced_uuids.add(href) + self._partials_used.add(href) + self._needs_mdx = True + return f"<{partial_component_name(href)} />" + + # Inline mode (used while generating the partial file itself, so the + # partial is self-contained Markdown/MDX). + content_el = target.find(ns("e", "content")) + if content_el is None: + return "" + # Cycle guard + if not hasattr(self, "_include_stack"): + self._include_stack = set() + if href in self._include_stack: + return "" + self._include_stack.add(href) + try: + parts = [] + for child in content_el: + child_md = self.convert_docbook_element(child, heading_level, list_context) + if child_md: + parts.append(child_md) + return "\n\n".join(parts) + finally: + self._include_stack.discard(href) + + def convert_docbook_element(self, el, heading_level=2, list_context=None): + tag = el.tag.split("}")[-1] if "}" in el.tag else el.tag + + if tag in ("include", "fallback") and el.tag.startswith("{" + NS["xi"]): + if tag == "fallback": + return "" + return self._resolve_xinclude(el, heading_level, list_context) + + text_id = el.get(ns("xinfo", "text")) + + if text_id: + resolved = self.get_text(text_id) + if resolved: + return self._wrap_tag(tag, resolved, el, heading_level, list_context) + + if tag == "section": + return self._convert_section(el, heading_level) + + if tag in ("note", "tip", "warning", "important", "caution"): + return self._convert_admonition(tag, el, heading_level) + + if tag == "example": + return self._convert_example(el, heading_level) + + if tag in ("informaltable", "table"): + return self._convert_table(el) + + if tag in ("mediaobject", "inlinemediaobject"): + return self._convert_media(el) + + if tag == "imagedata": + return self._convert_imagedata(el) + + if tag in ("itemizedlist", "orderedlist"): + return self._convert_list(tag, el, heading_level) + + if tag == "glossary": + return self._convert_glossary(el, heading_level) + + if tag == "procedure": + return self._convert_list("orderedlist", el, heading_level) + + if tag == "para": + # Render paragraph children inline so element tails (e.g. the "." + # after ``) stay on the same line instead of becoming a + # separate block. + return self._render_inline(el) + + parts = [] + if el.text and el.text.strip(): + parts.append(el.text.strip()) + + for child in el: + child_md = self.convert_docbook_element(child, heading_level, list_context) + if child_md: + parts.append(child_md) + if child.tail and child.tail.strip(): + parts.append(child.tail.strip()) + + content = "\n\n".join(parts) if parts else "" + return self._wrap_tag(tag, content, el, heading_level, list_context) + + def _convert_section(self, el, heading_level): + parts = [] + title_el = el.find(ns("db", "title")) + if title_el is not None: + text_id = title_el.get(ns("xinfo", "text")) + title_text = self.get_text(text_id) if text_id else self._render_inline(title_el) + if title_text: + prefix = "#" * min(heading_level, 6) + parts.append(f"{prefix} {title_text}") + + # Iterate with explicit index so we can group consecutive tab elements + children = [c for c in el if (c.tag.split("}")[-1] if "}" in c.tag else c.tag) not in ("title", "info")] + i = 0 + while i < len(children): + child = children[i] + role = child.get("role", "") + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + + if child_tag == "para" and role.startswith("tabs"): + # Collect consecutive tab labels + labels = [] + while i < len(children): + c = children[i] + c_tag = c.tag.split("}")[-1] if "}" in c.tag else c.tag + c_role = c.get("role", "") + if c_tag == "para" and c_role.startswith("tabs"): + text_id = c.get(ns("xinfo", "text")) + label = self.get_text(text_id) if text_id else self._render_inline(c) + labels.append(label.strip() if label else "") + i += 1 + else: + break + # Collect matching tab-content procedures + contents = [] + while i < len(children) and len(contents) < len(labels): + c = children[i] + c_tag = c.tag.split("}")[-1] if "}" in c.tag else c.tag + c_role = c.get("role", "") + if c_tag == "procedure" and "tab-content" in c_role: + body = self.convert_docbook_element(c, heading_level + 1) + contents.append(body or "") + i += 1 + else: + break + if labels and contents: + parts.append(self._render_tabs(labels, contents)) + self._needs_mdx = True + continue + # Fallback: just append labels as text if no content followed + for lbl in labels: + if lbl: + parts.append(lbl) + continue + + md = self.convert_docbook_element(child, heading_level + 1) + if md: + parts.append(md) + i += 1 + + return "\n\n".join(parts) + + def _render_tabs(self, labels, contents): + out = [""] + for idx, (label, body) in enumerate(zip(labels, contents)): + value = slugify(label) or f"tab-{idx}" + default_attr = " default" if idx == 0 else "" + out.append(f'') + out.append("") + out.append(body.strip()) + out.append("") + out.append("") + out.append("") + return "\n".join(out) + + def _convert_admonition(self, admonition_type, el, heading_level): + parts = [] + title_text = "" + for child in el: + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + if child_tag == "title": + text_id = child.get(ns("xinfo", "text")) + title_text = self.get_text(text_id) if text_id else self._render_inline(child) + else: + md = self.convert_docbook_element(child, heading_level) + if md: + parts.append(md) + + content = "\n\n".join(parts) + header = f":::{admonition_type}" + if title_text: + header = f":::{admonition_type}[{title_text}]" + return f"{header}\n\n{content}\n\n:::" + + def _convert_example(self, el, heading_level): + parts = [] + for child in el: + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + if child_tag == "title": + text_id = child.get(ns("xinfo", "text")) + title_text = self.get_text(text_id) if text_id else self._render_inline(child) + if title_text: + parts.append(f"**{title_text}**") + else: + md = self.convert_docbook_element(child, heading_level) + if md: + parts.append(md) + return "\n\n".join(parts) + + def write_glossary(self, out_path): + """Extract all glossary entries to a JSON file keyed by lowercased term.""" + data = {} + for el in self.root.iter(): + tag = el.tag.split("}")[-1] if "}" in el.tag else el.tag + if tag != "glossary": + continue + for entry in el: + entry_tag = entry.tag.split("}")[-1] if "}" in entry.tag else entry.tag + if entry_tag != "glossentry": + continue + term = "" + definition = "" + for child in entry: + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + if child_tag == "glossterm": + text_id = child.get(ns("xinfo", "text")) + term = self.get_text(text_id) if text_id else self._render_inline(child) + elif child_tag == "glossdef": + para = child.find(ns("db", "para")) + if para is not None: + text_id = para.get(ns("xinfo", "text")) + definition = self.get_text(text_id) if text_id else self._render_inline(para) + if term and definition: + data[term.strip().lower()] = { + "term": term.strip(), + "definition": definition.strip(), + } + with open(out_path, "w") as f: + json.dump(data, f, indent=2, sort_keys=True) + print(f" Wrote {len(data)} glossary entries to {out_path}") + + def _convert_glossary(self, el, heading_level): + out = ['
'] + for entry in el: + entry_tag = entry.tag.split("}")[-1] if "}" in entry.tag else entry.tag + if entry_tag != "glossentry": + continue + term_text = "" + def_text = "" + for child in entry: + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + if child_tag == "glossterm": + text_id = child.get(ns("xinfo", "text")) + term_text = self.get_text(text_id) if text_id else self._render_inline(child) + elif child_tag == "glossdef": + para = child.find(ns("db", "para")) + if para is not None: + text_id = para.get(ns("xinfo", "text")) + def_text = self.get_text(text_id) if text_id else self._render_inline(para) + if term_text: + term = term_text.strip() + anchor = slugify(term) + out.append(f'
{term}
') + out.append(f"
\n\n{def_text.strip()}\n\n
") + out.append('
') + return "\n".join(out) + + + def _convert_list(self, list_type, el, heading_level): + items = [] + # Each ordered/unordered list item picks up its own prefix. + if list_type == "orderedlist": + list_prefix = "1. " + list_indent = " " + else: + list_prefix = "- " + list_indent = " " + for child in el: + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + is_xi = child.tag.startswith("{" + NS["xi"] + "}") + + # Skip xi:fallback (the "Reusing topic #UUID" placeholder) + if is_xi and child_tag == "fallback": + continue + + # xi:include inside a list/procedure → emit as a list item that + # references the partial. The Docusaurus build-time preprocessor + # expands these placeholders into the partial's actual list items + # (see expandListPartials in docusaurus.config.ts), so the rendered + # output merges into a single numbered list. + # + # When generating partial files (_inline_xinclude=True) we instead + # splice the nested target's items inline so partials stay + # self-contained — no chained partial references inside partials. + if is_xi and child_tag == "include": + href = child.get("href", "") + target = self.resources_by_uuid.get(href) if href else None + if target is None: + continue + if self._inline_xinclude: + inner_list = None + content_el = target.find(ns("e", "content")) + if content_el is not None: + for grand in content_el.iter(): + gtag = grand.tag.split("}")[-1] if "}" in grand.tag else grand.tag + if gtag in ("procedure", "orderedlist", "itemizedlist"): + inner_list = grand + break + if inner_list is not None: + nested = self._convert_list(list_type, inner_list, heading_level) + if nested: + items.append(nested) + else: + self._referenced_uuids.add(href) + self._partials_used.add(href) + self._needs_mdx = True + items.append(f"{list_prefix}<{partial_component_name(href)} />") + continue + + if child_tag in ("listitem", "step"): + item_parts = [] + for sub in child: + sub_tag = sub.tag.split("}")[-1] if "}" in sub.tag else sub_tag + md = self.convert_docbook_element(sub, heading_level, list_context=list_type) + if md: + item_parts.append(md) + item_content = "\n\n".join(item_parts) + lines = item_content.split("\n") + result = list_prefix + lines[0] + for line in lines[1:]: + result += "\n" + (list_indent + line if line.strip() else "") + items.append(result) + elif child_tag == "stepalternatives": + for alt in child: + alt_tag = alt.tag.split("}")[-1] if "}" in alt.tag else alt_tag + if alt_tag == "step": + alt_parts = [] + for sub in alt: + md = self.convert_docbook_element(sub, heading_level, list_context=list_type) + if md: + alt_parts.append(md) + alt_content = "\n\n".join(alt_parts) + lines = alt_content.split("\n") + result = " - " + lines[0] + for line in lines[1:]: + result += "\n" + (" " + line if line.strip() else "") + items.append(result) + return "\n".join(items) + + def _wrap_tag(self, tag, content, el, heading_level, list_context=None): + if not content and tag not in ("imagedata", "xref"): + return "" + + if tag == "title": + return content + + if tag == "para": + return content + + if tag == "emphasis": + role = el.get("role", "") + if role in ("bold", "strong"): + return f"**{content}**" + return f"*{content}*" + + if tag in ("code", "literal"): + return f"`{content}`" + + if tag in ("programlisting", "screen"): + lang = el.get("language", "") + return f"```{lang}\n{content}\n```" + + if tag == "xref": + return self._xref_link(el) + + if tag == "link": + href = el.get(ns("xinfo", "href"), "") + xlink_href = el.get(f"{{{NS['xlink']}}}href", "") + url = xlink_href or href + if url.startswith("urn:resource:"): + url = self.resolve_xref(url) + return f"[{content}]({url})" + + if tag == "ulink": + url = el.get("url", "") + return f"[{content}]({url})" + + if tag in ("abstract", "info"): + return content + + if tag == "bridgehead": + return f"#### {content}" + + if tag in ("command", "filename", "userinput"): + return f"`{content}`" + + if tag in ("guilabel", "guimenu", "guimenuitem", "guibutton"): + return f"**{content}**" + + if tag in ("phrase", "replaceable", "application", "keycap"): + return content + + if tag in ("thead", "tbody", "tr", "th", "td", "tgroup", + "colspec", "row", "entry", "imageobject", + "content", "resource"): + return content + + return content + + def _convert_table(self, el): + rows = [] + for descendant in el.iter(): + tag = descendant.tag.split("}")[-1] if "}" in descendant.tag else descendant.tag + if tag in ("tr", "row"): + cells = [] + for cell in descendant: + cell_tag = cell.tag.split("}")[-1] if "}" in cell.tag else cell.tag + if cell_tag in ("th", "td", "entry"): + cell_content = self.convert_docbook_element(cell) + cell_content = cell_content.replace("\n", " ").strip() + cells.append(cell_content) + if cells: + rows.append(cells) + + if not rows: + return "" + + lines = [] + if rows: + ncols = max(len(r) for r in rows) + for r in rows: + while len(r) < ncols: + r.append("") + + lines.append("| " + " | ".join(rows[0]) + " |") + lines.append("| " + " | ".join("---" for _ in rows[0]) + " |") + for row in rows[1:]: + lines.append("| " + " | ".join(row) + " |") + + return "\n".join(lines) + + def _convert_media(self, el): + for descendant in el.iter(): + tag = descendant.tag.split("}")[-1] if "}" in descendant.tag else descendant.tag + if tag == "imagedata": + return self._convert_imagedata(descendant) + return "" + + def _convert_imagedata(self, el): + # Paligo's `src` / `remap` attributes often point to legacy filenames + # that don't exist on disk. The Paligo HTML output keeps every image + # as `image/uuid-.`, which is the canonical reference. + uuid = el.get(ns("xinfo", "image"), "") or el.get("fileref", "") + img_info = self.image_map.get(uuid, {}) + ext = img_info.get("extension", "png") + # UUIDs in the XML look like `UUID---...`. The HTML output + # stores them as `uuid---...` (lowercase prefix). Normalize. + uuid_lower = uuid.replace("UUID-", "uuid-") + src = f"/img/_paligo/{uuid_lower}.{ext}" + filename = img_info.get("filename", "image") + return f"![{filename}]({src})" + + def convert_component(self, resource_el): + content_el = resource_el.find(ns("e", "content")) + if content_el is None: + return "" + # Reset per-component MDX flag — set by _render_tabs when tab content is emitted + self._needs_mdx = False + self._partials_used = set() + + section = content_el.find(ns("db", "section")) + if section is None: + return "" + + title_el = section.find(ns("db", "title")) + title = "" + if title_el is not None: + text_id = title_el.get(ns("xinfo", "text")) + if text_id: + title = self.get_text(text_id) + elif title_el.text: + title = title_el.text.strip() + + resource_title = section.get(ns("xinfo", "resource-title"), "") + if not title: + title = resource_title + + abstract_text = "" + info_el = section.find(ns("db", "info")) + if info_el is not None: + abstract_el = info_el.find(ns("db", "abstract")) + if abstract_el is not None: + para = abstract_el.find(ns("db", "para")) + if para is not None: + text_id = para.get(ns("xinfo", "text")) + if text_id: + abstract_text = self.get_text(text_id) + # Frontmatter `description` is a plain string — strip + # any JSX (e.g. ) and collapse to text. + abstract_text = re.sub( + r"]*>(.*?)", + r"\1", + abstract_text, + flags=re.DOTALL, + ) + # Also strip any other JSX-looking tags as a safety net + abstract_text = re.sub(r"]*>", "", abstract_text) + abstract_text = re.sub(r"", "", abstract_text) + + body_parts = [] + for child in section: + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + if child_tag in ("title", "info"): + continue + md = self.convert_docbook_element(child) + if md: + body_parts.append(md) + + section_role = section.get("role", "") or "" + is_topichead = "topichead" in section_role.split() + + return ( + title, + abstract_text, + "\n\n".join(body_parts), + self._needs_mdx, + is_topichead, + set(self._partials_used), + ) + + def _lookup_slug(self, title, file_section): + """Look up the current live URL for a page by title. + + file_section is the top-level section the file lives in (e.g. 'bitrise-ci'). + Only return a slug if the matched URL is in the same section — otherwise + title collisions (e.g. multiple "Getting started" pages) misroute pages. + """ + url = self.title_to_url.get(title) + if not url: + return None + if file_section and not url.startswith(file_section + "/") and url != file_section + ".html": + return None + return url.replace(".html", "") + + def build_structure(self, out_dir): + self._out_dir = out_dir + structure = self.root.find(ns("e", "structure")) + root_pub = structure.find(ns("e", "publication")) + + self._map_paths(root_pub, "") + self._build_resource_aliases() + self._build_partials_index() + # Write directly under out_dir, skipping the root publication wrapper + for child in root_pub: + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + if child_tag in ("publication", "component"): + self._write_tree(child, Path(out_dir), 1) + + def _build_partials_index(self): + """Pre-scan every xi:include in the corpus and assign each unique + target UUID a readable slug + JSX component name based on its title. + + Populates the module-level PARTIALS_INDEX so that helpers used during + the conversion walk can return registry-backed names without needing + the migrator instance. + """ + # Collect every xi:include target UUID anywhere in the XML. + unique_uuids = set() + for elem in self.root.iter(): + if not elem.tag.startswith("{" + NS["xi"] + "}"): + continue + tag = elem.tag.split("}")[-1] if "}" in elem.tag else elem.tag + if tag != "include": + continue + href = elem.get("href", "") + if href: + unique_uuids.add(href) + + # Sort for deterministic collision ordering. + used_slugs = {} # slug → uuid (first-claimed) + used_components = {} + PARTIALS_INDEX.clear() + + def title_for(uuid): + target = self.resources_by_uuid.get(uuid) + if target is None: + return "" + content_el = target.find(ns("e", "content")) + if content_el is None: + return "" + section = content_el.find(ns("db", "section")) + if section is not None: + t = section.get(ns("xinfo", "resource-title"), "") + if t: + return t + # Hazards/sidebars use other root elements; fall back to anything + # with a resource-title attribute. + for child in content_el: + t = child.get(ns("xinfo", "resource-title"), "") + if t: + return t + return "" + + for uuid in sorted(unique_uuids): + title = title_for(uuid) or "untitled" + base_slug = slugify(title) + base_comp = "Partial_" + _pascal_case(title) + slug = base_slug + comp = base_comp + n = 2 + short = uuid.replace("UUID-", "").split("-")[0].lower() + # Resolve collisions by appending the short UUID once, then a + # counter if even that collides. + while slug in used_slugs or comp in used_components: + if n == 2: + slug = f"{base_slug}-{short}" + comp = f"{base_comp}_{short}" + else: + slug = f"{base_slug}-{short}-{n}" + comp = f"{base_comp}_{short}_{n}" + n += 1 + used_slugs[slug] = uuid + used_components[comp] = uuid + PARTIALS_INDEX[uuid] = { + "slug": slug, + "component": comp, + "title": title, + } + + print(f" Indexed {len(PARTIALS_INDEX)} reusable partial chunks") + + def _build_resource_aliases(self): + structure = self.root.find(ns("e", "structure")) + + title_to_path = {} + for el in structure.iter(): + tag = el.tag.split("}")[-1] if "}" in el.tag else el.tag + if tag == "component": + title = el.get("title", "") + nid = el.get("id", "") + if title and nid in self.id_to_path: + title_to_path.setdefault(title, self.id_to_path[nid]) + + aliased = 0 + for res in self.root: + if res.get("type") != "component": + continue + rid = res.get("id") + if rid in self.id_to_path: + continue + content_el = res.find(ns("e", "content")) + if content_el is None: + continue + section = content_el.find(ns("db", "section")) + if section is None: + continue + title = section.get(ns("xinfo", "resource-title"), "") + if title and title in title_to_path: + self.id_to_path[rid] = title_to_path[title] + if rid not in self.id_to_title: + self.id_to_title[rid] = title + aliased += 1 + + print(f" Aliased {aliased} resource IDs to structure paths") + + def _map_paths(self, node, parent_path): + """Build ID → URL path mapping. Paths are relative to /en/ (e.g. 'bitrise-ci/getting-started.html').""" + tag = node.tag.split("}")[-1] if "}" in node.tag else node.tag + title = node.get("title", "") + nid = node.get("id", "") + + if tag in ("publication", "component"): + slug = slugify(title) if title else f"id-{nid}" + + # Try to find the URL from the HTML output mapping + url_from_map = self.title_to_url.get(title) + if url_from_map: + self.id_to_path[nid] = url_from_map + else: + # Fall back to constructing a path + path = f"{parent_path}/{slug}" if parent_path else slug + self.id_to_path[nid] = path + + if title: + self.id_to_title[nid] = title + + # For children, use the directory structure from the URL map or slugified path + if url_from_map: + child_parent = url_from_map.replace(".html", "") + else: + child_parent = f"{parent_path}/{slug}" if parent_path else slug + + for child in node: + self._map_paths(child, child_parent) + elif tag == "text": + self.id_to_path[nid] = parent_path + elif tag == "image": + pass + + def _write_tree(self, node, parent_dir, sidebar_position): + tag = node.tag.split("}")[-1] if "}" in node.tag else node.tag + title = node.get("title", "") + nid = node.get("id", "") + + # Components with linktype="import" are reusable content fragments + # whose body is already inlined into the parent page via xi:include. + # Don't generate a standalone page or directory for them. + if node.get("linktype") == "import": + return + + if tag in ("publication", "component"): + slug = slugify(title) if title else f"id-{nid}" + node_dir = parent_dir / slug + + child_sections = [ + c for c in node + if (c.tag.split("}")[-1] if "}" in c.tag else c.tag) + in ("publication", "component") + and c.get("linktype") != "import" + ] + child_texts = [ + c for c in node + if (c.tag.split("}")[-1] if "}" in c.tag else c.tag) == "text" + ] + + resource = self.resources.get(nid) + if resource is None: + origin_uuid = node.get("origin") + if origin_uuid: + resource = self.resources_by_uuid.get(origin_uuid) + has_content = False + md_title = title + md_description = "" + md_body = "" + needs_mdx = False + is_topichead = False + partials_used = set() + + if resource is not None and resource.get("type") == "component": + result = self.convert_component(resource) + if result: + ( + md_title, + md_description, + md_body, + needs_mdx, + is_topichead, + partials_used, + ) = result + has_content = bool(md_body.strip()) + + # Look up the URL slug from the HTML output (constrained to the same section) + file_section = "" + try: + file_section = node_dir.relative_to(Path(self._out_dir)).parts[0] + except (ValueError, IndexError): + pass + url_slug = self._lookup_slug(md_title or title, file_section) + + if child_sections: + node_dir.mkdir(parents=True, exist_ok=True) + + if has_content: + frontmatter = self._frontmatter( + title or md_title, md_description, sidebar_position, + slug=url_slug, + is_index=True, + ) + ext = "mdx" if needs_mdx else "md" + body = self._mdx_body(md_body, needs_mdx, partials_used) + (node_dir / f"index.{ext}").write_text( + frontmatter + body + "\n" + ) + + landing_parts = [] + for child_text in child_texts: + text_id = child_text.get("id") + text_content = self.get_text(text_id) + if text_content: + landing_parts.append(text_content) + + if landing_parts and not has_content: + frontmatter = self._frontmatter( + title or md_title, md_description, sidebar_position, + slug=url_slug, + is_index=True, + ) + (node_dir / "index.md").write_text( + frontmatter + "\n\n".join(landing_parts) + "\n" + ) + + # Use structure node title for sidebar label (what Paligo navigation uses). + # Falls back to the H1/resource title only if the structure title is missing. + category_meta = { + "label": title or md_title, + "position": sidebar_position, + } + if md_description: + category_meta["description"] = md_description + + # Link the category to its index doc unless this is a Paligo + # topichead (toggle-only container). For topicheads we set + # `link: null` explicitly — Docusaurus would otherwise auto-link + # the index.md sibling, defeating the non-clickable behavior. + has_index_file = has_content or bool(landing_parts) + if is_topichead: + category_meta["link"] = None + elif has_index_file: + rel = node_dir.relative_to(Path(self._out_dir)) + doc_id = str(rel).replace("\\", "/") + "/index" + category_meta["link"] = {"type": "doc", "id": doc_id} + + (node_dir / "_category_.json").write_text( + json.dumps(category_meta, indent=2) + "\n" + ) + + pos = 1 + for child in node: + child_tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + if child_tag in ("publication", "component"): + self._write_tree(child, node_dir, pos) + pos += 1 + + elif has_content: + parent_dir.mkdir(parents=True, exist_ok=True) + frontmatter = self._frontmatter( + title or md_title, md_description, sidebar_position, + slug=url_slug, + ) + ext = "mdx" if needs_mdx else "md" + body = self._mdx_body(md_body, needs_mdx, partials_used) + filepath = parent_dir / f"{slug}.{ext}" + filepath.write_text(frontmatter + body + "\n") + + elif resource is not None and resource.get("type") == "component": + role = "" + content_el = resource.find(ns("e", "content")) + if content_el is not None: + section = content_el.find(ns("db", "section")) + if section is not None: + role = section.get("role", "") + if role == "topichead" and child_sections: + pass + else: + parent_dir.mkdir(parents=True, exist_ok=True) + frontmatter = self._frontmatter( + title or md_title, md_description, sidebar_position, + slug=url_slug, + ) + filepath = parent_dir / f"{slug}.md" + filepath.write_text( + frontmatter + f"\n" + ) + + def _mdx_body(self, md_body, needs_mdx, partials_used): + """Prepend MDX imports to a body when JSX is present. + + partials_used is a set of UUIDs referenced via xi:include. Each becomes + an `import Partial_xxx from '@site/src/partials/xxx.mdx';` line. + """ + if not needs_mdx: + return md_body + partial_imports = "\n".join( + partial_import_line(uuid) for uuid in sorted(partials_used) + ) + if partial_imports: + partial_imports += "\n" + return TAB_IMPORTS + partial_imports + "\n" + md_body + + def _frontmatter(self, title, description="", position=None, slug=None, is_index=False): + lines = ["---"] + title_escaped = title.replace('"', '\\"') + lines.append(f'title: "{title_escaped}"') + if description: + desc_escaped = description.replace('"', '\\"') + lines.append(f'description: "{desc_escaped}"') + if position is not None: + lines.append(f"sidebar_position: {position}") + if slug: + lines.append(f"slug: {slug}") + lines.append("---") + lines.append("") + return "\n".join(lines) + "\n" + + def write_partials(self, partials_dir, index_path="migration/partials_index.json"): + """Write one MDX partial per UUID referenced by an xi:include. + + Each partial is a self-contained MDX file (no frontmatter): standard + imports + the resolved body of the target resource. Nested xi:includes + are inlined to keep partials flat. + """ + out = Path(partials_dir) + out.mkdir(parents=True, exist_ok=True) + written = 0 + # Build the index map for the build-time preprocessor: + # component name → filename slug (so it can find the file from a + # `` reference without reverse-engineering the slug). + comp_to_slug = {} + for uuid in sorted(self._referenced_uuids): + info = PARTIALS_INDEX.get(uuid) + target = self.resources_by_uuid.get(uuid) + if info is None or target is None: + continue + content_el = target.find(ns("e", "content")) + if content_el is None: + continue + + # Render in inline mode so the partial has no further + # references — keeps it self-contained. + self._inline_xinclude = True + self._needs_mdx = False + try: + parts = [] + for child in content_el: + md = self.convert_docbook_element(child) + if md: + parts.append(md) + body = "\n\n".join(parts) + finally: + self._inline_xinclude = False + + slug = info["slug"] + out_path = out / f"{slug}.mdx" + # All partials get the standard imports; harmless if unused, and + # tabs/glossterm may appear in any chunk. + body = escape_mdx_unknown_tags(body) + out_path.write_text(TAB_IMPORTS + "\n" + body + "\n") + comp_to_slug[info["component"]] = slug + written += 1 + + # Write the index for the Docusaurus build-time preprocessor. + Path(index_path).parent.mkdir(parents=True, exist_ok=True) + with open(index_path, "w") as f: + json.dump({"components": comp_to_slug}, f, indent=2, sort_keys=True) + + print(f" Wrote {written} partial files to {partials_dir}") + print(f" Wrote partials index to {index_path}") + + def copy_images(self, out_dir): + img_dir = Path(out_dir) / "static" / "img" + img_dir.mkdir(parents=True, exist_ok=True) + + manifest = [] + for uuid, info in self.image_map.items(): + src = info.get("src", "") + filename = info.get("filename", "") + if src: + manifest.append(f"{uuid} → {src} ({filename})") + + (Path(out_dir) / "image_manifest.txt").write_text("\n".join(manifest) + "\n") + print(f" Image manifest written: {len(manifest)} images") + + +def main(): + if len(sys.argv) < 3: + print(f"Usage: {sys.argv[0]} [--url-map ]") + sys.exit(1) + + xml_path = sys.argv[1] + out_dir = sys.argv[2] + + url_map = None + if "--url-map" in sys.argv: + idx = sys.argv.index("--url-map") + if idx + 1 < len(sys.argv): + with open(sys.argv[idx + 1]) as f: + url_map = json.load(f) + print(f"Loaded URL map: {len(url_map.get('by_title', {}))} titles, {len(url_map.get('by_path', {}))} paths") + + print(f"Parsing {xml_path}...") + migrator = PaligoMigrator(xml_path, url_map=url_map) + print(f" Indexed {len(migrator.resources)} resources") + print(f" Found {len(migrator.image_map)} images") + + print(f"Building structure in {out_dir}...") + migrator.build_structure(out_dir) + + print("Writing partials...") + migrator.write_partials("src/partials") + + print("Writing image manifest...") + migrator.copy_images(out_dir) + + print("Writing glossary data...") + migrator.write_glossary("migration/glossary.json") + + md_count = sum(1 for _ in Path(out_dir).rglob("*.md")) + dir_count = sum(1 for _ in Path(out_dir).rglob("_category_.json")) + unresolved = 0 + for md_file in Path(out_dir).rglob("*.md"): + content = md_file.read_text() + unresolved += len(re.findall(r"urn:resource:", content)) + + print(f"\nDone!") + print(f" {md_count} markdown files") + print(f" {dir_count} categories") + print(f" {unresolved} unresolved URN references") + print(f" Output: {out_dir}") + + +if __name__ == "__main__": + main() diff --git a/migration/glossary.json b/migration/glossary.json new file mode 100644 index 0000000..f1f834f --- /dev/null +++ b/migration/glossary.json @@ -0,0 +1,58 @@ +{ + "bitrise.yml": { + "definition": "The configuration YAML\u00a0file stores your entire build configuration for a project. It specifies your stack and the build triggers, and defines the Workflows of the app. When you make changes on the graphical UI of our Workflow Editor, you actually modify your configuration YAML.", + "term": "bitrise.yml" + }, + "configuration yaml": { + "definition": "The configuration YAML\u00a0file stores your entire build configuration for a project. It specifies your stack and the build triggers, and defines the Workflows of the app. When you make changes on the graphical UI of our Workflow Editor, you actually modify your configuration YAML.", + "term": "Configuration YAML" + }, + "pipeline": { + "definition": "A Bitrise Pipeline is the top level of the Bitrise CI/CD configuration. Pipelines can be used to organize the entire CI/CD process and to set up advanced configurations with multiple different tasks running parallel and/or sequentially.", + "term": "Pipeline" + }, + "project": { + "definition": "A Bitrise project\u00a0is the container for the entire Mobile DevOps process of your development work. Each workspace can own multiple projects. A project allows you to create a CI configuration and set up Release Management to distribute your mobile app to testers and to online stores.", + "term": "Project" + }, + "project scanner": { + "definition": "The project scanner is a tool that identifies the given project\u2019s type and generates a basic Bitrise configuration. Each supported project type has its own scanner: these scanners are stored as separate packages.", + "term": "Project scanner" + }, + "secret": { + "definition": "A Secret is a specific type of [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html): they hide their information in an encrypted format and their value is not exposed in the build logs nor in the\u00a0`bitrise.yml`\u00a0configuration. You can store confidential information, such as passwords or API keys as Secrets.", + "term": "Secret" + }, + "stack": { + "definition": "A build stack indicates the full configuration of the virtual machine that Bitrise uses to run your build. Each stack includes an operating system, and a large number of pre-installed software and tools. For example, our Xcode stacks run on macOS operating systems and contain, among many other tools, the Xcode version that is indicated in the name of the stack.", + "term": "Stack" + }, + "stage": { + "definition": "A Stage is a collection of Workflows. Stages are the top-level building blocks of Pipelines. A Stage can contain multiple Workflows, which all run in parallel in the same Stage. If all Workflows are successful in a Stage, the Pipeline moves on to the next Stage. If any of the Workflows fail, the Pipeline ends without running the other Stages unless you configure a given Stage to always run.", + "term": "Stage" + }, + "step": { + "definition": "A Step is a block of script execution that encapsulates a build task on Bitrise: the code to perform that task, the inputs and parameters you can define for the task, and the outputs the task generates.", + "term": "Step" + }, + "step.yml": { + "definition": "The interface definition of a Bitrise Step. It defines the Step inputs and the generated outputs, as well as any other Step property such as the category and the description of the Step. It also points to the Step's source code.", + "term": "step.yml" + }, + "trigger": { + "definition": "A trigger or build trigger is a configuration for automatically launching a Bitrise build when a specified event happens. Triggers require a webhook set up at your Git hosting provider.", + "term": "Trigger" + }, + "workflow": { + "definition": "A Workflow is a collection of Steps, Environment Variables, and other configurations. When Bitrise starts a build, it runs one or more Workflows according to the configuration defined in the `bitrise.yml` file.", + "term": "Workflow" + }, + "workflow editor": { + "definition": "The Bitrise Workflow Editor allows you to edit your Workflows, configure Steps, upload files (including code signing files) and manage your app's triggers and stacks on a graphical user interface. It is available both online and [offline](/en/bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.html).", + "term": "Workflow Editor" + }, + "workspace": { + "definition": "A Workspace is an environment that allows you to manage your Bitrise apps and the team members working on the apps. You can create multiple Workspaces, and you can be invited to Workspaces by other Bitrise users. To be able to add apps and run builds, you either need to be part of a Workspace, or you have to be an outside contributor on an app's team.", + "term": "Workspace" + } +} \ No newline at end of file diff --git a/migration/live_nav_labels.json b/migration/live_nav_labels.json new file mode 100644 index 0000000..6eac7e4 --- /dev/null +++ b/migration/live_nav_labels.json @@ -0,0 +1,445 @@ +{ + "bitrise-build-cache.html": "Bitrise Build Cache", + "bitrise-build-cache/build-cache-for-bazel.html": "Build Cache for Bazel", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds.html": "Configuring the Bitrise Build Cache for Bazel in local environments", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments.html": "Configuring the Build Cache for Bazel in non-Bitrise CI environments", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment.html": "Configuring the Bitrise Build Cache for Bazel in the Bitrise CI environment", + "bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel.html": "Remote build execution for Bazel", + "bitrise-build-cache/build-cache-for-gradle.html": "Build Cache for Gradle", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds.html": "Configuring the Build Cache for Gradle in local environments", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments.html": "Configuring the Build Cache for Gradle in non-Bitrise CI environments", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment.html": "Configuring the Build Cache for Gradle in the Bitrise CI environment", + "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache.html": "Gradle configuration cache", + "bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds.html": "Gradle execution reason diagnostic builds", + "bitrise-build-cache/build-cache-for-xcode.html": "Build Cache for Xcode", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments.html": "Configuring the Build Cache for Xcode in non-Bitrise CI environments", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.html": "Configuring the Build Cache for Xcode in the Bitrise CI environment", + "bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq.html": "Xcode Compilation Cache FAQ", + "bitrise-build-cache/getting-started-with-the-build-cache.html": "Bitrise Build Cache", + "bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache.html": "At-rest encryption for the Build Cache", + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache.html": "Clearing the Build Cache", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache.html": "Getting started", + "bitrise-build-cache/getting-started-with-the-build-cache/invocations.html": "Invocations", + "bitrise-build-cache/insights.html": "Insights for the Build Cache", + "bitrise-build-hub.html": "Bitrise Build Hub", + "bitrise-build-hub/build-hub-for-github-actions.html": "Build Hub for GitHub Actions", + "bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview.html": "Build Hub for GitHub Actions overview", + "bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions.html": "Configuring Build Hub for GitHub Actions", + "bitrise-build-hub/infrastructure.html": "Infrastructure", + "bitrise-build-hub/infrastructure/build-machine-types.html": "Build machine types", + "bitrise-build-hub/infrastructure/build-stacks.html": "Build stacks", + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks.html": "About build stacks", + "bitrise-build-hub/infrastructure/build-stacks/changelog.html": "Changelog", + "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.html": "Linux stack update policy", + "bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html": "macOS stack update policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy.html": "Stack deprecation and removal policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.html": "Stack update policy", + "bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines.html": "IP address ranges for the Bitrise build machines", + "bitrise-ci.html": "Bitrise CI", + "bitrise-ci/api.html": "API", + "bitrise-ci/api/adding-and-managing-apps.html": "Adding and managing projects", + "bitrise-ci/api/api-overview.html": "API overview", + "bitrise-ci/api/api-reference.html": "API reference", + "bitrise-ci/api/authenticating-with-the-bitrise-api.html": "Authenticating with the Bitrise API", + "bitrise-ci/api/github-app-configuration-api.html": "GitHub app configuration", + "bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs.html": "Identifying Workspaces and projects with their slugs", + "bitrise-ci/api/incoming-and-outgoing-webhooks.html": "Incoming and outgoing webhooks", + "bitrise-ci/api/managing-an-app-s-builds.html": "Managing an app's builds", + "bitrise-ci/api/managing-android-keystore-files.html": "Managing Android keystore files", + "bitrise-ci/api/managing-build-artifacts.html": "Managing build artifacts", + "bitrise-ci/api/managing-files-in-generic-file-storage.html": "Managing files in Generic File Storage", + "bitrise-ci/api/managing-ios-code-signing-files.html": "Managing iOS code signing files", + "bitrise-ci/api/managing-secrets-with-the-api.html": "Managing Secrets with the API", + "bitrise-ci/api/pagination-of-api-calls.html": "Pagination of API calls", + "bitrise-ci/api/triggering-and-aborting-builds.html": "Triggering and aborting builds", + "bitrise-ci/bitrise-cli.html": "Bitrise CLI", + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli.html": "Adding a new project from a CLI", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally.html": "Initializing a Bitrise project locally", + "bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html": "Installing and updating the Bitrise CLI", + "bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.html": "Installing and upgrading the offline Workflow Editor", + "bitrise-ci/bitrise-cli/managing-secrets-locally.html": "Managing Secrets locally", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli.html": "Running your first local build with the CLI", + "bitrise-ci/code-signing.html": "Code signing", + "bitrise-ci/code-signing/android-code-signing.html": "Android code signing", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle.html": "Android code signing in Gradle", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html": "Android code signing using the Android Sign Step", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio.html": "Android code signing with Android Studio", + "bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file.html": "Downloading a keystore file from Bitrise during a build", + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.html": "Uploading Android keystore files to Bitrise", + "bitrise-ci/code-signing/ios-code-signing.html": "iOS code signing", + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects.html": "Creating a signed IPA for Xcode projects", + "bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc.html": "Exporting iOS code signing files manually", + "bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files.html": "Generating iOS code signing files", + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects.html": "iOS code signing for Ionic and Cordova projects", + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing.html": "iOS code signing overview", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files---automatic-provisioning.html": "iOS code signing with automatic provisioning", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files---manual-provisioning.html": "iOS code signing with manual provisioning", + "bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files.html": "Protecting your code signing files", + "bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities.html": "Signing an IPA with multiple code signing identities", + "bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing.html": "Troubleshooting iOS code signing", + "bitrise-ci/configure-builds.html": "Configure builds", + "bitrise-ci/configure-builds/configuration-yaml.html": "Configuration YAML", + "bitrise-ci/configure-builds/configuration-yaml/accessing-a-build-s-bitrise-yml-file.html": "Accessing a build's configuration YAML", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview.html": "About configuration YAML", + "bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml.html": "Customizing your configuration YAML", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-app-s-bitrise-yml-file.html": "Editing a project's bitrise.yml configuration file", + "bitrise-ci/configure-builds/configuration-yaml/managing-a-project-s-configuration-yaml-file.html": "Storing an app's configuration YAML", + "bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration.html": "Modular YAML configuration", + "bitrise-ci/configure-builds/configuring-build-settings.html": "Configuring build settings", + "bitrise-ci/configure-builds/configuring-build-settings/build-priority.html": "Build priority", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.html": "Configuring email notifications", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration.html": "Sending Slack messages in a build", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions.html": "Configuring tool versions", + "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html": "Reporting the build status to your Git hosting provider", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.html": "Rolling builds", + "bitrise-ci/configure-builds/configuring-build-settings/selective-builds.html": "Selective builds", + "bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds.html": "Setting the stack for your builds", + "bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines.html": "Setting your Git credentials on build machines", + "bitrise-ci/configure-builds/environment-variables.html": "Environment Variables", + "bitrise-ci/configure-builds/secrets.html": "Secrets", + "bitrise-ci/dependencies-and-caching.html": "Dependencies and caching", + "bitrise-ci/dependencies-and-caching/android-dependencies.html": "Android dependencies", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview.html": "About dependencies and caching", + "bitrise-ci/dependencies-and-caching/flutter-dependencies.html": "Flutter dependencies", + "bitrise-ci/dependencies-and-caching/ios-dependencies.html": "iOS dependencies", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage.html": "Managing dependencies with Carthage", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods.html": "Managing dependencies with CocoaPods", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm.html": "Managing dependencies with SPM", + "bitrise-ci/dependencies-and-caching/key-based-caching.html": "Key-based caching", + "bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives.html": "Accessing key-based cache archives on the website", + "bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.html": "Dedicated caching Steps for dependency managers", + "bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching.html": "Using key-based caching in your builds", + "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching.html": "Migrating from branch-based caching to key-based caching", + "bitrise-ci/dependencies-and-caching/react-native-dependencies.html": "React Native dependencies", + "bitrise-ci/deploying.html": "Deploying", + "bitrise-ci/deploying/android-deployment.html": "Android deployment", + "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play.html": "Deploying Android apps to Bitrise and Google Play", + "bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery.html": "Deploying apps to Huawei AppGallery", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab.html": "Exporting a universal APK from an AAB", + "bitrise-ci/deploying/android-deployment/generate-and-deploy-multiple-flavor-apks-in-a-single-workflow.html": "Generate and deploy multiple flavor APKs in a single Workflow", + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles.html": "Generating and deploying Android app bundles", + "bitrise-ci/deploying/bitrise-ota-app-deployment.html": "Bitrise OTA app deployment", + "bitrise-ci/deploying/deploying-apps-to-applivery.html": "Deploying apps to Applivery", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise.html": "Deploying apps to DeployGate from Bitrise", + "bitrise-ci/deploying/deploying-to-testfairy-with-bitrise.html": "Deploying to TestFairy with Bitrise", + "bitrise-ci/deploying/deploying-your-app-to-appaloosa.html": "Deploying your app to Appaloosa", + "bitrise-ci/deploying/ios-deployment.html": "iOS deployment", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing.html": "Deploying an iOS app for external testing", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators.html": "Deploying an iOS app for simulators", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect.html": "Deploying an iOS app to App Store Connect", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitrise-io.html": "Deploying an iOS app to Bitrise.io", + "bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page.html": "Installing an .ipa file", + "bitrise-ci/getting-started.html": "Getting started", + "bitrise-ci/getting-started/adding-a-ci-configuration-to-a-project.html": "Adding a CI configuration to a project", + "bitrise-ci/getting-started/adding-a-new-project.html": "Adding a new project", + "bitrise-ci/getting-started/getting-started.html": "Getting started with Bitrise CI", + "bitrise-ci/getting-started/key-bitrise-concepts.html": "Key Bitrise CI concepts", + "bitrise-ci/getting-started/migrating-to-bitrise.html": "Migrating to Bitrise", + "bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise.html": "About migrating to Bitrise", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise.html": "Migrating from App Center to Bitrise", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise.html": "Migrating from Jenkins to Bitrise", + "bitrise-ci/getting-started/quick-start-guides.html": "Quick start guides", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects.html": "Getting started with Android projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects.html": "Getting started with Expo projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects.html": "Getting started with Flutter projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ionic-cordova-projects.html": "Getting started with Ionic/Cordova projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects.html": "Getting started with iOS projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects.html": "Getting started with macOS projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects.html": "Getting started with React Native projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci.html": "Getting started with web CI projects", + "bitrise-ci/getting-started/the-bitrise-dashboard.html": "The Bitrise dashboard", + "bitrise-ci/getting-started/unity-on-bitrise.html": "Unity software integration on Bitrise", + "bitrise-ci/references.html": "References", + "bitrise-ci/references/available-environment-variables.html": "Available Environment Variables", + "bitrise-ci/references/bitrise-tools.html": "Bitrise tools", + "bitrise-ci/references/configuration-yaml-reference.html": "Configuration YAML reference", + "bitrise-ci/references/steps-reference.html": "Steps reference", + "bitrise-ci/references/steps-reference/about-step-code.html": "About Step code", + "bitrise-ci/references/steps-reference/step-data-in-the-bitrise-yml-file.html": "Step data in the bitrise.yml file", + "bitrise-ci/references/steps-reference/step-inputs-reference.html": "Step inputs reference", + "bitrise-ci/references/steps-reference/step-outputs-reference.html": "Step outputs reference", + "bitrise-ci/references/steps-reference/step-properties-reference.html": "Step properties", + "bitrise-ci/references/steps-reference/step-reference-id-format.html": "Step reference/ID format", + "bitrise-ci/run-and-analyze-builds.html": "Run and analyze builds", + "bitrise-ci/run-and-analyze-builds/build-annotations.html": "Build Annotations", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting.html": "Build data and troubleshooting", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer.html": "AI build fixer", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.html": "AI build summary", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github.html": "GitHub Checks with the Bitrise GitHub App", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html": "Build logs", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details.html": "Checking build details", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine.html": "Debugging your build on your own machine", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build.html": "Rebuilding a failed build", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access.html": "Remote access", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments.html": "Reporting build problems in PR comments", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports.html": "Viewing HTML reports", + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning.html": "Build numbering and app versioning", + "bitrise-ci/run-and-analyze-builds/build-statuses.html": "Build statuses", + "bitrise-ci/run-and-analyze-builds/build-triggers.html": "Build triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers.html": "About build triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html": "Configuring build triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers.html": "Legacy project-based triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request.html": "Skipping a given commit or pull request", + "bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger.html": "Starting parallel builds with a single trigger", + "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands.html": "Triggering builds by Slack commands", + "bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.html": "YAML syntax for build triggers", + "bitrise-ci/run-and-analyze-builds/finding-a-specific-build.html": "Finding a specific build", + "bitrise-ci/run-and-analyze-builds/managing-build-files.html": "Managing build files", + "bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy.html": "Artifact retention policy", + "bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html": "Build artifacts online", + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html": "Uploading files for your builds", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds.html": "Using encrypted files in your builds", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds.html": "Using files in your builds", + "bitrise-ci/run-and-analyze-builds/starting-builds.html": "Starting builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds.html": "Approving pull request builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.html": "Scheduling builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html": "Starting builds manually", + "bitrise-ci/testing.html": "Testing", + "bitrise-ci/testing/deploying-and-viewing-test-results.html": "Deploying and viewing test results", + "bitrise-ci/testing/detecting-and-quarantining-flaky-tests.html": "Detecting and quarantining flaky tests", + "bitrise-ci/testing/device-testing-with-firebase.html": "Device testing with Firebase", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android.html": "Device testing for Android", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.html": "Device testing for iOS", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps.html": "Running device tests with Firebase for multiplatform apps", + "bitrise-ci/testing/measuring-your-code-coverage-with-codecov.html": "Measuring your code coverage with Codecov", + "bitrise-ci/testing/test-sharding.html": "Test sharding", + "bitrise-ci/testing/testing-android-apps.html": "Testing Android apps", + "bitrise-ci/testing/testing-android-apps/android-unit-tests.html": "Running Android unit tests", + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps.html": "Running instrumented tests for Android apps", + "bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps.html": "Running lint checks for your Android apps", + "bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstack-s-app-automate.html": "Testing your app with Browserstack's App Automate", + "bitrise-ci/testing/testing-flutter-apps.html": "Testing Flutter apps", + "bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise.html": "Running the Dart analyzer on Bitrise", + "bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps.html": "Running unit and UI tests on Flutter apps", + "bitrise-ci/testing/testing-ios-apps.html": "Testing iOS apps", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator.html": "Building an iOS app for a simulator", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.html": "Building an iOS app for testing", + "bitrise-ci/testing/testing-ios-apps/registering-a-test-device.html": "Registering test devices for iOS apps", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.html": "Running unit and UI tests for iOS apps", + "bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format.html": "Viewing Xcode test results in rich HTML format", + "bitrise-ci/testing/testing-react-native-apps.html": "Testing React Native apps", + "bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise.html": "Running Detox tests on Bitrise", + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps.html": "Running tests for React Native apps", + "bitrise-ci/workflows-and-pipelines.html": "Workflows and Pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines.html": "Pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.html": "About Pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq.html": "Pipeline Management FAQ", + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline.html": "Configuring Pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline.html": "Converting a Pipeline with stages into a graph Pipeline", + "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines.html": "Default Pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds.html": "Pipeline builds", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html": "Pipelines with stages", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step.html": "Developing your own Bitrise Step", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner.html": "Creating your own Bitrise project scanner", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step.html": "Developing a new Step", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users.html": "Sharing Steps with all Bitrise users", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps.html": "Verified Steps", + "bitrise-ci/workflows-and-pipelines/steps.html": "Steps", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow.html": "Adding Steps to a Workflow", + "bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps.html": "Detecting and aborting hanging Steps without output", + "bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace.html": "Disabling third-party Steps in a workspace", + "bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally.html": "Enabling or disabling a Step conditionally", + "bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.html": "Setting a time limit for Steps", + "bitrise-ci/workflows-and-pipelines/steps/skipping-steps.html": "Configuring a Step to always run", + "bitrise-ci/workflows-and-pipelines/steps/step-bundles.html": "Step bundles", + "bitrise-ci/workflows-and-pipelines/steps/step-inputs.html": "Step inputs", + "bitrise-ci/workflows-and-pipelines/steps/step-versions.html": "Step versioning", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview.html": "Steps overview", + "bitrise-ci/workflows-and-pipelines/workflows.html": "Workflows", + "bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another.html": "Copying Workflows from one project to another", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.html": "Creating a Workflow", + "bitrise-ci/workflows-and-pipelines/workflows/default-workflows.html": "Default Workflows", + "bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes.html": "Generic Workflow recipes", + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows.html": "Managing Workflows", + "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects.html": "Workflow recipes for Android apps", + "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects.html": "Workflow recipes for cross-platform apps", + "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects.html": "Workflow recipes for iOS apps", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html": "Workflows overview", + "bitrise-platform.html": "Bitrise as a Platform", + "bitrise-platform/accounts.html": "Account", + "bitrise-platform/accounts/accounts-overview.html": "About personal accounts", + "bitrise-platform/accounts/deleting-your-bitrise-account.html": "Deleting your Bitrise account", + "bitrise-platform/accounts/editing-your-profile-settings.html": "Editing your profile settings", + "bitrise-platform/accounts/github-token-scanning.html": "GitHub token scanning", + "bitrise-platform/accounts/personal-access-tokens.html": "Personal access tokens", + "bitrise-platform/accounts/resetting-your-password.html": "Resetting your password", + "bitrise-platform/accounts/saml-sso-in-bitrise.html": "SAML SSO on Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.html": "Configuring SAML SSO on Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.html": "Configuring SCIM", + "bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso.html": "Logging in via SAML SSO", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise.html": "Setting up AD FS SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise.html": "Setting up Auth0 SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise.html": "Setting up Entra ID (former Azure AD) SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise.html": "Setting up Google SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise.html": "Setting up Idaptive SAML SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise.html": "Setting up Okta SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise.html": "Setting up OneLogin SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise.html": "Setting up Ping Identity SSO for Bitrise", + "bitrise-platform/accounts/two-factor-authentication.html": "Two-factor authentication", + "bitrise-platform/ai.html": "AI", + "bitrise-platform/ai/ai-faq---how-bitrise-leverages-ai-technologies-in-its-features-and-services.html": "AI FAQ \u2013 How Bitrise leverages AI technologies in its features and services", + "bitrise-platform/ai/ai-features-on-bitrise.html": "AI features on Bitrise", + "bitrise-platform/ai/bitrise-mcp.html": "Bitrise MCP", + "bitrise-platform/ai/enabling-ai-features-on-bitrise.html": "Enabling AI features on Bitrise", + "bitrise-platform/getting-started.html": "Getting started", + "bitrise-platform/getting-started/collaboration.html": "Collaboration", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform.html": "Getting started with the platform", + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform.html": "Key concepts of the Bitrise platform", + "bitrise-platform/getting-started/signing-up-for-bitrise.html": "Signing up for Bitrise", + "bitrise-platform/infrastructure.html": "Infrastructure", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html": "Bitrise on AWS: Cloud Controller", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/aws-cloudformation-templates.html": "AWS CloudFormation templates", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/bitrise-on-aws-overview.html": "Bitrise on AWS overview", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/configuring-a-machine-pool.html": "Configuring a machine pool", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller.html": "Creating and configuring a controller", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/subscribing-to-the-bitrise-on-aws-ami.html": "Subscribing to the Bitrise on AWS AMIs", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/troubleshooting-the-cloud-controller.html": "Troubleshooting the cloud controller", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup.html": "Bitrise on AWS: manual setup", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances.html": "Advanced options for Amazon EC2 Mac and Linux instances", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/allocating-a-dedicated-host-for-mac-instances.html": "Allocating a dedicated host for EC2 Mac instances", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/aws-manual-setup-overview.html": "AWS manual setup overview", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami.html": "Launching an EC2 Mac or Linux instance for the Bitrise AMI", + "bitrise-platform/infrastructure/bitrise-on-aws--os-security-patching.html": "Bitrise on AWS: OS security patching", + "bitrise-platform/infrastructure/build-machines.html": "Build machines", + "bitrise-platform/infrastructure/build-machines/about-build-machines.html": "About build machines", + "bitrise-platform/infrastructure/build-machines/build-machine-types.html": "Build machine types", + "bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines.html": "Configuring network access with IP allowlists", + "bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines.html": "Freeing up storage space on build machines", + "bitrise-platform/infrastructure/build-stacks.html": "Build stacks", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks.html": "About build stacks", + "bitrise-platform/infrastructure/build-stacks/changelog.html": "Changelog", + "bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy.html": "Linux stack update policy", + "bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy.html": "macOS stack update policy", + "bitrise-platform/infrastructure/build-stacks/managing-java-versions.html": "Managing Java versions", + "bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.html": "Preinstalled tools on Bitrise stacks", + "bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy.html": "Stack deprecation and removal policy", + "bitrise-platform/infrastructure/build-stacks/stack-update-policy.html": "Stack update policy", + "bitrise-platform/infrastructure/build-stacks/the-android-linux-docker-environment.html": "The Android/Linux/Docker environment", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments.html": "Cleaning up a persistent build environment", + "bitrise-platform/infrastructure/code-security.html": "Code security", + "bitrise-platform/infrastructure/configuring-runner-pools.html": "Configuring runner pools for self-hosted builds", + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms.html": "Customizable enterprise build platforms", + "bitrise-platform/infrastructure/docker-containers-on-bitrise.html": "Docker containers on Bitrise", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise.html": "About Docker containers on Bitrise", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image.html": "Building your own Docker image on Bitrise", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers.html": "Step execution containers", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers.html": "Service containers", + "bitrise-platform/infrastructure/infrastructure-overview.html": "About infrastructure", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise.html": "Running Bitrise builds on-premise", + "bitrise-platform/infrastructure/running-your-build-locally-in-docker.html": "Running your build locally in Docker", + "bitrise-platform/integrations.html": "Integrations", + "bitrise-platform/integrations/about-integrations.html": "About integrations", + "bitrise-platform/integrations/ai-code-reviewer.html": "AI code reviewer", + "bitrise-platform/integrations/apple-services-connection.html": "Apple services connection", + "bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.html": "About connecting to Apple services", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html": "Connecting to an Apple service with API key", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.html": "Connecting to an Apple service with Apple ID", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs.html": "Connecting to an Apple Service with Step inputs", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication.html": "Steps requiring Apple authentication", + "bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise.html": "Connecting a Google Play Console service account to Bitrise", + "bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.html": "Connecting to a VPN during a build", + "bitrise-platform/integrations/endpoint-detection-and-response.html": "Endpoint Detection and Response", + "bitrise-platform/integrations/oidc-authentication.html": "OIDC authentication", + "bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview.html": "OIDC authentication overview", + "bitrise-platform/integrations/oidc-authentication/oidc-for-aws.html": "OIDC for AWS", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise.html": "OIDC for Bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-gcp.html": "OIDC for GCP", + "bitrise-platform/integrations/the-service-credential-user.html": "The service credential user", + "bitrise-platform/integrations/webhooks.html": "Webhooks", + "bitrise-platform/integrations/webhooks/adding-incoming-webhooks.html": "Adding incoming webhooks", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks.html": "Adding outgoing webhooks", + "bitrise-platform/integrations/webhooks/webhooks-overview.html": "Webhooks overview", + "bitrise-platform/mobile-devops-platform.html": "Mobile DevOps Platform", + "bitrise-platform/projects.html": "Projects", + "bitrise-platform/projects/changing-the-owner-of-a-project.html": "Changing the owner of a project", + "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch.html": "Configuring the repository URL and default branch", + "bitrise-platform/projects/creating-white-label-app-versions.html": "Creating white label app versions", + "bitrise-platform/projects/embedding-a-project-status-badge.html": "Embedding a build status badge to your site", + "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project.html": "Enabling the Bitrise Support Access for your project", + "bitrise-platform/projects/managing-user-access-to-a-project.html": "Managing user access to a project", + "bitrise-platform/projects/projects-overview.html": "Projects overview", + "bitrise-platform/projects/public-projects.html": "Public projects", + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html": "Roles and permissions for Bitrise CI", + "bitrise-platform/repository-access.html": "Repository access", + "bitrise-platform/repository-access/about-repository-access.html": "About repository access", + "bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies.html": "Projects with submodules or private repo dependencies", + "bitrise-platform/repository-access/configuring-https-authorization-credentials.html": "Configuring HTTPS authorization", + "bitrise-platform/repository-access/configuring-ssh-keys.html": "Configuring SSH keys", + "bitrise-platform/repository-access/connecting-bitbucket-server-instances.html": "Connecting Bitbucket Server instances", + "bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances.html": "Connecting self-hosted GitLab instances", + "bitrise-platform/repository-access/github-app-integration.html": "GitHub app integration for GitHub Cloud", + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise.html": "GitHub app integration for GitHub Enterprise Server", + "bitrise-platform/repository-access/repository-access-with-oauth.html": "OAuth connection", + "bitrise-platform/workspaces.html": "Workspaces", + "bitrise-platform/workspaces/changing-the-owners-of-a-workspace.html": "Managing the owners of a workspace", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces.html": "Collaboration and permissions", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces.html": "Roles and permissions in workspaces", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration.html": "Workspace members", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.html": "Workspace groups", + "bitrise-platform/workspaces/creating-workspaces.html": "Creating workspaces", + "bitrise-platform/workspaces/workspace-api-token.html": "Workspace API token", + "bitrise-platform/workspaces/workspace-billing-and-invoicing.html": "Workspace billing", + "bitrise-platform/workspaces/workspace-faq.html": "Workspace FAQ", + "bitrise-platform/workspaces/workspace-slack-integration.html": "Slack integration for workspaces", + "bitrise-platform/workspaces/workspaces-overview.html": "About workspaces", + "insights.html": "Insights", + "insights/available-metrics-in-insights.html": "Available metrics", + "insights/available-metrics-in-insights/bitrise-ci-metrics.html": "Bitrise CI metrics", + "insights/available-metrics-in-insights/build-cache-metrics.html": "Build cache metrics", + "insights/available-metrics-in-insights/command-metrics.html": "Command metrics", + "insights/configuring-alerts-in-insights.html": "Alerts", + "insights/getting-started-with-insights.html": "Getting started", + "insights/git-insights.html": "Git Insights", + "insights/insights-tutorials.html": "Tutorials", + "insights/insights-tutorials/credit-usage.html": "Credit usage", + "insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds.html": "Monitoring and optimizing your slowest mobile builds", + "insights/insights-tutorials/tracking-build-failure-rate.html": "Tracking build failure rate", + "insights/insights-tutorials/tracking-flaky-tests.html": "Tracking flaky tests", + "insights/insights-tutorials/tracking-test-failure-rate.html": "Tracking test failure rate", + "release-management.html": "Release Management", + "release-management/build-distribution.html": "Build distribution for testing", + "release-management/build-distribution/distributing-builds-to-testers.html": "Distributing builds to testers", + "release-management/build-distribution/tester-groups.html": "Tester groups", + "release-management/codepush.html": "Bitrise CodePush", + "release-management/codepush/about-codepush.html": "About CodePush", + "release-management/codepush/codepush-updates-with-bitrise-ci.html": "CodePush updates with Bitrise CI", + "release-management/codepush/configuring-your-app-for-codepush.html": "Configuring your app for CodePush", + "release-management/codepush/creating-a-codepush-deployment.html": "Creating a CodePush deployment", + "release-management/codepush/creating-and-releasing-codepush-updates.html": "Creating and releasing CodePush updates", + "release-management/configuring-connected-apps.html": "Apps", + "release-management/configuring-connected-apps/about-connected-apps.html": "About apps", + "release-management/configuring-connected-apps/changing-connected-app-appearance.html": "Changing the app title and the app icon", + "release-management/configuring-connected-apps/configuring-connected-app-integration.html": "Modifying a connected app's store connection", + "release-management/configuring-connected-apps/deleting-a-connected-app.html": "Deleting a connected app", + "release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags.html": "Integrating LaunchDarkly feature flags", + "release-management/configuring-connected-apps/release-management-roles-and-permissions.html": "Roles and permissions", + "release-management/getting-started-with-release-management.html": "Getting started", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management.html": "Adding a new app", + "release-management/getting-started-with-release-management/connecting-an-app.html": "Connecting an app", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management.html": "Connecting another CI service to Release Management", + "release-management/getting-started-with-release-management/getting-started-with-release-management.html": "Getting started", + "release-management/getting-started-with-release-management/managing-licenses.html": "Managing licenses", + "release-management/getting-started-with-release-management/release-management-concepts.html": "Release Management key concepts", + "release-management/installable-artifacts.html": "Installable artifacts", + "release-management/release-management-api.html": "Release Management API", + "release-management/releases.html": "Releases", + "release-management/releases/adding-a-new-release.html": "Adding a new release", + "release-management/releases/configuring-a-release.html": "Configuring a release", + "release-management/releases/configuring-a-release/configuring-auto-upload.html": "Configuring auto-upload", + "release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications.html": "Configuring Slack and Teams notifications for releases", + "release-management/releases/configuring-a-release/deleting-a-release.html": "Deleting a release", + "release-management/releases/configuring-a-release/editing-the-description-of-a-release.html": "Editing the description of a release", + "release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management.html": "Outgoing webhooks in Release Management", + "release-management/releases/configuring-a-release/release-automation.html": "Configuring release automation", + "release-management/releases/managing-the-release-process.html": "Managing the release process", + "release-management/releases/managing-the-release-process/about-the-release-process.html": "About the release process", + "release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage.html": "Creating tasks for the Approvals stage", + "release-management/releases/managing-the-release-process/google-play-upload-stage.html": "Google Play upload stage", + "release-management/releases/managing-the-release-process/releasing-your-app-on-google-play.html": "Releasing your app on Google Play", + "release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.html": "Releasing your app on the App Store", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate.html": "Selecting a release candidate", + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.html": "Sending your app to App Store review", + "release-management/releases/managing-the-release-process/stop-managing-a-release.html": "Stop managing a release", + "release-management/releases/managing-the-release-process/testflight-upload-stage.html": "TestFlight upload stage", + "release-management/releases/release-presets.html": "Release presets" +} \ No newline at end of file diff --git a/migration/partials_index.json b/migration/partials_index.json new file mode 100644 index 0000000..63a06de --- /dev/null +++ b/migration/partials_index.json @@ -0,0 +1,596 @@ +{ + "components": { + "Partial_APIAuthenticationForAppleEnterpriseUsers": "api-authentication-for-apple-enterprise-users", + "Partial_AWSOfferingTypes": "aws-offering-types", + "Partial_AbandonedSteps": "abandoned-steps", + "Partial_AbortingABuild": "aborting-a-build", + "Partial_AbortingWorkflowsOfAFailedStage": "aborting-workflows-of-a-failed-stage", + "Partial_AboutTheGitHubEnterpriseServerIntegration": "about-the-github-enterprise-server-integration", + "Partial_AboutVerifiedSteps": "about-verified-steps", + "Partial_AccessingARepositoryViaVPN": "accessing-a-repository-via-vpn", + "Partial_AccessingBuildsTabAndSelectingABuild": "accessing-builds-tab-and-selecting-a-build", + "Partial_AddingACustomTrustPolicy": "adding-a-custom-trust-policy", + "Partial_AddingAFlutterAppToBitrise": "adding-a-flutter-app-to-bitrise", + "Partial_AddingAMacOSAppToBitrise": "adding-a-macos-app-to-bitrise", + "Partial_AddingANewAppFromASelfHostedGitLabRepository": "adding-a-new-app-from-a-self-hosted-gitlab-repository", + "Partial_AddingANewAppWithTheAPI": "adding-a-new-app-with-the-api", + "Partial_AddingANewUserToAWorkspaceWithEnforcedSAMLSSO": "adding-a-new-user-to-a-workspace-with-enforced-saml-sso", + "Partial_AddingAPIKeyAuthenticationDataOnBitrise": "adding-api-key-authentication-data-on-bitrise", + "Partial_AddingAReactNativeAppToBitrise": "adding-a-react-native-app-to-bitrise", + "Partial_AddingAStepIcon": "adding-a-step-icon", + "Partial_AddingAUnityProjectAsABitriseApp": "adding-a-unity-project-as-a-bitrise-app", + "Partial_AddingAWebCIProject": "adding-a-web-ci-project", + "Partial_AddingAnAndroidAppToBitrise": "adding-an-android-app-to-bitrise", + "Partial_AddingAnAvatarToYourAccount": "adding-an-avatar-to-your-account", + "Partial_AddingAnExpoAppToBitrise": "adding-an-expo-app-to-bitrise", + "Partial_AddingAnIOSAppToBitrise": "adding-an-ios-app-to-bitrise", + "Partial_AddingAnIonicCordovaAppToBitrise": "adding-an-ioniccordova-app-to-bitrise", + "Partial_AddingAnOIDCIdentityProviderInIAM": "adding-an-oidc-identity-provider-in-iam", + "Partial_AddingAnOutgoingWebhookToARelease": "adding-an-outgoing-webhook-to-a-release", + "Partial_AddingAnOutgoingWebhookToAnApp": "adding-an-outgoing-webhook-to-an-app", + "Partial_AddingAppleIDAuthenticationDataOnBitrise": "adding-apple-id-authentication-data-on-bitrise", + "Partial_AddingBitriseAsARelyingPartyTrustToADFS": "adding-bitrise-as-a-relying-party-trust-to-ad-fs", + "Partial_AddingBitriseToAzureADAsANewApplication": "adding-bitrise-to-azure-ad-as-a-new-application", + "Partial_AddingBitriseToOkta": "adding-bitrise-to-okta", + "Partial_AddingCustomHeadersToOutgoingWebhooks": "adding-custom-headers-to-outgoing-webhooks", + "Partial_AddingIndividualMembersToWorkspaces": "adding-individual-members-to-workspaces", + "Partial_AddingInstructionsForTesters": "adding-instructions-for-testers", + "Partial_AddingMembersToAWorkspaceGroup": "adding-members-to-a-workspace-group", + "Partial_AddingOutsideContributorToAProject": "adding-outside-contributor-to-a-project", + "Partial_AddingStepsFromAlternativeSources": "adding-steps-from-alternative-sources", + "Partial_AddingStepsInTheWorkflowEditor": "adding-steps-in-the-workflow-editor", + "Partial_AddingTheIdentityProviderSignOnURL": "adding-the-identity-provider-sign-on-url", + "Partial_AddingTheProject": "adding-the-project", + "Partial_AddingUsersGroupsToTheAppOnAzureAD": "adding-users-groups-to-the-app-on-azure-ad", + "Partial_AddingWorkspaceGroupsToAProject": "adding-workspace-groups-to-a-project", + "Partial_AddingYourFirstProject": "adding-your-first-project", + "Partial_AdditionalFlutterContent": "additional-flutter-content", + "Partial_AdditionalLinkedRepositories": "additional-linked-repositories", + "Partial_AdditionalLinkedRepositoriesForGitHubEnterpriseServerIntegration": "additional-linked-repositories-for-github-enterprise-server-integration", + "Partial_Admins": "admins", + "Partial_AdvancedConfigurationOptions": "advanced-configuration-options", + "Partial_AirGappedModeForTheController": "air-gapped-mode-for-the-controller", + "Partial_AndroidRunningUnitAndUITestsInParallel": "android-running-unit-and-ui-tests-in-parallel", + "Partial_AndroidUnitTestShardingByModule": "android-unit-test-sharding-by-module", + "Partial_AnnotatingABuild": "annotating-a-build", + "Partial_AppCenterBuildServiceAndBitriseBuilds": "app-center-build-service-and-bitrise-builds", + "Partial_AppCenterOrgsAndBitriseWorkspaces": "app-center-orgs-and-bitrise-workspaces", + "Partial_AppleServicePermissions": "apple-service-permissions", + "Partial_AppleServicesAuthenticationForAutomaticProvisioning": "apple-services-authentication-for-automatic-provisioning", + "Partial_AppleTwoFactorAuthenticationRequirements": "apple-two-factor-authentication-requirements", + "Partial_ArtifactDetails": "artifact-details", + "Partial_AssigningAPIKeyAuthenticationToYourApp": "assigning-api-key-authentication-to-your-app", + "Partial_AssigningAppleIDAuthenticationToYourApp": "assigning-apple-id-authentication-to-your-app", + "Partial_AuthenticatingInAStepWithAPIKey": "authenticating-in-a-step-with-api-key", + "Partial_AuthenticatingInAStepWithAppleIDAndPassword": "authenticating-in-a-step-with-apple-id-and-password", + "Partial_Authentication": "authentication", + "Partial_AuthenticationToBitriseWithOIDC": "authentication-to-bitrise-with-oidc", + "Partial_AuthenticationToExternalServicesWithOIDC": "authentication-to-external-services-with-oidc", + "Partial_AutomatingTheCodePushUpdateRelease": "automating-the-codepush-update-release", + "Partial_AvailabilityOrderOfEnvironmentVariables": "availability-order-of-environment-variables", + "Partial_AvailableParametersForSlackCommands": "available-parameters-for-slack-commands", + "Partial_BeforeYouStart": "before-you-start", + "Partial_BeforeYouStartDevelopingANewStep": "before-you-start-developing-a-new-step", + "Partial_BuildCacheMetrics": "build-cache-metrics", + "Partial_BuildMachineTypes": "build-machine-types", + "Partial_BuildingAnIOSAppForASimulator": "building-an-ios-app-for-a-simulator", + "Partial_CAUTIONSAMLSSORestrictions": "caution-saml-sso-restrictions", + "Partial_CachingDependenciesForWebCIProjects": "caching-dependencies-for-web-ci-projects", + "Partial_CancelingYourSubscription": "canceling-your-subscription", + "Partial_ChainingWorkflowsForAWhiteLabelApp": "chaining-workflows-for-a-white-label-app", + "Partial_ChainingWorkflowsTogether": "chaining-workflows-together", + "Partial_Changelog": "changelog", + "Partial_ChangingASubscriptionPlan": "changing-a-subscription-plan", + "Partial_ChangingMachineTypesInAllAppsAtTheSameTime": "changing-machine-types-in-all-apps-at-the-same-time", + "Partial_ChangingTheConnectionTypeFromOAuthToTheGitHubAppAPI": "changing-the-connection-type-from-oauth-to-the-github-app-api", + "Partial_ChangingTheDefaultBranch": "changing-the-default-branch", + "Partial_ChangingTheLocationOfTheAppSBitriseYmlFile": "changing-the-location-of-the-apps-bitriseyml-file", + "Partial_ChangingTheNumberOfYourBuild": "changing-the-number-of-your-build", + "Partial_ChangingTheRepositoryURL": "changing-the-repository-url", + "Partial_ChangingTheServiceCredentialUser": "changing-the-service-credential-user", + "Partial_ChangingYourBillingEmail": "changing-your-billing-email", + "Partial_ChangingYourBitriseUsernameEmailAndPassword": "changing-your-bitrise-username-email-and-password", + "Partial_ChangingYourEmailNotificationSettings": "changing-your-email-notification-settings", + "Partial_ChangingYourProjectSettings": "changing-your-project-settings", + "Partial_CheckingAndResendingWebhookDeliveries": "checking-and-resending-webhook-deliveries", + "Partial_CheckingChangesInTheBitriseYmlFile": "checking-changes-in-the-bitriseyml-file", + "Partial_CheckingSAMLSSOStatusesOnBitrise": "checking-saml-sso-statuses-on-bitrise", + "Partial_CheckingTheAvailableTestDevicesForAnApp": "checking-the-available-test-devices-for-an-app", + "Partial_CheckingWorkspaceMemberStatus": "checking-workspace-member-status", + "Partial_CleaningUpYourAWSBuildEnvironment": "cleaning-up-your-aws-build-environment", + "Partial_CloudControllerOverview": "cloud-controller-overview", + "Partial_CodePushPlansAndTiers": "codepush-plans-and-tiers", + "Partial_CodeSigningAndCleanVirtualMachines": "code-signing-and-clean-virtual-machines", + "Partial_CodeSigningAndExportingAMacOSApp": "code-signing-and-exporting-a-macos-app", + "Partial_CodeSigningAndOtherFiles": "code-signing-and-other-files", + "Partial_CodeSigningForReactNativeApps": "code-signing-for-react-native-apps", + "Partial_CodeSigningIonicCordovaApps": "code-signing-ioniccordova-apps", + "Partial_CollaborationInProjects": "collaboration-in-projects", + "Partial_CollaborationInWorkspaces": "collaboration-in-workspaces", + "Partial_CollatingTestAttachmentsWithTestResults": "collating-test-attachments-with-test-results", + "Partial_ConditionalCaching": "conditional-caching", + "Partial_ConfiguringAPipelineWithStages": "configuring-a-pipeline-with-stages", + "Partial_ConfiguringAStageToAlwaysRun": "configuring-a-stage-to-always-run", + "Partial_ConfiguringBitriseAsASAMLAppForOkta": "configuring-bitrise-as-a-saml-app-for-okta", + "Partial_ConfiguringBuildStatusReporting": "configuring-build-status-reporting", + "Partial_ConfiguringClaimRules": "configuring-claim-rules", + "Partial_ConfiguringCodePushCredentialsOnBitrise": "configuring-codepush-credentials-on-bitrise", + "Partial_ConfiguringCodePushForExpoApps": "configuring-codepush-for-expo-apps", + "Partial_ConfiguringCodePushForReactNativeApps": "configuring-codepush-for-react-native-apps", + "Partial_ConfiguringPriorityForBuildTriggers": "configuring-priority-for-build-triggers", + "Partial_ConfiguringPriorityForWorkflowsAndPipelines": "configuring-priority-for-workflows-and-pipelines", + "Partial_ConfiguringPriorityWhenStartingABuildManually": "configuring-priority-when-starting-a-build-manually", + "Partial_ConfiguringSSHKeysForYourBitriseApp": "configuring-ssh-keys-for-your-bitrise-app", + "Partial_ConfiguringStepInputs": "configuring-step-inputs", + "Partial_ConfiguringTheGitLabConnection": "configuring-the-gitlab-connection", + "Partial_ConfiguringTheInstance": "configuring-the-instance", + "Partial_ConfiguringTheStepsForAutomaticProvisioning": "configuring-the-steps-for-automatic-provisioning", + "Partial_ConfiguringWebhooksForGitInsights": "configuring-webhooks-for-git-insights", + "Partial_ConfiguringYourGitHubActionsWorkflow": "configuring-your-github-actions-workflow", + "Partial_ConnectingAGitProviderAccountFromTheProfileSettingsPage": "connecting-a-git-provider-account-from-the-profile-settings-page", + "Partial_ConnectingAGitProviderAccountWhenAddingAnApp": "connecting-a-git-provider-account-when-adding-an-app", + "Partial_ConnectingAGoogleServiceAccountToTheWorkloadIdentityPool": "connecting-a-google-service-account-to-the-workload-identity-pool", + "Partial_ConnectingTheInstanceToYourBitriseWorkspace": "connecting-the-instance-to-your-bitrise-workspace", + "Partial_ConnectingToTheGHESInstance": "connecting-to-the-ghes-instance", + "Partial_ConnectivityAndSecurityForYourEC2Instance": "connectivity-and-security-for-your-ec2-instance", + "Partial_ContainerNestingRules": "container-nesting-rules", + "Partial_ContainerResourceOptions": "container-resource-options", + "Partial_ContentsOfABuildLog": "contents-of-a-build-log", + "Partial_CouldNotInstallTheAppOnADevice": "could-not-install-the-app-on-a-device", + "Partial_CraftingATokenRequest": "crafting-a-token-request", + "Partial_CreatingAMachinePool": "creating-a-machine-pool", + "Partial_CreatingANewAlert": "creating-a-new-alert", + "Partial_CreatingAPersonalAccessToken": "creating-a-personal-access-token", + "Partial_CreatingASignedIPAForXcodeProjects": "creating-a-signed-ipa-for-xcode-projects", + "Partial_CreatingATrustPolicyOnBitrise": "creating-a-trust-policy-on-bitrise", + "Partial_CreatingAWorkflowForCodePushUpdates": "creating-a-workflow-for-codepush-updates", + "Partial_CreatingAWorkloadIdentityPool": "creating-a-workload-identity-pool", + "Partial_CreatingAWorkspaceAPIToken": "creating-a-workspace-api-token", + "Partial_CreatingAlerts": "creating-alerts", + "Partial_CreatingAndUploadingAnIOSCodeSigningFile": "creating-and-uploading-an-ios-code-signing-file", + "Partial_CreatingAndUploadingAndroidKeystoreFiles": "creating-and-uploading-android-keystore-files", + "Partial_CreatingAndUploadingFilesToTheGenericFileStorage": "creating-and-uploading-files-to-the-generic-file-storage", + "Partial_CreatingBitriseAsAWebApplicationOnAuth0": "creating-bitrise-as-a-web-application-on-auth0", + "Partial_CreatingCustomStatusReports": "creating-custom-status-reports", + "Partial_CreatingGitHubPersonalAccessTokensForBuildHub": "creating-github-personal-access-tokens-for-build-hub", + "Partial_CreatingGroupsForWorkspaces": "creating-groups-for-workspaces", + "Partial_CreatingOrUpdatingAnExistingSecret": "creating-or-updating-an-existing-secret", + "Partial_CreatingOutgoingWebhooksWithTheAPI": "creating-outgoing-webhooks-with-the-api", + "Partial_CreatingProjectBasedTriggers": "creating-project-based-triggers", + "Partial_CreatingTargetBasedTriggers": "creating-target-based-triggers", + "Partial_CreatingTheGitHubApp": "creating-the-github-app", + "Partial_CreatingTheStep": "creating-the-step", + "Partial_CreatingYourOwnScanner": "creating-your-own-scanner", + "Partial_CreatingYourOwnStep": "creating-your-own-step", + "Partial_CreditUsageByAppWorkflowOrStep": "credit-usage-by-app-workflow-or-step", + "Partial_DashboardsInJenkinsAndBitrise": "dashboards-in-jenkins-and-bitrise", + "Partial_DatabaseConfigurationForRubyProjects": "database-configuration-for-ruby-projects", + "Partial_DeactivatingATrigger": "deactivating-a-trigger", + "Partial_DeclarativeToolSetup": "declarative-tool-setup", + "Partial_DecryptingYourFilesDuringABuild": "decrypting-your-files-during-a-build", + "Partial_DefaultWorkflowsForAJavaProject": "default-workflows-for-a-java-project", + "Partial_DefaultWorkflowsForANodeJsProject": "default-workflows-for-a-nodejs-project", + "Partial_DefaultWorkflowsForARubyProject": "default-workflows-for-a-ruby-project", + "Partial_DefaultWorkflowsForAnAndroidProject": "default-workflows-for-an-android-project", + "Partial_DefaultWorkflowsForAnIOSProject": "default-workflows-for-an-ios-project", + "Partial_DefaultWorkflowsForKotlin": "default-workflows-for-kotlin", + "Partial_DefaultWorkflowsForMultiplatformProjects": "default-workflows-for-multiplatform-projects", + "Partial_DefiningAServiceContainer": "defining-a-service-container", + "Partial_DefiningAnExecutionContainer": "defining-an-execution-container", + "Partial_DefiningConfigurationModules": "defining-configuration-modules", + "Partial_DefiningPipelinesStepsAndWorkflows": "defining-pipelines-steps-and-workflows", + "Partial_DeletingABuildArtifact": "deleting-a-build-artifact", + "Partial_DeletingABuildLog": "deleting-a-build-log", + "Partial_DeletingABuildSBitriseYmlFile": "deleting-a-builds-bitriseyml-file", + "Partial_DeletingAFileFromTheGenericFileStorage": "deleting-a-file-from-the-generic-file-storage", + "Partial_DeletingAScheduledBuild": "deleting-a-scheduled-build", + "Partial_DeletingAnAppUsingTheAPI": "deleting-an-app-using-the-api", + "Partial_DeployToAppStoreConnect": "deploy-to-app-store-connect", + "Partial_DeployingAFlutterApp": "deploying-a-flutter-app", + "Partial_DeployingAReactNativeApp": "deploying-a-react-native-app", + "Partial_DeployingAnAndroidAppToBitriseIo": "deploying-an-android-app-to-bitriseio", + "Partial_DeployingFilesIntoArtifacts": "deploying-files-into-artifacts", + "Partial_DeployingIonicCordovaApps": "deploying-ioniccordova-apps", + "Partial_DeployingOnAppCenterAndBitrise": "deploying-on-app-center-and-bitrise", + "Partial_DeployingTestResults": "deploying-test-results", + "Partial_DeployingTheAppToAppStoreConnect": "deploying-the-app-to-app-store-connect", + "Partial_DeployingTheAppToAppetizeIo": "deploying-the-app-to-appetizeio", + "Partial_DeployingTheAppToTheAppStoreConnect": "deploying-the-app-to-the-app-store-connect", + "Partial_DeployingToGooglePlay": "deploying-to-google-play", + "Partial_DeployingWebCIProjects": "deploying-web-ci-projects", + "Partial_DeployingWithTheDeployToBitriseIoStep": "deploying-with-the-deploy-to-bitriseio-step", + "Partial_DeployingYourAndroidAppBundleToGooglePlay": "deploying-your-android-app-bundle-to-google-play", + "Partial_DeployingYourExpoApp": "deploying-your-expo-app", + "Partial_DeprecatingAndroidDockerStacks": "deprecating-android-docker-stacks", + "Partial_DetectingFlakyTests": "detecting-flaky-tests", + "Partial_Developers": "developers", + "Partial_DiagnosingBottlenecksCausingBuildsToFail": "diagnosing-bottlenecks-causing-builds-to-fail", + "Partial_DiagnosingBottlenecksCausingSlowBuilds": "diagnosing-bottlenecks-causing-slow-builds", + "Partial_DiagnosticBuilds": "diagnostic-builds", + "Partial_DifferencesBetweenCachingSystems": "differences-between-caching-systems", + "Partial_DisablingAScheduledBuild": "disabling-a-scheduled-build", + "Partial_DisablingAStep": "disabling-a-step", + "Partial_DisablingAWorkspaceMemberSSAMLSSO": "disabling-a-workspace-members-saml-sso", + "Partial_DisablingAWorkspaceSSAMLSSO": "disabling-a-workspaces-saml-sso", + "Partial_DisablingGitHubChecks": "disabling-github-checks", + "Partial_DisablingThePublicInstallPageOfAnArtifact": "disabling-the-public-install-page-of-an-artifact", + "Partial_DisablingThirdPartySteps": "disabling-third-party-steps", + "Partial_DisablingTwoFactorAuthentication": "disabling-two-factor-authentication", + "Partial_DisconnectingAGitProviderAccount": "disconnecting-a-git-provider-account", + "Partial_DistributingAndroidReleaseCandidatesForTesting": "distributing-android-release-candidates-for-testing", + "Partial_DistributingIOSReleaseCandidatesForTesting": "distributing-ios-release-candidates-for-testing", + "Partial_DockerAuthenticationCredentials": "docker-authentication-credentials", + "Partial_DockerContainerProperties": "docker-container-properties", + "Partial_DockerContainerSupportForWebCIProjects": "docker-container-support-for-web-ci-projects", + "Partial_DocumentChangelog": "document-changelog", + "Partial_DoesBitriseRetainCustomerDataForTraining": "does-bitrise-retain-customer-data-for-training", + "Partial_DownloadingABuildLog": "downloading-a-build-log", + "Partial_DownloadingAFileUsingACustomScriptStep": "downloading-a-file-using-a-custom-script-step", + "Partial_DownloadingAFileUsingTheFileDownloaderStep": "downloading-a-file-using-the-file-downloader-step", + "Partial_DownloadingAnAndroidKeystoreFile": "downloading-an-android-keystore-file", + "Partial_DownloadingAndInstallingUnityOnBitrise": "downloading-and-installing-unity-on-bitrise", + "Partial_DownloadingDockerImagesFromQuayIo": "downloading-docker-images-from-quayio", + "Partial_DownloadingWorkspaceInvoices": "downloading-workspace-invoices", + "Partial_DuplicatingAnExistingAlert": "duplicating-an-existing-alert", + "Partial_EditingAScheduledBuild": "editing-a-scheduled-build", + "Partial_EditingASecret": "editing-a-secret", + "Partial_EditingAnExistingAlert": "editing-an-existing-alert", + "Partial_EditingTheBitriseYmlFileLocally": "editing-the-bitriseyml-file-locally", + "Partial_EditingTheBitriseYmlFileOnline": "editing-the-bitriseyml-file-online", + "Partial_EditingYourBuildConfiguration": "editing-your-build-configuration", + "Partial_EnableTheNoOutputTimeoutFunctionGloballyForAllSteps": "enable-the-no-output-timeout-function-globally-for-all-steps", + "Partial_EnablingBitriseAppForAGroupOrAnOrganizationalUnit": "enabling-bitrise-app-for-a-group-or-an-organizational-unit", + "Partial_EnablingCloudWatchBitriseAgentLogging": "enabling-cloudwatch-bitrise-agent-logging", + "Partial_EnablingGitHubChecks": "enabling-github-checks", + "Partial_EnablingTheAICodeReviewer": "enabling-the-ai-code-reviewer", + "Partial_EnablingTheNoOutputTimeoutFunctionForSpecificSteps": "enabling-the-no-output-timeout-function-for-specific-steps", + "Partial_EnablingTwoFactorAuthentication": "enabling-two-factor-authentication", + "Partial_EncryptingYourFiles": "encrypting-your-files", + "Partial_EnforcingSAMLSSOOnAWorkspace": "enforcing-saml-sso-on-a-workspace", + "Partial_ExampleVPNConfigurations": "example-vpn-configurations", + "Partial_ExamplesOfRunIfExpressions": "examples-of-run-if-expressions", + "Partial_ExitingABuildTriggeredByADraftPR": "exiting-a-build-triggered-by-a-draft-pr", + "Partial_ExportingAnADFSCertificate": "exporting-an-ad-fs-certificate", + "Partial_ExportingIOSCodeSigningCertificatesManually": "exporting-ios-code-signing-certificates-manually", + "Partial_ExportingIOSCodeSigningCertificatesWithXcode": "exporting-ios-code-signing-certificates-with-xcode", + "Partial_ExportingIOSProvisioningProfilesManually": "exporting-ios-provisioning-profiles-manually", + "Partial_ExportingIOSProvisioningProfilesWithXcode": "exporting-ios-provisioning-profiles-with-xcode", + "Partial_ExposingASecretToPullRequests": "exposing-a-secret-to-pull-requests", + "Partial_ExposingEnvVarsAndUsingThemInAnotherStepOrWorkflow": "exposing-env-vars-and-using-them-in-another-step-or-workflow", + "Partial_ExtendingGitHubAppPermissionsForEnterpriseServerUsers": "extending-github-app-permissions-for-enterprise-server-users", + "Partial_ExtendingGitHubAppPermissionsToBuildsAPI": "extending-github-app-permissions-to-builds-api", + "Partial_ExtendingGitHubAppPermissionsToTheBuilds": "extending-github-app-permissions-to-the-builds", + "Partial_ExtendingTheAvailabilityOfRemoteAccess": "extending-the-availability-of-remote-access", + "Partial_FetchingAndExchangingTokens": "fetching-and-exchanging-tokens", + "Partial_FetchingAndExchangingTokensWithGCP": "fetching-and-exchanging-tokens-with-gcp", + "Partial_FileCountLimitOnProvisioningProfiles": "file-count-limit-on-provisioning-profiles", + "Partial_FindingABuildLog": "finding-a-build-log", + "Partial_FindingFlakyTests": "finding-flaky-tests", + "Partial_FindingFrequentlyFailingBuilds": "finding-frequently-failing-builds", + "Partial_FindingFrequentlyFailingTests": "finding-frequently-failing-tests", + "Partial_FindingSlowBuilds": "finding-slow-builds", + "Partial_FindingYourFilesOnTheVM": "finding-your-files-on-the-vm", + "Partial_FollowingABuildLogLive": "following-a-build-log-live", + "Partial_FormattingYourAnnotations": "formatting-your-annotations", + "Partial_FurtherQuestionsInComplianceAndSecurity": "further-questions-in-compliance-and-security", + "Partial_GeneratingACodeSigningCertificateManually": "generating-a-code-signing-certificate-manually", + "Partial_GeneratingACodeSigningCertificateWithXcode": "generating-a-code-signing-certificate-with-xcode", + "Partial_GeneratingAProvisioningProfileManually": "generating-a-provisioning-profile-manually", + "Partial_GeneratingAProvisioningProfileWithXcode": "generating-a-provisioning-profile-with-xcode", + "Partial_GeneratingAnAndroidAppBundleFile": "generating-an-android-app-bundle-file", + "Partial_GeneratingExportOptionsPlist": "generating-export-options-plist", + "Partial_GeneratingMultiFlavorAPKs": "generating-multi-flavor-apks", + "Partial_GeneratingYourOwnSSHKeypair": "generating-your-own-ssh-keypair", + "Partial_GettingASpecificIOSCodeSigningFileSData": "getting-a-specific-ios-code-signing-files-data", + "Partial_GettingConfigurationInformationFromGSuiteAndBitrise": "getting-configuration-information-from-g-suite-and-bitrise", + "Partial_GettingToReleaseConfiguration": "getting-to-release-configuration", + "Partial_GettingToTheProjectSettingsPage": "getting-to-the-project-settings-page", + "Partial_GettingToYourProfileSettings": "getting-to-your-profile-settings", + "Partial_GettingYourCodePushCredentials": "getting-your-codepush-credentials", + "Partial_GitCloningSubmodulesAndRepositoryDependencies": "git-cloning-submodules-and-repository-dependencies", + "Partial_GitHubApp": "github-app", + "Partial_GitHubChecksTestSummary": "github-checks-test-summary", + "Partial_GlobalAccessGroups": "global-access-groups", + "Partial_GradleTasksAndCaching": "gradle-tasks-and-caching", + "Partial_HTTPSAuthorization": "https-authorization", + "Partial_HaveYouLostYourAuthenticatorAndRecoveryCodes": "have-you-lost-your-authenticator-and-recovery-codes", + "Partial_HowDoWeGoAboutStepDuplications": "how-do-we-go-about-step-duplications", + "Partial_HowDoesBitriseApproachUsingAICapabilitiesInTheirServices": "how-does-bitrise-approach-using-ai-capabilities-in-their-services", + "Partial_HowIsCustomerDataUsedWithAIOnBitrise": "how-is-customer-data-used-with-ai-on-bitrise", + "Partial_HowOftenDoesBitriseUpdateItsAIModels": "how-often-does-bitrise-update-its-ai-models", + "Partial_HowTheCodeReviewerWorks": "how-the-code-reviewer-works", + "Partial_IMPORTANTArtifactRetentionPolicy": "important-artifact-retention-policy", + "Partial_IMPORTANTFamiliarityWithTheStructureOfTheBitriseYmlFile": "important-familiarity-with-the-structure-of-the-bitriseyml-file", + "Partial_IMPORTANTNoInboundTrafficRequired": "important-no-inbound-traffic-required", + "Partial_IMPORTANTNoStepInputModificationsNeeded": "important-no-step-input-modifications-needed", + "Partial_IMPORTANTUploadTheDistributionANDTheDevelopmentSigningCertificates": "important-upload-the-distribution-and-the-development-signing-certificates", + "Partial_IMPORTANTYAMLFilesSizeLimitation": "important-yaml-files-size-limitation", + "Partial_IOSCodeSigningStepsFail": "ios-code-signing-steps-fail", + "Partial_IPAddressesForTheBitriseWebsite": "ip-addresses-for-the-bitrise-website", + "Partial_IPAddressesForTheBuildMachines": "ip-addresses-for-the-build-machines", + "Partial_IgnoringAFailedStepWithoutFailingTheBuild": "ignoring-a-failed-step-without-failing-the-build", + "Partial_IncludingConfigurationFromMultipleYAMLFiles": "including-configuration-from-multiple-yaml-files", + "Partial_IncreasingDiskSizeOnAMacInstance": "increasing-disk-size-on-a-mac-instance", + "Partial_InstallingAnIpaFileOnTestDevices": "installing-an-ipa-file-on-test-devices", + "Partial_InstallingAnIpaFileOnTestDevicesFromTheArtifactsTab": "installing-an-ipa-file-on-test-devices-from-the-artifacts-tab", + "Partial_InstallingDependenciesForIonicCordovaReactApps": "installing-dependencies-for-ioniccordovareact-apps", + "Partial_InstallingTheBitriseCLIWithCurl": "installing-the-bitrise-cli-with-curl", + "Partial_InstallingTheBitriseCLIWithHomebrew": "installing-the-bitrise-cli-with-homebrew", + "Partial_InstallingTheBitriseGitHubAppForGitHubChecks": "installing-the-bitrise-github-app-for-github-checks", + "Partial_InstallingTheGitHubAppIntegration": "installing-the-github-app-integration", + "Partial_InstallingTheOfflineWorkflowEditorToYourComputer": "installing-the-offline-workflow-editor-to-your-computer", + "Partial_IntegratedSSOManagementOnBitrise": "integrated-sso-management-on-bitrise", + "Partial_IntegratingCodecovWithBitrise": "integrating-codecov-with-bitrise", + "Partial_IonicCordovaCodeSigningWithAutomaticProvisioning": "ioniccordova-code-signing-with-automatic-provisioning", + "Partial_IonicCordovaCodeSigningWithManualProvisioning": "ioniccordova-code-signing-with-manual-provisioning", + "Partial_IsItPossibleToDisableAIFeaturesOnBitrise": "is-it-possible-to-disable-ai-features-on-bitrise", + "Partial_JenkinsPipelineBitriseWorkflow": "jenkins-pipeline-bitrise-workflow", + "Partial_JenkinsPluginsAndBitriseSteps": "jenkins-plugins-and-bitrise-steps", + "Partial_JenkinsfileBitriseYAML": "jenkinsfile-bitrise-yaml", + "Partial_KeyBasedCachingTemplatesAndFunctions": "key-based-caching-templates-and-functions", + "Partial_KeyMatchingForCacheArchives": "key-matching-for-cache-archives", + "Partial_LimitationsAndAlternatives": "limitations-and-alternatives", + "Partial_ListingBuildArtifacts": "listing-build-artifacts", + "Partial_ListingTheAndroidKeystoreFilesOfAnApp": "listing-the-android-keystore-files-of-an-app", + "Partial_ListingTheArchivedBuildsOfAnApp": "listing-the-archived-builds-of-an-app", + "Partial_ListingTheIOSCodeSigningFilesOfAnApp": "listing-the-ios-code-signing-files-of-an-app", + "Partial_ListingTheUploadedFilesOfAnApp": "listing-the-uploaded-files-of-an-app", + "Partial_LockingAStepToAMajorOrMinorVersion": "locking-a-step-to-a-major-or-minor-version", + "Partial_MaintainingMacOSStacks": "maintaining-macos-stacks", + "Partial_ManagingAnExistingApp": "managing-an-existing-app", + "Partial_ManagingAppAccessForWorkspaceGroups": "managing-app-access-for-workspace-groups", + "Partial_ManagingAppNotifications": "managing-app-notifications", + "Partial_ManagingBuildsOnJenkinsAndOnBitrise": "managing-builds-on-jenkins-and-on-bitrise", + "Partial_ManagingContributions": "managing-contributions", + "Partial_ManagingDependenciesForAndroidApps": "managing-dependencies-for-android-apps", + "Partial_ManagingDependenciesForWebCIProjects": "managing-dependencies-for-web-ci-projects", + "Partial_ManagingSecretsFromACentralLocation": "managing-secrets-from-a-central-location", + "Partial_ManagingYourWorkspaces": "managing-your-workspaces", + "Partial_MasterAndAgentOnJenkinsBitriseStacks": "master-and-agent-on-jenkins-bitrise-stacks", + "Partial_MergeQueueSupport": "merge-queue-support", + "Partial_MigrationFromV1ToV2": "migration-from-v1-to-v2", + "Partial_ModifyingAndDeletingOutgoingWebhooksWithTheAPI": "modifying-and-deleting-outgoing-webhooks-with-the-api", + "Partial_MovingTheBitriseYmlFileBackToBitriseIo": "moving-the-bitriseyml-file-back-to-bitriseio", + "Partial_NOTEBuildRetentionFor200Days": "note-build-retention-for-200-days", + "Partial_NOTEDoYouHaveABitriseAccount": "note-do-you-have-a-bitrise-account", + "Partial_NOTESecretsInSelfHostedEnvironments": "note-secrets-in-self-hosted-environments", + "Partial_NOTESigningUpWithEmail": "note-signing-up-with-email", + "Partial_NamingAndDescribingAStep": "naming-and-describing-a-step", + "Partial_NestedStepBundles": "nested-step-bundles", + "Partial_OAuthConnection": "oauth-connection", + "Partial_OffsettingTheBuildVersion": "offsetting-the-build-version", + "Partial_OpeningAnAppInReleaseManagement": "opening-an-app-in-release-management", + "Partial_OpeningTheWorkflowEditor": "opening-the-workflow-editor", + "Partial_OpeningTheWorkflowEditorAndSelectingAWorkflow": "opening-the-workflow-editor-and-selecting-a-workflow", + "Partial_OpeningTheWorkspaceSettingsPage": "opening-the-workspace-settings-page", + "Partial_Options": "options", + "Partial_OrderOfPrecedenceForPrioritySettings": "order-of-precedence-for-priority-settings", + "Partial_OurRequestsToVerifiedStepMaintainers": "our-requests-to-verified-step-maintainers", + "Partial_Owners": "owners", + "Partial_ParallelismInPipelines": "parallelism-in-pipelines", + "Partial_Passwords": "passwords", + "Partial_PatchingOnLinuxEnvironment": "patching-on-linux-environment", + "Partial_PatchingOnMacOSBareMetalEnvironment": "patching-on-macos-bare-metal-environment", + "Partial_PatchingOnMacOSVirtualizedEnvironment": "patching-on-macos-virtualized-environment", + "Partial_PatchingScenariosOnAWS": "patching-scenarios-on-aws", + "Partial_PeopleManagementInJenkinsAndBitrise": "people-management-in-jenkins-and-bitrise", + "Partial_PipelineLevelProperties": "pipeline-level-properties", + "Partial_PipelinePriority": "pipeline-priority", + "Partial_PlatformEngineers": "platform-engineers", + "Partial_PreWarmingTheDiskAfterBooting": "pre-warming-the-disk-after-booting", + "Partial_PreparingTheProject": "preparing-the-project", + "Partial_PreparingYourEC2Instance": "preparing-your-ec2-instance", + "Partial_PreppingForInstallation": "prepping-for-installation", + "Partial_PreppingWorkflowsOfAWhiteLabelApp": "prepping-workflows-of-a-white-label-app", + "Partial_PreventingACommitFromTriggeringABuild": "preventing-a-commit-from-triggering-a-build", + "Partial_PreventingAPullRequestFromTriggeringABuild": "preventing-a-pull-request-from-triggering-a-build", + "Partial_ProductAccess": "product-access", + "Partial_ProjectBasedTriggerComponents": "project-based-trigger-components", + "Partial_ProjectLevelProperties": "project-level-properties", + "Partial_ProjectLevelRoles": "project-level-roles", + "Partial_PropertiesOfWorkflowsInPipelines": "properties-of-workflows-in-pipelines", + "Partial_ProtectingTheValueOfASecret": "protecting-the-value-of-a-secret", + "Partial_ProtectingYourUploadedFiles": "protecting-your-uploaded-files", + "Partial_ProvisioningMachinesForGitHubActions": "provisioning-machines-for-github-actions", + "Partial_PushingOktaGroupsToBitriseUsingSCIM": "pushing-okta-groups-to-bitrise-using-scim", + "Partial_QuarantiningFlakyTests": "quarantining-flaky-tests", + "Partial_QuickStartGuide": "quick-start-guide", + "Partial_RearrangingChainedWorkflows": "rearranging-chained-workflows", + "Partial_RebuildingAFailedPipeline": "rebuilding-a-failed-pipeline", + "Partial_RebuildingAFailedWorkflowBuild": "rebuilding-a-failed-workflow-build", + "Partial_RecommendedFlagsForRemoteBuildExecution": "recommended-flags-for-remote-build-execution", + "Partial_RedactingSecrets": "redacting-secrets", + "Partial_RegeneratingAPersonalAccessToken": "regenerating-a-personal-access-token", + "Partial_RegeneratingAWorkspaceAPIToken": "regenerating-a-workspace-api-token", + "Partial_RegisterATestDeviceManually": "register-a-test-device-manually", + "Partial_RegisterAnIOSDeviceUsingSafari": "register-an-ios-device-using-safari", + "Partial_RegisteringAnIncomingWebhookAutomatically": "registering-an-incoming-webhook-automatically", + "Partial_RegisteringAnIncomingWebhookManually": "registering-an-incoming-webhook-manually", + "Partial_RegisteringAnIncomingWebhookWithTheAPI": "registering-an-incoming-webhook-with-the-api", + "Partial_RegisteringDevicesWithTheXcodeArchiveStep": "registering-devices-with-the-xcode-archive-step", + "Partial_ReleaseManagementConfiguration": "release-management-configuration", + "Partial_RemoteAccessWithSSH": "remote-access-with-ssh", + "Partial_RemoteAccessWithScreenshare": "remote-access-with-screenshare", + "Partial_RemoteAccessWithVisualStudioCode": "remote-access-with-visual-studio-code", + "Partial_RemovingAStepFromAWorkflow": "removing-a-step-from-a-workflow", + "Partial_RemovingAnOutgoingWebhookFromARelease": "removing-an-outgoing-webhook-from-a-release", + "Partial_RemovingOtherUsersFromWorkspaces": "removing-other-users-from-workspaces", + "Partial_RemovingTheOAuthConnectionAPI": "removing-the-oauth-connection-api", + "Partial_ReplacingCachingSteps": "replacing-caching-steps", + "Partial_ReplacingVariablesInInputs": "replacing-variables-in-inputs", + "Partial_ReportingStepIssues": "reporting-step-issues", + "Partial_RequestingAnEmailReportOfThirdPartySteps": "requesting-an-email-report-of-third-party-steps", + "Partial_RerunningFailedTestsNotAvailableInXcode13": "rerunning-failed-tests-not-available-in-xcode-13", + "Partial_RestoringTheCurrentBitriseYmlToTheBuildSBitriseYml": "restoring-the-current-bitriseyml-to-the-builds-bitriseyml", + "Partial_RetrievingASpecificBuildArtifactSData": "retrieving-a-specific-build-artifacts-data", + "Partial_RetrievingASpecificFileSData": "retrieving-a-specific-files-data", + "Partial_RetrievingSAMLSSOInformationFromAuth0": "retrieving-saml-sso-information-from-auth0", + "Partial_RevertingToAnOAuthConnection": "reverting-to-an-oauth-connection", + "Partial_RevokingAccessToAnAppFromAGroup": "revoking-access-to-an-app-from-a-group", + "Partial_RevokingAccessToAnAppFromASingleUser": "revoking-access-to-an-app-from-a-single-user", + "Partial_RollingUpdatePercentage": "rolling-update-percentage", + "Partial_RunIOSTestGroupsInParallel": "run-ios-test-groups-in-parallel", + "Partial_RunIOSTestsInParallelOnMultipleSimulators": "run-ios-tests-in-parallel-on-multiple-simulators", + "Partial_RunUITestsInParallelOnMultipleDevicesOrShards": "run-ui-tests-in-parallel-on-multiple-devices-or-shards", + "Partial_RunningABuild": "running-a-build", + "Partial_RunningADetoxTest": "running-a-detox-test", + "Partial_RunningAServiceContainer": "running-a-service-container", + "Partial_RunningAStepOnlyIfTheBuildFailed": "running-a-step-only-if-the-build-failed", + "Partial_RunningAStepOnlyInACIEnvironment": "running-a-step-only-in-a-ci-environment", + "Partial_RunningAUnityBuild": "running-a-unity-build", + "Partial_RunningAnExecutionContainer": "running-an-execution-container", + "Partial_RunningDeviceTestsForIOSApps": "running-device-tests-for-ios-apps", + "Partial_RunningGitCloneWithLinkedRepositories": "running-git-clone-with-linked-repositories", + "Partial_RunningInstrumentationTests": "running-instrumentation-tests", + "Partial_RunningTests": "running-tests", + "Partial_RunningTestsForYourWebCIProject": "running-tests-for-your-web-ci-project", + "Partial_RunningTheBuild": "running-the-build", + "Partial_RunningWorkflowsFromTheWorkflowEditor": "running-workflows-from-the-workflow-editor", + "Partial_SAMLSSOBeforeYouStart": "saml-sso-before-you-start", + "Partial_SSHKeyAuthorization": "ssh-key-authorization", + "Partial_Scanners": "scanners", + "Partial_SchedulingABuild": "scheduling-a-build", + "Partial_ScopeOfEnvironmentVariables": "scope-of-environment-variables", + "Partial_SecretsInSelfHostedEnvironments": "secrets-in-self-hosted-environments", + "Partial_SecurityPatchingReference": "security-patching-reference", + "Partial_SendingEmailsWithAStep": "sending-emails-with-a-step", + "Partial_ServiceCredentialUserActionsAndTheirRequiredRepositoryAccess": "service-credential-user-actions-and-their-required-repository-access", + "Partial_SettingACustomEnvVarWhenStartingABuild": "setting-a-custom-env-var-when-starting-a-build", + "Partial_SettingASecret": "setting-a-secret", + "Partial_SettingAdditionalLinkedRepositoriesAPI": "setting-additional-linked-repositories-api", + "Partial_SettingAnEnvVarInTheWorkflowEditor": "setting-an-env-var-in-the-workflow-editor", + "Partial_SettingConditionsForRunningTheStep": "setting-conditions-for-running-the-step", + "Partial_SettingEnvVarsInTheBitriseYml": "setting-env-vars-in-the-bitriseyml", + "Partial_SettingJavaVersionWithTheSetJavaVersionStep": "setting-java-version-with-the-set-java-version-step", + "Partial_SettingTheStackInTheBitriseYmlFile": "setting-the-stack-in-the-bitriseyml-file", + "Partial_SettingTheStackInTheWorkflowEditor": "setting-the-stack-in-the-workflow-editor", + "Partial_SettingUpAMappingRuleForYourBitriseAppSClientID": "setting-up-a-mapping-rule-for-your-bitrise-apps-client-id", + "Partial_SettingUpAppVersioningAutomaticallyOnBitrise": "setting-up-app-versioning-automatically-on-bitrise", + "Partial_SettingUpBitriseOnPremise": "setting-up-bitrise-on-premise", + "Partial_SettingUpGooglePlayAPIAccess": "setting-up-google-play-api-access", + "Partial_SettingUpGooglePlayDeploymentForTheFirstTime": "setting-up-google-play-deployment-for-the-first-time", + "Partial_SettingUpRunIfConditionsWithScriptSteps": "setting-up-run-if-conditions-with-script-steps", + "Partial_SettingUpSAMLSSOBetweenBitriseAndAzureAD": "setting-up-saml-sso-between-bitrise-and-azure-ad", + "Partial_SettingUpSAMLSSOForABitriseWorkspace": "setting-up-saml-sso-for-a-bitrise-workspace", + "Partial_SettingUpSCIMProvisioningInOkta": "setting-up-scim-provisioning-in-okta", + "Partial_SettingUpTheEC2Instance": "setting-up-the-ec2-instance", + "Partial_SettingUpUnityLicensesOnBitrise": "setting-up-unity-licenses-on-bitrise", + "Partial_ShardingWithABitriseStepCalculatingTheTestSplit": "sharding-with-a-bitrise-step-calculating-the-test-split", + "Partial_ShardingWithYourOwnTestSplitCalculation": "sharding-with-your-own-test-split-calculation", + "Partial_SharingANewStep": "sharing-a-new-step", + "Partial_SharingEnvVarsBetweenStages": "sharing-env-vars-between-stages", + "Partial_SigningAnAndroidAppBundleFile": "signing-an-android-app-bundle-file", + "Partial_SigningAnIPAFileWithADifferentTeamSCodeSigningFile": "signing-an-ipa-file-with-a-different-teams-code-signing-file", + "Partial_SigningAndDeployingMultiFlavorAPKs": "signing-and-deploying-multi-flavor-apks", + "Partial_SigningUpWithAGitProvider": "signing-up-with-a-git-provider", + "Partial_SigningUpWithEmail": "signing-up-with-email", + "Partial_SigningYourAndroidApp": "signing-your-android-app", + "Partial_SkippingABuildTriggeredByADraftPullRequest": "skipping-a-build-triggered-by-a-draft-pull-request", + "Partial_SkippingAComment": "skipping-a-comment", + "Partial_SkippingBitriseCI": "skipping-bitrise-ci", + "Partial_SourceCode": "source-code", + "Partial_SpecialStepSources": "special-step-sources", + "Partial_StartingABuildBasicOptionsSteps": "starting-a-build-basic-options-steps", + "Partial_StartingSchedulingABuildFirstTwoSteps": "startingscheduling-a-build-first-two-steps", + "Partial_StartingTheOfflineWorkflowEditor": "starting-the-offline-workflow-editor", + "Partial_StepBundleProperties": "step-bundle-properties", + "Partial_StepCategories": "step-categories", + "Partial_StepInputProperties": "step-input-properties", + "Partial_StepInputs": "step-inputs", + "Partial_StepLevelProperties": "step-level-properties", + "Partial_StepOutputs": "step-outputs", + "Partial_StepsThatRequireConnectingToYourAppleDeveloperAccount": "steps-that-require-connecting-to-your-apple-developer-account", + "Partial_StoringABitriseYmlFileOnMultipleBranchesInTheRepository": "storing-a-bitriseyml-file-on-multiple-branches-in-the-repository", + "Partial_StoringTheBitriseYmlFileInYourRepository": "storing-the-bitriseyml-file-in-your-repository", + "Partial_SubAPIs": "sub-apis", + "Partial_SubmodulesAndStepDependencies": "submodules-and-step-dependencies", + "Partial_SupportedTools": "supported-tools", + "Partial_SupportedTriggerConditions": "supported-trigger-conditions", + "Partial_SwitchingFromOAuthConnectionToTheGitHubApp": "switching-from-oauth-connection-to-the-github-app", + "Partial_SynchronizingGroupsAndUsersBetweenOktaAndBitrise": "synchronizing-groups-and-users-between-okta-and-bitrise", + "Partial_TIPMetaPropertiesAsPermanentComments": "tip-meta-properties-as-permanent-comments", + "Partial_TargetBasedTriggerComponents": "target-based-trigger-components", + "Partial_TargetScope": "target-scope", + "Partial_TargetVersions": "target-versions", + "Partial_TestRepetitions": "test-repetitions", + "Partial_TestersQA": "testersqa", + "Partial_TestingAFlutterApp": "testing-a-flutter-app", + "Partial_TestingAndDeployment": "testing-and-deployment", + "Partial_TestingIonicCordovaApps": "testing-ioniccordova-apps", + "Partial_TestingOnAppCenterAndOnBitrise": "testing-on-app-center-and-on-bitrise", + "Partial_TestingWithAFullCleanGitClone": "testing-with-a-full-clean-git-clone", + "Partial_TestingWithTheBitriseCLI": "testing-with-the-bitrise-cli", + "Partial_TestingYourAndroidApp": "testing-your-android-app", + "Partial_TestingYourIOSApp": "testing-your-ios-app", + "Partial_TestingYourMacOSApp": "testing-your-macos-app", + "Partial_TestingYourReactNativeApp": "testing-your-react-native-app", + "Partial_TheDashboardsPage": "the-dashboards-page", + "Partial_TheImportanceOfTestFailureRate": "the-importance-of-test-failure-rate", + "Partial_TheImportanceOfTrackingFlakyTests": "the-importance-of-tracking-flaky-tests", + "Partial_TheIncludeFormatReference": "the-include-format-reference", + "Partial_TheInstallableArtifactsPage": "the-installable-artifacts-page", + "Partial_TheStepYmlFile": "the-stepyml-file", + "Partial_ThirdPartyStepRestrictions": "third-party-step-restrictions", + "Partial_ToolSetupDuringWorkflowExecution": "tool-setup-during-workflow-execution", + "Partial_ToolVersionManagers": "tool-version-managers", + "Partial_TrackingOverallCreditUsage": "tracking-overall-credit-usage", + "Partial_TransferringAProjectOnTheProjectSettingsPage": "transferring-a-project-on-the-project-settings-page", + "Partial_TransferringMultipleProjectsAtTheSameTime": "transferring-multiple-projects-at-the-same-time", + "Partial_TriggerForTheMostRecentGitCommit": "trigger-for-the-most-recent-git-commit", + "Partial_TriggerPriority": "trigger-priority", + "Partial_TriggerProperties": "trigger-properties", + "Partial_TriggerSyntax": "trigger-syntax", + "Partial_TriggerVariables": "trigger-variables", + "Partial_TriggeringANewBuildWithTheAPI": "triggering-a-new-build-with-the-api", + "Partial_TriggeringAScheduledBuildManually": "triggering-a-scheduled-build-manually", + "Partial_TroubleshootingBuildStatusReporting": "troubleshooting-build-status-reporting", + "Partial_TroubleshootingDetoxTests": "troubleshooting-detox-tests", + "Partial_TroubleshootingTheGHESIntegration": "troubleshooting-the-ghes-integration", + "Partial_TypesOfSteps": "types-of-steps", + "Partial_UnselectingNotificationPreferences": "unselecting-notification-preferences", + "Partial_UpdatingABitriseYmlStoredInTheRepository": "updating-a-bitriseyml-stored-in-the-repository", + "Partial_UpdatingAnUploadedIOSCodeSigningFile": "updating-an-uploaded-ios-code-signing-file", + "Partial_UpdatingRolesAndPermissions": "updating-roles-and-permissions", + "Partial_UpdatingSAMLSSOConfiguration": "updating-saml-sso-configuration", + "Partial_UpdatingTheBitriseCLI": "updating-the-bitrise-cli", + "Partial_UpgradingWorkflowEditorVersion": "upgrading-workflow-editor-version", + "Partial_UploadingANewBitriseYmlFile": "uploading-a-new-bitriseyml-file", + "Partial_UploadingIOSCodeSigningCertificates": "uploading-ios-code-signing-certificates", + "Partial_UploadingTheReleaseCandidateToGooglePlay": "uploading-the-release-candidate-to-google-play", + "Partial_UploadingTheReleaseCandidateToTestFlight": "uploading-the-release-candidate-to-testflight", + "Partial_UserRolesAndCollaboration": "user-roles-and-collaboration", + "Partial_UsingAMachineUserToAccessPrivateRepositories": "using-a-machine-user-to-access-private-repositories", + "Partial_UsingAPrivateStepLibraryViaTheGitHubApp": "using-a-private-step-library-via-the-github-app", + "Partial_UsingASpecificStepVersion": "using-a-specific-step-version", + "Partial_UsingAnEnvVarAsAStepInput": "using-an-env-var-as-a-step-input", + "Partial_UsingEnvVarsInTheValueOfAnEnvVar": "using-env-vars-in-the-value-of-an-env-var", + "Partial_UsingTemplateExpressionsForStepInputs": "using-template-expressions-for-step-inputs", + "Partial_UsingTheExportTestResultsToTheTestReportsStep": "using-the-export-test-results-to-the-test-reports-step", + "Partial_UsingTheLatestAvailableVersionOfTheStep": "using-the-latest-available-version-of-the-step", + "Partial_UsingThePreviousVersionOfAStack": "using-the-previous-version-of-a-stack", + "Partial_UsingThePullPipelineIntermediateFilesStep": "using-the-pull-pipeline-intermediate-files-step", + "Partial_UtilityWorkflows": "utility-workflows", + "Partial_VerifiedDomain": "verified-domain", + "Partial_ViewingDataFromASpecificTimeframe": "viewing-data-from-a-specific-timeframe", + "Partial_ViewingTestResults": "viewing-test-results", + "Partial_ViewingTheBuildDataOfAnApp": "viewing-the-build-data-of-an-app", + "Partial_ViewingTheSecretsOfAnApp": "viewing-the-secrets-of-an-app", + "Partial_ViewingYourCoverageReportsOnCodecov": "viewing-your-coverage-reports-on-codecov", + "Partial_WarmupScriptForGitHubActions": "warmup-script-for-github-actions", + "Partial_WatchingAnApp": "watching-an-app", + "Partial_WebhookEvents": "webhook-events", + "Partial_WhatSNext": "whats-next", + "Partial_WhenToChooseTheAWSOption": "when-to-choose-the-aws-option", + "Partial_WhenToUseTheOnPremiseOption": "when-to-use-the-on-premise-option", + "Partial_WhereDoesBitriseRunItsLLMInference": "where-does-bitrise-run-its-llm-inference", + "Partial_WhichBitriseFeaturesUseAILLMs": "which-bitrise-features-use-aillms", + "Partial_WhichLargeLanguageModelsLLMsDoesBitriseUse": "which-large-language-models-llms-does-bitrise-use", + "Partial_WhoOwnsTheIntellectualPropertyGeneratedByLLMs": "who-owns-the-intellectual-property-generated-by-llms", + "Partial_WhyBotherMigrating": "why-bother-migrating", + "Partial_WorkflowLevelProperties": "workflow-level-properties", + "Partial_WorkflowPriority": "workflow-priority", + "Partial_WorkflowPropertiesInPipelines": "workflow-properties-in-pipelines", + "Partial_WorkspaceLevelRoles": "workspace-level-roles", + "Partial_XcodeStackUpdates": "xcode-stack-updates" + } +} \ No newline at end of file diff --git a/migration/proposed_redirects.json b/migration/proposed_redirects.json new file mode 100644 index 0000000..d02332f --- /dev/null +++ b/migration/proposed_redirects.json @@ -0,0 +1,251 @@ +{ + "_comment": "Proposed redirects for migration URLs that no longer exist as direct pages. Review before merging into redirects.json.", + "category_a_high_confidence": { + "/en/release-management/releases/adding-a-new-release.html": "/en/release-management/releases/configuring-a-release/deleting-a-release.html", + "/en/release-management/releases/managing-the-release-process.html": "/en/release-management/releases/managing-the-release-process/about-the-release-process.html", + "/en/release-management/releases/managing-the-release-process/stop-managing-a-release.html": "/en/release-management/releases/configuring-a-release.html", + "/en/bitrise-platform/infrastructure.html": "/en/bitrise-platform/infrastructure/infrastructure-overview.html", + "/en/bitrise-platform/accounts.html": "/en/bitrise-platform/accounts/accounts-overview.html", + "/en/bitrise-platform/projects.html": "/en/bitrise-platform/projects/projects-overview.html", + "/en/bitrise-platform/workspaces.html": "/en/bitrise-platform/workspaces/workspaces-overview.html", + "/en/bitrise-platform/integrations.html": "/en/bitrise-platform/integrations/about-integrations.html", + "/en/bitrise-platform/workspaces/workspace-faq.html": "/en/bitrise-platform/workspaces/workspaces-overview.html", + "/en/bitrise-platform/integrations/webhooks.html": "/en/bitrise-platform/integrations/webhooks/webhooks-overview.html", + "/en/bitrise-platform/ai/ai-features-on-bitrise.html": "/en/bitrise-platform/ai/enabling-ai-features-on-bitrise.html", + "/en/bitrise-platform/infrastructure/build-stacks.html": "/en/bitrise-platform/infrastructure/build-stacks/about-build-stacks.html", + "/en/bitrise-platform/infrastructure/build-machines.html": "/en/bitrise-platform/infrastructure/build-machines/about-build-machines.html", + "/en/bitrise-platform/infrastructure/build-machines/build-machine-types.html": "/en/bitrise-platform/infrastructure/build-machines/about-build-machines.html", + "/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/configuring-a-machine-pool.html": "/en/bitrise-platform/infrastructure/configuring-runner-pools.html", + "/en/bitrise-ci/api.html": "/en/bitrise-ci/api/api-overview.html", + "/en/bitrise-ci/dependencies-and-caching.html": "/en/bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview.html", + "/en/bitrise-ci/configure-builds/configuration-yaml.html": "/en/bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview.html", + "/en/bitrise-ci/dependencies-and-caching/android-dependencies.html": "/en/bitrise-ci/dependencies-and-caching/ios-dependencies.html", + "/en/bitrise-ci/dependencies-and-caching/flutter-dependencies.html": "/en/bitrise-ci/dependencies-and-caching/ios-dependencies.html", + "/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage.html": "/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm.html", + "/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods.html": "/en/bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm.html", + "/en/bitrise-ci/references/steps-reference.html": "/en/bitrise-ci/references/steps-reference/about-step-code.html", + "/en/bitrise-ci/references/bitrise-tools.html": "/en/bitrise-ci/bitrise-cli.html", + "/en/bitrise-ci/references/steps-reference/step-outputs-reference.html": "/en/bitrise-ci/references/steps-reference/step-inputs-reference.html", + "/en/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.html": "/en/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator.html", + "/en/bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps.html": "/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.html", + "/en/bitrise-ci/testing/testing-android-apps/android-unit-tests.html": "/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android/running-tests/running-robo-tests.html", + "/en/bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps.html": "/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.html", + "/en/bitrise-ci/getting-started/migrating-to-bitrise.html": "/en/bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise.html", + "/en/bitrise-ci/api/api-reference.html": "/en/bitrise-ci/references.html", + "/en/bitrise-ci/workflows-and-pipelines/build-pipelines.html": "/en/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.html", + "/en/bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines.html": "/en/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.html", + "/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio.html": "/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html", + "/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle.html": "/en/bitrise-ci/code-signing/android-code-signing.html", + "/en/bitrise-ci/deploying/deploying-apps-to-applivery.html": "/en/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators/deploying-the-app-to-appetizeio.html", + "/en/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing.html": "/en/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators.html", + "/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports.html": "/en/bitrise-ci/testing/deploying-and-viewing-test-results/viewing-test-results.html", + "/en/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments.html": "/en/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.html", + "/en/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments.html": "/en/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment.html", + "/en/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds.html": "/en/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment.html", + "/en/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds.html": "/en/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment.html", + "/en/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments.html": "/en/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment.html" + }, + "category_b_review_needed": { + "/en/insights/available-metrics-in-insights/build-cache-metrics.html": "/en/insights/available-metrics-in-insights.html", + "/en/release-management/configuring-connected-apps.html": "/en/release-management/release-management-api/sub-apis.html", + "/en/release-management/releases/release-presets.html": "/en/release-management/releases.html", + "/en/release-management/releases/managing-the-release-process/releasing-your-app-on-google-play.html": "/en/release-management/releases/managing-the-release-process/google-play-upload-stage/uploading-the-release-candidate-to-google-play.html", + "/en/release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.html": "/en/release-management/codepush/configuring-your-app-for-codepush.html", + "/en/release-management/configuring-connected-apps/about-connected-apps.html": "/en/release-management/codepush/about-codepush.html", + "/en/release-management/configuring-connected-apps/configuring-connected-app-integration.html": "/en/release-management/configuring-connected-apps/deleting-a-connected-app.html", + "/en/release-management/configuring-connected-apps/release-management-roles-and-permissions.html": "/en/release-management/releases/configuring-a-release/release-automation.html", + "/en/release-management/getting-started-with-release-management/getting-started-with-release-management.html": "/en/release-management/getting-started-with-release-management.html", + "/en/release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management.html": "/en/release-management/releases/configuring-a-release/release-automation/opening-an-app-in-release-management.html", + "/en/release-management/getting-started-with-release-management/managing-licenses.html": "/en/release-management/releases/managing-the-release-process/about-the-release-process.html", + "/en/release-management/getting-started-with-release-management/connecting-an-app.html": "/en/release-management/releases/configuring-a-release/deleting-a-release.html", + "/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management.html": "/en/release-management/releases/configuring-a-release/deleting-a-release.html", + "/en/bitrise-platform/projects/public-projects.html": "/en/bitrise-platform/projects/projects-overview.html", + "/en/bitrise-platform/integrations/endpoint-detection-and-response.html": "/en/bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy.html", + "/en/bitrise-platform/getting-started/getting-started-with-the-bitrise-platform.html": "/en/bitrise-platform/getting-started.html", + "/en/bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform.html": "/en/bitrise-platform/infrastructure/docker-containers-on-bitrise.html", + "/en/bitrise-platform/accounts/github-token-scanning.html": "/en/bitrise-platform/repository-access/github-app-integration.html", + "/en/bitrise-platform/accounts/resetting-your-password.html": "/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise.html", + "/en/bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso.html": "/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.html", + "/en/bitrise-platform/ai/bitrise-mcp.html": "/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup.html", + "/en/bitrise-platform/repository-access/connecting-bitbucket-server-instances.html": "/en/bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances.html", + "/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/allocating-a-dedicated-host-for-mac-instances.html": "/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances.html", + "/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/subscribing-to-the-bitrise-on-aws-ami.html": "/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/bitrise-on-aws-overview.html", + "/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/troubleshooting-the-cloud-controller.html": "/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller.html", + "/en/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.html": "/en/bitrise-platform/infrastructure/docker-containers-on-bitrise.html", + "/en/bitrise-platform/infrastructure/build-stacks/the-android-linux-docker-environment.html": "/en/bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching/patching-on-linux-environment.html", + "/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image.html": "/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise.html", + "/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration.html": "/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds.html", + "/en/bitrise-ci/bitrise-cli/managing-secrets-locally.html": "/en/bitrise-ci/api/managing-secrets-with-the-api.html", + "/en/bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally.html": "/en/bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli.html", + "/en/bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli.html": "/en/bitrise-ci/api/triggering-and-aborting-builds/triggering-a-new-build-with-the-api.html", + "/en/bitrise-ci/dependencies-and-caching/react-native-dependencies.html": "/en/bitrise-ci/dependencies-and-caching/ios-dependencies.html", + "/en/bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format.html": "/en/bitrise-ci/testing/deploying-and-viewing-test-results/viewing-test-results.html", + "/en/bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise.html": "/en/bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise.html", + "/en/bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstack-s-app-automate.html": "/en/bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects/testing-your-ios-app.html", + "/en/bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps.html": "/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.html", + "/en/bitrise-ci/getting-started/key-bitrise-concepts.html": "/en/bitrise-ci/bitrise-cli.html", + "/en/bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.html": "/en/bitrise-ci/workflows-and-pipelines/steps/step-versions/using-a-specific-step-version.html", + "/en/bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq.html": "/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html", + "/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds.html": "/en/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.html", + "/en/bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file.html": "/en/bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.html", + "/en/bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities.html": "/en/bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files.html", + "/en/bitrise-ci/deploying/deploying-your-app-to-appaloosa.html": "/en/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators/deploying-the-app-to-appetizeio.html", + "/en/bitrise-ci/deploying/deploying-to-testfairy-with-bitrise.html": "/en/bitrise-ci/testing/device-testing-with-firebase.html", + "/en/bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab.html": "/en/bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators.html", + "/en/bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery.html": "/en/bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play.html", + "/en/bitrise-ci/run-and-analyze-builds/build-statuses.html": "/en/bitrise-ci/run-and-analyze-builds/build-triggers.html", + "/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer.html": "/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.html", + "/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments.html": "/en/bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands.html", + "/en/bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger.html": "/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually/starting-a-build-basic-options-steps.html", + "/en/bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache.html": "/en/bitrise-build-cache/getting-started-with-the-build-cache.html", + "/en/bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache.html": "/en/bitrise-build-cache/getting-started-with-the-build-cache.html", + "/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache.html": "/en/bitrise-build-cache/getting-started-with-the-build-cache.html", + "/en/bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache.html": "/en/bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds/gradle-tasks-and-caching.html", + "/en/bitrise-build-hub/infrastructure/build-stacks.html": "/en/bitrise-build-hub/build-hub-for-github-actions.html", + "/en/bitrise-build-hub/infrastructure/build-machine-types.html": "/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool.html", + "/en/bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy.html": "/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool.html", + "/en/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.html": "/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/rolling-update-percentage.html" + }, + "category_c_manual_decision": [ + { + "missing_url": "/en/insights/available-metrics-in-insights/bitrise-ci-metrics.html", + "missing_title": "Bitrise CI metrics", + "closest_md_url": "/en/insights/available-metrics-in-insights.html", + "closest_md_title": "Available metrics in Insights", + "title_sim": 0.43 + }, + { + "missing_url": "/en/insights/available-metrics-in-insights/command-metrics.html", + "missing_title": "Command metrics", + "closest_md_url": "/en/insights/available-metrics-in-insights.html", + "closest_md_title": "Available metrics in Insights", + "title_sim": 0.41 + }, + { + "missing_url": "/en/release-management/installable-artifacts.html", + "missing_title": "Installable artifacts", + "closest_md_url": "/en/release-management/release-management-api/sub-apis.html", + "closest_md_title": "Sub APIs", + "title_sim": 0.41 + }, + { + "missing_url": "/en/release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage.html", + "missing_title": "Creating tasks for the Approvals stage", + "closest_md_url": "/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html", + "closest_md_title": "Distributing iOS release candidates for testing", + "title_sim": 0.45 + }, + { + "missing_url": "/en/release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.html", + "missing_title": "Sending your app to App Store review", + "closest_md_url": "/en/release-management/codepush/creating-and-releasing-codepush-updates/getting-your-codepush-credentials.html", + "closest_md_title": "Getting your CodePush credentials", + "title_sim": 0.49 + }, + { + "missing_url": "/en/release-management/build-distribution/tester-groups.html", + "missing_title": "Tester groups", + "closest_md_url": "/en/release-management/build-distribution/distributing-builds-to-testers.html", + "closest_md_title": "Distributing builds to testers", + "title_sim": 0.33 + }, + { + "missing_url": "/en/bitrise-platform/mobile-devops-platform.html", + "missing_title": "Mobile DevOps Platform", + "closest_md_url": "/en/bitrise-platform/integrations/oidc-authentication/oidc-for-gcp.html", + "closest_md_title": "OIDC for GCP", + "title_sim": 0.41 + }, + { + "missing_url": "/en/bitrise-platform/infrastructure/customizable-enterprise-build-platforms.html", + "missing_title": "Customizable enterprise build platforms", + "closest_md_url": "/en/bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines.html", + "closest_md_title": "Freeing up storage space on build machines", + "title_sim": 0.44 + }, + { + "missing_url": "/en/bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines.html", + "missing_title": "Setting your Git credentials on build machines", + "closest_md_url": "/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds.html", + "closest_md_title": "Setting the stack for your builds", + "title_sim": 0.48 + }, + { + "missing_url": "/en/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.html", + "missing_title": "Dedicated caching Steps for dependency managers", + "closest_md_url": "/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/key-matching-for-cache-archives.html", + "closest_md_title": "Key matching for cache archives", + "title_sim": 0.46 + }, + { + "missing_url": "/en/bitrise-ci/references/glossary.html", + "missing_title": "Glossary", + "closest_md_url": "/en/bitrise-ci/testing/test-sharding.html", + "closest_md_title": "Test sharding", + "title_sim": 0.38 + }, + { + "missing_url": "/en/bitrise-ci/getting-started/the-bitrise-dashboard.html", + "missing_title": "The Bitrise dashboard", + "closest_md_url": "/en/bitrise-ci/getting-started/unity-on-bitrise.html", + "closest_md_title": "Unity on Bitrise", + "title_sim": 0.49 + }, + { + "missing_url": "/en/bitrise-ci/api/pagination-of-api-calls.html", + "missing_title": "Pagination of API calls", + "closest_md_url": "/en/bitrise-ci/api/github-app-configuration-api.html", + "closest_md_title": "GitHub app configuration API", + "title_sim": 0.47 + }, + { + "missing_url": "/en/bitrise-build-cache/getting-started-with-the-build-cache/invocations.html", + "missing_title": "Invocations", + "closest_md_url": "/en/bitrise-build-cache/insights/build-cache-metrics.html", + "closest_md_title": "Build cache metrics", + "title_sim": 0.4 + }, + { + "missing_url": "/en/bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq.html", + "missing_title": "Xcode Compilation Cache FAQ", + "closest_md_url": "/en/bitrise-build-cache/build-cache-for-bazel.html", + "closest_md_title": "Build cache for Bazel", + "title_sim": 0.46 + }, + { + "missing_url": "/en/bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines.html", + "missing_title": "IP address ranges for the Bitrise build machines", + "closest_md_url": "/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-github-personal-access-tokens-for-build-hub.html", + "closest_md_title": "Creating GitHub personal access tokens for Build Hub", + "title_sim": 0.44 + }, + { + "missing_url": "/en/bitrise-build-hub/infrastructure/build-stacks/changelog.html", + "missing_title": "Changelog", + "closest_md_url": "/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/target-scope.html", + "closest_md_title": "Target scope", + "title_sim": 0.38 + }, + { + "missing_url": "/en/bitrise-build-hub/infrastructure/build-stacks/about-build-stacks.html", + "missing_title": "About build stacks", + "closest_md_url": "/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions.html", + "closest_md_title": "Configuring Build Hub for GitHub Actions", + "title_sim": 0.45 + }, + { + "missing_url": "/en/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.html", + "missing_title": "Stack update policy", + "closest_md_url": "/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/rolling-update-percentage.html", + "closest_md_title": "Rolling update percentage", + "title_sim": 0.45 + }, + { + "missing_url": "/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html", + "missing_title": "macOS stack update policy", + "closest_md_url": "/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/rolling-update-percentage.html", + "closest_md_title": "Rolling update percentage", + "title_sim": 0.44 + } + ] +} \ No newline at end of file diff --git a/migration/url_map.json b/migration/url_map.json new file mode 100644 index 0000000..7ca0e07 --- /dev/null +++ b/migration/url_map.json @@ -0,0 +1,879 @@ +{ + "by_path": { + "release-management.html": "Release Management", + "bitrise-build-hub.html": "Bitrise Build Hub", + "bitrise-build-cache.html": "Bitrise Build Cache", + "insights.html": "Insights", + "bitrise-ci.html": "Bitrise CI", + "bitrise-platform.html": "Bitrise as a Platform", + "insights/getting-started-with-insights.html": "Getting started", + "insights/available-metrics-in-insights.html": "Available metrics", + "insights/insights-tutorials.html": "Tutorials", + "insights/git-insights.html": "Git Insights", + "insights/configuring-alerts-in-insights.html": "Alerts", + "insights/available-metrics-in-insights/bitrise-ci-metrics.html": "Bitrise CI metrics", + "insights/available-metrics-in-insights/build-cache-metrics.html": "Build cache metrics", + "insights/available-metrics-in-insights/command-metrics.html": "Command metrics", + "insights/insights-tutorials/tracking-test-failure-rate.html": "Tracking test failure rate", + "insights/insights-tutorials/credit-usage.html": "Credit usage", + "insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds.html": "Monitoring and optimizing your slowest mobile builds", + "insights/insights-tutorials/tracking-flaky-tests.html": "Tracking flaky tests", + "insights/insights-tutorials/tracking-build-failure-rate.html": "Tracking build failure rate", + "release-management/getting-started-with-release-management.html": "Getting started", + "release-management/releases.html": "Releases", + "release-management/build-distribution.html": "Build distribution for testing", + "release-management/installable-artifacts.html": "Installable artifacts", + "release-management/release-management-api.html": "Release Management API", + "release-management/codepush.html": "Bitrise CodePush", + "release-management/configuring-connected-apps.html": "Apps", + "release-management/releases/adding-a-new-release.html": "Adding a new release", + "release-management/releases/configuring-a-release.html": "Configuring a release", + "release-management/releases/release-presets.html": "Release presets", + "release-management/releases/managing-the-release-process.html": "Managing the release process", + "release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management.html": "Outgoing webhooks in Release Management", + "release-management/releases/configuring-a-release/editing-the-description-of-a-release.html": "Editing the description of a release", + "release-management/releases/configuring-a-release/configuring-auto-upload.html": "Configuring auto-upload", + "release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications.html": "Configuring Slack and Teams notifications for releases", + "release-management/releases/configuring-a-release/release-automation.html": "Configuring release automation", + "release-management/releases/configuring-a-release/deleting-a-release.html": "Deleting a release", + "release-management/releases/managing-the-release-process/about-the-release-process.html": "About the release process", + "release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage.html": "Creating tasks for the Approvals stage", + "release-management/releases/managing-the-release-process/google-play-upload-stage.html": "Google Play upload stage", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate.html": "Selecting a release candidate", + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.html": "Sending your app to App Store review", + "release-management/releases/managing-the-release-process/releasing-your-app-on-google-play.html": "Releasing your app on Google Play", + "release-management/releases/managing-the-release-process/stop-managing-a-release.html": "Stop managing a release", + "release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.html": "Releasing your app on the App Store", + "release-management/releases/managing-the-release-process/testflight-upload-stage.html": "TestFlight upload stage", + "release-management/configuring-connected-apps/about-connected-apps.html": "About apps", + "release-management/configuring-connected-apps/configuring-connected-app-integration.html": "Modifying a connected app's store connection", + "release-management/configuring-connected-apps/release-management-roles-and-permissions.html": "Roles and permissions", + "release-management/configuring-connected-apps/deleting-a-connected-app.html": "Deleting a connected app", + "release-management/configuring-connected-apps/changing-connected-app-appearance.html": "Changing the app title and the app icon", + "release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags.html": "Integrating LaunchDarkly feature flags", + "release-management/getting-started-with-release-management/getting-started-with-release-management.html": "Getting started", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management.html": "Connecting another CI service to Release Management", + "release-management/getting-started-with-release-management/managing-licenses.html": "Managing licenses", + "release-management/getting-started-with-release-management/connecting-an-app.html": "Connecting an app", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management.html": "Adding a new app", + "release-management/getting-started-with-release-management/release-management-concepts.html": "Release Management key concepts", + "release-management/build-distribution/tester-groups.html": "Tester groups", + "release-management/build-distribution/distributing-builds-to-testers.html": "Distributing builds to testers", + "release-management/codepush/about-codepush.html": "About CodePush", + "release-management/codepush/creating-and-releasing-codepush-updates.html": "Creating and releasing CodePush updates", + "release-management/codepush/codepush-updates-with-bitrise-ci.html": "CodePush updates with Bitrise CI", + "release-management/codepush/configuring-your-app-for-codepush.html": "Configuring your app for CodePush", + "release-management/codepush/creating-a-codepush-deployment.html": "Creating a CodePush deployment", + "bitrise-platform/infrastructure.html": "Infrastructure", + "bitrise-platform/repository-access.html": "Repository access", + "bitrise-platform/accounts.html": "Account", + "bitrise-platform/projects.html": "Projects", + "bitrise-platform/workspaces.html": "Workspaces", + "bitrise-platform/integrations.html": "Integrations", + "bitrise-platform/getting-started.html": "Getting started", + "bitrise-platform/ai.html": "AI", + "bitrise-platform/mobile-devops-platform.html": "Mobile DevOps Platform", + "bitrise-platform/projects/public-projects.html": "Public projects", + "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project.html": "Enabling the Bitrise Support Access for your project", + "bitrise-platform/projects/projects-overview.html": "Projects overview", + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html": "Roles and permissions for Bitrise CI", + "bitrise-platform/projects/creating-white-label-app-versions.html": "Creating white label app versions", + "bitrise-platform/projects/embedding-a-project-status-badge.html": "Embedding a build status badge to your site", + "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch.html": "Configuring the repository URL and default branch", + "bitrise-platform/projects/managing-user-access-to-a-project.html": "Managing user access to a project", + "bitrise-platform/projects/changing-the-owner-of-a-project.html": "Changing the owner of a project", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces.html": "Collaboration and permissions", + "bitrise-platform/workspaces/creating-workspaces.html": "Creating workspaces", + "bitrise-platform/workspaces/changing-the-owners-of-a-workspace.html": "Managing the owners of a workspace", + "bitrise-platform/workspaces/workspace-billing-and-invoicing.html": "Workspace billing", + "bitrise-platform/workspaces/workspace-slack-integration.html": "Slack integration for workspaces", + "bitrise-platform/workspaces/workspace-faq.html": "Workspace FAQ", + "bitrise-platform/workspaces/workspaces-overview.html": "About workspaces", + "bitrise-platform/workspaces/workspace-api-token.html": "Workspace API token", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration.html": "Workspace members", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces.html": "Roles and permissions in workspaces", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.html": "Workspace groups", + "bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise.html": "Connecting a Google Play Console service account to Bitrise", + "bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.html": "Connecting to a VPN during a build", + "bitrise-platform/integrations/the-service-credential-user.html": "The service credential user", + "bitrise-platform/integrations/apple-services-connection.html": "Apple services connection", + "bitrise-platform/integrations/about-integrations.html": "About integrations", + "bitrise-platform/integrations/oidc-authentication.html": "OIDC authentication", + "bitrise-platform/integrations/webhooks.html": "Webhooks", + "bitrise-platform/integrations/ai-code-reviewer.html": "AI code reviewer", + "bitrise-platform/integrations/endpoint-detection-and-response.html": "Endpoint Detection and Response", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html": "Connecting to an Apple service with API key", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication.html": "Steps requiring Apple authentication", + "bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.html": "About connecting to Apple services", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs.html": "Connecting to an Apple Service with Step inputs", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.html": "Connecting to an Apple service with Apple ID", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise.html": "OIDC for Bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-gcp.html": "OIDC for GCP", + "bitrise-platform/integrations/oidc-authentication/oidc-for-aws.html": "OIDC for AWS", + "bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview.html": "OIDC authentication overview", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks.html": "Adding outgoing webhooks", + "bitrise-platform/integrations/webhooks/adding-incoming-webhooks.html": "Adding incoming webhooks", + "bitrise-platform/integrations/webhooks/webhooks-overview.html": "Webhooks overview", + "bitrise-platform/getting-started/signing-up-for-bitrise.html": "Signing up for Bitrise", + "bitrise-platform/getting-started/collaboration.html": "Collaboration", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform.html": "Getting started with the platform", + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform.html": "Key concepts of the Bitrise platform", + "bitrise-platform/accounts/deleting-your-bitrise-account.html": "Deleting your Bitrise account", + "bitrise-platform/accounts/two-factor-authentication.html": "Two-factor authentication", + "bitrise-platform/accounts/accounts-overview.html": "About personal accounts", + "bitrise-platform/accounts/editing-your-profile-settings.html": "Editing your profile settings", + "bitrise-platform/accounts/github-token-scanning.html": "GitHub token scanning", + "bitrise-platform/accounts/personal-access-tokens.html": "Personal access tokens", + "bitrise-platform/accounts/saml-sso-in-bitrise.html": "SAML SSO on Bitrise", + "bitrise-platform/accounts/resetting-your-password.html": "Resetting your password", + "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.html": "Configuring SCIM", + "bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso.html": "Logging in via SAML SSO", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise.html": "Setting up Google SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise.html": "Setting up Entra ID (former Azure AD) SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise.html": "Setting up Auth0 SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise.html": "Setting up OneLogin SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.html": "Configuring SAML SSO on Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise.html": "Setting up Okta SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise.html": "Setting up Ping Identity SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise.html": "Setting up Idaptive SAML SSO for Bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise.html": "Setting up AD FS SSO for Bitrise", + "bitrise-platform/ai/enabling-ai-features-on-bitrise.html": "Enabling AI features on Bitrise", + "bitrise-platform/ai/bitrise-mcp.html": "Bitrise MCP", + "bitrise-platform/ai/ai-features-on-bitrise.html": "AI features on Bitrise", + "bitrise-platform/ai/ai-faq---how-bitrise-leverages-ai-technologies-in-its-features-and-services.html": "AI FAQ \u2013 How Bitrise leverages AI technologies in its features and services", + "bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies.html": "Projects with submodules or private repo dependencies", + "bitrise-platform/repository-access/configuring-ssh-keys.html": "Configuring SSH keys", + "bitrise-platform/repository-access/github-app-integration.html": "GitHub app integration for GitHub Cloud", + "bitrise-platform/repository-access/about-repository-access.html": "About repository access", + "bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances.html": "Connecting self-hosted GitLab instances", + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise.html": "GitHub app integration for GitHub Enterprise Server", + "bitrise-platform/repository-access/repository-access-with-oauth.html": "OAuth connection", + "bitrise-platform/repository-access/configuring-https-authorization-credentials.html": "Configuring HTTPS authorization", + "bitrise-platform/repository-access/connecting-bitbucket-server-instances.html": "Connecting Bitbucket Server instances", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html": "Bitrise on AWS: Cloud Controller", + "bitrise-platform/infrastructure/running-your-build-locally-in-docker.html": "Running your build locally in Docker", + "bitrise-platform/infrastructure/build-stacks.html": "Build stacks", + "bitrise-platform/infrastructure/infrastructure-overview.html": "About infrastructure", + "bitrise-platform/infrastructure/docker-containers-on-bitrise.html": "Docker containers on Bitrise", + "bitrise-platform/infrastructure/build-machines.html": "Build machines", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup.html": "Bitrise on AWS: manual setup", + "bitrise-platform/infrastructure/bitrise-on-aws--os-security-patching.html": "Bitrise on AWS: OS security patching", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise.html": "Running Bitrise builds on-premise", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments.html": "Cleaning up a persistent build environment", + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms.html": "Customizable enterprise build platforms", + "bitrise-platform/infrastructure/code-security.html": "Code security", + "bitrise-platform/infrastructure/configuring-runner-pools.html": "Configuring runner pools for self-hosted builds", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami.html": "Launching an EC2 Mac or Linux instance for the Bitrise AMI", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/aws-manual-setup-overview.html": "AWS manual setup overview", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances.html": "Advanced options for Amazon EC2 Mac and Linux instances", + "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/allocating-a-dedicated-host-for-mac-instances.html": "Allocating a dedicated host for EC2 Mac instances", + "bitrise-platform/infrastructure/build-machines/about-build-machines.html": "About build machines", + "bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines.html": "Freeing up storage space on build machines", + "bitrise-platform/infrastructure/build-machines/build-machine-types.html": "Build machine types", + "bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines.html": "Configuring network access with IP allowlists", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/subscribing-to-the-bitrise-on-aws-ami.html": "Subscribing to the Bitrise on AWS AMIs", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/configuring-a-machine-pool.html": "Configuring a machine pool", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/aws-cloudformation-templates.html": "AWS CloudFormation templates", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/troubleshooting-the-cloud-controller.html": "Troubleshooting the cloud controller", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/bitrise-on-aws-overview.html": "Bitrise on AWS overview", + "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller.html": "Creating and configuring a controller", + "bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy.html": "Stack deprecation and removal policy", + "bitrise-platform/infrastructure/build-stacks/changelog.html": "Changelog", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks.html": "About build stacks", + "bitrise-platform/infrastructure/build-stacks/managing-java-versions.html": "Managing Java versions", + "bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy.html": "Linux stack update policy", + "bitrise-platform/infrastructure/build-stacks/stack-update-policy.html": "Stack update policy", + "bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy.html": "macOS stack update policy", + "bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.html": "Preinstalled tools on Bitrise stacks", + "bitrise-platform/infrastructure/build-stacks/the-android-linux-docker-environment.html": "The Android/Linux/Docker environment", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers.html": "Step execution containers", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image.html": "Building your own Docker image on Bitrise", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers.html": "Service containers", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise.html": "About Docker containers on Bitrise", + "bitrise-ci/run-and-analyze-builds.html": "Run and analyze builds", + "bitrise-ci/workflows-and-pipelines.html": "Workflows and Pipelines", + "bitrise-ci/deploying.html": "Deploying", + "bitrise-ci/configure-builds.html": "Configure builds", + "bitrise-ci/getting-started.html": "Getting started", + "bitrise-ci/code-signing.html": "Code signing", + "bitrise-ci/api.html": "API", + "bitrise-ci/testing.html": "Testing", + "bitrise-ci/references.html": "References", + "bitrise-ci/dependencies-and-caching.html": "Dependencies and caching", + "bitrise-ci/bitrise-cli.html": "Bitrise CLI", + "bitrise-ci/configure-builds/environment-variables.html": "Environment Variables", + "bitrise-ci/configure-builds/configuration-yaml.html": "Configuration YAML", + "bitrise-ci/configure-builds/secrets.html": "Secrets", + "bitrise-ci/configure-builds/configuring-build-settings.html": "Configuring build settings", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.html": "Rolling builds", + "bitrise-ci/configure-builds/configuring-build-settings/selective-builds.html": "Selective builds", + "bitrise-ci/configure-builds/configuring-build-settings/build-priority.html": "Build priority", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.html": "Configuring email notifications", + "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html": "Reporting the build status to your Git hosting provider", + "bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines.html": "Setting your Git credentials on build machines", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration.html": "Sending Slack messages in a build", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions.html": "Configuring tool versions", + "bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds.html": "Setting the stack for your builds", + "bitrise-ci/configure-builds/configuration-yaml/managing-a-project-s-configuration-yaml-file.html": "Storing an app's configuration YAML", + "bitrise-ci/configure-builds/configuration-yaml/accessing-a-build-s-bitrise-yml-file.html": "Accessing a build's configuration YAML", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview.html": "About configuration YAML", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-app-s-bitrise-yml-file.html": "Editing a project's bitrise.yml configuration file", + "bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration.html": "Modular YAML configuration", + "bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml.html": "Customizing your configuration YAML", + "bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.html": "Installing and upgrading the offline Workflow Editor", + "bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html": "Installing and updating the Bitrise CLI", + "bitrise-ci/bitrise-cli/managing-secrets-locally.html": "Managing Secrets locally", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally.html": "Initializing a Bitrise project locally", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli.html": "Running your first local build with the CLI", + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli.html": "Adding a new project from a CLI", + "bitrise-ci/dependencies-and-caching/android-dependencies.html": "Android dependencies", + "bitrise-ci/dependencies-and-caching/key-based-caching.html": "Key-based caching", + "bitrise-ci/dependencies-and-caching/react-native-dependencies.html": "React Native dependencies", + "bitrise-ci/dependencies-and-caching/flutter-dependencies.html": "Flutter dependencies", + "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching.html": "Migrating from branch-based caching to key-based caching", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview.html": "About dependencies and caching", + "bitrise-ci/dependencies-and-caching/ios-dependencies.html": "iOS dependencies", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage.html": "Managing dependencies with Carthage", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods.html": "Managing dependencies with CocoaPods", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm.html": "Managing dependencies with SPM", + "bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching.html": "Using key-based caching in your builds", + "bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives.html": "Accessing key-based cache archives on the website", + "bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.html": "Dedicated caching Steps for dependency managers", + "bitrise-ci/references/steps-reference.html": "Steps reference", + "bitrise-ci/references/available-environment-variables.html": "Available Environment Variables", + "bitrise-ci/references/configuration-yaml-reference.html": "Configuration YAML reference", + "bitrise-ci/references/glossary.html": "Glossary", + "bitrise-ci/references/bitrise-tools.html": "Bitrise tools", + "bitrise-ci/references/steps-reference/step-inputs-reference.html": "Step inputs reference", + "bitrise-ci/references/steps-reference/step-outputs-reference.html": "Step outputs reference", + "bitrise-ci/references/steps-reference/about-step-code.html": "About Step code", + "bitrise-ci/references/steps-reference/step-data-in-the-bitrise-yml-file.html": "Step data in the bitrise.yml file", + "bitrise-ci/references/steps-reference/step-reference-id-format.html": "Step reference/ID format", + "bitrise-ci/references/steps-reference/step-properties-reference.html": "Step properties", + "bitrise-ci/testing/testing-flutter-apps.html": "Testing Flutter apps", + "bitrise-ci/testing/detecting-and-quarantining-flaky-tests.html": "Detecting and quarantining flaky tests", + "bitrise-ci/testing/measuring-your-code-coverage-with-codecov.html": "Measuring your code coverage with Codecov", + "bitrise-ci/testing/testing-ios-apps.html": "Testing iOS apps", + "bitrise-ci/testing/deploying-and-viewing-test-results.html": "Deploying and viewing test results", + "bitrise-ci/testing/testing-android-apps.html": "Testing Android apps", + "bitrise-ci/testing/device-testing-with-firebase.html": "Device testing with Firebase", + "bitrise-ci/testing/test-sharding.html": "Test sharding", + "bitrise-ci/testing/testing-react-native-apps.html": "Testing React Native apps", + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps.html": "Running tests for React Native apps", + "bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise.html": "Running Detox tests on Bitrise", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android.html": "Device testing for Android", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps.html": "Running device tests with Firebase for multiplatform apps", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.html": "Device testing for iOS", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator.html": "Building an iOS app for a simulator", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.html": "Running unit and UI tests for iOS apps", + "bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format.html": "Viewing Xcode test results in rich HTML format", + "bitrise-ci/testing/testing-ios-apps/registering-a-test-device.html": "Registering test devices for iOS apps", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.html": "Building an iOS app for testing", + "bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps.html": "Running unit and UI tests on Flutter apps", + "bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise.html": "Running the Dart analyzer on Bitrise", + "bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstack-s-app-automate.html": "Testing your app with Browserstack's App Automate", + "bitrise-ci/testing/testing-android-apps/android-unit-tests.html": "Running Android unit tests", + "bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps.html": "Running lint checks for your Android apps", + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps.html": "Running instrumented tests for Android apps", + "bitrise-ci/getting-started/the-bitrise-dashboard.html": "The Bitrise dashboard", + "bitrise-ci/getting-started/migrating-to-bitrise.html": "Migrating to Bitrise", + "bitrise-ci/getting-started/adding-a-ci-configuration-to-a-project.html": "Adding a CI configuration to a project", + "bitrise-ci/getting-started/unity-on-bitrise.html": "Unity software integration on Bitrise", + "bitrise-ci/getting-started/key-bitrise-concepts.html": "Key Bitrise CI concepts", + "bitrise-ci/getting-started/adding-a-new-project.html": "Adding a new project", + "bitrise-ci/getting-started/getting-started.html": "Getting started with Bitrise CI", + "bitrise-ci/getting-started/quick-start-guides.html": "Quick start guides", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects.html": "Getting started with macOS projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci.html": "Getting started with web CI projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects.html": "Getting started with Expo projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects.html": "Getting started with Android projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ionic-cordova-projects.html": "Getting started with Ionic/Cordova projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects.html": "Getting started with React Native projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects.html": "Getting started with iOS projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects.html": "Getting started with Flutter projects", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise.html": "Migrating from App Center to Bitrise", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise.html": "Migrating from Jenkins to Bitrise", + "bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise.html": "About migrating to Bitrise", + "bitrise-ci/api/managing-android-keystore-files.html": "Managing Android keystore files", + "bitrise-ci/api/api-overview.html": "API overview", + "bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs.html": "Identifying Workspaces and projects with their slugs", + "bitrise-ci/api/managing-ios-code-signing-files.html": "Managing iOS code signing files", + "bitrise-ci/api/pagination-of-api-calls.html": "Pagination of API calls", + "bitrise-ci/api/api-reference.html": "API reference", + "bitrise-ci/api/incoming-and-outgoing-webhooks.html": "Incoming and outgoing webhooks", + "bitrise-ci/api/managing-secrets-with-the-api.html": "Managing Secrets with the API", + "bitrise-ci/api/github-app-configuration-api.html": "GitHub app configuration", + "bitrise-ci/api/managing-files-in-generic-file-storage.html": "Managing files in Generic File Storage", + "bitrise-ci/api/managing-build-artifacts.html": "Managing build artifacts", + "bitrise-ci/api/adding-and-managing-apps.html": "Adding and managing projects", + "bitrise-ci/api/authenticating-with-the-bitrise-api.html": "Authenticating with the Bitrise API", + "bitrise-ci/api/triggering-and-aborting-builds.html": "Triggering and aborting builds", + "bitrise-ci/api/managing-an-app-s-builds.html": "Managing an app's builds", + "bitrise-ci/workflows-and-pipelines/steps.html": "Steps", + "bitrise-ci/workflows-and-pipelines/build-pipelines.html": "Pipelines", + "bitrise-ci/workflows-and-pipelines/workflows.html": "Workflows", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step.html": "Developing your own Bitrise Step", + "bitrise-ci/workflows-and-pipelines/workflows/default-workflows.html": "Default Workflows", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html": "Workflows overview", + "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects.html": "Workflow recipes for cross-platform apps", + "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects.html": "Workflow recipes for iOS apps", + "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects.html": "Workflow recipes for Android apps", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.html": "Creating a Workflow", + "bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes.html": "Generic Workflow recipes", + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows.html": "Managing Workflows", + "bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another.html": "Copying Workflows from one project to another", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow.html": "Adding Steps to a Workflow", + "bitrise-ci/workflows-and-pipelines/steps/step-bundles.html": "Step bundles", + "bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps.html": "Detecting and aborting hanging Steps without output", + "bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.html": "Setting a time limit for Steps", + "bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally.html": "Enabling or disabling a Step conditionally", + "bitrise-ci/workflows-and-pipelines/steps/step-versions.html": "Step versioning", + "bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace.html": "Disabling third-party Steps in a workspace", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview.html": "Steps overview", + "bitrise-ci/workflows-and-pipelines/steps/step-inputs.html": "Step inputs", + "bitrise-ci/workflows-and-pipelines/steps/skipping-steps.html": "Configuring a Step to always run", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users.html": "Sharing Steps with all Bitrise users", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step.html": "Developing a new Step", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps.html": "Verified Steps", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner.html": "Creating your own Bitrise project scanner", + "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines.html": "Default Pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline.html": "Converting a Pipeline with stages into a graph Pipeline", + "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq.html": "Pipeline Management FAQ", + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline.html": "Configuring Pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds.html": "Pipeline builds", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html": "Pipelines with stages", + "bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.html": "About Pipelines", + "bitrise-ci/code-signing/android-code-signing.html": "Android code signing", + "bitrise-ci/code-signing/ios-code-signing.html": "iOS code signing", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio.html": "Android code signing with Android Studio", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html": "Android code signing using the Android Sign Step", + "bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file.html": "Downloading a keystore file from Bitrise during a build", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle.html": "Android code signing in Gradle", + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.html": "Uploading Android keystore files to Bitrise", + "bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files.html": "Protecting your code signing files", + "bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities.html": "Signing an IPA with multiple code signing identities", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files---manual-provisioning.html": "iOS code signing with manual provisioning", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files---automatic-provisioning.html": "iOS code signing with automatic provisioning", + "bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing.html": "Troubleshooting iOS code signing", + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects.html": "iOS code signing for Ionic and Cordova projects", + "bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc.html": "Exporting iOS code signing files manually", + "bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files.html": "Generating iOS code signing files", + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing.html": "iOS code signing overview", + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects.html": "Creating a signed IPA for Xcode projects", + "bitrise-ci/deploying/ios-deployment.html": "iOS deployment", + "bitrise-ci/deploying/bitrise-ota-app-deployment.html": "Bitrise OTA app deployment", + "bitrise-ci/deploying/deploying-your-app-to-appaloosa.html": "Deploying your app to Appaloosa", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise.html": "Deploying apps to DeployGate from Bitrise", + "bitrise-ci/deploying/deploying-to-testfairy-with-bitrise.html": "Deploying to TestFairy with Bitrise", + "bitrise-ci/deploying/android-deployment.html": "Android deployment", + "bitrise-ci/deploying/deploying-apps-to-applivery.html": "Deploying apps to Applivery", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab.html": "Exporting a universal APK from an AAB", + "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play.html": "Deploying Android apps to Bitrise and Google Play", + "bitrise-ci/deploying/android-deployment/generate-and-deploy-multiple-flavor-apks-in-a-single-workflow.html": "Generate and deploy multiple flavor APKs in a single Workflow", + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles.html": "Generating and deploying Android app bundles", + "bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery.html": "Deploying apps to Huawei AppGallery", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitrise-io.html": "Deploying an iOS app to Bitrise.io", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators.html": "Deploying an iOS app for simulators", + "bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page.html": "Installing an .ipa file", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing.html": "Deploying an iOS app for external testing", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect.html": "Deploying an iOS app to App Store Connect", + "bitrise-ci/run-and-analyze-builds/starting-builds.html": "Starting builds", + "bitrise-ci/run-and-analyze-builds/build-annotations.html": "Build Annotations", + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning.html": "Build numbering and app versioning", + "bitrise-ci/run-and-analyze-builds/build-triggers.html": "Build triggers", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting.html": "Build data and troubleshooting", + "bitrise-ci/run-and-analyze-builds/build-statuses.html": "Build statuses", + "bitrise-ci/run-and-analyze-builds/managing-build-files.html": "Managing build files", + "bitrise-ci/run-and-analyze-builds/finding-a-specific-build.html": "Finding a specific build", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds.html": "Using files in your builds", + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html": "Uploading files for your builds", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds.html": "Using encrypted files in your builds", + "bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html": "Build artifacts online", + "bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy.html": "Artifact retention policy", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer.html": "AI build fixer", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access.html": "Remote access", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details.html": "Checking build details", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github.html": "GitHub Checks with the Bitrise GitHub App", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments.html": "Reporting build problems in PR comments", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html": "Build logs", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.html": "AI build summary", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports.html": "Viewing HTML reports", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build.html": "Rebuilding a failed build", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine.html": "Debugging your build on your own machine", + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers.html": "About build triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands.html": "Triggering builds by Slack commands", + "bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.html": "YAML syntax for build triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request.html": "Skipping a given commit or pull request", + "bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger.html": "Starting parallel builds with a single trigger", + "bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers.html": "Legacy project-based triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html": "Configuring build triggers", + "bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds.html": "Approving pull request builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.html": "Scheduling builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html": "Starting builds manually", + "bitrise-build-cache/build-cache-for-bazel.html": "Build Cache for Bazel", + "bitrise-build-cache/build-cache-for-xcode.html": "Build Cache for Xcode", + "bitrise-build-cache/getting-started-with-the-build-cache.html": "Bitrise Build Cache", + "bitrise-build-cache/insights.html": "Insights for the Build Cache", + "bitrise-build-cache/build-cache-for-gradle.html": "Build Cache for Gradle", + "bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache.html": "At-rest encryption for the Build Cache", + "bitrise-build-cache/getting-started-with-the-build-cache/invocations.html": "Invocations", + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache.html": "Clearing the Build Cache", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache.html": "Getting started", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.html": "Configuring the Build Cache for Xcode in the Bitrise CI environment", + "bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq.html": "Xcode Compilation Cache FAQ", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments.html": "Configuring the Build Cache for Xcode in non-Bitrise CI environments", + "bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel.html": "Remote build execution for Bazel", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments.html": "Configuring the Build Cache for Bazel in non-Bitrise CI environments", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment.html": "Configuring the Bitrise Build Cache for Bazel in the Bitrise CI environment", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds.html": "Configuring the Bitrise Build Cache for Bazel in local environments", + "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache.html": "Gradle configuration cache", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds.html": "Configuring the Build Cache for Gradle in local environments", + "bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds.html": "Gradle execution reason diagnostic builds", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments.html": "Configuring the Build Cache for Gradle in non-Bitrise CI environments", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment.html": "Configuring the Build Cache for Gradle in the Bitrise CI environment", + "bitrise-build-hub/infrastructure.html": "Infrastructure", + "bitrise-build-hub/build-hub-for-github-actions.html": "Build Hub for GitHub Actions", + "bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions.html": "Configuring Build Hub for GitHub Actions", + "bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview.html": "Build Hub for GitHub Actions overview", + "bitrise-build-hub/infrastructure/build-stacks.html": "Build stacks", + "bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines.html": "IP address ranges for the Bitrise build machines", + "bitrise-build-hub/infrastructure/build-machine-types.html": "Build machine types", + "bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy.html": "Stack deprecation and removal policy", + "bitrise-build-hub/infrastructure/build-stacks/changelog.html": "Changelog", + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks.html": "About build stacks", + "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.html": "Linux stack update policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.html": "Stack update policy", + "bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html": "macOS stack update policy" + }, + "by_title": { + "Release Management": "release-management.html", + "Bitrise Build Hub": "bitrise-build-hub.html", + "Bitrise Build Cache": "bitrise-build-cache/getting-started-with-the-build-cache.html", + "Insights": "insights.html", + "Bitrise CI": "bitrise-ci.html", + "Bitrise as a Platform": "bitrise-platform.html", + "Getting started": "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache.html", + "Available metrics": "insights/available-metrics-in-insights.html", + "Tutorials": "insights/insights-tutorials.html", + "Git Insights": "insights/git-insights.html", + "Alerts": "insights/configuring-alerts-in-insights.html", + "Bitrise CI metrics": "insights/available-metrics-in-insights/bitrise-ci-metrics.html", + "Build cache metrics": "insights/available-metrics-in-insights/build-cache-metrics.html", + "Command metrics": "insights/available-metrics-in-insights/command-metrics.html", + "Tracking test failure rate": "insights/insights-tutorials/tracking-test-failure-rate.html", + "Credit usage": "insights/insights-tutorials/credit-usage.html", + "Monitoring and optimizing your slowest mobile builds": "insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds.html", + "Tracking flaky tests": "insights/insights-tutorials/tracking-flaky-tests.html", + "Tracking build failure rate": "insights/insights-tutorials/tracking-build-failure-rate.html", + "Releases": "release-management/releases.html", + "Build distribution for testing": "release-management/build-distribution.html", + "Installable artifacts": "release-management/installable-artifacts.html", + "Release Management API": "release-management/release-management-api.html", + "Bitrise CodePush": "release-management/codepush.html", + "Apps": "release-management/configuring-connected-apps.html", + "Adding a new release": "release-management/releases/adding-a-new-release.html", + "Configuring a release": "release-management/releases/configuring-a-release.html", + "Release presets": "release-management/releases/release-presets.html", + "Managing the release process": "release-management/releases/managing-the-release-process.html", + "Outgoing webhooks in Release Management": "release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management.html", + "Editing the description of a release": "release-management/releases/configuring-a-release/editing-the-description-of-a-release.html", + "Configuring auto-upload": "release-management/releases/configuring-a-release/configuring-auto-upload.html", + "Configuring Slack and Teams notifications for releases": "release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications.html", + "Configuring release automation": "release-management/releases/configuring-a-release/release-automation.html", + "Deleting a release": "release-management/releases/configuring-a-release/deleting-a-release.html", + "About the release process": "release-management/releases/managing-the-release-process/about-the-release-process.html", + "Creating tasks for the Approvals stage": "release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage.html", + "Google Play upload stage": "release-management/releases/managing-the-release-process/google-play-upload-stage.html", + "Selecting a release candidate": "release-management/releases/managing-the-release-process/selecting-a-release-candidate.html", + "Sending your app to App Store review": "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review.html", + "Releasing your app on Google Play": "release-management/releases/managing-the-release-process/releasing-your-app-on-google-play.html", + "Stop managing a release": "release-management/releases/managing-the-release-process/stop-managing-a-release.html", + "Releasing your app on the App Store": "release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store.html", + "TestFlight upload stage": "release-management/releases/managing-the-release-process/testflight-upload-stage.html", + "About apps": "release-management/configuring-connected-apps/about-connected-apps.html", + "Modifying a connected app's store connection": "release-management/configuring-connected-apps/configuring-connected-app-integration.html", + "Roles and permissions": "release-management/configuring-connected-apps/release-management-roles-and-permissions.html", + "Deleting a connected app": "release-management/configuring-connected-apps/deleting-a-connected-app.html", + "Changing the app title and the app icon": "release-management/configuring-connected-apps/changing-connected-app-appearance.html", + "Integrating LaunchDarkly feature flags": "release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags.html", + "Connecting another CI service to Release Management": "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management.html", + "Managing licenses": "release-management/getting-started-with-release-management/managing-licenses.html", + "Connecting an app": "release-management/getting-started-with-release-management/connecting-an-app.html", + "Adding a new app": "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management.html", + "Release Management key concepts": "release-management/getting-started-with-release-management/release-management-concepts.html", + "Tester groups": "release-management/build-distribution/tester-groups.html", + "Distributing builds to testers": "release-management/build-distribution/distributing-builds-to-testers.html", + "About CodePush": "release-management/codepush/about-codepush.html", + "Creating and releasing CodePush updates": "release-management/codepush/creating-and-releasing-codepush-updates.html", + "CodePush updates with Bitrise CI": "release-management/codepush/codepush-updates-with-bitrise-ci.html", + "Configuring your app for CodePush": "release-management/codepush/configuring-your-app-for-codepush.html", + "Creating a CodePush deployment": "release-management/codepush/creating-a-codepush-deployment.html", + "Infrastructure": "bitrise-build-hub/infrastructure.html", + "Repository access": "bitrise-platform/repository-access.html", + "Account": "bitrise-platform/accounts.html", + "Projects": "bitrise-platform/projects.html", + "Workspaces": "bitrise-platform/workspaces.html", + "Integrations": "bitrise-platform/integrations.html", + "AI": "bitrise-platform/ai.html", + "Mobile DevOps Platform": "bitrise-platform/mobile-devops-platform.html", + "Public projects": "bitrise-platform/projects/public-projects.html", + "Enabling the Bitrise Support Access for your project": "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project.html", + "Projects overview": "bitrise-platform/projects/projects-overview.html", + "Roles and permissions for Bitrise CI": "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html", + "Creating white label app versions": "bitrise-platform/projects/creating-white-label-app-versions.html", + "Embedding a build status badge to your site": "bitrise-platform/projects/embedding-a-project-status-badge.html", + "Configuring the repository URL and default branch": "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch.html", + "Managing user access to a project": "bitrise-platform/projects/managing-user-access-to-a-project.html", + "Changing the owner of a project": "bitrise-platform/projects/changing-the-owner-of-a-project.html", + "Collaboration and permissions": "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces.html", + "Creating workspaces": "bitrise-platform/workspaces/creating-workspaces.html", + "Managing the owners of a workspace": "bitrise-platform/workspaces/changing-the-owners-of-a-workspace.html", + "Workspace billing": "bitrise-platform/workspaces/workspace-billing-and-invoicing.html", + "Slack integration for workspaces": "bitrise-platform/workspaces/workspace-slack-integration.html", + "Workspace FAQ": "bitrise-platform/workspaces/workspace-faq.html", + "About workspaces": "bitrise-platform/workspaces/workspaces-overview.html", + "Workspace API token": "bitrise-platform/workspaces/workspace-api-token.html", + "Workspace members": "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration.html", + "Roles and permissions in workspaces": "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces.html", + "Workspace groups": "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.html", + "Connecting a Google Play Console service account to Bitrise": "bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise.html", + "Connecting to a VPN during a build": "bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.html", + "The service credential user": "bitrise-platform/integrations/the-service-credential-user.html", + "Apple services connection": "bitrise-platform/integrations/apple-services-connection.html", + "About integrations": "bitrise-platform/integrations/about-integrations.html", + "OIDC authentication": "bitrise-platform/integrations/oidc-authentication.html", + "Webhooks": "bitrise-platform/integrations/webhooks.html", + "AI code reviewer": "bitrise-platform/integrations/ai-code-reviewer.html", + "Endpoint Detection and Response": "bitrise-platform/integrations/endpoint-detection-and-response.html", + "Connecting to an Apple service with API key": "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html", + "Steps requiring Apple authentication": "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication.html", + "About connecting to Apple services": "bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.html", + "Connecting to an Apple Service with Step inputs": "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs.html", + "Connecting to an Apple service with Apple ID": "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.html", + "OIDC for Bitrise": "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise.html", + "OIDC for GCP": "bitrise-platform/integrations/oidc-authentication/oidc-for-gcp.html", + "OIDC for AWS": "bitrise-platform/integrations/oidc-authentication/oidc-for-aws.html", + "OIDC authentication overview": "bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview.html", + "Adding outgoing webhooks": "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks.html", + "Adding incoming webhooks": "bitrise-platform/integrations/webhooks/adding-incoming-webhooks.html", + "Webhooks overview": "bitrise-platform/integrations/webhooks/webhooks-overview.html", + "Signing up for Bitrise": "bitrise-platform/getting-started/signing-up-for-bitrise.html", + "Collaboration": "bitrise-platform/getting-started/collaboration.html", + "Getting started with the platform": "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform.html", + "Key concepts of the Bitrise platform": "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform.html", + "Deleting your Bitrise account": "bitrise-platform/accounts/deleting-your-bitrise-account.html", + "Two-factor authentication": "bitrise-platform/accounts/two-factor-authentication.html", + "About personal accounts": "bitrise-platform/accounts/accounts-overview.html", + "Editing your profile settings": "bitrise-platform/accounts/editing-your-profile-settings.html", + "GitHub token scanning": "bitrise-platform/accounts/github-token-scanning.html", + "Personal access tokens": "bitrise-platform/accounts/personal-access-tokens.html", + "SAML SSO on Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise.html", + "Resetting your password": "bitrise-platform/accounts/resetting-your-password.html", + "Configuring SCIM": "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.html", + "Logging in via SAML SSO": "bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso.html", + "Setting up Google SSO for Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise.html", + "Setting up Entra ID (former Azure AD) SSO for Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise.html", + "Setting up Auth0 SSO for Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise.html", + "Setting up OneLogin SSO for Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise.html", + "Configuring SAML SSO on Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.html", + "Setting up Okta SSO for Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise.html", + "Setting up Ping Identity SSO for Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise.html", + "Setting up Idaptive SAML SSO for Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise.html", + "Setting up AD FS SSO for Bitrise": "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise.html", + "Enabling AI features on Bitrise": "bitrise-platform/ai/enabling-ai-features-on-bitrise.html", + "Bitrise MCP": "bitrise-platform/ai/bitrise-mcp.html", + "AI features on Bitrise": "bitrise-platform/ai/ai-features-on-bitrise.html", + "AI FAQ \u2013 How Bitrise leverages AI technologies in its features and services": "bitrise-platform/ai/ai-faq---how-bitrise-leverages-ai-technologies-in-its-features-and-services.html", + "Projects with submodules or private repo dependencies": "bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies.html", + "Configuring SSH keys": "bitrise-platform/repository-access/configuring-ssh-keys.html", + "GitHub app integration for GitHub Cloud": "bitrise-platform/repository-access/github-app-integration.html", + "About repository access": "bitrise-platform/repository-access/about-repository-access.html", + "Connecting self-hosted GitLab instances": "bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances.html", + "GitHub app integration for GitHub Enterprise Server": "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise.html", + "OAuth connection": "bitrise-platform/repository-access/repository-access-with-oauth.html", + "Configuring HTTPS authorization": "bitrise-platform/repository-access/configuring-https-authorization-credentials.html", + "Connecting Bitbucket Server instances": "bitrise-platform/repository-access/connecting-bitbucket-server-instances.html", + "Bitrise on AWS: Cloud Controller": "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html", + "Running your build locally in Docker": "bitrise-platform/infrastructure/running-your-build-locally-in-docker.html", + "Build stacks": "bitrise-build-hub/infrastructure/build-stacks.html", + "About infrastructure": "bitrise-platform/infrastructure/infrastructure-overview.html", + "Docker containers on Bitrise": "bitrise-platform/infrastructure/docker-containers-on-bitrise.html", + "Build machines": "bitrise-platform/infrastructure/build-machines.html", + "Bitrise on AWS: manual setup": "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup.html", + "Bitrise on AWS: OS security patching": "bitrise-platform/infrastructure/bitrise-on-aws--os-security-patching.html", + "Running Bitrise builds on-premise": "bitrise-platform/infrastructure/running-bitrise-builds-on-premise.html", + "Cleaning up a persistent build environment": "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments.html", + "Customizable enterprise build platforms": "bitrise-platform/infrastructure/customizable-enterprise-build-platforms.html", + "Code security": "bitrise-platform/infrastructure/code-security.html", + "Configuring runner pools for self-hosted builds": "bitrise-platform/infrastructure/configuring-runner-pools.html", + "Launching an EC2 Mac or Linux instance for the Bitrise AMI": "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami.html", + "AWS manual setup overview": "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/aws-manual-setup-overview.html", + "Advanced options for Amazon EC2 Mac and Linux instances": "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances.html", + "Allocating a dedicated host for EC2 Mac instances": "bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/allocating-a-dedicated-host-for-mac-instances.html", + "About build machines": "bitrise-platform/infrastructure/build-machines/about-build-machines.html", + "Freeing up storage space on build machines": "bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines.html", + "Build machine types": "bitrise-build-hub/infrastructure/build-machine-types.html", + "Configuring network access with IP allowlists": "bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines.html", + "Subscribing to the Bitrise on AWS AMIs": "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/subscribing-to-the-bitrise-on-aws-ami.html", + "Configuring a machine pool": "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/configuring-a-machine-pool.html", + "AWS CloudFormation templates": "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/aws-cloudformation-templates.html", + "Troubleshooting the cloud controller": "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/troubleshooting-the-cloud-controller.html", + "Bitrise on AWS overview": "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/bitrise-on-aws-overview.html", + "Creating and configuring a controller": "bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/creating-and-configuring-a-controller.html", + "Stack deprecation and removal policy": "bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy.html", + "Changelog": "bitrise-build-hub/infrastructure/build-stacks/changelog.html", + "About build stacks": "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks.html", + "Managing Java versions": "bitrise-platform/infrastructure/build-stacks/managing-java-versions.html", + "Linux stack update policy": "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.html", + "Stack update policy": "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.html", + "macOS stack update policy": "bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html", + "Preinstalled tools on Bitrise stacks": "bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.html", + "The Android/Linux/Docker environment": "bitrise-platform/infrastructure/build-stacks/the-android-linux-docker-environment.html", + "Step execution containers": "bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers.html", + "Building your own Docker image on Bitrise": "bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image.html", + "Service containers": "bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers.html", + "About Docker containers on Bitrise": "bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise.html", + "Run and analyze builds": "bitrise-ci/run-and-analyze-builds.html", + "Workflows and Pipelines": "bitrise-ci/workflows-and-pipelines.html", + "Deploying": "bitrise-ci/deploying.html", + "Configure builds": "bitrise-ci/configure-builds.html", + "Code signing": "bitrise-ci/code-signing.html", + "API": "bitrise-ci/api.html", + "Testing": "bitrise-ci/testing.html", + "References": "bitrise-ci/references.html", + "Dependencies and caching": "bitrise-ci/dependencies-and-caching.html", + "Bitrise CLI": "bitrise-ci/bitrise-cli.html", + "Environment Variables": "bitrise-ci/configure-builds/environment-variables.html", + "Configuration YAML": "bitrise-ci/configure-builds/configuration-yaml.html", + "Secrets": "bitrise-ci/configure-builds/secrets.html", + "Configuring build settings": "bitrise-ci/configure-builds/configuring-build-settings.html", + "Rolling builds": "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.html", + "Selective builds": "bitrise-ci/configure-builds/configuring-build-settings/selective-builds.html", + "Build priority": "bitrise-ci/configure-builds/configuring-build-settings/build-priority.html", + "Configuring email notifications": "bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.html", + "Reporting the build status to your Git hosting provider": "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html", + "Setting your Git credentials on build machines": "bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines.html", + "Sending Slack messages in a build": "bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration.html", + "Configuring tool versions": "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions.html", + "Setting the stack for your builds": "bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds.html", + "Storing an app's configuration YAML": "bitrise-ci/configure-builds/configuration-yaml/managing-a-project-s-configuration-yaml-file.html", + "Accessing a build's configuration YAML": "bitrise-ci/configure-builds/configuration-yaml/accessing-a-build-s-bitrise-yml-file.html", + "About configuration YAML": "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview.html", + "Editing a project's bitrise.yml configuration file": "bitrise-ci/configure-builds/configuration-yaml/editing-an-app-s-bitrise-yml-file.html", + "Modular YAML configuration": "bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration.html", + "Customizing your configuration YAML": "bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml.html", + "Installing and upgrading the offline Workflow Editor": "bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor.html", + "Installing and updating the Bitrise CLI": "bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html", + "Managing Secrets locally": "bitrise-ci/bitrise-cli/managing-secrets-locally.html", + "Initializing a Bitrise project locally": "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally.html", + "Running your first local build with the CLI": "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli.html", + "Adding a new project from a CLI": "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli.html", + "Android dependencies": "bitrise-ci/dependencies-and-caching/android-dependencies.html", + "Key-based caching": "bitrise-ci/dependencies-and-caching/key-based-caching.html", + "React Native dependencies": "bitrise-ci/dependencies-and-caching/react-native-dependencies.html", + "Flutter dependencies": "bitrise-ci/dependencies-and-caching/flutter-dependencies.html", + "Migrating from branch-based caching to key-based caching": "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching.html", + "About dependencies and caching": "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview.html", + "iOS dependencies": "bitrise-ci/dependencies-and-caching/ios-dependencies.html", + "Managing dependencies with Carthage": "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage.html", + "Managing dependencies with CocoaPods": "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods.html", + "Managing dependencies with SPM": "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm.html", + "Using key-based caching in your builds": "bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching.html", + "Accessing key-based cache archives on the website": "bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives.html", + "Dedicated caching Steps for dependency managers": "bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.html", + "Steps reference": "bitrise-ci/references/steps-reference.html", + "Available Environment Variables": "bitrise-ci/references/available-environment-variables.html", + "Configuration YAML reference": "bitrise-ci/references/configuration-yaml-reference.html", + "Glossary": "bitrise-ci/references/glossary.html", + "Bitrise tools": "bitrise-ci/references/bitrise-tools.html", + "Step inputs reference": "bitrise-ci/references/steps-reference/step-inputs-reference.html", + "Step outputs reference": "bitrise-ci/references/steps-reference/step-outputs-reference.html", + "About Step code": "bitrise-ci/references/steps-reference/about-step-code.html", + "Step data in the bitrise.yml file": "bitrise-ci/references/steps-reference/step-data-in-the-bitrise-yml-file.html", + "Step reference/ID format": "bitrise-ci/references/steps-reference/step-reference-id-format.html", + "Step properties": "bitrise-ci/references/steps-reference/step-properties-reference.html", + "Testing Flutter apps": "bitrise-ci/testing/testing-flutter-apps.html", + "Detecting and quarantining flaky tests": "bitrise-ci/testing/detecting-and-quarantining-flaky-tests.html", + "Measuring your code coverage with Codecov": "bitrise-ci/testing/measuring-your-code-coverage-with-codecov.html", + "Testing iOS apps": "bitrise-ci/testing/testing-ios-apps.html", + "Deploying and viewing test results": "bitrise-ci/testing/deploying-and-viewing-test-results.html", + "Testing Android apps": "bitrise-ci/testing/testing-android-apps.html", + "Device testing with Firebase": "bitrise-ci/testing/device-testing-with-firebase.html", + "Test sharding": "bitrise-ci/testing/test-sharding.html", + "Testing React Native apps": "bitrise-ci/testing/testing-react-native-apps.html", + "Running tests for React Native apps": "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps.html", + "Running Detox tests on Bitrise": "bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise.html", + "Device testing for Android": "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android.html", + "Running device tests with Firebase for multiplatform apps": "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps.html", + "Device testing for iOS": "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios.html", + "Building an iOS app for a simulator": "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator.html", + "Running unit and UI tests for iOS apps": "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps.html", + "Viewing Xcode test results in rich HTML format": "bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format.html", + "Registering test devices for iOS apps": "bitrise-ci/testing/testing-ios-apps/registering-a-test-device.html", + "Building an iOS app for testing": "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.html", + "Running unit and UI tests on Flutter apps": "bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps.html", + "Running the Dart analyzer on Bitrise": "bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise.html", + "Testing your app with Browserstack's App Automate": "bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstack-s-app-automate.html", + "Running Android unit tests": "bitrise-ci/testing/testing-android-apps/android-unit-tests.html", + "Running lint checks for your Android apps": "bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps.html", + "Running instrumented tests for Android apps": "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps.html", + "The Bitrise dashboard": "bitrise-ci/getting-started/the-bitrise-dashboard.html", + "Migrating to Bitrise": "bitrise-ci/getting-started/migrating-to-bitrise.html", + "Adding a CI configuration to a project": "bitrise-ci/getting-started/adding-a-ci-configuration-to-a-project.html", + "Unity software integration on Bitrise": "bitrise-ci/getting-started/unity-on-bitrise.html", + "Key Bitrise CI concepts": "bitrise-ci/getting-started/key-bitrise-concepts.html", + "Adding a new project": "bitrise-ci/getting-started/adding-a-new-project.html", + "Getting started with Bitrise CI": "bitrise-ci/getting-started/getting-started.html", + "Quick start guides": "bitrise-ci/getting-started/quick-start-guides.html", + "Getting started with macOS projects": "bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects.html", + "Getting started with web CI projects": "bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci.html", + "Getting started with Expo projects": "bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects.html", + "Getting started with Android projects": "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects.html", + "Getting started with Ionic/Cordova projects": "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ionic-cordova-projects.html", + "Getting started with React Native projects": "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects.html", + "Getting started with iOS projects": "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects.html", + "Getting started with Flutter projects": "bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects.html", + "Migrating from App Center to Bitrise": "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise.html", + "Migrating from Jenkins to Bitrise": "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise.html", + "About migrating to Bitrise": "bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise.html", + "Managing Android keystore files": "bitrise-ci/api/managing-android-keystore-files.html", + "API overview": "bitrise-ci/api/api-overview.html", + "Identifying Workspaces and projects with their slugs": "bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs.html", + "Managing iOS code signing files": "bitrise-ci/api/managing-ios-code-signing-files.html", + "Pagination of API calls": "bitrise-ci/api/pagination-of-api-calls.html", + "API reference": "bitrise-ci/api/api-reference.html", + "Incoming and outgoing webhooks": "bitrise-ci/api/incoming-and-outgoing-webhooks.html", + "Managing Secrets with the API": "bitrise-ci/api/managing-secrets-with-the-api.html", + "GitHub app configuration": "bitrise-ci/api/github-app-configuration-api.html", + "Managing files in Generic File Storage": "bitrise-ci/api/managing-files-in-generic-file-storage.html", + "Managing build artifacts": "bitrise-ci/api/managing-build-artifacts.html", + "Adding and managing projects": "bitrise-ci/api/adding-and-managing-apps.html", + "Authenticating with the Bitrise API": "bitrise-ci/api/authenticating-with-the-bitrise-api.html", + "Triggering and aborting builds": "bitrise-ci/api/triggering-and-aborting-builds.html", + "Managing an app's builds": "bitrise-ci/api/managing-an-app-s-builds.html", + "Steps": "bitrise-ci/workflows-and-pipelines/steps.html", + "Pipelines": "bitrise-ci/workflows-and-pipelines/build-pipelines.html", + "Workflows": "bitrise-ci/workflows-and-pipelines/workflows.html", + "Developing your own Bitrise Step": "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step.html", + "Default Workflows": "bitrise-ci/workflows-and-pipelines/workflows/default-workflows.html", + "Workflows overview": "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html", + "Workflow recipes for cross-platform apps": "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects.html", + "Workflow recipes for iOS apps": "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-ios-projects.html", + "Workflow recipes for Android apps": "bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-android-projects.html", + "Creating a Workflow": "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.html", + "Generic Workflow recipes": "bitrise-ci/workflows-and-pipelines/workflows/generic-workflow-recipes.html", + "Managing Workflows": "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows.html", + "Copying Workflows from one project to another": "bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another.html", + "Adding Steps to a Workflow": "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow.html", + "Step bundles": "bitrise-ci/workflows-and-pipelines/steps/step-bundles.html", + "Detecting and aborting hanging Steps without output": "bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps.html", + "Setting a time limit for Steps": "bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.html", + "Enabling or disabling a Step conditionally": "bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally.html", + "Step versioning": "bitrise-ci/workflows-and-pipelines/steps/step-versions.html", + "Disabling third-party Steps in a workspace": "bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace.html", + "Steps overview": "bitrise-ci/workflows-and-pipelines/steps/steps-overview.html", + "Step inputs": "bitrise-ci/workflows-and-pipelines/steps/step-inputs.html", + "Configuring a Step to always run": "bitrise-ci/workflows-and-pipelines/steps/skipping-steps.html", + "Sharing Steps with all Bitrise users": "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users.html", + "Developing a new Step": "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step.html", + "Verified Steps": "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps.html", + "Creating your own Bitrise project scanner": "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner.html", + "Default Pipelines": "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines.html", + "Converting a Pipeline with stages into a graph Pipeline": "bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline.html", + "Pipeline Management FAQ": "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq.html", + "Configuring Pipelines": "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline.html", + "Pipeline builds": "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds.html", + "Pipelines with stages": "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html", + "About Pipelines": "bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.html", + "Android code signing": "bitrise-ci/code-signing/android-code-signing.html", + "iOS code signing": "bitrise-ci/code-signing/ios-code-signing.html", + "Android code signing with Android Studio": "bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio.html", + "Android code signing using the Android Sign Step": "bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html", + "Downloading a keystore file from Bitrise during a build": "bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file.html", + "Android code signing in Gradle": "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle.html", + "Uploading Android keystore files to Bitrise": "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.html", + "Protecting your code signing files": "bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files.html", + "Signing an IPA with multiple code signing identities": "bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities.html", + "iOS code signing with manual provisioning": "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files---manual-provisioning.html", + "iOS code signing with automatic provisioning": "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files---automatic-provisioning.html", + "Troubleshooting iOS code signing": "bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing.html", + "iOS code signing for Ionic and Cordova projects": "bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects.html", + "Exporting iOS code signing files manually": "bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc.html", + "Generating iOS code signing files": "bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files.html", + "iOS code signing overview": "bitrise-ci/code-signing/ios-code-signing/ios-code-signing.html", + "Creating a signed IPA for Xcode projects": "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects.html", + "iOS deployment": "bitrise-ci/deploying/ios-deployment.html", + "Bitrise OTA app deployment": "bitrise-ci/deploying/bitrise-ota-app-deployment.html", + "Deploying your app to Appaloosa": "bitrise-ci/deploying/deploying-your-app-to-appaloosa.html", + "Deploying apps to DeployGate from Bitrise": "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise.html", + "Deploying to TestFairy with Bitrise": "bitrise-ci/deploying/deploying-to-testfairy-with-bitrise.html", + "Android deployment": "bitrise-ci/deploying/android-deployment.html", + "Deploying apps to Applivery": "bitrise-ci/deploying/deploying-apps-to-applivery.html", + "Exporting a universal APK from an AAB": "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab.html", + "Deploying Android apps to Bitrise and Google Play": "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play.html", + "Generate and deploy multiple flavor APKs in a single Workflow": "bitrise-ci/deploying/android-deployment/generate-and-deploy-multiple-flavor-apks-in-a-single-workflow.html", + "Generating and deploying Android app bundles": "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles.html", + "Deploying apps to Huawei AppGallery": "bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery.html", + "Deploying an iOS app to Bitrise.io": "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitrise-io.html", + "Deploying an iOS app for simulators": "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators.html", + "Installing an .ipa file": "bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page.html", + "Deploying an iOS app for external testing": "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing.html", + "Deploying an iOS app to App Store Connect": "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect.html", + "Starting builds": "bitrise-ci/run-and-analyze-builds/starting-builds.html", + "Build Annotations": "bitrise-ci/run-and-analyze-builds/build-annotations.html", + "Build numbering and app versioning": "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning.html", + "Build triggers": "bitrise-ci/run-and-analyze-builds/build-triggers.html", + "Build data and troubleshooting": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting.html", + "Build statuses": "bitrise-ci/run-and-analyze-builds/build-statuses.html", + "Managing build files": "bitrise-ci/run-and-analyze-builds/managing-build-files.html", + "Finding a specific build": "bitrise-ci/run-and-analyze-builds/finding-a-specific-build.html", + "Using files in your builds": "bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds.html", + "Uploading files for your builds": "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html", + "Using encrypted files in your builds": "bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds.html", + "Build artifacts online": "bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html", + "Artifact retention policy": "bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy.html", + "AI build fixer": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer.html", + "Remote access": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access.html", + "Checking build details": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details.html", + "GitHub Checks with the Bitrise GitHub App": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github.html", + "Reporting build problems in PR comments": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments.html", + "Build logs": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html", + "AI build summary": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary.html", + "Viewing HTML reports": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports.html", + "Rebuilding a failed build": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build.html", + "Debugging your build on your own machine": "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine.html", + "About build triggers": "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers.html", + "Triggering builds by Slack commands": "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands.html", + "YAML syntax for build triggers": "bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.html", + "Skipping a given commit or pull request": "bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request.html", + "Starting parallel builds with a single trigger": "bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger.html", + "Legacy project-based triggers": "bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers.html", + "Configuring build triggers": "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html", + "Approving pull request builds": "bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds.html", + "Scheduling builds": "bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.html", + "Starting builds manually": "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html", + "Build Cache for Bazel": "bitrise-build-cache/build-cache-for-bazel.html", + "Build Cache for Xcode": "bitrise-build-cache/build-cache-for-xcode.html", + "Insights for the Build Cache": "bitrise-build-cache/insights.html", + "Build Cache for Gradle": "bitrise-build-cache/build-cache-for-gradle.html", + "At-rest encryption for the Build Cache": "bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache.html", + "Invocations": "bitrise-build-cache/getting-started-with-the-build-cache/invocations.html", + "Clearing the Build Cache": "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache.html", + "Configuring the Build Cache for Xcode in the Bitrise CI environment": "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment.html", + "Xcode Compilation Cache FAQ": "bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq.html", + "Configuring the Build Cache for Xcode in non-Bitrise CI environments": "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments.html", + "Remote build execution for Bazel": "bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel.html", + "Configuring the Build Cache for Bazel in non-Bitrise CI environments": "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments.html", + "Configuring the Bitrise Build Cache for Bazel in the Bitrise CI environment": "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment.html", + "Configuring the Bitrise Build Cache for Bazel in local environments": "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds.html", + "Gradle configuration cache": "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache.html", + "Configuring the Build Cache for Gradle in local environments": "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds.html", + "Gradle execution reason diagnostic builds": "bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds.html", + "Configuring the Build Cache for Gradle in non-Bitrise CI environments": "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments.html", + "Configuring the Build Cache for Gradle in the Bitrise CI environment": "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment.html", + "Build Hub for GitHub Actions": "bitrise-build-hub/build-hub-for-github-actions.html", + "Configuring Build Hub for GitHub Actions": "bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions.html", + "Build Hub for GitHub Actions overview": "bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview.html", + "IP address ranges for the Bitrise build machines": "bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines.html" + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5b662e8..8994b1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4635 +1,13939 @@ { - "name": "devcenter-new", - "version": "2.0.0", + "name": "bitrise-docs", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "devcenter-new", - "version": "2.0.0", - "license": "ISC", + "name": "bitrise-docs", + "version": "3.0.0", "dependencies": { - "@highlightjs/cdn-assets": "^11.11.1" + "@docusaurus/core": "^3.10.1", + "@docusaurus/preset-classic": "^3.10.1", + "@easyops-cn/docusaurus-search-local": "^0.55.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "devDependencies": { - "@bitrise/eslint-plugin": "^2.12.0", + "@docusaurus/module-type-aliases": "^3.10.1", + "@docusaurus/tsconfig": "^3.10.1", + "@docusaurus/types": "^3.10.1", "cloudflare": "^4.5.0", - "copy-webpack-plugin": "^13.0.0", - "css-loader": "^6.8.1", - "eslint": "^8.57.1", - "eslint-plugin-jsdoc": "^46.2.6", - "express": "^4.19.2", - "html-webpack-plugin": "^5.6.3", - "jsdom": "^26.0.0", - "mini-css-extract-plugin": "^2.9.2", - "prettier": "^3.2.5", - "style-loader": "^3.3.3", - "unzipper": "^0.12.3", - "webpack": "^5.86.0", - "webpack-cli": "^5.1.4", - "webpack-dev-middleware": "^7.2.1", - "webpack-hot-middleware": "^2.26.1" + "typescript": "~5.6.0" + }, + "engines": { + "node": ">=18.0" } }, - "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", - "dev": true, + "node_modules/@algolia/abtesting": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.18.1.tgz", + "integrity": "sha512-aehCadlWOGvrT91KUIZpC0MbB8KBW9yUuvTJFd2xesR7le/IsT4nJUnjCCZ4ZqZCeTcPHPV5mo//fZ5oxcSVYw==", "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@bitrise/eslint-plugin": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@bitrise/eslint-plugin/-/eslint-plugin-2.12.0.tgz", - "integrity": "sha512-0cMyOa5Z4FFSkAmzoqFSizSheQuigDznbI/Js1+c+SDo1LFE2zirMhed+UqBi+BXda8sIKuBQCML9dS9W9S0GQ==", - "dev": true, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz", + "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==", "license": "MIT", "dependencies": { - "@tanstack/eslint-plugin-query": "^5.28.6", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-storybook": "^0.8.0", - "eslint-plugin-testing-library": "^6.2.0", - "eslint-plugin-unused-imports": "^3.2.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": ">= 7", - "@typescript-eslint/parser": ">= 7", - "eslint": ">= 8", - "prettier": ">= 3", - "typescript": ">= 4" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" + "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", + "@algolia/autocomplete-shared": "1.19.8" } }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", + "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@algolia/autocomplete-shared": "1.19.8" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "search-insights": ">= 1 < 3" } }, - "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", - "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", + "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==", "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" } }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@algolia/client-abtesting": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.52.1.tgz", + "integrity": "sha512-HmXOGBOAOJPounpBzBpuY0zDYeiCpxgHnQmuA7JO6ScukcBdGp3/XM9zJk5pJx/xNGD68mbPGXWpDxGtl6BwDQ==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@algolia/client-analytics": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.52.1.tgz", + "integrity": "sha512-5oo4+I8iixie9vXhCyNFCzeIr8pqA3FQ//VsLHTDvZAV4ttYOPGvYHGQq5NSalrLx5Jc3dRro/5uDOlnUMcBJg==", "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" + }, "engines": { - "node": ">=18" + "node": ">= 14.0.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, + "node_modules/@algolia/client-common": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.52.1.tgz", + "integrity": "sha512-qCDoZfx5MpX7XQzvQ3bC4tSEMkQWQMaF/ABtLuoze03Y/flR563CCSws02qIJ23oX7lxl92LsilZjINVyTdtLw==", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", - "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==", - "dev": true, + "node_modules/@algolia/client-insights": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.52.1.tgz", + "integrity": "sha512-hnGs0/lsFJ2PWDxNBz7pxreXo/Xz7gxYRcfePBUjsH26ad0kU/sgnVZd9LwWBpsQv65z2jlb5dkyaB9WE9M9FQ==", "license": "MIT", "dependencies": { - "comment-parser": "1.4.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" }, "engines": { - "node": ">=16" + "node": ">= 14.0.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, + "node_modules/@algolia/client-personalization": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.52.1.tgz", + "integrity": "sha512-2VxxNc/uBysyKvGeBdSM5n9eIDKH8kWD7wd9/yqbJAiVwU4Yv6tU1LSJusHKrXV/aCu1KW7t9Gug9QyeEmtn/Q==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.1.tgz", + "integrity": "sha512-O6mPtsw3xEfNOe6gWFpYLeAZAIljNa4Hgna3bq15PwyN7nbjTY0wXJFRbzs/0YVf75Br+SbOQUmjKxXYjDiSiQ==", "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@algolia/client-search": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.1.tgz", + "integrity": "sha512-gA8oJOV1LnQQkDf91iebNnFInHuW0gRPEgLSOQ7EfipCEjYTHm5swm1DlH9H5RaRw4RrHuzHBegnlzc0MAstcg==", "license": "MIT", + "peer": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 14.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.1.tgz", + "integrity": "sha512-U9zZfc5xIu9wRxZkt+HceJUAD4VKHKbAyLSloJdEyMRmphXeibfrY9cxqIXBcmPeZzGhn3Imb35Dq8l19PkJhw==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/@algolia/monitoring": { + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.52.1.tgz", + "integrity": "sha512-a3SGNceHmkQfq77iG8Ka+w1pvwfZa/0lzEIgse30fL0kD+yKnd/dg0dQvSfFPAEt2f21DMcGkDSSeJlO3KdQjQ==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" }, "engines": { - "node": "*" + "node": ">= 14.0.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, + "node_modules/@algolia/recommend": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.52.1.tgz", + "integrity": "sha512-z98QEguCFDpxb4S/PyrUK1igqF8tPsdbqOUUO6ON91vJ58w+Gwa6ncrI0oNXSFcrkxA5EqPKPQ2A1PBCn08TYQ==", "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@highlightjs/cdn-assets": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@highlightjs/cdn-assets/-/cdn-assets-11.11.1.tgz", - "integrity": "sha512-VEPdHzwelZ12hEX18BHduqxMZGolcUsrbeokHYxOUIm8X2+M7nx5QPtPeQgRxR9XjhdLv4/7DD5BWOlSrJ3k7Q==", - "license": "BSD-3-Clause", + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.1.tgz", + "integrity": "sha512-CI7+/0I11QeZM59Uc8whd2or0kqzFVjpaPn9Qpwll/krHcBAxk24WkAQ6WX+IwDVMfpont4YGbKwAmCre3vE8Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.1" + }, "engines": { - "node": ">=12.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", + "node_modules/@algolia/requester-fetch": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.52.1.tgz", + "integrity": "sha512-S6bDuw9byfOvm3T71cgdoZgrgnZq6hpdMLkx52Louh57nUAmvGQESz2aojOynQHjbTiV55smvAFbgn0qT4tJrg==", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@algolia/client-common": "5.52.1" }, "engines": { - "node": ">=10.10.0" + "node": ">= 14.0.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/@algolia/requester-node-http": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.52.1.tgz", + "integrity": "sha512-tqZXM+54rWo4mk5jL5Z/flE11nPmNEdXwFBM5py9DkOmbjeCNemfVd45FyM97XdzfZ0dl9uOJC6PYn1FpkeyQg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@algolia/client-common": "5.52.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "license": "MIT", "engines": { - "node": ">=12.22" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.29.0", + "semver": "^6.3.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "tslib": "2" + "@babel/core": "^7.0.0" } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", - "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@jsonjoy.com/util": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", - "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "tslib": "2" + "@babel/core": "^7.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@pkgr/core": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", - "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", - "dev": true, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/pkgr" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/csf": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", - "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", - "dev": true, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { - "lodash": "^4.17.15" + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@tanstack/eslint-plugin-query": { - "version": "5.78.0", - "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.78.0.tgz", - "integrity": "sha512-hYkhWr3UP0CkAsn/phBVR98UQawbw8CmTSgWtdgEBUjI60/GBaEIkpgi/Bp/2I8eIDK4+vdY7ac6jZx+GR+hEQ==", - "dev": true, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.18.1" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true, - "license": "MIT" + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/node": { - "version": "22.15.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz", - "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==", - "dev": true, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", - "dev": true, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "license": "MIT", "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", - "dev": true, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "license": "MIT", - "peer": true, "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "license": "MIT", - "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^8.56.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz", - "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==", - "dev": true, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz", + "integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==", "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.33.1", - "@typescript-eslint/types": "^8.33.1", - "debug": "^4.3.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz", - "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==", - "dev": true, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz", - "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==", - "dev": true, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "license": "MIT", - "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^8.56.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "license": "MIT", - "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz", - "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==", - "dev": true, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.33.1", - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/typescript-estree": "8.33.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz", - "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==", - "dev": true, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz", - "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==", - "dev": true, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz", - "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==", - "dev": true, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.33.1", - "@typescript-eslint/tsconfig-utils": "8.33.1", - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz", - "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==", - "dev": true, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.33.1", - "eslint-visitor-keys": "^4.2.0" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { - "node": ">=18.12" + "node": ">=6.9.0" }, "peerDependencies": { - "typescript": ">=4.8.4" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=14.15.0" + "node": ">=6.9.0" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { - "node": ">=14.15.0" + "node": ">=6.9.0" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, "engines": { - "node": ">=14.15.0" + "node": ">=6.9.0" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "license": "MIT", "dependencies": { - "event-target-shim": "^5.0.0" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">=6.5" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "dev": true, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "license": "MIT", "dependencies": { - "humanize-ms": "^1.2.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">= 8.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/axe-core": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", - "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", - "dev": true, - "license": "MPL-2.0", + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001721", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", - "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.5.tgz", + "integrity": "sha512-/69t2aEzGKHD76DyLbHysF/QH2LJOB8iFnYO37unDTKBTubzcMRv0f3H5EiN1Q6ajOd/eB7dAInF0qdFVS06kA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.4", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "license": "MIT", - "engines": { - "node": ">=6.0" + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "license": "MIT", "dependencies": { - "source-map": "~0.6.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, - "engines": { - "node": ">= 10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/cloudflare": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/cloudflare/-/cloudflare-4.5.0.tgz", - "integrity": "sha512-fPcbPKx4zF45jBvQ0z7PCdgejVAPBBCZxwqk1k7krQNfpM07Cfj97/Q6wBzvYqlWXx/zt1S9+m8vnfCe06umbQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/cloudflare/node_modules/@types/node": { - "version": "18.19.120", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", - "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/cloudflare/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { - "node": ">= 0.8" + "node": ">=6.9.0" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", - "dev": true, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, + "optional": true, "engines": { - "node": ">= 0.6" + "node": ">=0.1.90" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "url": "https://github.com/sponsors/csstools" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "MIT" - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-webpack-plugin": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", - "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", - "dev": true, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "glob-parent": "^6.0.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2", - "tinyglobby": "^0.2.12" - }, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=18" }, "peerDependencies": { - "webpack": "^5.1.0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { - "node": ">= 8" + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "dev": true, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, + "peer": true, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=18" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">=18" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/cssstyle": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", - "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@asamuzakjp/css-color": "^3.1.2", - "rrweb-cssom": "^0.8.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/data-view-byte-offset": { + "node_modules/@csstools/postcss-color-function-display-p3-linear": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "ms": "^2.1.3" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "path-type": "^4.0.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "esutils": "^2.0.2" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "utila": "~0.4" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "license": "BSD-2-Clause", + "license": "MIT-0", "dependencies": { - "domelementtype": "^2.2.0" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">= 4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", + "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", + "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.3.tgz", + "integrity": "sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.6.3", + "@docsearch/css": "4.6.3" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz", + "integrity": "sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz", + "integrity": "sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.10.1", + "@docusaurus/cssnano-preset": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^7.0.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", + "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.1", + "@docusaurus/bundler": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "^5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.3", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.7", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*", + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz", + "integrity": "sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", + "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz", + "integrity": "sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz", + "integrity": "sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz", + "integrity": "sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "cheerio": "1.0.0-rc.12", + "combine-promises": "^1.1.0", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", + "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz", + "integrity": "sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz", + "integrity": "sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz", + "integrity": "sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz", + "integrity": "sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz", + "integrity": "sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@types/gtag.js": "^0.0.20", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz", + "integrity": "sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz", + "integrity": "sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz", + "integrity": "sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz", + "integrity": "sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/plugin-css-cascade-layers": "3.10.1", + "@docusaurus/plugin-debug": "3.10.1", + "@docusaurus/plugin-google-analytics": "3.10.1", + "@docusaurus/plugin-google-gtag": "3.10.1", + "@docusaurus/plugin-google-tag-manager": "3.10.1", + "@docusaurus/plugin-sitemap": "3.10.1", + "@docusaurus/plugin-svgr": "3.10.1", + "@docusaurus/theme-classic": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-search-algolia": "3.10.1", + "@docusaurus/types": "3.10.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz", + "integrity": "sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz", + "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz", + "integrity": "sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "^1.19.2", + "@docsearch/react": "^3.9.0 || ^4.3.2", + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz", + "integrity": "sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.10.1.tgz", + "integrity": "sha512-rYvB7yqkdqWIpAbDzQljGfM4cDBkLTbhmagZBEcsyj6oPUsz47lmW2pYdN1j+7sGFgltbAmQH62xfbrij4Eh6Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz", + "integrity": "sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", + "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "escape-string-regexp": "^4.0.0", + "execa": "^5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz", + "integrity": "sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", + "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.1.tgz", + "integrity": "sha512-jmBKj1J+tajqNrCvECwKCQYTWwHVZDGApy8lLOYEPe+Dm0/f3Ccdw8BP5/OHNpltr7WDNY2roQXn+TWn2f1kig==", + "license": "MIT", + "dependencies": { + "@docusaurus/plugin-content-docs": "^2 || ^3", + "@docusaurus/theme-translations": "^2 || ^3", + "@docusaurus/utils": "^2 || ^3", + "@docusaurus/utils-common": "^2 || ^3", + "@docusaurus/utils-validation": "^2 || ^3", + "@easyops-cn/autocomplete.js": "^0.38.1", + "@node-rs/jieba": "^1.6.0", + "cheerio": "^1.0.0", + "clsx": "^2.1.1", + "comlink": "^4.4.2", + "debug": "^4.2.0", + "fs-extra": "^10.0.0", + "klaw-sync": "^6.0.0", + "lunr": "^2.3.9", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2 || ^3", + "open-ask-ai": "^0.7.3", + "react": "^16.14.0 || ^17 || ^18 || ^19", + "react-dom": "^16.14.0 || 17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "open-ask-ai": { + "optional": true + } + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", + "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", + "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", + "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", + "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", + "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", + "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", + "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.2", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", + "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", + "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/jieba-android-arm-eabi": "1.10.4", + "@node-rs/jieba-android-arm64": "1.10.4", + "@node-rs/jieba-darwin-arm64": "1.10.4", + "@node-rs/jieba-darwin-x64": "1.10.4", + "@node-rs/jieba-freebsd-x64": "1.10.4", + "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4", + "@node-rs/jieba-linux-arm64-gnu": "1.10.4", + "@node-rs/jieba-linux-arm64-musl": "1.10.4", + "@node-rs/jieba-linux-x64-gnu": "1.10.4", + "@node-rs/jieba-linux-x64-musl": "1.10.4", + "@node-rs/jieba-wasm32-wasi": "1.10.4", + "@node-rs/jieba-win32-arm64-msvc": "1.10.4", + "@node-rs/jieba-win32-ia32-msvc": "1.10.4", + "@node-rs/jieba-win32-x64-msvc": "1.10.4" + } + }, + "node_modules/@node-rs/jieba-android-arm-eabi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz", + "integrity": "sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-android-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz", + "integrity": "sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz", + "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz", + "integrity": "sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-freebsd-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz", + "integrity": "sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz", + "integrity": "sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz", + "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz", + "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz", + "integrity": "sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz", + "integrity": "sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-wasm32-wasi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz", + "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/jieba-win32-arm64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz", + "integrity": "sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-ia32-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz", + "integrity": "sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-x64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz", + "integrity": "sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.7.0.tgz", + "integrity": "sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.7.0.tgz", + "integrity": "sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.7.0.tgz", + "integrity": "sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.7.0.tgz", + "integrity": "sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-rsa": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.7.0.tgz", + "integrity": "sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.7.0.tgz", + "integrity": "sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pfx": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.7.0.tgz", + "integrity": "sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz", + "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==", + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.7.0.tgz", + "integrity": "sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.7.0.tgz", + "integrity": "sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", + "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.4" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.1.tgz", + "integrity": "sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/abtesting": "1.18.1", + "@algolia/client-abtesting": "5.52.1", + "@algolia/client-analytics": "5.52.1", + "@algolia/client-common": "5.52.1", + "@algolia/client-insights": "5.52.1", + "@algolia/client-personalization": "5.52.1", + "@algolia/client-query-suggestions": "5.52.1", + "@algolia/client-search": "5.52.1", + "@algolia/ingestion": "1.52.1", + "@algolia/monitoring": "1.52.1", + "@algolia/recommend": "5.52.1", + "@algolia/requester-browser-xhr": "5.52.1", + "@algolia/requester-fetch": "5.52.1", + "@algolia/requester-node-http": "5.52.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.29.0.tgz", + "integrity": "sha512-170iMInIusQlg2c28ZJiiJlUN/RMQWN4sd+PWrpv5bbd/KW+Ux7DjwS2FxvYEFt7r5dmhrMQQBMNY+NeAtX8YA==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cloudflare": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/cloudflare/-/cloudflare-4.5.0.tgz", + "integrity": "sha512-fPcbPKx4zF45jBvQ0z7PCdgejVAPBBCZxwqk1k7krQNfpM07Cfj97/Q6wBzvYqlWXx/zt1S9+m8vnfCe06umbQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", + "integrity": "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.8.0.tgz", + "integrity": "sha512-QbLeyz2Bgso1iRlh7IpWk6OKa3lLNGXsujVjDMPl9rOZpxKeiG69icLpbLCFxeURwmcdIfZqQyhlooKJYM4f8Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.351", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.351.tgz", + "integrity": "sha512-9D7Iqx8RImSvCnOsj86rCH6eQjZFQoM04Jn6HnZVM0Nu/G58/gmKYQ1d12MZTbjQbQSTGI8nwEy07ErsA2slLA==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/got/node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", + "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "license": "BSD-3-Clause", "dependencies": { - "readable-stream": "^2.0.2" + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" + "node_modules/launch-editor": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.2.tgz", + "integrity": "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } }, - "node_modules/electron-to-chromium": { - "version": "1.5.165", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", - "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", - "dev": true, - "license": "ISC" + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dev": true, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=10.13.0" + "node": ">=8.9.0" } }, - "node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, "engines": { - "node": ">=0.12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", - "dev": true, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "dev": true, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "js-tokens": "^3.0.0 || ^4.0.0" }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "node_modules/lunr-languages": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.17.0.tgz", + "integrity": "sha512-ClGZPfWoxdFgTmqa1uC12cBJJzkMiJGtQhR9J3dQLwnsO5efcTXGtTj7MQZCdjYL9jAL7J1pWQr3hksAn2zJ9Q==", + "license": "MPL-1.1" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-set-tostringtag": { + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dev": true, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "license": "MIT", "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - }, - "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "license": "MIT", "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz", - "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==", - "dev": true, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^7.0.0", - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "license": "MIT", + "node_modules/memfs": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", + "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", + "license": "Apache-2.0", "dependencies": { - "debug": "^3.2.7" + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-to-fsa": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "node": ">= 8" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" }, - "engines": { - "node": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", - "dev": true, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "jest": { - "optional": true + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - } + ], + "license": "MIT" }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-jest/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-jsdoc": { - "version": "46.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz", - "integrity": "sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", "dependencies": { - "@es-joy/jsdoccomment": "~0.41.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.4", - "spdx-expression-parse": "^4.0.0" - }, - "engines": { - "node": ">=16" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "license": "MIT", "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", - "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", - "dev": true, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "license": "MIT", "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-storybook": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz", - "integrity": "sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==", - "dev": true, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@storybook/csf": "^0.0.1", - "@typescript-eslint/utils": "^5.62.0", - "requireindex": "^1.2.0", - "ts-dedent": "^2.2.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "eslint": ">=6" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-storybook/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-storybook/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/eslint-plugin-testing-library": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.5.0.tgz", - "integrity": "sha512-Ls5TUfLm5/snocMAOlofSOJxNN0aKqwTlco7CrNtMjkTdQlkpSMaeTCDHCuXfzrI97xcx2rSCNeKeJjtpkNC1w==", - "dev": true, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" } }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-plugin-testing-library/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/eslint-plugin-testing-library/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/eslint-plugin-unused-imports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz", - "integrity": "sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==", - "dev": true, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "6 - 7", - "eslint": "8" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=4.0.0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=0.8.x" + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "ms": "2.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "license": "MIT" }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" + "micromark-util-types": "^2.0.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/fast-json-stable-stringify": { + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/fastify" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "opencollective", - "url": "https://opencollective.com/fastify" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], - "license": "BSD-3-Clause" + "license": "MIT" }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">= 4.9.1" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8.6" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC" }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { - "is-callable": "^1.2.7" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "dev": true, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "dev": true, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "dev": true, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "license": "MIT", "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">= 12.20" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=10.5.0" } }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" }, "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" + "boolbase": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "engines": { - "node": "*" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", + "node_modules/null-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "peer": true, "dependencies": { - "is-glob": "^4.0.3" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/glob-to-regexp": { + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -4638,2414 +13942,2667 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.20" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.0" + "p-limit": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" }, "engines": { - "node": ">= 0.4" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "license": "MIT", - "bin": { - "he": "bin/he" + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", "license": "MIT", "dependencies": { - "whatwg-encoding": "^3.1.1" + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" }, "engines": { - "node": ">=18" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" + "callsites": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", "license": "MIT", - "engines": { - "node": ">= 12" + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", - "dev": true, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", + "entities": "^6.0.0" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "domhandler": "^5.0.3", + "parse5": "^7.0.0" }, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "parse5": "^7.0.0" }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", "engines": { - "node": ">= 14" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, "engines": { - "node": ">= 14" + "node": ">= 0.8" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "license": "MIT", "dependencies": { - "ms": "^2.0.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "license": "MIT", "engines": { - "node": ">=10.18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "find-up": "^6.3.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, "engines": { - "node": ">=0.8.19" + "node": ">=16.0.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=10.13.0" + "node": ">=4" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.10" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=7.6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.6" } }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "license": "MIT", "dependencies": { - "builtin-modules": "^3.3.0" + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=6" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "call-bound": "^1.0.3" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "isobject": "^3.0.1" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "which-typed-array": "^1.1.16" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, "engines": { - "node": ">= 0.4" + "node": ">= 14.15.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "call-bound": "^1.0.3" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" }, "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "license": "MIT", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": ">= 10.13.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "dev": true, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "license": "MIT", "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=18" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "postcss": "^8.4.31" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "postcss-selector-parser": "^6.0.16" }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" + "engines": { + "node": "^14 || ^16 || >=18.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", "engines": { - "node": ">=4.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { - "language-subtag-registry": "^0.3.20" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=0.10" + "node": ">=4" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=6.11.5" + "node": ">=4" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", "dependencies": { - "p-locate": "^5.0.0" + "icss-utils": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || >= 14" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" }, - "bin": { - "loose-envify": "cli.js" + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { - "tslib": "^2.0.3" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/memfs": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", - "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", - "dev": true, - "license": "Apache-2.0", + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", - "tslib": "^2.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 4.0.0" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8.6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" + "engines": { + "node": ">=18" }, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", - "dev": true, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "webpack": "^5.0.0" + "postcss": "^8.4.31" } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "brace-expansion": "^2.0.1" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, + "node_modules/postcss-preset-env": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/jimmywarting" + "url": "https://github.com/sponsors/csstools" }, { - "type": "github", - "url": "https://paypal.me/jimmywarting" + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "MIT", + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.6.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, "engines": { - "node": ">=10.5.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "whatwg-url": "^5.0.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=18" }, "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "postcss": "^8.4" } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0" + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "postcss": "^8.0.3" } }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" + "sort-css-media-queries": "2.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" } }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >= 18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": ">= 0.8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, "engines": { - "node": ">= 0.8.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "lodash": "^4.17.20", + "renderkid": "^3.0.0" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": ">=16.0.0" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { - "entities": "^6.0.0" - }, + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "engines": { + "node": ">= 0.10" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", "license": "MIT", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">= 0.6" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { - "p-locate": "^4.1.0" + "loose-envify": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "^18.3.1" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", "dependencies": { - "p-limit": "^2.2.0" + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" } }, - "node_modules/postcss": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", - "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "@types/react": "*" }, - "engines": { - "node": "^10 || ^12 || >=14" + "peerDependencies": { + "react": "*" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "license": "ISC", + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz", + "integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=10.13.0" }, "peerDependencies": { - "postcss": "^8.1.0" + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "dev": true, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" }, "peerDependencies": { - "postcss": "^8.1.0" + "react": ">=15" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "license": "ISC", + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "@babel/runtime": "^7.1.2" }, "peerDependencies": { - "postcss": "^8.1.0" + "react": ">=15", + "react-router": ">=5" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "license": "ISC", + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" }, "peerDependencies": { - "postcss": "^8.1.0" + "react": ">=15" } }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.10.0" } }, - "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", - "dev": true, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">=14" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/prettier-linter-helpers": { + "node_modules/recma-parse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", "license": "MIT", "dependencies": { - "fast-diff": "^1.1.2" + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", "license": "MIT", "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "license": "MIT" }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, "engines": { - "node": ">=6" + "node": ">=14" } }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "rc": "1.2.8" }, "engines": { - "node": ">=0.6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "license": "BSD-2-Clause", "dependencies": { - "safe-buffer": "^5.1.0" + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" }, - "engines": { - "node": ">= 0.8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" }, "engines": { - "node": ">= 10.13.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "license": "MIT", - "engines": { - "node": ">= 0.10" + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, "license": "MIT", "dependencies": { "css-select": "^4.1.3", @@ -7055,34 +16612,124 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "license": "MIT", + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", "engines": { - "node": ">=0.10.5" + "node": "*" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7096,79 +16743,95 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-cwd": { + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "license": "MIT", "dependencies": { - "resolve-from": "^5.0.0" + "lowercase-keys": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 4" } }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" }, "bin": { - "rimraf": "bin.js" + "rtlcss": "bin/rtlcss.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=12.0.0" } }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -7188,107 +16851,60 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=v12.22.7" + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" } }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "dev": true, + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -7304,48 +16920,49 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=4" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=18" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7354,26 +16971,40 @@ "node": ">=10" } }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -7383,7 +17014,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -7393,40 +17023,149 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, "license": "MIT" }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "node": ">= 0.6" } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -7436,7 +17175,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -7450,49 +17188,16 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, "license": "MIT", "dependencies": { "kind-of": "^6.0.2" @@ -7501,11 +17206,16 @@ "node": ">=8" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -7518,17 +17228,27 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -7545,14 +17265,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -7565,7 +17284,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -7584,7 +17302,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -7600,31 +17317,121 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", + "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -7634,190 +17441,179 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "license": "MIT", - "engines": { - "node": ">= 0.8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0.0" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.8" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -7826,21 +17622,28 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7849,28 +17652,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "dev": true, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", "license": "MIT", - "engines": { - "node": ">= 12.13.0" + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "webpack": "^5.0.0" + "postcss": "^8.4.31" } }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -7883,7 +17702,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7892,48 +17710,67 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "license": "MIT" }, - "node_modules/synckit": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", - "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", - "dev": true, + "node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.4" + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=14.0.0" }, "funding": { - "url": "https://opencollective.com/synckit" + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" } }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.41.0.tgz", - "integrity": "sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==", - "dev": true, + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", + "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -7945,16 +17782,14 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "dev": true, + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -7979,96 +17814,88 @@ } } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=10.18" + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, - "peerDependencies": { - "tslib": "^2" + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, + "node_modules/thingies": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10.18" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "bin": { - "tldts": "bin/cli.js" + "peerDependencies": { + "tslib": "^2" } }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "license": "MIT" }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -8081,43 +17908,31 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=6" } }, "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } + "license": "MIT" }, "node_modules/tree-dump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", - "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -8130,94 +17945,58 @@ "tslib": "2" } }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "license": "MIT", - "peer": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ts-dedent": { + "node_modules/trough": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", "license": "MIT", "dependencies": { - "tslib": "^1.8.1" + "tslib": "^1.9.3" }, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">= 6.0.0" } }, - "node_modules/tsutils/node_modules/tslib": { + "node_modules/tsyringe/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, "license": "0BSD" }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8227,7 +18006,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -8237,130 +18015,213 @@ "node": ">= 0.6" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 0.4" + "node": ">=14.17" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, + "node_modules/undici": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "engines": { - "node": ">=14.17" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -8370,31 +18231,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/unzipper": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", - "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "~3.7.2", - "duplexer2": "~0.1.4", - "fs-extra": "^11.2.0", - "graceful-fs": "^4.2.2", - "node-int64": "^0.4.0" - } - }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -8421,68 +18266,267 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true, "license": "MIT" }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "license": "MIT", "dependencies": { - "xml-name-validator": "^5.0.0" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -8492,6 +18536,25 @@ "node": ">=10.13.0" } }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/web-streams-polyfill": { "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", @@ -8503,215 +18566,353 @@ } }, "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } + "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", - "dev": true, + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", + "loader-runner": "^4.3.1", + "mime-db": "^1.54.0", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "url": "https://opencollective.com/express" } }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "license": "MIT", "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { - "webpack-cli": "bin/cli.js" + "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">=14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "5.x.x" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { + "webpack": { "optional": true }, - "webpack-dev-server": { + "webpack-cli": { "optional": true } } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", "engines": { - "node": ">=14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", - "dev": true, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": ">= 18.12.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "webpack": "^5.0.0" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "webpack": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { "optional": true } } }, - "node_modules/webpack-hot-middleware": { - "version": "2.26.1", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", - "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.1.0", - "strip-ansi": "^6.0.0" - } - }, "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", - "wildcard": "^2.0.0" + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.2.tgz", - "integrity": "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==", - "dev": true, + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "ansis": "^3.2.0", + "consola": "^3.2.3", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=14.21.3" + }, + "peerDependencies": { + "@rspack/core": "*", + "webpack": "3 || 4 || 5" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, "engines": { - "node": ">=4.0" + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" } }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -8724,7 +18925,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8737,31 +18937,26 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "license": "MIT", "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -8773,138 +18968,106 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "license": "MIT", "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" + "string-width": "^5.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "dev": true, + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -8915,35 +19078,87 @@ } } }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 7a97cb6..9798118 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,49 @@ { - "name": "devcenter-new", - "version": "2.0.0", - "description": "The New Bitrise Devcenter", - "homepage": "https://github.com/bitrise-io/devcenter-new#readme", - "bugs": { - "url": "https://github.com/bitrise-io/devcenter-new/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/bitrise-io/devcenter-new.git" - }, - "license": "ISC", - "author": "", - "main": "index.js", + "name": "bitrise-docs", + "version": "3.0.0", + "private": true, "scripts": { - "dev": "./node-with-env.sh index.js", - "test": "echo \"Error: no test specified\" && exit 1", - "paligo:list": "./node-with-env.sh paligo.js list", - "paligo:publish": "./node-with-env.sh paligo.js publish 19 ./out", - "paligo:download_latest": "./node-with-env.sh paligo.js download_latest 19 ./out", - "cloudflare:upload_redirects": "./node-with-env.sh cloudflare.js", - "build": "./node-with-env.sh build.js" + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "cloudflare:upload_redirects": "node cloudflare.js" }, "dependencies": { - "@highlightjs/cdn-assets": "^11.11.1" + "@docusaurus/core": "^3.10.1", + "@docusaurus/preset-classic": "^3.10.1", + "@easyops-cn/docusaurus-search-local": "^0.55.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "devDependencies": { - "@bitrise/eslint-plugin": "^2.12.0", + "@docusaurus/module-type-aliases": "^3.10.1", + "@docusaurus/tsconfig": "^3.10.1", + "@docusaurus/types": "^3.10.1", "cloudflare": "^4.5.0", - "copy-webpack-plugin": "^13.0.0", - "css-loader": "^6.8.1", - "eslint": "^8.57.1", - "eslint-plugin-jsdoc": "^46.2.6", - "express": "^4.19.2", - "html-webpack-plugin": "^5.6.3", - "jsdom": "^26.0.0", - "mini-css-extract-plugin": "^2.9.2", - "prettier": "^3.2.5", - "style-loader": "^3.3.3", - "unzipper": "^0.12.3", - "webpack": "^5.86.0", - "webpack-cli": "^5.1.4", - "webpack-dev-middleware": "^7.2.1", - "webpack-hot-middleware": "^2.26.1" + "typescript": "~5.6.0" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" } } diff --git a/scripts/link_steps.py b/scripts/link_steps.py index 295837f..32585bf 100644 --- a/scripts/link_steps.py +++ b/scripts/link_steps.py @@ -19,6 +19,8 @@ 3. Single-word titles (e.g. "Script") are only linked when followed by "Step". """ +from __future__ import annotations + import json import re import subprocess diff --git a/sidebars.ts b/sidebars.ts new file mode 100644 index 0000000..fcb5b92 --- /dev/null +++ b/sidebars.ts @@ -0,0 +1,20 @@ +import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; + +function sidebarHeader(label: string, href: string) { + return { + type: 'html' as const, + value: `← Home${label}`, + className: 'sidebar-section-header', + }; +} + +const sidebars: SidebarsConfig = { + bitrisePlatform: [sidebarHeader('Bitrise as a Platform', '/en/bitrise-platform'), {type: 'autogenerated', dirName: 'bitrise-platform'}], + bitriseCI: [sidebarHeader('Bitrise CI', '/en/bitrise-ci'), {type: 'autogenerated', dirName: 'bitrise-ci'}], + bitriseBuildCache: [sidebarHeader('Bitrise Build Cache', '/en/bitrise-build-cache'), {type: 'autogenerated', dirName: 'bitrise-build-cache'}], + bitriseReleaseManagement: [sidebarHeader('Release Management', '/en/release-management'), {type: 'autogenerated', dirName: 'release-management'}], + bitriseInsights: [sidebarHeader('Insights', '/en/insights'), {type: 'autogenerated', dirName: 'insights'}], + bitriseBuildHub: [sidebarHeader('Bitrise Build Hub', '/en/bitrise-build-hub'), {type: 'autogenerated', dirName: 'bitrise-build-hub'}], +}; + +export default sidebars; diff --git a/src/components/GlossTerm/index.tsx b/src/components/GlossTerm/index.tsx new file mode 100644 index 0000000..8621c7d --- /dev/null +++ b/src/components/GlossTerm/index.tsx @@ -0,0 +1,58 @@ +import React, {useState} from 'react'; +import Link from '@docusaurus/Link'; +import glossary from '@site/migration/glossary.json'; +import styles from './styles.module.css'; + +type GlossaryEntry = {term: string; definition: string}; +const data: Record = glossary as Record; + +const GLOSSARY_PATH = '/en/bitrise-ci/references/glossary'; + +function slugify(text: string): string { + return text + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_]+/g, '-') + .replace(/-+/g, '-') + .replace(/^-+|-+$/g, ''); +} + +export default function GlossTerm({ + baseform, + children, +}: { + baseform: string; + children: React.ReactNode; +}): React.JSX.Element { + const [hovered, setHovered] = useState(false); + const childText = typeof children === 'string' ? children : ''; + const entry = data[baseform?.toLowerCase()] ?? data[childText.toLowerCase()]; + + if (!entry) { + return <>{children}; + } + + const anchor = slugify(entry.term); + const href = `${GLOSSARY_PATH}#${anchor}`; + + return ( + setHovered(true)} + onMouseLeave={() => setHovered(false)} + onFocus={() => setHovered(true)} + onBlur={() => setHovered(false)} + > + + {children} + + {hovered && ( + + {entry.term} + {entry.definition} + + )} + + ); +} diff --git a/src/components/GlossTerm/styles.module.css b/src/components/GlossTerm/styles.module.css new file mode 100644 index 0000000..55fa364 --- /dev/null +++ b/src/components/GlossTerm/styles.module.css @@ -0,0 +1,45 @@ +.term { + position: relative; + display: inline; + cursor: help; + outline: none; +} + +.label { + border-bottom: 1px dotted var(--ifm-color-primary, #7b3ba5); + color: var(--ifm-color-primary, #7b3ba5); +} + +.popover { + position: absolute; + top: 100%; + left: 0; + margin-top: 0.5rem; + z-index: 200; + display: flex; + flex-direction: column; + gap: 0.5rem; + width: 320px; + max-width: 90vw; + padding: 0.875rem 1rem; + background: var(--ifm-background-surface-color, #fff); + border: 1px solid var(--ifm-color-emphasis-200, #dfdae1); + border-radius: 0.5rem; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); + font-size: 0.875rem; + line-height: 1.4; + color: var(--ifm-font-color-base); + white-space: normal; + pointer-events: auto; +} + +.popoverTerm { + font-weight: 700; + color: var(--ifm-heading-color, #201b22); + padding-bottom: 0.5rem; + border-bottom: 1px solid var(--ifm-color-emphasis-100, #efebef); +} + +.popoverDef { + color: var(--ifm-font-color-base); +} diff --git a/src/components/Procedure.tsx b/src/components/Procedure.tsx new file mode 100644 index 0000000..012e24e --- /dev/null +++ b/src/components/Procedure.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +interface ProcedureProps { + children: React.ReactNode; +} + +export default function Procedure({ children }: ProcedureProps) { + return
    {children}
; +} diff --git a/src/components/ProductHomepage.module.css b/src/components/ProductHomepage.module.css new file mode 100644 index 0000000..2e2d665 --- /dev/null +++ b/src/components/ProductHomepage.module.css @@ -0,0 +1,162 @@ +.wrapper { + container-type: inline-size; +} + +/* ---- Hero ---- */ + +.hero { + display: flex; + align-items: flex-start; + gap: 2rem; + padding-bottom: 3rem; + margin-bottom: 2.5rem; +} + +.heroContent { + flex: 1; + min-width: 0; +} + +.heroTitle { + font-size: 2rem !important; + font-weight: 700; + line-height: 2.5rem; + color: var(--text-primary); + margin-top: 0; + margin-bottom: 1rem; +} + +.heroDescription { + font-size: 1.0625rem; + line-height: 1.65; + color: var(--text-body); + margin-bottom: 1.5rem; + max-width: 580px; +} + +.heroButtons { + display: flex; + gap: 0.75rem; + flex-wrap: wrap; +} + +.btnFilled { + display: inline-flex; + align-items: center; + padding: 0.5rem 1.25rem; + border-radius: 0.25rem; + background: var(--pal-purple-40); + color: #ffffff !important; + font-weight: 600; + font-size: 0.9375rem; + text-decoration: none !important; + border: 1px solid transparent; + transition: background 0.15s; +} + +.btnFilled:hover { + background: var(--pal-purple-30) !important; + color: #ffffff !important; +} + +.btnOutlined { + display: inline-flex; + align-items: center; + padding: 0.5rem 1.25rem; + border-radius: 0.25rem; + border: 1px solid var(--pal-purple-40); + color: var(--pal-purple-40) !important; + font-weight: 600; + font-size: 0.9375rem; + text-decoration: none !important; + background: transparent; + transition: background 0.15s; +} + +.btnOutlined:hover { + background: var(--sys-interactive-minimal) !important; + color: var(--pal-purple-30) !important; +} + +.heroIllustration { + flex-shrink: 0; + width: 260px; +} + +.heroIllustration img { + width: 100%; + height: auto; + border: none !important; + border-radius: 0 !important; + background: transparent; +} + +/* ---- 3-column grid ---- */ + +.grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0; +} + +.column { + padding: 0 2rem; +} + +.column:first-child { + padding-left: 0; +} + +.column:last-child { + padding-right: 0; +} + + +.columnHeading { + font-size: 0.75rem !important; + font-weight: 600 !important; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--text-secondary) !important; + margin-top: 0 !important; + margin-bottom: 0.75rem !important; + padding-bottom: 0.75rem; + border-bottom: 1px solid var(--border-regular); +} + +.linkList { + list-style: none; + padding: 0; + margin: 0; +} + +.linkItem { + padding: 0.875rem 0; + border-bottom: 1px solid var(--border-minimal); +} + +.linkItem:last-child { + border-bottom: none; +} + +.linkTitle { + display: block; + font-weight: 600; + font-size: 0.9375rem; + color: var(--sys-interactive-base) !important; + margin-bottom: 0.25rem; + text-decoration: none !important; + line-height: 1.4; +} + +.linkTitle:hover { + color: var(--sys-interactive-strong) !important; + text-decoration: underline !important; +} + +.linkDescription { + font-size: 0.875rem; + line-height: 1.5; + color: var(--text-body); + margin: 0; +} diff --git a/src/components/ProductHomepage.tsx b/src/components/ProductHomepage.tsx new file mode 100644 index 0000000..56fa8bf --- /dev/null +++ b/src/components/ProductHomepage.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; +import styles from './ProductHomepage.module.css'; + +interface ArticleLink { + title: string; + href: string; + description: string; +} + +interface Column { + heading: string; + links: ArticleLink[]; +} + +interface ProductHomepageProps { + title: string; + description: string; + illustration?: string; + buttons?: Array<{ + label: string; + href: string; + variant: 'filled' | 'outlined'; + }>; + columns?: Column[]; +} + +export default function ProductHomepage({ + title, + description, + illustration, + buttons = [], + columns, +}: ProductHomepageProps) { + return ( +
+
+
+

{title}

+

{description}

+ {buttons.length > 0 && ( +
+ {buttons.map((btn) => ( + + {btn.label} + + ))} +
+ )} +
+ {illustration && ( +
+ +
+ )} +
+ + {columns && columns.length > 0 &&
+ {columns.map((col) => ( +
+

{col.heading}

+
    + {col.links.map((link) => ( +
  • + + {link.title} + + {link.description && ( +

    {link.description}

    + )} +
  • + ))} +
+
+ ))} +
} +
+ ); +} diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 0000000..3a92ae3 --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,745 @@ +@import url('./variables.css'); + +:root { + --ifm-color-primary: var(--pal-purple-40); + --ifm-color-primary-dark: var(--pal-purple-30); + --ifm-color-primary-darker: var(--pal-purple-20); + --ifm-color-primary-darkest: var(--pal-purple-10); + --ifm-color-primary-light: var(--pal-purple-50); + --ifm-color-primary-lighter: var(--pal-purple-60); + --ifm-color-primary-lightest: var(--pal-purple-80); + + --ifm-font-family-base: 'Figtree', system-ui, -apple-system, sans-serif; + --ifm-font-family-monospace: 'Source Code Pro', SFMono-Regular, Menlo, Monaco, Consolas, monospace; + --ifm-heading-font-weight: 700; + + --ifm-font-size-base: 100%; + --ifm-line-height-base: 1.5; + + /* Match live site heading scale */ + --ifm-h1-font-size: 1.875rem; + --ifm-h2-font-size: 1.5rem; + --ifm-h3-font-size: 1.1875rem; + --ifm-h4-font-size: 1rem; + --ifm-h5-font-size: 0.875rem; + --ifm-h6-font-size: 0.75rem; + + --ifm-link-color: var(--sys-interactive-base); + --ifm-link-hover-color: var(--sys-interactive-strong); + + --ifm-background-color: var(--sys-bg-surface); + --ifm-footer-background-color: var(--pal-neutral-10); + + --ifm-navbar-height: 3rem; + --ifm-navbar-background-color: var(--pal-purple-30); + --ifm-navbar-shadow: none; + --ifm-navbar-link-color: rgba(255, 255, 255, 0.9); + --ifm-navbar-link-hover-color: #ffffff; + + --ifm-code-font-size: 85%; + --ifm-code-padding-horizontal: 0.3rem; + --ifm-code-padding-vertical: 0.1rem; + --ifm-code-background: var(--sys-bg-minimal); + --ifm-code-border-radius: 0.25rem; +} + +[data-theme='dark'] { + --ifm-color-primary: var(--pal-purple-70); + --ifm-color-primary-dark: var(--pal-purple-60); + --ifm-color-primary-darker: var(--pal-purple-50); + --ifm-color-primary-darkest: var(--pal-purple-40); + --ifm-color-primary-light: var(--pal-purple-80); + --ifm-color-primary-lighter: var(--pal-purple-90); + --ifm-color-primary-lightest: var(--pal-purple-93); + + --ifm-background-color: #1a1a2e; + --ifm-navbar-background-color: var(--pal-purple-10); +} + +/* ---- Navbar ---- */ + +.navbar { + background-color: var(--pal-purple-30); + padding: 0 1.5rem; +} + +.navbar__brand { + min-width: 300px; +} + +.navbar__logo { + display: flex; + align-items: center; +} + +.navbar__logo img { + height: 25px; + width: auto; +} + +.navbar__link { + color: rgba(255, 255, 255, 0.9); + font-size: var(--button-sm-font-size); + font-weight: var(--button-sm-font-weight); +} + +.navbar__link:hover, +.navbar__link--active { + color: #ffffff; +} + +/* "Go to Support" — outlined white button */ +.navbar-support-link { + border: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0.25rem; + padding: 0.375rem 0.75rem !important; + background: rgba(255, 255, 255, 0.1); + color: #ffffff !important; + text-decoration: none; + font-size: var(--button-sm-font-size); + font-weight: var(--button-sm-font-weight); + line-height: var(--button-sm-line-height); +} + +.navbar-support-link:hover { + background: rgba(0, 0, 0, 0.1) !important; + color: #ffffff !important; +} + +/* "Start for free" — white filled button */ +.navbar-cta-link { + border-radius: 0.25rem; + padding: 0.375rem 0.75rem !important; + background: #ffffff !important; + color: var(--pal-purple-30) !important; + text-decoration: none; + font-size: var(--button-sm-font-size); + font-weight: var(--button-sm-font-weight); + line-height: var(--button-sm-line-height); +} + +.navbar-cta-link:hover { + background: var(--pal-purple-95) !important; + color: var(--pal-purple-30) !important; +} + +/* Left items keep their natural width (logo only); right items fill the remaining space */ +.navbar__items:not(.navbar__items--right) { + flex: none; +} + +/* Right items expand to fill the space between logo and right edge; search goes first */ +.navbar__items--right { + flex: 1; + gap: 0.5rem; + padding-left: 0; +} + +/* Hide the plugin's navbar search bar on the homepage */ +html.plugin-pages .navbar :has(> .navbar__search) { + display: none; +} + +/* Plugin's SearchBar wrapper: move before the support/CTA buttons, fill available space */ +.navbar :has(> .navbar__search) { + order: -1; + flex: 1; + /* !important overrides the plugin's .navbar__items--right > :last-child { padding-right: 0 } */ + padding: 0 0.75rem 0 0 !important; + display: flex; + align-items: center; + border-right: 1px solid rgba(255, 255, 255, 0.3); + margin-right: 0.25rem; +} + +/* Style the plugin's search container to look like the old fake search bar */ +.navbar .navbar__search { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.375rem 0.75rem; + background-color: rgba(255, 255, 255, 0.10); + height: 2rem; + border-radius: 0.25rem; + cursor: text; + width: 100%; + position: relative; +} + +.navbar .navbar__search::before { + content: ''; + display: block; + width: 1.5rem; + height: 1.5rem; + flex-shrink: 0; + background-color: rgba(255, 255, 255, 0.9); + mask-image: url('/img/brand/icon-magnifier-24px.svg'); + mask-size: cover; + mask-repeat: no-repeat; +} + +.navbar .navbar__search-input { + border: 0 !important; + outline: 0 !important; + box-shadow: none !important; + background: transparent !important; + border-radius: 0 !important; + color: rgba(255, 255, 255, 0.9) !important; + font-size: var(--body-md-regular-font-size) !important; + line-height: var(--body-md-regular-line-height) !important; + width: 100% !important; + cursor: text !important; + font-family: var(--ifm-font-family-base) !important; + padding: 0 !important; + height: auto !important; +} + +.navbar .navbar__search-input::placeholder { + color: rgba(255, 255, 255, 0.7) !important; +} + +/* Hide loading ring and keyboard shortcut hint in the navbar */ +.navbar [class*="searchBarLoadingRing"], +.navbar [class*="searchHintContainer"] { + display: none !important; +} + +/* Match the clear button colour to the magnifying glass icon */ +.navbar [class*="searchClearButton"] { + color: rgba(255, 255, 255, 0.9) !important; +} + +/* Expand the input span to fill the pill so the entire bar is clickable */ +.navbar span[class*="searchBar"] { + flex: 1; +} + +/* The plugin's inner searchBar span is position:relative, making it the containing block for the + dropdown. That causes the dropdown to align to the input area (140px wide) instead of the full + pill. Setting it to static forces the dropdown to use .navbar__search (position:relative below) + as its containing block instead. */ +.navbar span[class*="searchBar"] { + position: static !important; +} + +/* Align the dropdown to the left edge of the search pill. + Needs 3-class specificity (0,3,0) to beat the plugin's .searchBar_RVTs .dropdownMenu_qbY6 + rule (0,2,0) which also uses !important and loads after this stylesheet. */ +.navbar .navbar__search [class*="dropdownMenu"] { + left: 0 !important; + right: auto !important; +} + +/* Plugin's SearchBar embedded in the hero .searchBox */ +[class*="searchBox"] [class*="searchBar"] { + width: 100%; + display: block !important; + position: static !important; +} + +[class*="searchBox"] .navbar__search-input { + background: transparent !important; + border: none !important; + outline: none !important; + box-shadow: none !important; + padding: 0 !important; + height: auto !important; + color: var(--pal-neutral-40) !important; + font-size: var(--body-md-regular-font-size) !important; + line-height: var(--body-md-regular-line-height) !important; + font-family: var(--ifm-font-family-base) !important; + width: 100% !important; +} + +[class*="searchBox"] .navbar__search-input::placeholder { + color: var(--pal-neutral-60) !important; +} + +/* Loading ring, keyboard hint, and clear button inside hero */ +[class*="searchBox"] [class*="searchBarLoadingRing"], +[class*="searchBox"] [class*="searchHintContainer"], +[class*="searchBox"] [class*="searchHint"] { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; + width: 0 !important; + overflow: hidden !important; +} + +[class*="searchBox"] [class*="searchClearButton"] { + background: none !important; + color: var(--pal-neutral-60) !important; + padding: 0 !important; + min-width: 0 !important; +} + +/* Dropdown results panel inside hero */ +[class*="searchBox"] [class*="dropdownMenu"] { + top: calc(100% + 0.5rem) !important; + left: -0.75rem !important; + right: -0.75rem !important; + border-radius: 0.25rem !important; + box-shadow: 0 4px 12px rgba(0,0,0,0.15) !important; + background: #fff !important; + z-index: 200 !important; +} + +/* Hide dark mode toggle — live site doesn't have it */ +.navbar__toggle, +[class*='colorModeToggle'], +button[title*='dark'], +button[title*='light'] { + display: none !important; +} + +.theme-unlisted-banner { + display: none; +} + +.sidebar-hidden-item { + display: none !important; +} + +/* ---- Footer ---- */ + +.footer--dark { + background-color: var(--pal-neutral-10); +} + +/* ---- Doc content ---- */ + +article img { + max-width: 100%; + border: 1px solid var(--border-minimal); + border-radius: 0.5rem; +} + +/* ---- Sidebar ---- */ + +.theme-doc-sidebar-container { + border-right: 1px solid var(--border-regular) !important; +} + +.menu { + padding: 0.75rem 0; +} + +/* Sidebar section header: back link + bold title + divider */ +.sidebar-section-header { + padding: 0 !important; + margin-bottom: 0 !important; +} + +.sidebar-back-link { + display: block; + color: var(--sys-interactive-base); + font-size: var(--body-sm-regular-font-size); + line-height: var(--body-sm-regular-line-height); + text-decoration: none; + padding: 0.75rem 1.5rem 0.5rem; +} + +.sidebar-back-link:hover { + color: var(--sys-interactive-strong); + text-decoration: none; +} + +.sidebar-section-title { + display: block; + font-weight: 700; + font-size: 1rem; + line-height: 1.5rem; + color: var(--text-primary) !important; + text-decoration: none !important; + padding: 0.25rem 1.5rem 0.75rem; + border-bottom: 1px solid var(--border-regular); + margin-bottom: 0.75rem; +} + +.sidebar-section-title:hover { + color: var(--text-primary) !important; + text-decoration: underline !important; +} + +.menu__link { + color: var(--text-primary); + font-size: var(--body-md-regular-font-size); + line-height: var(--body-md-regular-line-height); + font-weight: var(--body-md-regular-font-weight); + border-radius: 0; + padding: 0.5rem 3.5rem 0.5rem 1.5rem; +} + +.menu__link:hover, +.menu__link--sublist:hover { + background-color: var(--background-secondary); + color: var(--text-primary); +} + +.menu__link--active:not(.menu__link--sublist) { + background-color: var(--background-selected); + color: var(--text-primary); + font-weight: 600; + box-shadow: inset -2px 0 0 var(--border-selected); + border-radius: 0; +} + +.menu__link--active:not(.menu__link--sublist):hover { + background-color: var(--background-selected-hover); +} + +/* Nested sidebar items */ +.menu__list .menu__list .menu__link { + padding-left: 2.75rem; +} + +.menu__list .menu__list .menu__list .menu__link { + padding-left: 4rem; +} + +/* Sidebar caret button */ +.menu__caret { + border-radius: 0; + padding: 0.5rem 1.25rem; +} + +.menu__caret:hover { + background-color: var(--background-secondary); +} + +.menu__caret::before { + background: none !important; + content: '' !important; + display: block; + width: 1rem; + height: 1rem; + mask-image: url('/img/brand/icon-chevron-down-16px.svg') !important; + mask-size: contain; + mask-repeat: no-repeat; + background-color: var(--sys-fg-secondary) !important; + transform: none !important; + transition: none !important; +} + +.menu__caret[aria-expanded='true']::before { + mask-image: url('/img/brand/icon-chevron-up-16px.svg') !important; +} + +/* Level-2+ collapsible categories use ::after on the link itself */ +/* Absolutely positioned so it lives in the right padding area and never overlaps wrapped text */ +.menu__link--sublist-caret { + position: relative; +} +.menu__link--sublist-caret::after { + background: none !important; + content: '' !important; + display: block !important; + position: absolute !important; + right: 20px !important; + top: 50% !important; + transform: translateY(-50%) !important; + width: 1rem !important; + height: 1rem !important; + min-width: 1rem !important; + mask-image: url('/img/brand/icon-chevron-down-16px.svg') !important; + mask-size: contain !important; + mask-repeat: no-repeat !important; + background-color: var(--sys-fg-secondary) !important; + transition: none !important; +} + +.menu__list-item:not(.menu__list-item--collapsed) > .menu__list-item-collapsible > .menu__link--sublist-caret::after { + mask-image: url('/img/brand/icon-chevron-up-16px.svg') !important; +} + +/* ---- Doc content ---- */ + +[class*='docItemContainer'] { + max-width: 720px; +} + +[class*='docItemContainer']:has(.product-homepage) { + max-width: none; +} + +/* Match live site heading scale (Docusaurus overrides h1 to 3rem in markdown) */ +.markdown h1:first-child { + font-size: 1.875rem; + line-height: 2.5rem; + --ifm-h1-font-size: 1.875rem; +} + +.markdown h1 { font-size: 1.875rem; line-height: 2.5rem; } +.markdown h2 { font-size: 1.5rem; line-height: 2.25rem; } +.markdown h3 { font-size: 1.1875rem; line-height: 1.75rem; } +.markdown h4 { font-size: 1rem; line-height: 1.5rem; } +.markdown h5 { font-size: 0.875rem; line-height: 1.25rem; } + +/* ---- Breadcrumbs ---- */ + +.breadcrumbs__item--active .breadcrumbs__link { + color: var(--text-body); + background: transparent; +} + +.breadcrumbs__link { + color: var(--text-link); + font-size: var(--body-md-regular-font-size); + line-height: var(--body-md-regular-line-height); + background: transparent; +} + +.breadcrumbs__link:hover { + color: var(--text-link-hover); + background: transparent; +} + +.breadcrumbs__item--active .breadcrumbs__link { + font-weight: 400; +} + +/* ---- Table of contents ---- */ + +[class*='tableOfContents'] { + position: relative; +} + +[class*='tableOfContents']::before { + content: 'On this page'; + display: block; + padding-bottom: 0.5rem; + font-size: var(--heading-h6-font-size); + line-height: var(--heading-h6-line-height); + font-weight: var(--heading-h6-font-weight); + letter-spacing: var(--heading-h6-letter-spacing); + text-transform: uppercase; + color: var(--text-primary); +} + +.table-of-contents { + border-left: 1px solid var(--border-regular); + font-size: var(--body-md-regular-font-size); +} + +.table-of-contents__link { + color: var(--text-body); + padding: 0.25rem 1rem; +} + +.table-of-contents__link:hover { + color: var(--text-link-hover); + text-decoration: underline; +} + +.table-of-contents__link--active { + color: var(--text-body); + font-weight: 600; + position: relative; +} + +.table-of-contents__link--active::before { + content: ''; + position: absolute; + left: -1px; + top: 0; + height: 100%; + width: 2px; + border-left: 2px solid var(--sys-interactive-base); +} + +/* ---- Admonitions ---- */ + +.alert { + --ifm-alert-border-left-width: 0; + border-radius: 0.5rem; + border-width: 1px; + border-style: solid; + background-color: #ffffff; + position: relative; + overflow: hidden; + padding: 0.75rem 1.5rem 0.75rem 3.25rem; +} + +/* Colored left gutter strip */ +.alert::before { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 2.5rem; + height: 100%; + background-color: var(--sys-bg-minimal); +} + +/* Icon via mask */ +.alert::after { + content: ''; + position: absolute; + left: 0.5rem; + top: 0.75rem; + width: 1.5rem; + height: 1.5rem; + mask-size: cover; + mask-repeat: no-repeat; + background-color: var(--sys-neutral-base); +} + +/* Hide built-in Docusaurus admonition icon — we render our own via ::after */ +.admonitionIcon { + display: none; +} + +.admonitionHeading { + font-size: var(--body-lg-semibold-font-size); + line-height: var(--body-lg-semibold-line-height); + font-weight: var(--body-lg-semibold-font-weight); + color: var(--text-primary); + margin-bottom: 0; +} + +.admonitionContent p { + margin: 0.5rem 0 0; + font-size: var(--body-md-regular-font-size); + line-height: var(--body-md-regular-line-height); + color: var(--text-body); +} + +/* note / info */ +.alert--secondary, +.alert--info { + border-color: var(--sys-info-muted); +} +.alert--secondary::before, +.alert--info::before { + background-color: var(--sys-info-minimal); +} +.alert--secondary::after, +.alert--info::after { + mask-image: url('/img/brand/icon-info-circle-24px.svg'); + background-color: var(--sys-info-strong); +} + +/* tip */ +.alert--success { + border-color: var(--sys-interactive-muted); +} +.alert--success::before { + background-color: var(--sys-interactive-minimal); +} +.alert--success::after { + mask-image: url('/img/brand/icon-lightbulb-24px.svg'); + background-color: var(--sys-interactive-strong); +} + +/* caution */ +.alert--warning { + border-color: var(--sys-warning-muted); +} +.alert--warning::before { + background-color: var(--sys-warning-minimal); +} +.alert--warning::after { + mask-image: url('/img/brand/icon-warning-24px.svg'); + background-color: var(--sys-warning-strong); +} + +/* danger */ +.alert--danger { + border-color: var(--sys-critical-muted); +} +.alert--danger::before { + background-color: var(--sys-critical-minimal); +} +.alert--danger::after { + mask-image: url('/img/brand/icon-error-circle-filled-24px.svg'); + background-color: var(--sys-critical-strong); +} + +/* ── Procedure (numbered steps) ───────────────────────────────────────────── */ +.theme-doc-markdown ol, +ol.procedure { + list-style: none; + counter-reset: step-counter; + padding-left: 12px; /* space for left half of badge */ + margin-left: 0; + position: relative; +} + +/* Single continuous vertical line running through all badges */ +.theme-doc-markdown ol::before, +ol.procedure::before { + content: ''; + position: absolute; + left: 12px; + top: 0; + bottom: 0; + width: 1px; + background: var(--pal-purple-90); +} + +.theme-doc-markdown ol > li, +ol.procedure > li { + counter-increment: step-counter; + position: relative; + margin-top: 0; + padding-left: 20px; /* 12px (badge right half) + 8px gap */ + padding-bottom: 12px; +} + +.theme-doc-markdown ol > li > p, +ol.procedure > li > p { + margin-top: 0; + margin-bottom: 0; +} + +.theme-doc-markdown ol > li > p + p, +.theme-doc-markdown ol > li > p + img, +.theme-doc-markdown ol > li > img + p, +ol.procedure > li > p + p, +ol.procedure > li > p + img, +ol.procedure > li > img + p { + margin-top: 6px; +} + + +.theme-doc-markdown ol > li::before, +ol.procedure > li::before { + content: counter(step-counter); + position: absolute; + left: 0; + top: 0; + transform: translateX(-50%); + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 50%; + background: var(--sys-interactive-minimal); + color: var(--pal-purple-40); + font-size: 12px; + font-weight: 700; + line-height: 1; + border: 1px solid var(--pal-purple-90); + z-index: 1; +} + +/* ── Inline images (icons embedded in sentences) ─────────────────────────── */ +.theme-doc-markdown p > img:not(:only-child), +.theme-doc-markdown li > img, +span.inlinemediaobject img { + height: 1.5em; + width: auto; + vertical-align: middle; +} + +/* ── Glossary term links ──────────────────────────────────────────────────── */ +a.glossterm, +.theme-doc-markdown a[href*="/glossary"] { + color: #11bba9; +} + +a.glossterm:hover, +.theme-doc-markdown a[href*="/glossary"]:hover { + color: #0d9e8f; +} diff --git a/src/pages/index.module.css b/src/pages/index.module.css new file mode 100644 index 0000000..06064c0 --- /dev/null +++ b/src/pages/index.module.css @@ -0,0 +1,310 @@ +/* ---- Hero (full-width purple gradient) ---- */ + +.hero { + background-image: linear-gradient( + to right, + var(--pal-purple-40) 0%, + var(--pal-purple-30) 50%, + var(--pal-purple-20) 100% + ); + color: #ffffff; + width: 100%; + overflow: hidden; +} + +.heroInner { + max-width: 1200px; + margin: 0 auto; + padding: 2rem 1.25rem 3rem; + display: flex; + align-items: flex-start; + gap: 2rem; +} + +.heroLeft { + flex: 1; + max-width: 600px; +} + +.heroLeft h1 { + font-size: 2.25rem; + line-height: 3rem; + font-weight: 700; + color: #ffffff; + margin: 0; +} + +.heroLeft p { + font-size: var(--body-lg-regular-font-size); + line-height: var(--body-lg-regular-line-height); + font-weight: var(--body-lg-regular-font-weight); + color: rgba(255, 255, 255, 0.85); + margin: 0.25rem 0 1.5rem; +} + +.heroRight { + flex: 0 0 auto; + max-width: 420px; + width: 100%; + position: relative; + align-self: flex-end; +} + +.heroRight img { + width: 100%; + height: auto; + display: block; +} + +/* Search box inside hero */ +.searchBox { + display: flex; + align-items: center; + gap: 0.5rem; + background: #ffffff; + height: 2.5rem; + padding: 0 0.75rem; + border-radius: 0.25rem; + box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.10) inset; + max-width: 480px; + cursor: text; +} + +.searchBox::before { + content: ''; + display: block; + width: 1.5rem; + height: 1.5rem; + flex-shrink: 0; + background-color: var(--pal-neutral-60); + mask-image: url('/img/brand/icon-magnifier-24px.svg'); + mask-size: cover; + mask-repeat: no-repeat; +} + +.searchBox input { + border: 0; + outline: 0; + background: transparent; + width: 100%; + font-size: var(--body-md-regular-font-size); + line-height: var(--body-md-regular-line-height); + color: var(--pal-neutral-40); +} + +.searchBox input::placeholder { + color: var(--pal-neutral-60); +} + +/* ---- Subtitle section (white bg) ---- */ + +.subtitleSection { + background: #ffffff; + width: 100%; +} + +.subtitleInner { + max-width: 1200px; + margin: 0 auto; + padding: 2rem 1.25rem 2.5rem; +} + +.subtitleInner h2 { + font-size: var(--heading-h2-font-size); + line-height: var(--heading-h2-line-height); + font-weight: var(--heading-h2-font-weight); + color: var(--sys-primary-emphasized); + margin: 0; + max-width: 700px; +} + +.subtitleInner p { + font-size: var(--body-lg-regular-font-size); + line-height: var(--body-lg-regular-line-height); + color: var(--text-secondary); + margin: 1rem 0 0; + max-width: 700px; +} + +/* ---- Cards section (light grey bg) ---- */ + +.cardsSection { + background: var(--sys-bg-minimal); + width: 100%; + flex: 1; +} + +.cardsInner { + max-width: 1200px; + margin: 0 auto; + padding: 2rem 1.25rem 3rem; + display: grid; + gap: 1.5rem; + grid-template-columns: 1fr; +} + +/* ---- Portal card ---- */ + +.card { + width: 100%; + border-radius: 8px; + background: #ffffff; + box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.06); + border: 1px solid var(--border-minimal); + padding: 1.25rem 3rem 1.25rem 1rem; + display: flex; + flex-direction: column; + gap: 1rem; +} + +/* Card header with icon */ +.cardHeader { + position: relative; + padding-left: 3.25rem; +} + +/* Icon background square */ +.cardHeader::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 2.5rem; + height: 2.5rem; + background-color: var(--sys-bg-minimal); + border-radius: 0.5rem; +} + +/* Icon mask */ +.cardHeader::after { + content: ''; + position: absolute; + top: 0.5rem; + left: 0.5rem; + width: 1.5rem; + height: 1.5rem; + background-color: var(--sys-neutral-base); + mask-size: cover; + mask-repeat: no-repeat; +} + +/* Per-section icon colors */ +[data-section='bitrise-platform'] .cardHeader::before { background-color: var(--brand-purple-lightest); } +[data-section='bitrise-platform'] .cardHeader::after { background-color: var(--sys-interactive-base); mask-image: url('/img/brand/icon-dashboard-24px.svg'); } + +[data-section='bitrise-ci'] .cardHeader::before { background-color: var(--brand-orage-light); } +[data-section='bitrise-ci'] .cardHeader::after { background-color: var(--sys-orange-base); mask-image: url('/img/brand/icon-ci-24px.svg'); } + +[data-section='bitrise-build-cache'] .cardHeader::before { background-color: var(--brand-yellow-lightest); } +[data-section='bitrise-build-cache'] .cardHeader::after { background-color: var(--sys-warning-base); mask-image: url('/img/brand/icon-build-cache-24px.svg'); } + +[data-section='bitrise-release-management'] .cardHeader::before { background-color: var(--brand-blue-lightest); } +[data-section='bitrise-release-management'] .cardHeader::after { background-color: var(--sys-info-base); mask-image: url('/img/brand/icon-release-24px.svg'); } + +[data-section='bitrise-insights'] .cardHeader::before { background-color: var(--brand-green-lightest); } +[data-section='bitrise-insights'] .cardHeader::after { background-color: var(--sys-success-base); mask-image: url('/img/brand/icon-insights-24px.svg'); } + +[data-section='bitrise-build-hub'] .cardHeader::before { background-color: var(--sys-neutral-subtle); } +[data-section='bitrise-build-hub'] .cardHeader::after { background-color: var(--sys-neutral-base); mask-image: url('/img/brand/icon-cpu-24px.svg'); } + +.cardHeader h3 { + margin: 0 0 0.25rem; + font-size: var(--heading-h3-font-size); + line-height: var(--heading-h3-line-height); + font-weight: var(--heading-h3-font-weight); +} + +.cardHeader h3 a { + color: var(--text-primary); + text-decoration: none; +} + +.cardHeader h3 a:hover { + color: var(--sys-interactive-base); + text-decoration: underline; +} + +.cardHeader p { + color: var(--text-secondary); + font-size: var(--body-md-regular-font-size); + line-height: var(--body-md-regular-line-height); + margin: 0; +} + +/* Card links list */ +.cardLinks { + list-style: none; + padding: 0; + margin: 0 0 0 3.25rem; + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.cardLinks li { + width: 100%; + font-size: var(--body-md-regular-font-size); + line-height: var(--body-md-regular-line-height); +} + +.cardLinks a { + color: var(--sys-interactive-base); + text-decoration: none; +} + +.cardLinks a:hover { + text-decoration: underline; +} + +.cardDivider { + border: 0; + border-top: 1px solid var(--border-minimal); + margin: 0 0 0 3.25rem; +} + +.viewAll { + color: var(--sys-interactive-base); + font-weight: 600; + font-size: var(--body-md-regular-font-size); + text-decoration: none; + margin-left: 3.25rem; +} + +.viewAll:hover { + text-decoration: underline; +} + +/* ---- Responsive ---- */ + +@media (min-width: 768px) { + .heroRight { + display: block; + } + + .cardsInner { + grid-template-columns: 1fr 1fr; + } + + /* First two cards get 2-column links */ + .card:nth-child(1) .cardLinks li, + .card:nth-child(2) .cardLinks li { + width: calc((100% - 0.5rem) / 2); + } +} + +@media (min-width: 900px) { + .heroRight { + display: block; + } +} + +@media (max-width: 767px) { + .heroRight { + display: none; + } + + .heroLeft h1 { + font-size: 1.75rem; + line-height: 2.25rem; + } +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000..878eaf1 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,144 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import SearchBar from '@theme/SearchBar'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import styles from './index.module.css'; + +const sections = [ + { + id: 'bitrise-platform', + title: 'Bitrise as a Platform', + description: 'Learn the fundamentals of your Mobile DevOps platform.', + href: '/en/bitrise-platform', + links: [ + {label: 'Getting started with Bitrise', href: '/en/bitrise-platform/getting-started/getting-started-with-the-bitrise-platform'}, + {label: 'Integrations', href: '/en/bitrise-platform/integrations/about-integrations'}, + {label: 'Migrating from Jenkins', href: '/en/bitrise-platform/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise'}, + {label: 'Workspaces', href: '/en/bitrise-platform/workspaces/workspaces-overview'}, + {label: 'Migrating from App Center', href: '/en/bitrise-platform/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise'}, + {label: 'Bitrise AI FAQs', href: '/en/bitrise-platform/getting-started/ai-faq---how-bitrise-leverages-ai-technologies-in-its-features-and-services'}, + ], + }, + { + id: 'bitrise-ci', + title: 'Bitrise CI', + description: 'Automate builds and tests, and deploy your mobile apps.', + href: '/en/bitrise-ci', + links: [ + {label: 'Getting started with CI', href: '/en/bitrise-ci/getting-started/getting-started'}, + {label: 'Code signing', href: '/en/bitrise-ci/code-signing/ios-code-signing/ios-code-signing'}, + {label: 'Workflows and Pipelines', href: '/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview'}, + {label: 'Testing', href: '/en/bitrise-ci/testing/testing-android-apps'}, + {label: 'Builds', href: '/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually'}, + {label: 'Bitrise API', href: '/en/bitrise-ci/api/authenticating-with-the-bitrise-api'}, + ], + }, + { + id: 'bitrise-build-cache', + title: 'Build Cache', + description: 'Speed up your builds on any CI/CD platform or in a local environment.', + href: '/en/bitrise-build-cache', + links: [ + {label: 'Build Cache for Xcode', href: '/en/bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment'}, + {label: 'Build Cache for Gradle', href: '/en/bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment'}, + {label: 'Build Cache for Bazel', href: '/en/bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment'}, + ], + }, + { + id: 'bitrise-release-management', + title: 'Release Management', + description: 'Test and release your mobile apps in an automated and transparent way.', + href: '/en/release-management', + links: [ + {label: 'Build distribution for testing', href: '/en/release-management/build-distribution/managing-distributable-builds'}, + {label: 'Bitrise CodePush', href: '/en/release-management/codepush/about-codepush'}, + {label: 'Distribution API', href: '/en/release-management/release-management-api'}, + ], + }, + { + id: 'bitrise-insights', + title: 'Insights', + description: 'Explore analytics, monitor trends, and set up alerts to improve efficiency.', + href: '/en/insights', + links: [ + {label: 'Metrics', href: '/en/insights/available-metrics-in-insights/bitrise-ci-metrics'}, + {label: 'Alerts', href: '/en/insights/configuring-alerts-in-insights'}, + {label: 'Insights tutorials', href: '/en/insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds'}, + ], + }, + { + id: 'bitrise-build-hub', + title: 'Bitrise Build Hub', + description: 'Use high-performance build infrastructure for GitHub Actions, purpose-built for mobile app development.', + href: '/en/bitrise-build-hub', + links: [ + {label: 'Build Hub overview', href: '/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview'}, + {label: 'Configuring Build Hub for GitHub Actions', href: '/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions'}, + {label: 'Machine types', href: '/en/bitrise-build-hub/infrastructure/build-machine-types'}, + ], + }, +]; + +function PortalCard({section}: {section: typeof sections[0]}) { + return ( +
+
+

{section.title}

+

{section.description}

+
+
    + {section.links.map((link) => ( +
  • + {link.label} +
  • + ))} +
+
+ View all +
+ ); +} + +export default function Home(): React.JSX.Element { + const {siteConfig} = useDocusaurusContext(); + + return ( + + {/* Full-width purple gradient hero */} +
+
+
+

Welcome to Bitrise Documentation

+

Find product documentation, code samples, API & CLI references, and more.

+
+ +
+
+
+ +
+
+
+ + {/* Subtitle section */} +
+
+

Learn how to use Bitrise, the Mobile DevOps Platform tailored for mobile engineering teams

+

Bitrise's Mobile DevOps Platform equips you for success every step of the way, from planning to monitoring.

+
+
+ + {/* Cards section */} +
+
+ {sections.map((section) => ( + + ))} +
+
+
+ ); +} diff --git a/src/partials/abandoned-steps.mdx b/src/partials/abandoned-steps.mdx new file mode 100644 index 0000000..18069ba --- /dev/null +++ b/src/partials/abandoned-steps.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Abandoned Steps + +If you are a Step maintainer, you should be reachable within a reasonable timeframe if anyone submits an issue or a pull request to your Step. If we try to contact you several times regarding an important fix/update in your Step and you refuse to answer for several weeks we might deprecate, remove or replace your Step in the collection! Abandoned Steps can be a threat for those who use it, please keep this in mind if you decide to share your Step with others! + +The repository and issue tracker must not be removed, as there are permanent links to it included in the step.yml that is in the Bitrise StepLib. If they are removed, already shared Step versions will continue to function as they are also shared on a Bitrise managed file hosting service during the share process. A new version of the step may be released, managed by Bitrise. + +If you shared a Step but you’re no longer able or willing to maintain it, please create a GitHub issue in this repository: [Bitrise StepLib](https://github.com/bitrise-io/bitrise-steplib) diff --git a/src/partials/aborting-a-build.mdx b/src/partials/aborting-a-build.mdx new file mode 100644 index 0000000..c2d47d2 --- /dev/null +++ b/src/partials/aborting-a-build.mdx @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Aborting a build + +You can abort running builds, and set the reason for aborting, as well as specify if email notifications should be sent about the build. + +:::note[Required role] + +You must have an admin or owner role on the app's team to manage incoming or outgoing webhooks using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +To simply abort the build, call the `/apps/APP-SLUG/builds/BUILD-SLUG/abort` endpoint. It requires three parameters: + +- The app slug. +- The build slug. +- The build abort parameters body. This can be left empty if you don't want to set any specific parameters for the abort: `-d "{}"`. + +``` +curl -X POST -H "Authorization: ACCESS-TOKEN" "https://api.bitrise.io/v0.1/apps/APP-SLUG/builds/BUILD-SLUG/abort" -d "{}" +``` + +You can set a reason for aborting the build by using the `abort_reason` parameter. This parameter takes a string and it will show up on your app’s build page. + +``` +curl -X POST -H "Authorization: ACCESS-TOKEN" "https://api.bitrise.io/v0.1/apps/APP-SLUG/builds/BUILD-SLUG/abort" -d '{"abort_reason": "aborted for a reason"}' +``` + +Normally, aborted builds count as failed builds. Use the `abort_with_success` parameter to abort a build but still count it as a successful one. The status report sent to your git provider will show the build as successful though on [bitrise.io](https://www.bitrise.io) it will be displayed as `Cancelled`. + +``` +curl -X POST -H "Authorization: ACCESS-TOKEN" "https://api.bitrise.io/v0.1/apps/APP-SLUG/builds/BUILD-SLUG/abort" -d '{"abort_with_success": true}' +``` + +Depending on your app settings, Bitrise might send email notifications to team members when a build is aborted. If you do not want notifications, set the `skip_notifications` parameter to `true`. + +``` +curl -X POST -H "Authorization: ACCESS-TOKEN" "https://api.bitrise.io/v0.1/apps/APP-SLUG/builds/BUILD-SLUG/abort" -d '{"skip_notifications": true}' +``` diff --git a/src/partials/aborting-workflows-of-a-failed-stage.mdx b/src/partials/aborting-workflows-of-a-failed-stage.mdx new file mode 100644 index 0000000..d8fae5a --- /dev/null +++ b/src/partials/aborting-workflows-of-a-failed-stage.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Aborting the Workflows of a failed Stage + +By default, if a Workflow in a particular Stage fails, the other Workflows in the same Stage aren’t automatically aborted: these Workflows will run but the next Stage won’t start. However, you can change this behavior to immediately and automatically abort all other Workflows in the same Stage. + +To do so, you need to set the abort_on_fail attribute to `true`: + +``` +stages: +  stage-abort-on-fail-1: +    abort_on_fail: true +    workflows: +    - deploy-1: {} +    - deploy-2: {} +``` diff --git a/src/partials/about-the-github-enterprise-server-integration.mdx b/src/partials/about-the-github-enterprise-server-integration.mdx new file mode 100644 index 0000000..2b6d26c --- /dev/null +++ b/src/partials/about-the-github-enterprise-server-integration.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## About the GitHub Enterprise Server integration + +:::important[Enterprise Server users only] + +This guide is for GitHub Enterprise Server users. For GitHub Cloud users who wish to use the Bitrise GitHub App to connect to Bitrise, we have a separate guide: [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). + +::: + +The feature requires: + +- A Bitrise [Workspace owner](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration) to configure the integration. +- [A GHES organization owner](https://docs.github.com/en/enterprise-server@3.11/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization) with sufficient permissions to create a GitHub app on GHES and then install it for selected repositories. +- Access to the GHES instance. If the Bitrise website cannot access your repository on GHES, it can't use the `bitrise.yml` file stored there. If you have IP address access control lists for security purposes, you need [to allowlist the Bitrise website](/en/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines/ip-addresses-for-the-bitrise-website). + + :::important[Allowlisting the Bitrise background workers] + + Be aware that the Bitrise background workers that power, among other things, app.bitrise.io and the Bitrise build machines have a different IP address range. Allowlisting the build machines is not sufficient for this feature. + + If allowlisting is not an option for you, [reach out to Bitrise](https://www.bitrise.io/contact) so we can discuss other options. + + ::: + +To set up the integration, you need to: + +1. [Create a GitHub app](#UUID-1c544331-2619-8e85-9164-c6355de1deb0). + + Creating the app also allows GitHub Enterprise Server users to take advantage of the [Bitrise Checks feature](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github): once the app is created, you just need to [enable Checks on Bitrise](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github/enabling-github-checks). +1. [Connect your Bitrise Workspace to GHES via the GitHub app](#UUID-fad63ba9-a37b-d5d2-bd37-debcf94a7976). diff --git a/src/partials/about-verified-steps.mdx b/src/partials/about-verified-steps.mdx new file mode 100644 index 0000000..b1afa1c --- /dev/null +++ b/src/partials/about-verified-steps.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## About Verified Steps + +A Step contains the code that performs a specific build task. Bitrise has over 300 Steps in its [Step Library (StepLib)](https://github.com/bitrise-io/bitrise-steplib) which third party companies or open source teams can enrich with Steps based on their services/tools. This means they have full power to roll out updates to the Step while Bitrise maintains an overlaying control to ensure service quality and security. + +A Verified Step means that the owner of a service or tool or an open source team guarantees secure, maintained, consistent, and high-quality performance for any Bitrise user. Our official Bitrise Steps are maintained by us, whereas our Community Steps are maintained by the community. It’s easy to decide which type a Step falls into on our GUI. + +- Verified Steps are labeled with a blue badge in [Bitrise](http://bitrise.io/). +- Official Bitrise Steps are labeled with a green badge. +- Community created Steps do not have any badge. + +![Verified_Steps.jpg](/img/_paligo/uuid-088fa6df-9163-1518-308d-87ad0916c60f.jpg) + +We strongly recommend that you consult with our [Step development]() guidelines before creating a Step. diff --git a/src/partials/accessing-a-repository-via-vpn.mdx b/src/partials/accessing-a-repository-via-vpn.mdx new file mode 100644 index 0000000..fb1cd53 --- /dev/null +++ b/src/partials/accessing-a-repository-via-vpn.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Accessing a repository via VPN + +If the repository of your Bitrise project can be only accessed via VPN, you have two things to keep in mind above all: + +- During builds, the VPN connection must be established before cloning the repository to our virtual machines: in practice, this means the Step establishing the connection must be placed before the **Git Clone**Step in your Workflow. +- When adding a new project, you need a workaround: use a dummy repository that can be accessed without a VPN during the process of adding the project. + +Let’s go through this workaround! + +1. Create an empty repository that is accessible without a VPN connection. +1. Add a new project, using this repository as the source. Make sure it is a private project! There is no need to register a [webhook](/en/bitrise-platform/integrations/webhooks.html). +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Git** and click **Change**. +1. In the dialog, paste the new repository URL. + + ![SCR-20260331-przw.png](/img/_paligo/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png) +1. Click **Save**. +1. Place the Step or Steps establishing the VPN connection before any Steps that have to access your repository in your Workflow. + +And you’re done. For the different methods of establishing a VPN connection, take a look at our example configurations. diff --git a/src/partials/accessing-builds-tab-and-selecting-a-build.mdx b/src/partials/accessing-builds-tab-and-selecting-a-build.mdx new file mode 100644 index 0000000..6b41268 --- /dev/null +++ b/src/partials/accessing-builds-tab-and-selecting-a-build.mdx @@ -0,0 +1,6 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Open the [Bitrise CI](http://app.bitrise.io/dashboard) page and select your project from the project list. +1. Select the build you want to check out. diff --git a/src/partials/adding-a-custom-trust-policy.mdx b/src/partials/adding-a-custom-trust-policy.mdx new file mode 100644 index 0000000..5ce461c --- /dev/null +++ b/src/partials/adding-a-custom-trust-policy.mdx @@ -0,0 +1,80 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a custom trust policy + +Add a custom trust policy in AWS IAM to write the rules for the Bitrise identity tokens. + +:::tip[AWS docs] + +Our guide helps you set up your AWS policy for your Bitrise builds. You can read more about trust policies in the AWS documentation: [Create a role using custom trust policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html). + +::: + +1. Log in to your AWS account. +1. Go to **IAM**. +1. On the left, find **Access Management** and select **Roles**. +1. Click **Create role**. + + ![2025-11-11-aws-roles.png](/img/_paligo/uuid-8fc9a70b-c1a9-6ce2-4369-8701e891f0d5.png) +1. Select **Custom trust policy**. + + ![2025-11-11-custom-trust-policy.png](/img/_paligo/uuid-2aed5814-692a-476b-f993-617cdb2c338f.png) +1. Create a statement in the custom trust policy editor to set the rules for OIDC tokens: + + :::tip[Creating policies] + + You can read detailed information about how to create policies in the AWS documentation: [Creating IAM policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-start). + + ::: + + - Add a `Principal`: the type should be a federated user session, with your previously created ARN. See `Federated` in the example below. + - Add an `Action` with the `sts:AssumeRoleWithWebIdentity` value. + - Under `Conditions`, match against the claims in the identity token. + + :::important[Limitation] + + As Bitrise is considered a generic identity provider, AWS keeps only two claims from our token: `aud` and `sub`. You can only use these in your policies. + + You can find more information about claim fields in the [AWS documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). + + ::: + + The example below checks the audience, the Bitrise project slug, and the Workflow name: + + ``` + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::ACCOUNT_NUMBER:oidc-provider/token.builds.bitrise.io" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "token.builds.bitrise.io:aud": "sts.amazonaws.com", + "token.builds.bitrise.io:sub": "app:APP_SLUG:workflow:run-tests" + } + } + } + ] + } + ``` + + You can also use wildcards with the `StringLike` operation instead of `StringEquals`: [Wildcard matching](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String-wildcard). +1. When done, click **Next**. +1. Select the required permission for the role. + + The required permission depends on what service you're trying to access on AWS. For example, to upload files to an S3 bucket during a build, you can select **AmazonS3FullAccess**. + + :::note[Custom access policy] + + You can also create your own custom policy in AWS to set up the exact permissions you need. + + ::: +1. When done, click **Next**. +1. Name your role and optionally, add a description. +1. Click **Create a role** when done. diff --git a/src/partials/adding-a-flutter-app-to-bitrise.mdx b/src/partials/adding-a-flutter-app-to-bitrise.mdx new file mode 100644 index 0000000..94885b7 --- /dev/null +++ b/src/partials/adding-a-flutter-app-to-bitrise.mdx @@ -0,0 +1,84 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a Flutter project to Bitrise + +1. Log in to Bitrise and go to the **Dashboard**. +1. Click the **New project** button. +1. Select **Configure Bitrise CI**. +1. Under **Project access**, select the workspace that will own the project. + + ![20251219-adding-project-workspace-select.png](/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png) +1. Set who has access to the project's CI builds: + + :::caution[Privacy is final] + + You cannot change this setting later! If you realize you've accidentally added your project as a public project even though you need it to be private, you'll have to delete the project and add it again. + + ::: + + Private projects are only accessible to you, your workspace members and those who are invited to work on a project. They require authentication to access the repository of the project. + + [Public projects](/en/bitrise-platform/projects/public-projects.html) expose their configuration YAML and their build logs to everyone. If you have a public project’s build URL, you can view its build log, to help with troubleshooting, for example. Public projects do not require authentication and they cannot have SSH keys. +1. Open the **Provider** dropdown menu and select the [repository access](/en/bitrise-platform/repository-access/about-repository-access.html) type. + + You can select from: + + - Connected Git provider accounts: Either via [OAuth connection](/en/bitrise-platform/repository-access/repository-access-with-oauth) or the [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). + - Not connected Git provider accounts: you will be prompted to connect one. + - **Other**: A Git provider other than GitHub/GitLab/Bitbucket. + + ![20251219-repo-access.png](/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png) +1. Select a repository. + + - If you selected a connected Git account, you can click **Select a repository** to select from the available repositories on that account. + - In any case, you can type the URL manually in the **Git repository (clone) URL**. We strongly recommend using an SSH URL, unless you are setting up a [public project](/en/bitrise-platform/projects/public-projects.html). + + :::note[Repository URL] + + You will be able to [change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch) later. You can also connect or disconnect your account to Git provider services at any time. + + ::: +1. If you use an OAuth connection, you need to [add an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) in the **Authorize Bitrise** section. + + You don't need SSH keys if: + + - Your project is a public project. + - You connect to your Git repository via a [GitHub app installation](/en/bitrise-platform/repository-access/github-app-integration). + + ![20251219-authorize-bitrise.png](/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png) + + **Auto-add a generated SSH key to your repository**: We recommend using this option. We automatically generate an SSH key pair and register the public key to your repository. Requires your connected Git provider account to have admin rights to the repository. + + **Copy a generated SSH key to your Git provider manually**: We generate an SSH key pair for you and you can copy the public key and register it manually to your Git provider. It is useful if, for example, you need to access multiple repositories with the same SSH key. + + **Add your own SSH key to Bitrise**: You can generate your own SSH key and paste the private key here after choosing this option. You also need to add the public key to the repository manually. To generate your SSH key pair: [Generating your own SSH keypair](/en/bitrise-platform/repository-access/configuring-ssh-keys/generating-your-own-ssh-keypair). + + :::note[Configure SSH keys at any time] + + If you can't set up a valid, working SSH key connection at this time, don't worry: proceed with adding your project. You can set up the SSH connection afterwards: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). + + ::: +1. Select the default branch of your repository. This branch should contain the configuration of your project. + + - If you successfully configured SSH access in the previous step or if you're adding a public project, Bitrise will parse your repository and allow you to select a branch from a dropdown menu. + - If you didn't configure repository access, you need to type the branch name manually. + + [You can change the default branch of the project later](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). + + ![20251219-choose-branch.png](/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png) +1. Select **Yes, auto-detect configuration**. Bitrise will scan your repository and attempt to set up a stack and default Workflows based on the results of the scan. In most cases, we recommend choosing this option. + + :::note[Project type] + + Detecting a project type serves to assist in the initial configuration of your project. But don't worry, you can change every setting, including the project type, at any time after you added the project. + + ::: +1. Wait while Bitrise is validating your project. + + We look for your configuration files and set up your app based on them. In the case of Flutter apps, you definitely need a `pubspec.yaml` file in your project. +1. Type the name of the branch that includes your project’s configuration - master, for example - then click **Next**. +1. If you have an iOS project in your Flutter project, you will have to select an .ipa export method. +1. Register a webhook when prompted so that Bitrise can start a build automatically when code is pushed to your repository, or a pull request is created. +1. Once you are done, click **View Project Page** to go to the newly added project's home page. From there, you can start [editing your Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [run builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). diff --git a/src/partials/adding-a-macos-app-to-bitrise.mdx b/src/partials/adding-a-macos-app-to-bitrise.mdx new file mode 100644 index 0000000..ad4ff86 --- /dev/null +++ b/src/partials/adding-a-macos-app-to-bitrise.mdx @@ -0,0 +1,96 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a macOS project to Bitrise + +1. Log in to Bitrise and go to the **Dashboard**. +1. Click the **New project** button. +1. Select **Configure Bitrise CI**. +1. Under **Project access**, select the workspace that will own the project. + + ![20251219-adding-project-workspace-select.png](/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png) +1. Set who has access to the project's CI builds: + + :::caution[Privacy is final] + + You cannot change this setting later! If you realize you've accidentally added your project as a public project even though you need it to be private, you'll have to delete the project and add it again. + + ::: + + Private projects are only accessible to you, your workspace members and those who are invited to work on a project. They require authentication to access the repository of the project. + + [Public projects](/en/bitrise-platform/projects/public-projects.html) expose their configuration YAML and their build logs to everyone. If you have a public project’s build URL, you can view its build log, to help with troubleshooting, for example. Public projects do not require authentication and they cannot have SSH keys. +1. Open the **Provider** dropdown menu and select the [repository access](/en/bitrise-platform/repository-access/about-repository-access.html) type. + + You can select from: + + - Connected Git provider accounts: Either via [OAuth connection](/en/bitrise-platform/repository-access/repository-access-with-oauth) or the [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). + - Not connected Git provider accounts: you will be prompted to connect one. + - **Other**: A Git provider other than GitHub/GitLab/Bitbucket. + + ![20251219-repo-access.png](/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png) +1. Select a repository. + + - If you selected a connected Git account, you can click **Select a repository** to select from the available repositories on that account. + - In any case, you can type the URL manually in the **Git repository (clone) URL**. We strongly recommend using an SSH URL, unless you are setting up a [public project](/en/bitrise-platform/projects/public-projects.html). + + :::note[Repository URL] + + You will be able to [change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch) later. You can also connect or disconnect your account to Git provider services at any time. + + ::: +1. If you use an OAuth connection, you need to [add an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) in the **Authorize Bitrise** section. + + You don't need SSH keys if: + + - Your project is a public project. + - You connect to your Git repository via a [GitHub app installation](/en/bitrise-platform/repository-access/github-app-integration). + + ![20251219-authorize-bitrise.png](/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png) + + **Auto-add a generated SSH key to your repository**: We recommend using this option. We automatically generate an SSH key pair and register the public key to your repository. Requires your connected Git provider account to have admin rights to the repository. + + **Copy a generated SSH key to your Git provider manually**: We generate an SSH key pair for you and you can copy the public key and register it manually to your Git provider. It is useful if, for example, you need to access multiple repositories with the same SSH key. + + **Add your own SSH key to Bitrise**: You can generate your own SSH key and paste the private key here after choosing this option. You also need to add the public key to the repository manually. To generate your SSH key pair: [Generating your own SSH keypair](/en/bitrise-platform/repository-access/configuring-ssh-keys/generating-your-own-ssh-keypair). + + :::note[Configure SSH keys at any time] + + If you can't set up a valid, working SSH key connection at this time, don't worry: proceed with adding your project. You can set up the SSH connection afterwards: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). + + ::: +1. Select the default branch of your repository. This branch should contain the configuration of your project. + + - If you successfully configured SSH access in the previous step or if you're adding a public project, Bitrise will parse your repository and allow you to select a branch from a dropdown menu. + - If you didn't configure repository access, you need to type the branch name manually. + + [You can change the default branch of the project later](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). + + ![20251219-choose-branch.png](/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png) +1. Select **Yes, auto-detect configuration**. Bitrise will scan your repository and attempt to set up a stack and default Workflows based on the results of the scan. In most cases, we recommend choosing this option. + + :::note[Project type] + + Detecting a project type serves to assist in the initial configuration of your project. But don't worry, you can change every setting, including the project type, at any time after you added the project. + + ::: +1. Wait while Bitrise is validating your project. We look for your configuration files and set up your app based on them. + + :::important[Shared schemes only] + + The validation will fail if you do not have a shared scheme in your project. You can still point Bitrise manually to your Xcode scheme but if it’s shared, we automatically detect it for you. + + ::: +1. Select the export method. You can modify this later - for now, select **development**. + + ![Getting_started_with_MacOS_apps.png](/img/_paligo/uuid-1ed505cf-f524-a74a-9a5e-d56161782c4c.png) + + Once you clicked it, you should see your: + + - Project or Workspace path. + - Scheme name. + - Export method. + - macOS stack. +1. Register a webhook when prompted so that Bitrise can start a build automatically when code is pushed to your repository, or a pull request is created. +1. Once you are done, click **View Project Page** to go to the newly added project's home page. From there, you can start [editing your Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [run builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). diff --git a/src/partials/adding-a-new-app-from-a-self-hosted-gitlab-repository.mdx b/src/partials/adding-a-new-app-from-a-self-hosted-gitlab-repository.mdx new file mode 100644 index 0000000..5e446a5 --- /dev/null +++ b/src/partials/adding-a-new-app-from-a-self-hosted-gitlab-repository.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a new project from a self-hosted GitLab repository + +1. Start the process of [adding a new project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project). +1. When prompted to select your Git provider, select **GitLab**. Select the **Self-hosted** option. +1. Click **Connect**. + +Once connected, proceed as usual: [Adding your first project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project). diff --git a/src/partials/adding-a-new-app-with-the-api.mdx b/src/partials/adding-a-new-app-with-the-api.mdx new file mode 100644 index 0000000..db4ad34 --- /dev/null +++ b/src/partials/adding-a-new-app-with-the-api.mdx @@ -0,0 +1,88 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a new app with the API + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| POST /apps/register | Add a new app. | N/A | +| POST /apps/\{app-slug\}/register-ssh-key | Add an SSH key to a specific app. | Owner or Admin | +| POST /apps/\{app-slug\}/finish | Save the application at the end of the application add process. | N/A | +| POST /apps/\{app-slug\}/bitrise.yml | Upload a new bitrise.yml for your application. | Owner or Admin | + +:::note[Apps with HTTPS Git URLs] + +The procedure and the examples are aimed at adding a private app with an SSH git URL. If you want to add an app with an HTTPS git URL, you can skip adding an SSH key. + +::: + +1. Register the app by calling the `register` endpoint and setting all required parameters. + + You need to set your git provider, the repository URL, the slug of the repository as it appears at the provider, and the slug of the owner of the repository. You also need to add the slug of the Workspace that will own the app: due to legacy naming conventions, you need the `organization_slug` parameter. + + ``` + curl -X POST -H 'Authorization: ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/register' -d \ + '{ + "provider": "github", + "is_public": false, + "organization_slug": "$ORG_SLUG" + "repo_url": "git@github.com:api_demo/example-repository.git", + "type": "git", + "git_repo_slug": "example-repository", + "git_owner": "api_demo" + }' + ``` + + :::tip[Changing the name of your app] + + By default, when you register an app, it will inherit the name of your git repository. + + If you would like to add the app with a different name, you can append the "title" parameter to your POST request using the following syntax: + + ``` + curl -X POST -H 'Authorization: ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/register' -d \ + '{ + ... + ... + "title": "string" + }' + ``` + + You can also change the name of your app after creating it, by sending a PATCH request and calling the `apps` endpoint. For more information, see [Managing an existing app](/en/bitrise-ci/api/adding-and-managing-apps/managing-an-existing-app). + + ::: +1. Once done, call the `register-ssh-key` endpoint to set up the SSH keys you created so that Bitrise can clone your repository when running a build. + + You need to provide both your private and public SSH key. Please note that if you wish to copy the private key manually, you need to escape all the line breaks with `\n`. + + You can also set whether you want to automatically register the public key at your git provider: set the `is_register_key_into_provider_service` parameter to either true or false. + + ``` + curl -X POST -H 'Authorization: ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/register-ssh-key' -d \ + '{ + "auth_ssh_private_key": "your-private-ssh-key", + "auth_ssh_public_key": "your-public-ssh-key", + "is_register_key_into_provider_service": false + }' + ``` +1. Finish the app registration process by calling the `finish` endpoint. + + This endpoint allows you to configure your apps: set the project type, the stack on which the build will run (this may vary based on your app), and the initial configuration settings. + + You can also set Environment Variables, as well as immediately specify a Workspace that will be the owner of the application. Please note that the `mode` parameter must be set to the value of `manual`. + + ``` + curl -X POST -H 'Authorization: ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/finish' -d \ + '{ + "project_type": "ios", + "stack_id": "osx-xcode-13.2.x", + "config": "default-ios-config", + "mode": "manual", + "envs": { + "env1": "val1", + "env2": "val2" + }, + "organization_slug": "e1ec3dea540bcf21" + }' + ``` diff --git a/src/partials/adding-a-new-user-to-a-workspace-with-enforced-saml-sso.mdx b/src/partials/adding-a-new-user-to-a-workspace-with-enforced-saml-sso.mdx new file mode 100644 index 0000000..08681a8 --- /dev/null +++ b/src/partials/adding-a-new-user-to-a-workspace-with-enforced-saml-sso.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a new user to a workspace with enforced SAML SSO + +You can add new users to a workspace with enforced SAML SSO. There are three cases: + +- The workspace has a verified domain: [Verified domain](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise/verified-domain). You can invite users with the same email domain as you would to any other workspace: [Workspace collaboration](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration). +- The workspace doesn't have a verified domain and you want to invite a user who hasn't registered a Bitrise account yet: invite the user as you would to any other workspace. +- The workspace doesn't have a verified domain and you want to invite a user with an existing Bitrise account: turn off [enforced SAML SSO](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise/enforcing-saml-sso-on-a-workspace), invite the user, and turn enforcement back on. + +| Domain verification status | New user | Existing user | +| --- | --- | --- | +| Verified domain | Simple invite | Simple invite | +| Non-verified domain | Simple invite | Turn off SAML SSO enforcement Invite the user Turn on SAML SSO enforcement again | diff --git a/src/partials/adding-a-react-native-app-to-bitrise.mdx b/src/partials/adding-a-react-native-app-to-bitrise.mdx new file mode 100644 index 0000000..5de1ea2 --- /dev/null +++ b/src/partials/adding-a-react-native-app-to-bitrise.mdx @@ -0,0 +1,90 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a React Native project to Bitrise + +This procedure will guide you through the process of adding your React Native project to Bitrise, connecting your repository, setting up your repository access, selecting a branch and validating your project. Below we highlight some React Native-specific configuration as well. + +1. Log in to Bitrise and go to the **Dashboard**. +1. Click the **New project** button. +1. Select **Configure Bitrise CI**. +1. Under **Project access**, select the workspace that will own the project. + + ![20251219-adding-project-workspace-select.png](/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png) +1. Set who has access to the project's CI builds: + + :::caution[Privacy is final] + + You cannot change this setting later! If you realize you've accidentally added your project as a public project even though you need it to be private, you'll have to delete the project and add it again. + + ::: + + Private projects are only accessible to you, your workspace members and those who are invited to work on a project. They require authentication to access the repository of the project. + + [Public projects](/en/bitrise-platform/projects/public-projects.html) expose their configuration YAML and their build logs to everyone. If you have a public project’s build URL, you can view its build log, to help with troubleshooting, for example. Public projects do not require authentication and they cannot have SSH keys. +1. Open the **Provider** dropdown menu and select the [repository access](/en/bitrise-platform/repository-access/about-repository-access.html) type. + + You can select from: + + - Connected Git provider accounts: Either via [OAuth connection](/en/bitrise-platform/repository-access/repository-access-with-oauth) or the [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). + - Not connected Git provider accounts: you will be prompted to connect one. + - **Other**: A Git provider other than GitHub/GitLab/Bitbucket. + + ![20251219-repo-access.png](/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png) +1. Select a repository. + + - If you selected a connected Git account, you can click **Select a repository** to select from the available repositories on that account. + - In any case, you can type the URL manually in the **Git repository (clone) URL**. We strongly recommend using an SSH URL, unless you are setting up a [public project](/en/bitrise-platform/projects/public-projects.html). + + :::note[Repository URL] + + You will be able to [change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch) later. You can also connect or disconnect your account to Git provider services at any time. + + ::: +1. If you use an OAuth connection, you need to [add an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) in the **Authorize Bitrise** section. + + You don't need SSH keys if: + + - Your project is a public project. + - You connect to your Git repository via a [GitHub app installation](/en/bitrise-platform/repository-access/github-app-integration). + + ![20251219-authorize-bitrise.png](/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png) + + **Auto-add a generated SSH key to your repository**: We recommend using this option. We automatically generate an SSH key pair and register the public key to your repository. Requires your connected Git provider account to have admin rights to the repository. + + **Copy a generated SSH key to your Git provider manually**: We generate an SSH key pair for you and you can copy the public key and register it manually to your Git provider. It is useful if, for example, you need to access multiple repositories with the same SSH key. + + **Add your own SSH key to Bitrise**: You can generate your own SSH key and paste the private key here after choosing this option. You also need to add the public key to the repository manually. To generate your SSH key pair: [Generating your own SSH keypair](/en/bitrise-platform/repository-access/configuring-ssh-keys/generating-your-own-ssh-keypair). + + :::note[Configure SSH keys at any time] + + If you can't set up a valid, working SSH key connection at this time, don't worry: proceed with adding your project. You can set up the SSH connection afterwards: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). + + ::: +1. Select the default branch of your repository. This branch should contain the configuration of your project. + + - If you successfully configured SSH access in the previous step or if you're adding a public project, Bitrise will parse your repository and allow you to select a branch from a dropdown menu. + - If you didn't configure repository access, you need to type the branch name manually. + + [You can change the default branch of the project later](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). + + ![20251219-choose-branch.png](/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png) +1. Select **Yes, auto-detect configuration**. Bitrise will scan your repository and attempt to set up a stack and default Workflows based on the results of the scan. In most cases, we recommend choosing this option. + + :::note[Project type] + + Detecting a project type serves to assist in the initial configuration of your project. But don't worry, you can change every setting, including the project type, at any time after you added the project. + + ::: +1. Wait while Bitrise is validating your project. If your configuration files are available on the selected branch, the scanner will detect your app as a React Native app. + + If your project consists of only one module, that module will be automatically selected for **Module**. If your project contains more than one module, you can pick a module, but we recommend the main one! +1. In the **Variant** field, select a variant that suits your project. Pick **Select All Variants** to build all variants. Pick **debug** or **release** if you wish to generate an APK or an IPA file. +1. In the **Project (or Workspace)** field, select your Xcode project or Xcode Workspace path. +1. In the **Select Scheme name**, pick a scheme name. The scanner validation will fail if you do not have a SHARED scheme in your project. You can still point Bitrise manually to your Xcode scheme but if it’s shared, we automatically detect it for you. +1. In **Select ipa export method**, select the export method of your .ipa file: ad-hoc, app-store, development or enterprise method. Don't worry, you can change this later. +1. Register a webhook when prompted so that Bitrise can start a build automatically when code is pushed to your repository, or a pull request is created. +1. Once you are done, click **View Project Page** to go to the newly added project's home page. From there, you can start [editing your Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [run builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). + +You have successfully set up your React Native project on [bitrise.io](https://www.bitrise.io)! diff --git a/src/partials/adding-a-step-icon.mdx b/src/partials/adding-a-step-icon.mdx new file mode 100644 index 0000000..c00fa8a --- /dev/null +++ b/src/partials/adding-a-step-icon.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a Step icon + +You can add a Step icon to your Step: you will see it in the Workflow Editor and on our [Integrations](https://www.bitrise.io/integrations/) page. This is optional: you only need an icon if you want to add your Step to the official Bitrise Step Library. There are some requirements: + +- Its background color should not be transparent. +- Size: 256x256 px. +- Margin: 60 px. +- Format: SVG. + +To submit your Step’s icon: + +- Add the .svg file into your StepLib fork repo at: `STEPLIB_FORK_ROOT/steps/YOUR_STEP_ID/assets/icon.svg`. +- Create a new pull request to the [StepLib repository](https://github.com/bitrise-io/bitrise-steplib). diff --git a/src/partials/adding-a-unity-project-as-a-bitrise-app.mdx b/src/partials/adding-a-unity-project-as-a-bitrise-app.mdx new file mode 100644 index 0000000..7756616 --- /dev/null +++ b/src/partials/adding-a-unity-project-as-a-bitrise-app.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a Unity project as a Bitrise app + +Add your Unity project [as a new app](/en/bitrise-ci/getting-started/adding-a-new-project.html). The project scanner doesn't support Unity software so it won't detect your project as a Unity project so you can skip automatic configuration and register the project as **Other**. + +We recommend using an Xcode stack: these contain the most important Android tools, too. You can build both iOS and Android versions of your Unity apps on our Xcode stacks. diff --git a/src/partials/adding-a-web-ci-project.mdx b/src/partials/adding-a-web-ci-project.mdx new file mode 100644 index 0000000..fca19b2 --- /dev/null +++ b/src/partials/adding-a-web-ci-project.mdx @@ -0,0 +1,39 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding a web CI project + +A web CI project has no specific requirements. Add your web CI project as described in the guide: [Adding a new project](/en/bitrise-ci/getting-started/adding-a-new-project). + +The project scanner can detect web CI project types and create a default configuration: after selecting a repository branch, select **Yes, auto-detect configuration**. + +The project scanner will scan your project files. Just like with mobile projects, it identifies projects based on key files in the repository. For now, Bitrise can automatically detect the following types: + +- **Node.js**: The scanner looks for your `package.json` file, excluding `node_modules` and `.next` directories. Bitrise creates your default Workflows and Pipelines based on the contents: + + - Package manager: presence of `package-lock.json` (npm) or `yarn.lock` (Yarn). + - Scripts: detects `lint` and `test` entries in `package.json` scripts. + - Framework: checks `dependencies` and `devDependencies` for `next` (→ `nextjs`) or `@nestjs/core` (→ `nestjs`). + - Node version: reads from version files or `package.json` engines field. +- **Kotlin Multiplatform**: The scanner looks for a `gradlew` file and checks it to determine if it's a Kotlin project. +- **Java**: The scanner can recognize a Java project based on the build tool. Two build tools are supported: + + - Gradle: the scanner looks for the `gradlew` file. + - Maven: the scanner looks for the `pom.xml` file. +- **Ruby**: The scanner identifies Ruby projects by searching for `Gemfile` files in the repository. Each directory containing a Gemfile is treated as a separate Ruby project, enabling monorepo support. + + For Ruby, the scanner inspects: + + - Bundler: the scanner looks for `Gemfile.lock` + - Rakefile: looks for a `Rakefile` + - Ruby version: reads `.ruby-version` or `.tool-versions` (`asdf` format) + - Rails: checks if `rails` gem is declared in the `Gemfile` + - Test framework: detects RSpec (via `spec/spec_helper.rb` or `.rspec)`, Minitest (via `test/test_helper.rb`), or falls back to rake test if a `Rakefile` is present + + :::note[Manual configuration] + + If you don't want to use the scanner, the default manual configuration for Ruby assumes Bundler and RSpec with no database, giving you a clean starting point to customize. + + ::: +- Flutter web: The scanner looks for a `web/` directory under the Flutter project. diff --git a/src/partials/adding-an-android-app-to-bitrise.mdx b/src/partials/adding-an-android-app-to-bitrise.mdx new file mode 100644 index 0000000..d7d4172 --- /dev/null +++ b/src/partials/adding-an-android-app-to-bitrise.mdx @@ -0,0 +1,82 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an Android project to Bitrise + +1. Log in to Bitrise and go to the **Dashboard**. +1. Click the **New project** button. +1. Select **Configure Bitrise CI**. +1. Under **Project access**, select the workspace that will own the project. + + ![20251219-adding-project-workspace-select.png](/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png) +1. Set who has access to the project's CI builds: + + :::caution[Privacy is final] + + You cannot change this setting later! If you realize you've accidentally added your project as a public project even though you need it to be private, you'll have to delete the project and add it again. + + ::: + + Private projects are only accessible to you, your workspace members and those who are invited to work on a project. They require authentication to access the repository of the project. + + [Public projects](/en/bitrise-platform/projects/public-projects.html) expose their configuration YAML and their build logs to everyone. If you have a public project’s build URL, you can view its build log, to help with troubleshooting, for example. Public projects do not require authentication and they cannot have SSH keys. +1. Open the **Provider** dropdown menu and select the [repository access](/en/bitrise-platform/repository-access/about-repository-access.html) type. + + You can select from: + + - Connected Git provider accounts: Either via [OAuth connection](/en/bitrise-platform/repository-access/repository-access-with-oauth) or the [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). + - Not connected Git provider accounts: you will be prompted to connect one. + - **Other**: A Git provider other than GitHub/GitLab/Bitbucket. + + ![20251219-repo-access.png](/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png) +1. Select a repository. + + - If you selected a connected Git account, you can click **Select a repository** to select from the available repositories on that account. + - In any case, you can type the URL manually in the **Git repository (clone) URL**. We strongly recommend using an SSH URL, unless you are setting up a [public project](/en/bitrise-platform/projects/public-projects.html). + + :::note[Repository URL] + + You will be able to [change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch) later. You can also connect or disconnect your account to Git provider services at any time. + + ::: +1. If you use an OAuth connection, you need to [add an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) in the **Authorize Bitrise** section. + + You don't need SSH keys if: + + - Your project is a public project. + - You connect to your Git repository via a [GitHub app installation](/en/bitrise-platform/repository-access/github-app-integration). + + ![20251219-authorize-bitrise.png](/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png) + + **Auto-add a generated SSH key to your repository**: We recommend using this option. We automatically generate an SSH key pair and register the public key to your repository. Requires your connected Git provider account to have admin rights to the repository. + + **Copy a generated SSH key to your Git provider manually**: We generate an SSH key pair for you and you can copy the public key and register it manually to your Git provider. It is useful if, for example, you need to access multiple repositories with the same SSH key. + + **Add your own SSH key to Bitrise**: You can generate your own SSH key and paste the private key here after choosing this option. You also need to add the public key to the repository manually. To generate your SSH key pair: [Generating your own SSH keypair](/en/bitrise-platform/repository-access/configuring-ssh-keys/generating-your-own-ssh-keypair). + + :::note[Configure SSH keys at any time] + + If you can't set up a valid, working SSH key connection at this time, don't worry: proceed with adding your project. You can set up the SSH connection afterwards: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). + + ::: +1. Select the default branch of your repository. This branch should contain the configuration of your project. + + - If you successfully configured SSH access in the previous step or if you're adding a public project, Bitrise will parse your repository and allow you to select a branch from a dropdown menu. + - If you didn't configure repository access, you need to type the branch name manually. + + [You can change the default branch of the project later](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). + + ![20251219-choose-branch.png](/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png) +1. Select **Yes, auto-detect configuration**. Bitrise will scan your repository and attempt to set up a stack and default Workflows based on the results of the scan. In most cases, we recommend choosing this option. + + :::note[Project type] + + Detecting a project type serves to assist in the initial configuration of your project. But don't worry, you can change every setting, including the project type, at any time after you added the project. + + ::: +1. Wait while Bitrise is validating your project. The scanner is looking for your `build.gradle` and `gradlew` files. If they are present, the project will be detected as an Android project. +1. The Bitrise Scanner selects the main module of your project by default. If there are more modules to choose from in the Module list, select a module that works best for your project. +1. Select a variant for building (you can **Select All Variants** which will generate all variants in **Artifacts**) and select a variant for testing too. +1. Register a webhook when prompted so that Bitrise can start a build automatically when code is pushed to your repository, or a pull request is created. +1. Once you are done, click **View Project Page** to go to the newly added project's home page. From there, you can start [editing your Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [run builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). diff --git a/src/partials/adding-an-avatar-to-your-account.mdx b/src/partials/adding-an-avatar-to-your-account.mdx new file mode 100644 index 0000000..3c56a58 --- /dev/null +++ b/src/partials/adding-an-avatar-to-your-account.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an avatar to your account + +You can add your own personalized avatar to your Bitrise account. + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. Find your default avatar on the left, above the account name. +1. Click the image. +1. Drag and drop your new avatar in the **CHANGE AVATAR** window, or click **Browse** to choose an image from your computer. diff --git a/src/partials/adding-an-expo-app-to-bitrise.mdx b/src/partials/adding-an-expo-app-to-bitrise.mdx new file mode 100644 index 0000000..ac489bd --- /dev/null +++ b/src/partials/adding-an-expo-app-to-bitrise.mdx @@ -0,0 +1,84 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an Expo project to Bitrise + +First, let’s see how to add a React Native Expo project to [bitrise.io](https://www.bitrise.io/). + +1. Log in to Bitrise and go to the **Dashboard**. +1. Click the **New project** button. +1. Select **Configure Bitrise CI**. +1. Under **Project access**, select the workspace that will own the project. + + ![20251219-adding-project-workspace-select.png](/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png) +1. Set who has access to the project's CI builds: + + :::caution[Privacy is final] + + You cannot change this setting later! If you realize you've accidentally added your project as a public project even though you need it to be private, you'll have to delete the project and add it again. + + ::: + + Private projects are only accessible to you, your workspace members and those who are invited to work on a project. They require authentication to access the repository of the project. + + [Public projects](/en/bitrise-platform/projects/public-projects.html) expose their configuration YAML and their build logs to everyone. If you have a public project’s build URL, you can view its build log, to help with troubleshooting, for example. Public projects do not require authentication and they cannot have SSH keys. +1. Open the **Provider** dropdown menu and select the [repository access](/en/bitrise-platform/repository-access/about-repository-access.html) type. + + You can select from: + + - Connected Git provider accounts: Either via [OAuth connection](/en/bitrise-platform/repository-access/repository-access-with-oauth) or the [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). + - Not connected Git provider accounts: you will be prompted to connect one. + - **Other**: A Git provider other than GitHub/GitLab/Bitbucket. + + ![20251219-repo-access.png](/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png) +1. Select a repository. + + - If you selected a connected Git account, you can click **Select a repository** to select from the available repositories on that account. + - In any case, you can type the URL manually in the **Git repository (clone) URL**. We strongly recommend using an SSH URL, unless you are setting up a [public project](/en/bitrise-platform/projects/public-projects.html). + + :::note[Repository URL] + + You will be able to [change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch) later. You can also connect or disconnect your account to Git provider services at any time. + + ::: +1. If you use an OAuth connection, you need to [add an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) in the **Authorize Bitrise** section. + + You don't need SSH keys if: + + - Your project is a public project. + - You connect to your Git repository via a [GitHub app installation](/en/bitrise-platform/repository-access/github-app-integration). + + ![20251219-authorize-bitrise.png](/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png) + + **Auto-add a generated SSH key to your repository**: We recommend using this option. We automatically generate an SSH key pair and register the public key to your repository. Requires your connected Git provider account to have admin rights to the repository. + + **Copy a generated SSH key to your Git provider manually**: We generate an SSH key pair for you and you can copy the public key and register it manually to your Git provider. It is useful if, for example, you need to access multiple repositories with the same SSH key. + + **Add your own SSH key to Bitrise**: You can generate your own SSH key and paste the private key here after choosing this option. You also need to add the public key to the repository manually. To generate your SSH key pair: [Generating your own SSH keypair](/en/bitrise-platform/repository-access/configuring-ssh-keys/generating-your-own-ssh-keypair). + + :::note[Configure SSH keys at any time] + + If you can't set up a valid, working SSH key connection at this time, don't worry: proceed with adding your project. You can set up the SSH connection afterwards: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). + + ::: +1. Select the default branch of your repository. This branch should contain the configuration of your project. + + - If you successfully configured SSH access in the previous step or if you're adding a public project, Bitrise will parse your repository and allow you to select a branch from a dropdown menu. + - If you didn't configure repository access, you need to type the branch name manually. + + [You can change the default branch of the project later](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). + + ![20251219-choose-branch.png](/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png) +1. Select **Yes, auto-detect configuration**. Bitrise will scan your repository and attempt to set up a stack and default Workflows based on the results of the scan. In most cases, we recommend choosing this option. + + :::note[Project type] + + Detecting a project type serves to assist in the initial configuration of your project. But don't worry, you can change every setting, including the project type, at any time after you added the project. + + ::: +1. Wait while Bitrise is validating your project. If automatic validation fails, you can set the project up manually. +1. Register a webhook when prompted so that Bitrise can start a build automatically when code is pushed to your repository, or a pull request is created. +1. Once you are done, click **View Project Page** to go to the newly added project's home page. From there, you can start [editing your Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [run builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). + +You have successfully set up your React Native project on [bitrise.io](https://www.bitrise.io/)! Your first build gets kicked off automatically using the primary workflow. You can check the generated reports of the first build on the **Artifacts** tab on your Build’s page. diff --git a/src/partials/adding-an-ioniccordova-app-to-bitrise.mdx b/src/partials/adding-an-ioniccordova-app-to-bitrise.mdx new file mode 100644 index 0000000..7f411a1 --- /dev/null +++ b/src/partials/adding-an-ioniccordova-app-to-bitrise.mdx @@ -0,0 +1,88 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an Ionic/Cordova project to Bitrise + +1. Log in to Bitrise and go to the **Dashboard**. +1. Click the **New project** button. +1. Select **Configure Bitrise CI**. +1. Under **Project access**, select the workspace that will own the project. + + ![20251219-adding-project-workspace-select.png](/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png) +1. Set who has access to the project's CI builds: + + :::caution[Privacy is final] + + You cannot change this setting later! If you realize you've accidentally added your project as a public project even though you need it to be private, you'll have to delete the project and add it again. + + ::: + + Private projects are only accessible to you, your workspace members and those who are invited to work on a project. They require authentication to access the repository of the project. + + [Public projects](/en/bitrise-platform/projects/public-projects.html) expose their configuration YAML and their build logs to everyone. If you have a public project’s build URL, you can view its build log, to help with troubleshooting, for example. Public projects do not require authentication and they cannot have SSH keys. +1. Open the **Provider** dropdown menu and select the [repository access](/en/bitrise-platform/repository-access/about-repository-access.html) type. + + You can select from: + + - Connected Git provider accounts: Either via [OAuth connection](/en/bitrise-platform/repository-access/repository-access-with-oauth) or the [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). + - Not connected Git provider accounts: you will be prompted to connect one. + - **Other**: A Git provider other than GitHub/GitLab/Bitbucket. + + ![20251219-repo-access.png](/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png) +1. Select a repository. + + - If you selected a connected Git account, you can click **Select a repository** to select from the available repositories on that account. + - In any case, you can type the URL manually in the **Git repository (clone) URL**. We strongly recommend using an SSH URL, unless you are setting up a [public project](/en/bitrise-platform/projects/public-projects.html). + + :::note[Repository URL] + + You will be able to [change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch) later. You can also connect or disconnect your account to Git provider services at any time. + + ::: +1. If you use an OAuth connection, you need to [add an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) in the **Authorize Bitrise** section. + + You don't need SSH keys if: + + - Your project is a public project. + - You connect to your Git repository via a [GitHub app installation](/en/bitrise-platform/repository-access/github-app-integration). + + ![20251219-authorize-bitrise.png](/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png) + + **Auto-add a generated SSH key to your repository**: We recommend using this option. We automatically generate an SSH key pair and register the public key to your repository. Requires your connected Git provider account to have admin rights to the repository. + + **Copy a generated SSH key to your Git provider manually**: We generate an SSH key pair for you and you can copy the public key and register it manually to your Git provider. It is useful if, for example, you need to access multiple repositories with the same SSH key. + + **Add your own SSH key to Bitrise**: You can generate your own SSH key and paste the private key here after choosing this option. You also need to add the public key to the repository manually. To generate your SSH key pair: [Generating your own SSH keypair](/en/bitrise-platform/repository-access/configuring-ssh-keys/generating-your-own-ssh-keypair). + + :::note[Configure SSH keys at any time] + + If you can't set up a valid, working SSH key connection at this time, don't worry: proceed with adding your project. You can set up the SSH connection afterwards: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). + + ::: +1. Select the default branch of your repository. This branch should contain the configuration of your project. + + - If you successfully configured SSH access in the previous step or if you're adding a public project, Bitrise will parse your repository and allow you to select a branch from a dropdown menu. + - If you didn't configure repository access, you need to type the branch name manually. + + [You can change the default branch of the project later](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). + + ![20251219-choose-branch.png](/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png) +1. Select **Yes, auto-detect configuration**. Bitrise will scan your repository and attempt to set up a stack and default Workflows based on the results of the scan. In most cases, we recommend choosing this option. + + :::note[Project type] + + Detecting a project type serves to assist in the initial configuration of your project. But don't worry, you can change every setting, including the project type, at any time after you added the project. + + ::: +1. At **Project Build configuration**, you can select which platform to build your app for. You can select: + + - iOS. + - Android. + - iOS and Android (where the Android build gets built first). + + ![Cordova_apps.png](/img/_paligo/uuid-73f89e6b-1f74-1d1d-8947-e06b996648ba.png) + + ![Cordova_apps.png](/img/_paligo/uuid-69f86006-5ed4-0af7-716e-220d09da2165.png) +1. Register a webhook when prompted so that Bitrise can start a build automatically when code is pushed to your repository, or a pull request is created. +1. Once you are done, click **View Project Page** to go to the newly added project's home page. From there, you can start [editing your Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [run builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). diff --git a/src/partials/adding-an-ios-app-to-bitrise.mdx b/src/partials/adding-an-ios-app-to-bitrise.mdx new file mode 100644 index 0000000..ac8f335 --- /dev/null +++ b/src/partials/adding-an-ios-app-to-bitrise.mdx @@ -0,0 +1,99 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an iOS project to Bitrise + +:::note[Do you have a Bitrise account?] + +Make sure you have signed up to [bitrise.io](https://www.bitrise.io) and can access your Bitrise account. There are multiple ways of registering an account: + +- [Signing up with email](/en/bitrise-platform/getting-started/signing-up-for-bitrise/signing-up-with-email) +- [Signing up with a Git provider](/en/bitrise-platform/getting-started/signing-up-for-bitrise/signing-up-with-a-git-provider) + +::: + +1. Log in to Bitrise and go to the **Dashboard**. +1. Click the **New project** button. +1. Select **Configure Bitrise CI**. +1. Under **Project access**, select the workspace that will own the project. + + ![20251219-adding-project-workspace-select.png](/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png) +1. Set who has access to the project's CI builds: + + :::caution[Privacy is final] + + You cannot change this setting later! If you realize you've accidentally added your project as a public project even though you need it to be private, you'll have to delete the project and add it again. + + ::: + + Private projects are only accessible to you, your workspace members and those who are invited to work on a project. They require authentication to access the repository of the project. + + [Public projects](/en/bitrise-platform/projects/public-projects.html) expose their configuration YAML and their build logs to everyone. If you have a public project’s build URL, you can view its build log, to help with troubleshooting, for example. Public projects do not require authentication and they cannot have SSH keys. +1. Open the **Provider** dropdown menu and select the [repository access](/en/bitrise-platform/repository-access/about-repository-access.html) type. + + You can select from: + + - Connected Git provider accounts: Either via [OAuth connection](/en/bitrise-platform/repository-access/repository-access-with-oauth) or the [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). + - Not connected Git provider accounts: you will be prompted to connect one. + - **Other**: A Git provider other than GitHub/GitLab/Bitbucket. + + ![20251219-repo-access.png](/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png) +1. Select a repository. + + - If you selected a connected Git account, you can click **Select a repository** to select from the available repositories on that account. + - In any case, you can type the URL manually in the **Git repository (clone) URL**. We strongly recommend using an SSH URL, unless you are setting up a [public project](/en/bitrise-platform/projects/public-projects.html). + + :::note[Repository URL] + + You will be able to [change your project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch) later. You can also connect or disconnect your account to Git provider services at any time. + + ::: +1. If you use an OAuth connection, you need to [add an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) in the **Authorize Bitrise** section. + + You don't need SSH keys if: + + - Your project is a public project. + - You connect to your Git repository via a [GitHub app installation](/en/bitrise-platform/repository-access/github-app-integration). + + ![20251219-authorize-bitrise.png](/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png) + + **Auto-add a generated SSH key to your repository**: We recommend using this option. We automatically generate an SSH key pair and register the public key to your repository. Requires your connected Git provider account to have admin rights to the repository. + + **Copy a generated SSH key to your Git provider manually**: We generate an SSH key pair for you and you can copy the public key and register it manually to your Git provider. It is useful if, for example, you need to access multiple repositories with the same SSH key. + + **Add your own SSH key to Bitrise**: You can generate your own SSH key and paste the private key here after choosing this option. You also need to add the public key to the repository manually. To generate your SSH key pair: [Generating your own SSH keypair](/en/bitrise-platform/repository-access/configuring-ssh-keys/generating-your-own-ssh-keypair). + + :::note[Configure SSH keys at any time] + + If you can't set up a valid, working SSH key connection at this time, don't worry: proceed with adding your project. You can set up the SSH connection afterwards: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). + + ::: +1. Select the default branch of your repository. This branch should contain the configuration of your project. + + - If you successfully configured SSH access in the previous step or if you're adding a public project, Bitrise will parse your repository and allow you to select a branch from a dropdown menu. + - If you didn't configure repository access, you need to type the branch name manually. + + [You can change the default branch of the project later](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). + + ![20251219-choose-branch.png](/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png) +1. Select **Yes, auto-detect configuration**. Bitrise will scan your repository and attempt to set up a stack and default Workflows based on the results of the scan. In most cases, we recommend choosing this option. + + :::note[Project type] + + Detecting a project type serves to assist in the initial configuration of your project. But don't worry, you can change every setting, including the project type, at any time after you added the project. + + ::: +1. Wait while Bitrise is validating your project. + + We look for your configuration files and set up your app based on them. In the case of an iOS app, we’re looking for your Xcode Project (`.xcodeproj`) or Xcode Workspace (`.xcworkspace`) path. Note that the validation will fail if you do not have a SHARED scheme in your project. You can still point Bitrise manually to your Xcode scheme but if it’s shared, we automatically detect it for you. +1. Select the IPA export method. You can modify this later - for now, select **development**. + + Once you clicked it, you should see your: + + - Project or Workspace path. + - Scheme name + - IPA export method. + - iOS stack. +1. Register a webhook when prompted so that Bitrise can start a build automatically when code is pushed to your repository, or a pull request is created. +1. Once you are done, click **View Project Page** to go to the newly added project's home page. From there, you can start [editing your Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [run builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). diff --git a/src/partials/adding-an-oidc-identity-provider-in-iam.mdx b/src/partials/adding-an-oidc-identity-provider-in-iam.mdx new file mode 100644 index 0000000..a16d555 --- /dev/null +++ b/src/partials/adding-an-oidc-identity-provider-in-iam.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an OIDC identity provider in IAM + +Set up an IAM OIDC provider in your AWS account. + +:::tip[AWS user guide] + +Read more about IAM OIDC providers in the [official AWS user guide](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html). + +::: + +1. Log in to your AWS account. +1. Go to **IAM**. +1. On the left, find **Access Management** and select **Identity providers**. +1. Click **Add Provider**. +1. Select **OpenID Connect**. +1. Set the **Provider URL** field to https://token.builds.bitrise.io. +1. Set the **Audience** field to `sts.amazonaws.com`. +1. Click **Add provider**. + + ![2025-11-11-aws-iam-provider.png](/img/_paligo/uuid-019f250f-8d48-a51c-738b-db46d0829339.png) +1. On the **Identity providers** page, select the newly created identity provider and copy the ARN. + + The ARN looks something like this: `arn:aws:iam::ACCOUNT_NUMBER:oidc-provider/token.builds.bitrise.io`. diff --git a/src/partials/adding-an-outgoing-webhook-to-a-release.mdx b/src/partials/adding-an-outgoing-webhook-to-a-release.mdx new file mode 100644 index 0000000..17bff1b --- /dev/null +++ b/src/partials/adding-an-outgoing-webhook-to-a-release.mdx @@ -0,0 +1,63 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an outgoing webhook to a release + +You can add outgoing webhooks to a release in two ways: + +- Add the webhook to an individual release. +- Add the webhook to a release preset template. All releases using that template will use the configured webhook. + + + + +1. Make sure your external service is ready to receive and process the webhook requests. This typically involves: + + - Creating a publicly accessible URL to receive the HTTP POST requests from Bitrise. + - Handling the JSON payload: parse the JSON data and extract the relevant information. + - Defining the actions your service should take based on the received event. +1. [Create an outgoing webhook](/en/bitrise-platform/integrations/webhooks/adding-outgoing-webhooks.html) on Bitrise. +1. Open Release Management. +1. Select your app. +1. Select a release that hasn't finished. + + ![2025-10-29-releases.png](/img/_paligo/uuid-77ae83b9-c3d4-60a7-9997-ad0a27832d58.png) +1. Go to **Configuration**. +1. Find the **Outgoing webhooks** card and click **Show details**. + + ![2025-10-29-outgoing-webhooks-rm.png](/img/_paligo/uuid-28b052ba-a18f-12ee-7a9a-04720bb6fdd1.png) +1. Click **Add webhook**. +1. Select a webhook from the **Webhook configuration** menu. + + ![2025-10-29-rm-add-outgoing-webhook.png](/img/_paligo/uuid-f9d557bf-8cd0-2856-4555-61352d73ca56.png) +1. Select the events that will trigger the webhook. + + See the full list of events and their payload information: [Webhook events](/en/release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management/webhook-events). + + + + +1. Make sure your external service is ready to receive and process the webhook requests. This typically involves: + + - Creating a publicly accessible URL to receive the HTTP POST requests from Bitrise. + - Handling the JSON payload: parse the JSON data and extract the relevant information. + - Defining the actions your service should take based on the received event. +1. [Create an outgoing webhook](/en/bitrise-platform/integrations/webhooks/adding-outgoing-webhooks.html) on Bitrise. +1. Open Release Management. +1. Select your app. +1. Go to **Release presets**. + + ![2025-10-29-release-presets.png](/img/_paligo/uuid-05179598-b31c-84ba-3b1d-03720f842acc.png) +1. [Create a new template](/en/release-management/releases/release-presets.html) or modify an existing one. +1. On the template page, find the **Outgoing webhooks** card and click **Show details**. +1. Click **Add webhook**. +1. Select a webhook from the **Webhook configuration** menu. + + ![2025-10-29-rm-add-outgoing-webhook.png](/img/_paligo/uuid-f9d557bf-8cd0-2856-4555-61352d73ca56.png) +1. Select the events that will trigger the webhook. + + See the full list of events and their payload information: [Webhook events](/en/release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management/webhook-events). + + + diff --git a/src/partials/adding-an-outgoing-webhook-to-an-app.mdx b/src/partials/adding-an-outgoing-webhook-to-an-app.mdx new file mode 100644 index 0000000..c2dd6db --- /dev/null +++ b/src/partials/adding-an-outgoing-webhook-to-an-app.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an outgoing webhook to a Bitrise project + +You can set up and configure the webhooks sent by Bitrise on the web UI. Let’s see how! + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Integrations** and then select the **Webhooks** tab. +1. Scroll down to **Outgoing Webhooks**. +1. Click **Add webhook**. +1. Enter the URL of the service where you wish to send the notification in the **URL** field. + + ![add-outgoing-webhook.png](/img/_paligo/uuid-6c73acd6-91b0-2cf7-80bb-b0ef7e8b6618.png) +1. Select either the **Send me everything** or the **Select individual events** option. + + - **Send me everything**: every supported event type will trigger the webhook. Currently, only build events are supported but there will be other options in the future! + - **Select individual events**: you can specify the individual events that should trigger the webhook. +1. Optionally, add custom headers to your webhook: in the **Headers** section, specify a name and a value for the header. When done, click **Add header**. + + For example, if you have an API listening to the webhook, you can track the requests with API keys set as a custom header. + + :::tip[Hiding the header value] + + You can hide the value of your headers by checking the box under **Hide**. Please note that if you do this, you won't be able to view or change the value again. + + ::: +1. Click **Create Webhook**. + +And you’re done! You can modify your webhook at any time by clicking the pencil icon next to the webhook. + +If you created the webhook to use it for Release Management, check out the detailed guide: [Outgoing webhooks in Release Management](/en/release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management). diff --git a/src/partials/adding-api-key-authentication-data-on-bitrise.mdx b/src/partials/adding-api-key-authentication-data-on-bitrise.mdx new file mode 100644 index 0000000..e1cd536 --- /dev/null +++ b/src/partials/adding-api-key-authentication-data-on-bitrise.mdx @@ -0,0 +1,46 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding API key authentication data on Bitrise + +You can add API key authentication data on the **Workspace settings** page. You can add multiple API keys here. You can select between different API keys for each project, using them either for Bitrise CI or Bitrise Release Management. + +1. On [App Store Connect](https://appstoreconnect.apple.com/login), [generate a new API key with Admin access](https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api) under **Users and Access**. + + You will need the name of the key, the key ID and the issuer ID on Bitrise. + + :::warning[Requirements] + + - The API key must be [a team API key](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api#Generate-a-Team-Key-and-Assign-It-a-Role). An individual API key won't work. + + ![apple-app-store-connect.png](/img/_paligo/uuid-b104fac1-d553-69d3-ebcb-b8260e8a3595.png) + - The API key must be set up with the **Admin** role on the App Store. Your builds will fail otherwise. + - On Bitrise, you must be a workspace **Owner** or **Manager** to be able to add the API key data. For more information, check out [Workspace-level roles](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces/workspace-level-roles). + + ::: +1. On Bitrise, select your workspace from the dropdown menu and go to **Settings**. +1. On the left, select **Integrations**. +1. Select **App Store Connect**. +1. Click **Add API key**. + + :::note[Required roles] + + If you can't see the button, it's because you only have a **Viewer** or **Contributor** role in the workspace. You need to be either an **Owner** or a **Manager**. + + For more information, check out [Workspace-level roles](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces/workspace-level-roles). + + ::: + + ![api-key-app-store.png](/img/_paligo/uuid-1bbd8347-eb11-4439-9ece-315d004d74fe.png) +1. Fill out all required fields: + + - **Name**: Your generated API key's name. + - **Issuer ID**: To get your issuer ID, log in to App Store Connect and select **Users and Access**, then select the **API Keys** tab.The issuer ID appears near the top of the page. To copy the issuer ID, click **Copy** next to the ID. + - **Key ID**: When you successfully generate a new API key, App Store Connect shows you the key ID. + + ![api-key-dialog.png](/img/_paligo/uuid-22e6048e-7f47-9480-fea3-958eb9a0348b.png) +1. Upload the `.p8` file: either drag and drop it to the upload field, or click it and select the file from your computer. +1. Click **Connect**. + +Once done, you can now assign this API key to any app that you have access to on this account. From then, the app will use that API connection to access App Store Connect. diff --git a/src/partials/adding-apple-id-authentication-data-on-bitrise.mdx b/src/partials/adding-apple-id-authentication-data-on-bitrise.mdx new file mode 100644 index 0000000..4db4832 --- /dev/null +++ b/src/partials/adding-apple-id-authentication-data-on-bitrise.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding Apple ID authentication data on Bitrise + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. On the left menu bar, select **Apple Service connection**. +1. Click the **Add connection** button. +1. Provide your **Apple ID** and **Password** in the popup window. Click **Connect**. +1. Enter your **verification code** in the **Two factor authentication** window. +1. Add the **app-specific password**. Click **Verify** to continue. +1. You will be prompted to provide your verification code. +1. Your authentication expires in 30 days and you will have to authenticate again. When that happens, go to the **Apple Service connection** page, it will automatically ask for the two-factor authentication (2FA) code to authenticate again. There will be a list of the Apple Developer accounts that you have defined. To the far right of the Apple ID connection, there are 3 dots. Click the dots and select **Re-authenticate** (**2SA/2FA**). +1. Continue with Assigning an Apple Developer Account for your app. diff --git a/src/partials/adding-bitrise-as-a-relying-party-trust-to-ad-fs.mdx b/src/partials/adding-bitrise-as-a-relying-party-trust-to-ad-fs.mdx new file mode 100644 index 0000000..8c7a365 --- /dev/null +++ b/src/partials/adding-bitrise-as-a-relying-party-trust-to-ad-fs.mdx @@ -0,0 +1,71 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding Bitrise as a relying party trust to AD FS + +Once you are finished with exporting the certificate, you can continue with adding Bitrise as a [relying party trust to AD FS](https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/create-a-relying-party-trust). The Add Relying Party Trust Wizard guides you through the steps. + +1. On AD FS, click **Relying Party Trust** on the left menu bar, then click **Relying Party Trust**. +1. Select **Add Relying Party Trust** under **Actions**. + + ![addreplyingpartytrust.jpg](/img/_paligo/uuid-2e8a2cfc-6fe9-cf2b-9b4a-b4ec2f051568.jpg) +1. On the **Welcome** page, select the **Claims aware** option and hit **Start**. + + ![claimsaware.jpg](/img/_paligo/uuid-d5eac9a8-1c74-efd6-459a-aaa24af4877a.jpg) +1. On the **Select Data Source** page, click the **Enter data about the relying party manually** option on the bottom of the page. Click **Next**. + + ![selectdatasource.jpg](/img/_paligo/uuid-7e451b81-22e3-0f16-af91-380ad8026de1.jpg) +1. On the **Specify Display Name** page, add a **Display name,** for example `MyCorp`. Click **Next**. + + ![specifydisplayname.jpg](/img/_paligo/uuid-a8509ed5-9cc9-8851-c8df-9d298c5ae3bc.jpg) +1. Specify a token encryption certificate on the **Configure Certificate** page is optional. Click **Next**. + + ![optionalconfigure.jpg](/img/_paligo/uuid-1042aa27-f21e-16e5-4065-4088112ae116.jpg) +1. On the **Configure UR**L page, select **Enable support for the SAML 2.0 WebSSO protocol** and copy paste the **Assertion Consumer Service URL (ACS URL)** from Bitrise to the **Relying party SAML 2. 0 SSO service URL** field on AD FS. Click **Next**. + + ![configureurl-1.jpg](/img/_paligo/uuid-a40d7228-e976-458e-0508-99ded152069c.jpg) +1. On the **Configure Identifiers** page, add `Bitrise` in the **Relying party trust identifier** field. Click **Add**, then hit **Next**. + + ![replyingidentifiers2.jpg](/img/_paligo/uuid-c920feb2-3a96-88d7-710a-27d3d4fcba1c.jpg) +1. Do not modify the default access control policy on the **Choose Access Control Policy** page so that everyone can access this SAML SSO connection. Click **Next**. + + ![permiteveryone.jpg](/img/_paligo/uuid-d6600b5b-3ad8-aee2-a28b-62f4ca2b1394.jpg) +1. On the **Ready to Add Trust** page, review the settings and click **Next**. + + ![readytoaddtrust.jpg](/img/_paligo/uuid-4033d0af-df38-8e77-9963-4812d259f9ad.jpg) +1. On the **Finish** page, tick the checkbox to edit claims issuance policy for Bitrise. Click **Close**. + + ![finish.jpg](/img/_paligo/uuid-974f5427-db6a-201d-a112-9bb8fee4ae7f.jpg) + +1. On AD FS, click **Relying Party Trust** on the left menu bar, then click **Relying Party Trust**. +1. Select **Add Relying Party Trust** under **Actions**. + + ![addreplyingpartytrust.jpg](/img/_paligo/uuid-2e8a2cfc-6fe9-cf2b-9b4a-b4ec2f051568.jpg) +1. On the **Welcome** page, select the **Claims aware** option and hit **Start**. + + ![claimsaware.jpg](/img/_paligo/uuid-d5eac9a8-1c74-efd6-459a-aaa24af4877a.jpg) +1. On the **Select Data Source** page, click the **Enter data about the relying party manually** option on the bottom of the page. Click **Next**. + + ![selectdatasource.jpg](/img/_paligo/uuid-7e451b81-22e3-0f16-af91-380ad8026de1.jpg) +1. On the **Specify Display Name** page, add a **Display name,** for example `MyCorp`. Click **Next**. + + ![specifydisplayname.jpg](/img/_paligo/uuid-a8509ed5-9cc9-8851-c8df-9d298c5ae3bc.jpg) +1. Specify a token encryption certificate on the **Configure Certificate** page is optional. Click **Next**. + + ![optionalconfigure.jpg](/img/_paligo/uuid-1042aa27-f21e-16e5-4065-4088112ae116.jpg) +1. On the **Configure UR**L page, select **Enable support for the SAML 2.0 WebSSO protocol** and copy paste the **Assertion Consumer Service URL (ACS URL)** from Bitrise to the **Relying party SAML 2. 0 SSO service URL** field on AD FS. Click **Next**. + + ![configureurl-1.jpg](/img/_paligo/uuid-a40d7228-e976-458e-0508-99ded152069c.jpg) +1. On the **Configure Identifiers** page, add `Bitrise` in the **Relying party trust identifier** field. Click **Add**, then hit **Next**. + + ![replyingidentifiers2.jpg](/img/_paligo/uuid-c920feb2-3a96-88d7-710a-27d3d4fcba1c.jpg) +1. Do not modify the default access control policy on the **Choose Access Control Policy** page so that everyone can access this SAML SSO connection. Click **Next**. + + ![permiteveryone.jpg](/img/_paligo/uuid-d6600b5b-3ad8-aee2-a28b-62f4ca2b1394.jpg) +1. On the **Ready to Add Trust** page, review the settings and click **Next**. + + ![readytoaddtrust.jpg](/img/_paligo/uuid-4033d0af-df38-8e77-9963-4812d259f9ad.jpg) +1. On the **Finish** page, tick the checkbox to edit claims issuance policy for Bitrise. Click **Close**. + + ![finish.jpg](/img/_paligo/uuid-974f5427-db6a-201d-a112-9bb8fee4ae7f.jpg) diff --git a/src/partials/adding-bitrise-to-azure-ad-as-a-new-application.mdx b/src/partials/adding-bitrise-to-azure-ad-as-a-new-application.mdx new file mode 100644 index 0000000..231f6a0 --- /dev/null +++ b/src/partials/adding-bitrise-to-azure-ad-as-a-new-application.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding Bitrise to Entra ID as a new application + +1. Log into [Microsoft Azure](https://azure.microsoft.com/en-us/) as an admin. +1. Click the **Azure Active Directory** icon on the **Azure services** page. + + ![azureactivedirstep2-1.jpg](/img/_paligo/uuid-bf8ba810-c8e2-5323-8d6b-30b9a030b59d.jpg) +1. Click **Enterprise applications** under **Manage**. + + ![enterpriseapps-1.jpg](/img/_paligo/uuid-39f030dd-13a5-7302-6200-44aa39114f17.jpg) +1. Click **New Application** to add Bitrise as a new app to your account. + + ![newapplication-jpg.jpg](/img/_paligo/uuid-fd697193-d536-bade-12f6-341e9ecb2df9.jpg) +1. Type `Bitrise` in the **What’s the name of your app?** field. The **Integrate any other application you don’t find in the gallery** button should be automatically selected. Hit **Create**. + + ![createyourownapp-1.jpg](/img/_paligo/uuid-4822cd7c-0379-35e2-9ab3-d483dc8c6355.jpg) + + You will find your newly created app listed on the **All Applications** page. +1. Click the **Bitrise** app to go to its **Overview** page. +1. Continue with configuring Bitrise as a SAML app. diff --git a/src/partials/adding-bitrise-to-okta.mdx b/src/partials/adding-bitrise-to-okta.mdx new file mode 100644 index 0000000..430670d --- /dev/null +++ b/src/partials/adding-bitrise-to-okta.mdx @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding Bitrise to Okta + +Bitrise is not an integrated app in Okta. You have to add Bitrise manually to Okta first, then you can configure SAML SSO on it. + +We will be jumping back and forth from the Bitrise Workspace account to Okta so make sure both pages are available. In practice this means the Workspace owner should be logged into Bitrise and the Okta admin should be logged into Okta. + +1. Log into Okta and click **Admin**. + + ![okta_2.png](/img/_paligo/uuid-1640f128-3b4d-356a-f7d0-5d40e60fa6b3.png) +1. From the left menu, select **Applications** under the **Applications** section. +1. Click on the **Create App Integration** button. + + ![app_integration_okta.png](/img/_paligo/uuid-aa579855-a0d6-a545-6a4f-24f543dd36ab.png) + + This opens the **Create a new app integration** window. +1. Select **SAML 2.0** option as the **Sign-in method** and click **Next**. + + ![create_new_app_integration.png](/img/_paligo/uuid-a52e93de-ff50-544e-c914-5aa20dbdeadd.png) +1. At the **General Settings** step, type Bitrise into the **App name** field. (Optionally, you can add an app logo if you wish.) Click **Next**. + + ![general_settings_okta.png](/img/_paligo/uuid-e0ec0de8-1ae0-a3e9-ea57-fb0fa50b58df.png) +1. Head over to your Bitrise Workspace and click the **Single Sign On** tab on the left menu. +1. Click the **Copy** button to copy the **Assertion Consumer Service URL (ACS URL)**. +1. Head back to Okta’s **Configure SAML** page and paste the copied URL from Step 7. to the **Single sign-on URL** input field. +1. Type Bitrise at the **Audience URI (SP Entity ID)**. + + You can download the Okta certificate file now, and paste its content or upload the file itself in the **SAML SSO provider certificate** field on your Bitrise Workspace’s **Single Sign-On** page. Even easier if you leave it for later as you will need to fill out the **Assertion Consumer Service URL (ACS URL)** on Bitrise anyway. You will fetch this while configuring Bitrise as a SAML app on Okta. Do not hit **Configure SSO** on the **Single Sing-On** page of Bitrise just yet. +1. Set the **Name ID format** to **EmailAddress**. + + ![saml_sso_config.png](/img/_paligo/uuid-26903c72-7c1d-66a1-37d7-15be1fbd6379.png) +1. Click **Next**. +1. Fill out the **Feedback** section. Hit **Finish**. +1. In **Applications**, go to the **Sign-on** tab, and click **Edit** next to **Settings**. +1. Scroll down to the **Credential Details** section, and make sure that **Application username format** is set to **Email**. + + ![credential_details_2.png](/img/_paligo/uuid-23aa2f50-cde3-e87d-c8bd-0c2b1d512540.png) +1. Click **Save**. + +Congrats! Bitrise has been successfully added to Okta as an app. diff --git a/src/partials/adding-custom-headers-to-outgoing-webhooks.mdx b/src/partials/adding-custom-headers-to-outgoing-webhooks.mdx new file mode 100644 index 0000000..9e93532 --- /dev/null +++ b/src/partials/adding-custom-headers-to-outgoing-webhooks.mdx @@ -0,0 +1,26 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding custom headers to outgoing webhooks + +You can add extra headers to your outgoing webhooks via the **Code** tab of the web interface. For example, if you have an API listening to the webhook, you can track the requests with API keys set as a custom header. + +You can add custom headers either when: + +- [Creating a new outgoing webhook](/en/bitrise-platform/integrations/webhooks/adding-outgoing-webhooks/adding-an-outgoing-webhook-to-an-app). +- Modifying an existing outgoing webhook by clicking the **Edit** button next to the URL. + +To add the header: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Integrations** and then go to the **Webhooks** tab. +1. In the **Outgoing webhooks** section, find your webhook and click the **Edit** button. + + ![edit-outgoing-webhook.png](/img/_paligo/uuid-73d46a9a-1191-00d2-578e-184d0bb3cb3d.png) +1. In the **Headers** section, add a key and a value. You need both to be able to save the header. +1. Click **Add header**. +1. Click **Update webhook**. diff --git a/src/partials/adding-individual-members-to-workspaces.mdx b/src/partials/adding-individual-members-to-workspaces.mdx new file mode 100644 index 0000000..38e6ae9 --- /dev/null +++ b/src/partials/adding-individual-members-to-workspaces.mdx @@ -0,0 +1,62 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding members to workspaces + +:::caution[Starter plan restrictions] + +On Starter plans, collaboration features for workspaces are not available. You have to add members on a project basis: [Adding outside contributor to a project](/en/bitrise-platform/projects/managing-user-access-to-a-project/adding-outside-contributor-to-a-project). + +::: + +You can invite people to a workspace if they have a Bitrise account. Workspace members can be assigned to the projects owned by the workspace. When inviting new members, you can: + +- Add users in bulk: You can invite as many members as the number of available seats on the workspace. +- Add them to all projects owned by the workspace, or just to particular projects. +- Assign them [user access roles](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) to manage their permissions on the project. When adding users in bulk, all of them will be assigned the same role. +- Add users to [global access groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups/global-access-groups): The invited users will have the same role on all projects owned by the workspace. You can't select specific projects when adding users this way. + +:::note[SAML SSO] + +Bitrise supports SAML SSO for your workspace. To learn more, check out [SAML SSO in Bitrise](/en/bitrise-docs-20/bitrise-platform/accounts/saml-sso-in-bitrise). + +Inviting a new member to a workspace with SAML SSO enforced is a different process: [Adding a new user to a Workspace with enforced SAML SSO](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise/adding-a-new-user-to-a-workspace-with-enforced-saml-sso). + +::: + +You can modify a member's user roles on projects at any time after inviting them. You can also add members to [workspace groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups/creating-groups-for-workspaces). + +To add individuals as a workspace member: + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Collaboration**. +1. On the **Members** tab, click **Add members**. +1. In the dialog box, find the **New members** section and add the email addresses of the people you want to invite. + + ![adding-users.png](/img/_paligo/uuid-e09eda1b-3f0e-58ce-ab3f-979d05e557e6.png) + + :::note[Workspace limits] + + You can't invite people who are already part of the workspace and the number of invitations can't exceed the available seats of the workspace. + + ::: +1. When done, click **Next**. It takes you to the **Project access** page. + + - **Admin access**: Grants access to all products, managing all aspects of selected projects with the project admin role. + - **Bitrise CI**: The user has access to Bitrise CI only, and it can be assigned [Bitrise CI roles](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + - **Release Management**: The user has access to Release Management only, and it can be assigned [Release Management roles](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). +1. If you toggle on a specific product instead of admin access, you will be prompted to select the projects for the user and its user roles on the selected projects. + + For Bitrise CI, you can select projects and assign a role to each project. You can also select the **All projects** option: in this case, the user will be added to [a global access group](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups/global-access-groups) with the selected role. + + For Release Management, you can select: + + - Specific projects. The group will be able to access all currently existing apps of the project but not all future apps. + - Specific Release Management apps: Select the already existing apps you want the group to have access to. +1. When finished with setting up roles, click **Done**. +1. Click **Confirm access** to finish the process. diff --git a/src/partials/adding-instructions-for-testers.mdx b/src/partials/adding-instructions-for-testers.mdx new file mode 100644 index 0000000..cf0e267 --- /dev/null +++ b/src/partials/adding-instructions-for-testers.mdx @@ -0,0 +1,34 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding instructions for testers + +You can set testing instructions for your testers for each installable artifact, let them know what's been added to a build and what you would like them to test. + +You can check the instructions on the build details page of an installable artifact and on the [public install page](/en/bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page). + +:::important[Editing access] + +Users with the following roles can edit the testing instructions: + +- Workspace owner +- Project admin +- Release Manager + +Users with the App tester role have read-only access. For more information about roles, see: [Release Management roles and permissions](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). + +::: + +To add testing instructions to an installable artifact: + +1. [Access the build details page](/en/release-management/build-distribution/distributing-builds-to-testers.html). + + You can also access the build details page from a notification email. +1. Find the **What to test** section, and click **Edit**. + + ![2025-09-04-rm-what-to-test.png](/img/_paligo/uuid-aac41e7c-0756-9d0b-d3a3-9fdf2db628dc.png) +1. Write a message to your testers, let them know what to test. + + The message has a limit of 4000 characters. +1. Click **Save changes**. diff --git a/src/partials/adding-members-to-a-workspace-group.mdx b/src/partials/adding-members-to-a-workspace-group.mdx new file mode 100644 index 0000000..7fe7dd2 --- /dev/null +++ b/src/partials/adding-members-to-a-workspace-group.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding members to a Workspace group + +You can add Workspace members to Workspace groups for more convenient management of Workspace members. Groups allow you to assign several members to project teams at the same time. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Collaboration** from the menu options. +1. Select the **Groups** tab. +1. Find the group you need and click the 3 dots to the right of the group to bring up the group dropdown menu. +1. Click on the **+ Add member** button. + + ![Add_member_new.png](/img/_paligo/uuid-642e1898-479a-7590-b0ae-3d3a5cc6b9c7.png) +1. Enter an email address or add an existing member to the group using the radio buttons in the dialogue box. + + - Select **Invite a new member to the Workspace** and enter an email address. Click **Send Invite** on the bottom to send the invitation. + - Select **Add an existing member** and select one of the existing Workspace members from the dropdown menu. Click **Add member** on the bottom to add the team member to the group. diff --git a/src/partials/adding-outside-contributor-to-a-project.mdx b/src/partials/adding-outside-contributor-to-a-project.mdx new file mode 100644 index 0000000..cb0f1b6 --- /dev/null +++ b/src/partials/adding-outside-contributor-to-a-project.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding an outside contributor to a project + +An outside contributor is a user who is assigned to a project but isn't [a member of the workspace](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration) that owns the project. To add outside contributors, your workspace must have them enabled. + +:::important[Admins and owners only] + +You need to be a project admin or a workspace owner to be able to add outside contributors to a project. + +::: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. From the menu on the left, select **Collaboration**. +1. Go to the **Contributors** tab. + + ![2025-08-05-project-settings.png](/img/_paligo/uuid-63ec803d-7551-ebbb-ca47-b3915c746ea2.png) +1. Click **Add Contributor**. +1. Select **Add outside contributor** +1. Type their email address and [select their role](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + + If they are not registered on Bitrise, we will send out an invitation email for them. +1. Click **Next**. +1. Configure product access by enabling one or more toggles and then selecting a role in the dialog. You have the option to grant universal access or to set roles on a product basis: + + - **Admin access** allows the contributor to manage all aspects of the project, including both the Bitrise CI configuration and the Release Management apps. Note that this gives full access to an outside contributor! + - Select a product to assign the contributor specific roles that only apply to that product. If the project doesn't have a [CI configuration](urn:resource:publication:94442) or a [Release Management app](urn:resource:publication:90740), the respective option won't be available. +1. Click **Confirm access**. diff --git a/src/partials/adding-steps-from-alternative-sources.mdx b/src/partials/adding-steps-from-alternative-sources.mdx new file mode 100644 index 0000000..d909ce1 --- /dev/null +++ b/src/partials/adding-steps-from-alternative-sources.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding Steps from alternative sources + +Generally, we recommend using Steps that are part of the official Bitrise Step Library. But you can add Steps from other sources, if you want to: you can use either a Git URL or a local path. + +On the Bitrise website, the `git::` special source is the easiest way to use a Step that is not in the Bitrise Step Library. Let’s see how. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Configuration YAML** from the navigation menu. +1. Add the git URL of the Step you want to use. + + In this example, we’re adding the Script Step from a git source: + + ``` + - git::https://github.com/bitrise-io/steps-script.git@1.1.3: + ``` +1. Click **Save**. diff --git a/src/partials/adding-steps-in-the-workflow-editor.mdx b/src/partials/adding-steps-in-the-workflow-editor.mdx new file mode 100644 index 0000000..1ff873e --- /dev/null +++ b/src/partials/adding-steps-in-the-workflow-editor.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding Steps in the Workflow Editor + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Click the **+** symbol between two Steps to insert a Step at that position. +1. Search for the Step you need. + + :::important[Search filter] + + Be aware of the filter to the right of the search field. By default, the filter is set to the platform type of your app. For example, if you want to add a Step to an iOS app, the the search will be filtered to iOS Steps. Click **ALL** to search among all Steps. + + ::: +1. Click the Step to add it to the Workflow. diff --git a/src/partials/adding-the-identity-provider-sign-on-url.mdx b/src/partials/adding-the-identity-provider-sign-on-url.mdx new file mode 100644 index 0000000..4db43d1 --- /dev/null +++ b/src/partials/adding-the-identity-provider-sign-on-url.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding the identity provider sign-on URL + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. Go to the **Single Sign-on** tab. +1. Add the **Identity provider sign-on URL** from AD FS in the **SAML SSO provider Single Sign-On URL (SSO URL)** field. + + For example, a valid value is `https://.com/adfs/ls`. diff --git a/src/partials/adding-the-project.mdx b/src/partials/adding-the-project.mdx new file mode 100644 index 0000000..3101f7c --- /dev/null +++ b/src/partials/adding-the-project.mdx @@ -0,0 +1,72 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding the project + +1. Go to the [Create New project from CLI](https://project.bitrise.io/dashboard/add-project-from-cli) page. + + You can reach this page from your [Dashboard](https://project.bitrise.io/dashboard/builds): click the **Add new project** button on the right, and then select **Add New project from CLI**. + + ![2025-12-10-adding-project-with-cli.png](/img/_paligo/uuid-a6c8e931-615c-8697-8cf6-ab8d5269420b.png) +1. Set the account that will own the project, and the privacy of the project. +1. Copy the curl command you find there. + + ![2025-12-10-cli-project-choice.png](/img/_paligo/uuid-8ca5abc9-91d0-2f49-c804-dd8b60f92c39.png) +1. Open a command line interface. +1. Change the directory to your project’s location. +1. Paste the curl command and hit Enter. +1. Select the repository URL: choose the `SSH` option. + + This prompt only comes up if your local repository’s remote has an SSH URL. If the remote repository has an HTTPS URL, you won’t see this prompt. + + ``` + Remote URL: git@github.com:example-user/example.git + + ? Select repository URL:: + https://github.com/example-user/example.git + > ssh://git@github.com:example-user/example.git + ``` +1. Register an SSH key. + + ``` + Specify how Bitrise will be able to access the source code: + > Automatic + Add own SSH + ``` + + You can select either the automatic registration or choose to add your own. + + - If you choose automatic, Bitrise will automatically generate a key pair. If you need to use additional private repositories or submodules, choose the I need to option when prompted and follow the instructions. If not, select the No, auto-add SSH key option: this automatically adds the public key to your repository. + - If you choose to add your own, you have to provide the path to the SSH key file: either enter it manually, or drag and drop the file, as that will input the path. +1. Decide what `bitrise.yml` file you want to upload. + + ``` + ? What bitrise.yml do you want to upload? + > Run the scanner to generate a new bitrise.yml + Use the bitrise.yml found in the current directory or specify manually + ``` + + You can either have the scanner generate one based on your project files or you can provide a file. If your repository already contains a `bitrise.yml` file, the path to it will be automatically filled in. +1. Select the branch you want to use. + + The default option is the current active branch. + + ``` + The current branch is: master (tracking: origin master), + + ? Do you want to run the scanner for this branch? + > Yes + No + ``` + + If you select `No`, you will be prompted to check out the branch you wish to use, and then hit Enter again so the scanner can start. + + Once the scanner is done, it will either detect your project’s type or it will switch to manual configuration. Manual configuration means you have to select the type of your project (iOS, Android, React Native, Flutter, and so on) and you have to provide the path to the relevant configuration file. For example, a `config.xml` in the case of an Ionic project. In this guide, we’ll proceed with automatic detection. +1. Select the stack you want to use. + + If the scanner detects your project type, a stack will be automatically recommended but you can change it in the CLI if you want to. If you performed manual configuration as described above, you will have to choose the stack, too. +1. Finish the process with setting up webhooks and code signing files. + + - You can decide to skip webhook registration but it’s required to automatically trigger builds on Bitrise. For more information: [Webhooks](/en/bitrise-platform/integrations/webhooks) + - You can upload code signing files: depending on your project’s type, you will be asked if you want to upload iOS code signing files and/or an Android keystore file. You can upload these files any time on the website. diff --git a/src/partials/adding-users-groups-to-the-app-on-azure-ad.mdx b/src/partials/adding-users-groups-to-the-app-on-azure-ad.mdx new file mode 100644 index 0000000..dda1db0 --- /dev/null +++ b/src/partials/adding-users-groups-to-the-app-on-azure-ad.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding users/ groups to the app on Entra ID + +Before setting up SAML to the app, you have to add all the users/groups to the app in Entra ID who will use SAML SSO to log into the Bitrise Workspace. In other words, every Bitrise Workspace member must be added as user in Entra ID. + +1. Select **Users and groups** from the left menu. +1. Click **+ Add user/group**. + + ![azureuser1-1.jpg](/img/_paligo/uuid-f90189a9-c8f8-0720-69f3-b02983eb74f3.jpg) +1. On the Users page of **Add Assignment**, select users from the list and click **Select**. Once it’s done, you can select a role for users under the **Select a role** dropdown. + + ![azureuser2-1.jpg](/img/_paligo/uuid-ea5d2cad-6d99-e1e7-e389-6cb1c2170256.jpg) +1. On the **Add Assignment** page, click **Assign** to finish adding users. + + ![azureuser3b-1.jpg](/img/_paligo/uuid-ee6c9c9d-82a3-5470-9e0d-f5dd4f971414.jpg) diff --git a/src/partials/adding-workspace-groups-to-a-project.mdx b/src/partials/adding-workspace-groups-to-a-project.mdx new file mode 100644 index 0000000..f95d83f --- /dev/null +++ b/src/partials/adding-workspace-groups-to-a-project.mdx @@ -0,0 +1,68 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding Workspace groups to a project + +Assigning a workspace group to a project means that all members of that workspace group will have the same role on the project. Roles are different based on product access: both [Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) and [Release Management](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions) have their own roles. + +**An project consisting of workspace groups** + +Let’s say the workspace called *TestSpace* owns a project called *TestProject*. *TestOrg* has the following groups: + +- **Group Alpha**: they are assigned to *TestProject* with an **Admin** role. Members of this group can assign other groups to the project or add outside contributors, change project settings, manage roles and Workflows. +- **Group Beta**: they are assigned to *TestProject* with a **Developer** role. Members of this group can run builds, view build logs and view builds. +- **Group Gamma**: they are assigned to *TestProject* with a **Tester/QA** role. They can only view builds. + +There are two ways to assign workspace groups to a Bitrise project: + +- You can assign it from the **Collaboration** menu of the **Workspace settings** page. +- You can assign it on the **Project settings** page of the project. + +### Assigning a group from the Workspace settings page + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Collaboration** then go to the **Groups** tab. +1. Choose the group you wish to assign, and click the dropdown menu indicated by the ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) symbol. + + ![2025-08-07-assign-group-from-workspace.png](/img/_paligo/uuid-42c797d6-13f2-d5b3-c183-c48546d78983.png) +1. Select **View details** and go to the **Projects** tab. +1. Click **Manage access**. +1. Configure product access by enabling one or more toggles and then selecting a role for your project in the dialog. You have the option to grant universal access or to set roles on a product basis: + + - **Admin access** allows the contributor to manage all aspects of the project, including both the Bitrise CI configuration and the Release Management apps. Note that this gives full access to an outside contributor! + - Select a product to assign the group specific roles that only apply to that product. If the project doesn't have a [CI configuration](urn:resource:publication:94442) or a [Release Management app](urn:resource:publication:90740), the respective option won't be available. + + ![2025-08-07-access-in-rm-dialog.png](/img/_paligo/uuid-5b7fd557-dadc-4d73-eaa5-39119cd3b63f.png) + + :::tip[Role cheatsheets] + + You can check out the role cheatsheets here: . + + - [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci) + - [Release Management roles and permissions](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions) + + ::: +1. Click **Save changes** to finalize changes. + +### Assigning a group from the Project settings page + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Collaboration**. +1. Go to the **Groups** tab. +1. Click on **Add group**. +1. In the dropdown menu, select the group you need then click **Next**. + + ![2025-08-07-add-group-to-project.png](/img/_paligo/uuid-4023a0e5-a889-7041-05ab-f31969f8e898.png) +1. Configure product access by enabling one or more toggles and then selecting a role in the dialog. You have the option to grant universal access or to set roles on a product basis: + + - **Admin access** allows the group members to manage all aspects of the project, including both the Bitrise CI configuration and the Release Management apps. + - Select a product to assign the group specific roles that only apply to that product. If the project doesn't have a [CI configuration](urn:resource:publication:94442) or a [Release Management app](urn:resource:publication:90740), the respective option won't be available. +1. Click **Confirm access**. diff --git a/src/partials/adding-your-first-project.mdx b/src/partials/adding-your-first-project.mdx new file mode 100644 index 0000000..2b32640 --- /dev/null +++ b/src/partials/adding-your-first-project.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding your first CI project + +Watch the walkthrough to get set up with your first CI project on Bitrise, or follow the step-by-step guide below. + +After signing up, select **Bitrise CI** on the **Welcome** screen. + +![gettingstarted.png](/img/_paligo/uuid-4f8203e0-c79b-b9ec-7537-53e96b0f1924.png) + +:::note[First workspace] + +Bitrise automatically creates your first [workspace](/en/bitrise-platform/workspaces/workspaces-overview). You need at least one workspace to be able to add projects and run builds. Your subscriptions are also tied to your workspaces. + +::: + +On the **Bitrise CI** page, click **New CI project**. + +![get-started-ci-page.png](/img/_paligo/uuid-a286382b-396d-e852-1b7e-7aa8006f29ef.png) + +Follow the instructions to add your project. During the process, you will: + +1. [Configure repository access](/en/bitrise-platform/repository-access/repository-access-with-oauth). +1. Set up authentication, if necessary: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). We recommend using the GitHub app for authentication, however: [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration). +1. Set up a default branch. Bitrise will build from this branch unless your configuration specifies a different one. +1. Choose between manual configuration or automatic configuration. Automatic configuration means the project scanner scans your repository and identifies your project type. Based on the project type, a configuration is generated. +1. [Register a webhook](/en/bitrise-platform/integrations/webhooks.html). Webhooks allow you to automatically trigger builds. + +After you’ve completed these steps, Bitrise will kick off your first build and you can watch it running in real time. diff --git a/src/partials/additional-flutter-content.mdx b/src/partials/additional-flutter-content.mdx new file mode 100644 index 0000000..1a1acd5 --- /dev/null +++ b/src/partials/additional-flutter-content.mdx @@ -0,0 +1,10 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Additional Flutter content + +- [Building Android apps with Flutter modules](https://support.bitrise.io/hc/en-us/articles/360015714357) +- [Flutter Test Step freezes on "Waiting for another flutter command to release the startup lock..."](https://support.bitrise.io/hc/en-us/articles/360015714217) +- [Reducing build time for Flutter apps](https://support.bitrise.io/hc/en-us/articles/360020722937) +- [Could not resolve package dependencies in Flutter](https://support.bitrise.io/hc/en-us/articles/360019760178) diff --git a/src/partials/additional-linked-repositories-for-github-enterprise-server-integration.mdx b/src/partials/additional-linked-repositories-for-github-enterprise-server-integration.mdx new file mode 100644 index 0000000..21cb1df --- /dev/null +++ b/src/partials/additional-linked-repositories-for-github-enterprise-server-integration.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Additional linked repositories for GitHub Enterprise Server + +You can link additional repositories to a project that uses GitHub Enterprise Server. Linking a repository means giving the project access to multiple repositories in addition to the [default repository](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). + +You can read about configuration details here: [Additional linked repositories](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories). diff --git a/src/partials/additional-linked-repositories.mdx b/src/partials/additional-linked-repositories.mdx new file mode 100644 index 0000000..6d5f86e --- /dev/null +++ b/src/partials/additional-linked-repositories.mdx @@ -0,0 +1,91 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Additional linked repositories via a GitHub App + +:::tip[Using the API] + +This section describes how to configure the feature on the Bitrise website. You can also configure it via the Bitrise API: [GitHub app configuration API](/en/bitrise-ci/api/github-app-configuration-api). + +::: + +Each Bitrise project has a primary Git repository. This is where your project's code is stored and this repository is cloned when we start a build. By default, a Bitrise project can't access other repositories. + +However, your project might require other repositories. For example, it might have private submodules that it must access during a build. If you use the GitHub App, you can do this via linking additional repositories. The feature is available on both GitHub Cloud and GitHub Enterprise Server. + +:::note[Other connection methods] + +If you are not using the Bitrise GitHub App, you can still configure access to additional repositories: [Apps with submodules or private repo dependencies](/en/bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies). + +::: + +A linked repository is a repository that a Bitrise project can access using a GitHub App installation but it's not the project's primary repository. + +When running a build of a project connected via a GitHub App installation, Bitrise generates a temporary token that, by default, can only access the primary repository. Once an additional repository is linked, the tokens generated for the build can access the additional repository. + +To be able to link a repository, all of the following conditions must be met: + +- The GitHub App is installed to the account or organization that owns the repository on GitHub. +- The app installation is enabled for the repository. +- The user attempting to link the repository can access the repository on GitHub. If your GitHub user account doesn't have access to a repository, you can't link it on Bitrise. + + :::note[GitHub Enterprise Server] + + If you use a GitHub App to connect to a [GitHub Enterprise Server](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise) instance, the app doesn't check user access. You can link any repository that your GitHub App has access to. + + ::: + +### Linking additional repositories + +To link additional repositories to a project with an established GitHub App connection: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Repository**. +1. Under **Authorization**, find the **Additional repositories** card and click **Change**. +1. In the **Enable additional repositories** dialog, select the repositories you want to link. + + ![SCR-20260331-pmhi.png](/img/_paligo/uuid-324a0ec5-3e09-e10f-9e9e-7ae1359ffdc2.png) + + You can link a maximum of 50 additional repositories. + + You will see a list of repositories. To see a repository on the list: + + - On GitHub Cloud, your GitHub user needs to have access to it. If you use [GitHub Enterprise Server](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise), user permissions are not checked. + - The GitHub App installation has access to it. + + :::important[Disabling repositories] + + If you already have repositories linked, please note that users who otherwise don't have access to those repositories can disable them but cannot add them back! + + ::: +1. When done, click **Save changes**. + +### Linking all repositories automatically + +GitHub organization owners can switch the **Grant access to all current and future repositories** toggle so that Bitrise builds can have access to every GitHub repository your GitHub App is allowed to access, including any new repositories added in future. + +To successfully use this functionality: + +- For security reasons, you have to be logged in as a Bitrise user who is also the GitHub **owner** of your organization. If you aren't the owner, ask the owner to log in to Bitrise and toggle the feature on. +- Make sure you configured the GitHub App to have access to necessary repositories. + +1. On Bitrise, go to the **Project Settings** page of your project. +1. On the left, select **Repository**. +1. Under **Authorization**, find **Additional repositories** and click **Change**. +1. Toggle the **Grant access to all current and future repositories** switch to the right. + + ![linkadditionalrepositories.png](/img/_paligo/uuid-bfc425a6-84a8-0672-31bb-d3d7b07b56ce.png) + + Your project's build will now have access to all current and future GitHub repositories the Bitrise GitHub App has access to. + +:::note[GitHub email notification about allowing permission] + +When Bitrise released this feature, Bitrise GitHub App users will have received an email from GitHub on a new permission which is needed to use the Grant access to all current and future repositories toggle. Bitrise GitHub App requests additional permission which is called: read organization membership. Only GitHub organization ownershave the necessary rights to follow the link in the email and to make this functionality available for their teams. + +This is a standard and legitimate message from GitHub and allowing this permission will not have any detrimental effect on Bitrise builds. You can read more about the new permission Bitrise requires [here](https://docs.github.com/en/rest/orgs/members?apiVersion=2022-11-28#get-organization-membership-for-a-user). + +::: diff --git a/src/partials/admins.mdx b/src/partials/admins.mdx new file mode 100644 index 0000000..640ed46 --- /dev/null +++ b/src/partials/admins.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Admins + +Here’s the role cheatsheet for admins of a project's team: + +![admin-role.png](/img/_paligo/uuid-822f879a-7f22-981d-d28f-55c91311b281.png) + +A project admin cannot delete a project but can invite other members to work on the project in two ways: + +- They can add workspace groups to the project team: [Adding Workspace groups to a project](/en/bitrise-platform/projects/managing-user-access-to-a-project/adding-workspace-groups-to-a-project). +- They can invite outside contributors to the team: [Adding outside contributor to a project](/en/bitrise-platform/projects/managing-user-access-to-a-project/adding-outside-contributor-to-a-project). + +The admin can also give admin rights to other users. However, they cannot transfer ownership of the project: only Owners can do that. + +Admins are able to manage the project's contributors and their roles, including [Release Management](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions) roles, such as Release Manager and App Tester. diff --git a/src/partials/advanced-configuration-options.mdx b/src/partials/advanced-configuration-options.mdx new file mode 100644 index 0000000..437a2ae --- /dev/null +++ b/src/partials/advanced-configuration-options.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Advanced configuration options for starting/scheduling builds + +If you choose **Advanced** in the **Build configuration** window, you have all the options available with **Basic**, and a few more: + +You can select a source type in the **Source** dropdown menu. In addition to the default **Branch** option, you can also select: + +- **Git Tag**: Builds a particular branch or commit that is tagged with the Tag you enter. If you set this, you can't set a commit hash. + + :::important[Git Tags and commit hashes are conflicting options] + + You cannot specify both a Git Tag and a commit hash. When you set one, the other one will disappear. This ensures you cannot enter conflicting input values. + + ::: +- **Commit Hash**: Copy a specific commit’s hash here to build that particular commit. This option can even send a build status update to your git hosting service. If you set this, you can't set a Git Tag. + + :::note[Commit hash takes precedence over the Branch option] + + If the **Branch** option specifies a branch where the commit hash you chose doesn't exist, Bitrise will find the branch that does have the given commit and run a build with that branch. + + ::: + +![start-build-advanced.png](/img/_paligo/uuid-67f3a4f0-9315-bec3-0ea7-cca80d77b103.png) + +In addition to different sources, you can also add: + +- **Priority**: Determines the priority of your build in the build queue. The higher the number, the sooner your build will run. The priority must be an integer between -100 and 100. The default value is 0. For more information, check out [Build priority](/en/bitrise-ci/configure-builds/configuring-build-settings/build-priority). +- **Custom Environment Variables**: Create a custom Environment Variable that is used in the build. See [Setting a custom Env Var when starting a build](/en/bitrise-ci/configure-builds/environment-variables/setting-a-custom-env-var-when-starting-a-build). +- **Generated cURL command**: Based on the options you set in the Build configuration window, we provide an automatically generated cURL command. This can be copied and pasted, and you can run it on any platform that has cURL installed. diff --git a/src/partials/air-gapped-mode-for-the-controller.mdx b/src/partials/air-gapped-mode-for-the-controller.mdx new file mode 100644 index 0000000..dc7d117 --- /dev/null +++ b/src/partials/air-gapped-mode-for-the-controller.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Air-gapped mode for the controller + +In order to provide the core functionalities of Bitrise in AWS environment, both the controller and the build machines need to access the Bitrise Control Plane on three addresses: + +- https://cloud-controller-aws-internal.services.bitrise.io +- https://exec.bitrise.io +- https://build-log.services.bitrise.io + +Some additional quality-of-life features (like the build machine self-update or the external IP collection) require further communication with additional resources on different addresses. To achieve the maximum security in AWS, you can disable these extra functionalities by enabling the **Air-gapped network mode** during controller creation. + +Please note that this setting doesn't affect your AWS configuration. You need to ensure that the network you use is configured securely. diff --git a/src/partials/android-running-unit-and-ui-tests-in-parallel.mdx b/src/partials/android-running-unit-and-ui-tests-in-parallel.mdx new file mode 100644 index 0000000..2514689 --- /dev/null +++ b/src/partials/android-running-unit-and-ui-tests-in-parallel.mdx @@ -0,0 +1,34 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## (Android) Running unit and UI tests in parallel + +### Description + +Run unit tests and UI tests in parallel utilizing Pipelines. + +This Pipeline contains one Stage — `stage_unit_and_ui_test` — that executes two Workflows in parallel: + +1. `unit_tests`: This Workflow simply runs the unit tests of the given module and variant using the `android-unit-test` Step. +1. `ui_tests`: This Workflow builds the given module and variant using the `android-build-for-ui-testing`Step, spins up an emulator using the `avd-manager` Step, waits for the emulator to boot using the `wait-for-android-emulator` Step, and runs the UI tests using the `android-instrumented-test` Step. + + ![android_example2.png](/img/_paligo/uuid-573f2524-97b7-94ea-38d4-c76306fafa29.png) + +### Instructions + +1. Visit the [Create New App page](https://app.bitrise.io/apps/add) to create a new App. +1. When prompted to select a git repository, choose **Other/Manual** and paste the sample project repository URL (`https://github.com/bitrise-io/Bitrise-Android-Modules-Sample.git`) in the **Git repository (clone) URL** field. +1. Confirm that this is a public repository in the resulting pop-up. +1. Select the `main` branch to scan. +1. Wait for the project scanner to complete. +1. Enter `app` as the specified module. +1. Enter `debug` as the specified variant. +1. Continue through the prompts as normal — no changes are needed. +1. Open the new Bitrise project’s Workflow Editor. +1. Go to the **bitrise.yml** tab, and replace the existing yaml contents with the contents of the example `[bitrise.yml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-unit-and-ui-tests.md#bitriseyml)`. +1. Click the **Start/Schedule a Build** button, and select the `pipeline_unit_and_ui_test` option in the **Workflow, Pipeline** dropdown menu at the bottom of the popup. + +### bitrise.yml + +GitHub link: [https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-unit-and-ui-tests.md#bitriseyml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-unit-and-ui-tests.md#bitriseyml) diff --git a/src/partials/android-unit-test-sharding-by-module.mdx b/src/partials/android-unit-test-sharding-by-module.mdx new file mode 100644 index 0000000..beb8dc1 --- /dev/null +++ b/src/partials/android-unit-test-sharding-by-module.mdx @@ -0,0 +1,34 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## (Android) Unit test sharding by module + +### Description + +Run the unit tests of a modularized app in parallel Workflows utilizing Pipelines. + +This Pipeline contains one Stage — stage_unit_test — that executes two Workflows in parallel: + +1. `unit_test_app`: This Workflow runs the unit tests of the app module using the `android-unit-test` Step. +1. `unit_test_library`: This Workflow runs the unit tests of the `lib-example` module using the `android-unit-test` Step. + + ![android_example_3.png](/img/_paligo/uuid-fb91dae2-cdfe-d531-2559-c02a58915ce3.png) + +### Instructions + +1. Visit the [Create New App page](https://app.bitrise.io/apps/add) to create a new App. +1. When prompted to select a git repository, choose **Other/Manual** and paste the sample project repository URL (`https://github.com/bitrise-io/Bitrise-Android-Modules-Sample.git`) in the **Git repository (clone) URL** field. +1. Confirm that this is a public repository in the resulting pop-up. +1. Select the `main` branch to scan. +1. Wait for the project scanner to complete. +1. Enter `app` as the specified module. +1. Enter `debug` as the specified variant. +1. Continue through the prompts as normal — no changes are needed. +1. Open the new Bitrise project’s Workflow Editor. +1. Go to the **bitrise.yml** tab, and replace the existing yaml contents with the contents of the example `[bitrise.yml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-testing-unit-test-shards.md#bitriseyml)`. +1. Click the **Start/Schedule a Build** button, and select the `pipeline_unit_test` option in the **Workflow, Pipeline** dropdown menu at the bottom of the popup. + +### bitrise.yml + +GitHub link: [https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-testing-unit-test-shards.md#bitriseyml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-testing-unit-test-shards.md#bitriseyml) diff --git a/src/partials/annotating-a-build.mdx b/src/partials/annotating-a-build.mdx new file mode 100644 index 0000000..6ba330b --- /dev/null +++ b/src/partials/annotating-a-build.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Annotating a build + +To use annotations: + +1. Add a Step capable of running custom commands. + + For example, **Script** or **fastlane**. +1. Add a command to install the Bitrise Annotations plugin: + + ``` + bitrise plugin install https://github.com/bitrise-io/bitrise-plugins-annotations.git + ``` +1. Use the `annotate` command of the plugin to create your annotations. + + The command works in the following format: `bitrise :annotations annotate [markdown] [flags]`. This is a basic Markdown annotation in the default style: + + ``` + bitrise :annotations annotate "**My Annotation**" + ``` diff --git a/src/partials/api-authentication-for-apple-enterprise-users.mdx b/src/partials/api-authentication-for-apple-enterprise-users.mdx new file mode 100644 index 0000000..4cbbf49 --- /dev/null +++ b/src/partials/api-authentication-for-apple-enterprise-users.mdx @@ -0,0 +1,50 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## API key authentication for Apple Enterprise users + +Apple accounts that are part of the Enterprise developer program can also use API key-based authentication. + +If your Enterprise account still uses Apple ID authentication, we strongly recommend switching to API key authentication because: + +- It's more reliable and secure. +- It doesn't have to be re-authorized every 30 days. +- The Apple ID authentication method will be deprecated at some point. + +To change your authentication method: + +1. [Assign API key authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key/assigning-api-key-authentication-to-your-app) for your project(s) on Bitrise. Make sure to check the **This API key is used for the Apple Enterprise Program API** option for your API key during the process! + + ![api-key-enterprise.png](/img/_paligo/uuid-7dc1ff71-7abf-8c37-8117-a2f7abb13861.png) + + :::caution[Keep the Apple ID connection] + + We strongly recommend not to remove your Apple ID connection. If there are any issues with the API key connection, you can safely roll back to Apple ID-based authentication. + + ::: +1. Adjust all Step inputs that use Apple ID authentication to access Apple services. The following Steps are affected: + + - **Xcode Archive & Export for iOS**: version 5.3.0 and above. The `automatic_code_signing` input should be set to `auto` or `api-key`. + - **Xcode Build for Testing**: version 3.1.0 and above. The `automatic_code_signing` input should be set to `auto` or `api-key`. + - **Manage iOS Code Signing**: version 2.1.0 and above. The `apple_service_connection` input should be set to `auto` or `api-key`. + - **Export iOS and tvOS Xcode archive**: version 4.6.0 and above. The `automatic_code_signing` input should be set to `auto` or `api-key`. + +### Multiple API keys for the same project + +You can only set up one API connection for each project on the Bitrise website. That means the project can handle the code signing files of only one Apple developer team: API keys only give authorization to a single developer team. + +![api-key-chart.png](/img/_paligo/uuid-ea47d90b-0ff0-7cd5-2f80-4013e10f7fb3.png) + +If your Bitrise project needs to handle the code signing of multiple developer teams, you can pass additional API keys as Step inputs. Doing so overrides the Bitrise-managed API connection. The following inputs are available to all Steps that can access Apple services: + +- `api_key_path`: This can be a local file path or a download URL. You can use the Bitrise project’s file storage (Project settings/Files) to store and get a download URL for the API Keys. +- `api_key_id`: Private key ID. You can find the key ID for each API key on App Store Connect. +- `api_key_issuer_id`. The private key issuer ID. You can find the issuer ID for each API key on App Store Connect. +- `api_key_enterprise_account`: Use it to indicate whether the API key belongs to an account that is part of the Apple Enterprise developer program. Takes two values: `yes` and `no`. + +:::note[Inputs on the GUI] + +On the graphical UI of the Bitrise Workflow Editor, you can find these inputs under the **App Store Connect connection override** input group on the **Configuration** tab of each Step that can access Apple services. + +::: diff --git a/src/partials/app-center-build-service-and-bitrise-builds.mdx b/src/partials/app-center-build-service-and-bitrise-builds.mdx new file mode 100644 index 0000000..21546f1 --- /dev/null +++ b/src/partials/app-center-build-service-and-bitrise-builds.mdx @@ -0,0 +1,53 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## App Center Build service and Bitrise builds + +The App Center Build service helps you build your apps using a secure cloud infrastructure. A Bitrise build works the same way: you can [connect a repository](/en/bitrise-platform/repository-access/repository-access-with-oauth) to our service and build your project every time a code event happens in the repository. + +Bitrise supports multiple mobile frameworks, including iOS, Android, React Native, Flutter, Ionic, and Cordova. When [adding a new project](/en/bitrise-ci/getting-started/adding-a-new-project.html), we automatically detect your framework and set up a configuration best suited for that particular framework. + +### Repository connections + +Bitrise supports connections to multiple code repository services: + +- GitHub +- GitLab +- Bitbucket +- Azure DevOps +- Deveo +- Gogs +- Assembla + +For most cases, you can use OAuth connections and [SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) to set up repository access. [HTTPS authorization](/en/bitrise-platform/repository-access/configuring-https-authorization-credentials) is also supported. + +### GitHub App + +Just like App Center, Bitrise offers a [GitHub App](/en/bitrise-platform/repository-access/github-app-integration) to integrate your Bitrise Workspace to a GitHub account or organization. With the GitHub App, you can: + +- Connect Bitrise to GitHub without using an SSH key. +- Improve code security: the app relies on short-lived one-time tokens for access. +- [Link multiple repositories](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories) to the same project. +- Report your build status to GitHub. + +### Configuring your build + +On App Center, your build configuration is tied to the branches of your repository. On Bitrise, these are separate: the build configuration is independent of the branches of the repository. The process generally works like this: + +1. You set up a build configuration: create [Workflows and Pipelines](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and configure the Steps inside them. Your configuration is stored in YAML format but you can create and modify it using the graphical Workflow Editor. You can also set up [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) on the project level or on Workflow level. +1. You create [automatic build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html): define the code events that should automatically start Bitrise builds. In addition to simple code push, you can create triggers for pull requests and Git tags. And you have further, more granular control: for example, you can configure a trigger that only starts a build if a certain file has changed in a pull request. You can also specify a branch or branches for a trigger so that only code events on the specified branch trigger a build. +1. You select the [stack](/en/bitrise-build-hub/infrastructure/build-stacks.html) and the [machine type](/en/bitrise-build-hub/infrastructure/build-machine-types.html) of your build. +1. On the **Project settings** page, you can configure additional options for your builds: + + - Set up [build notifications](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.html). + - Set up [rolling builds](/en/bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.html). + - Configure [connection to services](/en/bitrise-platform/integrations/apple-services-connection.html) such as App Store Connect or Google Play to ensure your builds can can always access them. + - Upload [code signing](/en/bitrise-ci/code-signing/ios-code-signing.html) files or any other files that your builds need. + - Configure or download your [build cache](/en/bitrise-ci/dependencies-and-caching/key-based-caching.html). + +### Running a build + +Just like on App Center, every Bitrise build runs in a clean virtual machine that is discarded once the build is finished while generated artifacts are stored on our servers. On Bitrise, you can also select your build stack: for example, you can always choose between several different versions of Xcode. And we're always aiming to make new Xcode versions available as soon as possible. + +You can [start builds manually](/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html), trigger them automatically, or [schedule them](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.html). Once a build has run, you can check out detailed, structured [build logs](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html). diff --git a/src/partials/app-center-orgs-and-bitrise-workspaces.mdx b/src/partials/app-center-orgs-and-bitrise-workspaces.mdx new file mode 100644 index 0000000..3dc0812 --- /dev/null +++ b/src/partials/app-center-orgs-and-bitrise-workspaces.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## App Center orgs and Bitrise Workspaces + +On App Center, your user account can own apps. Organizations are optional: App Center recommends creating an organization for any apps with multiple collaborators. + +A [Bitrise Workspace](/en/bitrise-platform/workspaces/workspaces-overview) is a little different: when you sign up for the first time, we automatically create your first Workspace, too. This is because only Workspaces can own Bitrise projects. Projects are not tied to your account but to Workspaces. A Workspace can own several projects but a project cannot be linked to multiple Workspaces. + +A Bitrise Workspace has three main roles: + +- **Owner**: The owner of the Workspace. Full administrative control over the Workspace without restrictions. A Workspace can have multiple Owners. The default Owner is the account that created the Workspace. +- **Manager**: The user can access and modify Workspace settings such as connected service accounts, can manage members but can't access billing details and can't delete the Workspace. +- **Viewer**: The user can't access Workspace settings and can't add new members or manage existing members. + +On App Center, you can create teams within organizations. On Bitrise, Workspace members can be added to Workspace groups: this makes it easier to assign multiple people to projects at the same time. diff --git a/src/partials/apple-service-permissions.mdx b/src/partials/apple-service-permissions.mdx new file mode 100644 index 0000000..c1ef4e3 --- /dev/null +++ b/src/partials/apple-service-permissions.mdx @@ -0,0 +1,76 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Apple service permissions + +In order to successfully connect Bitrise to Apple services, you need to set up the right roles and accesses in your Apple account for your Apple ID and your API keys. You must set up the appropriate access rights to be able to: + +- Use automatic code signing. +- Deploy your app to the App Store. + +The exact roles and accesses you need depend on a number of factors: your authentication method, whether you use Xcode managed signing, and the details of your app deployment process, among other things. + +In this guide, we'll list the roles based on the two main [authentication methods](/en/bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication.html): API key authentication and Apple ID authentication. + +### Required access with API key authentication + +To use Bitrise Steps with Apple API key authentication, you need to create an App Store Connect API key with the appropriate access level. The appropriate level depends on what you need to do. + +If, for example, you use Xcode managed signing in your project and wish to export the generated IPA file with a Distribution certificate and an App Store provisioning profile, the App Store Connect API key must have **Admin** access. + +[see topic](#table-idm453468966192643307311012755) contains the required access for automatic code signing. In the table, we grouped code signing actions based on the type of the IPA file we're attempting to export. There are two main types: + +- Development IPA: this is an IPA exported with the **development** method. +- Distribution IPA: this is an IPA exported with the **app-store**, **ad-hoc**, or **enterprise** distribution method. + +| Code signing action | Required access with Xcode managed signing turned ON | Required access with Xcode managed signing turned OFF | +| --- | --- | --- | +| Exporting Development IPA. This can include: - Creating development provisioning profiles. - Deleting development provisioning profiles. - Downloading provisioning profiles. - Registering and configuring App IDs. - Adding device UDIDs | Developer | Developer | +| Exporting App Store IPA. This can include: - Creating development and distribution provisioning profiles. - Deleting development and distribution provisioning profiles. - Downloading provisioning profiles. - Registering and configuring App IDs. - Adding device UDIDs | Admin | Developer | + +[see topic](#table-idm4592227514859233073690484859) contains the required roles for deploying your app to the App Store. + +For App Store deployment, the required access depends on how you wish to upload the generated IPA file. You can either: + +- Upload only the IPA without any additional steps. +- Upload the IPA with metadata and screenshots, and submit the app for review. + +| App Store deployment actions | Required access for API key | +| --- | --- | +| Uploading a new IPA without any metadata | Developer | +| Uploading a new IPA and: - Updating app metadata. - Uploading screenshots. - Submitting the app for App Store review. | App Manager | + +### Required access with Apple ID authentication + +To use Bitrise Steps with Apple ID authentication, you need to make sure that your Apple ID has the appropriate role in your Apple Developer team. + +[see topic](#table-idm4586984396859233078380696193) contains the necessary roles for using automatic code signing on Bitrise. In the table, we grouped code signing actions based on the type of the IPA file we're attempting to export. There are two main types: + +- Development IPA: this is an IPA exported with the **development** method. +- Distribution IPA: this is an IPA exported with the **app-store**, **ad-hoc**, or **enterprise** distribution method. + +Read more about the different distribution methods: [Creating a signed IPA for Xcode projects](/en/bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects). + +:::note[Xcode managed signing] + +If you use Apple ID authentication on Bitrise, Xcode managed signing is automatically turned off in your project. Instead, Bitrise uses its own automatic code signing logic. + +::: + +| Code signing action | Required role | +| --- | --- | +| Exporting development IPA. This can include: - Creating development provisioning profiles. - Deleting development provisioning profiles. - Downloading provisioning profiles. - Registering and configuring App IDs. - Adding device UDIDs | App Manager | +| Exporting an App Store IPA. This can include: - Creating development and distribution provisioning profiles. - Deleting development and distribution provisioning profiles. - Downloading provisioning profiles. - Registering and configuring App IDs. - Adding device UDIDs | App Manager | + +[see topic](#table-idm33307859636668) contains the required roles for deploying your app to the App Store. + +For App Store deployment, the required access depends on how you wish to upload the generated IPA file. You can either: + +- Upload only the IPA without any additional steps. +- Upload the IPA with metadata and screenshots, and submit the app for review. + +| App Store deployment actions | Required role for Apple ID | +| --- | --- | +| Uploading a new IPA without any metadata | Developer | +| Uploading a new IPA and: - Updating app metadata. - Uploading screenshots. - Submitting the app for App Store review. | App Manager | diff --git a/src/partials/apple-services-authentication-for-automatic-provisioning.mdx b/src/partials/apple-services-authentication-for-automatic-provisioning.mdx new file mode 100644 index 0000000..c35e06c --- /dev/null +++ b/src/partials/apple-services-authentication-for-automatic-provisioning.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Apple services authentication for automatic provisioning + +To take advantage of the Bitrise Steps that offer built-in, automated iOS code signing options, you need to set up [Apple service authentication](/en/bitrise-platform/integrations/apple-services-connection.html). For these Steps, you have two options. + +| Authentication method | How it works | When to use | +| --- | --- | --- | +| [API key authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html) (recommended) | You connect your App Store Connect account to Bitrise using an API key. | We recommend using this option unless you are using an account with Apple Developer Enterprise Program. If you do not receive the option to create an API key and the request access is greyed out, you need to contact your account holder to accept a license agreement with Apple to use API authentication. | +| [Apple ID authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.html) | You connect your Apple ID to Bitrise. If two-factor authentication is enabled on your Apple account, you will have to provide the App-specific password during this process. Your authentication expires in 30 days and you will have to refresh the connection. | You should only use this solution if: - You cannot access API key for any reason. - you are using an account with Apple Developer Enterprise Program. You can also consider using [manual provisioning](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning). | diff --git a/src/partials/apple-two-factor-authentication-requirements.mdx b/src/partials/apple-two-factor-authentication-requirements.mdx new file mode 100644 index 0000000..5622db8 --- /dev/null +++ b/src/partials/apple-two-factor-authentication-requirements.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Apple two-factor authentication requirements + +Apple’s [two-factor authentication](https://developer.apple.com/support/authentication/) (2FA) provides an extra layer of security on your Apple account. + +If you have been authenticating with the API key so far, you are not affected by the two-factor authentication requirement. + +If, however, you have been authenticating with an Apple ID and a password, and the [new 2FA requirement](https://developer.apple.com/support/authentication/) affects you, then you’ll have to reconnect your Apple Developer Account on the **Apple Service connection** page of your Bitrise profile. You’ll also have to provide the two-factor authentication/two-step verification code and an app-specific password as well. Please find the official Apple documentation on [how to generate an app-specific password](https://support.apple.com/en-us/HT204397). diff --git a/src/partials/artifact-details.mdx b/src/partials/artifact-details.mdx new file mode 100644 index 0000000..8dccdba --- /dev/null +++ b/src/partials/artifact-details.mdx @@ -0,0 +1,26 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Artifact details + +You can check the details of any installable artifact (a binary, either an IPA or an APK/AAB file) generated by a Bitrise build. The details can potentially include: + +- The exact filename. +- The version of the binary. +- Metadata such as time of creation and file size. +- A QR code for installation. +- A link to the [public install page](/en/bitrise-ci/deploying/bitrise-ota-app-deployment/deploying-with-the-deploy-to-bitriseio-step) if it is enabled. + +To get to the details page, open the **Artifacts** page and select your file from the **Installable artifacts** list. + +![CrossPlatform.png](/img/_paligo/uuid-3a873c33-52fb-926c-64d7-faeb23df7e64.png) + +On the details page itself, the most important thing you can do is install the app on a mobile device. This is particularly useful for testing purposes. You have two options: + +- A QR code: scan it to install the binary. +- A link to the public install page. + +![qr-code-install.png](/img/_paligo/uuid-6a389697-3c42-fd18-6bfb-c5c854e695d3.png) + +Note that if you're trying to install an iOS app on a device, the device must be registered for the app on the Apple Developer Portal. You can see the available devices in the **Who can install this app?** section. diff --git a/src/partials/assigning-api-key-authentication-to-your-app.mdx b/src/partials/assigning-api-key-authentication-to-your-app.mdx new file mode 100644 index 0000000..36a1100 --- /dev/null +++ b/src/partials/assigning-api-key-authentication-to-your-app.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Assigning API key authentication to your project + +To use API key authentication for Apple services for your project, you must: + +- [Add an API key on Bitrise](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key/adding-api-key-authentication-data-on-bitrise): You can add multiple API keys to the same account. +- Assign an API key to your project: Each project can only have one API key assigned to it. + +To assign the API key to the project: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Integrations**. +1. Select the **Stores** tab. +1. Find the **App Store Connect** section. + + ![add-api-key-apple.png](/img/_paligo/uuid-95e5fcc6-46bd-1efe-69a0-538ef9c8c8cb.png) +1. Find the **API key authentication (recommended)** option. +1. Click **Add API key**. + + :::note[Multiple projects with the same API key] + + With the **Add API key** button, you can add a new App Store Connect API key to your Bitrise account. Other projects you have access to can use this API key, too. + + ::: +1. If your API key is an Apple Enterprise API key, check **This API key is used for the Apple Enterprise Program API**. + + ![api-key-enterprise.png](/img/_paligo/uuid-7dc1ff71-7abf-8c37-8117-a2f7abb13861.png) + +The Step is now able to connect to the App Store Connect or the Apple Developer Portal during your build. diff --git a/src/partials/assigning-apple-id-authentication-to-your-app.mdx b/src/partials/assigning-apple-id-authentication-to-your-app.mdx new file mode 100644 index 0000000..1943fb1 --- /dev/null +++ b/src/partials/assigning-apple-id-authentication-to-your-app.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Assigning Apple ID authentication to your app + +Connecting to an Apple service (such as the App Store Connect or the Apple Developer Portal) with Apple ID authentication requires that you first add your Apple service authentication data on bitrise.io and then assign your Apple credentials to the app. With this method, you don't have to worry about authentication when using Steps that connect to Apple services: all Step inputs related to Apple authentication are automatically filled in. + +:::important[Can't assign other users' Apple credentials] + +You can only set your own user account's Apple ID authentication data to an app. If you have an app that needs someone else's Apple credentials, that user must log in and make the change themselves. + +::: + +To assign Apple ID authentication data to your app: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Integrations**. +1. Scroll down to the **Connection to Apple services** section. +1. Find the **Apple ID authentication** option. + + ![add-api-key-apple.png](/img/_paligo/uuid-95e5fcc6-46bd-1efe-69a0-538ef9c8c8cb.png) +1. Click **Change to <username>**. + + If you can't find this option, you probably haven't set up your Apple credentials on bitrise.io. Note that changing the selected user removes the previous user. If you need to use the previous user's Apple credentials again, that user must log in and change it themselves. + +:::tip[Test connection] + +By clicking **Test connection**, you can check whether Bitrise can access Apple services using the provided credentials. + +::: + +Steps are now able to connect to an Apple service during your build. diff --git a/src/partials/authenticating-in-a-step-with-api-key.mdx b/src/partials/authenticating-in-a-step-with-api-key.mdx new file mode 100644 index 0000000..f4d7b79 --- /dev/null +++ b/src/partials/authenticating-in-a-step-with-api-key.mdx @@ -0,0 +1,45 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Authenticating in a Step with API key + + + + +1. Add one of the following Steps to your Workflow: + + - fastlane + - Deploy to App Store Connect with Deliver (formerly iTunes Connect) + - Deploy to App Store Connect - Application Loader (formerly iTunes Connect) + + :::caution[Either API key or Apple ID authentication in Step inputs] + + You can only add one type of authentication into the Step, either the API key one or the Apple ID one. In either case, make sure the **Bitrise Apple Developer Connection** input is set to `off`, otherwise the Step will go with the configured authentication method found in **Apple Service connection** (unless you decide to remove the connection on the **Teams** tab). + + ::: +1. Upload the API key to the **GENERIC FILE STORAGE** section of the **Code Signing & Files** tab. +1. Set the **Bitrise Apple Developer Connection** input to `off`. +1. Set the **Issuer ID** as a secret Environment Variable in the respective field of the Step. +1. Configure the **API Key path** and **API Issuer** inputs. +1. Save your changes and run a new build. + + + + +1. Add one of the following Steps to your Workflow: + + - Manage iOS Code Signing + - Xcode Archive & Export for iOS + - Export iOS and tvOS Xcode archive + - Xcode Build for testing for iOS +1. Upload your App Store Connect API private key file (.p8 file) to the **Generic File Storage** in the **Code Signing & Files** tab. +1. Set the **Automatic code signing method** to `api-key`. +1. Set the following Step inputs under the **App Store Connect connection override** input group: + + - **App Store Connect API private key**: Local path or remote URL to the private key (.p8 file) for App Store Connect API. Set this input to the automatically generated Env Var connected to the App Store Connect API private key file (.p8 file) you uploaded to the Generic File Storage in step 2. + - **App Store Connect API key ID**: Private key ID used for App Store Connect authentication. + - **App Store Connect API issuer ID**: Private key issuer ID used for App Store Connect authentication. + + + diff --git a/src/partials/authenticating-in-a-step-with-apple-id-and-password.mdx b/src/partials/authenticating-in-a-step-with-apple-id-and-password.mdx new file mode 100644 index 0000000..429236c --- /dev/null +++ b/src/partials/authenticating-in-a-step-with-apple-id-and-password.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Authenticating in a Step with Apple ID and password + +:::caution[Either API key or Apple ID authentication in Step inputs] + +You can only add one type of authentication into the Step, either the API key one or the Apple ID one. In either case, make sure the **Bitrise Apple Developer Connection** input is set to `off`, otherwise the Step will go with the configured authentication method found in **Apple Service connection** (unless you decide to remove the connection on the **Teams** tab). + +::: + +1. Add the Step to your Workflow. +1. Set the **Apple ID** and **Password**. +1. Set the **Bitrise Apple Developer Connection** input to `off`. +1. Save your changes and run a new build. diff --git a/src/partials/authentication-to-bitrise-with-oidc.mdx b/src/partials/authentication-to-bitrise-with-oidc.mdx new file mode 100644 index 0000000..0b776e4 --- /dev/null +++ b/src/partials/authentication-to-bitrise-with-oidc.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Authentication to Bitrise with OIDC + +Bitrise supports using external OIDC tokens to authenticate to Bitrise and receive short-lived Bitrise [workspace access tokens](/en/bitrise-platform/workspaces/workspace-api-token.html). The issued token will be matched against your Bitrise trust policy. + +A service that receives a Bitrise token essentially becomes a temporary member of your workspace that can perform certain actions defined in your trust policy. For example, it can receive data from a build triggered on a specific branch of a given repository. + +### Trust policy + +An OIDC trust policy defines who to trust, under what conditions, and how to validate the OIDC tokens. A Bitrise trust policy defines: + +- The OIDC issuers that Bitrise will trust. Claims from OIDC providers that aren't listed as issuers in our trust policy are automatically rejected. +- The duration of the short-lived token: how long it is valid. +- Its level of access: the roles and permissions it grants in workspaces and projects. +- The matching rules of the token: the claims that must be matched. For example, the claim can include the repository, the branch of the repository, the Workflow that should be triggered. The matching rules are in a JSON format. + +### OIDC token request + +After a policy is successfully created, Bitrise automatically generates a unique policy ID. This policy ID must be included in every token request. + +When a service sends an OIDC token to request a short-lived Bitrise workspace access token, Bitrise matches the policy ID in the request to the corresponding trust policy and checks that trust policy's matching rules. If the rules match the OIDC token's claims, the short-lived token is granted. diff --git a/src/partials/authentication-to-external-services-with-oidc.mdx b/src/partials/authentication-to-external-services-with-oidc.mdx new file mode 100644 index 0000000..2d209c7 --- /dev/null +++ b/src/partials/authentication-to-external-services-with-oidc.mdx @@ -0,0 +1,68 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Authentication to external services with OIDC + +OIDC enables your builds to authenticate to external systems (such as AWS, GCP, Azure, container registries, secret management or artifact stores) without embedding long-lived credentials in your Workflows. Bitrise can mint one or more identity tokens tied to a specific build, with claims such as a build number, commit hash, repository slug, app slug, or Workflow name. + +These tokens are: + +- Issued for a particular build interaction so third-party services can grant access scoped only to that run. +- Short-lived to minimize the consequences of potential exposure. +- Consumable by federated services that accept OIDC: for example, you can exchange a Bitrise OIDC token for temporary cloud credentials. + +### Request an identity token for your build + +To use an OIDC token to authenticate to a service from a Bitrise build, you need to fetch the token and then perform the credential exchange with the service. Bitrise offers Steps that handle parts of the process. + +#### Get OIDC Identity Token Step + +Use an OIDC token in your build for any service with the **Get OIDC Identity Token** Step. This Step lets your Workflows and Pipelines request temporary, auditable access to cloud resources or external services at runtime, without storing secrets in the repository or build configuration. + +Set the **Token audience** input to configure the Step. This could be the URL of the service you want to access with the token or a specific identifier provided by the service. + +![2025-11-12-get-oidc-token-step.png](/img/_paligo/uuid-aad02a5a-3899-01eb-0842-76bfcc14b1d4.png) + +The Step exports an Environment Variable with the key BITRISE_IDENTITY_TOKEN, containing the relevant information of the token. Use it to exchange credentials with the service you want to access. + +#### Dedicated Steps for specific services + +The **Get OIDC Identity Token** Step lets you fetch an OIDC token for any service but it doesn't perform the credential exchange for you. For some services, we have Steps that take the care of the whole process: + +- **Authenticate with Google Cloud Platform (GCP)**: Generates a Google auth token using a service account key, and authenticates to GCP. +- **Authenticate with Amazon Web Services (AWS)**: Generates an identity token based on an AWS IAM identity provider. You can read our full guide here: [OIDC for AWS](/en/bitrise-platform/integrations/oidc-authentication/oidc-for-aws). + +### Information in the OIDC token + +Bitrise includes the following information in the OIDC token: + +:::important[Limitation] + +As Bitrise is considered a generic identity provider, AWS keeps only two claims from our token: `aud` and `sub`. You can only use these in your policies. + +You can find more information about claim fields in the [AWS documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). + +::: + +| `Name` | `Description` | +| --- | --- | +| `aud` | Customizable audience field | +| `sub` | The subject that triggered the ID token creation It will be in the `app:APP_SLUG:workflow:WORKFLOW` format. | +| `exp` | The token expiration time | +| `iat` | The time of the token generation | +| `iss` | Who issued the token | +| `jti` | Token unique identifier | +| `nbf` | The current time | +| `sha` | Git commit hash | +| `repository_url` | The url of the app's associated git repo | +| `repository_owner` | The git repository owner | +| `repository_slug` | Git repository slug | +| `app_slug` | App slug | +| `workspace_slug` | Workspace slug | +| `trigger_by` | What entity triggered the build | +| `branch` | The branch that is getting built | +| `branch_dest` | PR target branch | +| `tag` | The tag which triggered the build | +| `build_number` | Build number | +| `workflow` | Name of the triggered workflow | diff --git a/src/partials/authentication.mdx b/src/partials/authentication.mdx new file mode 100644 index 0000000..4f74f2e --- /dev/null +++ b/src/partials/authentication.mdx @@ -0,0 +1,40 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Authentication + +Bitrise Build Hub requires either the Bitrise - Build Hub GitHub app or a [GitHub personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) to authenticate the runners and enable proper management of the GitHub Action workflows and runner configurations. + +We recommend using the GitHub app integration. + +### GitHub app authentication + +The Bitrise - Build Hub app can be installed to a GitHub account or a GitHub organization. The app can be scoped to access either: + +- All repositories: All current and future repositories owned by the resource owner. Includes public repositories. +- Select repositories: At least one repository must be selected. Build Hub won't be able to access other repositories owned by the same resource owner. + +The app has the following access rights: + +- Read access to actions, metadata, and organization events. +- Read and write access to organization self hosted runners. + +You can install the app to the GitHub account or organization of your choice when [creating a machine pool](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool). + +### GitHub personal access token + +You can use two types of tokens: + +- [Classic tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic) +- [Fine-grained access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token) + +The different token types require different access types, depending on your [target scope](/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/target-scope). Check out the table below to see the exact permissions for the respective target scopes: + +| Target scope | Required permission for a classic token | Required permissions for a fine-grained access token | +| --- | --- | --- | +| GitHub Enterprise (GHE) Cloud: https://github.com/enterprises/<enterprise> GHE Server: https://<hostname>/enterprises/<enterprise> | `manage_runners:enterprise` | Not supported | +| GitHub Cloud organization: https://github.com/<org> GHE organization: https://<hostname>/<org> | `org:admin` | `read/write` permission to **Self-hosted runners** | +| GitHub Cloud repository: https://github.com/<owner>/<repo> GHE repository: https://<hostname>/<owner>/<repo> | `workflow` | Not supported | + +[Create a personal access token](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-github-personal-access-tokens-for-build-hub) before [creating a machine pool](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool). diff --git a/src/partials/automating-the-codepush-update-release.mdx b/src/partials/automating-the-codepush-update-release.mdx new file mode 100644 index 0000000..f5fe2d8 --- /dev/null +++ b/src/partials/automating-the-codepush-update-release.mdx @@ -0,0 +1,49 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Automating the CodePush update release + +After creating a Workflow to generate and upload your CodePush updates, you have two ways of running it: + +- [Run the Workflow manually](/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html). +- [Triggering a build automatically](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) when a defined condition is met. For the available conditions, see [Supported trigger conditions](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers/supported-trigger-conditions). + +You can set up several different types of triggers to automate the process. Our example configuration uses a pull request trigger with a label: + +**Release a CodePush update when a pull request is opened to a specific branch** + +In this example, we're setting up a trigger where: + +- Bitrise looks for pull requests opened with `updates` as the target branch. +- The `codepush_update_deploy` Workflow is triggered when a pull request to the branch receives the `release-update` label to the PR. + +1. [Create the trigger](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers/creating-target-based-triggers): set up a pull request trigger with two conditions, `target_branch` and `label`: + + - Set `target_branch` to `updates`. + - Set `label` to `release-update`. + + :::tip[GUI config] + + You can set these up on the GUI of the Workflow Editor, too. Here we're showing you the YAML configuration. + + ::: + + ``` + format_version: "13" + default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + project_type: react-native + workflows: + codepush_update_deploy: + status_report_name: 'Executing for ' + description: | + Uploads Update Bundle to Bitrise CodePush Server + steps: + [...] + triggers: + pull_request: + - target_branch: updates + label: release-update + ``` +1. When you want to release CodePush updates, open a pull request to the `updates` branch. +1. After the PR has been reviewed and approved, add the `release-update` label to it. diff --git a/src/partials/availability-order-of-environment-variables.mdx b/src/partials/availability-order-of-environment-variables.mdx new file mode 100644 index 0000000..2947a9c --- /dev/null +++ b/src/partials/availability-order-of-environment-variables.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Availability order of Environment Variables + +Environment Variables (Env Var) are available after the Env Var is processed. + +There are Env Vars exposed by the Bitrise CLI. These are available from the start: for example, `BITRISE_SOURCE_DIR` and `BITRISE_TRIGGERED_WORKFLOW_ID`. + +All other Env Vars are processed and made available as the build progresses. + +The processing order is the following: + +1. Env Vars exposed by the Bitrise CLI. +1. [Secrets](/en/bitrise-ci/configure-builds/secrets.html): they are processed before a Workflow starts. +1. One-off Environment Variables specified for the build through our API. +1. App Environment Variables. +1. Workflow Environment Variables: when the processing of the specified Workflow starts, the Env Vars specified for that Workflow are made available. + + If the Workflow has Workflows [chained before or after it](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows.html), the Environment Variables of the chained workflows are processed and made available right before the first Step of the Workflow would run. +1. Step inputs: they are exposed for each Step, right before the Step would start. +1. Step outputs: they are exposed by the specific Step, so those are available for subsequent Steps after the Step finishes. diff --git a/src/partials/available-parameters-for-slack-commands.mdx b/src/partials/available-parameters-for-slack-commands.mdx new file mode 100644 index 0000000..4bd8169 --- /dev/null +++ b/src/partials/available-parameters-for-slack-commands.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Available parameters for your Slack command + +To trigger builds via Slack, you need to amend your Slash Command with parameters in a `key:value|key:value` format. + +You must specify at least one parameter: + +- `b` or `branch`. For example, `branch: main` +- `w` or `workflow`. For example, `workflow: run_tests` + +Without specifying either branch or Workflow in your command, the command will fail. + +The optional parameters allow further configuration of your build: + +- `t` or `tag`. For example, `branch: main|tag: v1.0` +- `c` or `commit`. For example, `workflow: run_tests|commit: eee55509f16e7715bdb43308bb55e8736da4e21e` +- `m` or `message`. For example, `branch: main|message: ship it!!` + +You can also send environment variables that will be available in your Workflow with the format: `env[KEY1]:value1|ENV[KEY2]:value2` + +**Slack command with all parameters included** + +The example includes all parameters, required and optional. It builds a specific commit and passes two Environment Variables to the build: + +- $DEVICE_NAME with the value of `iPhone 6S`. +- $DEVICE_UDID with the value of `82667b4079914d4aabed9c216620da5dedab630a` + +``` +/build-myapp workflow: run_tests|b: main|tag: v1.0|commit:eee55509f16e7715bdb43308bb55e8736da4e21e|m: start my build!|ENV[DEVICE_NAME]:iPhone 6S|ENV[DEVICE_UDID]:82667b4079914d4aabed9c216620da5dedab630a +``` diff --git a/src/partials/aws-offering-types.mdx b/src/partials/aws-offering-types.mdx new file mode 100644 index 0000000..d9f83a1 --- /dev/null +++ b/src/partials/aws-offering-types.mdx @@ -0,0 +1,70 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## AWS offering types + +There are two basic types of Bitrise on AWS AMIs: + +- **Bare metal**: Your builds run directly on an AWS machine. This means that the build environment is persistent, the same way it would be on your own computer. Artifacts or cache items from a build can have an effect on subsequent builds, unless you clean up the environment. +- **Virtualized/VM-based:** Just like on Bitrise, every build runs in its own virtual machine that is destroyed once the build is finished. It is powered by Bitrise’s virtualization solution that has run millions of builds on the Bitrise-managed machines built on top of Apple’s virtualization framework. Our macOS offerings, including the virtualized solution, are only available on Apple silicon machines. + +:::important[Updating the AMIs] + +The Bitrise AMIs are constantly updated with the latest versions of the pre-installed tools. However, providing the latest Xcode and Android Studio versions in the form of AMIs are slower than on the Bitrise-managed machines, because of the AWS AMI review process. You can check out the currently available versions on the [AWS stack reports](https://stacks.bitrise.io/stack_reports/aws/). + +::: + +:::note[AWS pricing for Mac dedicated hosts] + +For macOS instances, a dedicated host must be allocated. On-Demand Amazon EC2 Mac Dedicated Hosts have a minimum host allocation and billing duration of 24 hours. For more details, check out the official AWS documentation: [Amazon EC2 Dedicated Hosts Pricing](https://aws.amazon.com/ec2/dedicated-hosts/pricing/#Pricing_for_Dedicated_Hosts). + +::: + +### Bare metal macOS + +[The bare metal macOS AMI](https://aws.amazon.com/marketplace/pp/prodview-gvebicfl7c37w) is only available on Apple silicon machines, on the following Amazon EC2 Mac instance types: + +- `mac-m4.metal` +- `mac-m4pro.metal` +- `mac2.metal` +- `mac2-m2.metal` +- `mac2-m2pro.metal` + +Android emulators are supported on all the instance types above. + +### Virtualized macOS + +[The virtualized macOS AMI](https://aws.amazon.com/marketplace/pp/prodview-aqc5tyfdeozky) is only available on Apple silicon machines, on the following Amazon EC2 Mac instance types: + +- `mac-m4.metal` +- `mac-m4pro.metal` +- `mac2.metal` +- `mac2-m2.metal` +- `mac2-m2pro.metal` + +Virtualization offers an ephemeral build environment: the virtual machine is destroyed at the end of every build. This means that all builds run in a completely clean environment, and previous builds have no effect on them. + +You have the option of running either one or two VMs per build. Depending on how resource intensive a build is, running two VMs can mean significant savings in hardware costs. + +:::caution[No Android emulation] + +Android emulation is not available as the Apple silicon architecture doesn't support nested virtualization. + +::: + +### Bare metal Linux + +[The bare metal Linux AMI](https://aws.amazon.com/marketplace/pp/prodview-7h5yynaygkhls) is available on the following Amazon EC2 Linux instance types: + +- `t2.2xlarge` +- `t2.xlarge` +- `c5n.metal` +- `c5.xlarge` +- `c5.metal` +- `c5.4xlarge` +- `c5.2xlarge` + +Different instance types suit different computing needs. To find out more about the functions and capabilities of the different instance types, check out [the official AWS documentation](https://aws.amazon.com/ec2/instance-types/). + +You can run Android emulators on the `metal` instance types only. The other instance types don't support the use of emulators. diff --git a/src/partials/before-you-start-developing-a-new-step.mdx b/src/partials/before-you-start-developing-a-new-step.mdx new file mode 100644 index 0000000..689005e --- /dev/null +++ b/src/partials/before-you-start-developing-a-new-step.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Before you start developing a new Step + +Before creating a new Step, you will need to install the Bitrise CLI, set it up, and make sure the [Step plugin](https://github.com/bitrise-io/bitrise-plugins-step) is updated to the latest version. + +1. [Install the Bitrise CLI](). +1. Run `bitrise setup`. +1. Install the Step plugin with the following command: + + ``` + bitrise plugin install step + ``` diff --git a/src/partials/before-you-start.mdx b/src/partials/before-you-start.mdx new file mode 100644 index 0000000..0bdb82b --- /dev/null +++ b/src/partials/before-you-start.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Before you start + +Running Detox requires: + +- A Mac with a macOS (El Capitan 10.11 or newer version). +- Xcode 8.3 or newer version with Xcode command line tools. +- A working React Native app. + +[Install and set up Detox for your project](https://wix.github.io/Detox/docs/introduction/getting-started/). You will need to install Homebrew, Node.js and applesimutils, as well as the Detox command line tools. Add Detox to your project and then create and run Detox tests locally. If you have an Android app, go through [this guide](https://wix.github.io/Detox/docs/guide/android-dev-env/) after the initial setup process. + +Once you are done, you can test your Detox-configured project on Bitrise. diff --git a/src/partials/build-cache-metrics.mdx b/src/partials/build-cache-metrics.mdx new file mode 100644 index 0000000..0a28db0 --- /dev/null +++ b/src/partials/build-cache-metrics.mdx @@ -0,0 +1,42 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Build cache metrics + +Build cache metrics provide data-based visibility into the [Bitrise Build Cache](https://bitrise.io/platform/devops/build-caching) system. You can achieve more consistent and reliable CI/CD workflows by reducing the unpredictability that comes with inefficient caching. + +If your Bitrise Build Cache is correctly set up, you need no additional configuration to access data in Insights. The following Build Cache metrics are available: + +- **Invocation count**: This metric shows how frequently the cache is used in your builds and helps you understand the frequency and type of commands being executed. A high invocation count indicates strong cache adoption while a low count might mean caching isn't utilized to its full effect. +- **Uploads/downloads**: This measures the amount of data transfer to and from the build cache per each command. High data transfer volumes can point to excessive uploads or downloads which might slow down your builds. If downloads aren't significantly lower than uploads, it might indicate inefficient caching. Insights shows the p50 (median) value and the p90 value per invocation for both uploads and downloads: that is, how much data a given invocation uploads and downloads. + + ![p90-uploads.png](/img/_paligo/uuid-cb1811cf-42dd-3707-9288-42d1291a9780.png) +- **Cache hit rate**: This measures the percentage of data requests that can be served by the build cache. Insights shows the p10 hit rate (meaning only 10% of cases will have an equivalent or lower hit rate) and the median (p50) hit rate. The p10 value is particularly important because a low hit rate suggests suboptimal cache configuration or incorrectly defined cache keys. + +For Build Cache metrics - like any other metrics in Insights - you can: + +- [Create a dashboard](/en/insights/getting-started-with-insights/the-dashboards-page/creating-a-new-dashboard). +- [Set alerts](/en/insights/configuring-alerts-in-insights) for specific thresholds. + +### Common use cases for build cache metrics + +If your metrics show sudden and significant variation, you can check each related invocation to find out when the issue started. Filter to the relevant item/time period and then select the **Related invocations** tab. This can be useful for both uploads/downloads or cache hit rate. + +For example, if there is a sudden spike in uploads compared to downloads, it might mean that data is being repeatedly generated and stored but rarely reused, reducing efficiency: + +![trends.png](/img/_paligo/uuid-5d4f1f7c-0ca9-93fb-251c-4b63c26f1f4b.png) + +![issues-list.png](/img/_paligo/uuid-7d6dc7a5-d2ad-0a24-e940-6ce654e08db4.png) + +For another example, here's a sudden change in cache hit rate for a given Workflow, suggesting a weak spot in the caching setup: + +![cache-hit-rate-workflow.png](/img/_paligo/uuid-cf5db37b-0d3a-2292-c706-28a35c9c342e.png) + +You can look at the invocation count to identify when a project started (when the invocation count suddenly spikes) or stopped (when the invocation count suddenly drops) using the Build Cache: + +![started-build-cache.png](/img/_paligo/uuid-d2661447-265a-5f94-41dc-40c36c7acad6.png) + +![stopped-using-cache.png](/img/_paligo/uuid-8f7bf7cb-1d82-dacf-ecc0-b3e98438c118.png) + +This can help, for example, detecting and fixing configuration issues that break the cache setup. diff --git a/src/partials/build-machine-types.mdx b/src/partials/build-machine-types.mdx new file mode 100644 index 0000000..6050c6b --- /dev/null +++ b/src/partials/build-machine-types.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Build machine types + +Bitrise offers multiple build machines with different specifications You can choose between them based on your needs. + +You can track how much time you spent building your apps on each machine type with Insights: [Bitrise CI metrics](/en/insights/available-metrics-in-insights/bitrise-ci-metrics). + +:::tip[Machine availability by subscription plan] + +Not all machines are available on all subscription plans. Visit [the pricing page](http://www.bitrise.io/pricing) to find out which machines are available on your plan! + +::: + +Machine types are divided into resource classes. The same resource class offers multiple machine types with broadly similar performances. Bitrise automatically assigns machine types from a resource class, which means that on the same day, your builds might run on different machine types. + +| Operating system | Resource class | Hardware types | Specs | Machine type ID for [YAML configuration](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds/setting-the-stack-in-the-bitriseyml-file) | +| --- | --- | --- | --- | --- | +| macOS | | | | | +| Medium | - M2 Pro Medium - M4 Medium | - 4 CPU @3.49GHz and 6 GB RAM - 5 CPU @4.4 GHz and 6 GB RAM | `g2.mac.medium` | | +| Large | - M2 Pro Large - M4 Large | - 6 CPU @3.49GHz and 14 GB RAM - 5 CPU @4.4 GHz and 14 GB RAM | `g2.mac.large` | | +| X Large | - M2 Pro X Large - M4 X Large | - 12 CPU @3.49GHz and 28 GB RAM - 10 CPU @4.4 GHz and 28 GB RAM | `g2.mac.x-large` | | +| 4Large | M4 Pro Large | 7 CPU @4.52GHz and 27 GB RAM | `g2.mac.4large` | | +| 4X Large | M4 Pro X Large | 14 CPU @4.52GHz and 54 GB RAM | `g2.mac.4x-large` | | +| Linux | Medium | 4 vCPU @ 3.1 GHz | 4 vCPU @3.1 GHz and 16 GB RAM | `standard` | +| Large | 8 vCPU @ 3.1 GHz | 8 vCPU @3.1 GHz and 32 GB RAM | `elite` | | +| X Large | 16 vCPU @ 3.1 GHz | 16 vCPU @3.1 GHz and 64 GB RAM | `elite-xl` | | +| M | AMD EPYC Zen 4 and Zen 5 | 4 vCPU @3.7 GHz and 16 GB RAM | `g2.linux.medium` | | +| 2M | AMD EPYC Zen 4 and Zen 5 | 6 vCPU @3.7 GHz and 24 GB RAM | `g2.linux.2medium` | | +| L | AMD EPYC Zen 4 and Zen 5 | 8 vCPU @3.7 GHz and 32 GB RAM | `g2.linux.large` | | +| 4L | AMD EPYC Zen 4 and Zen 5 | 14 vCPU @3.7 GHz and 56 GB RAM | `g2.linux.4large` | | +| XL | AMD EPYC Zen 4 and Zen 5 | 16 vCPU @3.7 GHz and 64 GB RAM | `g2.linux.x-large` | | +| 3XL | AMD EPYC Zen 4 and Zen 5 | 24 vCPU @3.7 GHz and 96 GB RAM | `g2.linux.3x-large` | | +| 5XL | AMD EPYC Zen 4 and Zen 5 | 32 vCPU @3.7 GHz and 128 GB RAM | `g2.linux.5x-large` | | +| 7XL | AMD EPYC Zen 4 and Zen 5 | 48 vCPU @3.7 GHz and 192 GB RAM | `g2.linux.7x-large` | | diff --git a/src/partials/building-an-ios-app-for-a-simulator.mdx b/src/partials/building-an-ios-app-for-a-simulator.mdx new file mode 100644 index 0000000..9452a1b --- /dev/null +++ b/src/partials/building-an-ios-app-for-a-simulator.mdx @@ -0,0 +1,141 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Building an iOS app for a simulator + +You can build an iOS app for an iOS or tvOS simulator platform. + +To do this, you'll need the **Xcode Build for Simulator** Step. The Step creates an `.app` file which you can install on any macOS device or send to, for example, testers. This requires no code signing at all, so it is an easy way to create a distributable version of your iOS app. + +The Step also creates an `.xctestrun` file which you can use to run tests. Both the `.app` file and the `.xctestrun` file can be accessed by subsequent Steps referring to their output variable, and they can be [downloaded as a build artifact](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html). + +To build the app for a simulator: + + + + +1. Make sure you install all necessary dependencies in your Workflow. + + We have dedicated Steps for many different dependency managers, including: + + - [Carthage](https://bitrise.io/integrations/steps/carthage) + - [CocoaPods](https://bitrise.io/integrations/steps/cocoapods-install) + - [Homebrew](https://bitrise.io/integrations/steps/brew-install) +1. Add the **Xcode Build for Simulator** Step to your Workflow after the Step(s) installing dependencies. +1. Make sure the **Project path** input points to either your `.xcodeproj` or `.xcworkspace` file. + + The input sets the `-project` or `-workspace` option of the `xcodebuild` command. In most cases, if your app has been automatically configured by the project scanner during the [process of adding the app](/en/bitrise-ci/getting-started/adding-a-new-project.html), the default value does not need to be changed. +1. In the **Scheme** input, set the name of the [Xcode scheme](https://developer.apple.com/documentation/xcode/customizing-the-build-schemes-for-a-project/) you want to use to build the app. + + ![scheme-input.png](/img/_paligo/uuid-2700f022-4822-82fe-77e4-1a0995b41ab6.png) + + The input sets the `-scheme` option of the `xcodebuild` command. The default value is an Environment Variable created when adding the app and performing the first-time configuration. If you need to use a different scheme, you can type its name here. + + :::tip[Build configuration] + + By default, the Step will use the build configuration specified in the scheme. However, you can override it and use a different build configuration: add the name of the desired build configuration to the **Configuration name** input. This input is optional and you only need it if you don't want to use the build configuration specified in the selected scheme. + + You can create new build configurations in your Xcode project at any time: [Adding a build configuration file to your project](https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project). + + ::: +1. In the **Device destination specifier** input, select **generic/platform=iOS Simulator** + + ![ios-simulator-destination.png](/img/_paligo/uuid-7235d345-4190-c1be-6ee3-fc25e1eb183e.png) +1. Optionally, set the **Build settings (xcconfig), allow code signing** input to **CODE_SIGNING_ALLOWED=YES**. This allows code signing files to be installed during the build. + + In most cases, you don't need code signing for an app built for a simulator. It might be required for certain test cases or third-party dependencies. To set up code signing, see [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing). +1. To access your app as a build artifact, add the **Deploy to Bitrise.io** Step to the end of your Workflow. By default, you don't have to modify anything in the Step's configuration. + + + + +1. Make sure you install all necessary dependencies in your Workflow. + + We have dedicated Steps for many different dependency managers, including: + + - [Carthage](https://bitrise.io/integrations/steps/carthage) + - [CocoaPods](https://bitrise.io/integrations/steps/cocoapods-install) + - [Homebrew](https://bitrise.io/integrations/steps/brew-install) +1. Add the `[xcode-build-for-simulator](https://github.com/bitrise-steplib/steps-xcode-build-for-simulator)` Step to your Workflow after the Step(s) installing dependencies. + + ```yaml + workflows: + primary: + steps: + - cocoapods-install + - xcode-build-for-simulator: + inputs: + ``` +1. Make sure the `project_path` input points to either your `.xcodeproj` or `.xcworkspace` file. + + The input sets the `-project` or `-workspace` option of the `xcodebuild` command. In most cases, if your app has been automatically configured by the project scanner during the [process of adding the app](/en/bitrise-ci/getting-started/adding-a-new-project.html), the default value does not need to be changed. + + ```yaml + - xcode-build-for-simulator: + inputs: + - project_path: $BITRISE_PROJECT_PATH + ``` +1. In the `scheme` input, set the name of the [Xcode scheme](https://developer.apple.com/documentation/xcode/customizing-the-build-schemes-for-a-project/) you want to use to build the app. + + The input sets the `-scheme` option of the `xcodebuild` command. The default value is an Environment Variable created when adding the app and performing the first-time configuration. If you need to use a different scheme, make sure to type the name of the scheme correctly. + + ```yaml + - xcode-build-for-simulator: + inputs: + - scheme: $BITRISE_SCHEME + - project_path: $BITRISE_PROJECT_PATH + ``` + + :::tip[Build configuration] + + By default, the Step will use the build configuration specified in the scheme. However, you can override it and use a different build configuration: add the name of the desired build configuration to the `configuration` input. This input is optional and you only need it if you don't want to use the build configuration specified in the selected scheme. + + You can create new build configurations in your Xcode project at any time: [Adding a build configuration file to your project](https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project). + + ::: +1. Set the `destination` input to `generic/platform=iOS Simulator`. + + ```yaml + - xcode-build-for-simulator: + inputs: + - scheme: $BITRISE_SCHEME + - destination: generic/platform=iOS Simulator + - project_path: $BITRISE_PROJECT_PATH + ``` +1. Optionally, set the `xcconfig_content` input with the value `CODE_SIGNING_ALLOWED=YES`. This allows code signing files to be installed during the build. + + In most cases, you don't need code signing for an app built for a simulator. It might be required for certain test cases or third-party dependencies. To set up code signing, see [iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing). + + ```yaml + - xcode-build-for-simulator: + inputs: + - scheme: $BITRISE_SCHEME + - destination: generic/platform=iOS Simulator + - xcconfig_content: |- + CODE_SIGNING_ALLOWED=YES + COMPILER_INDEX_STORE_ENABLE = NO + - project_path: $BITRISE_PROJECT_PATH + ``` +1. To access your app as a build artifact, add the `deploy-to-bitrise-io` Step to the end of your Workflow. By default, you don't have to modify anything in the Step's configuration. + + ```yaml + primary: + steps: + - generate-cordova-build-configuration@0: {} + - xcode-build-for-test@2: {} + - xcode-test@4: {} + - xcode-build-for-simulator@0.12: + inputs: + - scheme: $BITRISE_SCHEME + - destination: generic/platform=iOS Simulator + - configuration: debug + - xcconfig_content: |- + CODE_SIGNING_ALLOWED=YES + COMPILER_INDEX_STORE_ENABLE = NO + - project_path: $BITRISE_PROJECT_PATH + - deploy-to-bitrise-io + ``` + + + diff --git a/src/partials/caching-dependencies-for-web-ci-projects.mdx b/src/partials/caching-dependencies-for-web-ci-projects.mdx new file mode 100644 index 0000000..a072a58 --- /dev/null +++ b/src/partials/caching-dependencies-for-web-ci-projects.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Caching + +Bitrise offers two distinct caching solutions: + +- [The Bitrise Build Cache](urn:resource:publication:94853): If you build your project with Bazel or Gradle, the Bitrise Build Cache caches build and test outputs to minimize how much work is done in subsequent builds. It's compatible with any CI tool and accelerates the build cycle without requiring you to manage a caching infrastructure. +- [Key-based caching](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching): Key-based caching works by associating cache archives with a key. A Workflow can restore a cache archive by referring to the key; at the end of the Workflow, the build files can be saved into the cache archive that the key indicates. This overwrites the cache archive. + +### Bitrise Build Cache + +Adding a new connection to the Bitrise Build Cache consists of: + +- Selecting a CI provider: you can use either Bitrise or another CI provider. +- Selecting a build tool: currently, Bazel, Gradle, and Xcode are supported. +- If you use Bitrise as your CI provider, selecting a Bitrise project. +- If you use a different CI provider, adding [a personal access token](/en/bitrise-platform/accounts/personal-access-tokens/creating-a-personal-access-token) to allow the Bitrise Build Cache access to your CI. +- Adding the cache activation scripts to your CI process. On Bitrise, we have dedicated [Steps](/en/bitrise-ci/workflows-and-pipelines/steps/steps-overview.html) for this. + +### Key-based caching + +To use key-based caching, you have two main options: + +- Using our dedicated caching Steps. These require no configuration as they automatically set up the cache keys needed for your dependencies. Dedicated Steps include Steps for caching npm, Yarn, and Gradle dependencies: [Dedicated caching Steps for dependency managers](/en/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers). +- Using **Script** Steps to configure keys for your cache archives. This gives you full control over your caching setup: [Using key-based caching](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching). diff --git a/src/partials/canceling-your-subscription.mdx b/src/partials/canceling-your-subscription.mdx new file mode 100644 index 0000000..b0fe5d2 --- /dev/null +++ b/src/partials/canceling-your-subscription.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Canceling your subscription + +You can cancel a workspace's Bitrise subscription at any time on the **Workspace settings** page. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left navigation menu, select **Plan & Billing**. +1. Click **Manage subscription**. +1. In the dialog, click the card with your subscription information on it. + + ![teams-sub.png](/img/_paligo/uuid-dbe3dd32-b361-1fe0-2883-cf93cd64102d.png) +1. Select **Cancel Subscription**. +1. Select a cancellation reason and then click **Confirm Cancellation**. diff --git a/src/partials/caution-saml-sso-restrictions.mdx b/src/partials/caution-saml-sso-restrictions.mdx new file mode 100644 index 0000000..d1448b5 --- /dev/null +++ b/src/partials/caution-saml-sso-restrictions.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::caution[SAML SSO restrictions] + +SAML SSO is only available for a Workspace with [our paid plans](https://bitrise.io/pricing). + +Since the SAML SSO feature is tied to the above plans, if you decide to downgrade to a free plan, you will lose this feature. All Workspace members will receive an email about the downgrade, and you’ll have two weeks to re-upgrade if you wish to use SAML SSO in your Workspace again. + +::: diff --git a/src/partials/chaining-workflows-for-a-white-label-app.mdx b/src/partials/chaining-workflows-for-a-white-label-app.mdx new file mode 100644 index 0000000..2a5f48c --- /dev/null +++ b/src/partials/chaining-workflows-for-a-white-label-app.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Chaining Workflows for a white label app + +Now that we have a bunch of Workflows ready, it’s time to chain them together in the right order. + +1. Select your main Workflow (**allcolor** in this example). This is the Workflow that should be triggered by your [build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html). +1. Click the vertical ellipsis next to the Workflow's name and select **Chain Workflows**. Select a version Workflow (for example, **white**) and click **Add after**. +1. Add each version-specific Workflow the same way (such as white, green, and red in our example) and add your utility Workflow after each of them, as seen in this image: + + ![chained-workflows.png](/img/_paligo/uuid-dada2b23-2bc7-5796-3d98-9131dbaa2a87.png) +1. Go back to your Build’s page and click **Start build**. +1. In the **Build configuration** dialog, select your main Workflow under **Workflow**. This will kickstart your chained Workflows and build the app versions of your white label app. diff --git a/src/partials/chaining-workflows-together.mdx b/src/partials/chaining-workflows-together.mdx new file mode 100644 index 0000000..8853561 --- /dev/null +++ b/src/partials/chaining-workflows-together.mdx @@ -0,0 +1,45 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Chaining Workflows together + +You can set up multiple Workflows to run in succession. The order of these Workflows can be rearranged, new Workflows can be added to the chain and existing Workflows can be removed from it at any time. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Click the ellipsis button to the right of the name of the Workflow. + + ![chaining-workflows-menu.png](/img/_paligo/uuid-69aa514f-9623-9dde-f80f-340c81d06044.png) +1. From the dropdown menu, select **Chain Workflow**. +1. Select a Workflow from the list and click either **Add before** or **Add after**. + + ![workflow-chain-options.png](/img/_paligo/uuid-eebfeceb-3b6a-7e5d-3f3e-4431b4c200ba.png) +1. Click **Save** in the top right corner. + +**Chaining Workflows in YAML** + +In this example, we're chaining together three Workflows: `test`, `deploy`, and `ci`, using the before_run and after_run parameters. + +``` +workflows: + test: + envs: + - IS_TEST: "true" + steps: + # test Steps to run + + deploy: + before_run: + - test + steps: + # steps to deploy + + ci: + before_run: + - test + after_run: + - deploy +``` + +For more information on how to manage Workflows directly in the `bitrise.yml` file, check [Workflow level properties](/en/bitrise-ci/references/configuration-yaml-reference/workflow-level-properties). diff --git a/src/partials/changelog.mdx b/src/partials/changelog.mdx new file mode 100644 index 0000000..bb7d551 --- /dev/null +++ b/src/partials/changelog.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changelog + +### June 2025 + +**Changed** + +Mentions of Linux stack update policy has been moved on its own page, [Linux stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy.html), with more information on Edge, Stable and Frozen stacks. It also describes the yearly cadence of new Linux stacks, as well as the deprecation and removal of older Linux stacks. + +Removed how to use previous versions of a stack from this page and added it to [Stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/stack-update-policy.html). + +### July 2024 + +**Removed**: + +Mentions of dependency manager cache updates. Both Cocoapods and Homebrew have better mechanisms now than cloning the entire registry git repo, and these newer mechanisms (Cocoapods CDN, Homebrew API) are enabled on stacks now. When stacks are updated, you can expect the on-disk repos to be up-to-date, but Stable stacks are no longer strictly updated weekly if there are no other changes to release. + +**Changed**: + +The breaking changes to stable macOS stacks (once a year when a new Xcode major version is released) no longer apply to older, existing stable stacks, only the newly released stable stack. For example, when Xcode 16.0 is released, the planned breaking changes only apply to the Xcode 16.0 stable stack. Xcode 14.x and 15.x stable stacks won’t receive breaking changes. + +### March 2024 + +**New**: + +Define what happens when an Edge stack is phased out in favor of a newer edge stack. + +**Removed**: + +When a new Xcode Edge stack is released, it no longer brings tooling changes to the Stable stacks. + +**Changed**: + +New, simpler simulator runtime policy. The same number of older iOS major versions are installed, but only the latest minor version is installed for each. diff --git a/src/partials/changing-a-subscription-plan.mdx b/src/partials/changing-a-subscription-plan.mdx new file mode 100644 index 0000000..2299336 --- /dev/null +++ b/src/partials/changing-a-subscription-plan.mdx @@ -0,0 +1,30 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing a subscription plan + +You can change your workspace's subscription plan at any time from the **Workspace settings** page. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left navigation menu, select **Plan & Billing**. +1. Click **Change plan**. +1. Select a new plan or change the tier of your existing plan. + + :::note[Enterprise plans] + + Enterprise plans are not available on a self-serve basis. If you wish to select an Enterprise plan, you can click the **Talk to us** button which takes you to our [contact page](https://bitrise.io/contact). + + ::: + + ![plan-select.png](/img/_paligo/uuid-e09272e9-48fe-2dba-c52c-24b79391c293.png) +1. On the **Customize plan** page, set up your subscription plan and then click **Continue to checkout**. +1. Follow the instructions in the checkout dialog. + + You can change your payment method, billing address, and all other subscription information at this stage. + + ![checkout.png](/img/_paligo/uuid-85ec7e12-6811-a14d-5388-d5502f87fc22.png) diff --git a/src/partials/changing-machine-types-in-all-apps-at-the-same-time.mdx b/src/partials/changing-machine-types-in-all-apps-at-the-same-time.mdx new file mode 100644 index 0000000..dccdb58 --- /dev/null +++ b/src/partials/changing-machine-types-in-all-apps-at-the-same-time.mdx @@ -0,0 +1,68 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing machine types in all apps at the same time + +| Endpoints | Function | Required role | +| --- | --- | --- | +| PATCH /user/\{user-slug\}/apps/machine_types | Migrate a specified machine type to another in all apps owned by the same user. | N/A | +| PATCH /organizations/\{org-slug\}/apps/machine_types | Migrate a specified machine type to another in all apps owned by the same Workspace. | Workspace owner | + +The Bitrise API provides two endpoints that allow you to switch between one [machine type](/en/bitrise-platform/infrastructure/build-machines.html) and another for all apps owned by either a user or a [Workspace](urn:resource:component:42180). The endpoints parse the `bitrise.yml` file of each app, look for all occurrences of a specified machine type, and replace them with another type. For example, you can switch from M1 Medium to M1 Large on all your apps with this endpoint. + +Both endpoints take two parameters: + +- from_machine: The machine type you want to switch from. + + to_machine: The machine type you want to switch to. + +You can find the list of available machine types here: [Build machine types](/en/bitrise-build-hub/infrastructure/build-machine-types). + +If the endpoints don't find the machine type specified in the from_machine parameter, they will still return a 200 response, with an empty `migrated_apps` object. + +:::note[Default and Workflow-specific stacks] + +The endpoints can change the machine types for both default stacks and Workflow-specific stacks. + +::: + +**Migrating all apps owned by a user from M1 Medium machines to M1 Large machines:** + +``` +curl -X 'PATCH' \ + 'https://api.bitrise.io/v0.1/user/USER-SLUG/apps/machine_types' \ + -H 'accept: application/json' \ + -H 'Authorization: PERSONAL-ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "from_machine": "g2-m1.4core", + "to_machine": "g2-m1.8core" +}' +``` + +**Migrating all apps owned by a Workspace from M4 Pro Large machines to M4 Pro X Large machines:** + +``` +curl -X 'PATCH' \ + 'https://api.bitrise.io/v0.1/organizations/WORKSPACE-SLUG/apps/machine_types' \ + -H 'accept: application/json' \ + -H 'Authorization: PERSONAL-ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "from_machine": "g2.mac.4large", + "to_machine": "g2.mac.4x-large" +}' +``` + +**Successful respose** + +``` +{ + "message": "The migration was successful.", + "migrated_apps": [ + "android-sample (8f41200-e5a5eee17)", + "sample-swift-project (c291b04-784ca8773)", + ] +} +``` diff --git a/src/partials/changing-the-connection-type-from-oauth-to-the-github-app-api.mdx b/src/partials/changing-the-connection-type-from-oauth-to-the-github-app-api.mdx new file mode 100644 index 0000000..a2f6172 --- /dev/null +++ b/src/partials/changing-the-connection-type-from-oauth-to-the-github-app-api.mdx @@ -0,0 +1,44 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing the connection type from OAuth to the GitHub app + +:::important[Important considerations] + +Reverting to OAuth via API is not fully supported. Reverting projects to OAuth requires manual intervention through the Bitrise UI. Customers should test the migration process with a subset of projects before executing bulk migrations. + +::: + +Change your GitHub connection from an OAuth application to the Bitrise Github app through the API via the `POST /apps/{app-slug}/change-connection-type` endpoint. The accepted values are: + +- `github` +- `github-app` + +To change the connection type to the GitHub app: + +```bash +curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/change-connection-type' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "connection_type": "github-app" +}' +``` + +Changing a connection is a non-destructive action: other authentication methods aren't removed. You can check if your builds still work. If there is an issue, you can change back to an OAuth connection. + +To revert the connection: + +```bash +curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/change-connection-type' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "connection_type": "github" +}' +``` diff --git a/src/partials/changing-the-default-branch.mdx b/src/partials/changing-the-default-branch.mdx new file mode 100644 index 0000000..204a308 --- /dev/null +++ b/src/partials/changing-the-default-branch.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing the default branch + +The default branch is the branch of your repository that Bitrise will use if no other configuration indicates otherwise. + +You can change the default branch at any time. + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. From the menu on the left, select **Repository**. +1. On the **Repository URL** card, click **Change**. +1. In the dialog, enter the branch name in the **Default branch** field. + + ![SCR-20260331-przw.png](/img/_paligo/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png) +1. Type the name of the branch you want to use as default branch. +1. Click **Save** to save changes. diff --git a/src/partials/changing-the-location-of-the-apps-bitriseyml-file.mdx b/src/partials/changing-the-location-of-the-apps-bitriseyml-file.mdx new file mode 100644 index 0000000..158b4a8 --- /dev/null +++ b/src/partials/changing-the-location-of-the-apps-bitriseyml-file.mdx @@ -0,0 +1,52 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing the location of the app's bitrise.yml file + +The app's `bitrise.yml` configuration file can be stored in two places: + +- On bitrise.io. This is the default setting for all apps. +- [In your app's repository.](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository) This way you have full control over the versioning and maintenance of the config file. You can still use the graphical Workflow Editor on bitrise.io to modify your configuration but you will need to commit your changes to the repository. + +You can get and change the location of the file using the API. + +:::important[Admin access required] + +Both endpoints related to the location of the `bitrise.yml` file require admin level access to the app. + +::: + +With the `GET/apps/{app-slug}/bitrise.yml/config` endpoint, you can get the location of the file. Location here means that calling the endpoint tells you whether the file is stored on bitrise.io or in the repository. The endpoint takes no parameters and it returns one of two values in the response: + +- `"location": "bitrise.io"` +- `"location": "repository"` + +``` +curl -X 'GET' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/bitrise.yml/config' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' +``` + +With the `PUT/apps/{app-slug}/bitrise.yml/config` endpoint, you can change the location of the file: that is, you can tell Bitrise whether to look for the config file on bitrise.io or in your repository. This endpoint takes one of two values in a JSON object: + +- `"location": "bitrise.io"` to store the config file on bitrise.io. +- `"location": "repository"` to store the config file in your repository. + +:::important[Commit the config file into your repository] + +Please note that changing the location to `repository` merely tells Bitrise to look for the `bitrise.yml` file in the app's repository. If the file does not exist in the repository, the endpoint won't return an error but you won't be able to run builds because Bitrise won't find the config file. + +::: + +``` +curl -X 'PUT' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/bitrise.yml/config' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "location": "bitrise.io" +}' +``` diff --git a/src/partials/changing-the-number-of-your-build.mdx b/src/partials/changing-the-number-of-your-build.mdx new file mode 100644 index 0000000..f25e10e --- /dev/null +++ b/src/partials/changing-the-number-of-your-build.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Adding the SSH key to the machine user + +In order for Bitrise to be able to use the machine user to access your repository, you must add the same SSH key to the machine user and the app on Bitrise. + +:::note[Negative build numbers] + +The build number must be either 0 or a positive integer. Negative numbers are not accepted. You can, however, set any number you have already used. + +::: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Builds**. +1. Scroll down to **Next build number**. + + ![build-numbering.png](/img/_paligo/uuid-ccdbd639-8424-98d8-f569-ddf58f73cbec.png) + + This number is automatically incremented whenever you run a build but you can set it manually. +1. To modify the number, click **Edit**. diff --git a/src/partials/changing-the-repository-url.mdx b/src/partials/changing-the-repository-url.mdx new file mode 100644 index 0000000..b55bd80 --- /dev/null +++ b/src/partials/changing-the-repository-url.mdx @@ -0,0 +1,26 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing the repository URL + +The repository URL is the address where your repository can be accessed by Bitrise. It can be either an SSH URL or an HTTPS URL: we strongly recommend using SSH URLs for all private projects for security reasons. + +:::tip[Using an HTTPS URL] + +You can use HTTPS Git URLs, using a personal access token for authorization: in this case, you don't need an SSH key: [Configuring HTTPS authorization credentials](/en/bitrise-platform/repository-access/configuring-https-authorization-credentials). + +::: + +If you move your project's repository, or the URL changes for any other reason, you can update it on Bitrise and continue building without an issue. + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. From the menu on the left, select **Repository**. +1. On the **Repository URL** card, click **Change**. +1. Enter the new URL in the dialog. + + ![SCR-20260331-przw.png](/img/_paligo/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png) +1. Click **Save** to save changes. diff --git a/src/partials/changing-the-service-credential-user.mdx b/src/partials/changing-the-service-credential-user.mdx new file mode 100644 index 0000000..53afd4d --- /dev/null +++ b/src/partials/changing-the-service-credential-user.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing the service credential user + +The service credential user can be changed at any time but you can only set yourself as the service credential user on a Bitrise project. + +:::important[Role requirement] + +To change the service credential user, you need to have **Admin**[role on the project's team](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) on Bitrise. + +::: + +To change the service credential user: + +1. Log in to Bitrise with the account that will be the new service credential user. +1. Make sure that account has **Admin** role on the [project's team](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. Go to your workspace's main page. +1. Select the project where you want to change the service credential user. +1. Click on **Project Settings**. +1. On the left, select **Integrations** from the menu options. +1. Scroll down to the **Service credential user** part. +1. Click **Change to me**. + + ![service-credential-user.png](/img/_paligo/uuid-6519a945-1fd2-97fd-da4a-fdab48705503.png) + + :::note[Disabling OAuth project access restrictions for your GitHub organization] + + If you receive an error while trying to connect or change the service credential user for your project, make sure that the user has the project access to the GitHub repository and that **Third-party app access policy restrictions** are disabled. + + For more information on how to disable the Third-party app access policy on GitHub, check out [Disabling OAuth project access restrictions for your organization](https://docs.github.com/en/organizations/managing-oauth-access-to-your-organizations-data/disabling-oauth-project-access-restrictions-for-your-organization). + + ::: +1. To confirm, click **Set service credential user**. diff --git a/src/partials/changing-your-billing-email.mdx b/src/partials/changing-your-billing-email.mdx new file mode 100644 index 0000000..40cfc30 --- /dev/null +++ b/src/partials/changing-your-billing-email.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing your billing email + +By default, a workspace’s invoices will be sent to the email provided when the workspace was created. However, the owner(s) of the workspace can change it at any time. + +1. Sign in with an account that is an owner of the workspace. +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **General settings** from the menu options. + + ![billing-email.png](/img/_paligo/uuid-d36425af-6967-473f-d8d7-07fdaed7ebc1.png) +1. Locate the **Billing email** field and click **Edit** under it. +1. Enter the new email address and click **Confirm changes**. diff --git a/src/partials/changing-your-bitrise-username-email-and-password.mdx b/src/partials/changing-your-bitrise-username-email-and-password.mdx new file mode 100644 index 0000000..ba2b6e1 --- /dev/null +++ b/src/partials/changing-your-bitrise-username-email-and-password.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing your Bitrise username, email, and password + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. To change your username, type in the new username in the **Username** field. +1. To change your email, type in a new email address in the **Email** field. +1. To change your password, type in a new password in the **Password** field, and then type it again in the **Confirm password** field. +1. When done, click **Update**. diff --git a/src/partials/changing-your-email-notification-settings.mdx b/src/partials/changing-your-email-notification-settings.mdx new file mode 100644 index 0000000..199fa19 --- /dev/null +++ b/src/partials/changing-your-email-notification-settings.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing your email notification settings + +Email notifications are automatically set up for all projects when first creating them. There are three possible settings for both successful builds and failed builds: + +- **Always**. This is the default setting for failed builds. +- **Never**. +- **Send email when build status changes on the same branch**. This is the default setting for successful builds. This means that if build #1 and build #2 both succeeded, you will not get a notification about build #2. However, if build #3 fails and then build #4 succeeds again, you will be notified. + +You can change your email notification settings at any time - you can even completely disable them. + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Notifications**. +1. Scroll down to email notifications. + + ![notifications.png](/img/_paligo/uuid-c56aac7c-384f-7b63-c38e-216a32143c86.png) +1. Select the settings you need for both successful and failed builds from the appropriate dropdown menu. + + For example, if you want to disable receiving notifications, set both options to **Never**. diff --git a/src/partials/changing-your-project-settings.mdx b/src/partials/changing-your-project-settings.mdx new file mode 100644 index 0000000..09d322f --- /dev/null +++ b/src/partials/changing-your-project-settings.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing your project settings + +You can change your project settings at any time. To do so, open your project on the [Bitrise CI page](https://app.bitrise.io/dashboard) and click **Project settings**. + +![project-settings-button.png](/img/_paligo/uuid-56c193b1-5aaf-9bc1-63f3-61739dfcd68d.png) + +Clicking the button takes you to the **Project settings** page. + +![project-settings-main-page.png](/img/_paligo/uuid-b76a80c6-dd43-0542-65aa-98a4f8e44407.png) + +The settings you can change include: + +- Name and project type. +- [Repository URL and default branch](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). +- [Team members of the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +- [Git connection](/en/bitrise-platform/repository-access/repository-access-with-oauth) and [access to online services](/en/bitrise-platform/integrations/apple-services-connection.html) such as the Apple Store or Google Play. +- [Build notification settings](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications.html). + +You can also set up [rolling builds](/en/bitrise-ci/configure-builds/configuring-build-settings/rolling-builds.html) and [selective builds](/en/bitrise-ci/configure-builds/configuring-build-settings/selective-builds.html), upload [code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html), upload [generic files to Bitrise](/en/bitrise-ci/run-and-analyze-builds/managing-build-files.html), [register test devices](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device), and check your [caching](/en/bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview) data. diff --git a/src/partials/checking-and-resending-webhook-deliveries.mdx b/src/partials/checking-and-resending-webhook-deliveries.mdx new file mode 100644 index 0000000..fbe4b72 --- /dev/null +++ b/src/partials/checking-and-resending-webhook-deliveries.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Checking outgoing webhook deliveries + +You can check the recent deliveries of your outgoing webhooks at any time, and resend them if necessary. The deliveries are marked with appropriate status code, depending on whether the delivery was successful. + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Integrations** and then the **Webhooks** tab. +1. Scroll down to **Outgoing Webhooks**. +1. Find your webhook and select the ![recent-deliveries.svg](/img/_paligo/uuid-78124fdc-5f54-e675-590c-e3b54a083649.svg) icon. +1. Select a delivery and expand it to show the full request and the response. + + ![webhooks-redeliver.png](/img/_paligo/uuid-b09fdf6d-9e83-e454-23c7-005f1344b4aa.png) +1. You can redeliver the webhook payload at any time. Find the delivery you need and click the ![redeliver.svg](/img/_paligo/uuid-f5c2904f-3e0b-71ae-b96a-b6059f61bed2.svg) icon next to it. + + :::tip[Editing the payload] + + Before trying to deliver the webhook payload again, you can edit the webhook configuration. Close the **Recent deliveries** pop-up window and click the ![edit-webhook.svg](/img/_paligo/uuid-fe3755f8-efba-2923-17e8-fa4ffd1ef16e.svg) icon next to the webhook to edit it. When finished, click **Update webhook**. + + ::: diff --git a/src/partials/checking-changes-in-the-bitriseyml-file.mdx b/src/partials/checking-changes-in-the-bitriseyml-file.mdx new file mode 100644 index 0000000..f79bdd8 --- /dev/null +++ b/src/partials/checking-changes-in-the-bitriseyml-file.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Checking changes in the configuration YAML + +On the **Configuration YAML** page of a build, you can see: + +- The YAML configuration used by the build. +- If the build used a different configuration, you can also see the current configuration YAML. + +The page also shows the differences between the current configuration and the configuration used by the build: + +- Green means added content. +- Blue means modified content. +- Red means deleted content. + +![compare-config-yaml.png](/img/_paligo/uuid-e0c8a32c-f635-adb8-8380-03c13b38026d.png) diff --git a/src/partials/checking-saml-sso-statuses-on-bitrise.mdx b/src/partials/checking-saml-sso-statuses-on-bitrise.mdx new file mode 100644 index 0000000..79461a9 --- /dev/null +++ b/src/partials/checking-saml-sso-statuses-on-bitrise.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Checking SAML SSO statuses on Bitrise + +Now that the Workspace owner has set up SAML SSO for the Workspace, all Workspace members (including the Workspace owner) can check their other Workspace member’s SAML SSO statuses on the **Team** tab. + +:::note[Accessing the Single Sign-on tab] + +The **Single Sign-On** tab is only available for the Workspace owner. + +::: + +There are two kinds of SAML SSO statuses on Bitrise. + +- **SAML IS ENABLED:** Login via SAML SSO is enabled. +- **SAML IS DISABLED:** The Workspace member has not enabled the SAML SSO connection yet. To enable it, the Workspace member has to follow the instructions in the verification email from Bitrise. + +1. Go to your Workspace’s profile page. +1. Select **Team** from the left menu. +1. Go to the Members tab to check the Workspace member’s SAML status. + + ![saml_status.png](/img/_paligo/uuid-38cefb5d-2dc6-7a86-98cd-d1dac6484ded.png) diff --git a/src/partials/checking-the-available-test-devices-for-an-app.mdx b/src/partials/checking-the-available-test-devices-for-an-app.mdx new file mode 100644 index 0000000..81c43d6 --- /dev/null +++ b/src/partials/checking-the-available-test-devices-for-an-app.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Checking the available test devices for an app + +For any Bitrise app, you can check out the registered test devices available on the **App Settings** page. This will show an aggregated list of all registered test devices associated with users who have access to your app, regardless of their role. You can use any of those devices to run tests of your app. + +You can also download the list of registered devices as a `.json` file. + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the menu on the left side, select **Test devices**. + + ![test-devices-menu.png](/img/_paligo/uuid-7fb72644-6457-f137-c769-10345e5cb120.png) +1. Optionally, you can download the entire list as a `.json` file: click the **Download as json** button. diff --git a/src/partials/checking-workspace-member-status.mdx b/src/partials/checking-workspace-member-status.mdx new file mode 100644 index 0000000..64ffeb8 --- /dev/null +++ b/src/partials/checking-workspace-member-status.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Checking workspace member status + +You can check out the most important information about workspace members at any point. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. Select **Collaboration**. +1. Go to the **Members** tab. On this tab: + + - You can [add and remove workspace members](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration/adding-individual-members-to-workspaces). + - If [SAML SSO](/en/bitrise-docs-20/bitrise-platform/accounts/saml-sso-in-bitrise) is enabled for a member. + - See each member's [workspace role](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces.html) and [product access](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces/project-level-roles). + +You can search for a specific Workspace member or use the filter function to filter members based on their roles. diff --git a/src/partials/cleaning-up-your-aws-build-environment.mdx b/src/partials/cleaning-up-your-aws-build-environment.mdx new file mode 100644 index 0000000..c1d6b57 --- /dev/null +++ b/src/partials/cleaning-up-your-aws-build-environment.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Cleaning up your AWS build environment + +When running a self-hosted agent, one agent executes multiple builds (one after the other). This allows sharing of data between builds on the local filesystem, but it also requires some care in order to avoid one build affecting another. + +To avoid this problem, you can clean up your build environment in between builds. To do so, you need to run the [Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html)on the self-hosted machines in agent mode: [Cleaning up persistent build environments](/en/bitrise-build-hub/infrastructure/cleaning-up-persistent-build-environments) diff --git a/src/partials/cloud-controller-overview.mdx b/src/partials/cloud-controller-overview.mdx new file mode 100644 index 0000000..f6ed498 --- /dev/null +++ b/src/partials/cloud-controller-overview.mdx @@ -0,0 +1,29 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Cloud controller overview + +The Cloud Controller enables you to enjoy the benefits of a Bitrise-managed infrastructure on your AWS environment. With the Cloud Controller, you can manage your build infrastructure even without deep knowledge about AWS. + +The Cloud Controller enables Bitrise on AWS users to operate Amazon EC2 infrastructure at scale: + +- The automation supports both the bare metal and the VM-based macOS offerings, providing complete automation on reserving macOS dedicated hosts, starting the instances with the chosen AMI, and connecting to the Bitrise pool. +- Controller's automation saves your mobile DevOps team time and removes an error-prone manual process that doesn't scale above a certain number of instances. +- Changing the number of instances in the Agent Pool definition enables Amazon EC2 cost savings. Scaling down even a bigger macOS machine pool for the weekend will be as easy as changing a single number in the configuration. +- Updating the machines to a newer build environment - provided in the form of an AMI by Bitrise - will be seamless and won't disturb the mobile developers. The configuration can define the percentage of machines affected by the update at any given time. +- You can monitor the instances in each Bitrise pool, see their state, and the builds they are currently running. + +:::important[No inbound traffic required] + +We’ve created the Bitrise on AWS offering with the highest security standards in mind, to match even the most strict company policy requirements. In all cases the Controller and the build machines will initiate network calls toward the Bitrise control plane, so no external inbound traffic is required. + +::: + +![controller-diagram.png](/img/_paligo/uuid-af9f1f82-169a-eb0c-6c50-1d23315691dc.png) + +:::note[Manual setup] + +We recommend using the Cloud Controller to run Bitrise builds on AWS. However, if you want full control and customization options, you can choose [the manual setup](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup.html). + +::: diff --git a/src/partials/code-signing-and-clean-virtual-machines.mdx b/src/partials/code-signing-and-clean-virtual-machines.mdx new file mode 100644 index 0000000..3b5a474 --- /dev/null +++ b/src/partials/code-signing-and-clean-virtual-machines.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Code signing and clean virtual machines + +Every Bitrise build uses a clean virtual machine with no leftover files and configuration from previous builds. While you most likely have all the necessary code signing files (certificates and provisioning profiles) available on your local machine this is not the case with our virtual machines. They do not contain any code signing files relevant to your project, that is why you have to make sure: + +- You choose the right code signing asset management option to upload the provisioning profiles to Bitrise. From here our Steps will download the files to the virtual machine at runtime. +- You upload the necessary signing certificates to the **Code Signing** tab. +- You have connected your Bitrise account to the Apple Developer portal. (This step is not needed if you use the **Certificate and Profile Installer** Step.) to Apple Developer portal. + + If you suspect an error is related to code signing, there is almost certainly a problem with one of these three. When trying to build an iOS app on Bitrise, we strongly recommend generating an .ipa file of the app locally, on your own machine first. If that fails, the build will certainly fail on Bitrise, too. + + :::tip[Verbose logs] + + If you are getting any issues, make sure you enable the Verbose log input in your code signing asset management or building Step to get more information on the nature of the issue. + + ::: diff --git a/src/partials/code-signing-and-exporting-a-macos-app.mdx b/src/partials/code-signing-and-exporting-a-macos-app.mdx new file mode 100644 index 0000000..789778b --- /dev/null +++ b/src/partials/code-signing-and-exporting-a-macos-app.mdx @@ -0,0 +1,34 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Code signing and exporting a macOS app + +To install and test the app on other physical devices, you will need to create and export an .app or .pkg file. This requires setting up code signing. In the example, we’ll be exporting an app with the **development** export method: you cannot upload such an app to Testflight but you can test it, for example, on the devices of your internal testers. + +:::note[Automatic Provisioining] + +The example procedure described here uses manual provisioning, with the **Certificate and profile installer** Step. However, Bitrise also supports [automatic provisioning](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning) but it is not in the scope of this guide. + +::: + +You will need: + +- the automatically created `deploy` workflow. +- a **Development** certificate (a .p12 certificate file). +- a **Development** type Provisioning Profile. For a macOS project, the file extension of the provisioning profile is `.provisionprofile`. + +1. Set the code signing type of your project in Xcode to either manual or automatic (Xcode managed), and generate the package file locally. +1. Collect and upload the code signing files. + + The tool can also upload your code signing files to Bitrise - we recommend doing so! Otherwise, upload them manually: enter the Workflow Editor and select the **Code signing** tab, then upload the files in their respective fields. +1. Go to your app’s Workflow Editor, and select the **deploy** workflow in the **WORKFLOW** dropdown menu in the top left corner. +1. Check that you have the **Certificate and profile installer** Step in your Workflow. It must be before the **Xcode Archive for Mac** Step (you can have other Steps between the two, like **Xcode Test for Mac**). +1. Check the **Export method** input under the **app/pkg export configs** input group of the **Xcode Archive for Mac** Step. + + If you selected **development** when you added the app to Bitrise, you don’t need to change the input. Otherwise, manually set it to **development**. + + ![macOS_export_method.png](/img/_paligo/uuid-0edf6398-0b97-f558-978e-f7d8bae394e0.png) +1. Start a build. + +If you uploaded the correct code signing files, the **Certificate and profile installer** Step should install your code signing files and the **Xcode Archive for Mac** Step should export an .app or .pkg file with the development export method. If you have the **Deploy to Bitrise.io** Step in your workflow, you can find the binary package file on the **Artifacts** tab of the build page. diff --git a/src/partials/code-signing-and-other-files.mdx b/src/partials/code-signing-and-other-files.mdx new file mode 100644 index 0000000..6b6caf0 --- /dev/null +++ b/src/partials/code-signing-and-other-files.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Code signing and other files + +The files you upload in the **Code Signing** tab of the Workflow Editor are stored on `Amazon S3` in a way that it’s only accessible for the web servers. + +The required credentials are not stored in any database, it is only available in the web servers’ environment. Build servers can’t access the files directly either. When a build starts, the web server generates a read-only, time limited access URL for these files, using [Amazon S3 pre-signed URLs](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-presigned-url.html). diff --git a/src/partials/code-signing-for-react-native-apps.mdx b/src/partials/code-signing-for-react-native-apps.mdx new file mode 100644 index 0000000..cdc9c42 --- /dev/null +++ b/src/partials/code-signing-for-react-native-apps.mdx @@ -0,0 +1,136 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Code signing for React Native projects + +A React Native project can consist of an Android and an iOS project. Both have different signing procedures. Follow our platform-specific instructions to code sign your mobile app for both iOS and Android. + +### Signing your Android project + +All Android apps must be digitally signed with a certificate before they can be installed on Android devices. On Bitrise, you can use our dedicated Step for this purpose but first you'll need a keystore file. + +1. [Generate a keystore file](https://developer.android.com/studio/publish/app-signing#generate-key)[Generate a keystore file](https://reactnative.dev/docs/signed-apk-android#generating-an-upload-key). +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Code signing** from the menu. +1. On the **Android** tab, click **Add keystore file**. +1. In the dialog, drag-and-drop the file and fill out the required fields then click **Continue** + + ![keystore-alias.png](/img/_paligo/uuid-0b79fc48-3861-0744-0f53-53a6c65ffc2c.png) +1. Open the Workflow Editor. +1. Add the **Android Sign****Generate cordova build configuration** Step to your Workflow. + + If you uploaded your keystore file and filled out the metadata, the required inputs of the Step are already filled and require no more configuration from you. + + :::important[Prerequisite of the Android Sign Step] + + Make sure to add the **Android Sign** Step after a build Step (**Android Build** Step or **Gradle Runner** Step) in your Workflow. + + ::: + +### Creating a signed IPA for Xcode projects + +:::note[Overview on iOS code signing in Bitrise] + +For a comprehensive overview on what Steps are available for code signing asset management, visit the [iOS code signing page](/en/bitrise-ci/code-signing/ios-code-signing.html). + +::: + +You can easily create a signed IPA file for your Xcode project with Bitrise. + +- You have set up [Apple service connection](/en/bitrise-platform/integrations/apple-services-connection.html) on Bitrise. +- Your [code signing files are managed correctly](/en/bitrise-ci/code-signing/ios-code-signing.html). +- You set the relevant inputs of our **Xcode Archive and Export for iOS** Step. + +:::important[Upload the distribution AND the development signing certificates] + +We strongly recommend uploading BOTH the development and distribution signing certificates for your project. If you don't have an uploaded development signing certificate, Steps with automatic provisioning options will generate one on the fly every time you start a build. This can eventually lead to reaching the maximum number of certificates, blocking you from starting new builds. + +::: + +If you’re all set, proceed to setting up IPA export in your Workflow. + + + + +1. Make sure the necessary [code signing files have been collected and uploaded](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning/uploading-ios-code-signing-certificates). +1. Make sure you have the **Xcode Archive & Export for iOS** Step in your Workflow. +1. Set the **Distribution method** input of the Step. + + ![xcode-archive.png](/img/_paligo/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png) + + The options are: + + - `app-store`: Choose this if you want to deploy the app to the App Store. Requires a Distribution certificate and an App Store provisioning profile. + - `ad-hoc`: Choose this if you want to deploy the app to ad-hoc testers. Requires a Distribution certificate and an Ad Hoc provisioning profile. + - `enterprise`: Choose this if you have an Apple Enterprise account and want to use that to distribute your app. + - `development`: Choose this for internal testing. Requires a Developer certificate and a Development provisioning profile. +1. Set the **Automatic code signing** input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t use automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Save the Workflow, and start a new build. + + + + +1. Make sure all the [necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) are available for your build. +1. Open the `bitrise.yml` file of your app. +1. Make sure you have the `xcode-archive` Step in your Workflow. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + ``` +1. Set the `distribution_method` input to the correct value. The available options are: + + - `app-store`: Choose this if you want to deploy the app to the App Store. Requires a Distribution certificate and an App Store provisioning profile. + - `ad-hoc`: Choose this if you want to deploy the app to ad-hoc testers. Requires a Distribution certificate and an Ad Hoc provisioning profile. + - `enterprise`: Choose this if you have an Apple Enterprise account and want to use that to distribute your app. + - `development`: Choose this for internal testing. Requires a Developer certificate and a Development provisioning profile. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - distribution_method: development + ``` +1. Set the `automatic_code_signing` input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - automatic_code_signing: api-key + - distribution_method: development + ``` + + + + +That’s all. Xcode will automatically select the right signing files based on your project’s Bundle ID and Team ID settings, and the export method you set. + +#### Signing an IPA file with a different team’s code signing file + +You might want to sign the IPA file with a different team’s code signing files. For example: + +- If you use your company’s code signing files for internal builds, but your client’s code signing files are used for App Store distribution. +- If you use Apple ID for automatic code signing and the Apple ID belongs to multiple teams, use The Developer Portal team to use for this export input to specify which team should be used for automatic code signing asset management. + +To do so: + +1. Make sure the right code signing files of the new development team are uploaded to Bitrise. +1. Set the The Developer Portal team to use for this export option as well (in addition to the **Distribution method**). +1. Set the **Distribution method**. diff --git a/src/partials/code-signing-ioniccordova-apps.mdx b/src/partials/code-signing-ioniccordova-apps.mdx new file mode 100644 index 0000000..b72a14a --- /dev/null +++ b/src/partials/code-signing-ioniccordova-apps.mdx @@ -0,0 +1,128 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Code signing Ionic/Cordova projects + +If you want to build an app for iOS or Android, you need to upload the platform-specific files on the **Project settings** page. You can also generate builds for both platforms which requires uploading all code signing files of the platforms. + +### iOS code signing for Ionic and Cordova projects + +Naturally, Bitrise supports iOS applications built with either **Ionic** or **Cordova**. However, the code signing process is slightly different compared to a native Xcode project. + +Bitrise supports both manual and automatic provisioning for Ionic and Cordova apps as well - and once again, the processes are somewhat different. + +#### Ionic/Cordova code signing with manual code signing asset management + +1. Generate the native Xcode project locally from your Ionic or Cordova project by calling `cordova platform add ios` or `ionic cordova platform add ios`. +1. Upload the files to [bitrise.io](https://www.bitrise.io): open the **Project settings** page and select **Code signing** on the left. Upload a certificate and a provisioning profile. + + ![upload-code-signing.png](/img/_paligo/uuid-88a3d6bf-be6f-1811-a908-9072b4b88a9a.png) +1. Make sure you have the **Certificate and profile installer** Step in your Workflow. +1. Add the **Generate cordova build configuration** Step to your Workflow. It must come after the **Certificate and profile installer** Step. +1. Fill in the required inputs for the Step. Please note that both the **Code Signing Identity** and the **Provisioning Profile** are required inputs for iOS apps even though they are not marked as such. + + - **Build configuration**: you can set it to either `debug` or `release`. + - **Code Sign Identity**: enter a Developer or a Distribution identity. + - **Provisioning Profile**: enter the appropriate provisioning profile. + - **Packaging Type**: this controls what type of build is generated by Xcode. Set the type of code signing you need. + + ![gen-cordova-build.png](/img/_paligo/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png) +1. Add the **Cordova archive** or the **Ionic archive** Step to your Workflow. +1. Fill in the required inputs. + + - The **Platform** input needs to be set to: `device`. + - The **Build command configuration** input must match the **Build configuration** input of the **Generate cordova build configuration** Step. + + This Step must come after the **Generate cordova build configuration** Step in the Workflow. +1. Run your build! + +#### Ionic/Cordova code signing with automatic code signing asset management + +1. Make sure your .p12 signing certificates are uploaded to [bitrise.io](https://www.bitrise.io). +1. Add the **Cordova prepare** or the **Ionic prepare** Step to your Workflow. These Steps call the `platform rm` and `platform add` commands. +1. Add the **[Manage iOS Code Signing](https://www.bitrise.io/integrations/steps/manage-ios-code-signing)** Step to your Workflow. If you have both the **Certificate and Profile Installer** and the **Manage iOS Code Signing** Steps in your Workflow, your build might encounter unexpected issues. + + The Step will export: + + - The project’s development team. + - The installed codesign identity’s name. + - The installed provisioning profile. + + :::caution[One code signing Step only] + + If you have both the **Certificate and profile installer** and the **Manage iOS Code Signing** Steps in your Workflow, your build might encounter unexpected issues. + + ::: +1. Select the **Apple service connection method** (based on the [Apple service you have set up in Bitrise](/en/bitrise-platform/integrations/apple-services-connection.html)) and the **Distribution method**. + + ![manage-ios-code.png](/img/_paligo/uuid-de743a8c-7a79-dda4-b9de-e3c71f2ac32a.png) +1. Add the **Generate cordova build configuration** Step to your Workflow. +1. Configure the Step to use the code signing settings exported by the **Manage iOS Code Signing** Step: + + **Development distribution example**: + + ``` + - generate-cordova-build-configuration: + inputs: + - development_team: $BITRISE_DEVELOPER_TEAM + - package_type: development + - code_sign_identity: iPhone Developer + - configuration: debug + ``` + + **Production distribution example**: + + ``` + - generate-cordova-build-configuration: + inputs: + - development_team: $BITRISE_DEVELOPER_TEAM + - package_type: app-store + - code_sign_identity: iPhone Developer + - configuration: release + ``` +1. Add the **Cordova Archive** or the **Ionic Archive** Step to your Workflow. +1. Fill in the required inputs. + + - The **Platform** input needs to be set to: `device`. + - The **Build command configuration** input must match the **Build configuration** input of the **Generate cordova build configuration** Step. + + ![gen-cordova-build.png](/img/_paligo/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png) +1. Set the **Should remove platforms as prepare step?** to `false`. This is crucial: it ensures the Step will not remove and re-add the platform of the native projects generated in the **Cordova prepare** or the **Ionic prepare** Step. +1. Run your build! + +### Android code signing using the Android Sign Step + +You can create a signed APK using the **Android Sign** Step in your Bitrise Workflow. This Step is configured to run if you have already uploaded your [keystore file](https://developer.android.com/studio/publish/app-signing#generate-key) to Bitrise. + +The **Android Sign** Step is not required if signing is configured in your project’s `build.gradle` file. If so, running the **Android Build** Step (or the **Gradle Runner** Step) signs the output (APK or AAB) automatically. Nevertheless, we recommend that you use the **Android Sign** Step to sign your project in an easy and secure way. + +:::note[jarsign and apksigner] + +APKs can be signed with either `jarsigner` or `apksigner`. For APKs, if you wish to use apksigner to sign your project, then in the Android Sign Step you have to first set the Enables `apksigner` input to true and leave the APK Signature Scheme input on automatic. This way `apksigner` checks your APK’s minimum and target SDK versions and chooses the required schemes. It signs your project with V1 scheme if your minimum supported version is low and it also signs with other schemes for newer systems. + +Please note that AAB files can only be signed with jarsigner. The Step uses `jarsigner` if it detects a file ending with `.aab` + +::: + +1. [Upload your keystore file to Bitrise](/en/bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise.html). +1. Add the **Android Sign** Step to your Workflow after the Step that builds your APK or AAB file. + + Bitrise uses the above Environment Variables and sets them as inputs into the respective fields of the **Android Sign** Step. Once the Step runs, it produces either a signed APK or an AAB. The signed APK or AAB is used in deploy Steps, for example, the**Google Play Deploy** Step or the **Deploy to Bitrise.io** Step. The latter deploys the APK/AAB on the **Artifacts** tab. You can also use [Release Management](urn:resource:publication:90740) to deploy your app once you built an installable artifact. + +:::note[Downloading your keystore file] + +You can download your keystore file to the project directory using the **[File Downloader](https://www.bitrise.io/integrations/steps/file-downloader)** Step: + +``` +- file-downloader: + inputs: + - source: $BITRISEIO_ANDROID_KEYSTORE_URL + - destination: "$HOME/keystores/my_keystore.jks" #native android# +``` + +If a Step requires the keystore file, make sure to include that Step AFTER the **File Downloader** Step. + +After this Step, `my_keystore.jks` will be available at `$HOME/keystores/my_keystore.jks`. + +::: diff --git a/src/partials/codepush-plans-and-tiers.mdx b/src/partials/codepush-plans-and-tiers.mdx new file mode 100644 index 0000000..abc77f3 --- /dev/null +++ b/src/partials/codepush-plans-and-tiers.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## CodePush plans and tiers + +Your CodePush use is measured by the following factors: + +- **Monthly active users**: A unique end user who downloads one or more CodePush updates within a single monthly billing cycle. Multiple downloads by the same person in that month count as a single MAU. +- **Data transfer**: The total size of files delivered by CodePush updates to your users. +- **Storage**: The total amount of space (GiB) allocated to your workspace for storing CodePush update artifacts. + +In each pricing tier for CodePush, we offer different limits for these factors: + +| Plan | Tier (MAU) | Monthly active users | Data transfer limit | Storage | Monthly fee | +| --- | --- | --- | --- | --- | --- | +| Basic | 100k MAU | 100,000 | 5,000 GiB | 5 GiB | $0 | +| Pro | 250K MAU | 250,000 | 12,500 GiB | 25 GiB | $294 | +| 500K MAU | 500,000 | 25,000 GiB | 25 GiB | $572 | | +| 1M MAU | 1,000,000 | 50,000 GiB | 25 GiB | $1,111 | | +| 2M MAU | 2,000,000 | 100,000 GiB | 25 GiB | $2,156 | | +| 3M MAU | 3,000,000 | 150,000 GiB | 25 GiB | $3,139 | | +| 5M MAU | 5,000,000 | 250,000 GiB | 25 GiB | $5,072 | | diff --git a/src/partials/collaboration-in-projects.mdx b/src/partials/collaboration-in-projects.mdx new file mode 100644 index 0000000..d1f42fa --- /dev/null +++ b/src/partials/collaboration-in-projects.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Collaboration in projects + +Project-level collaboration means users working together on a Bitrise project. User can have different roles and permissions within the same project. If the project has both a CI configuration and a Release Management app, you can configure separate access for those two products. + +Project collaboration is defined in two ways: by adding contributors and by assigning workspace groups to the project. + +### Project contributors + +A project contributor is a user who is individually assigned to a project, not as part of a group. A contributor can be a member of the workspace that owns the project, or they can be an outside contributor. Outside contributors can be added only if the feature is enabled for the workspace that owns the project. + +Contributors are assigned their own roles and permissions to the project. You can add workspace members as contributors to a project either from the **Workspace settings** page or the **Project settings** page. Outside contributors can only be added on the **Project settings** page. + +For details, check out [Managing user access to a project](/en/bitrise-platform/projects/managing-user-access-to-a-project). + +### Groups + +Groups are workspace groups: you can assign workspace groups to any project owned by the workspace. On the project level, this means that every member of the group will have the same roles and permissions that the group has on the project. + +You can assign workspace groups to projects either from the **Workspace settings** page or **Project settings** page. + +For details, check out [Managing user access to a project](/en/bitrise-platform/projects/managing-user-access-to-a-project). + +### Roles and permissions in projects + +Projects have no separate roles just for project access: roles and permissions are based on product access. Bitrise CI and Release Management both have their own set of roles and permissions. Each contributor and group can be assigned separate roles for these two products. + +There is one exception: you can grant a user or group full **Admin** access to a project. **Admin** access means managing all aspects of a project, with access to all products. This is effectively the same as separately granting the **Admin** role on both Bitrise CI and Release Management. + +Read more in [Product access](/en/bitrise-platform/getting-started/collaboration/product-access). diff --git a/src/partials/collaboration-in-workspaces.mdx b/src/partials/collaboration-in-workspaces.mdx new file mode 100644 index 0000000..37245d2 --- /dev/null +++ b/src/partials/collaboration-in-workspaces.mdx @@ -0,0 +1,51 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Collaboration in workspaces + +The main organizing entity of Bitrise is the workspace. Workspaces own projects, you can connect third-party integrations on workspace level, and you can set up collaboration in a workspace. + +### Workspace owners + +Each workspace has at least one owner: by default, it's the account that created the workspace. Owners have full control over all aspects of the workspace, including collaboration features. + +For more information, check out [Changing the owners of a Workspace](/en/bitrise-platform/workspaces/changing-the-owners-of-a-workspace). + +### Workspace members + +You can add individual members to workspaces. You can assign product access and project roles to members: + +- Product access means selecting the products the member can work on. For example, you can configure members to only have access to Bitrise CI, not Release Management. +- Project roles mean the roles and permissions on the specific projects owned by the workspace. You can assign different roles and permissions for different projects. Within the same project, you can assign different roles for Bitrise CI and Release Management, even if the member has access to both products. + +As such, even if your workspace has hundreds of projects, you can configure fine-grained access for team members so they only see the products and projects that they need. + +For more information, check out [Workspace collaboration](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration). + +### Workspace groups + +Workspace groups are made up of workspace members. Groups make it easy to manage product and project access in bulk. You don't need to set up specific fine-grained access for every member separately; instead, you invite a member and then add them to a group with the required permissions. + +Just like members, groups can be restricted to certain products and projects. Groups can be assigned roles and permissions on projects: this means that all members in the group will be assigned those roles and permissions. + +Group permissions don't override workspace member permissions. For example, let's say that: + +- A user is part of a group that has Developer access to a CI project. +- The same user has Admin access to the same CI project as a workspace member. + +In this case, the user will have Admin access to the project. + +For more information, check out [Workspace groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups). + +### Outside contributors in workspaces + +Outside contributors are users who aren't members of the workspace but they are added to one or more projects that the workspace owns. These users won't have access to the workspace itself, only the assigned projects. Their roles and permissions can be configured only on the **Project settings** page. + +Outside contributors have to be enabled in the **Workspace settings** page. + +### Workspace roles + +When inviting someone to a workspace, you can also assign a workspace role to them. Workspace roles define the users' access to the workspace itself, what actions the users can perform. For example, a user with the **Manager** role can update workspace integrations, add or remove members but can't access billing details. + +For more information, check out [Roles and permissions in workspaces](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces). diff --git a/src/partials/collating-test-attachments-with-test-results.mdx b/src/partials/collating-test-attachments-with-test-results.mdx new file mode 100644 index 0000000..4215f45 --- /dev/null +++ b/src/partials/collating-test-attachments-with-test-results.mdx @@ -0,0 +1,144 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Collating test attachments with test results + +Many tests generate image files (screenshot tests, XCUITests, etc). Bitrise test reports automatically collate image files with associated test cases for Xcode tests (using the `xcresult` file). + +:::note[Supported file formats] + +Currently, we support the following file formats for attachments: + +`.jpg, .jpeg, .png, .txt, .log, .mp4, .webm, .ogg` + +::: + +However, if your test doesn't generate an `xcresult` file, you can still achieve the same thing by generating a JUnit XML file and using Bitrise Steps: + + + + +1. Generate a `JUnit.xml` file from your tests. + + The general file structure should look something like this: + + ``` + + + + + + + ``` +1. Add a `` element to associate an attachment with a `testcase`. + + The `name` attribute of the element must be set with a value `attachment_#` where `#` is the ordered index of the attachment file, and the value is the filename. Bitrise will show attachments for any test with the attachment properties, but it's most common to only attach screenshots to failed tests. Mark a test as failed with a `` element. + + ``` + + + Call stack printed here + + + + + + + ``` +1. Add the **Export test results to Test Reports** Step to your Bitrise Workflow. It should be version 1.1.0 or higher. +1. Set a test name in the **The name of the test** input. +1. Set the path to your JUnit XML file in the **Test result search pattern** input. +1. Add the **Deploy to Bitrise.io** Step to the end of your Workflow. + + You don't have to change the default input values. + + + + +1. Generate a `JUnit.xml` file from your tests. + + The general file structure should look something like this: + + ``` + + + + + + + ``` +1. Add a `` element to associate an attachment with a `testcase`. + + The `name` attribute of the element must be set with a value `attachment_#` where `#` is the ordered index of the attachment file, and the value is the filename. Bitrise will show attachments for any test with the attachment properties, but it's most common to only attach screenshots to failed tests. Mark a test as failed with a `` element. + + ``` + + + Call stack printed here + + + + + + + ``` +1. Add the `custom-test-results-export` Step to your Bitrise Workflow after generating your JUnit XML file. It should be version 1.1.0 or higher. + + ``` + workflows: + inline_attachment: + steps: + - generate-text-file: + inputs: + - file_name: junit.xml + - file_content: "xml content with references to image files here" + - custom-test-results-export: + ``` +1. Set a test name in the `test_name` input. + + ``` + - custom-test-results-export@1: + inputs: + - test_name: example_tests + ``` +1. Set the path to your JUnit XML file in the `search_pattern` input. + + ``` + - custom-test-results-export@1: + inputs: + - test_name: example_tests + - search_pattern: junit.xml + ``` +1. Add the `deploy-to-bitrise-io` Step to the end of your Workflow. + + You don't have to change the default input values. The full Workflow in your configuration YAML file might look something like this: + + ``` + workflows: + inline_attachment: + steps: + - generate-text-file@0: + inputs: + - file_name: junit.xml + - file_content: "xml content with references to image files here" + - custom-test-results-export@1: + inputs: + - test_name: example_tests + - base_path: "." + - search_pattern: junit.xml + - script@1: + inputs: + - content: | + #!/usr/bin/env bash + set -ex + set -o pipefail + + TEST_RESULTS_DIR=$(find "$BITRISE_TEST_DEPLOY_DIR" -type d -name "example_tests" -print -quit) + cp ~/*.jpg $TEST_RESULTS_DIR + title: Copy image files to test directory + - deploy-to-bitrise-io@2: {} + ``` + + + diff --git a/src/partials/conditional-caching.mdx b/src/partials/conditional-caching.mdx new file mode 100644 index 0000000..4aa9380 --- /dev/null +++ b/src/partials/conditional-caching.mdx @@ -0,0 +1,53 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using conditional caching with dynamic keys + +You might not want to update a cache archive every time you run a build. By skipping caching, you can: + +- Avoid saving potentially incorrect build data in the cache. +- Make the PR validation workflow faster. +- Limit the amount of data stored and transferred. + +If the cached content did not change during your build at all, the **Save cache** Step can automatically skip compressing and uploading the cache. To make this work, you need to make sure your cache archive has a unique cache key that changes whenever the contents of the cache change: in practice, this requires [a dynamic key with a checksum](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/key-based-caching-templates-and-functions) and a file that describes the cached content. The checksum will be calculated based on the contents of the file; if the file remains unchanged, so does the checksum. + +We strongly recommend configuring the Step in a way to take advantage of this feature. Follow the steps below, or skip ahead to our [YAML example](#example-idm4530222894620833351589491015). + +:::tip[Skipping the Save cache Step entirely] + +If you don't wish to update the cache archive even if the content that would be cached has changed, you can either remove the **Save cache** Step from your Workflow or you can set conditions for the Step: [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Open your Workflow and select the **Save cache** Step. +1. Set the **Unique cache key** input to `true`. + + If the input is set to `false`, the Step can still skip uploading the cache but it will need to create the cache archive first to calculate its checksum. This takes time. +1. In the **Cache key** input, create a key with a checksum for a file that describes the cached content. + + For example, `npm-cache-{{ checksum "package-lock.json" }}` is a dynamic key that remains unchanged as long as the `package-lock.json` file does not change. +1. Add the same dynamic key to the **Cache keys** input of the **Restore cache** Step. + +If everything is configured correctly, if the keys in the two caching Steps match, the cache archive will not be updated. + +**YAML example for using a dynamic key with checksum** + +In this example, the cache key calculates the sum for any `.gradle` file and the `gradle.properties` file. Both the **Restore cache** and the **Save cache** Step looks for the same cache key: + +``` +workflows: + caching: + steps: + - restore-cache@1: + inputs: + - key: gradle-cache-{{ checksum "**/*.gradle*" "gradle.properties" }} + - save-cache@1: + inputs: + - key: gradle-cache-{{ checksum "**/*.gradle*" "gradle.properties" }} + - is_key_unique: 'true' +``` diff --git a/src/partials/configuring-a-pipeline-with-stages.mdx b/src/partials/configuring-a-pipeline-with-stages.mdx new file mode 100644 index 0000000..77fec01 --- /dev/null +++ b/src/partials/configuring-a-pipeline-with-stages.mdx @@ -0,0 +1,110 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring a Pipeline with stages + +Configuring a Pipeline that contains stages is only possible by directly editing the bitrise.yml file. You can create and modify Workflows in the graphical Workflow Editor but you need to define Pipelines and Stages in YAML format. + +### Defining Pipelines with stages + +The `bitrise.yml` file contains the full configuration of your Pipelines. As with all `bitrise.yml` files, first you need to define the format version and the project type. + +``` +--- +format_version: '8' +default_step_lib_source: +project_type: android +``` + +This is a bare minimum `bitrise.yml` configuration. To define your Pipelines, you will need to use the `pipelines` attribute. + +``` +pipelines:   + pipeline-successful: +    stages: +    - stage-successful-1: {} +    - stage-successful-2: {} +    - stage-successful-3: {} +``` + +In this example, we have a Pipeline called `pipeline-successful`, with three Stages that will run consecutively. This means that if `stage-successful-1` finishes successfully, `stage-successful-2` starts. If any of the Stages fail, the subsequent Stage will not start: instead, the Pipeline will be aborted and marked as failed. + +Each Stage has to be defined separately under the `stages` attribute. Defining a Stage means specifying the Workflows that are part of the Stage. + +``` +stages: +  stage-successful-1: +    workflows: +    - test-1: {} +  stage-successful-2: +    workflows: +    - build-1: {} +    - build-2: {} +  stage-successful-3: +    workflows: +    - deploy-1: {} +    - deploy-2: {} +``` + +In this example, the Stages run the `test-1`, `build-1`, `build-2`, `deploy-1`, and `deploy-2` Workflows. + +### Configuring a Stage to always run + +By default, if a Stage fails - because one of its Workflows failed -, any other subsequent Stages of the Pipeline will not run. However, you can configure your Pipeline to run certain Stages unless the Pipeline is aborted. + +To do so, you just need to set the should_always_run attribute of the Stage to true: + +``` +stages: +  stage-always-run-successful-1: +    should_always_run: true +    workflows: +    - deploy-1: {} +    - deploy-2: {} +``` + +In the example above, the Stage called `stage-always-run-successful-1` will always run, regardless of the status of previous Stages. The only way these Stages will not run is if the Pipeline build is aborted by the user. + +### Aborting the Workflows of a failed Stage + +By default, if a Workflow in a particular Stage fails, the other Workflows in the same Stage aren’t automatically aborted: these Workflows will run but the next Stage won’t start. However, you can change this behavior to immediately and automatically abort all other Workflows in the same Stage. + +To do so, you need to set the abort_on_fail attribute to `true`: + +``` +stages: +  stage-abort-on-fail-1: +    abort_on_fail: true +    workflows: +    - deploy-1: {} +    - deploy-2: {} +``` + +### Sharing Env Vars between Pipeline Stages + +You can reuse any environment variable from a Workflow and reuse it in subsequent Workflows using the [Share Pipeline variables](https://github.com/bitrise-steplib/bitrise-step-share-pipeline-variable) Step. + +:::tip[Optional Workflows using run_if conditions] + +You can easily combine the **Share Pipeline variables** Step with `run_if` expressions to create Pipelines with optional Workflows. For more information, check out [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). + +::: + +To do so: + +1. Add the **Share Pipeline variables** Step to the Workflow. +1. Optionally, you can define additional run conditions in the **Additional run conditions** input. The Step will only run if the conditions you specify here are true. +1. Add the Env Var(s) you would like to use in subsequent Workflows in the **Variables to share between Pipeline Workflows** input. + + :::tip[Using environment variable keys] + + You can define Env Vars using a `{key}={value}` syntax. For example, `MY_ENV_KEY=value`, or `INSTALL_PAGE_URL=$BITRISE_PUBLIC_PAGE_URL`. + + If you want to use the default environment variable keys, you can use a shorthand syntax. For example, `EXISTING_ENV_KEY`. + + Sharing Env Vars using this Step does not override existing Env Vars defined in the app. + + ::: + +That's it! You can now use the Env Var in any subsequent Stage! diff --git a/src/partials/configuring-a-stage-to-always-run.mdx b/src/partials/configuring-a-stage-to-always-run.mdx new file mode 100644 index 0000000..2a9bfce --- /dev/null +++ b/src/partials/configuring-a-stage-to-always-run.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring a Stage to always run + +By default, if a Stage fails - because one of its Workflows failed -, any other subsequent Stages of the Pipeline will not run. However, you can configure your Pipeline to run certain Stages unless the Pipeline is aborted. + +To do so, you just need to set the should_always_run attribute of the Stage to true: + +``` +stages: +  stage-always-run-successful-1: +    should_always_run: true +    workflows: +    - deploy-1: {} +    - deploy-2: {} +``` + +In the example above, the Stage called `stage-always-run-successful-1` will always run, regardless of the status of previous Stages. The only way these Stages will not run is if the Pipeline build is aborted by the user. diff --git a/src/partials/configuring-bitrise-as-a-saml-app-for-okta.mdx b/src/partials/configuring-bitrise-as-a-saml-app-for-okta.mdx new file mode 100644 index 0000000..5357521 --- /dev/null +++ b/src/partials/configuring-bitrise-as-a-saml-app-for-okta.mdx @@ -0,0 +1,26 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring Bitrise as a SAML app for Okta + +1. Click the **Assignments** tab of your Bitrise app. + + Here you can assign Bitrise to individuals/groups. Make sure you assign Bitrise to all Workspace members who will access the Bitrise Workspace through SAML. + + ![assignments_okta.png](/img/_paligo/uuid-1c93dfa7-c82d-5694-1717-62b9239fe667.png) +1. Click the **Sign-On** tab of your Bitrise app. You will see that SAML setup is not completed yet. Scroll down, and click **View SAML setup instructions**. + + ![saml_sso_config_samlsso2.png](/img/_paligo/uuid-22736f46-339f-3986-05c1-cbbcf7eb57f6.png) + + The **How to Configure SAML 2.0 for Bitrise application** page is displayed. It summarizes all the information you need to set up the SAML connection between Bitrise and Okta. + + ![configure-bitrise-okta-1.jpg](/img/_paligo/uuid-a01cfa75-834c-9ffe-57bc-0a097a6df676.jpg) +1. Copy the **Identity Provider Single Sign-On URL** and paste it in your Bitrise Workspace’s **SSO URL** field. + + If you haven’t pasted the Certificate’s content or uploaded the file itself into the **SAML SSO provider certificate** field of your Bitrise Workspace yet, you can do so now. + + ![saml_sso_url.png](/img/_paligo/uuid-bce20b25-c8cc-fed6-c43c-627647f4c5a4.png) +1. Click **Configure SSO** on your Bitrise Workspace. + +That's it! From now on, whenever you access the **Single Sign-on** page, you can configure the SAML SSO settings. diff --git a/src/partials/configuring-build-status-reporting.mdx b/src/partials/configuring-build-status-reporting.mdx new file mode 100644 index 0000000..9914bd9 --- /dev/null +++ b/src/partials/configuring-build-status-reporting.mdx @@ -0,0 +1,30 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up build status reporting + +There are two ways to set up Git status reports on Bitrise: + +- By using the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration). It automatically sends status reports without any additional configuration, other than optionally customizing your reports. +- Via the [service credential user](/en/bitrise-platform/integrations/the-service-credential-user.html). If you use [OAuth authentication for repository access](/en/bitrise-platform/repository-access/repository-access-with-oauth), this is how you can send status reports. The service credential user must have their Bitrise account connected to the Git provider account and must have access to the Git repository. The following permissions are required: + + - GitHub: **Write** + - Bitbucket: **Write** + - GitLab: **Developer**. + + You can test the service credential user's connection at any time: [Troubleshooting build status reporting](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider/troubleshooting-build-status-reporting). + +:::tip[Allowlist the Bitrise website IP addresses] + +If you use some form of self-hosted solution for storing your code, you might need to allowlist the static IP addresses of the Bitrise website and its background workers. This allows you to use such features as storing the `bitrise.yml` file in your own repository, or receiving build status updates from Bitrise: [IP addresses for the Bitrise website](/en/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines/ip-addresses-for-the-bitrise-website). + +::: + +You can send both project level and Workflow or Pipeline level reports with both methods. + +### Branch protection rules + +When updating your build status report settings, you might need to change your branch protection rules at your Git provider. + +If you use [Workflow/Pipeline level status reports](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider/creating-custom-status-reports) or use the `target-id` [dynamic variable](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider/creating-custom-status-reports), you will have a different status check for every Workflow or Pipeline that was run. This means you might need more than one branch protection rule IF all checks are mandatory for all your pull requests. diff --git a/src/partials/configuring-claim-rules.mdx b/src/partials/configuring-claim-rules.mdx new file mode 100644 index 0000000..0a0fd84 --- /dev/null +++ b/src/partials/configuring-claim-rules.mdx @@ -0,0 +1,29 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring claim rules + +1. On the **Edit Claim** **Issuance Policy** page, click the **Add Rule** button and hit **OK**. + + ![editclaims.jpg](/img/_paligo/uuid-0a57f576-6cbd-5055-e09e-078920e410ce.jpg) +1. Create a **Send LDAP Attributes as Claims** claim rule and click **Next**. +1. On the **Configure Claim Rule** page: + + - Add a rule name, for example Send E-mail, in the **Claim rule name** field. + - Select an **Attribute Store** which is most likely the Active Directory. + - In the **Mapping of LDAP attributes to outgoing claim types** field select E-mail Addresses. +1. Click **Finish**. + + ![configureclaimrule.jpg](/img/_paligo/uuid-73afe848-4767-6771-43fb-4675ecc1a189.jpg) +1. Add another new rule that turns an E-mail to a formatter NameID. To do so, click **Add rule** in the **Edit Claim** **Issuance Policy** page again. +1. On the **Select Rule Template**, select **Transform an Incoming Claim** option in the **Claim rule template** dropdown. Click **Next**. + + ![chooseruletype.jpg](/img/_paligo/uuid-0ef22e95-4303-25ce-b8e9-69884bbe7cf7.jpg) +1. Give a name to the new rule, for example, `Transform E-mail`. +1. Select **E-Mail Address** as the **Incoming Claim Type**. +1. Select **NameId** as the **Outgoing claim type.** +1. Choose **Email** as the **Outgoing name ID format**. +1. Hit **OK** to finish the process. + + ![newrule.jpg](/img/_paligo/uuid-ce7f8183-941b-0b73-92c2-185e235442ee.jpg) diff --git a/src/partials/configuring-codepush-credentials-on-bitrise.mdx b/src/partials/configuring-codepush-credentials-on-bitrise.mdx new file mode 100644 index 0000000..9893782 --- /dev/null +++ b/src/partials/configuring-codepush-credentials-on-bitrise.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring CodePush credentials on Bitrise + +1. [Get your credentials](/en/release-management/codepush/creating-and-releasing-codepush-updates/getting-your-codepush-credentials): you need the Release Management app IDs and the CodePush deployment IDs and deployment keys. +1. [Create Environment Variables](/en/bitrise-ci/configure-builds/environment-variables/setting-an-env-var-in-the-workflow-editor) for the deployment IDs and the connected app IDs: + + - IOS_PROD_DEPLOYMENT_ID: The deployment ID for the iOS app. + - ANDROID_PROD_DEPLOYMENT_ID: The deployment ID for the Android app. + - IOS_CONNECTED_APP_ID: The app ID for the iOS app. + - ANDROID_CONNECTED_APP_ID: The app ID for the iOS app. +1. [Create Secrets](/en/bitrise-ci/configure-builds/secrets/setting-a-secret) for the deployment key and the API token: + + - IOS_PROD_DEPLOYMENT_KEY: The deployment key of the iOS deployment from Bitrise CodePush. + - ANDROID_PROD_DEPLOYMENT_KEY: The deployment key of the Android deployment from Bitrise CodePush. + - BITRISE_API_TOKEN: Your personal access token or workspace API token. diff --git a/src/partials/configuring-codepush-for-expo-apps.mdx b/src/partials/configuring-codepush-for-expo-apps.mdx new file mode 100644 index 0000000..8b43221 --- /dev/null +++ b/src/partials/configuring-codepush-for-expo-apps.mdx @@ -0,0 +1,69 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring CodePush for Expo apps + +1. Convert `app.json` to `app.config.js` so that you can use environment variables. + + For more information, check out [the Expo docs on dynamic configuration](https://docs.expo.dev/workflow/configuration/#dynamic-configuration). +1. Set your `apps ios.bundleIdentifier` and `android.package` in `app.config.js`. These should match the values used while [creating the apps](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management) on Bitrise. +1. Install the React Native CodePushNext SDK, `dotenv`, and `expo-build-properties` packages: + + ``` + npm install @code-push-next/react-native-code-push dotenv expo-build-properties + ``` +1. Setup Expo CodePush Plugin: + + - Include the plugin in `app.config.js`. + + :::tip[Workspace slug] + + The server URL requires the Bitrise workspace slug: [Identifying Workspaces and apps with their slugs](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs). + + ::: + + ``` + plugins: [ + [ + "@code-push-next/react-native-code-push/expo", // CodePush plugin + { + ios: { + // Use the environment variable for the iOS CodePush Deployment Key + CodePushDeploymentKey: IOS_CODE_PUSH_DEPLOYMENT_KEY, + CodePushServerURL: "https://.codepush.bitrise.io" + }, + android: { + // Use the environment variable for the Android CodePush Deployment Key + CodePushDeploymentKey: ANDROID_CODE_PUSH_DEPLOYMENT_KEY, + CodePushServerURL: "https://.codepush.bitrise.io" + } + } + ], + [ + "expo-build-properties", + { + ios: { + deploymentTarget: "15.5" + } + + } + ] + // Add other plugins here if you have more + ] + ``` +1. Add the deployment key values to an `.env` file. You get the deployment keys when [creating the CodePush deployment](/en/release-management/codepush/creating-a-codepush-deployment.html) on Bitrise. + + :::tip + + Add the `.env` file to your `.gitignore` to keep your keys secret! + + ::: + + ``` + # .env file + + # CodePush Deployment Keys + IOS_CODE_PUSH_DEPLOYMENT_KEY="" + ANDROID_CODE_PUSH_DEPLOYMENT_KEY="" + ``` diff --git a/src/partials/configuring-codepush-for-react-native-apps.mdx b/src/partials/configuring-codepush-for-react-native-apps.mdx new file mode 100644 index 0000000..8912fc2 --- /dev/null +++ b/src/partials/configuring-codepush-for-react-native-apps.mdx @@ -0,0 +1,133 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring CodePush for React Native apps + +CodePush for React Native requires installing the SDK and then setting up CodePush for both the iOS and the Android modules. + +1. Install the React Native CodePush : + + ``` + npm install @code-push-next/react-native-code-push + ``` +1. Set up CodePush for iOS. You can find the most important instructions here: [see topic](#section-id235250696678471). + + Read more in the GitHub repository of the SDK: [iOS](https://github.com/CodePushNext/react-native-code-push/blob/master/docs/setup-ios.md). +1. Set up CodePush for Android. You can find the most important instructions here: [see topic](#section-id235250698081008). + + Read more in the GitHub repository of the SDK: [Android](https://github.com/CodePushNext/react-native-code-push/blob/master/docs/setup-android.md). + +### iOS setup + +1. Make sure the bundle identifier matches the bundle identifier you used when [creating the app on Bitrise](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management). You can use `react-native-rename` to rename your app with a custom bundle identifier: [react-native-rename](https://www.npmjs.com/package/react-native-rename). +1. In `ios/Podfile`, look for the line `platform :ios`, `min_ios_version_supported`. Change it to `platform :ios, 15.5`. +1. Update `ios//AppDelegate.swift`: + + 1. Add an import statement for CodePush headers: + + ``` + import CodePush + ``` + 1. Find the following line of code: + + ``` + Bundle.main.url(forResource: "main", withExtension: "jsbundle") + ``` + 1. Replace it with this line: + + ``` + CodePush.bundleURL() + ``` + 1. Your `bundleURL` method should look like this: + + ``` + override func bundleURL() -> URL? { + #if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") + #else + CodePush.bundleURL() + #endif + } + ``` +1. Add the CodePush deployment key and the CodePush Server URL to `ios//Info.plist`: + + You get the deployment key when creating the [CodePush deployment on Bitrise](/en/release-management/codepush/creating-a-codepush-deployment.html). + + :::tip[Workspace slug] + + The server URL requires the Bitrise workspace slug: [Identifying Workspaces and apps with their slugs](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs). + + ::: + + ``` + #The CodePush deployment key + + CodePushDeploymentKey + + + #The CodePush server URL with the Bitrise workspace slug + + CodePushServerURL + https://.codepush.bitrise.io + ``` + +### Android setup + +1. Add a line at the end of `android/app/build.gradle` as an additional build task definition: + + ``` + ... + apply from: "../../node_modules/@code-push-next/react-native-code-push/android/codepush.gradle" + ... + ``` +1. Update `android/app/build.gradle android.defaultConfig` to setup `versionCode` and `versionName`: + + ``` + versionCode System.getenv("APP_VERSION_CODE") != null ? System.getenv("APP_VERSION_CODE").toInteger() : 1 + versionName System.getenv("APP_VERSION_NAME") != null ? System.getenv("APP_VERSION_NAME") : "1.0" + ``` +1. Update `android/app/src/main/java/…/MainApplication.kt` to use CodePush: + + :::important[PackageList] + + PackageList must be instantiated only once in the application's lifetime. + + ::: + + ``` + ... + // 1. Import the plugin class. + import com.microsoft.codepush.react.CodePush + + class MainApplication : Application(), ReactApplication { + override val reactNativeHost: ReactNativeHost = + object : DefaultReactNativeHost(this) { + override fun getPackages(): List = PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + // add(MyReactNativePackage()) + } + + // 2. Override the getJSBundleFile method in order to let + // the CodePush runtime determine where to get the JS + // bundle location from on each app start + override fun getJSBundleFile(): String { + return CodePush.getJSBundleFile() + } + }; + } + ``` +1. In `android/app/src/main/res/value/strings.xml`, add the CodePush deployment key and the CodePush Server URL. + + You get the deployment key when creating the [CodePush deployment on Bitrise](/en/release-management/codepush/creating-a-codepush-deployment.html). + + :::tip[Workspace slug] + + The server URL requires the Bitrise workspace slug: [Identifying Workspaces and apps with their slugs](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs). + + ::: + + ``` + + https://.codepush.bitrise.io + ``` diff --git a/src/partials/configuring-priority-for-build-triggers.mdx b/src/partials/configuring-priority-for-build-triggers.mdx new file mode 100644 index 0000000..664be5e --- /dev/null +++ b/src/partials/configuring-priority-for-build-triggers.mdx @@ -0,0 +1,41 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring priority for build triggers + +You can set priority for build triggers on the GUI of the Workflow Editor and in your configuration YAML file. Trigger priority overrides Pipeline and Workflow priority. + + + + +1. Open the Workflow Editor. +1. Select the Workflow or Pipeline you need. +1. Go to the **Triggers** tab. +1. Create a new trigger or edit an existing one and find the **Priority** input. + + ![trigger-priority.png](/img/_paligo/uuid-02de5b3a-d9bd-5890-cfc3-52462a3c8ff2.png) +1. Set an integer value between -100 and 100: higher number means higher priority. The default value is 0. + + + + +1. Open your configuration YAML file. +1. Find a trigger in a Pipeline or Workflow. +1. Add the **priority** input with an integer value between -100 and 100: higher number means higher priority. The default value is 0. + + ``` + workflows: + primary: + steps: + - activate-ssh-key: {} + - git-clone: {} + - deploy-to-bitrise-io: {} + triggers: + push: + - branch: main + priority: 10 + ``` + + + diff --git a/src/partials/configuring-priority-for-workflows-and-pipelines.mdx b/src/partials/configuring-priority-for-workflows-and-pipelines.mdx new file mode 100644 index 0000000..6ac1d57 --- /dev/null +++ b/src/partials/configuring-priority-for-workflows-and-pipelines.mdx @@ -0,0 +1,67 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring priority for Pipelines and Workflows + +You can configure priority by setting a value between -100 and 100 for the **Priority** property of any given Workflow or Pipeline. The default value is 0. + +Pipeline priorities override Workflow priorities. If a pipeline is triggered and assigned a priority, all constituent workflows will be triggered with the same priority. + +### Configuring Pipeline priority + + + + +1. Open the Workflow Editor. +1. On the left, select **Pipelines**. +1. Select the Pipeline you need and click **Properties**. + + ![pipeline-priority.png](/img/_paligo/uuid-c92f6dbc-0dee-4ec9-3680-53b83a30f2a2.png) +1. In the **Priority** input field, provide an integer between -100 and 100. The default value is 0. + + + + +1. Open your Configuration YAML file. +1. Find the Pipeline you need and add a `priority` input with an integer value between -100 and 100. + + If you don't have a `priority` input set, the Pipeline will have a default priority of 0. + + ``` + pipelines: + best-pipeline: + priority: 10 + ``` + + + + +### Configuring Workflow priority + + + + +1. Open the Workflow Editor. +1. On the left, select **Workflows**. +1. Select the Workflow you need from the dropdown menu and select the **Properties** tab on the right. + + ![workflow-priority.png](/img/_paligo/uuid-19da748e-432f-46b4-353f-a426a92cdd75.png) +1. In the **Priority** input field, provide an integer between -100 and 100. The default value is 0. + + + + +1. Open your Configuration YAML file. +1. Find the Workflow you need and add a `priority` input with an integer value between -100 and 100. + + If you don't have a `priority` input set, the Workflow will have a default priority of 0. + + ``` + workflows: + best-workflow: + priority: 10 + ``` + + + diff --git a/src/partials/configuring-priority-when-starting-a-build-manually.mdx b/src/partials/configuring-priority-when-starting-a-build-manually.mdx new file mode 100644 index 0000000..af01b34 --- /dev/null +++ b/src/partials/configuring-priority-when-starting-a-build-manually.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring priority when starting a build manually + +You can set a priority when [starting a build manually](/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html). The priority only takes effect if other builds are queued when you start a build. + +The priority set when manually starting the build overrides all other priorities. + +1. Open Bitrise CI and select your project. +1. On the main project page, click **Start build**. +1. Select the **Advanced** option. + + ![manual-build-priority.png](/img/_paligo/uuid-9fdfc68c-9744-f7ae-fee6-b4cc984bdf3e.png) +1. Find the **Priority** field and set an integer value between -100 and 100. The default value is 0. diff --git a/src/partials/configuring-ssh-keys-for-your-bitrise-app.mdx b/src/partials/configuring-ssh-keys-for-your-bitrise-app.mdx new file mode 100644 index 0000000..3655757 --- /dev/null +++ b/src/partials/configuring-ssh-keys-for-your-bitrise-app.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring SSH keys for your Bitrise project + +To configure SSH keys on [bitrise.io](https://www.bitrise.io/): + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Repository**. +1. Find the **Authorization** section and the **Authorization method** card. +1. Next to the SSH key, click **Replace**. + + If you haven't had an SSH key added before, the button will show **Add SSH keypair** instead. + + ![SCR-20260401-pvvq.png](/img/_paligo/uuid-f021126a-47d0-41a9-56f7-79b9c8461a0e.png) +1. Choose from one of three options: + + **Auto-add a generated SSH key to your repository**: Bitrise automatically registers a public SSH key to your GitHub repository. Choose this if you have administrator rights to the repository. + + **Copy a generated SSH key to your Git provider manually**: Bitrise generates an SSH keypair for you, and you have to manually register the public key to your Git repository. + + **Add your own SSH key**: You provide your own SSH keypair for authentication, and you have to manually register the public key to your Git repository. +1. Click **Save changes**. diff --git a/src/partials/configuring-step-inputs.mdx b/src/partials/configuring-step-inputs.mdx new file mode 100644 index 0000000..a021679 --- /dev/null +++ b/src/partials/configuring-step-inputs.mdx @@ -0,0 +1,152 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring Step inputs + +Step inputs are defined and configured in the `step.yml` file. + +In addition to a key and a value, Step inputs are required to have an `opts` property. This property contains the different options that define how the inputs are passed to the code of the Step and how it is presented in the Workflow Editor. The possible values of the input can be set in `opts` as well. Let’s see an example. + +``` +- install_defaults: "yes" + opts: + title: Installs default Codesign Files + value_options: + - "no" + - "yes" +``` + +The above input has the key install_defaults, and its default value is yes. + +The value_options option defines the possible values: in this case, yes and no. Its opts property contains some information about how the input is presented: in this case, it’s just a title option, which is always required. The title is displayed in the Workflow Editor instead of the key of the input. + +:::important[The `value_options` input] + +The `value_options` input must contain a string. This means that without the quotation marks, as indicated in the example, the validation will fail. + +::: + +### Naming and describing Step inputs + +A Step input can have a name, a summary, and a description, just like the Step itself. To define these: + +1. Include an `opts` property with the Step input. +1. Under opts, provide a title, a summary, and a description option. + +Let’s take a look at how these should look like! + +:::tip[Description and summary] + +Both `description` and `summary` accept Markdown formatting in its values. + +::: + +- `title`: It should be a short and descriptive sentence or half sentence: The Xcode project’s path. It should not be a CLI flag or API parameter name used internally. This makes Step configuration easier, as no preexisting knowledge will be required about the underlying tool or service interfaces. It’s also easier to change the Step’s implementation while maintaining backwards compatibility. +- `summary`: It is the short version of the description, which provides a quick overview of the input. On the Bitrise Workflow Editor, the summary of the inputs is presented by default when you click on a Step. +- `description`: It is the user facing description of the Step input: this should provide a deeper, more detailed explanation of the input. By default, it is not visible in the Workflow Editor, unless the user clicks on the input in question. + +Here is an example: + +``` +- install_defaults: "yes" + opts: + description: Installs default (Bitrise) Wildcard Provisioning Profile and + Certificate files for testing. If a profile and certificate that do not specifically match the bundle ID of your app are not on the build runner then Xcode will fall back on the wildcard certificate that is provided by enabling this Step input. + summary: Installs default (Bitrise) Wildcard code signing files. + title: Installs default code signing files +``` + +Now, let’s talk about some other configuration options for Steps. + +### Required inputs + +Required inputs must have a valid value, otherwise the Step will fail. + +To mark a Step input as required, use the is_required option of the `opts` property. It has two values: `true` and `false`. If set to `true`, the input will be displayed as **REQUIRED** on the Workflow Editor. + +``` +- keychain_password: $BITRISE_KEYCHAIN_PASSWORD + opts: + title: "Keychain's password" + is_required: true +``` + +### Using Env Vars as input values (is_expand) + +As noted earlier, it is possible to use Environment Variables as the value of any given input. By default, the Step will expand the Env Var and pass its value to the Step execution. This is defined by the `is_expand` option of the `opts` property. + +``` +- project_path: $BITRISE_PROJECT_PATH + opts: + is_expand: true +``` + +The `is_expand` option can have two values: true or false. If set to `true` - this is the default behavior -, the value of $BITRISE_PROJECT_PATH will be passed to Step execution. If set to `false`, the string $BITRISE_PROJECT_PATH will be passed (and this particular Step will fail as it will not find the project location). + +:::warning[Env Vars in Step code] + +Do not use Environment Variables directly in your Step’s code. Instead, expose every outside variable as an input of your Step and set the default value of that input to the Environment Variable you want to use. This way it’s easier to test the Step and the user of the Step can easily declare these inputs, without having to scour through code for the required variable. + +::: + +### Sensitive inputs + +You can mark Step inputs as sensitive to make sure their values do not get exposed. Sensitive inputs only accept [Secrets](/en/bitrise-ci/configure-builds/secrets.html) as values. This ensures they are not visible in build logs. + +To mark a Step input as sensitive, use the `is_sensitive` option of the `opts` property. It has two values: `true` and `false`. If set to `true`, the input will be displayed as **SENSITIVE** on the Workflow Editor. + +:::important[The `is_expand` option] + +If you mark an input as sensitive, the `is_expand` option of the input also must be true, which is the default setting. + +::: + +``` +inputs: + - certificate_urls: $BITRISE_CERTIFICATE_URL + opts: + title: "Certificate URL" + is_sensitive: true +``` + +### Grouping inputs together + +The category option is used to group inputs together. Inputs belonging to the same category are displayed together and collapsed by default in the Workflow Editor. + +``` +- default_certificate_passphrase: $BITRISE_DEFAULT_CERTIFICATE_PASSPHRASE + opts: + category: Default code signing files + description: | + Certificate passphrase of the default certificate. + is_sensitive: true + title: Default certificate passphrase +``` + +In this case, this input will appear with all the other inputs that have the same category set. + +Categories may be used if the Step has more than six inputs. The suggested maximum number of inputs in a group or in the root is six. + +Please keep in mind, when designing Step categories, that: + +- Required inputs should not be grouped! +- Grouped inputs should be displayed after non-categorised inputs. + +### Accepting a list of values for inputs + +It is absolutely possible to accept a list of values for a given input. If you wish to do so, we strongly recommend adding a list suffix to the key of the input (for example, `input_path_list`), and expect the values to be provided as a newline character (\n) separated list (for example, first value\nsecond value). + +Please use this solution unless you really need to use another character for separating values. Based on our experience, the newline character (\n) works really well as a universal separator character, as it’s quite rare in input values (compared to ,, ;, = or other more common separator characters). + +As a best practice, you should filter out empty items. Use either: + +``` +first value\n\nsecond value +``` + +or + +``` +first value\n \nsecond value +``` diff --git a/src/partials/configuring-the-gitlab-connection.mdx b/src/partials/configuring-the-gitlab-connection.mdx new file mode 100644 index 0000000..ca4f1a3 --- /dev/null +++ b/src/partials/configuring-the-gitlab-connection.mdx @@ -0,0 +1,42 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring the GitLab connection + +To access privately hosted GitLab repositories on Bitrise, you need to create a new OAuth application on your GitLab account, and assign the appropriate credentials to access your server. + +:::warning[Publicly resolvable IP address] + +Your self-hosted instance must have a publicly resolvable IP address, otherwise Bitrise won’t be able to connect to it. + +::: + +1. Log in to your GitLab instance with **root** privileges. If you connect to Bitrise **without root privileges**, your Workspace’s other team members will **not have access to the repository on the GitLab instance**. +1. Go to the admin area by clicking the little wrench icon on the top menu bar. +1. On the left menu bar, select **Applications**, then click **New Application**. + + ![New_Application.png](/img/_paligo/uuid-c139a2c3-3f9a-980e-41f0-a85bc3ea6bbb.png) +1. In the **Name** field, enter a name that clearly identifies the application. For the sake of simplicity, we recommend `Bitrise`. +1. In the **Callback URL** field, enter `https://app.bitrise.io/users/auth/gitlab/callback`. +1. In the **Scopes** menu, check **api**. + + ![New_Application_settings.png](/img/_paligo/uuid-9e8a91b7-c03a-f513-62a7-0e91426f1676.png) +1. Set the **Confidential** option to **No**. + + If the newly created app is configured to be confidential, Bitrise won't be able to access it! +1. Click **Submit**. On the next page, you should find the **Application Id** and a **Secret**. You’ll need both to connect to your GitLab instance on [bitrise.io](https://www.bitrise.io). + + ![Connecting_self-hosted_GitLab_instances.png](/img/_paligo/uuid-94e2570d-ce4b-720a-db91-52b46de0a96a.png) +1. Log in to Bitrise and select your Workspace. +1. On the left, select **Integrations**. +1. Find the **Self-hosted GitLab** section. + + ![self-hosted-gitlab.png](/img/_paligo/uuid-ee43070a-a23d-02a4-3860-9899749044e2.png) +1. Add your self-hosted GitLab credentials: + + - **App ID** + - **Secret** + - **Self-hosted URL** + +You are done! Now you are able to access your privately hosted repositories with Bitrise. diff --git a/src/partials/configuring-the-instance.mdx b/src/partials/configuring-the-instance.mdx new file mode 100644 index 0000000..2bd5068 --- /dev/null +++ b/src/partials/configuring-the-instance.mdx @@ -0,0 +1,113 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring the instance + + + + +1. Go to the AWS Marketplace page, and on the left, select **Manage subscriptions**. +1. Choose the AMI you need, and select **Launch new instance**. + + ![aws-markplace-amis.png](/img/_paligo/uuid-81bb90b8-85ea-ae9e-7349-3783f7af230e.png) +1. Make sure the software version and the region are correct, then click **Continue to launch through EC2**. +1. Fill out the required fields on the **Launch an instance** page: + + **Name and tags** section: + + - **Name**: The name of your instance. + + **Instance type** section: + + - **Instance type**: The supported types are: `mac2.metal`, `mac2-m2.metal`, `mac2-m2pro.metal`. + + :::important[Dedicated host type] + + The selected instance type must match the type of the dedicated host! + + ::: + + **Key pair (login)** section: + + - **Key pair name - *required***: + + **Network settings** section - click **Edit** to modify the settings: + + - **VPC - *required***: Select a virtual private cloud from the dropdown menu. + - **Subnet**: Select your preferred subnet from the dropdown menu, or leave it on **No preference**. + - **Firewall (security groups)**: Create a new security group or select an existing one. + + **Configure storage** section: + + - Set the size of the storage volume in gigabytes: + + For the bare metal macOS AMI, the minimum number is 400 GB but we recommend at least 450 GB. + + For the virtualized macOS AMI, we recommend 700GB with 1 VM per host and 1000GB with 2 VM per host. + + :::note[Increasing the disk size] + + If you need to increase the disk size from the default 400 GB, re-partition the disk so macOS can use all the allocated storage. You can do this when setting up the instance by adding a script to **User data** in the **Advanced details** section: [Increasing disk size on a Mac instance](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/increasing-disk-size-on-a-mac-instance). + + ::: + - Select a root volume type from the dropdown menu. + + :::note[Storage type] + + We recommend using at least the **gp3** root volume, the higher the IOPS the better. + + ::: + + **Advanced details** section: + + - **Tenancy**: Select the **Dedicated host - launch this instance on a dedicated Host** option from the dropdown menu. + - **Target host**: Select the **Host ID** option from the dropdown menu. + - **Tenancy host ID**: Select the host ID of the previously created dedicated host. + + + + +1. [Configure a runner pool](/en/bitrise-build-hub/infrastructure/configuring-runner-pools) and copy the token required for authentication. +1. Navigate to the EC2 Dashboard. +1. Go to the AWS Marketplace page, and on the left, select **Manage subscriptions**. +1. Choose the AMI you need, and select **Launch new instance**. + + ![aws-markplace-amis.png](/img/_paligo/uuid-81bb90b8-85ea-ae9e-7349-3783f7af230e.png) +1. Make sure the software version and the region are correct, then click **Continue to launch through EC2**. + + :::important[Service quotas] + + Make sure you have enough service quotas in your selected region to be able to launch as many instances as you need. + + - [Viewing current quotas](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html#view-limits). + - [Request an increase](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html#request-increase). + + ::: +1. Fill out the required fields on the **Launch an instance** page: + + **Name and tags** section: + + - **Name**: The name of your instance. + + **Instance type** section: + + - **Instance type**: Select an x86_64 Linux metal instance. + + **Key pair (login)** section: + + - **Key pair name - *required***: + + **Network settings** section - click **Edit** to modify the settings: + + - **VPC - *required***: Select a virtual private cloud from the dropdown menu. + - **Subnet**: Select your preferred subnet from the dropdown menu, or leave it on **No preference**. The subnet must be able to access the internet either via a NAT Gateway or an Internet Gateway. + - **Firewall (security groups)**: Create a new security group or select an existing one. + + **Configure storage** section: + + - Set the size of the storage volume in gigabytes. The minimum value is 450 GB. + - Select a root volume type from the dropdown menu. + + + diff --git a/src/partials/configuring-the-steps-for-automatic-provisioning.mdx b/src/partials/configuring-the-steps-for-automatic-provisioning.mdx new file mode 100644 index 0000000..a677a85 --- /dev/null +++ b/src/partials/configuring-the-steps-for-automatic-provisioning.mdx @@ -0,0 +1,70 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring the Steps for automatic provisioning + +There are two ways to handle automatic provisioning on Bitrise: + +- Using the official Xcode Steps that can both manage code signing files and build your app. +- Using the **Manage iOS Code Signing** Step. + +[see topic](#table-idm4567202697110432938454460949) describes the use cases for the two methods. To be able to configure the necessary Steps, check out either: + +- [see topic](#section-idm4531463823771232938467170336) +- [see topic](#section-idm460333175801923293847385194) + +:::important[Don't use the Certificate and profile installer Step] + +If you use automatic provisioning, you never need to use the **Certificate and profile installer** Step. + +::: + +| Steps | How they work | When to use | +| --- | --- | --- | +| Xcode Steps: - **Xcode Archive and Export for iOS** - **Export iOS and tvOS Xcode Archive** - **Xcode build for testing for iOS** | These Steps set up code signing in your Xcode project automatically with nearly zero configuration. | We recommend using these Steps in most scenarios. | +| **Manage iOS Code Signing** Step | This Step will set up code signing in your Xcode project before running a build. | You can use this dedicated Step if: - You are building the app from script or fastlane. - You have a cross-platform project. For example, React Native, Flutter, Ionic or Cordova. - You are building a macOS app. | + +### Using the Xcode Steps + +You can use any of the Xcode Steps with built-in automatic management of code signing assets. + +1. Set up connection to Apple services. + + You can choose between [API key authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html) or [Apple ID authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id.html). We generally recommend API key authentication. +1. Add any of the following Steps to your Workflow, depending on what you need: + + - **Xcode Archive and Export for iOS**: Builds your Xcode app and exports an IPA of the type you choose. + - **Export iOS and tvOS Xcode Archive**: Exports an IPA from an already existing archive. + - **Xcode build for testing for iOS**: Builds your Xcode app with the `build-for-testing` action. +1. Set the **Automatic code signing method** input to the Apple service authentication type you set up. + + For example, if you chose API key authentication, choose the **api-key** option. + +**YAML example for setting code signing method** + +In this example, the **Xcode Archive and Export for iOS** Step is set to use API key authentication. + +``` +- xcode-archive@4: + inputs: + - automatic_code_signing: api-key +``` + +In most cases, the default values for all other inputs are sufficient if you set up your Apple connection correctly. + +### Using the Manage iOS Code Signing Step + +Use our dedicated Step for automatically managing code signing assets if you do not use one of the Xcode Steps to build your iOS app, or if you have a cross-platform app. + +1. Add the **Manage iOS Code Signing** Step after any dependency installer Step in your Workflow, such as **Run CocoaPods install** or **Carthage**. + + ![manage-ios-code.png](/img/_paligo/uuid-1b7bc413-da80-4910-5b25-f2a057bbf4d0.png) +1. Set the **Apple service connection method** input to the Apple service connection you want to use. + + You can choose between [API key authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs/authenticating-in-a-step-with-api-key) or [Apple ID authentication](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs/authenticating-in-a-step-with-apple-id-and-password). +1. If you use Apple ID authentication, you should also enter your team ID to **The Developer Portal team ID** input. +1. Make sure you do NOT modify your Xcode project after this Step. + + For example, don't change the bundle ID. +1. Add a Step that builds and archives the app, such as the **fastlane** Step. diff --git a/src/partials/configuring-webhooks-for-git-insights.mdx b/src/partials/configuring-webhooks-for-git-insights.mdx new file mode 100644 index 0000000..2a98cfd --- /dev/null +++ b/src/partials/configuring-webhooks-for-git-insights.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring webhooks for Git Insights + +To use Git Insights, you need to [register a webhook](/en/bitrise-platform/integrations/webhooks/adding-incoming-webhooks.html) with your Git provider. Without a webhook, Bitrise can't access your pull request data. + +:::important[Updating existing webhooks] + +If you already have webhooks registered to [automatically trigger builds](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) on Bitrise, check that their permissions match the requirements of Git Insights and update them if necessary. + +::: + +Git Insights requires the following webhook permission from the three supported Git providers: + +- **[GitHub](https://docs.github.com/en/webhooks/using-webhooks/editing-webhooks)**: Pushes, Pull requests. + + ![github-webhook-permissions.png](/img/_paligo/uuid-7a681d2b-732b-b061-0eb1-ecd158c0a9b9.png) +- **[GitLab](https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#configure-a-webhook-in-gitlab)**: Push events/All branches, Merge request events. + + ![gitlab-webhook-settings.png](/img/_paligo/uuid-130fe737-4629-1dfa-3234-9c03ad22f5dc.png) +- **[Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/manage-webhooks/)**: Repository: Push; Pull request: Created, Updated, Merged. diff --git a/src/partials/configuring-your-github-actions-workflow.mdx b/src/partials/configuring-your-github-actions-workflow.mdx new file mode 100644 index 0000000..8aedb09 --- /dev/null +++ b/src/partials/configuring-your-github-actions-workflow.mdx @@ -0,0 +1,80 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Configuring your GitHub Actions workflow + +After you successfully create a machine pool, you need to configure your GitHub Actions workflow to use the machine pool when running your builds. + +Use the `runs-on` property in your workflow to specify the Bitrise machines. You can target runners based on the labels assigned to them. + +1. Open your GitHub repository and select **Actions**. +1. On the left, click the name of the Workflow. +1. Under the name of the Workflow, click **deploy.yml**. +1. Add the `runs-on` property to the jobs you want to run on Build Hub. You must target the labels you create when [creating or updating a machine pool](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool). + + - You can use a single label. This will allow the use of all runners that have the specified label: + + ``` + jobs: + build: + runs-on: xcode-26 + ``` + - You can use an array of labels. A runner is only allowed if it has all the specified labels: + + ``` + jobs: + build: + runs-on: [bitrise-runner, xcode-26] + ``` + +For more information on the `runs-on` property, check out the [GitHub Actions documentation](https://docs.github.com/en/actions/how-tos/write-workflows/choose-where-workflows-run/choose-the-runner-for-a-job). + +### Enabling Linux machines to access tooling + +Linux machines require a workaround to access the preinstalled tools on the Linux image when running a GitHub Actions workflow on Build Hub. + +When a GitHub Actions workflow uses the `container:` property to run steps inside a Docker container, the runner changes the environment in ways that break the image's tool setup. This means that the build can't access `asdf` as the tool manager and therefore preinstalled tools are not accessible. + +To solve the problem: + +1. Add an `env` property to your container configuration in the GitHub Actions workflow. Set three Environment Variables to tell `asdf` where its core scripts and plugins, installed versions, and shims are, and to override the image's `BASH_ENV=/.bashrc`. + + ``` + container: + image: bitriseio/ubuntu-noble-24.04-bitrise-2025-android:latest + env: + ASDF_DIR: /root/.asdf + ASDF_DATA_DIR: /root/.asdf + BASH_ENV: /root/.asdf/asdf.sh + ``` +1. Under the `defaults` property, set the default shell to `bash`. + + ``` + container: + image: bitriseio/ubuntu-noble-24.04-bitrise-2025-android:latest + env: + ASDF_DIR: /root/.asdf + ASDF_DATA_DIR: /root/.asdf + BASH_ENV: /root/.asdf/asdf.sh + defaults: + run: + shell: bash + ``` +1. Under the `steps` property, add a step that copies the image's default tool versions to where `asdf` expects them. + + ``` + steps: + - name: Setup environment + run: | + cp /root/.tool-versions "$HOME/.tool-versions" + ``` +1. Tell Git to treat all working directories as safe. Without this, some commands might fail because of directory ownership mismatch. + + ``` + steps: + - name: Setup environment + run: | + cp /root/.tool-versions "$HOME/.tool-versions" + git config --global --add safe.directory '*' + ``` diff --git a/src/partials/connecting-a-git-provider-account-from-the-profile-settings-page.mdx b/src/partials/connecting-a-git-provider-account-from-the-profile-settings-page.mdx new file mode 100644 index 0000000..ef3e0cf --- /dev/null +++ b/src/partials/connecting-a-git-provider-account-from-the-profile-settings-page.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Connecting a Git provider with OAuth from the Account settings page + +Connecting a Git provider account with an OAuth application allows Bitrise to: + +- List the available repositories when [adding a new project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project). +- [Automatically register webhooks](/en/bitrise-platform/integrations/webhooks/adding-incoming-webhooks/registering-an-incoming-webhook-automatically). Webhooks allow setting up build triggers and enable the use of [Git Insights](/en/insights/git-insights.html). +- [Automatically register SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys.html). + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. On the left, under **Connected Git providers**, click the toggle next to the name of the Git provider you wish to connect. +1. Log in to the Git provider account. +1. You should be prompted to authorize bitrise.io - do it! If successful, you should be redirected to Bitrise, and a pop-up message should inform you that you successfully linked the account. Click **Okay**. diff --git a/src/partials/connecting-a-git-provider-account-when-adding-an-app.mdx b/src/partials/connecting-a-git-provider-account-when-adding-an-app.mdx new file mode 100644 index 0000000..28f35d0 --- /dev/null +++ b/src/partials/connecting-a-git-provider-account-when-adding-an-app.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Connecting a Git provider with OAuth when adding a project + +1. Log in to your [bitrise.io](https://www.bitrise.io) account and select **Bitrise CI** on the left. +1. Click **New CI project**. +1. Set the project’s privacy setting. +1. In the **Select repository** section, choose between selecting a remote repository or entering an URL manually. + + If you opt to enter a git URL manually, add it in the **Git repository (clone) URL** field and click **Next**. +1. Choose the Git service provider of the app’s repository, if you chose to select a remote repository. If no account with that provider has been connected to your Bitrise account, the UI will display the option to connect. + + ![select_git_repo.png](/img/_paligo/uuid-909bb98f-3195-8726-8b09-a60a33209ccb.png) +1. Click **Connect account**. This will take you to the login page of the Git provider. +1. Log in to the Git provider account. +1. You should be prompted to authorize bitrise.io - do it! If successful, you should be redirected to Bitrise, and a pop-up message should inform you that you successfully linked the account. Click **Okay**. diff --git a/src/partials/connecting-a-google-service-account-to-the-workload-identity-pool.mdx b/src/partials/connecting-a-google-service-account-to-the-workload-identity-pool.mdx new file mode 100644 index 0000000..2bfcbb1 --- /dev/null +++ b/src/partials/connecting-a-google-service-account-to-the-workload-identity-pool.mdx @@ -0,0 +1,40 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Connecting a Google service account to the workload identity pool + +To start using OIDC authentication for GCP services, you need to connect a workload identity pool to a Google service account. This involves: + +- Creating a service account. +- Granting access to the identity pool using a service account impersonation. + +### Create a service account + +1. In Google Cloud console, go to **IAM & Admin** and then **Service accounts**. +1. Click **Create service account**. +1. Add a display name, a unique service account ID, and a description. +1. Click **Create and continue**. +1. Under **Permissions**, add all roles that you need. + + :::note[IAM conditions] + + Optionally, you can add IAM conditions based on the previously mapped attribute values by clicking **Add IAM condition**. + + ::: +1. Click **Done**. + +### Granting access to the workload identity pool + +1. In Google Cloud console, go to **IAM & Admin** and then **Workload Identity Federation**. +1. Select your identity pool. +1. Click **Grant access**. +1. Select the **Grant access using service account impersonation** option. +1. Select the service account you've created. +1. Select the principals: identities that can access the service account. + + The available options are limited to the keys from the provider attribute mapping of the identity pool. For example, if you use the attribute mapping `google.subject=assertion.sub`, set **Attribute name** to subject and **Attribute value** to `sub`. You can see the available values in the Bitrise token here: +1. Click **Save**. +1. In the dialog, select the provider you created for Bitrise OIDC tokens. +1. Add the OIDC ID token path: https://token.builds.bitrise.io and set the format to **text**. +1. Click **Download config** and save the file somewhere you can access it. diff --git a/src/partials/connecting-the-instance-to-your-bitrise-workspace.mdx b/src/partials/connecting-the-instance-to-your-bitrise-workspace.mdx new file mode 100644 index 0000000..65d5917 --- /dev/null +++ b/src/partials/connecting-the-instance-to-your-bitrise-workspace.mdx @@ -0,0 +1,112 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Connecting the EC2 Mac or Linux instance to your Bitrise Workspace + + + + +1. Make sure that your instance can access the following endpoints: + + - https://den.services.bitrise.io + - https://build-log.services.bitrise.io +1. [Modify the User data of the instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-cloud-init): add the command to launch the Bitrise runner, using the Secret you created in the AWS Secrets Manager: + + :::important + + When modifying the user data scripts for an EC2 Mac instance, make sure that there is no empty space before the start of the script. The first line should always be `#!/bin/bash`. If there is empty space before this line, the instance won't work. + + ::: + + ```bash + TOKEN=$(aws secretsmanager get-secret-value --secret-id MY_SECRET | jq -r '.SecretString | fromjson | .["MY_SECRET"]') + + sudo sed -i '' "s/BITRISE_AGENT_TOKEN/$TOKEN/" /Users/ec2-user/Library/LaunchDaemons/io.bitrise.self-hosted-agent.plist + sudo launchctl load -w /Users/ec2-user/Library/LaunchDaemons/io.bitrise.self-hosted-agent.plist + ``` +1. You can also set shell scripts or other custom data in the **User data** section. + + In the [Advanced options for EC2 Mac and Linux instances](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances) section, you can find recommendations for optimizing your instance with user data: + + - [Instance passwords](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/connectivity-and-security-for-your-ec2-instance) + - [Pre-warming the disk after booting](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/pre-warming-the-disk-after-booting) + - [Increasing disk size on a Mac instance](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/increasing-disk-size-on-a-mac-instance) + + + + +1. Make sure that your instance can access the following endpoints: + + - https://den.services.bitrise.io + - https://build-log.services.bitrise.io +1. [Modify the User data of the instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-cloud-init): add the command to launch the Bitrise runner, using the Secret you created in the AWS Secrets Manager. You also need to provide the number of concurrencies and the stack you wish to run. + + :::important + + When modifying the user data scripts for a macOS instance, make sure that there is no empty space before the start of the script. The first line should always be `#!/bin/bash`. If there is empty space before this line, the instance won't work. + + ::: + + You can get the list of available stacks with the following command: + + ```bash + /opt/virtualization-cli/bin/virtualization-cli list + ``` + + The allowed values for your concurrency preference are 1 or 2. + + - With 1 CC, the runner will schedule 1 VM with 8 vCPU and 12 GB RAM. + - With 2 CC, the runner will schedule 2 VMs with 4 vCPU and 6 GB RAM each. + + ```bash + TOKEN=$(aws secretsmanager get-secret-value --secret-id MY_SECRET | jq -r '.SecretString | fromjson | .["MY_SECRET"]') + sudo sed -i '' 's/BITRISE_AGENT_CC//' /Users/ec2-user/Library/LaunchDaemons/io.bitrise.self-hosted-agent.plist + sudo sed -i '' 's/BITRISE_AGENT_STACK//' /Users/ec2-user/Library/LaunchDaemons/io.bitrise.self-hosted-agent.plist + sudo sed -i '' "s/BITRISE_AGENT_TOKEN/$TOKEN/" /Users/ec2-user/Library/LaunchDaemons/io.bitrise.self-hosted-agent.plist + sudo launchctl load -w /Users/ec2-user/Library/LaunchDaemons/io.bitrise.self-hosted-agent.plist + ``` +1. You can also set shell scripts or other custom data in the **User data** section. + + In the [Advanced options for EC2 instances](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances) section, you can find recommendations for optimizing your instance with user data: + + - [Instance passwords](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/connectivity-and-security-for-your-ec2-instance) + - [Pre-warming the disk after booting](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/pre-warming-the-disk-after-booting) + - [Increasing disk size on a Mac instance](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/increasing-disk-size-on-a-mac-instance) + + + + +1. Make sure that your instance can access the following endpoints: + + - https://den.services.bitrise.io + - https://build-log.services.bitrise.io +1. [Modify the User data of the instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-cloud-init): add the command to launch the Bitrise runner, using the Secret you created in the AWS Secrets Manager: + + ```bash + TOKEN=$(aws secretsmanager get-secret-value --secret-id MY_SECRET | jq -r '.SecretString | fromjson | .["MY_SECRET"]') + /opt/bitrise/releases/bitrise-den-agent-configure.sh $TOKEN + ``` + + :::caution[Linux image version] + + If your Linux image version is EARLIER than `v2025W10`, the required command is slightly different: + + ```bash + TOKEN=$(aws secretsmanager get-secret-value --secret-id MY_SECRET | jq -r '.SecretString | fromjson | .["MY_SECRET"]') + + sudo sed -i “s/BITRISE_AGENT_TOKEN/$TOKEN/” /etc/systemd/system/bitrise-den-agent.service + sudo systemctl start bitrise-den-agent.service + ``` + + ::: +1. You can also set shell scripts or other custom data in the **User data** section. + + In the [Advanced options for EC2 instances](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances) section, you can find recommendations for optimizing your instance with user data: + + - [Instance passwords](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/connectivity-and-security-for-your-ec2-instance) + - [Pre-warming the disk after booting](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/pre-warming-the-disk-after-booting) + - [Increasing disk size on a Mac instance](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/advanced-options-for-ec2-instances/increasing-disk-size-on-a-mac-instance) + + + diff --git a/src/partials/connecting-to-the-ghes-instance.mdx b/src/partials/connecting-to-the-ghes-instance.mdx new file mode 100644 index 0000000..a244bf3 --- /dev/null +++ b/src/partials/connecting-to-the-ghes-instance.mdx @@ -0,0 +1,44 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Connecting to the GHES instance via the GitHub app + +After creating a new GitHub app, you need to connect your Bitrise Workspace to the GHES instance via the app: + +:::important[Webhook secret required] + +Make sure you have the webhook secret from the [GitHub app creation process](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise/creating-the-github-app) available. + +::: + +1. Open your GitHub app's page: on your GitHub organization's **Settings** page, select **GitHub apps** and click **Edit** next to the app's name. +1. On the left, select **General**. +1. Generate a new client secret: find the «**Client secrets** and click **Generate a new client secret**. Copy the secret: you will need it later! +1. Find the **Private keys** section and click **Generate a private key**. This downloads a `.pem` file which you will need to upload to Bitrise later in this process. +1. On Bitrise, open the **Workspace settings** page and in the **GitHub Enterprise Server** section, click **Connect**. +1. Fill out the connection form: + + - The **Instance base URL** should be the root URL of your server. + - Add the webhook secret and the client secret you generated earlier. + - Upload the `.pem` file. +1. When done, click **Connect**. + + :::note[Instant feedback] + + You will receive immediate feedback about the connection and actionable error messages in the case of failure. + + ::: +1. Go back to GHES and open your GitHub app's page again. +1. On the left, select **Install app**. +1. Choose the organization(s) to install the app on. +1. Under **Repository access**, select the repositories you want Bitrise to be able to access, or select all repositories. +1. When done, click **Save**. + +Bitrise receives a webhook event regarding the installation and automatically enables the corresponding Bitrise projects to use the recently set up GHES integration [which you can check on the app settings page](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise/troubleshooting-the-ghes-integration). Once this is done, you can now store your `bitrise.yml` file in a GHES repository: [Storing the bitrise.yml file in your repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository). + +:::tip[Testing the integration] + +We recommend testing the integration by creating a dummy project and store its `bitrise.yml` file on your GHES repository. You can use [this demo project](https://github.com/bitrise-io/android-demo-app) for testing purposes. + +::: diff --git a/src/partials/connectivity-and-security-for-your-ec2-instance.mdx b/src/partials/connectivity-and-security-for-your-ec2-instance.mdx new file mode 100644 index 0000000..83fc151 --- /dev/null +++ b/src/partials/connectivity-and-security-for-your-ec2-instance.mdx @@ -0,0 +1,62 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Connectivity and security of your EC2 Mac and Linux instance + +Once your EC2 Mac or Linux instance is ready, make sure you can connect to the instance and that it can connect to the relevant Bitrise services. You can connect to the instance using SSH or in the case of EC2 Mac instances, VNC. + +You can also set a password for your instance. + +### Instance passwords + +:::note[User data] + +To make sure instance behavior is consistent across all instances, we recommend configuring this as part of [user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-console) during [instance creation](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami). + +User data is provided either in plain text or in base64 encoded format. + +::: + +By default, the Bitrise AMI doesn't have user passwords. It is the subscriber's responsibility to set the desired password. + +For an EC2 Mac instance, you need to set a user password and the default `login.keychain` password: + +``` +sudo /usr/bin/dscl . -passwd /Users/ec2-user +security set-keychain-password -o "" -p "" ~/Library/Keychains/login.keychain-db +``` + +For a Linux instance: + +``` +sudo passwd +``` + +### Connecting to the instance + +To connect to your instance using SSH, we recommend using TCP port 22. To connect to the instance via SSH: + +macOS + +Linux + +- ``` + ssh -i "<your-ssh-key>" ec2-user@<your-mac2-instance> + ``` + + You can also connect with VNC. We recommend using TCP port 5900. To connect: + + ``` + open vnc://ec2-user@<aws-mac2-instance> + ``` + +- ``` + ssh -i ~/.ssh/key ubuntu@ + ``` + +:::important[Security group configuration] + +Make sure to enable the use of both ports in your [security group configuration](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-ec2-sg.html) of the instance! + +::: diff --git a/src/partials/container-nesting-rules.mdx b/src/partials/container-nesting-rules.mdx new file mode 100644 index 0000000..25878e5 --- /dev/null +++ b/src/partials/container-nesting-rules.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Container nesting rules + +Steps and Step bundles both support their own container configuration. This creates a natural hierarchy: a step can define containers that differ from its parent bundle, and bundles can be nested within other bundles — each level can override or extend what came before. + +Two rules govern how configurations at different levels combine: + +- Execution containers follow closest-wins inheritance. Each Step uses the execution container defined nearest to it in the hierarchy—its own definition takes priority, then its parent bundle's, then its grandparent's. Only one execution container is active per Step. +- Service containers accumulate additively. A Step inherits service containers from every level of its ancestry, not just the nearest one. The deeper the nesting, the more service containers a Step may have. diff --git a/src/partials/container-resource-options.mdx b/src/partials/container-resource-options.mdx new file mode 100644 index 0000000..3ed680d --- /dev/null +++ b/src/partials/container-resource-options.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Container resource options + +The `docker container create` (or shorthand: `docker create`) command creates a new container from the specified image, without starting it. In your container configuration on Bitrise, you can specify additional options for the command. It shares most of its options with the `docker run` command. + +Bitrise supports most options for container creation. The only exceptions are: + +- `--network` +- `--volume (-v)` +- `--entrypoint` + +For all available options, check out [docker container create](https://docs.docker.com/reference/cli/docker/container/create/). diff --git a/src/partials/contents-of-a-build-log.mdx b/src/partials/contents-of-a-build-log.mdx new file mode 100644 index 0000000..5849fc7 --- /dev/null +++ b/src/partials/contents-of-a-build-log.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## The build log page + +The build log page shows all Steps that were part of the build, and their status. By default, failed Steps are expanded, with the error message highlighted for convenient troubleshooting. Expanding a Step also allows you to see: + +:::note + +The **Duration** field in the header of the log might not be equal to the sum of the duration of all Steps. There are two possible reasons for such a discrepancy: + +- The duration value includes one-off initialization time for the Workflow/Pipeline as well as the sum of Step duration. +- When using [remote access](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access.html), the VM stays open a full 10 minutes after the steps are all complete to allow review/download of logs + +::: + +- The start time of the Step's run. +- The Step ID. This is how the `bitrise.yml` configuration file identifies the Step. For more information, see [Step reference/ID format](/en/bitrise-ci/references/steps-reference/step-reference-id-format). +- The current version of the Step. Underneath the version number, you can check the release notes for the Step. If the build didn't run with the latest version of the Step, you can also click **Update** to open the Workflow Editor and update the Step to a different version. +- Under **Step resources**, you can check out the Step's documentation on our [Integrations](http://bitrise.io/integrations) page, as well as its source code and issue tracker on GitHub. + +To view a build log's contents in full, in a single file, [download the log](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs/downloading-a-build-log). diff --git a/src/partials/could-not-install-the-app-on-a-device.mdx b/src/partials/could-not-install-the-app-on-a-device.mdx new file mode 100644 index 0000000..d7dd64a --- /dev/null +++ b/src/partials/could-not-install-the-app-on-a-device.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Could not install the app on a device + +To install iOS apps on a given device, you have to either: + +- Export an IPA file with the `development` export method, with the device’s UDID registered in the provisioning profile used for the export. +- Export an IPA file with the `ad-hoc` export method and install the app via the public install page generated by the **Deploy to Bitrise.io** Step. + +If you can't install an app on a given device: + +1. Check that the device UDID is included in the app’s provisioning profile. + + If you use manual provisioning, check the provisioning profile you uploaded to Bitrise. +1. Check the logs to see if the **Xcode Archive & Export for iOS** Step used the provisioning profile with the device’s UDID in it. diff --git a/src/partials/crafting-a-token-request.mdx b/src/partials/crafting-a-token-request.mdx new file mode 100644 index 0000000..96feea5 --- /dev/null +++ b/src/partials/crafting-a-token-request.mdx @@ -0,0 +1,34 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Crafting a token request + +After you create at least one trust policy on Bitrise, you can create OIDC token exchange requests to receive short-lived tokens from Bitrise. + +1. Get an OIDC token from the service you want to authenticate to Bitrise. + + The exact method of getting the token depends on the service. For example: [Request a token from GitHub Actions](https://docs.github.com/en/actions/reference/security/oidc#methods-for-requesting-the-oidc-token). +1. Use the token in the exchange request to Bitrise. + + The request must contain the policy ID and it must be submitted to `app.bitrise.io`. + + ``` + curl -i -X POST https://app.bitrise.io/oidc/token \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \ + -d "subject_token_type=id_token" \ + -d "policy_id=" \ + -d "subject_token=" + ``` + + You can also send a request as `application/json`: + + ``` + curl -i -X POST https://app.bitrise.io/oidc/token \ + -H "Content-Type: application/json" \-d + "{ \"grant_type\": \"urn:ietf:params:oauth:grant-type:token-exchange\", + \"subject_token_type\": \"id_token\", + \"subject_token\": , + \"policy_id\": }" + ``` diff --git a/src/partials/creating-a-machine-pool.mdx b/src/partials/creating-a-machine-pool.mdx new file mode 100644 index 0000000..0bb297d --- /dev/null +++ b/src/partials/creating-a-machine-pool.mdx @@ -0,0 +1,107 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a machine pool + +Create a machine pool that allows running GitHub Action builds on Bitrise hardware. The process is slightly different based on whether you use [a GitHub app](/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/authentication) or a [GitHub personal access token](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-github-personal-access-tokens-for-build-hub) for authentication. + + + + +1. On the left navigation bar, select **Build Hub**. + + ![SCR-20260320-nseo.png](/img/_paligo/uuid-77517798-21b7-dd6d-6df8-5fdf12758e59.png) +1. Click **+Machine pool**. +1. Open the **Select account** dropdown menu and click **Connect account**. +1. Select GitHub **(GitHub App)** and click **Continue to install**. + + ![SCR-20260320-mmwy.png](/img/_paligo/uuid-115c121e-082e-a3b6-6741-f53cdab5d89e.png) +1. Select the resource owner. +1. Select the repository scope. + + - **All repositories**: Applies to all current and future repositories owned by the resource owner. Also includes public repositories (read-only). + - **Only select repositories**: Select at least one repository. Also includes public repositories (read-only). + + ![SCR-20260320-nqmt.png](/img/_paligo/uuid-6186a9bb-4a81-f79c-3200-1e65de613b47.png) +1. Add a runner group and optionally, a runner version. + + - The runner version needs to be exact, such as v2.328.0. If you don't specify a runner version, the latest version will be used. + - [Runner groups](https://docs.github.com/en/actions/concepts/runners/runner-groups) are used to collect sets of runners and create a security boundary around them. +1. Check **Use Bitrise for GitHub Actions caching** if you want Bitrise infrastructure to handle GitHub Actions cache requests instead of GitHub's cache backend. + + This results in faster cache operations. +1. Click **Next**. +1. Set a unique name for the pool. +1. Select the image in the **Image** dropdown menu and the amount of machines you need in the **Nr. of machines** field. + + You can check the images on the [stack reports page](https://bitrise.io/stacks). + + ![SCR-20260309-pxsf.png](/img/_paligo/uuid-1bc3b149-c8cd-82d2-2d94-62bbc35b89df.png) +1. Select a machine type. + + For more information about Bitrise machines, check out [Build machines](/en/bitrise-platform/infrastructure/build-machines). +1. Set a rolling update percentage: this is the amount of machines to be rebooted simultaneously after reconfiguration. +1. When done, click **Next**. +1. Create labels: they allow your [GitHub Actions configuration](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/configuring-your-github-actions-workflow) to target your Bitrise runner pool. You must have at least one label. + + Labels are a key-value pair but only the key is mandatory. By default, Bitrise suggests labels for the pool name, the image, and the machine type. You can change these at any time. +1. Optionally, add a warmup script to customize your build environment. When done, click **Create pool**. + + Leave it empty if you don’t need a warmup script. + + :::important[Non-zero exit code] + + Make sure that it returns a non-zero exit code in case of an error. The script will only fail if your script returns with a non-zero exit code. + + ::: + + + + +1. On the left navigation bar, select **Build Hub**. + + ![SCR-20260320-nseo.png](/img/_paligo/uuid-77517798-21b7-dd6d-6df8-5fdf12758e59.png) +1. Click **+ Machine pool**. +1. Open the **Select account** dropdown menu and click **Connect account**. +1. Click **Connect account** and select **GitHub (PAT)**. +1. Set a connection name and a target scope URL. + + Read more about target scopes here: [Target scope](/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/target-scope) + + ![SCR-20260320-nsxn.png](/img/_paligo/uuid-22b5a6f5-fedb-0cc6-b685-1bb5406d1e12.png) +1. In the **Personal access token** field, add your GitHub personal access token then click **Connect**. +1. Add a runner group and, optionally, a runner version. + + - The runner version needs to be exact, such as v2.328.0. If you don't specify a runner version, the latest version will be used. + - [Runner groups](https://docs.github.com/en/actions/concepts/runners/runner-groups) are used to collect sets of runners and create a security boundary around them. +1. Check **Use Bitrise for GitHub Actions caching** if you want Bitrise infrastructure to handle GitHub Actions cache requests instead of GitHub's cache backend. + + This results in faster cache operations. +1. Click **Next**. +1. Set a unique name for the pool. +1. Select the image in the **Image** dropdown menu and the amount of machines you need in the **Nr. of machines** field. + + You can check the images on the [stack reports page](https://bitrise.io/stacks). + + ![SCR-20260309-pxsf.png](/img/_paligo/uuid-1bc3b149-c8cd-82d2-2d94-62bbc35b89df.png) +1. Select a machine type. + + For more information about Bitrise machines, check out [Build machines](/en/bitrise-platform/infrastructure/build-machines). +1. Set a rolling update percentage: this is the amount of machines to be rebooted simultaneously after reconfiguration. +1. When done, click **Next**. +1. Create labels: they allow your [GitHub Actions configuration](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/configuring-your-github-actions-workflow) to target your Bitrise runner pool. You must have at least one label. + + Labels are a key-value pair but only the key is mandatory. By default, Bitrise suggests labels for the pool name, the image, and the machine type. You can change these at any time. +1. Optionally, add a warmup script to customize your build environment. When done, click **Create pool**. + + Leave it empty if you don’t need a warmup script. + + :::important[Non-zero exit code] + + Make sure that it returns a non-zero exit code in case of an error. The script will only fail if your script returns with a non-zero exit code. + + ::: + + + diff --git a/src/partials/creating-a-new-alert.mdx b/src/partials/creating-a-new-alert.mdx new file mode 100644 index 0000000..fc1085d --- /dev/null +++ b/src/partials/creating-a-new-alert.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a new alert + +You can create a new alert at any time in Insights: + +1. Open Insights for your project. +1. Go to the **Create alert** page. To do so, you have two options: + + - Select **Alerts** from the left menu and click on **Create alert**. + + ![create-alert-button.png](/img/_paligo/uuid-6df6ae6a-869d-58a9-dbea-2fa93fba24e2.png) + - Click on the bell icon above any metric in **Builds**, **Tests**, or **Credits**. + + ![bell.png](/img/_paligo/uuid-d7b270fb-8c64-ce2d-c083-c1dbcfdde87f.png) +1. Choose a metric type and a specific metric within that type in the **Metric type** section. + + ![metric-type.png](/img/_paligo/uuid-3cab36a0-7c43-5fb3-40cb-d7c03cd8ab00.png) +1. In the **Filters** section, select a project then click **Add filter** to add filter conditions. If you don't select a project, the alert will apply to every project in the workspace, without filters. + + You can create filters for a specific [Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages.html), a Workflow, or even a Step. You can also filter for branches, [stacks](/en/bitrise-build-hub/infrastructure/build-stacks.html), and [machine types](/en/bitrise-platform/infrastructure/build-machines.html). + + ![alert-filters.png](/img/_paligo/uuid-918b42a8-4b92-3f05-5514-1b137c85e283.png) +1. In the **Conditions** section, set up the alert conditions. + + - **Direction**: Choose whether to create an alert when a given threshold is above, equal, or below a certain limit. + - **Threshold**: The value the direction applies to. The exact nature of it depends on the metric you chose: for example, if you chose credit usage, you can set an amount of credits consumed to trigger an alert. + - **Monitored window**: The time period that the alert monitors. +1. In the **Notifications** section, name the alert in the **Alert name** field. +1. In the **Notification providers** section, click **Add new** and choose between three notification providers from the dropdown menu: + + - **Slack**: Create an incoming webhook that posts into a selected channel and paste the webhook URL. To do so, you need to create a Slack app and enable incoming webhooks in the app: [Sending messages using incoming webhooks](https://api.slack.com/messaging/webhooks). + - **Teams**: Create an incoming webhook for a selected Teams channel and paste the webhook URL: [Create incoming webhooks for Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=dotnet). + - **Email**: Set a valid email address. The alert will send a notification to the address. +1. When you're ready, click **Create** to finish the alert. diff --git a/src/partials/creating-a-personal-access-token.mdx b/src/partials/creating-a-personal-access-token.mdx new file mode 100644 index 0000000..bdc0f51 --- /dev/null +++ b/src/partials/creating-a-personal-access-token.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a personal access token + +To create a new personal access token: + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. On the left, select the **Security** tab. +1. Scroll down to the **Personal access tokens** section, and click on **Create token**. +1. Fill out the **Token description** field and select the appropriate expiration time (1 hour, 1 day, 1 month or never) for your token. +1. Click **Next**. +1. In the **Personal Access token** pop-up window, you can see your newly generated token. +1. Click **Copy and close** to store token in the clipboard so you can paste it somewhere safe, and to finalize. diff --git a/src/partials/creating-a-signed-ipa-for-xcode-projects.mdx b/src/partials/creating-a-signed-ipa-for-xcode-projects.mdx new file mode 100644 index 0000000..4d164b3 --- /dev/null +++ b/src/partials/creating-a-signed-ipa-for-xcode-projects.mdx @@ -0,0 +1,107 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a signed IPA for Xcode projects + +:::note[Overview on iOS code signing in Bitrise] + +For a comprehensive overview on what Steps are available for code signing asset management, visit the [iOS code signing page](/en/bitrise-ci/code-signing/ios-code-signing.html). + +::: + +You can easily create a signed IPA file for your Xcode project with Bitrise. + +- You have set up [Apple service connection](/en/bitrise-platform/integrations/apple-services-connection.html) on Bitrise. +- Your [code signing files are managed correctly](/en/bitrise-ci/code-signing/ios-code-signing.html). +- You set the relevant inputs of our **Xcode Archive and Export for iOS** Step. + +:::important[Upload the distribution AND the development signing certificates] + +We strongly recommend uploading BOTH the development and distribution signing certificates for your project. If you don't have an uploaded development signing certificate, Steps with automatic provisioning options will generate one on the fly every time you start a build. This can eventually lead to reaching the maximum number of certificates, blocking you from starting new builds. + +::: + +If you’re all set, proceed to setting up IPA export in your Workflow. + + + + +1. Make sure the necessary [code signing files have been collected and uploaded](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning/uploading-ios-code-signing-certificates). +1. Make sure you have the **Xcode Archive & Export for iOS** Step in your Workflow. +1. Set the **Distribution method** input of the Step. + + ![xcode-archive.png](/img/_paligo/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png) + + The options are: + + - `app-store`: Choose this if you want to deploy the app to the App Store. Requires a Distribution certificate and an App Store provisioning profile. + - `ad-hoc`: Choose this if you want to deploy the app to ad-hoc testers. Requires a Distribution certificate and an Ad Hoc provisioning profile. + - `enterprise`: Choose this if you have an Apple Enterprise account and want to use that to distribute your app. + - `development`: Choose this for internal testing. Requires a Developer certificate and a Development provisioning profile. +1. Set the **Automatic code signing** input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t use automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Save the Workflow, and start a new build. + + + + +1. Make sure all the [necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) are available for your build. +1. Open the `bitrise.yml` file of your app. +1. Make sure you have the `xcode-archive` Step in your Workflow. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + ``` +1. Set the `distribution_method` input to the correct value. The available options are: + + - `app-store`: Choose this if you want to deploy the app to the App Store. Requires a Distribution certificate and an App Store provisioning profile. + - `ad-hoc`: Choose this if you want to deploy the app to ad-hoc testers. Requires a Distribution certificate and an Ad Hoc provisioning profile. + - `enterprise`: Choose this if you have an Apple Enterprise account and want to use that to distribute your app. + - `development`: Choose this for internal testing. Requires a Developer certificate and a Development provisioning profile. + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - distribution_method: development + ``` +1. Set the `automatic_code_signing` input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` [if you use API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` [if you use Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + + ``` + my-workflow: + steps: + - xcode-archive: + inputs: + - automatic_code_signing: api-key + - distribution_method: development + ``` + + + + +That’s all. Xcode will automatically select the right signing files based on your project’s Bundle ID and Team ID settings, and the export method you set. + +### Signing an IPA file with a different team’s code signing file + +You might want to sign the IPA file with a different team’s code signing files. For example: + +- If you use your company’s code signing files for internal builds, but your client’s code signing files are used for App Store distribution. +- If you use Apple ID for automatic code signing and the Apple ID belongs to multiple teams, use The Developer Portal team to use for this export input to specify which team should be used for automatic code signing asset management. + +To do so: + +1. Make sure the right code signing files of the new development team are uploaded to Bitrise. +1. Set the The Developer Portal team to use for this export option as well (in addition to the **Distribution method**). +1. Set the **Distribution method**. diff --git a/src/partials/creating-a-trust-policy-on-bitrise.mdx b/src/partials/creating-a-trust-policy-on-bitrise.mdx new file mode 100644 index 0000000..c5c5c38 --- /dev/null +++ b/src/partials/creating-a-trust-policy-on-bitrise.mdx @@ -0,0 +1,57 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a trust policy on Bitrise + +Create an OIDC trust policy to grant external services access to Bitrise resources via an OIDC token exchange. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. Select **Security** and then go to the **OIDC trust policies** tab. + + ![2026-03-11-oicd-trust-policies.png](/img/_paligo/uuid-3424f770-b6c1-749a-b936-6d073bab7469.png) +1. Click **New OIDC policy**. +1. Fill out the policy details: + + - **Policy name**: The policy identifier. + - **Issuer**: The HTTPS URLs for identity providers that Bitrise will trust. + - **Session duration**: How long the token will be valid. + + ![2026-03-11-oicd-new-policy.png](/img/_paligo/uuid-fb66f7d5-2c56-4480-4a54-4d79a29c6c67.png) +1. On the next page, set matching rules in a JSON format. + + Matching rules define which claims Bitrise must see in the token to match the trust policy. + + :::important + + You must have at least one matching rule. The `sub` claim is mandatory: it identifies the subject that triggered the token exchange. + + ::: + + For example, you can create matching rules for a specific branch of a repository and names a Workflow: + + ```json + { + "sub": "repo:my-org/my-repo:environment:prod", + "workflow": "CI", + "ref": "refs/heads/main", + "repository": "my-account/my-repo" + } + ``` +1. On the next page, set up a workspace role for the short-lived token. + + The workspace role determines the access level of the token. Read more: [Roles and permissions in workspaces](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces). +1. On the next page, configure product access. Grant full admin access to all products, or grant granular access to either Bitrise CI or Release Management or both: + + - Select **Admin access** to grant admin access to all projects owned by the workspace. + - Select **Bitrise CI** and/or then select the projects or Release Management apps and access roles for the token. It can have different levels of access on different projects! + + Read more: [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci) + - Select **Release Management** then select the Release Management apps and access roles for the token. It can have different access levels on different Release Management apps. + + Read more: [Release Management roles and permissions](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions) +1. When ready, click **Create policy**. diff --git a/src/partials/creating-a-workflow-for-codepush-updates.mdx b/src/partials/creating-a-workflow-for-codepush-updates.mdx new file mode 100644 index 0000000..fc03ce6 --- /dev/null +++ b/src/partials/creating-a-workflow-for-codepush-updates.mdx @@ -0,0 +1,470 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a Workflow for CodePush updates + +This section shows you how to create a CI Workflow that will: + +- Create an update package for iOS. +- Upload the iOS update package to Bitrise CodePush Server. +- Create an update package for Android. +- Upload the Android update package to Bitrise CodePush Server. + + + + +1. Create a Workflow and after the `git-clone` Step, add an `npm` Step with the `install` command: + + ``` + --- + format_version: '13' + default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + project_type: ios + workflows: + codepush_update_to_server: + description: The workflow will generate and push your update to CodePush Server. + steps: + - git-clone@8: {} + - npm@1: + inputs: + - command: install + ``` +1. Add a `script` Step that extracts the app version using a JSON parser and set version in an Environment Variable using `envman`: + + ``` + - script@1: + title: Extract App Version + inputs: + - content: |- + #!/bin/bash + set -e + + # Extract version from app.json using jq (JSON parser) + VERSION=$(jq -r '.version' package.json) + + # Verify version extraction + if [ -z "$VERSION" ]; then + echo "Error: Could not extract version from package.json" + exit 1 + fi + + echo "Extracted version from package.json: $VERSION" + + # Set the environment variable using envman + envman add --key APP_VERSION --value "$VERSION" + + echo "Successfully set APP_VERSION=$VERSION" + ``` +1. Add another `script` Step that clones the `release-management-recipes` repository from GitHub. This contains the upload script we'll use later. + + ``` + - script@1: + title: Get Release Management Recipes + inputs: + - content: >- + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a + non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set -x + + # write your script here + git clone https://github.com/bitrise-io/release-management-recipes + ``` +1. Generate your iOS update bundle and create a zip archive from it: + + ``` + - script@1: + title: Generate iOS Update Bundle + inputs: + - content: >- + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a + non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set -x + + npx react-native bundle \ + --platform ios \ + --dev false \ + --entry-file index.js \ + --bundle-output ./build/main.jsbundle \ + --assets-dest ./build + + # Create zip archive + zip -r update.zip ./build + ``` +1. Upload the iOS update bundle to the CodePush Server with `upload_code_push_package.sh`: + + ``` + - script@1: + title: Upload iOS Update Bundle to Codepush Server + inputs: + - content: > + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all + commands exit successfully + set -o pipefail + # debug log + set -x + + cd release-management-recipes + + UPLOAD_RESPONSE=$(PACKAGE_PATH=../update.zip \ + AUTHORIZATION_TOKEN=$BITRISE_API_TOKEN \ + CONNECTED_APP_ID=$IOS_CONNECTED_APP_ID \ + DEPLOYMENT_ID=$IOS_PROD_DEPLOYMENT_ID \ + APP_VERSION=$APP_VERSION /bin/bash ./api/upload_code_push_package.sh 2>&1) + EXIT_CODE=$? + + if [ $EXIT_CODE -ne 0 ]; then + \ echo \"❌ upload_code_push_package.sh failed with exit code + $EXIT_CODE\" + \ echo \"$UPLOAD_RESPONSE\" + \ exit $EXIT_CODE + fi + + # Take only the last line of the response (final/latest status JSON + object) FINAL_RESPONSE=$(echo "$UPLOAD_RESPONSE" | tail -n1) + + # Check explicitly for ERR_INTERNAL or other internal error indicators + if echo \"$UPLOAD_RESPONSE\" | grep -q \"ERR_INTERNAL\"; then + \ ERROR_MESSAGE=$(echo \"$FINAL_RESPONSE\" | jq -r '.message' || + echo \"Unknown error\") + \ echo \"❌ Server returned internal error: $ERROR_MESSAGE\" + \ exit 1 + fi + + + # Now safely parse 'status' and 'status_reason' from the final + response line PACKAGE_STATUS=$(echo "$FINAL_RESPONSE" | jq -r + '.status' || echo "null") STATUS_REASON=$(echo "$FINAL_RESPONSE" | jq + -r '.status_reason' || echo "") + + if [ "$PACKAGE_STATUS" = "processed_valid" ]; then echo "✅ Package + uploaded and processed successfully." rm -rf ../build.zip rm -rf + ../build else echo "⚠️ Package upload unexpected status: + $PACKAGE_STATUS - Reason: $STATUS_REASON" exit 1 fi cd .. + ``` +1. Generate the Android update bundle: + + ``` + - script@1: + title: Generate Android Update Bundle + inputs: + - content: | + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set -x + + npx react-native bundle \ + --platform android \ + --dev false \ + --entry-file index.js \ + --bundle-output ./build/index.android.bundle \ + --assets-dest ./build + + # Create zip archive + zip -r update.zip ./build + ``` +1. Upload the Android update bundle to the CodePush Server: + + ``` + - script@1: + title: Upload Android Update Bundle to Codepush Server + inputs: + - content: | + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set -x + + cd release-management-recipes + + UPLOAD_RESPONSE=$(PACKAGE_PATH=../update.zip \ + AUTHORIZATION_TOKEN=$BITRISE_API_TOKEN \ + CONNECTED_APP_ID=$ANDROID_CONNECTED_APP_ID \ + DEPLOYMENT_ID=$ANDROID_PROD_DEPLOYMENT_ID \ + APP_VERSION=$APP_VERSION /bin/bash ./api/upload_code_push_package.sh 2>&1) + EXIT_CODE=$? + + if [ $EXIT_CODE -ne 0 ]; then + echo "❌ upload_code_push_package.sh failed with exit code $EXIT_CODE" + echo "$UPLOAD_RESPONSE" + exit $EXIT_CODE + fi + + # Take only the last line of the response (final/latest status JSON object) + FINAL_RESPONSE=$(echo "$UPLOAD_RESPONSE" | tail -n1) + + # Check explicitly for ERR_INTERNAL or other internal error indicators + if echo "$UPLOAD_RESPONSE" | grep -q "ERR_INTERNAL"; then + ERROR_MESSAGE=$(echo "$FINAL_RESPONSE" | jq -r '.message' || echo "Unknown error") + echo "❌ Server returned internal error: $ERROR_MESSAGE" + exit 1 + fi + + # Now safely parse 'status' and 'status_reason' from the final response line + PACKAGE_STATUS=$(echo "$FINAL_RESPONSE" | jq -r '.status' || echo "null") + STATUS_REASON=$(echo "$FINAL_RESPONSE" | jq -r '.status_reason' || echo "") + + if [ "$PACKAGE_STATUS" = "processed_valid" ]; then + echo "✅ Package uploaded and processed successfully." + else + echo "⚠️ Package upload unexpected status: $PACKAGE_STATUS - Reason: $STATUS_REASON" + exit 1 + fi + + cd .. + ``` + + + + +1. Create a Workflow and after the `git-clone` Step, add an `npm` Step with the `install` command: + + ``` + --- + format_version: '13' + default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + project_type: ios + workflows: + codepush_update_deploy: + description: | + Uploads Update Bundle to Bitrise CodePush Server + status_report_name: Executing for + steps: + - git-clone@8: {} + - restore-npm-cache@2: {} + - npm@1: + inputs: + - command: install + ``` +1. Add a `script` Step that extracts the app version using `awk` and sets it as an Enviromment Variable: + + ``` + - script@1: + title: Extract App Version + inputs: + - content: |- + #!/bin/bash + set -e + + # Simpler version using awk + APP_VERSION=$(awk -F'"' '/version:/ {print $2}' app.config.js) + + # Check if the version was successfully extracted + if [ -z "$APP_VERSION" ]; then + echo "Error: Failed to extract version from app.config.js" + exit 1 + fi + + echo "Extracted version: $APP_VERSION" + + # Set the environment variable using envman + envman add --key APP_VERSION --value "$APP_VERSION" + + echo "Successfully set APP_VERSION=$APP_VERSION" + ``` +1. Add another `script` Step that clones the `release-management-recipes` repository from GitHub. This contains the upload script we'll use later. + + ``` + - script@1: + title: Get Release Management Recipes + inputs: + - content: >- + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a + non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set -x + + # write your script here + git clone https://github.com/bitrise-io/release-management-recipes + ``` +1. Generate your iOS update bundle and create a zip archive from it: + + ``` + - script@1: + title: Generate iOS Update Bundle + inputs: + - content: |- + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set -x + + # write your script here + npx expo export:embed \ + --entry-file index.js \ + --platform ios \ + --dev false \ + --reset-cache \ + --bundle-output ./build/main.jsbundle \ + --assets-dest ./build \ + --minify false + + # Create zip archive + zip -r update.zip ./build + ``` +1. Upload the iOS update bundle to the CodePush Server with `upload_code_push_package.sh`: + + ``` + - script@1: + title: Upload iOS Update Bundle to Codepush Server + inputs: + - content: > + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all + commands exit successfully + set -o pipefail + # debug log + set -x + + cd release-management-recipes + + UPLOAD_RESPONSE=$(PACKAGE_PATH=../update.zip \ + AUTHORIZATION_TOKEN=$BITRISE_API_TOKEN \ + CONNECTED_APP_ID=$IOS_CONNECTED_APP_ID \ + DEPLOYMENT_ID=$IOS_PROD_DEPLOYMENT_ID \ + APP_VERSION=$APP_VERSION /bin/bash ./api/upload_code_push_package.sh 2>&1) + + EXIT_CODE=$? + + if [ $EXIT_CODE -ne 0 ]; then + \ echo \"❌ upload_code_push_package.sh failed with exit code + $EXIT_CODE\" + \ echo \"$UPLOAD_RESPONSE\" + \ exit $EXIT_CODE + fi + + # Take only the last line of the response (final/latest status JSON + object) FINAL_RESPONSE=$(echo "$UPLOAD_RESPONSE" | tail -n1) + + # Check explicitly for ERR_INTERNAL or other internal error indicators + if echo \"$UPLOAD_RESPONSE\" | grep -q \"ERR_INTERNAL\"; then + \ ERROR_MESSAGE=$(echo \"$FINAL_RESPONSE\" | jq -r '.message' || + echo \"Unknown error\") + \ echo \"❌ Server returned internal error: $ERROR_MESSAGE\" + \ exit 1 + fi + + + # Now safely parse 'status' and 'status_reason' from the final + response line PACKAGE_STATUS=$(echo "$FINAL_RESPONSE" | jq -r + '.status' || echo "null") STATUS_REASON=$(echo "$FINAL_RESPONSE" | jq + -r '.status_reason' || echo "") + + if [ "$PACKAGE_STATUS" = "processed_valid" ]; then echo "✅ Package + uploaded and processed successfully." rm -rf ../build.zip rm -rf + ../build else echo "⚠️ Package upload unexpected status: + $PACKAGE_STATUS - Reason: $STATUS_REASON" exit 1 fi cd .. + ``` +1. Generate the Android update bundle: + + ``` + - script@1: + title: Generate Android Update Bundle + inputs: + - content: | + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set -x + + # write your script here + npx expo export:embed \ + --entry-file index.js \ + --platform android \ + --dev false \ + --reset-cache \ + --bundle-output ./build/index.android.bundle \ + --assets-dest ./build \ + --minify false + + # Create zip archive + zip -r update.zip ./build + ``` +1. Upload the Android update bundle to the CodePush Server: + + ``` + - script@1: + title: Upload Android Update Bundle to Codepush Server + inputs: + - content: | + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set -x + + cd release-management-recipes + + UPLOAD_RESPONSE=$(PACKAGE_PATH=../update.zip \ + AUTHORIZATION_TOKEN=$BITRISE_API_TOKEN \ + CONNECTED_APP_ID=$ANDROID_CONNECTED_APP_ID \ + DEPLOYMENT_ID=$ANDROID_PROD_DEPLOYMENT_ID \ + APP_VERSION=$APP_VERSION /bin/bash ./api/upload_code_push_package.sh 2>&1) + EXIT_CODE=$? + + if [ $EXIT_CODE -ne 0 ]; then + echo "❌ upload_code_push_package.sh failed with exit code $EXIT_CODE" + echo "$UPLOAD_RESPONSE" + exit $EXIT_CODE + fi + + # Take only the last line of the response (final/latest status JSON object) + FINAL_RESPONSE=$(echo "$UPLOAD_RESPONSE" | tail -n1) + + # Check explicitly for ERR_INTERNAL or other internal error indicators + if echo "$UPLOAD_RESPONSE" | grep -q "ERR_INTERNAL"; then + ERROR_MESSAGE=$(echo "$FINAL_RESPONSE" | jq -r '.message' || echo "Unknown error") + echo "❌ Server returned internal error: $ERROR_MESSAGE" + exit 1 + fi + + # Now safely parse 'status' and 'status_reason' from the final response line + PACKAGE_STATUS=$(echo "$FINAL_RESPONSE" | jq -r '.status' || echo "null") + STATUS_REASON=$(echo "$FINAL_RESPONSE" | jq -r '.status_reason' || echo "") + + if [ "$PACKAGE_STATUS" = "processed_valid" ]; then + echo "✅ Package uploaded and processed successfully." + else + echo "⚠️ Package upload unexpected status: $PACKAGE_STATUS - Reason: $STATUS_REASON" + exit 1 + fi + + cd .. + ``` + + + diff --git a/src/partials/creating-a-workload-identity-pool.mdx b/src/partials/creating-a-workload-identity-pool.mdx new file mode 100644 index 0000000..48a10d7 --- /dev/null +++ b/src/partials/creating-a-workload-identity-pool.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a workload identity pool + +Create a workload identity pool in GCP to enable Workload Identity Federation. + +:::tip[Workload Identity Federation] + +Read more about how authentication with Workload Identity Federation works on GCP in the [official Google documentation.](https://cloud.google.com/sap/docs/abap-sdk/on-premises-or-any-cloud/latest/authentication-wif) + +::: + +1. In the Google Cloud console, go to **IAM & Admin** then **Workload Identity Federation**. +1. In the **Create an identity pool** section, enter a value for the following fields: + + - **Name**: The name for the pool. The name is used as the pool ID and you can't change the pool ID later. + - **Description**: The purpose of the pool. +1. Under **Add a provider to pool**, add Bitrise as a provider: + + - In the **Select a provider** field, select **OpenID Connect (OIDC)**. + - **Provider name**: Enter a name. For simplicity, we recommend using `Bitrise`. + - **Issuer URL**: https://token.builds.bitrise.io. + - **Audience**: Select **Allowed audience**. When using the token, GCP will check if the allowed audience matches the audience encoded in the `aud` claim. On Bitrise, you can set the audience in our Steps providing OIDC services: [Fetching and exchanging tokens with GCP](/en/bitrise-platform/integrations/oidc-authentication/oidc-for-gcp/fetching-and-exchanging-tokens-with-gcp). +1. Click **Continue**. +1. Under **Configure provider attributes**, configure the required attribute mapping values: + + - The `google.subject` key is a unique identifier for the user. You can use `assertion.sub` to identify the build that requests the token. + - Use the `attribute.NAME` format to add up to 50 custom attributes, each with a value in the `assertion.VALUE` format. You can find the list of available attributes in the Bitrise token here: [Information in the OIDC token](/en/bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview/authentication-to-external-services-with-oidc/information-in-the-oidc-token). + + :::important[Explicit mapping required] + + You must map all the attributes you want to use. Google only lets you use the attributes which are explicitly mapped. Read more about [attribute mappings in Google's documentation](https://cloud.google.com/iam/docs/workload-identity-federation?_gl=1*1sz7kri*_ga*MTM0MTUyNjA1OC4xNzYyNTMwMjA5*_ga_WH2QY8WWF5*czE3NjM0Nzc1MzYkbzIkZzEkdDE3NjM0Nzc4MDEkajUwJGwwJGgw#mapping). + + ::: +1. Optionally, add attribute conditions. You will also be able to filter identity tokens based on attributes directly at the pool level when creating the service account. diff --git a/src/partials/creating-a-workspace-api-token.mdx b/src/partials/creating-a-workspace-api-token.mdx new file mode 100644 index 0000000..c44de73 --- /dev/null +++ b/src/partials/creating-a-workspace-api-token.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a Workspace API token + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Security**. +1. Click **Create token**. + + ![workspace-api-token.svg](/img/_paligo/uuid-cb123ebc-f548-8e87-615f-aab39fefa078.svg) +1. In the dialog box, set a name and an expiration date then click **Next**. + + ![create-token.svg](/img/_paligo/uuid-1610488e-2548-99b4-8386-9f2f66bb7f03.svg) +1. Set up the user roles in apps. Under **Set roles in apps**, you can: + + - Select the **All apps** option: the token can be used to access all current and future apps of the Workspace with the same user role. Select the role in the **Roles** menu. + - Select the **Roles per apps** option: the token can be used to access only the specified apps. You have to select the user roles for each app. If you leave the user role on **None** for a given app, you can't access that app with the Workspace API token. + + ![create-per-app.png](/img/_paligo/uuid-774a69fb-d5b9-333d-f373-eab6cab793cb.png) +1. Click **Next** to get the actual token. +1. Click **Copy and close** to copy the token and close the dialog box. + + :::caution[Save the token] + + Once you closed the dialog box, you won't be able to see the token again! + + ::: diff --git a/src/partials/creating-alerts.mdx b/src/partials/creating-alerts.mdx new file mode 100644 index 0000000..4b7960e --- /dev/null +++ b/src/partials/creating-alerts.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating alerts + +You can create alerts for metrics that you would like to keep an eye on to trigger when a specific threshold is reached. You can then push the alert notifications to Slack channels, email addresses, or Teams channels. + +To learn more about alerts: [Configuring alerts in Insights](/en/insights/configuring-alerts-in-insights). diff --git a/src/partials/creating-and-uploading-an-ios-code-signing-file.mdx b/src/partials/creating-and-uploading-an-ios-code-signing-file.mdx new file mode 100644 index 0000000..d68f69f --- /dev/null +++ b/src/partials/creating-and-uploading-an-ios-code-signing-file.mdx @@ -0,0 +1,56 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Uploading an iOS code signing file + +:::note[Required role] + +You must have an admin or owner role on the app's team to manage iOS code signing files using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +You can upload an iOS code signing file (either a .p12 certificate or a provisioning profile) to a Bitrise app of your choice. This process does NOT create a new code signing file: it uploads an existing file (created and downloaded from the Apple Developer Portal) to an AWS URL. It is functionally the same as uploading your code signing files on the Bitrise website: [Managing iOS code signing files - manual provisioning](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning). + +To upload an iOS code signing file file via the API: + +1. Call the POST method of the `provisioning-profiles` or `build-certificates` endpoint to create a temporary pre-signed upload URL that expires in ten minutes. + + The call requires an existing code signing file (certificate or provisioning profile) and two parameters: + + - `upload_file_name`: The filepath to the existing code signing file. For example, `/path/to/sample.p12`. + - `upload_file_size`: The size of the file in bytes. + + ``` + // Calling the endpoint to create the temporary upload URL + curl -X POST -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/provisioning-profiles' -d '{"upload_file_name":"sample.provisionprofile","upload_file_size":2047}' + ``` + + ``` + // The successful response: you will need the "upload_url" and the "slug". + { + "data":{ + "upload_file_name":"sample.provisionprofile", + "upload_file_size":2047, + "slug":"01C6FA6P6HRQT5PQ8RMMVVXE6W", + "processed":false, + "is_expose":true, + "is_protected":false, + "upload_url":"https://concrete-userfiles-production.s3-us-west-2.amazonaws.com/build_certificates/uploads/30067/original/certs.p12?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAIOC7N256G7J2W2TQ%2F20180216%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20180216T124240Z&X-Amz-Expires=600&X-Amz-SignedHeaders=content-length%3Bhost&X-Amz-Signature=2bf42176650f00405abfd7b7757635c9be16b43e98013abb7f750d3c658be28e" + } + } + ``` +1. The response to the first call contains an `upload_url` parameter. You need to use this and the `upload_file_name` parameter to upload the file to AWS with a `curl` call. + + ``` + curl -T sample.provisionprofile 'https://concrete-userfiles-production.s3-us-west-2.amazonaws.com/build_certificates/uploads/30067/original/certs.p12?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAIOC7N256G7J2W2TQ%2F20180216%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20180216T124240Z&X-Amz-Expires=600&X-Amz-SignedHeaders=content-length%3Bhost&X-Amz-Signature=2bf42176650f00405abfd7b7757635c9be16b43e98013abb7f750d3c658be28e' + ``` +1. Confirm the file upload with a POST call of the `uploaded` endpoint: use the `slug` from the response to the first POST call. + + This sets the `processed` flag of the file to `true`. This flag can't be changed again afterwards! + + ``` + curl -X POST -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/provisioning-profiles/FILE-SLUG/uploaded' + ``` diff --git a/src/partials/creating-and-uploading-android-keystore-files.mdx b/src/partials/creating-and-uploading-android-keystore-files.mdx new file mode 100644 index 0000000..193a76d --- /dev/null +++ b/src/partials/creating-and-uploading-android-keystore-files.mdx @@ -0,0 +1,65 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating and uploading Android keystore files + +:::important[Required role] + +You must have an admin or owner role on the app's team to manage Android keystore files using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [User roles on app teams](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + +::: + +To add an Android keystore file to your app using the API, you will need to: + +1. Call the POST method of the `android-keystore-files` endpoint with the `upload_file_name` and `upload_file_size` parameters. +1. Upload the file to AWS using the `upload_url parameter` from the response. +1. Confirm the file upload with a POST call of the `uploaded` endpoint. + + This sets the processed flag of the file to `true`. This flag can't be changed again afterwards! + +**Creating and uploading a new Android keystore file** + +Creating the file: + +``` +curl -X POST -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/android-keystore-files' -d '{"upload_file_name":"simplesample.jks","upload_file_size":2062}' +``` + +Response: + +``` +{ + "data": { + "upload_file_name": "simplesample.jks", + "upload_file_size": 2062, + "slug": "01GDFYTF2DXZZSWGMCF0ZTVSB9", + "processed": false, + "is_expose": true, + "is_protected": false, + "upload_url": "https://concrete-userfiles-production.s3.us-west-2.amazonaws.com/project_file_storage_documents/uploads/129261/original/simplesample.jks?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIV2YZWMVCNWNR2HA%2F20220921%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220921T120206Z&X-Amz-Expires=600&X-Amz-SignedHeaders=content-length%3Bhost&X-Amz-Signature=ce3c66fa144ba6ca9478cff3b72c49e024779f64ba961ddfc84060f65ea92562", + "user_env_key": "ANDROID_KEYSTORE", + "exposed_meta_datastore": { + "PASSWORD": "", + "ALIAS": "", + "PRIVATE_KEY_PASSWORD": "" + } + } +} +``` + +The file name, its size, slug, and a pre-signed upload URL are retrieved (along with some attributes that you can modify). This pre-signed upload URL is a temporary link which you will use to upload the Android keystore file to its destination. + +Uploading the file to AWS using the value of the `upload_url` parameter: + +``` +curl -T simplesample.jks 'https://concrete-userfiles-production.s3-us-west-2.amazonaws.com/build_certificates/uploads/30067/original/certs.p12?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAIOC7N256G7J2W2TQ%2F20180216%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20180216T124240Z&X-Amz-Expires=600&X-Amz-SignedHeaders=content-length%3Bhost&X-Amz-Signature=2bf42176650f00405abfd7b7757635c9be16b43e98013abb7f750d3c658be28e' +``` + +Confirming the upload: + +``` +curl -X POST -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/android-keystore-files/ANDROID-KEYSTORE-FILE-SLUG/uploaded' +``` diff --git a/src/partials/creating-and-uploading-files-to-the-generic-file-storage.mdx b/src/partials/creating-and-uploading-files-to-the-generic-file-storage.mdx new file mode 100644 index 0000000..ac55c74 --- /dev/null +++ b/src/partials/creating-and-uploading-files-to-the-generic-file-storage.mdx @@ -0,0 +1,85 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating and uploading files to the Generic File Storage + +:::note[Required role] + +You must have an admin or owner role role on the app's team to manage files in the Generic File Storage using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +You can add new files to an application and store it in the `GENERIC FILE STORAGE` . When calling the relevant API endpoint, a new temporary pre-signed upload URL is created which you will use to upload the file to the `GENERIC FILE STORAGE`. (Please note that this pre-signed URL is time-limited and expires after 10 minutes.) + +You'll need to: + +1. Call the POST method of the `generic-project-files` endpoint. + + This call creates a temporary pre-signed upload URL that contains a file slug which you will need later. The required parameters are: + + - slug: the app slug of the Bitrise app. You can get the slug by opening the app on Bitrise and copying it from the URL of the main page, or by calling the `GET /apps` endpoint and finding your app in the list. + - upload_file_name: the name of the file, including the file extension. For example, `MyFile.txt`. The file should be in the same folder where the command is run. + - upload_file_size: the size of the file in bytes. On macOS, you can get the file size by running the `stat -f%z ` command. + - user_env_key: you can add any name to the user env key. +1. Upload the file to AWS using the pre-signed upload URL. +1. Confirm the file upload with the POST method of the `generic-project-files/GENERIC-PROJECT-FILES-SLUG/uploaded` endpoint, using the slug from the response containing your pre-signed upload URL. + + This sets the `processed` flag to `true` which means the file is now available on Bitrise. This flag can't be changed again afterwards! + +**Creating and uploading a file** + +Creating the temporary pre-signed upload URL: + +``` +curl -X POST "https://api.bitrise.io/v0.1/apps//generic-project-files" -H "accept: application/json" -H "Authorization: " -H "Content-Type: application/json" -d "{ \"upload_file_name\": \"Test_File.md\", \"upload_file_size\": 4865, \"user_env_key\": \"Test_File\"}" +``` + +Response: + +``` +{ + "data": { + "upload_file_name": "Test_File.md", + "upload_file_size": 4865, + "slug": "", + "processed": false, + "is_expose": true, + "is_protected": false, + "upload_url": "https://concrete-userfiles-production.s3.us-west-2.amazonaws.com/project_file_storage_documents/uploads/24043/original/Test-File?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAIV2YZWMVCNWNR2HA%2F20190402%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20190402T125827Z&X-Amz-Expires=600&X-Amz-SignedHeaders=content-length%3Bhost&X-Amz-Signature=e1557901d5a07b1b3578d9ffdf84a9b0188b742bfff9c8175a3e87f12c7e2c4e", + "user_env_key": "Test_File", + "exposed_meta_datastore": null + } +} +``` + +Uploading the file to AWS: + +``` +curl -T Test_File.md "" +``` + +Confirming the file upload: + +``` +curl -X POST -H 'Authorization: ' 'https://api.bitrise.io/v0.1/apps//generic-project-files//uploaded' +``` + +Response: + +``` +{ + "data": { + "upload_file_name": "Test_File.md", + "upload_file_size": 4865, + "slug": "", + "processed": true, + "is_expose": true, + "is_protected": false, + "user_env_key": "Test_File", + "exposed_meta_datastore": null + } +} +``` diff --git a/src/partials/creating-bitrise-as-a-web-application-on-auth0.mdx b/src/partials/creating-bitrise-as-a-web-application-on-auth0.mdx new file mode 100644 index 0000000..a8e8e80 --- /dev/null +++ b/src/partials/creating-bitrise-as-a-web-application-on-auth0.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating Bitrise as a web application on Auth0 + +1. Log into [Auth0](https://auth0.com) as an admin. +1. Click **Applications** on the left menu bar then click the **+ Create Application** button on the right hand side of the **Applications** page. + + ![authzero_createapp1.png](/img/_paligo/uuid-47aacb1a-a7a9-f93e-8130-83ad51654298.png) +1. On the **Create application** window, type Bitrise in the **Name** field. In the **Choose application type** select **Regular Web Applications**, and click the **Create** button. + + ![authzero_addappname2.png](/img/_paligo/uuid-fc4a47cb-98f9-e217-042d-73780f712eb2.png) +1. You are landing on your newly created Bitrise app’s **Quick Start** page. Click the **Addons** tab. Toggle the **SAML2 WEB APP**’s switch to the right. This will take to to the **Addon: SAML2 WEB APP** page automatically. + + ![authzero_addon4.png](/img/_paligo/uuid-bf544047-689a-3954-029d-58b65a35c540.png) +1. Copy the **Assertion Consumer Service URL (ACS URL)** from Bitrise and paste it into the **Application Callback URL** field on the **Settings** tab of the **Addon: SAML2 WEB APP** page. Scroll down to the bottom of the **Addon: SAML2 WEB APP** page and hit **SAVE**. + + ![authzero_settingsapplicationurl6.png](/img/_paligo/uuid-193b49ae-3ccd-9f68-5288-55ed12c9edb1.png) +1. Go back to the **Addons** page where you can find the switch turned on. + + ![authzero_samlappenabled8.png](/img/_paligo/uuid-c79c0bb4-943a-7604-d40b-f8478be408bd.png) diff --git a/src/partials/creating-custom-status-reports.mdx b/src/partials/creating-custom-status-reports.mdx new file mode 100644 index 0000000..27239b6 --- /dev/null +++ b/src/partials/creating-custom-status-reports.mdx @@ -0,0 +1,106 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Custom status reports + +You can create custom Git status reports: You can tailor the commit status message to your team's preferences and requirements. You can give your report a name that allows you to immediately identify it on the Git provider site. You can use dynamic variables in the status report's name, like the title of your project or the name of the Workflow. + +The default status report name is `ci/bitrise//`. For legacy GitHub Checks reports, the default name is `Bitrise`. + +You can set up custom reports on two levels: + +- Project level reports apply to all Workflows and Pipelines within a project. This provides a consistent format for the status of any build in the same project. +- On the level of individual Workflows or Pipelines. These custom reports will take precedence over the general project-level status report. This is useful when you want to provide more specific information about a particular build stage or to differentiate between different types of builds. + +:::important[Character limit and accepted characters] + +Keep your status message concise. The limit is 100 characters, and BitBucket allows only 40 characters. + +The following characters are supported: `, . / ( ) : - _ (space) (a-z) (A-Z) (0-9) < > [ ] |` + +::: + +### Project level status reports + +To create a custom status report on a project level, add the `status_report_name` property under `app` in your configuration YAML file. It can have static values: + +``` +app: + status_report_name: 'Bitrise build' +``` + +Or you can use dynamic values: + +``` +app: + status_report_name: 'PR check for ' +``` + +You can also combine multiple dynamic values: + +``` +app: + status_report_name: 'Executing for ' +``` + +We recommend using `target_id`: it's the name of the Workflow or Pipeline that the build uses. With this variable, Git commit statuses from different Workflows/Pipelines on the same commit don't override each other. + +Find the available variables here: [see topic](#table-idm234615903497824). + +### Workflow/Pipeline level status reports + +To create a custom status report on the Workflow level, add the `status_report_name` property under the name of the Workflow in the configuration YAML file: + +``` +workflows: + build-ios: + status_report_name: build-report +``` + +Similarly, to create one on the Pipeline level, add the property under the name of the Pipeline: + +``` +pipeline: + deploy-pipeline: + status_report_name: build-report +``` + +:::important[No additional report] + +If a Workflow in a Pipeline has the `status_report_name` property, it does NOT produce an additional, separate status report when the Workflow runs as part of a Pipeline. It only adds a custom name to the status report when the Workflow runs as a standalone build. + +::: + +You can also combine multiple dynamic values: + +``` +pipeline: + deploy-pipeline: + status_report_name: 'Executing for ' +``` + +We recommend using `target_id`: it's the name of the Workflow or Pipeline that the build uses. With this variable, Git commit statuses from different Workflows/Pipelines on the same commit don't override each other. + +Find the available variables here: [see topic](#table-idm234615903497824). + +:::note[Branch protection rules] + +When switching from project-based status reports to Workflow level status reports, you might need to update [branch protection rules](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider/configuring-build-status-reporting). + +::: + +You can also set Workflow-level status reports in the Workflow Editor: open the Workflow, and go to its **Properties** tab, then find the **Git status name** input. + +![workflow-level-status-report.png](/img/_paligo/uuid-5e4c921b-80ff-3392-c91f-22e7389ce5e3.png) + +### Dynamic variables + +You can use the following dynamic variables in your status reports: + +| Variable name | Description | +| --- | --- | +| `project_slug` | The unique alphanumeric identifier of the project on Bitrise which is part of the project’s URL. | +| `project_title` | The human-readable title of the project. | +| `target_id` | The name of the specific Workflow or Pipeline that was used for the build. | +| `event_type` | Represents the type of event that triggered the status report. The possible values are: - `pr`: pull request (GitHub, Bitbucket) - `mr`: merge request (GitLab) - `push`: code push (GitLab, GitHub, Bitbucket - `tag`: Git tag (GitLab, GitHub, Bitbucket) | diff --git a/src/partials/creating-github-personal-access-tokens-for-build-hub.mdx b/src/partials/creating-github-personal-access-tokens-for-build-hub.mdx new file mode 100644 index 0000000..7922070 --- /dev/null +++ b/src/partials/creating-github-personal-access-tokens-for-build-hub.mdx @@ -0,0 +1,51 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating GitHub personal access tokens for Build Hub + +:::note + +This step is optional. Create a personal access token only if you're not using the Bitrise Build Hub GitHub App. + +::: + +You can use a GitHub personal access token to authenticate Build Hub to GitHub Actions. You can use either a classic access token or a fine-grained access token, depending on your needs. Read more on how authentication works: [Authentication for Build Hub](/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/authentication). + +To create the token on GitHub: + + + + +1. [Go through the process described here](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token) until you get to selecting a resource owner. +1. Select a resource owner: it should be the organization. + + :::note[Authorization] + + The organization might require authorization for the token: for example, you might be prompted to log in via SSO. + + ::: +1. Under **Repository access**, select **All repositories**. +1. Under **Permissions**, select **Organizations**. +1. Click **Add permissions**. +1. Select **Self-hosted runners**. +1. Set the access to **Read and write**. + + ![github-fine-grained-token-permissions.png](/img/_paligo/uuid-9def1cb2-5111-b6a3-58af-ade8becde4e4.png) +1. Click **Generate token**. +1. Copy your personal access token: you won't be able to see it again but you need it when [creating a machine pool](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool). + + + + +1. [Go through the process described here](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic) until you get to selecting the scopes. +1. Select the right scope: it depends on the target scope you need for your machine pool. + + - GitHub Cloud organization (https://github.com/<org>) and GHE organization (https://<hostname>/<org>): **org:admin** + - GitHub Enterprise (GHE) Cloud (https://github.com/enterprises/<enterprise>) and GHE Server (https://<hostname>/enterprises/<enterprise>): **manage_runners:enterprise**. + - GitHub Cloud repository (https://github.com/<owner>/<repo>) and GHE repository (https://<hostname>/<owner>/<repo>): **workflow**. +1. Click **Generate token**. +1. Copy your personal access token: you won't be able to see it again but you need it when [creating a machine pool](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool). + + + diff --git a/src/partials/creating-groups-for-workspaces.mdx b/src/partials/creating-groups-for-workspaces.mdx new file mode 100644 index 0000000..17e09e9 --- /dev/null +++ b/src/partials/creating-groups-for-workspaces.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating groups for Workspaces + +:::important[Owners and managers only] + +Only Workspace owners and managers can create groups for a workspace. + +::: + +When you create a new group, you must decide which products it should have access to. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Collaboration** from the menu options. +1. Select the **Groups** tab. +1. Click the **Create group** button to bring up a dialogue box. +1. Enter a group name in the **Group name** field. +1. Configure access to products: + + - **Admin access**: Grants access to all products, managing all aspects of selected projects with the project admin role. + - **Bitrise CI**: The group has access to Bitrise CI only, and it can be assigned [Bitrise CI roles](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + - **Release Management**: The group has access to Release Management only, and it can be assigned [Release Management roles](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). +1. If you toggle on a specific product instead of admin access, you will be prompted to select the projects for the group and its user roles on the selected projects. + + For Bitrise CI, you can select projects and assign a role to each project. You can also select the **All projects** option: in this case, the user will be added to a global access group with the selected role. + + For Release Management in particular, you can select: + + - Specific projects. Note that the group will be able to access all currently existing apps pf the project but not all future apps. + - Specific Release Management apps: select the already existing apps you want the group to have access to. +1. When finished with setting up roles, click **Done**. +1. Click **Create group**. diff --git a/src/partials/creating-or-updating-an-existing-secret.mdx b/src/partials/creating-or-updating-an-existing-secret.mdx new file mode 100644 index 0000000..887c081 --- /dev/null +++ b/src/partials/creating-or-updating-an-existing-secret.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating or updating Secrets + +:::important[Required role] + +You must have an admin or owner role on the app's team to create/update Secrets using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [User roles on app teams](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + +::: + +You can create or update Secrets using the PUT method of the `secrets` endpoint. + +If a Secret does not exist with the `secret-name` you provide, a new Secret will be created. If the Secret already exists, it will be updated with the new values you provided. + +The required parameter are: + +- app slug +- secret's name + +Optional parameters are: + +- expand_in_step_inputs: Set to true if you want Bitrise CLI to expand Secret before passing it on to Steps. +- is_exposed_for_pull_requests: Set to true if you want Secret to be exposed for pull requests. +- is_protected: Set to true if you want your Secret's value to be protected. (You will not be able to view Secret's value using the GET method.) +- value: The value stored in the Secret. + +**Creating a new Secret called "test"** + +Request: + +``` +curl -X PUT -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/THE-APP-SLUG/secrets/test' -d '{"expand_in_step_inputs": true, "is_exposed_for_pull_requests": true, "is_protected": false, "value": "123ld2"}' +``` diff --git a/src/partials/creating-outgoing-webhooks-with-the-api.mdx b/src/partials/creating-outgoing-webhooks-with-the-api.mdx new file mode 100644 index 0000000..20821ce --- /dev/null +++ b/src/partials/creating-outgoing-webhooks-with-the-api.mdx @@ -0,0 +1,54 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating outgoing webhooks with the API + +Outgoing webhooks enable integration with other services: specifically, they are used to notify other services. Currently, only build event notifications are supported. There are two supported build events: triggering a build and finishing a build. + +:::note[Build status reports] + +Notifying your Git provider about the build status does not require outgoing webhooks. + +::: + +To set up an outgoing webhook for an application, you need to specify the app itself and at least two of the creation parameters: + +- The webhook URL: you can get this from the service you want to integrate with Bitrise. +- The events that trigger the webhook. Currently, this takes two possible values: `all` and `build`. + +:::note[Required role] + +You must have an admin or owner role on the app's team to manage incoming or outgoing webhooks using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +You can also set up custom headers by specifying a key/value pair in the request. + +**A new outgoing webhook with the URL 'example.webhook.com'** + +Request: + +``` +curl -X POST "https://api.bitrise.io/v0.1/apps/APP-SLUG/outgoing-webhooks" -H "accept: application/json" -H "Authorization: ACCESS-TOKEN" -H "Content-Type: application/json" -d "{ \"events\": [ \"build\" ], \"url\": \"example.webhook.com\", \"headers\": { \"KEY\": \"value\" }}" +``` + +Response: + +``` +{ + "slug": "01D72ARNH4KR7KMW3DG3NBKXRK", + "url": "example.webhook.com", + "events": [ + "build" + ], + "headers": { + "KEY": "value" + }, + "registered_by_addon":false, + "created_at": "2019-03-28T14:20:22.436825Z", + "updated_at": "2019-03-28T14:20:22.436825Z" +} +``` diff --git a/src/partials/creating-project-based-triggers.mdx b/src/partials/creating-project-based-triggers.mdx new file mode 100644 index 0000000..07518fa --- /dev/null +++ b/src/partials/creating-project-based-triggers.mdx @@ -0,0 +1,51 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating project-based triggers + +Project-based triggers are defined on the project level: that is, the top level of your configuration YAML file. The trigger defines which Workflow or Pipeline should run when a given code event happens. A single code event can only trigger a single build. + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Select a Workflow. + + ![push-trigger.png](/img/_paligo/uuid-cf217fec-a57c-6c47-f625-d7b47d74e9d5.png) +1. Select the trigger type and click the **Add trigger** button. + + For example, if you want to set up a trigger for pull request events, select the Pull Request tab. +1. Click the **Add trigger** button. +1. Configure your trigger in the dialog. + + When setting multiple conditions, all conditions must be fulfilled for a build to start. You can use regular expressions for any of the condition types. + + You can find the full list of supported trigger conditions here: [Supported trigger conditions](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers/supported-trigger-conditions) +1. When done, click **Add trigger**. + + + + +1. Open your configuration YAML file. +1. In the Workflow, find the `trigger_map` property and set up your trigger under it. You need: + + - A `type` property to define the type of the code event. + - A trigger condition. For example, `commit_message`. + - The Workflow or Pipeline you want to trigger. + + ``` + trigger_map: + - type: push + commit_message: your_message + workflow: my-workflow + ``` + + You can find the exact syntax for the different trigger types here: [YAML syntax for build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers). +1. Save the configuration. + + + diff --git a/src/partials/creating-target-based-triggers.mdx b/src/partials/creating-target-based-triggers.mdx new file mode 100644 index 0000000..81f36cb --- /dev/null +++ b/src/partials/creating-target-based-triggers.mdx @@ -0,0 +1,85 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating build triggers + +You create build triggers directly in a Workflow or Pipeline. Such triggers allow a single code event to trigger multiple Workflows or Pipelines. You can create triggers via the UI or in the configuration YAML file. + +To create triggers: + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Select a Workflow. +1. Select the **Triggers** tab on the Workflow's page. + + ![trigger-in-workflow.png](/img/_paligo/uuid-fcb0bba9-a8a5-e874-c5ba-a5e0f08d8a80.png) +1. Select the trigger type and click the **Add trigger** button. +1. Configure your trigger in the dialog. + + Click the regex pattern button to turn on regular expressions when defining a value for the trigger condition. + + ![regex-button.png](/img/_paligo/uuid-2106af45-7e79-2a1c-5974-9a8f0bb78ffe.png) +1. When done, click **Add trigger**. + + + + +1. Open your configuration YAML file. +1. Find the Workflow. +1. In the Workflow, add a `triggers` property. + + ``` + my-workflow: + triggers: + ``` +1. Create your triggers. You can find the exact syntax for the different trigger types here: [YAML syntax for build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers). + + For example, this trigger starts a build with the Workflow called `my-workflow`: + + ``` + my-workflow: + triggers: + push: + - commit_message: your_message + ``` + + You can use two properties for pattern matching: + + - `pattern` allows you to use simple wildcard matching. + - `regex` allows you to use complex pattern matching with regular expressions. + + ``` + my_awesome_workflow + triggers: + push: + - branch: main + - commit_message: + pattern: "hello" + last_commit: true + pull_request: + - source_branch: "*" + ``` +1. Save the configuration. + + + + +### Adding a new target-based trigger on the Triggers page + +You can quickly add new target-based triggers without leaving the **Triggers** page. For example, after reviewing your active triggers, you can immediately add another one without switching context, speeding up your setup process. + +1. Go to your project's **Triggers** page. +1. If you don't have triggers yet, you’ll see a new **Add Trigger** button in the middle on the **Triggers** page. Click **Add trigger** and fill out the dialog. + + ![addnewtrigger.png](/img/_paligo/uuid-2d246b3d-6d4f-d215-8ee7-7d628492f7aa.png) +1. If you already have target-based triggers, the **add trigger** button is above the triggers in the top-right corner. Click **add trigger** and fill out the dialog. + + ![addanothertrigger.png](/img/_paligo/uuid-8a1664ba-48bd-f04b-5453-60cd9641e2ca.png) + +Adding a trigger here creates a specific workflow, which then appears under that workflow’s **Triggers** tab on the **Workflows** page for easy management. diff --git a/src/partials/creating-the-github-app.mdx b/src/partials/creating-the-github-app.mdx new file mode 100644 index 0000000..0860805 --- /dev/null +++ b/src/partials/creating-the-github-app.mdx @@ -0,0 +1,41 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating the GitHub App for GitHub Enterprise Server + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left of the **Workspace settings** page, select **Integrations**. +1. Select the **Git provider** tab and scroll to the **GitHub Enterprise Server** section. +1. Copy the webhook URL you can find here. +1. In another browser tab, open GHES and go to your organization's **Settings** page. + + :::note[Target repository] + + The organization should be the one that owns the repository or repositories that your project(s) use. You can reuse the GitHub app for other organizations later. + + ::: +1. On the **Settings** page, find the **Developer** settings section and select **GitHub Apps**. +1. Click **New GitHub App** and fill out the app creation form. The following table contains all the necessary information and fields that aren't specified in the table can be left empty: + + :::important[Setting a webhook secret] + + Setting a webhook secret is mandatory for this process and you will need the secret later when connecting your Bitrise Workspace to the GHES instance. + + ::: + + | **GitHub App name** | Bitrise | + | --- | --- | + | **Homepage URL** | https://app.bitrise.io | + | **Webhook URL** | The one you copied from your Workspace settings page on Bitrise. The format should be: `https://app.bitrise.io/organization//github_webhooks` | + | **Webhook secret** | GitHub marks this as optional but to ensure webhook integrity we require a secret to be set. The webhook secret should be a random string of text with high entropy. Please make a note of the secret as you have to share it with Bitrise later. | + | **Permissions** | Set the following permissions: - Repository permissions - Checks read and write - Commit statuses read and write - Contents read only - Metadata read only - Pull requests read only :::note[Upcoming features] Bitrise will use these events and permissions to offer a fully integrated experience with supporting, for example, [GitHub Checks](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github) and [selective builds](/en/bitrise-ci/configure-builds/configuring-build-settings/selective-builds.html). We will add these capabilities soon. ::: | + | **Subscribe to events** | Enable the following events: - Check run - Check suite - Pull request - Push | + | **Where can this GitHub App be installed?** | If you want to enable integration for repositories outside of this GHES organization, select **Any account**. | +1. When done, click **Create GitHub App**. + +After creating the GitHub app, proceed to set up the GitHub Enterprise Server integration on Bitrise. diff --git a/src/partials/creating-the-step.mdx b/src/partials/creating-the-step.mdx new file mode 100644 index 0000000..8c9af71 --- /dev/null +++ b/src/partials/creating-the-step.mdx @@ -0,0 +1,49 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating the Step + +We will use the Step plugin of the Bitrise CLI to create a new Step. With this, we’ll create the basic structure of the Step. Certain properties and inputs will be generated and assigned automatically. You can change anything later so don’t worry about it yet. + +:::tip[The Step plugin] + +Run `bitrise :step` in a command line interface to check its commands. + +::: + +Creating the basic structure of the Step is simple. We’ll go over the concepts involved in the process in more detail later; for now, just go through the process to create the Step. At the end of this process, you will have a `step.yml` file, a `README.md` file and either a `main.go` or a `step.sh` file in the repository. + +:::important[Before you start] + +During the Step creation process, you will be prompted to set a number of options. Note that you can change any of these before submitting your Step to Bitrise for review: the data will be included in the generated `step.yml` file that you can edit at your leisure later. During the initial Step creation process, you can use placeholders if you want to. + +::: + +1. Open a command line interface, such as the Terminal app on MacOS. +1. Create a new directory for your Step if you haven’t done so yet and enter that directory. +1. Create the Step with the Bitrise Step plugin: `bitrise :step create`. +1. When prompted, set the name of the Step’s author. + + Hit Enter to leave it on the default value. +1. When prompted, set the Step’s name. + + The plugin automatically generates a Step ID based on this name. +1. Provide a summary: no more than a couple of sentences about what the Step does. +1. Provide a description of the Step. + + This should contain configuration information and troubleshooting information for the Step. +1. Select the primary category of the Step. + + To do so, type the number of the preferred option and hit Enter. This can be changed later. +1. Choose the toolkit you want to use: you can choose either Go or Bash. +1. Set up the source code hosting data for the Step: + + To do so, first decide if you want to host it on GitHub or on any other site and enter the appropriate option: + + - If you chose GitHub, you will be asked to provide the username of the account that will own the repository. + - If you chose not to store it on GitHub, you have to provide a valid URL for the repository. + +You are done! If everything went well, the plugin initialized a git repository in the current directory and added a `step.yml`, a `README.md` file, and either a `main.go` or a `main.sh` file. + +Now we’ll go through how the `step.yml` file works and how to set it up. diff --git a/src/partials/creating-your-own-scanner.mdx b/src/partials/creating-your-own-scanner.mdx new file mode 100644 index 0000000..ccca1ad --- /dev/null +++ b/src/partials/creating-your-own-scanner.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating your own scanner + +Our project scanner automatically detects the project type whenever you add a new app on Bitrise. In this context, type means the platform or framework used to create the app, for example, Android, iOS, React Native or Flutter. Based on the results, we automatically create a configuration, with at least one default Workflow that contains the most frequently used Steps for the detected type. + +Our scanner might not detect your app, for a couple of reasons: either something is missing from your repository (such as a config.xml file in the case of an Ionic app, for example), or we simply don’t have a scanner for your type yet. If it’s the latter, you can [configure your app manually](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project), or you can create your own scanner, with its own project configuration: [Creating your own Bitrise project scanner.](/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner.html) diff --git a/src/partials/creating-your-own-step.mdx b/src/partials/creating-your-own-step.mdx new file mode 100644 index 0000000..0bba649 --- /dev/null +++ b/src/partials/creating-your-own-step.mdx @@ -0,0 +1,7 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating your own Step + +Bitrise offers well over 200 Steps to our users. We maintain many of them ourselves but our users’ community does an outstanding job of contributing to our Step Library (StepLib). Anyone can submit a Step - if approved, it will become part of the official Bitrise StepLib and available to all Bitrise users! Check out how to create your own Step and share it with the world: [Creating your own Step](/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step.html). diff --git a/src/partials/credit-usage-by-app-workflow-or-step.mdx b/src/partials/credit-usage-by-app-workflow-or-step.mdx new file mode 100644 index 0000000..daf428a --- /dev/null +++ b/src/partials/credit-usage-by-app-workflow-or-step.mdx @@ -0,0 +1,73 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Credit usage by app, Workflow or Step + +Open the **Credits page** under the **EXPLORE** section in the left sidebar. You can also switch to weekly view, to the last 12 weeks, if you’re not already in weekly view: + +![weekly-view.png](/img/_paligo/uuid-0c1048ad-a593-b587-4dad-63c8cb4ddfc1.png) + +Just like on any other Explore pages you’ll see two charts. The upper chart always shows you data for the filters you set. The lower chart is called the breakdown chart and it shows you data one level deeper than what you filtered on. + +If you have only a single app in your Workspace then Insights will automatically select that app when you open any of the Explore pages. If you have multiple apps in your Workspace, when you open the **Credits** page the upper chart shows you the overall credit use of the Workspace across all of your apps in the Workspace. + +The lower chart in this case shows you the same data but on a per app basis. From this you can see which app used the most amount of credits in the selected time period. + +![costliest-app.png](/img/_paligo/uuid-27ec3df6-bdce-7f78-95be-647668661e56.png) + +Here on the breakdown chart you can see that we have this application which used the most amount of credits in this Workspace. Filter down to that app, and on the next level you'll find the per Workflow breakdown. + +The upper chart now shows what is filtered on, so in this case it's the selected app's credit usage. On the lower, breakdown chart you can see which is the Workflow which used the most credits. + +![costliest-workflow.png](/img/_paligo/uuid-71015c65-9c35-e1b8-e5fc-9bf9d1833731.png) + +Let's filter down to that Workflow. + +The chart now reflects this filtering and shows the credit usage trend of the Workflow. + +From here we should find out what is causing this credit usage increase in this Workflow. This might be caused by slower builds, increased amount of builds, or by changing the machine type to one which uses more credits per minute. + +To investigate this switch over to the **Builds** page. When you switch to any other Explore pages the filters you previously selected will carry over, so you won’t have to select the same app and Workflow again.In this case going through the metric tabs most metrics seem stable during this period, but we can see a similar pattern on the **Total duration** metric: + +![total-duration.png](/img/_paligo/uuid-f20ee280-d116-8015-6f87-2fd8b74da9a2.png) + +Similar to the **Credits** page, the **Builds** page also has 2 charts on it. The top one shows the selected metric (**Total duration** in this case) for the relevant filters (for the selected app and Workflow). + +The lower breakdown chart shows the per step distribution of the total build duration. From this we can see that the **iOS Device Testing** Step took the most amount of time and it also correlates with the overall trend. + +As build times and build count was consistent for the whole 12 weeks, and the only other metric which had a change during this period was **Failure rate**, let’s switch over to that tab: + +What we can see here is that where we had the drop in credit usage as well as in total duration the **iOS Device Testing** Step had a 100% failure rate. As failed Steps usually take less time to finish, let’s check the related builds as well in the **Related builds** section under the charts. + +![ios-device-testing.png](/img/_paligo/uuid-c81ac3ec-31ee-45b9-3be1-497feae7a780.png) + +To find the relevant builds we’ll zoom into the period where failure rate increased. The easiest way is to click-hold-and-drag on the chart. + +Let’s filter down to just this single Step as well in the **Related builds** section: + +![related-builds.png](/img/_paligo/uuid-86def2f6-adbf-52b0-1bf9-dbe7ca05c08f.png) + +Now we can scroll through the build history and see how the build time of this Step changed. At the end of the period, where the failure rate was 100% we can see that it only took a few seconds: + +![step-failed-quickly.png](/img/_paligo/uuid-86871cee-ac96-75d5-d63b-bc5daa5b56c2.png) + +As we keep scrolling we can see that back in early December where we still had successful builds the Step took multiple minutes to complete: + +![step-took-long.png](/img/_paligo/uuid-c92d5036-7f13-9541-6a80-0614d27e928d.png) + +So in this case the drop on the total duration (and in credits) was caused by this Step failing a lot, which meant that builds completed quicker, until the issue with the tests was fixed, when the Step and the builds once again took longer to finish, but could actually run and finish the tests. + +Another place which worth to be checked periodically is the **Bottlenecks** page: + +![bottlenecks-overview.png](/img/_paligo/uuid-6b2fbeca-bd57-7bfa-2ba6-7bb84f9036b4.png) + +On this page you can find a **Credits** section where Bitrise Insights highlights you negative trends which consumed the most amount of credits. + +**Failing Workflow**s shows you Workflows which had a lot of credit usage on failed builds. On the example above you can see that the Workflow called test failed in 73.68% of the cases in the last 7 days and those failed builds consumed 624 credits in total. + +Build time shows slowing build trends, where the build took longer in the last 7 days than in the 7 days before that, and tells you the credit impact of that negative trend. + +The **Usage** bottleneck simply lists you the Workflows which used the most amount of credits in the last 7 days. + +Clicking any of these bottleneck items will open the relevant Explore page filtered down to the Workflow. diff --git a/src/partials/dashboards-in-jenkins-and-bitrise.mdx b/src/partials/dashboards-in-jenkins-and-bitrise.mdx new file mode 100644 index 0000000..4873f71 --- /dev/null +++ b/src/partials/dashboards-in-jenkins-and-bitrise.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Dashboards in Jenkins and Bitrise + +This is the main landing page where you find yourself when logging into Bitrise. From here you can navigate to your [projects](https://docs.bitrise.io/en/bitrise-ci/getting-started/the-bitrise-dashboard.html#checking-project-details), [your CI builds](https://docs.bitrise.io/en/bitrise-ci/getting-started/getting-started.html), [Bitrise Build Cache](https://docs.bitrise.io/en/bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview.html) and [Release Management](https://docs.bitrise.io/en/release-management/getting-started-with-release-management/getting-started-with-release-management.html). + +![bitrisedashboard.png](/img/_paligo/uuid-59d1dcd7-7e29-7221-cbfb-b648ab73102b.png) + +On Jenkins, build statuses are listed in the **Build Executor Status** or on the Blue Ocean **Dashboard**. When using Bitrise you get a user-friendly graphical interface right from the start, whereas, with Jenkins, you have to install the plugin first. Bitrise build statuses are shown on both the **Dashboard**, and on the **Builds** page of your app. + +### Adding a new app to Bitrise + +What **New item** means in Jenkins is the **adding a new project flow** on Bitrise, either [on the web UI](/en/bitrise-ci/getting-started/adding-a-new-project.html) or [from the CLI](/en/bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli.html). This is a highly automated flow where minimal configuration is needed from you and literally within a minute your new build starts. Our flow takes you through all the important phases: setting privacy, connecting your repository, setting up repository access, choosing a branch, configuring your project, setting up your build configuration and [configuring webhooks](/en/bitrise-platform/integrations/webhooks.html). + +### Webhooks on Bitrise + +Bitrise makes extensive use of webhooks, which you can enable with a simple click when connecting a project to Bitrise. It all makes sense to add the webhook during the initial setup and not having to search for this functionality when you try to quickly get your project to speed. + +In short, there are two types of [Webhooks](https://docs.bitrise.io/en/bitrise-ci/api/incoming-and-outgoing-webhooks.html): + +- Incoming webhooks, registered with your Git service provider, are used to automatically trigger builds on Bitrise. +- Outgoing webhooks are used to send reports of build events to other services, such as Slack. They can be added either on the website or via the [API overview](/en/bitrise-ci/api/api-overview). diff --git a/src/partials/database-configuration-for-ruby-projects.mdx b/src/partials/database-configuration-for-ruby-projects.mdx new file mode 100644 index 0000000..2efbb91 --- /dev/null +++ b/src/partials/database-configuration-for-ruby-projects.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Database configuration for Ruby projects + +When adding a Ruby project, our project scanner detects database gems: `pg`, `mysql2`, `redis`, `mongoid/mongo`, and `sqlite3`. For each detected database gem, the scanner generates the appropriate service container: Postgres, MySQL, Redis, or MongoDB. Each container has the correct image, port mapping, and health checks so the container is fully ready before your tests try to connect. + +The scanner also parses your `config/database.yml` for relational databases and the `config/mongoid.yml` for MongoDB, to extract connection details. It resolves ERB expressions: if your `database.yml` contains something like `ENV.fetch("DB_HOST", "localhost")`, the scanner picks up both the environment variable name and its default value. These are then set as app-level environment variables in your Bitrise configuration, which means your test Workflow connects to the service containers without any manual environment setup. + +The scanner prefers the `test` environment section in your `database.yml`, falling back to default if a test block isn't present — which is exactly the lookup order Rails itself uses. diff --git a/src/partials/deactivating-a-trigger.mdx b/src/partials/deactivating-a-trigger.mdx new file mode 100644 index 0000000..d2f5ebd --- /dev/null +++ b/src/partials/deactivating-a-trigger.mdx @@ -0,0 +1,39 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disabling a trigger + +You can temporarily disable any build trigger. A disabled trigger doesn't trigger builds but retains all configuration information. You can reactivate a disabled trigger at any time. + +To disable a build trigger: + + + + +1. Open the Workflow Editor on Bitrise. +1. Select a Workflow or Pipeline. +1. On the Workflow page, select the **Triggers** tab. + + ![workflow-properties.png](/img/_paligo/uuid-7755ec1f-eb8f-5036-05b3-be1b330f2143.png) +1. Find the trigger you need and click the vertical ellipsis next to its name. + + ![workflow-properties-ellipsis.png](/img/_paligo/uuid-3ab9024b-207a-0b06-c099-714f8c053ecd.png) +1. Select **Disable trigger**. + + + + +1. Open your configuration YAML file. +1. Find the Workflow or Pipeline and its `triggers` property. +1. Add `enabled: false` to the trigger you want to disable. + + ``` + triggers: + push: + - branch: main + enabled: false + ``` + + + diff --git a/src/partials/declarative-tool-setup.mdx b/src/partials/declarative-tool-setup.mdx new file mode 100644 index 0000000..73e8934 --- /dev/null +++ b/src/partials/declarative-tool-setup.mdx @@ -0,0 +1,125 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Declarative tool setup + +Add your tool and its version to the `tools` property on the top level of your configuration YAML file.: + +``` +tools: + nodejs: 22:latest + ruby: 3.3:installed + golang: 1.24.5 + +workflows: +# ... +``` + +When running a build, tool setup is executed before the first Step of the Workflow. You can see it in a build log: + +![20250808-build-log-tool-setup.png](/img/_paligo/uuid-b80417cb-80b7-3d51-5609-11f078c68a79.png) + +There are three ways to define version numbers for the tools you want to set up at the start of a build: + +- [Set exact version numbers](#section-idm235110396195526). +- [Set partial version numbers](#section-idm235110553728101). +- [Use special aliases](#section-idm235110583601597). + +### Setting exact version numbers + +You can define an exact version number in your `tools` property: + +``` +tools: + nodejs: 22.1.0 +``` + +This provides the most deterministic behavior and reproducible builds, but installs could take a long time. + +### Setting partial version numbers + +If your project doesn't require precise tool versions, you can define partial version numbers. With a partial version version number, Bitrise will check for either a version preinstalled on the Bitrise build machines or the latest released version available. + +For a preinstalled version of a tool, use the `x.y:installed` syntax: + +``` +tools: + ruby: 3.3:installed +``` + +This checks which Ruby 3.3 patch version is preinstalled on the Bitrise build machines and uses that version. If no preinstalled version matches the partial version, the highest matching version is going to be downloaded and installed at runtime. It will not result in a build failure. + +For the latest released version of a tool, use the `x.y:latest` syntax: + +``` +tools: + ruby: 3.3:latest +``` + +This installs the latest 3.3 patch version of Ruby, regardless of what is preinstalled on the Bitrise build machines. + +### Workflow-specific definitions + +You can define tool version definitions globally or for one or more Workflows specifically. Instead of defining the `tools` property at the top level of the configuration, you nest it under one or more Workflows. + +You can also unset some tools for certain Workflows with the keyword `unset`. Unsetting means that tool won't be installed for that Workflow. Unsetting has no effect in the global context. + +We recommend using one of three common patterns when using Workflow-specific definitions: + +- Workflow-specific definitions only: + + ``` + workflows: + test: + tools: + nodejs: 22:installed + ``` + + In this example, the `test` Workflow uses the highest preinstalled version of Node.js v22. No global tool definitions are set. +- Override the global definition in one or more Workflows: + + ``` + tools: + nodejs: 22:installed + ruby: 3.3:installed + + workflows: + test-latest-node: + tools: + nodejs: "24.7.0" + ``` + + In this example, the global setting is the highest preinstalled version of Node.js v22. The Workflow `test-latest-node`, however, uses Node.js version 24.7.0. +- Unset global tool versions in one or more Workflows: + + ``` + tools: + nodejs: 22:installed + ruby: 3.3:installed + + workflows: + lint: + tools: + ruby: unset # this workflow only needs Node.js + ``` + + In this example, the Workflow called `lint` won't have Ruby installed. + +### Using other aliases + +It’s also possible to use the special `latest` and `installed` version strings to select the highest released or highest installed version of a tool: + +The `installed` value means using the highest installed version at the time of build: + +``` +tools: + ruby: installed +``` + +The `latest` value means using the highest released version at the time of build: + +``` +tools: + nodejs: latest +``` diff --git a/src/partials/decrypting-your-files-during-a-build.mdx b/src/partials/decrypting-your-files-during-a-build.mdx new file mode 100644 index 0000000..e938e0d --- /dev/null +++ b/src/partials/decrypting-your-files-during-a-build.mdx @@ -0,0 +1,54 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Decrypting and downloading your files during a build + +After you successfully encrypted a file, you need to upload it to Bitrise and you need to be able to decrypt it during the build. In this procedure, we'll use the **Decrypt file** Step to decrypt the file. + +:::note[GPG encryption] + +Please note that the **Decrypt file** Step only decrypts files encrypted with GPG. If you use other encryption software, you will not be able to decrypt files using the Step. You can, of course, set up your own decryption solution in a **Script** Step. + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Go to the **Secrets** tab, and add your decryption passphrase as a [Secret](/en/bitrise-ci/configure-builds/secrets.html). +1. [Upload the file to Bitrise](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html) +1. Copy the Environment Variable (Env Var) under the name of the uploaded file. This Env Var stores the download URL for the file. +1. Go to the **Workflows** tab. +1. Open the Workflow Editor. +1. Add the **Decrypt file** Step to your Workflow. +1. Paste the Env Var of the file to the **Encrypted file path** input. +1. In the **Output file path** input, specify the path where you want to place the decrypted file. Subsequent Steps will be able to access the file at this path. + + :::tip[Using an Env Var as the input value] + + You can store the filepath in an App Env Var instead of specifying it directly for the input. That way you can refer to the file through the Env Var in other Steps, you won’t have to specify the path every time. + + For example, if you store the path in the `BITRISEIO_MY_FILE_LOCAL_PATH` Env Var, you can use it as the path for the input, and also use it to access the file in every subsequent Step. + + ::: + +**A bitrise.yml example for decrypting files** + +``` +--- +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: macos +workflows: + secret: + steps: + - activate-ssh-key@4: {} + - git-clone@6: {} + - decrypt-file@0: + inputs: + - encrypted_file_path: "./secret.txt.gpg" + - output_file_path: "./secret/" + - decrypt_passphrase: "$PASSWORD_FOR_ENCRYPT" + - deploy-to-bitrise-io@2: {} +``` diff --git a/src/partials/default-workflows-for-a-java-project.mdx b/src/partials/default-workflows-for-a-java-project.mdx new file mode 100644 index 0000000..da086f2 --- /dev/null +++ b/src/partials/default-workflows-for-a-java-project.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Default Workflows for a Java project + +The project scanner can detect Java projects and create default Workflows for them. A new project is considered a generic Java project if: + +- It uses Gradle (the code contains the usual Gradle configuration files and a Gradle Wrapper script in the project root directory) and it doesn't use Android or Kotlin Multiplatform required dependencies. +- It uses Maven with a `POM.xml` project configuration file in the root directory, and has a Maven Wrapper script. + +For a generic Java project, Bitrise generates default Workflows based on the build tool. + +| Workflow ID | Workflow summary | Workflow description | +| --- | --- | --- | +| `run_tests` | Run your projects tests. | The Workflow clones your Git repository and runs tests by using the **Run Gradle Tests** Step which runs the `test` Gradle task. | + +| Workflow ID | Workflow summary | Workflow description | +| --- | --- | --- | +| `run_tests` | Run your projects tests. | The Workflow clones your Git repository and runs tests by using a Script step, running the Maven Wrapper’s test command: `./mvnw test`. | diff --git a/src/partials/default-workflows-for-a-nodejs-project.mdx b/src/partials/default-workflows-for-a-nodejs-project.mdx new file mode 100644 index 0000000..6755a7a --- /dev/null +++ b/src/partials/default-workflows-for-a-nodejs-project.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Default Workflows for a Node.js project + +Bitrise generates one default Workflow for a Node.js project: a Workflow to run your project's lint and test scripts. You can customize this Workflow or create new ones based on it. + +| Workflow ID | Workflow summary | Workflow description | +| --- | --- | --- | +| `run_tests` | Run your project’s tests. | The Workflow clones your Git repository, selects and installs the Node version, installs the `npm` packages, and, depending on the available scripts in your `package.json` file, runs the lint and test scripts. The Workflow also supports `node_modules` caching for better performance. The `lint` and `test` steps use npm or Yarn depending on which package manager was detected. If neither lock file is present, the user selects the package manager interactively during setup. | diff --git a/src/partials/default-workflows-for-a-ruby-project.mdx b/src/partials/default-workflows-for-a-ruby-project.mdx new file mode 100644 index 0000000..84c1bb4 --- /dev/null +++ b/src/partials/default-workflows-for-a-ruby-project.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Default Workflows for a Ruby project + +| Workflow ID | Workflow summary | Workflow description | +| --- | --- | --- | +| `run_tests` | Run your project’s tests. | The Workflow clones your Git repository and restores your gem cache with the `gem-{{ checksum "Gemfile.lock" }}` caching key. It installs dependencies depending on signals in your codebase: - If MySQL gem is detected, it installs system dependencies. - If Bundler is detected, it installs dependencies with `bundle install`. If a relation database gem is detected, it performs database setup: `db:create db:schema:load`. If a test framework or a Rakefile is detected, the Workflow runs your tests. The Workflow always saves the Ruby gem cache and includes the **Deploy to Bitrise.io** Step. | diff --git a/src/partials/default-workflows-for-an-android-project.mdx b/src/partials/default-workflows-for-an-android-project.mdx new file mode 100644 index 0000000..3a55546 --- /dev/null +++ b/src/partials/default-workflows-for-an-android-project.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Default Workflows for an Android project + +For a new Android project, Bitrise automatically generates three new Workflows. You can customize these Workflows or [create new ones](/en/bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.html) based on them. + +| Workflow ID | Workflow summary | Workflow description | +| --- | --- | --- | +| `run_tests` | Run your Android unit tests and get the test report. | The Workflow clones your Git repository, [caches your Gradle dependencies](/en/bitrise-ci/dependencies-and-caching/android-dependencies.html), installs Android tools, runs your [Android unit tests](/en/bitrise-ci/testing/testing-android-apps/android-unit-tests) and saves the [test report](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). | +| `build_apk` | Run your Android unit tests and create an APK file to install your app on a device or share it with your team. | The Workflow clones your Git repository, installs Android tools, [sets the project’s version code based on the build number](/en/bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning/setting-up-app-versioning-automatically-on-bitrise), [runs Android lint](/en/bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps) and unit tests, builds the project’s APK file and save it. | +| `run_instrumented_tests` | Run your Android instrumented tests with test sharding and get a test report. | The Workflow clones your Git repository, [caches your Gradle dependencies](/en/bitrise-ci/dependencies-and-caching/android-dependencies.html), installs Android tools, boots up an Android emulator to run your Android instrumented tests and saves the [test report](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). This Workflow is part of a default Pipeline which utilizes [parallelism](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines): it runs multiple copies of the Workflow to shard instrumented tests. | diff --git a/src/partials/default-workflows-for-an-ios-project.mdx b/src/partials/default-workflows-for-an-ios-project.mdx new file mode 100644 index 0000000..0ad277e --- /dev/null +++ b/src/partials/default-workflows-for-an-ios-project.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Default Workflows for an iOS project + +For a new iOS project, Bitrise automatically generates several Workflows. You can customize these Workflows or [create new ones](/en/bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.html) based on them. + +| Workflow ID | Workflow summary | Workflow description | +| --- | --- | --- | +| `run_tests` | Run your project’s tests. | The Workflow clones your Git repository, installs Node Version Manager (NVM) and select the Node version, restores cached `node_modules` dependencies, runs your tests using the package manager appropriate to your project and saves the cache. | +| `build_for_testing` | Builds your Xcode project ready for testing. | The Workflow clones your Git repository, builds your app ready for testing, apportions tests into each test shard and deploys the app plus tests to Bitrise so they can be used in subsequent Workflows. This Workflow is part of a default Pipeline. | +| `test_without_building` | Tests your iOS app without needing to rebuild it. | Retrieves the app and tests from the preceding Workflow in a Pipeline and tests compiled bundles using Xcode’s `test_without_building` command. This Workflow is part of a default Pipeline. | +| `archive_and_export_app` | Run your Xcode tests and create an IPA file to install your app on a device or share it with your team. | The Workflow clones your Git repository, caches and installs your project’s dependencies if there are any, runs your Xcode tests, and [exports an IPA file from the project](/en/bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects.html). | +| `build` | Builds your Xcode project. This Workflow is generated only if the project scanner didn't find any tests configured in your Xcode project. | The Workflow clones your Git repository, caches and installs your project’s dependencies if there are any, and builds your project. It uses Xcode's [build for testing](/en/bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing.html) action. | diff --git a/src/partials/default-workflows-for-kotlin.mdx b/src/partials/default-workflows-for-kotlin.mdx new file mode 100644 index 0000000..9efb390 --- /dev/null +++ b/src/partials/default-workflows-for-kotlin.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Default Workflows for a Kotlin Multiplatform project + +Bitrise generates three default Workflows for a Kotlin Multiplatform project: one to run tests, one to build an Android app, and one to build an iOS app. + +| Workflow ID | Workflow summary | Workflow description | +| --- | --- | --- | +| `run_tests` | Run your project’s tests. | The Workflow clones your Git repository, runs the `test` Gradle task using the **Gradle Unit Test** Step, and caches your Gradle task outputs. | +| `android_build` | Builds and signs an Android app from your Kotlin project. | The Workflow clones your Git repository, builds your app using the **Android Build** Step, [signs](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html) it with **Android Sign**, and caches your Gradle task outputs. It produces a downloadable APK file. | +| `ios_build` | Builds and signs an iOS app from your Kotlin project. | The Workflow clones your Git repository, builds and [signs](/en/bitrise-ci/code-signing/ios-code-signing.html) your app using the **Xcode Archive & Export for iOS** Step, and caches your Gradle task outputs. It produces a downloadable IPA file. | diff --git a/src/partials/default-workflows-for-multiplatform-projects.mdx b/src/partials/default-workflows-for-multiplatform-projects.mdx new file mode 100644 index 0000000..b12e725 --- /dev/null +++ b/src/partials/default-workflows-for-multiplatform-projects.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Default Workflows for multiplatform projects + +For multiplatform projects - projects that aren't native iOS or Android mobile apps but created with some mobile development framework, such as React Native, Flutter, Ionic or Cordova -, Bitrise creates two default Workflows: `primary` and `deploy`. + +The exact Steps included in these default Workflows depend on the project type. However, the main goals of the two Workflows are the same, regardless of project type: + +- The `primary` Workflow clones your project's repository, installs and caches your dependencies, and runs any tests configured in the project. +- The `deploy` Workflow, in addition to installing and caching dependencies and running tests, also builds your project: it tries to generate an APK or IPA file. diff --git a/src/partials/defining-a-service-container.mdx b/src/partials/defining-a-service-container.mdx new file mode 100644 index 0000000..b665304 --- /dev/null +++ b/src/partials/defining-a-service-container.mdx @@ -0,0 +1,130 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Defining a service container + +Define a service container for your Bitrise Workflows by using the `container` property. You can define containers either on the Workflow Editor or directly in your configuration YAML file. + +When you have at least one service container defined, you can run background services during Step execution: [Running a service container](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers/running-a-service-container). + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Containers**. +1. Go to the **Service containers** tab and then click **Add container**. +1. Set the required properties for the container. They are: + + - **Unique ID**: This ID is used to refer to the container in your configuration YAML file. + - **Image:** The name and version of the Docker image. You can use any image found on [Docker Hub](https://hub.docker.com/) or you can use other registries. + + For a Docker Hub image, use the `[name]:[version]` format. For other registries, use `[registry server]/[owner]/[name]:[version]`. + + ![SCR-20260313-ptnr.png](/img/_paligo/uuid-b793f623-9381-97af-5a8b-72719a0223fa.png) +1. Optionally, add port mappings in the **Ports** field in the `[HostPort01]:[ContainerPort01]` format. + + Read more about port publishing and port mapping in [Docker's official documentation](https://docs.docker.com/engine/network/port-publishing/). +1. Click **Show more options** to access Docker authentication credentials, Environment Variables for your container, and Docker create options. +1. Optionally, set up your Docker credentials. + + The credentials are used for the `docker login` command. You can set up: + + - **Registry server**: It should be a fully qualified registry server URL. This is optional if the server is already part of the image reference. + - **Username**. + - **Password**. + + :::tip + + You must use [secrets](/en/bitrise-ci/configure-builds/secrets.html) to pass your Docker credentials to your configuration. + + ::: +1. Optionally, add options in the **Docker create options** field. + + These are Docker container resource options: parameters that will be passed to the `docker container create` command. + + For a list of all available options, see [the Docker documentation](https://docs.docker.com/reference/cli/docker/container/create/#options). +1. When done, click **Create container**. + + + + +1. Add the `containers` property to the top level of your configuration YAML. +1. Set an ID for your container. + + It must be unique within the configuration. The ID is used to refer to the container in Steps or Step bundles. + + ``` + containers: + postgres: + ``` +1. Set the required properties for the container. They are: + + - The name and version of the Docker image, in a `name:version` format. You can use any image found on [Docker Hub](https://hub.docker.com/). + - The container type: `service`. + + ``` + containers: + postgres: + type: service + image: postgres:16 + ``` +1. Optionally, set up a port mapping in a `[HostPort01]:[ContainerPort01]` format. + + Read more about port publishing and port mapping in [Docker's official documentation](https://docs.docker.com/engine/network/port-publishing/). + + ``` + containers: + postgres: + type: service + image: postgres:16 + ports: + - 5432:5432 + ``` +1. Optionally, set up your Docker credentials. + + The credentials are used for the docker login command. You can set up: + + - A server. This is optional if the server is already part of the image reference. + - A username. + - A password. + + :::tip + + We recommend using secrets to pass your Docker credentials to your configuration. + + ::: + + ``` + containers: + postgres: + type: service + image: postgres:16 + credentials: + username: $DOCKER_USERNAME + password: $DOCKER_PASSWORD + server: us-central1-docker.pkg.dev + ``` +1. Optionally, use the `options` property to configure additional Docker container resource options: parameters that will be passed to the `docker container create` command. + + In this example, the service is configured to have [healthchecks](https://docs.docker.com/engine/reference/run/#healthchecks). + + ``` + containers: + postgres + type: service + image: postgres:16 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ``` + + For a list of all available options, see [the Docker documentation](https://docs.docker.com/reference/cli/docker/container/create/#options). + + + diff --git a/src/partials/defining-an-execution-container.mdx b/src/partials/defining-an-execution-container.mdx new file mode 100644 index 0000000..58aa10e --- /dev/null +++ b/src/partials/defining-an-execution-container.mdx @@ -0,0 +1,141 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Defining an execution container + +Use the `container` property to define an execution container. You can define them either on the Workflow Editor or directly in your configuration YAML file. + +When you have at least one execution container defined, you can run Steps and Step bundles in them: [Running an execution container](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers/running-an-execution-container). + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Containers**. +1. Go to the **Execution containers** tab and then click **Add container**. + + ![SCR-20260313-pnzl.png](/img/_paligo/uuid-35998534-7cfb-c0c6-7277-bb12dd6bc345.png) +1. Set the required properties for the container. They are: + + - **Unique ID**: This ID is used to refer to the container in your configuration YAML file. + - **Image:** The name and version of the Docker image. You can use any image found on [Docker Hub](https://hub.docker.com/) or you can use other registries. + + For a Docker Hub image, use the `[name]:[version]` format. For other registries, use `[registry server]/[owner]/[name]:[version]`. +1. Optionally, add port mappings in the **Ports** field in the `[HostPort01]:[ContainerPort01]` format. + + Read more about port publishing and port mapping in [Docker's official documentation](https://docs.docker.com/engine/network/port-publishing/). +1. Click **Show more options** to access Docker authentication credentials, Environment Variables for your container, and Docker create options. +1. Optionally, set up your Docker credentials. + + The credentials are used for the `docker login` command. You can set up: + + - **Registry server**: It should be a fully qualified registry server URL. This is optional if the server is already part of the image reference. + - **Username**. + - **Password**. + + :::tip + + You must use [secrets](/en/bitrise-ci/configure-builds/secrets.html) to pass your Docker credentials to your configuration. + + ::: +1. Optionally, add options in the **Docker create options** field. + + These are Docker container resource options: parameters that will be passed to the `docker container create` command. + + ![SCR-20260313-pruq.png](/img/_paligo/uuid-683647fc-3131-1c5a-8667-2fa719d617cd.png) + + For a list of all available options, see [the Docker documentation](https://docs.docker.com/reference/cli/docker/container/create/#options). +1. When done, click **Create container**. + + + + +1. Add the `containers` property to the top level of your configuration YAML. + + :::tip[YAML syntax reference] + + For detailed YAML syntax reference, see [Docker container properties](/en/bitrise-ci/references/configuration-yaml-reference/docker-container-properties). + + ::: +1. Set an ID for your container. + + It must be unique within the configuration. The ID is used to refer to the container in Steps or Step bundles. + + ``` + containers: + node-18: + ``` +1. Set the required properties for the container. They are: + + - The name and version of the Docker image, in a `name:version` format. You can use any image found on [Docker Hub](https://hub.docker.com/). + - The container type: `execution`. + + ``` + containers: + node-21: + type: execution + image: node:21.6 + node-18: + type: execution + image: node:18 + ``` +1. Optionally, set up a port mapping in the `[HostPort01]:[ContainerPort01]` format. + + Read more about port publishing and port mapping in [Docker's official documentation](https://docs.docker.com/engine/network/port-publishing/). + + ``` + containers: + node-21: + type: execution + image: node:21.6 + ports: + - 3000:3000 + ``` +1. Optionally, set up your Docker credentials. + + The credentials are used for the `docker login` command. You can set up: + + - A server: It should be a fully qualified registry server URL. This is optional if the server is already part of the image reference. + - A username. + - A password. + + :::tip + + We recommend using secrets to pass your Docker credentials to your configuration. + + ::: + + ``` + containers: + node-21: + type: execution + image: node:21.6 + credentials: + username: $DOCKER_USERNAME + password: $DOCKER_PASSWORD + server: us-central1-docker.pkg.dev + ``` +1. Optionally, use the `options` property to configure additional Docker container resource options: parameters that will be passed to the `docker container create` command. + + In this example, the service is configured to have [healthchecks](https://docs.docker.com/engine/reference/run/#healthchecks). + + ``` + containers: + node-21: + type: execution + image: node:21.6 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ``` + + For a list of all available options, see [the Docker documentation](https://docs.docker.com/reference/cli/docker/container/create/#options). + + + diff --git a/src/partials/defining-configuration-modules.mdx b/src/partials/defining-configuration-modules.mdx new file mode 100644 index 0000000..ef35918 --- /dev/null +++ b/src/partials/defining-configuration-modules.mdx @@ -0,0 +1,184 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Defining configuration modules + +A configuration module is a full YAML configuration file. That means that all configuration elements of a valid `bitrise.yml` file are available: you can define the `format_version`, app level Environment Variables, default stacks and machine types, and of course Pipelines, Stages, and Workflows in a configuration module. + +For example, you can create a bare minimum `bitrise.yml` file that simply points to another module: + +``` +include: + - path: path/to/config_module.yml +``` + +And in this case, `config_module.yml` contains the entire configuration for the build: + +``` +format_version: 13 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: android +app: + envs: + - MY_NAME: My Name +workflows: + test: + steps: + - script: + inputs: + - content: echo "Hello ${MY_NAME}!" +``` + +A configuration module can contain any configuration entity defined on the root level. For example, a configuration module defining only a single Workflow or just app-level Environment Variables is perfectly valid. + +The `bitrise.yml` file: + +``` +format_version: 13 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +include: + - path: path/to/config_module.yml +``` + +The `config_module.yml` file: + +``` +app: + envs: + - USER_NAME: UserName +workflows: + test: + steps: + - script: + inputs: + - content: echo "Hello ${USERNAME}!" +``` + +However, non-root level entities cannot stand alone in a separate module file either: you can't, for example, include Step inputs like this. + +### Nesting included modules + +You can use the `include` property in included configuration files: + +Root level `bitrise.yml` file: + +``` +format_version: 13 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +include: + - path: path/to/config_module.yml +``` + +The `config_module.yml` file: + +``` +include: + - path: path/to/another_module.yml +``` + +The `another_module.yml` file: + +``` +workflows: + ui_test: + steps: + - pull-intermediate-files@1: + inputs: + - artifact_sources: build_tests.build_for_ui_testing +``` + +With this configuration, you'll be able to run the `ui_test` Workflow. + +Nesting has the following limitations: + +- A depth of 5, including the root level file. +- Maximum 35 configuration files in total, including the root level file. + +### Merge rules for included modules + +When Bitrise runs a build, we merge your configuration modules into a single `bitrise.yml` file: + +- Included modules are read and merged into the configuration in the order defined in the root `bitrise.yml` file. +- If an included module also uses include, the nested module is merged first recursively. +- After all configuration files added with include are merged together, the resulting configuration is merged with the `bitrise.yml` file on the root level. As such, you can override configuration values on the root level. + +:::note[Switching back to bitrise.io] + +If you have a modular configuration with multiple YAML files and you [switch back to storing your configuration on bitrise.io](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/moving-the-bitriseyml-file-back-to-bitriseio), we use the same merge rules to merge all your files into a single `bitrise.yml` file. + +::: + +When merging the configurations, it is possible to encounter overlaps and override included configuration values. When merging YAML modules, the most recently read file takes priority over the existing merged configuration. Here are the rules: + +- Items of simple types (such as integers and booleans): The value from the most recently read file is used. +- Items of object type (for example, Pipelines, Stages, Workflows): + + - If a property is only present in the existing merged configuration, that value is retained. + - If a property is present in both, and their values are hash maps, the values are merged. + - In any other case, the value from the most recently read file is used. +- Items of array type (for example, lists of Environment Variables or [trigger map items](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.html)): if the collection is present in both the most recently read file and the existing merged configuration, the merged value is an ordered array of values, with all values from the merged configuration followed by the values from the most recently read file. + +You can see the merged configuration file in the Workflow Editor: select **bitrise.yml** from the left navigation menu to view it. + +**Merging rules** + +We have the root `bitrise.yml` file which includes a `config_module.yml` file. + +The `bitrise.yml`: + +``` +format_version: 13 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: android + +include: + - path: path/to/config_module.yml + +app: + envs: + - USER_ID: UserId + - PASSWORD: SecurePassphrase +``` + +The `config_module.yml`: + +``` +format_version: 10 + +app: + envs: + - USERNAME: UserName + +workflows: + test: + steps: + - script: + inputs: + - content: echo "Hello ${USERNAME}!" +``` + +During the merge, the `config_module.yml` and is merged into the configuration. Then the root level `bitrise.yml` is read and then merged. The final configuration looks like this: + +``` +format_version: 13 +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: android + +app: + envs: + - USER_ID: UserId + - PASSWORD: SecurePassphrase + - USERNAME: UserName + +workflows: + test: + steps: + - script: + inputs: + - content: echo "Hello ${USERNAME}!" +``` + +- The root level `format_version` property is present in both files. The root level `bitrise.yml` file is merged into the overall configuration last, therefore its value of `format_version` is used. +- The `apps` property is present in both files so all key-value pairs are added to the overall configuration. +- The `test` Workflow is only present in `config_module.yml` so it's added to the overall configuration and `bitrise.yml` does not override it. diff --git a/src/partials/defining-pipelines-steps-and-workflows.mdx b/src/partials/defining-pipelines-steps-and-workflows.mdx new file mode 100644 index 0000000..dd182b5 --- /dev/null +++ b/src/partials/defining-pipelines-steps-and-workflows.mdx @@ -0,0 +1,46 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Defining Pipelines with stages + +The `bitrise.yml` file contains the full configuration of your Pipelines. As with all `bitrise.yml` files, first you need to define the format version and the project type. + +``` +--- +format_version: '8' +default_step_lib_source: +project_type: android +``` + +This is a bare minimum `bitrise.yml` configuration. To define your Pipelines, you will need to use the `pipelines` attribute. + +``` +pipelines:   + pipeline-successful: +    stages: +    - stage-successful-1: {} +    - stage-successful-2: {} +    - stage-successful-3: {} +``` + +In this example, we have a Pipeline called `pipeline-successful`, with three Stages that will run consecutively. This means that if `stage-successful-1` finishes successfully, `stage-successful-2` starts. If any of the Stages fail, the subsequent Stage will not start: instead, the Pipeline will be aborted and marked as failed. + +Each Stage has to be defined separately under the `stages` attribute. Defining a Stage means specifying the Workflows that are part of the Stage. + +``` +stages: +  stage-successful-1: +    workflows: +    - test-1: {} +  stage-successful-2: +    workflows: +    - build-1: {} +    - build-2: {} +  stage-successful-3: +    workflows: +    - deploy-1: {} +    - deploy-2: {} +``` + +In this example, the Stages run the `test-1`, `build-1`, `build-2`, `deploy-1`, and `deploy-2` Workflows. diff --git a/src/partials/deleting-a-build-artifact.mdx b/src/partials/deleting-a-build-artifact.mdx new file mode 100644 index 0000000..9ed5535 --- /dev/null +++ b/src/partials/deleting-a-build-artifact.mdx @@ -0,0 +1,45 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deleting a build artifact + +:::note[Required role] + +You must have a developer, admin, or owner role on the app's team to delete a build artifact using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +You can delete an app’s specific build artifact. + +The required parameters are: + +- app slug +- build slug +- artifact slug + +**Deleting an APK file** + +Request: + +``` +curl -X DELETE "https://api.bitrise.io/v0.1/apps/87a5991e180d91a9/builds/b234f959745082e0/artifacts/54ae701761c4f956" -H "accept: application/json" -H "Authorization: THE-ACCESS-TOKEN" +``` + +Response: + +``` +{ + "data": { + "title": "app-debug.apk", + "artifact_type": "android-apk", + "expiring_download_url": null, + "is_public_page_enabled": true, + "slug": "54ae701761c4f956", + "public_install_page_url": "", + "file_size_bytes": 1574793 + } +} +``` diff --git a/src/partials/deleting-a-build-log.mdx b/src/partials/deleting-a-build-log.mdx new file mode 100644 index 0000000..14a30ad --- /dev/null +++ b/src/partials/deleting-a-build-log.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deleting a build log + +If necessary, you can delete the logs of any build on Bitrise. It can be handy if, for example, you do not want new team members to see potentially sensitive information that is displayed in previous logs. + +Not all team members are authorized to delete logs: only those with either **Admin** or **Owner** role in the team can do it. + +:::warning[Deletion is final] + +Be aware that you cannot undo deleting a log. Once you delete it, there is no way to recover the log file. + +::: + +1. Open the [Bitrise CI](http://app.bitrise.io/dashboard) page and select your project from the project list. +1. Select the build you want to check out. +1. Open the **Logs** dropdown menu and click the **Delete Logs** button. + + ![Logs_delete.png](/img/_paligo/uuid-b744552e-6efc-a532-0dd6-142bc77a1fcb.png) +1. In the pop-up window, click **Delete logs**. diff --git a/src/partials/deleting-a-builds-bitriseyml-file.mdx b/src/partials/deleting-a-builds-bitriseyml-file.mdx new file mode 100644 index 0000000..e14be2c --- /dev/null +++ b/src/partials/deleting-a-builds-bitriseyml-file.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deleting a build's configuration YAML + +If you wish, you can simply delete a build’s `bitrise.yml` file. But please note that this action cannot be undone: nobody will be able to view that particular build’s `bitrise.yml` file once you delete it. + +1. Open Bitrise CI, select a project and then select one of the builds of the project. +1. Select **Configuration YAML** on the top right. + + ![show-config-yaml.png](/img/_paligo/uuid-b4d1eb0b-3222-87c7-f672-82695ed71e87.png) +1. In the dropdown menu, select **Delete configuration YAML**. +1. In the confirmation dialog, click **Delete configuration YAML**. diff --git a/src/partials/deleting-a-file-from-the-generic-file-storage.mdx b/src/partials/deleting-a-file-from-the-generic-file-storage.mdx new file mode 100644 index 0000000..084d1ab --- /dev/null +++ b/src/partials/deleting-a-file-from-the-generic-file-storage.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deleting a file from the Generic File Storage + +You can delete your uploaded file from the Generic File Storage using the `DELETE` method. + +:::note[Required role] + +You must have an admin or owner role role on the app's team to manage files in the Generic File Storage using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +The required parameters are: + +- App slug +- Generic project file slug + +``` +curl -X DELETE -H "Authorization:" "https://api.bitrise.io/v0.1/apps//generic-project-files/" +``` diff --git a/src/partials/deleting-a-scheduled-build.mdx b/src/partials/deleting-a-scheduled-build.mdx new file mode 100644 index 0000000..1143a15 --- /dev/null +++ b/src/partials/deleting-a-scheduled-build.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deleting a scheduled build + +To permanently delete a regularly scheduled build: + +1. Go to the **Builds** page of your app. +1. Find the **Scheduled builds** section and open it to view your scheduled builds. + + ![scheduled-build.png](/img/_paligo/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png) +1. Click the vertical ellipsis to open the context menu. +1. Select **Delete** and then click **Delete** again when prompted for confirmation. + + ![edit-config.png](/img/_paligo/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png) diff --git a/src/partials/deleting-an-app-using-the-api.mdx b/src/partials/deleting-an-app-using-the-api.mdx new file mode 100644 index 0000000..dace893 --- /dev/null +++ b/src/partials/deleting-an-app-using-the-api.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deleting an app using the API + +:::warning[Deletion is final] + +Be aware that you cannot undo deleting an app. Once you delete it, there is no way to recover the app. + +::: + +You can delete apps with the Bitrise API. The only required parameter is the app slug of the app you want to delete: + +``` +curl -X DELETE -H 'Authorization: ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/THE-APP-SLUG' +``` diff --git a/src/partials/deploy-to-app-store-connect.mdx b/src/partials/deploy-to-app-store-connect.mdx new file mode 100644 index 0000000..d1c833b --- /dev/null +++ b/src/partials/deploy-to-app-store-connect.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploy to App Store Connect Steps + +To deploy the app to App Store Connect, we have two Steps: + +- **Deploy to App Store Connect** +- **Deploy to App Store Connect - Application Loader** + +**Deploy to App Store Connect - Application Loader** is simple: it simply pushes an .ipa or .pkg binary file to App Store Connect. With this Step, you cannot submit the app for review on the App Store, for example. + +With the **Deploy to App Store Connect** Step, you can: + +- Submit your app to the App Store for review. +- You can upload apps of three different platforms (iOS, OS X, AppleTVOS). +- Tell Bitrise whether you want to upload your screenshots and the app’s metadata along with the binary. diff --git a/src/partials/deploying-a-flutter-app.mdx b/src/partials/deploying-a-flutter-app.mdx new file mode 100644 index 0000000..3fc267f --- /dev/null +++ b/src/partials/deploying-a-flutter-app.mdx @@ -0,0 +1,143 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying a Flutter app + +To build and deploy a Flutter app, a Workflow must contain these Flutter Steps: + +- **Flutter Install** +- **Flutter Build** + +If you have platforms specified in your repository, a deployment Workflow will be automatically generated when adding the project on Bitrise. The content of this Workflow depends on the platforms: for example, if your Flutter project contains only an iOS project, the Workflow will contain the **Certificate and profile installer** Step. + +You can build both iOS and Android projects at the same time or you can build them separately, each using their own Workflow. You can set this in the **Platform** input of the **Flutter Build** Step any time. By default, the Step is configured according to the platform or platforms that the scanner detected when adding the app on Bitrise. + +Here’s an example Workflow we’ll use in this configuration, with all the necessary Steps: + +![Getting_started_with_Flutter_apps.jpg](/img/_paligo/uuid-f655a8a5-c151-d103-6de5-55a0b3355322.jpg) + +:::tip[Pipelines for parallelization] + +In these examples, we're assuming that you are building and deploying both the iOS and Android versions of your app in the same Workflow, performing the necessary operations serially. However, you can do both versions in parallel with a single build trigger by using Pipelines: + +- [Build Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines) +- [Configuring a Bitrise Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline) + +::: + +:::note[Packages and libraries] + +We also support building Flutter packages and libraries. Unlike in the case of apps, there is no artifact to build so there is no need for a **Flutter Build** Step in your Workflow. + +::: + +### Deploying a cross-platform app to bitrise.io + +The **Deploy to bitrise.io** Step uploads all the artifacts related to your build into the [**Artifacts**]() tab on your Build’s page. + +You can share the generated binary file (APK for Android or an IPA file for iOS) with your team members using the public install page. The public install page is a URL you can share with others who can install the generated app binary on their device. You can also notify user groups or individual users that your APK or IPA file has been built. + +:::important[Publishing to expo.io] + +The **Deploy to Bitrise.io** Step does not use Expo commands and doesn’t publish to [expo.io](https://docs.expo.io/workflow/publishing/). This Step publishes artifacts to Bitrise and is not specific to a particular platform. + +If you need to publish to [expo.io](https://docs.expo.io/workflow/publishing/), set the **Run expo publish after eject?** input of the **Eject Expo** Step to `yes`. Be aware that in that case you have to provide your username and password for your Expo account to publish to [expo.io.](http://expo.io/) + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Make sure you have the **Deploy to bitrise.io** Step in your Workflow. +1. In the **Notify: User Roles**, add the role so that only those get notified who have been granted with this role. Or fill out the **Notify: Emails** field with email addresses of the users you want to notify. + + Make sure you set those email addresses as [Secrets](/en/bitrise-ci/configure-builds/secrets.html)! These details can be also modified under **Notifications** if you click the **eye** icon next to your generated binary in the **Artifacts** tab. +1. If you want the Step to generate a public install page for you, set the **Enable public page for the App?** input to `true`. + +### Deploying a Flutter app to App Store Connect + +To deploy your iOS Flutter project to the App Store, you’ll need to build the app, export an IPA file and submit it to the App Store. + +Unlike testing, this requires code signing files: + +- An iOS Distribution Certificate (a .p12 file). +- An App Store Provisioning Profile. + +For Flutter applications, code signing requires setting a Team ID in the project settings in Xcode. + +#### Configuring Team ID for Flutter apps + +Once you created your iOS project locally, you will need to review the project settings for it in Xcode. More specifically, you need to set a valid Team ID: without that, your build will fail on Bitrise. + +1. In Xcode, open **Runner.xcworkspace** in your app’s **ios** folder. +1. To view your app’s settings, select the **Runner** project in the Xcode project navigator. Then, in the main view sidebar, select the **Runner** target. +1. Select the **General** tab. +1. In the **Signing** section, find the **Team** menu and set it to the team associated with your registered Apple Developer account. +1. Commit the change to your repository! + + :::important[Don't forget to commit your changes!] + + If you only set the Team ID locally, your build will still FAIL on Bitrise! + + ::: + +#### Configuring Flutter deployment to the App Store on Bitrise + +To deploy your app to the App Store, you need to upload the code signing files. You have two options: + +- Upload the code signing certificate(s) to Bitrise and use automatic code signing with the [Manage iOS Code signing](https://bitrise.io/integrations/steps/manage-ios-code-signing) Step. +- Upload the provisioning profile(s) and the code signing certificate(s) to Bitrise and use manual code signing with the [Certificate and profile installer](https://bitrise.io/integrations/steps/certificate-and-profile-installer) Step. + +In this guide, we will focus on the second option, manual code signing: + +1. Make sure you have the **Certificate and profile installer** Step in your Workflow. +1. Upload the required code signing files to [Bitrise](https://app.bitrise.io/users/sign_in). +1. Open the **Flutter Build** Step and find the **iOS Platform Configs** input group. +1. Make sure the **Additional parameters** input has the value `--release`. +1. Check the **Platform** input of the Step: make sure it’s set to either `iOS` or `both`. +1. Set the **iOS output artifact type** input to **archive**. + + ![flutter-build-ios-config.png](/img/_paligo/uuid-821c4edf-e9a6-a85e-a6e5-8cce61ab5f42.png) +1. Add the **Export iOS and tvOS Xcode archive** Step to your Workflow. + + It should be after the **Flutter Build** Step. +1. Set the **Distribution method** input of the Step to **app-store**. +1. Add the **Deploy to App Store Connect** Step to the end of the Workflow. +1. Provide your Apple credentials in the respective input fields. + + - Apple ID. + - password or, if you use two-factor authentication on App Store Connect, your application password. + + Don’t worry, the password will not be visible in the logs or exposed . +1. Start a build! + +If all goes well, the Step will submit the app to App Store Connect. You can, from the App Store Connect page, distribute the app to external testers via Testflight, or release it to the App Store itself. + +### Deploying a Flutter app to Google Play + +To deploy your app to Google Play, you need to export an App Bundle file and sign it. You have two options: + +- You can [configure code signing](https://flutter.dev/docs/deployment/android#configure-signing-in-gradle) in the app’s `build.gradle` file and then Flutter will sign your app during the build phase. +- Sign your AAB or APK file on Bitrise with our dedicated Step. + +The scope of this guide is the second option: signing your AAB/APK file with the **Android Sign** Step. + +1. [Generate a keystore file](https://flutter.io/docs/deployment/android#create-a-keystore). + + The keystore file is required for code signing. +1. Open an app on Bitrise and go to **Workflow** > **Code signing** > **Android Code Signing**. +1. Drag and drop the keystore file, and fill out the metadata. +1. [Configure Google Play access.](/en/bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles/deploying-your-android-app-bundle-to-google-play/setting-up-google-play-deployment-for-the-first-time) + + You only need to do this for your very first Google Play deployment of the app. +1. In the **Flutter Build** Step, find the **Android Platform Configs** input group and make sure the **Additional parameters** input has the value `--release`. +1. In the **Android output artifact type** input field, select either **APK** or **appbundle** depending on your deployment requirements. +1. In the **Output (.apk, .aab) pattern** input, set the path where the **Deploy to Google Play** Step will be able to access the generated binary. + + The path should be relative to the project source directory, stored in the BITRISE_SOURCE_DIR Environment Variable. +1. Make sure you have the **Deploy to Google Play** Step after the **Android Sign****Cordova Archive** or **Ionic Archive** Step in your Workflow. +1. Fill out the required input fields as follows: + + - **Service Account JSON key file path**: This field can accept a remote URL so you have to provide the Env Var which contains your uploaded service account JSON key. For example: `$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL`. + - **Package name**: The package name of your Android app. + - **Track**: The track where you want to deploy your APK (for example, alpha/beta/rollout/production or any custom track you set). diff --git a/src/partials/deploying-a-react-native-app.mdx b/src/partials/deploying-a-react-native-app.mdx new file mode 100644 index 0000000..dfc6521 --- /dev/null +++ b/src/partials/deploying-a-react-native-app.mdx @@ -0,0 +1,98 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying a React Native app + +You can deploy your React Native app to: + +- bitrise.io: This allows you download the generated binary, and to share it with others via the public install page. +- Online stores: we have integrations for multiple different online stores. In these guides, we'll show you how to publish to Google Play and to Apple's App Store. + +:::note[CodePush] + +You can deploy updates to your users' devices with Bitrise CodePush. CodePush is part of [Release Management](urn:resource:publication:90740) and it is supported for React Native and Expo apps. + +For more information about CodePush, check out the official guides: [CodePush](/en/release-management/codepush). + +::: + +### Deploying a cross-platform app to bitrise.io + +The **Deploy to bitrise.io** Step uploads all the artifacts related to your build into the [**Artifacts**]() tab on your Build’s page. + +You can share the generated binary file (APK for Android or an IPA file for iOS) with your team members using the public install page. The public install page is a URL you can share with others who can install the generated app binary on their device. You can also notify user groups or individual users that your APK or IPA file has been built. + +:::important[Publishing to expo.io] + +The **Deploy to Bitrise.io** Step does not use Expo commands and doesn’t publish to [expo.io](https://docs.expo.io/workflow/publishing/). This Step publishes artifacts to Bitrise and is not specific to a particular platform. + +If you need to publish to [expo.io](https://docs.expo.io/workflow/publishing/), set the **Run expo publish after eject?** input of the **Eject Expo** Step to `yes`. Be aware that in that case you have to provide your username and password for your Expo account to publish to [expo.io.](http://expo.io/) + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Make sure you have the **Deploy to bitrise.io** Step in your Workflow. +1. In the **Notify: User Roles**, add the role so that only those get notified who have been granted with this role. Or fill out the **Notify: Emails** field with email addresses of the users you want to notify. + + Make sure you set those email addresses as [Secrets](/en/bitrise-ci/configure-builds/secrets.html)! These details can be also modified under **Notifications** if you click the **eye** icon next to your generated binary in the **Artifacts** tab. +1. If you want the Step to generate a public install page for you, set the **Enable public page for the App?** input to `true`. + +### Deploying the app to App Store Connect + +Keep in mind that every time you want to push an app to App Store Connect, it must have a unique build and version number: [increment either or both](/en/bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning.html) before deploying. + +1. Make sure you have a working [connection to your Apple Developer account](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Generate an IPA file on your own machine at least once. +1. [Upload all necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) to Bitrise. + + To deploy an app to App Store Connect, you need a Distribution type certificate and an App Store type provisioning profile. +1. Make sure the **Xcode Archive & Export for iOS** Step is in your Workflow. +1. Set the **Automatic code signing** input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t use automatic code signing, or if you exclusively use Step inputs for Apple service authentication. + - `api-key` if you use [API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` if you use [Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Set the **Distribution method** input of the Step to `app-store`. + + The Step will store the path of the exported .ipa file in the $BITRISE_IPA_PATH Environment Variable. +1. Add the **Deploy to App Store Connect** Step to your Workflow. +1. Fill the required inputs. + + - Either the app’s Apple ID or its Bundle ID is a required input. One of the two must be provided. + - If you set the **Submit for Review** to `yes`, the Step will wait for your submission to be processed on App Store Connect and then submit the given version of the app for review. + - The default value of the **Skip App Version Update** input is `No`. Change it only if you incremented the app version number in another way. + - If you use an App Store Connect account that is linked to multiple teams, provide either a Team ID or a Team name! +1. Start a build. + +If all goes well, your app will be submitted to App Store and you can distribute it via Testflight or via the App Store! + +### Deploying your Android project to Google Play + +You can use the **Deploy to Google Play** Step in your Workflow to upload your digitally signed AAB/APK to the Google Play Store. + +1. Add the **Cordova archive** or the **Ionic archive** Step to your Workflow. + + Note that if you’re building for both iOS and Android in one project, and either of your apps fails, the whole **Cordova archive/Ionic archive** Step will fail. +1. Fill in the required inputs. + + - The **Platform** input needs to be set to **device**. + - The **Build command configuration** input must match the **Build configuration** input of the **Generate cordova build configuration** Step. + + The archive Step must come after the **Generate cordova build configuration** Step in the Workflow. +1. [Configure code signing](/en/bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects/code-signing-for-react-native-apps/signing-your-android-project) for your app. +1. [Configure Google Play access.](/en/bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles/deploying-your-android-app-bundle-to-google-play/setting-up-google-play-deployment-for-the-first-time) + + You only need to do this for your very first Google Play deployment of the app. +1. In the **Flutter Build** Step, find the **Android Platform Configs** input group and make sure the **Additional parameters** input has the value `--release`. +1. In the **Android output artifact type** input field, select either **APK** or **appbundle** depending on your deployment requirements. +1. In the **Output (.apk, .aab) pattern** input, set the path where the **Deploy to Google Play** Step will be able to access the generated binary. + + The path should be relative to the project source directory, stored in the BITRISE_SOURCE_DIR Environment Variable. +1. Make sure you have the **Deploy to Google Play** Step after the **Android Sign****Cordova Archive** or **Ionic Archive** Step in your Workflow. +1. Fill out the required input fields as follows: + + - **Service Account JSON key file path**: This field can accept a remote URL so you have to provide the Env Var which contains your uploaded service account JSON key. For example: `$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL`. + - **Package name**: The package name of your Android app. + - **Track**: The track where you want to deploy your APK (for example, alpha/beta/rollout/production or any custom track you set). diff --git a/src/partials/deploying-an-android-app-to-bitriseio.mdx b/src/partials/deploying-an-android-app-to-bitriseio.mdx new file mode 100644 index 0000000..b785e5b --- /dev/null +++ b/src/partials/deploying-an-android-app-to-bitriseio.mdx @@ -0,0 +1,86 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying an Android app to bitrise.io + +In this section, we'll go through how to deploy your Android project to [bitrise.io](https://www.bitrise.io/). + +Deploying to [bitrise.io](https://www.bitrise.io) means that the build artifacts generated during the build will be available for download once the build is finished. You can use this to test your Android app on your own test devices, for example. + +To deploy your app to [bitrise.io](https://www.bitrise.io/): + + + + +1. Make sure your Workflow contains the **[Android Build](https://www.bitrise.io/integrations/steps/android-build)** Step to build your app. + + Optionally, you can build your app with the **[Gradle Runner](https://www.bitrise.io/integrations/steps/gradle-runner)** Step. This requires a bit more configuration from you but allows for more extensive customization. +1. Add the **[Deploy to Bitrise.io](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step to your Workflow. + + :::tip[Notifying other users] + + You can use the **Notify: User Roles** and the **Notify: Emails** inputs of the Step to set up notifications about your deploy. Click the input names to reveal more information about how to configure them. + + ::: +1. Optionally, set the **Enable public page for the App?** input of the Step to **true** so the Step [enables the public install page](/en/bitrise-ci/deploying/bitrise-ota-app-deployment/deploying-with-the-deploy-to-bitriseio-step) for your app. +1. Run a build. + + + + +1. Open the `bitrise.yml` file of your app. +1. Make sure your Workflow contains the `android-build` Step to build your app. + + ``` + workflows: + example-workflow: + steps: + - android-build@1: + ``` + + Optionally, you can build your app with the `gradle-runner` Step. This requires a bit more configuration from you but allows for more extensive customization. +1. Set the `module` and/or `variant` input to tell the Step what to build. + + In this example, we're building a debug variant of the Android project. + + ``` + workflows: + example-workflow: + steps: + - android-build@1: + inputs: + - variant: debug + - deploy-to-bitrise-io: {} + ``` +1. Add the `deploy-to-bitrise-io` Step to your Workflow. + + ``` + workflows: + example-workflow: + steps: + - android-build@1: + inputs: + - variant: debug + - deploy-to-bitrise-io: {} + ``` + + :::tip[Notifying other users] + + You can use the `notify_user_groups` and the `notify_email_list` inputs of the Step to set up notifications about your deploy: + + - The `notify_user_groups` input allows you to send notifications based on the [access roles](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) granted to users. For example, you can set the input to notify everyone with an **Admin** and a **Developer** role. Set multiple roles separated by a comma: `- notify_user_groups: admins, testers`. + - The `notify_email_list` input only accepts Secrets, and the Secret should contain comma-separated lists of email addresses. + + ::: +1. Optionally, set the **Enable public page for the App?** input of the Step to **true** so the Step [enables the public install page](/en/bitrise-ci/deploying/bitrise-ota-app-deployment/deploying-with-the-deploy-to-bitriseio-step) for your app. +1. Run a build. + + + + +The **Deploy to Bitrise.io** Step will deploy the app. You can share the generated binary with your team members using the build’s URL. + +**A bitrise.yml for deploying an Android app to Bitrise** + +In this example, we're building the `debug` variant of an Android app, and deploy it to bitrise.io, as. diff --git a/src/partials/deploying-files-into-artifacts.mdx b/src/partials/deploying-files-into-artifacts.mdx new file mode 100644 index 0000000..7f33691 --- /dev/null +++ b/src/partials/deploying-files-into-artifacts.mdx @@ -0,0 +1,29 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying files into artifacts + +Artifacts are deployed into the **Artifacts** section in your build’s page with the help of the **Deploy to Bitrise.io** Step. It deploys all the files which have been generated during the build and stores them in the `$BITRISE_DEPLOY_DIR` directory. + +To deploy the artifacts, insert the **Deploy to Bitrise.io** Step AFTER the Step(s) that generate the artifacts or even better if the **Deploy to Bitrise.io** Step is at the very end of your Workflow. + +:::important[Put the Step in the right place] + +Add the **Deploy to Bitrise.io** Step in the right place. If you insert the Step before other Steps that generate files during the build, then **Deploy to Bitrise.io** will have nothing to deploy. + +::: + +Note that the content of any sub-directories found in the deploy directory will not be displayed in the **Artifacts** section of your build. You can, however, compress your artifacts into a zip file if you modify the default `false` value to `true` in the **Compress the artifacts into one file** field in the **Deploy to Bitrise.io** Step. This will compress the whole directory along with its sub-directories and deploy to **Artifacts**. + +### Modifying the target directory path + +You can modify the target directory path to another one but make sure you reference the same directory paths in other Steps of your Workflow to ensure that the generated files get collected to the same directory. + +### Viewing artifacts if your build has failed + +With the **Run if previous Step failed** toggle enabled, you can access your build artifacts - only those that have been successfully generated - even if your build has failed. For example, you can detect bugs in your failed build by looking into the generated test report files. + +### Who can access build artifacts? + +The artifacts at **Artifacts** are accessible for everyone who is the owner, admin, developer, tester/QA of the app. Besides these roles, if you keep the default config of the **Enable public page for the App** feature, then anyone who receives the URL, will be able to access your app and its artifacts. diff --git a/src/partials/deploying-ioniccordova-apps.mdx b/src/partials/deploying-ioniccordova-apps.mdx new file mode 100644 index 0000000..2995f25 --- /dev/null +++ b/src/partials/deploying-ioniccordova-apps.mdx @@ -0,0 +1,86 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying Ionic/Cordova apps + +To build and deploy an Ionic or Cordova app on Bitrise, you need to digitally sign both the Android and iOS project (if you're building both) and then use the Cordova Archive or the Ionic Archive Step to build the app before deploying it. + +You can deploy the successfully built app to: + +- Online stores, such as the Google Play Store or Apple's App Store. +- Bitrise.io: the generated binaries will be available on the **Artifacts** tab of the build's page. You can download them from there or share them with others via the public install page. + +### Deploying a cross-platform app to bitrise.io + +The **Deploy to bitrise.io** Step uploads all the artifacts related to your build into the [**Artifacts**]() tab on your Build’s page. + +You can share the generated binary file (APK for Android or an IPA file for iOS) with your team members using the public install page. The public install page is a URL you can share with others who can install the generated app binary on their device. You can also notify user groups or individual users that your APK or IPA file has been built. + +:::important[Publishing to expo.io] + +The **Deploy to Bitrise.io** Step does not use Expo commands and doesn’t publish to [expo.io](https://docs.expo.io/workflow/publishing/). This Step publishes artifacts to Bitrise and is not specific to a particular platform. + +If you need to publish to [expo.io](https://docs.expo.io/workflow/publishing/), set the **Run expo publish after eject?** input of the **Eject Expo** Step to `yes`. Be aware that in that case you have to provide your username and password for your Expo account to publish to [expo.io.](http://expo.io/) + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Make sure you have the **Deploy to bitrise.io** Step in your Workflow. +1. In the **Notify: User Roles**, add the role so that only those get notified who have been granted with this role. Or fill out the **Notify: Emails** field with email addresses of the users you want to notify. + + Make sure you set those email addresses as [Secrets](/en/bitrise-ci/configure-builds/secrets.html)! These details can be also modified under **Notifications** if you click the **eye** icon next to your generated binary in the **Artifacts** tab. +1. If you want the Step to generate a public install page for you, set the **Enable public page for the App?** input to `true`. + +### Deploying your Android project to Google Play + +You can use the **Deploy to Google Play** Step in your Workflow to upload your digitally signed AAB/APK to the Google Play Store. + +1. Add the **Cordova archive** or the **Ionic archive** Step to your Workflow. + + Note that if you’re building for both iOS and Android in one project, and either of your apps fails, the whole **Cordova archive/Ionic archive** Step will fail. +1. Fill in the required inputs. + + - The **Platform** input needs to be set to **device**. + - The **Build command configuration** input must match the **Build configuration** input of the **Generate cordova build configuration** Step. + + The archive Step must come after the **Generate cordova build configuration** Step in the Workflow. +1. [Configure code signing](/en/bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects/code-signing-for-react-native-apps/signing-your-android-project) for your app. +1. [Configure Google Play access.](/en/bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles/deploying-your-android-app-bundle-to-google-play/setting-up-google-play-deployment-for-the-first-time) + + You only need to do this for your very first Google Play deployment of the app. +1. In the **Flutter Build** Step, find the **Android Platform Configs** input group and make sure the **Additional parameters** input has the value `--release`. +1. In the **Android output artifact type** input field, select either **APK** or **appbundle** depending on your deployment requirements. +1. In the **Output (.apk, .aab) pattern** input, set the path where the **Deploy to Google Play** Step will be able to access the generated binary. + + The path should be relative to the project source directory, stored in the BITRISE_SOURCE_DIR Environment Variable. +1. Make sure you have the **Deploy to Google Play** Step after the **Android Sign****Cordova Archive** or **Ionic Archive** Step in your Workflow. +1. Fill out the required input fields as follows: + + - **Service Account JSON key file path**: This field can accept a remote URL so you have to provide the Env Var which contains your uploaded service account JSON key. For example: `$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL`. + - **Package name**: The package name of your Android app. + - **Track**: The track where you want to deploy your APK (for example, alpha/beta/rollout/production or any custom track you set). + +### Deploying your iOS project to the App Store + +1. Add the **Cordova archive** or the **Ionic archive** Step to your Workflow. + + Note that if you’re building for both iOS and Android in one project, and either of your apps fails, the whole **Cordova archive/Ionic archive** Step will fail. +1. Fill in the required inputs. + + - The **Platform** input needs to be set to **device**. + - The **Build command configuration** input must match the **Build configuration** input of the **Generate cordova build configuration** Step. + + The archive Step must come after the **Generate cordova build configuration** Step in the Workflow. +1. [Configure iOS code signing](/en/bitrise-ci/code-signing/ios-code-signing.html) for your iOS project. +1. Add the **Deploy to App Store Connect - Application Loader (formerly iTunes Connect)** Step to your Workflow, after the **Xcode Archive & Export for iOS** Step but preferably before the **Deploy to Bitrise.io** Step. +1. Provide your Apple credentials in the **Deploy to App Store Connect - Application Loader (formerly iTunes Connect)** Step. + + The Step will need your: + + - Apple ID. + - Password or, if you use two-factor authentication on App Store Connect, your application password. + + Don’t worry, the password will not be visible in the logs or exposed. +1. [Start a build.](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html) diff --git a/src/partials/deploying-on-app-center-and-bitrise.mdx b/src/partials/deploying-on-app-center-and-bitrise.mdx new file mode 100644 index 0000000..781db66 --- /dev/null +++ b/src/partials/deploying-on-app-center-and-bitrise.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## App Center Distribute and Bitrise Release Management + +The App Center Distribute service allows you to manage app distribution across multiple platforms in one place. Bitrise [Release Management](urn:resource:publication:90740) offers exactly that: a one-stop shop for your release requirements. You can: + +- Automate all your releases. +- Release your apps across multiple platforms at the same time. +- Have full granular control over the entire release process without leaving Release Management. + +To get started, you just need to [connect an app](/en/release-management/getting-started-with-release-management/connecting-an-app.html). Once you successfully connected an app, you don't have to go through any of the online stores to manage your releases. + +We also offer [a fully featured REST API](/en/release-management/release-management-api.html) to make the most of Release Management. diff --git a/src/partials/deploying-test-results.mdx b/src/partials/deploying-test-results.mdx new file mode 100644 index 0000000..b6ca27c --- /dev/null +++ b/src/partials/deploying-test-results.mdx @@ -0,0 +1,44 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying test results + +Deploy your test results on the build page with minimal configuration. The requirements depend on your setup: + +- Using the official Bitrise testing Steps to run tests +- Using other Steps to run tests + +### Deploying results from the official Bitrise testing Steps + +The supported testing Steps are the following: + +- **Android Unit Test**: [Android unit tests](/en/bitrise-ci/testing/testing-android-apps/android-unit-tests). +- **Android Instrumented Test**: [Running instrumented tests for Android apps](/en/bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps). +- **Xcode Test for iOS**: [Running unit and UI tests for iOS apps](/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps). +- **iOS Device Testing**: [Device testing for iOS](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios). +- **Virtual Device Testing for Android**: [Device testing for Android](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android). +- **Flutter Test**: [Testing Flutter apps](/en/bitrise-ci/testing/testing-flutter-apps). + +If you use any of these Steps, make sure you have the **Deploy to Bitrise.io** Step in your Workflow. Bitrise will automatically deploy your test results to the build page. + +:::important[Attachments and flaky tests] + +If your tests generate attachments or you want Bitrise to show flaky tests, the **Deploy to Bitrise.io** Step must be of version 2.19.1 or newer. + +::: + +### Deploying results from other Steps + +If you run your tests using other Steps (for example, you can use [Script](https://bitrise.io/integrations/steps/script) Steps for a fully custom testing solution), you need some additional configuration. + +1. Add the Step running your tests to your Workflow. +1. Add the **Export test results to the Test Reports** Step to your Workflow. +1. Configure the Step: [Using the Export test results to the Test Reports Step](/en/bitrise-ci/testing/deploying-and-viewing-test-results/using-the-export-test-results-to-the-test-reports-step). +1. Make sure you have the **Deploy to Bitrise.io** Step in your Workflow. + + :::important[Attachments and flaky tests] + + If your tests generate attachments or you want Bitrise to show flaky tests, the **Deploy to Bitrise.io** Step must be of version 2.19.1 or newer. + + ::: diff --git a/src/partials/deploying-the-app-to-app-store-connect.mdx b/src/partials/deploying-the-app-to-app-store-connect.mdx new file mode 100644 index 0000000..26555f0 --- /dev/null +++ b/src/partials/deploying-the-app-to-app-store-connect.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying the app to App Store Connect + +Keep in mind that every time you want to push an app to App Store Connect, it must have a unique build and version number: [increment either or both](/en/bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning.html) before deploying. + +1. Make sure you have a working [connection to your Apple Developer account](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Generate an IPA file on your own machine at least once. +1. [Upload all necessary code signing files](/en/bitrise-ci/code-signing/ios-code-signing.html) to Bitrise. + + To deploy an app to App Store Connect, you need a Distribution type certificate and an App Store type provisioning profile. +1. Make sure the **Xcode Archive & Export for iOS** Step is in your Workflow. +1. Set the **Automatic code signing** input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t use automatic code signing, or if you exclusively use Step inputs for Apple service authentication. + - `api-key` if you use [API key authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + - `apple-id` if you use [Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). +1. Set the **Distribution method** input of the Step to `app-store`. + + The Step will store the path of the exported .ipa file in the $BITRISE_IPA_PATH Environment Variable. +1. Add the **Deploy to App Store Connect** Step to your Workflow. +1. Fill the required inputs. + + - Either the app’s Apple ID or its Bundle ID is a required input. One of the two must be provided. + - If you set the **Submit for Review** to `yes`, the Step will wait for your submission to be processed on App Store Connect and then submit the given version of the app for review. + - The default value of the **Skip App Version Update** input is `No`. Change it only if you incremented the app version number in another way. + - If you use an App Store Connect account that is linked to multiple teams, provide either a Team ID or a Team name! +1. Start a build. + +If all goes well, your app will be submitted to App Store and you can distribute it via Testflight or via the App Store! diff --git a/src/partials/deploying-the-app-to-appetizeio.mdx b/src/partials/deploying-the-app-to-appetizeio.mdx new file mode 100644 index 0000000..ca3fc00 --- /dev/null +++ b/src/partials/deploying-the-app-to-appetizeio.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying the app to Appetize.io + +An .app file built with our **Xcode build for simulator** Step works with just about any simulator. But if you want to easily and quickly integrate it to a simulator that allows you to run your app in a browser, we recommend using the **Appetize.io deploy** Step. It uploads your app to Appetize.io and provides a public URL to use the app in a browser. + +1. Request an Appetize.io API token. +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add and configure the **Xcode build for simulator** Step to your Workflow. +1. Add the **Appetize.io deploy** Step to your Workflow. + + ![Deploying_an_iOS_app_for_simulators.png](/img/_paligo/uuid-d24fc560-4da7-49d1-f0b4-e14e365fba68.png) +1. Add the Appetize.io API token to the **Appetize.io token** input. +1. Enter the path to the .app file to the **Application path** input. The easiest solution is to use the `BITRISE_APP_DIR_PATH_LIST` Environment Variable that is an output of the **Xcode build for simulator** Step. Optionally, you can also enable verbose logging for more efficient debugging. + +The `Appetize.io deploy` Step will produce one output: the `APPETIZE_APP_URL` Environment Variable. it is a public URL where you can access your app. Enjoy showing it off! diff --git a/src/partials/deploying-the-app-to-the-app-store-connect.mdx b/src/partials/deploying-the-app-to-the-app-store-connect.mdx new file mode 100644 index 0000000..6333929 --- /dev/null +++ b/src/partials/deploying-the-app-to-the-app-store-connect.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying the app to the App Store Connect + +If you set up your code signing files and created an .app or .pkg file for your internal testers, it is time to involve external testers and then to publish your macOS app to the App Store. Let’s see how! + +:::tip[Developer ID] + +If you want to distribute your app outside the App Store, you can sign it with a [Developer ID](https://developer.apple.com/support/developer-id/). This method is not in the scope of this guide but on Bitrise, it works the same way: you just need to upload the appropriate code signing files. + +::: + +To deploy to the App Store, you will need these code signing files: + +- a **Mac App** **Distribution** certificate. +- a **Mac** **Installer Distribution** certificate. + +1. On your local machine, set up App Store code signing for your project in Xcode, and export an .app or .pkg file. If this fails locally, it will definitely fail on Bitrise, too! +1. Collect and upload the code signing files. +1. Go to the app’s Workflow Editor and create a new Workflow: click the **+** button next to the Workflow dropdown menu, enter the name of your new Workflow and in the **BASED ON** dropdown menu, select **deploy**. This way the new Workflow will be a copy of the basic **deploy** Workflow. +1. Click on the the **app/pkg export methods** , and set the **Export Method** input of the **Xcode Archive for Mac** Step to **app-store**. + + You can export multiple binaries with different export methods: use the **Export macOS Xcode archive** Step in your Workflow, to do so. +1. Add the **Deploy to App Store Connect - Application Loader (formerly iTunes Connect)** Step to your workflow, after the **Xcode Archive for Mac** Step but preferably before the **Deploy to Bitrise.io** Step. +1. Provide your Apple credentials in the **Deploy to App Store Connect - Application Loader (formerly iTunes Connect)** Step. + + The Step will need your: + + - Apple ID. + - password or, if you use two-factor authentication on iTunes Connect, your application password. + + Don’t worry, the password will not be visible in the logs or exposed - [that’s why it is marked SENSITIVE](/en/bitrise-ci/configure-builds/secrets.html). + +And that’s it! Start a build - if everything went well, you should see your app on Testflight. From there, you can distribute it to external testers or release it to the App Store. diff --git a/src/partials/deploying-to-google-play.mdx b/src/partials/deploying-to-google-play.mdx new file mode 100644 index 0000000..abdc8eb --- /dev/null +++ b/src/partials/deploying-to-google-play.mdx @@ -0,0 +1,85 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying to Google Play + +Deploying to Google Play requires [a signed APK or AAB file](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html) and the **[Google Play Deploy](https://www.bitrise.io/integrations/steps/google-play-deploy)** Step. + + + + +1. [Upload your service account JSON key to the **Files** section](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html). +1. In the **Files** section, copy the **Download URL** of your service account file. + + For example, `BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL`. +1. Open the Workflow Editor and select **Secrets**. +1. Create a Secret with the copied download URL as the value. + + If you uploaded the JSON key file to Bitrise, the download URL is an Environment Variable so check the **Replace variables in inputs** checkbox. + + :::note[Direct link] + + If you use a direct link to your keystore file without uploading it to Bitrise, you don't need to check the **Replace the variables in inputs** option. + + ::: +1. Add the **Google Play Deploy** Step to your Workflow. +1. In the **Service Account JSON key file path** input, paste the Secret you created. +1. In the **Package name** input, add the package name of your app. +1. In the **Track** input, add the track where you want to deploy your APK (for example, alpha/beta/rollout/production or any custom track you set). + + + + +1. [Upload your service account JSON key to the **Files** section](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html). + + :::note[Uploading the service account JSON key file] + + We recommend uploading the service account JSON key to Bitrise but it is not mandatory: you can store it elsewhere and provide a direct link to it. + + ::: +1. Open your app's Configuration YAML file and add the `google-play-deploy` Step to it. + + ``` + deploy-workflow: + steps: + - google-play-deploy: + inputs: + ``` +1. In the `service_account_json_key_path` input, you need to provide the path to the service account JSON key file. + + [Create a Secret](/en/bitrise-ci/configure-builds/secrets.html) to the path and reference that here. + + ``` + deploy-workflow: + steps: + - google-play-deploy: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + ``` +1. In the `package` input, add [the package name](https://support.google.com/admob/answer/9972781?hl=en#:~:text=The%20package%20name%20of%20an,supported%20third%2Dparty%20Android%20stores.) of your app. + + ``` + deploy-workflow: + steps: + - google-play-deploy: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + - package_name: myApp + ``` +1. In the `track` input, add the track where you want to deploy your app binary (for example, alpha/beta/rollout/production or any custom track you set). + + ``` + deploy-workflow: + steps: + - google-play-deploy: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + - package_name: myApp + - track: alpha + ``` + + + + +That’s all! Start or schedule a build and share the URL with external testers or distribute your app on an app store of your choice! diff --git a/src/partials/deploying-web-ci-projects.mdx b/src/partials/deploying-web-ci-projects.mdx new file mode 100644 index 0000000..67a8aed --- /dev/null +++ b/src/partials/deploying-web-ci-projects.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying + +Deploy your web CI project in one of three ways: + +- The **[Deploy to Bitrise.io](https://bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step: It deploys your files on Bitrise. Set the path to the files you want to deploy in the **Deploy directory or file path** input of the Step. After a successful build, you can find them on the **Artifacts** tab of [the build page](/en/bitrise-ci/run-and-analyze-builds/finding-a-specific-build.html). You can download the files from here. + + For more information, check out [Build artifacts online](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online). +- A customized [Script Step](https://bitrise.io/integrations/steps/script): Deploy your project using your own custom script. The Step supports all the popular scripting languages. The Step also allows you to create and export your own Environment Variables which can be accessed by subsequent Steps. With Script Steps, everything is fully in your control. +- A dedicated deploy Step: These Steps deploy your web project to a specific service. For example, the [Amazon S3 Bucket Sync Step](https://bitrise.io/integrations/steps/amazon-s3-upload) uploads the contents of a local folder to an Amazon S3 bucket; the [Heroku Deploy](https://bitrise.io/integrations/steps/heroku-deploy) Step deploys your app to Heroku with the Heroku Toolbelt. + + We'll be actively adding new deployment Steps in the future to cover as many use cases as possible. diff --git a/src/partials/deploying-with-the-deploy-to-bitriseio-step.mdx b/src/partials/deploying-with-the-deploy-to-bitriseio-step.mdx new file mode 100644 index 0000000..f7c5a7d --- /dev/null +++ b/src/partials/deploying-with-the-deploy-to-bitriseio-step.mdx @@ -0,0 +1,67 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying with the Deploy to Bitrise.io Step + +The **Deploy to Bitrise.io** Step can perform several different functions: + +- It allows you to create and distribute a public install page for your app and notify users about new builds of the app. +- It uploads app binaries and other build artifacts to the **Artifacts** tab of the build's page. +- It can send test results and logs to [test reports](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). + +In this guide, we'll talk about how to use the Step to deploy app binaries (IPA/APK/AAB files) and distribute the link to the public install page. + +![Bitrise_OTA_app_Deployment.png](/img/_paligo/uuid-23eca453-8f3c-1bbf-e189-eae6a638e144.png) + +### The deploy directory + +The **Deploy directory or file path** input defines the path that the Step will check for files to deploy. If the input value is a file path, it will deploy that file. If the input value is a directory, it will deploy all files in the directory. + +The default value is the BITRISE_DEPLOY_DIR [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) (Env Var). In most cases, you don't have to change this or worry about it in any way. If you use the official Bitrise Steps to build your apps, they will export all necessary files into this directory. In certain cases, it's worth checking whether your files end up in the correct location for deployment: + +- If you use a **Script** Step to build your app, the best practice is to configure the Step to export the files to the BITRISE_DEPLOY_DIR Env Var. +- If you use a Step that isn't maintained by Bitrise, check where the Step exports any files it generates. If it isn't the BITRISE_DEPLOY_DIR, set the input to point to that location. + +:::tip[Compressing all files into a .zip] + +If you wish to compress all files found in the deploy directory into a single .zip file, set the **Compress artifacts into one file?** input to **true**. + +::: + +### The public install page + +The **Enable public page for the App?** input determines whether the app can be installed by accessing a publicly available web page. Anyone who has the link to the page can install the app on their device. + +:::note[Registering test devices] + +For Android apps, you don’t have to register your test devices to be able to install the app on them, as Android apps don’t have per-device install restrictions. However, you’ll have to enable the **Unknown Sources** option in Android to be able to install the APK/AAB from outside of the Google Play Store. + +For iOS apps, [the test devices must be registered and provisioned](/en/bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page), otherwise, you can't install the app from the public install page on them. + +::: + +The page includes all the important details of the build, such as filename, size, version code, minimum SDK version, and build number. If the public install page is enabled, users defined in the **Notify: Emails** and **Notify: User Roles** inputs rec3eive the link to the page. + +By default, the input value is set to **true**. If you disable the option, only the members of your app's Bitrise team will be able to install the app on their devices. They can find the installable binary on the **Artifacts** tab on the build page. + +### Notifying users + +The **Deploy to Bitrise.io Step** can send email notifications to specified users. The notification can include the build URL and the public install page link. The Step can notify users in two ways: + +- The **Notify: User Groups** input allows you to notify the users on the app's Bitrise team. If the **Enable public page for the App?** input is set to **true**, the notification includes the link to the public install page. If it's set to **false**, the specified user groups will receive the build URL instead. + + The default value is **everyone**: this means everyone on the app's Bitrise team gets a notification. You can choose any other role: in that case, only users with that particular role will get a notification. +- The **Notify: Email** input allows you to notify anyone via email. This includes people who don't have a Bitrise account. This way, you can send the public install page to anyone, inviting them to install the app. + + :::important[Public install page required] + + If the **Enable public page for the App?** input is set to **false**, the **Notify: Email** input is ignored! + + ::: + + :::caution[Use a Secret] + + The input only takes [Secrets](/en/bitrise-ci/configure-builds/secrets.html) as a value: you must create a Secret and specify the email addresses in the Secret's value. + + ::: diff --git a/src/partials/deploying-your-android-app-bundle-to-google-play.mdx b/src/partials/deploying-your-android-app-bundle-to-google-play.mdx new file mode 100644 index 0000000..25a1f04 --- /dev/null +++ b/src/partials/deploying-your-android-app-bundle-to-google-play.mdx @@ -0,0 +1,108 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying your Android App Bundle to Google Play + +Deploying an AAB file isn't significantly different from deploying an APK to Google Play. + +If you want to check the bundle prior to app store distribution, you can add the **Deploy to Bitrise.io** Step after the **Gradle Runner / Android Build** Steps. It uploads the bundle into the **Artifacts** tab of your Build’s page. + +### Setting up Google Play deployment for the first time + +Deploying to Google play publishes your app to Google's online store. When you do it for the first time, this requires a bit more work than simply deploying to [bitrise.io](https://www.bitrise.io/). Once the necessary configurations are in place, it becomes very simple. + +When configuring Google Play deployment for the first time, you need to link your Google Play Developer account to an API project, set up API access, and upload the service account JSON key to Bitrise. + +1. Upload the first AAB or APK manually to Google Play [using the Google Play Console](https://support.google.com/googleplay/android-developer/answer/113469?hl=en). +1. [Link](https://developers.google.com/android-publisher/getting_started) your Google Play Developer Console to an API project. +1. [Set up API Access Clients using a service account](https://developers.google.com/android-publisher/getting_started): Please note when you create your service account on the Google Developer Console, you have to choose `json` as **Key Type**. +1. Grant the necessary rights to the service account with your [Google Play Console](https://play.google.com/apps/publish). Go to **Settings**, then **Users & permissions**, then **Invite new user**. Due to the way the Google Play Publisher API works, you have to grant at least the following permissions to the service account: + + - Access level: View app information. + - Release management: Manage production releases, manage testing track releases. + - Store presence: Edit store listing, pricing & distribution. +1. As an optional step, you can add translations to your Store Listing: [Translate & localize your app](https://support.google.com/googleplay/android-developer/answer/3125566?hl=en). +1. [Connect your Google service account to Bitrise](/en/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise). + +### Deploying to Google Play + +Deploying to Google Play requires [a signed APK or AAB file](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html) and the **[Google Play Deploy](https://www.bitrise.io/integrations/steps/google-play-deploy)** Step. + + + + +1. [Upload your service account JSON key to the **Files** section](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html). +1. In the **Files** section, copy the **Download URL** of your service account file. + + For example, `BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL`. +1. Open the Workflow Editor and select **Secrets**. +1. Create a Secret with the copied download URL as the value. + + If you uploaded the JSON key file to Bitrise, the download URL is an Environment Variable so check the **Replace variables in inputs** checkbox. + + :::note[Direct link] + + If you use a direct link to your keystore file without uploading it to Bitrise, you don't need to check the **Replace the variables in inputs** option. + + ::: +1. Add the **Google Play Deploy** Step to your Workflow. +1. In the **Service Account JSON key file path** input, paste the Secret you created. +1. In the **Package name** input, add the package name of your app. +1. In the **Track** input, add the track where you want to deploy your APK (for example, alpha/beta/rollout/production or any custom track you set). + + + + +1. [Upload your service account JSON key to the **Files** section](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html). + + :::note[Uploading the service account JSON key file] + + We recommend uploading the service account JSON key to Bitrise but it is not mandatory: you can store it elsewhere and provide a direct link to it. + + ::: +1. Open your app's Configuration YAML file and add the `google-play-deploy` Step to it. + + ``` + deploy-workflow: + steps: + - google-play-deploy: + inputs: + ``` +1. In the `service_account_json_key_path` input, you need to provide the path to the service account JSON key file. + + [Create a Secret](/en/bitrise-ci/configure-builds/secrets.html) to the path and reference that here. + + ``` + deploy-workflow: + steps: + - google-play-deploy: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + ``` +1. In the `package` input, add [the package name](https://support.google.com/admob/answer/9972781?hl=en#:~:text=The%20package%20name%20of%20an,supported%20third%2Dparty%20Android%20stores.) of your app. + + ``` + deploy-workflow: + steps: + - google-play-deploy: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + - package_name: myApp + ``` +1. In the `track` input, add the track where you want to deploy your app binary (for example, alpha/beta/rollout/production or any custom track you set). + + ``` + deploy-workflow: + steps: + - google-play-deploy: + inputs: + - service_account_json_key_path: "$BITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URL" + - package_name: myApp + - track: alpha + ``` + + + + +That’s all! Start or schedule a build and share the URL with external testers or distribute your app on an app store of your choice! diff --git a/src/partials/deploying-your-expo-app.mdx b/src/partials/deploying-your-expo-app.mdx new file mode 100644 index 0000000..c6a7d75 --- /dev/null +++ b/src/partials/deploying-your-expo-app.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deploying your Expo project + +Bitrise supports [Expo Application Services](https://expo.dev/eas) (EAS) for Expo projects, and the default deploy Bitrise Workflow uses the [Run Expo Application Services (EAS) build](https://www.bitrise.io/integrations/steps/run-eas-build) Step to trigger a build on EAS. + +In case you don’t want to use EAS, you can use [Turtle CLI](https://docs.expo.dev/classic/turtle-cli/) for your Bitrise Workflows. See this [Workflow Recipe](/en/bitrise-ci/workflows-and-pipelines/workflows/workflow-recipes-for-cross-platform-projects/react-native-expo-build-using-turtle-cli) for details. + +:::note[CodePush] + +You can deploy updates to your users' devices with Bitrise CodePush. CodePush is part of [Release Management](urn:resource:publication:90740) and it is supported for React Native and Expo apps. + +For more information about CodePush, check out the official guides: [CodePush](/en/release-management/codepush). + +::: diff --git a/src/partials/deprecating-android-docker-stacks.mdx b/src/partials/deprecating-android-docker-stacks.mdx new file mode 100644 index 0000000..50550ca --- /dev/null +++ b/src/partials/deprecating-android-docker-stacks.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Deprecating Linux stacks + +A Linux stack is supported for about two years, roughly in sync with [Ubuntu LTS (long term support)](https://endoflife.date/ubuntu) releases. + +When a previous Linux stack reaches end of maintenance, we deprecate the stack and earmark it for removal. At that point you can no longer select the stack for your apps. But the apps that are already using those stacks can keep using them until removal. + +In all cases, there will be a minimum of four weeks' notice provided for the removal of these stacks. You can see all upcoming stack deprecations [on this page](https://stacks.bitrise.io/announcements/upcoming-stack-deprecations/). We also recommend subscribing to [RSS updates](https://stacks.bitrise.io/tips/get-notified/) of important announcements about stacks. diff --git a/src/partials/detecting-flaky-tests.mdx b/src/partials/detecting-flaky-tests.mdx new file mode 100644 index 0000000..6f37def --- /dev/null +++ b/src/partials/detecting-flaky-tests.mdx @@ -0,0 +1,145 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Detecting flaky tests + +Configure specific build Steps to automatically rerun any failed tests. If the tests pass on retry, the build can go green, and the tests are marked flaky, so you can fix it later. You can also [quarantine](/en/bitrise-ci/testing/detecting-and-quarantining-flaky-tests/quarantining-flaky-tests) it if you have an [Enterprise](https://bitrise.io/solutions/enterprise) plan. + +### Steps allowing automatic reruns for failed tests + +The inputs in these testing Steps allow you to specify the number of retry attempts for failed tests. When a test fails during a run, the Step will automatically retry the tests. + +If the test passes on a subsequent attempt, it is marked as flaky; however, the Step itself will still succeed, allowing your build and PR check to turn green. + +This allows you to merge your changes without being blocked, while still providing the data you need to identify and fix unstable tests later. + +- [Xcode Test for iOS](https://bitrise.io/integrations/steps/xcode-test) +- [Xcode Test without building](https://bitrise.io/integrations/steps/xcode-test-without-building) +- [iOS Device Testing](https://bitrise.io/integrations/steps/virtual-device-testing-for-ios) +- [Virtual Device Testing for Android](https://bitrise.io/integrations/steps/virtual-device-testing-for-android) +- [Android unit test](https://bitrise.io/integrations/steps/android-unit-test) (via [Gradle plugin](https://github.com/gradle/test-retry-gradle-plugin)) + +For example, a UI test might occasionally fail because a network request times out or an animation hasn't completed. Instead of failing the entire build, you can now configure it to retry failed tests up to 3 times. If it passes on the second try, your PR is unblocked, and you can see in the test report that this specific test was flaky. + +Note that if you use either the **iOS Device Testing** Step or the **Virtual Device Testing for Android** Step, then the entire test suite will be rerun, and not just the tests that failed. + +### Configuring flaky test detection + +Configure flaky test detection in the input fields of these testing Steps: + +1. **[Xcode Test for iOS](https://bitrise.io/integrations/steps/xcode-test)** and **[Xcode Test without building](https://bitrise.io/integrations/steps/xcode-test-without-building)** + + Set below input fields under **Test repetition** in the Step: + + - **Test Repetition Mode**: Defines the repetition mode. For example, `retry_on_failure` will only rerun the tests that failed. + - **Maximum Test Repetitions**: The maximum number of times to repeat a test. + - **Relaunch Tests For Each Repetition**: It controls whether the app is relaunched for each repetition. +1. **[iOS device testing](https://bitrise.io/integrations/steps/virtual-device-testing-for-ios)** and **[Virtual device testing for Android](https://bitrise.io/integrations/steps/virtual-device-testing-for-android)** + + Set below input field in the Step: + + - **Number of times a test execution is reattempted**: Specifies the number of times to retry a failed test execution. An execution that fails initially but succeeds on a reattempt is reported as flaky. The maximum value is 10. The default is 0 (no reruns). + + ![iosdevicetesting-flakytests.png](/img/_paligo/uuid-acd14919-6069-8806-9834-df5d53a539a5.png) + + :::note[Running tests with **Virtual Device Testing for Android** and**iOS Device Testing** Steps] + + Both Steps will always rerun all tests (successful and failed) as many times as is configured in the input. + + ::: +1. **[Android Unit Test](https://bitrise.io/integrations/steps/android-unit-test)** + + This functionality is configured directly through the [Gradle plugin](https://github.com/gradle/test-retry-gradle-plugin). You can enable retries for failed tests within your project's `build.gradle` file. + + :::note[Quarantining flaky tests] + + It is possible to [quarantine](/en/bitrise-ci/testing/detecting-and-quarantining-flaky-tests/quarantining-flaky-tests) flaky tests that disrupt your builds to run until you can fix the issue. The above mentioned Steps will automatically skip the quarantined tests as you specify some quarantine details. + + ::: + +### Environment Variable for flaky test detection + +Testing Steps now automatically populate BITRISE_FLAKY_TEST_CASES when retries are enabled, identifying which specific tests are behaving inconsistently. + +When any of these Steps run with retries enabled, they automatically track individual test results: + +- Xcode Test for iOS (ID: xcode-test) +- Android Unit Test (ID: android-unit-test) +- iOS Device Testing (ID: virtual-device-testing-for-ios) +- Virtual Device Testing for Android (ID: virtual-device-testing-for-android) + +These Steps populate the BITRISE_FLAKY_TEST_CASES Env Var with tests that failed at least once but also passed at least once during retry attempts. + +The  BITRISE_FLAKY_TEST_CASES Env Var contains a newline-separated list of flaky test identifiers: + +``` +- TestTarget_1.TestClass_1.TestMethod_1 +- TestTarget_1.TestClass_1.TestMethod_2 +- TestTarget_1.TestClass_2.TestMethod_1 +- TestTarget_2.TestClass_1.TestMethod_1 +``` + +#### Examples of when to use the flaky test Env Var + +Here are a couple of use cases when using this Env Var comes handy: + +1. The test fails if flaky tests are detected: + + ``` + steps: + ... + - script:     + run_if: '{{getenv "BITRISE_FLAKY_TEST_CASES" | ne ""}}'     + inputs:     + - content: |-         + #!/bin/env bash         + echo "Build failed due to flaky tests:"         + echo "$BITRISE_FLAKY_TEST_CASES"        +  exit 1 + ``` +1. To send Slack notification if flaky tests are detected: + + ``` + steps: + ... + - slack:     + run_if: '{{getenv "BITRISE_FLAKY_TEST_CASES" | ne ""}}'     + inputs:     + - webhook_url: $SLACK_WEBHOOK_URL     + - text: |-         + ⚠️ Flaky tests detected in build $BITRISE_BUILD_NUMBER:        + $BITRISE_FLAKY_TEST_CASES + ``` +1. Creates a GitHub issue automatically: + + ``` + steps: + ... + - script:     + run_if: '{{getenv "BITRISE_FLAKY_TEST_CASES" | ne ""}}'     + inputs:     + - content: |-        +  #!/bin/env bash         + ISSUE_BODY="Flaky tests detected in build + $BITRISE_BUILD_NUMBER:\n\n\`\`\`\n$BITRISE_FLAKY_TEST_CASES\n\`\`\`"         + curl -X POST \           + -H "Authorization: token $GITHUB_TOKEN" \           + -H "Accept: application/vnd.github.v3+json" \          + https://api.github.com/repos/owner/repo/issues \           + -d "{\"title\":\"Flaky tests - Build $BITRISE_BUILD_NUMBER\",\"body\":\"$ISSUE_BODY\"}" + ``` + +You can also log to the analytics service, save to build artifacts, count and categorize by test target, and set the Environment Variable for downstream Steps. + +### Test results and outcomes after retries + +If a test fails, the Step reruns the tests up to the configured limit. If a previously failing test passes on retry, it’s marked flaky in the Bitrise **Tests** tab. If tests still fail after retries, the Step fails as usual. + +If all tests pass after retry, the build passes and flaky tests get highlighted in the new test report. If any test fails after retries, the Step fails and the build status says FAILED. + +:::note[Flaky test case with failed and successful runs] + +Even if a test case has successful and failed runs, it will be marked as flaky. The number and order of status do not matter. For example: 1 failed, 1 success, 1 failed is marked as flaky as well as 1 success and 2 failed runs (in this order). + +::: diff --git a/src/partials/developers.mdx b/src/partials/developers.mdx new file mode 100644 index 0000000..dafc8f3 --- /dev/null +++ b/src/partials/developers.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Developers + +Here’s the role cheatsheet for developers: + +![developer.png](/img/_paligo/uuid-8051df2c-f4c0-70ff-b957-0f15c737b323.png) + +Developers cannot change team member roles, add new team members, remove existing team members or create, edit or delete Workflows. They can, however, run builds and view build logs. + +They have no access to sensitive data such as payment information, access tokens or even webhooks. diff --git a/src/partials/diagnosing-bottlenecks-causing-builds-to-fail.mdx b/src/partials/diagnosing-bottlenecks-causing-builds-to-fail.mdx new file mode 100644 index 0000000..2e745a6 --- /dev/null +++ b/src/partials/diagnosing-bottlenecks-causing-builds-to-fail.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Diagnosing bottlenecks causing builds to fail + +There’s another page that is worth checking periodically in Insights: the **Bottlenecks** page: + +![bottlenecks-menu-option.png](/img/_paligo/uuid-3861bf61-778c-af22-dad4-28d5b52cf1f0.png) + +On the **Bottlenecks** page Insights shows you negative trends from the last 7 days. The relevant bottleneck is the **Failing Workflows** one, which lists Workflows which consumed the most amount of time to fail. It lists the Workflows based on the time impact of the failing builds. + +This is usually a good place to check as the time impact calculation here reflects both how frequently the builds of a given Workflow fail as well as how long those failing builds take. The time impact listed on this page is the total amount build time of the failing builds for that Workflow in the last 7 days. In the example above it means that the **bullseye** app’s **test** Workflow builds failed in 73.68% of the cases, and in total those failed builds consumed 1 hour and 38 minutes in the last 7 days. + +By listing the Workflows based on time impact instead of based on just the failure rate, the **Bottlenecks** page helps you to focus on the most impactful build failure trends. As an example, if you have a Workflow which had only a few builds and those all failed, while another Workflow had tens or hundreds of builds and it failed in 50% of the cases, if both Workflows builds are about the same length the second Workflow will be ranked higher, as overall those failed builds caused more wait time for engineers. + +Keeping an eye on and improving your build failure rate helps you to reduce wait time during the app development process and to increase the efficiency and productivity of your team. diff --git a/src/partials/diagnosing-bottlenecks-causing-slow-builds.mdx b/src/partials/diagnosing-bottlenecks-causing-slow-builds.mdx new file mode 100644 index 0000000..41916b9 --- /dev/null +++ b/src/partials/diagnosing-bottlenecks-causing-slow-builds.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Diagnosing bottlenecks in your builds + +On the **Bottlenecks** page, Insights shows you negative trends from the last 7 days. The relevant bottleneck to look out for is the **Build time** one, which lists workflows that became slower in the last 7 days compared to the previous 7 days. + +![bottlenecks-overview.png](/img/_paligo/uuid-6b2fbeca-bd57-7bfa-2ba6-7bb84f9036b4.png) + +It lists the Workflows based on the time impact of that slowing trend. This is usually a good place to check, as the time impact calculated here reflects both the % increase in the 50th percentile build time. It also takes into account how many builds you had in the last 7-day period. For example, one of your Workflows took 2 minutes more to build, but you only had a few builds with that Workflow — on the other hand, another Workflow had only a 1-minute build time increase, but had tens or hundreds of builds with that Workflow. In this case, the second Workflow will have a higher time impact and will be listed higher on **Bottlenecks**. + +If you don’t have any Workflows listed in the **Build time** section that means that none of your Workflows had a significant build time increase. + +Monitor and improve the most important metrics, and you'll reduce the wait time in your app development process. In addition to that, you'll also improve developer productivity and happiness! diff --git a/src/partials/diagnostic-builds.mdx b/src/partials/diagnostic-builds.mdx new file mode 100644 index 0000000..065a8ea --- /dev/null +++ b/src/partials/diagnostic-builds.mdx @@ -0,0 +1,132 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Diagnostic builds + +To understand what changes contribute to a task’s execution, you’ll need the Gradle metadata and the build outputs from a previous build. Restoring them on a CI environment simulates a local incremental build, showing the changes between builds that contribute to cache misses. + +These builds are called diagnostic builds on Bitrise. + +:::important[Debugging purposes only] + +Diagnostic builds heavily use [key-based caching](/en/bitrise-ci/dependencies-and-caching/key-based-caching.html) and have increased build time. Their purpose is debugging and they shouldn't be a part of your daily workflows! + +The archive limit for key-based cache is 15 Gb. If your app’s outputs exceed that, you can run two separate builds with the same principle, using your own artifact storage solution. + +::: + +To set up and run a Gradle diagnostic build: + +1. Create a CI configuration that: + + - Saves the build outputs and Gradle metadata with the Bitrise Build Cache CLI. + - Restores the build outputs and metadata from cache. +1. Run an initial build to save the necessary directories in the key-based cache. +1. Run the diagnostic build to reveal Gradle execution reasons. + +### Creating the CI configuration for a diagnostic build + +To create a CI configuration for a Gradle diagnostic build, your Bitrise Workflow will need two new Steps to save and restore build outputs, using the Bitrise Build Cache CLI. + +:::note[Do not use key-based caching Steps] + +Diagnostic builds use key-based caching but for this purpose, do not use our dedicated key-based caching Steps. Set up **Script** Steps as they are described in this guide. + +::: + + + + +1. Create a new Workflow for the diagnostic build. + + If you store your `bitrise.yml` file [in your repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository), we recommend creating a new branch, too, and run the diagnostic build from that branch. +1. Add the **Build Cache for Gradle** Step to the Workflow. +1. After the Step that runs your Gradle tasks (for example, **Android Build**), add a **Script** Step. + + :::important[Environment] + + Make sure to run the script in the same environment as the Gradle command(s) you want to speed up. For example, if you use multiple Docker containers throughout the build, make sure that the Bitrise Build Cache CLI runs in the same Docker container as the Gradle command. + + ::: +1. To the **Script content** input, add the following: + + ``` + /tmp/bin/bitrise-build-cache save-gradle-output-data + ``` + + This saves the Gradle metadata directory and the build outputs to the key-based cache under a cache key unique for your Workspace, app, and Workflow. +1. Before the Step that runs your Gradle tasks, add another **Script** Step. +1. To the **Script content** input, add the following: + + ``` + /tmp/bin/bitrise-build-cache restore-gradle-output-data + ``` + + This Step accesses the cache and restores your Gradle build data. + + + + +1. Create a new Workflow for the diagnostic build. + + If you store your `bitrise.yml` file [in your repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository), we recommend creating a new branch, too, and run the diagnostic build from that branch. +1. Add the `activate-build-cache-for-gradle` Step to your Workflow. +1. After the Step that runs your Gradle tasks (for example, `android-build`), add a `script` Step. + + :::important[Environment] + + Make sure to run the script in the same environment as the Gradle command(s) you want to speed up. For example, if you use multiple Docker containers throughout the build, make sure that the Bitrise Build Cache CLI runs in the same Docker container as the Gradle command. + + ::: +1. To the `content` input, add: + + ``` + - script: + inputs: + - content: |- + /tmp/bin/bitrise-build-cache save-gradle-output-data + ``` + + This saves the Gradle metadata directory and the build outputs to the key-based cache under a cache key unique for your Workspace, app, and Workflow. +1. Before the Step that runs your Gradle tasks, add another `script` Step. +1. To the `content` input, add `/tmp/bin/bitrise-build-cache restore-gradle-output-data`: + + ``` + - script: + inputs: + - content: |- + /tmp/bin/bitrise-build-cache restore-gradle-output-data + ``` + + This Step accesses the cache and restores your Gradle build data. + + + + +### Saving the directories in the key-based cache + +When setting up a Gradle diagnostic build for the first time, you need to run an initial build with the [created configuration](#section-idm4574404408601634208193694222) to save the necessary directories in the key-based cache. This initial build will not show any execution reason in the invocation details. + +1. Once the CI configuration is complete, run a build. +1. Check the logs to make sure the uploads have been successfully completed. + + ![upload-complete.png](/img/_paligo/uuid-223b519e-cddd-6157-de92-bfdf36d7ba2d.png) + +### Running and checking a diagnostic build + +After the [CI configuration is complete](#section-idm4574404408601634208193694222) and [an initial build has successfully uploaded](#section-idm4555859863406434208246126579) the necessary directories to the key-based cache, you can run a diagnostic build to reveal execution reasons for Gradle tasks. Make sure you use the same Workflow and branch as the initial build + +With a diagnostic build, Gradle will behave as if it was an incremental local build. + +1. Run the build. +1. Open [the Build Cache page](https://app.bitrise.io/build-cache/). +1. Among the **Latest invocations**, find the tasks you need. A blue icon will show you the tasks that contain task execution reasons: + + ![invocations-significant.png](/img/_paligo/uuid-f63b2a01-2f9d-fb91-dc1d-a94aa4d3e386.png) + + You will see changes related to your CI configuration that frequently cause cache task input changes and cache misses. + + ![task-reason.png](/img/_paligo/uuid-60ec20cb-92a4-2e4d-c084-55988b170c60.png) + +To successfully interpret and debug these reasons, you can check out the [relevant Gradle documentation](https://docs.gradle.org/current/userguide/build_cache_debugging.html) or delve into our [debugging tips](https://discuss.bitrise.io/t/debugging-and-optimizing-bitrise-build-cache-for-gradle/23275). diff --git a/src/partials/differences-between-caching-systems.mdx b/src/partials/differences-between-caching-systems.mdx new file mode 100644 index 0000000..09b3aa9 --- /dev/null +++ b/src/partials/differences-between-caching-systems.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Differences between caching systems + +Key-based caching is generally more efficient and far more powerful than branch-based caching. In the table, we compare the two caching methods based on their feature set. + +| Features | Branch-based caching | Key-based caching | +| --- | --- | --- | +| **Cache scope** | One cache per branch | Multiple caches identified by keys | +| **Cache sharing across builds** | Limited to same branch and stack | Can be shared across Workflows, branches, and stacks | +| **Steps used** | [Cache:Pull](https://bitrise.io/integrations/steps/cache-pull) and [Cache:Push](https://bitrise.io/integrations/steps/cache-push) | - The generic [Restore Cache](https://bitrise.io/integrations/steps/restore-cache) and [Save Cache](https://bitrise.io/integrations/steps/save-cache) Steps - [Dedicated caching steps for six dependency managers](/en/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.html) | +| **Expiration** | Seven days without new build on branch | Seven days since last use | +| **Fallback mechanism** | Default branch cache used as fallback | Multiple fallback keys can be configured | +| **Maximum cache archive size** | No limit (until migration stated) | 15 GB | +| **Adding files/paths to the cache archive** | Configured manually or by other Bitrise steps supporting caching | Configured manually or via the dedicated caching Steps | +| **Ignoring files** | `Ignore paths` parameter | No separate ignore list | +| **Performance/speed** | Slower (larger gzip archives and slower storage backend) | Faster (state-of-the art [zstd](https://github.com/facebook/zstd) compression and faster storage backend) | +| **Dedicated caching Steps for dependency managers** | Not available | Available for [most dependency managers](/en/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers.html) | diff --git a/src/partials/disabling-a-scheduled-build.mdx b/src/partials/disabling-a-scheduled-build.mdx new file mode 100644 index 0000000..f646389 --- /dev/null +++ b/src/partials/disabling-a-scheduled-build.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Pausing a scheduled build + +To temporarily pause a regularly scheduled build: + +1. Go to the **Builds** page of your app. +1. Find the **Scheduled builds** section and open it to view your scheduled builds. + + ![scheduled-build.png](/img/_paligo/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png) +1. Click the vertical ellipsis to open the context menu. +1. Select **Pause schedule**. + + The build will not run until you enable it again. + + ![edit-config.png](/img/_paligo/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png) diff --git a/src/partials/disabling-a-step.mdx b/src/partials/disabling-a-step.mdx new file mode 100644 index 0000000..9af575c --- /dev/null +++ b/src/partials/disabling-a-step.mdx @@ -0,0 +1,51 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disabling a Step + +If you do not want to remove a Step from your Workflow but you don’t want it to run, you can disable it, using a `run_if` expression. + +:::tip[Experimenting with Workflows] + +To experiment with different configurations for a Workflow, without removing or disabling Steps, we recommend cloning the Workflow. You can modify the cloned Workflow as much as you wish without changing anything in the original. + +::: + + + + +1. Open the Workflow you need. +1. Find the Step that you want to disable. +1. In the **Additional run conditions** input, type **false**. + + :::tip[Conditionals] + + Any condition that evaluates to false works, too. + + ::: + + + + +1. Open your app’s `bitrise.yml` file. +1. Find the Step that you want to disable. +1. Add `run_if: false` to it. + + :::tip[Conditionals] + + Any condition that evaluates to false works, too. + + ::: + + ``` + - script: + run_if: false + inputs: + - content: |- + #!/bin/bash + echo "This will never run, because of run_if:false" + ``` + + + diff --git a/src/partials/disabling-a-workspace-members-saml-sso.mdx b/src/partials/disabling-a-workspace-members-saml-sso.mdx new file mode 100644 index 0000000..0d9ae48 --- /dev/null +++ b/src/partials/disabling-a-workspace-members-saml-sso.mdx @@ -0,0 +1,10 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disabling a Workspace member's SAML SSO + +If you are a Workspace owner, you can disable a Workspace member’s SAML SSO connection to the Workspace on Bitrise. There are two ways to do so: + +- Remove the user from the Workspace. +- Remove the user from the SAML SSO provider which means the user would not be able to log in with SAML SSO any more. diff --git a/src/partials/disabling-a-workspaces-saml-sso.mdx b/src/partials/disabling-a-workspaces-saml-sso.mdx new file mode 100644 index 0000000..a8a340d --- /dev/null +++ b/src/partials/disabling-a-workspaces-saml-sso.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disabling a Workspace's SAML SSO + +If you disable SAML SSO, Workspace members will be able to sign in with the regular sign-in procedure. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. Go to the **Single Sign-On** tab. +1. If SAML SSO has been enforced on the Workspace before, toggle **Enforce** under **Enforce SAML SSO** off. +1. Click **Disable SSO**. + + A confirmation pop-up appears where you can confirm/cancel your action. Please note that by clicking the **Disable SSO** button, you will disable SAML SSO for all Workspace members. Once it’s done, Workspace members will be able to log in through their normal Bitrise credentials. + + ![disable_sso.png](/img/_paligo/uuid-ea11f723-edcb-2e88-0d83-c4c60f1cb794.png) + +You will receive an **SSO has been disabled** email from Bitrise (letsconnect@bitrise.io) which confirms the disabled SAML SSO for the Workspace. diff --git a/src/partials/disabling-github-checks.mdx b/src/partials/disabling-github-checks.mdx new file mode 100644 index 0000000..2ca33f7 --- /dev/null +++ b/src/partials/disabling-github-checks.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disabling GitHub Checks + +To disable GitHub Checks for your project: + +if you toggle the **ENABLE GITHUB CHECKS** switch to the left on the **Settings** page of the project. + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. Select **Integrations** on the left and then go to the **Git provider** tab. +1. Under **GitHub Checks**, disable the GitHub Checks toggle. diff --git a/src/partials/disabling-the-public-install-page-of-an-artifact.mdx b/src/partials/disabling-the-public-install-page-of-an-artifact.mdx new file mode 100644 index 0000000..a313729 --- /dev/null +++ b/src/partials/disabling-the-public-install-page-of-an-artifact.mdx @@ -0,0 +1,47 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disabling the public install page of an artifact + +:::note[Required role] + +You must have a developer, admin, or owner role on the app's team to disable the public install page of an artifact using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +You can update the `is_public_page_enabled` parameter of your APK and IPA files. Please note this parameter’s value is set to `true` by default so you can only disable it with this endpoint. + +The required parameters are: + +- app slug +- build slug +- artifact slug + +**Disabling the public install page for an APK file** + +Request: + +``` +curl -X PATCH "https://api.bitrise.io/v0.1/apps/87a5991e180d91a9/builds/b234f959745082e0/artifacts/54ae701761c4f956" -H "accept: application/json" -H "Authorization: THE-ACCESS-TOKEN" -H "Content-Type: application/json" -d "{ \"is_public_page_enabled\": false}" +``` + +Response: + +``` +{ + "data": { + "title": "app-debug.apk", + "artifact_type": "android-apk", + "expiring_download_url": "https://bitrise-prod-build-storage.s3.amazonaws.com/builds/b234f959745082e0/artifacts/7626904/app-debug.apk?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAIV2YZWMVCNWNR2HA%2F20190503%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190503T082800Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=7251fcbc0574ffac60b3f1d4a8c398658e49f0b86fb3cfec1500bde125738abc", + "is_public_page_enabled": false, + "slug": "54ae701761c4f956", + "public_install_page_url": "", + "file_size_bytes": 1574793 + } +} +``` + +If you check the build’s `Artifacts` tab, you will see that the `Public install page` toggle is disabled. diff --git a/src/partials/disabling-third-party-steps.mdx b/src/partials/disabling-third-party-steps.mdx new file mode 100644 index 0000000..e7b6aad --- /dev/null +++ b/src/partials/disabling-third-party-steps.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disabling third-party Steps + +To disable third-party Steps: + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. Select **Security**. +1. Select the **Build restrictions** tab. +1. Optionally, request a report of Workflows using third-party Steps by clicking **Request report**. +1. Toggle **Allow third-party Steps** to off. diff --git a/src/partials/disabling-two-factor-authentication.mdx b/src/partials/disabling-two-factor-authentication.mdx new file mode 100644 index 0000000..5570d2a --- /dev/null +++ b/src/partials/disabling-two-factor-authentication.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disabling two-factor authentication + +Follow this procedure to disable two-factor authentication (2FA) if you are already logged into Bitrise. + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. Select **Security** on the left. +1. Click on **2FA is enabled** under **Two-factor authentication**. + + ![2fa.png](/img/_paligo/uuid-cf53d41b-4a10-c359-3816-2f847f107db4.png) +1. Provide your Bitrise login password in the pop-up window. + + ![edit-2fa.png](/img/_paligo/uuid-bd209862-be8e-f0b7-c8c6-23b6f23d2329.png) diff --git a/src/partials/disconnecting-a-git-provider-account.mdx b/src/partials/disconnecting-a-git-provider-account.mdx new file mode 100644 index 0000000..ff0fc05 --- /dev/null +++ b/src/partials/disconnecting-a-git-provider-account.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Disconnecting a Git provider account + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. On the left under **Connected Git providers**, click the toggle next to the name of the Git provider you wish to disconnect. diff --git a/src/partials/distributing-android-release-candidates-for-testing.mdx b/src/partials/distributing-android-release-candidates-for-testing.mdx new file mode 100644 index 0000000..f91e9c7 --- /dev/null +++ b/src/partials/distributing-android-release-candidates-for-testing.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Distributing Android release candidates for testing + +After [uploading a release candidate to Google Play](/en/release-management/releases/managing-the-release-process/google-play-upload-stage/uploading-the-release-candidate-to-google-play), you can distribute it to Google Play testing tracks: + +1. Open your release and go to the **Beta testing in Google Play** section. + + ![beta-testing-google-play.png](/img/_paligo/uuid-0022d0d2-8794-bad9-bf5d-a7413b7bb473.png) +1. Choose a testing track. + + Release Management supports open, internal, and closed testing. For more information about Google Play testing, check out the [Google Play Console documentation](https://support.google.com/googleplay/android-developer/answer/9845334). + + :::important[Newer builds] + + If there is a newer build (a build with a higher `version_code` number) on the testing track, you can’t replace that build with your release candidate and the **Start** button will not be available. + + If there is an older build on the testing track, your release candidate will replace it. + + ![testing-google-play-cant-replace.png](/img/_paligo/uuid-66a9dd86-282a-8695-d1c9-aa89bb61ef49.png) + + ::: +1. Click the **Start** button next to the name of your track to start the distribution. + + If all goes well, the **Status** of the build should change to **Testing**. diff --git a/src/partials/distributing-ios-release-candidates-for-testing.mdx b/src/partials/distributing-ios-release-candidates-for-testing.mdx new file mode 100644 index 0000000..ea7a744 --- /dev/null +++ b/src/partials/distributing-ios-release-candidates-for-testing.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Distributing iOS release candidates for testing + +After [uploading a release candidate to TestFlight,](/en/release-management/releases/managing-the-release-process/testflight-upload-stage/uploading-the-release-candidate-to-testflight) you can distribute it to TestFlight testing groups: + +1. Open your release and go to the **Beta testing in TestFlight** section. +1. Optionally, you can fill out the **What to test** section for your testers. To do so, click the **Edit** button. + + The information will be visible on TestFlight and in the TestFlight apps. You can also localize the information: choose a language from the menu on the right to provide information for that localization. + + ![beta-testing-testflight.png](/img/_paligo/uuid-0247679e-247c-dd61-77eb-340600f634c9.png) +1. Choose testing groups, either in the **Internal testing** or the **External testing** section. + + - Internal testing groups with automatic distribution enabled will automatically have access to the release candidate. You can enable automatic distribution when creating the group in App Store Connect. If automatic distribution is not enabled, toggle **Distribution** for the group on to make the release candidate available. + - For external testing groups, you must submit the release candidate for beta review: click **Submit to review**, and in the dialog, click **Save**. External testing groups will not have access to the release candidate automatically: after the beta review submission, toggle **Distribution** for the group on to make the release candidate available. Optionally, you can check **Automatically notify testers** in the dialog: this option means external testers get an email when a new build is ready for testing. + + ![testflight-testing-int-ext.png](/img/_paligo/uuid-ee309b75-e71d-aaea-5b0f-2477d3c77231.png) diff --git a/src/partials/docker-authentication-credentials.mdx b/src/partials/docker-authentication-credentials.mdx new file mode 100644 index 0000000..c8cafea --- /dev/null +++ b/src/partials/docker-authentication-credentials.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Docker authentication credentials + +We recommend logging in with your Docker credentials when using containers. To do so, you need to provide Docker credentials when setting up containers: + +- Registry server: It should be a fully qualified registry server URL. This is optional if the server is already part of the image reference. +- Username. +- Password. + +These credentials must be stored as [Secrets](/en/bitrise-ci/configure-builds/secrets.html). They are used when running the `docker login` command during container setup. diff --git a/src/partials/docker-container-properties.mdx b/src/partials/docker-container-properties.mdx new file mode 100644 index 0000000..c3c0228 --- /dev/null +++ b/src/partials/docker-container-properties.mdx @@ -0,0 +1,143 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Docker container properties + +### `containers::type` + +The type of the container. + +**Supported values**: + +- `execution`: Containers that run a Step or a Step bundle. +- `service`: Containers that run alongside a Step or Step bundle, running background services, such as `postgres`. + +Read more: [About Docker containers on Bitrise](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise). + +**Example of `containers::type`** + +```yaml +containers: + node-18: + type: execution +``` + +### `containers::image` + +This property defines the Docker image used for the container, in a `name:tag` format. You can use any public image from Docker Hub. + +**Example of `containers::image`** + +```yaml +containers: + node-18: + image: node:18 +``` + +### `containers::credentials` + +The credentials allow you to control the parameters supplied for the `docker login` command. Check your registries documentation on how to use docker login. + +The following properties are supported: + +- `username` +- `password` +- `server` + +**Example of `containers::credentials`** + +```yaml +containers: + node-18: + credentials: + username: user + password: pass +``` + +#### `containers::credentials:username` + +The username that will be used with the `docker login` command. + +**Example of `containers::credentials:username`** + +```yaml +containers: + node-18: + credentials: + username: _json_key_base64 +``` + +#### `containers::credentials:password` + +The password that will be used with the `docker login` command. + +**Example of `containers::credentials:password`** + +```yaml +containers: + node-18: + credentials: + password: $GCP_SERVICE_ACCOUNT +``` + +#### `containers::credentials:server` + +Fully qualified registry server URL for the `docker login` command. This is optional if the server is already part of the image reference. + +**Example of `containers::credentials:server`** + +```yaml +containers: + node-18: + credentials: + server: ghcr.io +``` + +### `containers::ports` + +This property defines an array of ports which are used to access the service. Define ports in the format of `[HostPort]:[ContainerPort]`. + +**Example of `containers::ports`** + +```yaml +containers: + ports: + - 3000:3000 + - 2000:2000 +``` + +### `containers::envs` + +Define an array of Environment Variables for the Docker container. For each Env Var, define a key and a value. + +Read more: [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables). + +**Example of `containers::envs`** + +```yaml +containers: + node-18: + envs: + - VARIABLE_KEY: variable_value +``` + +### `containers::options` + +Define additional Docker container resource options. These are parameters that will be passed to the `docker create` command. + +Read more about the possible options: [docker service create](https://docs.docker.com/reference/cli/docker/service/create/). + +:::important[Not supported options] + +`--network`, `--volume (-v)`, and `--entrypoint` are not supported. + +::: + +**Example of `containers::options`** + +```yaml +containers: + node-18: + options: "--privileged --health-interval 1s" +``` diff --git a/src/partials/docker-container-support-for-web-ci-projects.mdx b/src/partials/docker-container-support-for-web-ci-projects.mdx new file mode 100644 index 0000000..6db1b9e --- /dev/null +++ b/src/partials/docker-container-support-for-web-ci-projects.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Docker container support + +You can use Docker containers in your Bitrise Workflows and Pipelines. Container support also enables background services. Running builds in a container grants full control over your build environment, and you don't need to install dependencies during a build. + +### Building a Docker image + +To use containers, you need a Docker image. You can build and push your own Docker image using the [Docker Build & Push](https://bitrise.io/integrations/steps/docker-build-push) Step. The Step requires a list of image tags to be applied to the built image. You can also specify: + +- A build context. +- A Dockerfile path. + +The **Docker Build & Push** Step offers built-in support for [key-based caching](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching). It means the Step automatically caches your built Docker image, using preset cache keys. For more information, check out [Building your own Docker image](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image). + +### Using containers + +To use containers in a build, you need to: + +- Define your containers. It requires a container ID and the name and version of the Docker image. +- Refer to the container by its ID within a Workflow or Pipeline. Different parts of the same Workflow can run in different containers. + +You can also define service containers that allow running Docker containers as services for advanced integration testing. + +For details, check out [About Docker containers on Bitrise](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise). diff --git a/src/partials/document-changelog.mdx b/src/partials/document-changelog.mdx new file mode 100644 index 0000000..a3fef2d --- /dev/null +++ b/src/partials/document-changelog.mdx @@ -0,0 +1,47 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Document changelog + +**November 2025** + +Added the 185.55.252.0/22 range to the IP ranges of both the build machines and the backend workers, which will utilize the new IP range from the 21st of January, 2026. The exact IP ranges are as follows: + +Build machines: + +- 185.55.252.224/27 +- 185.55.253.224/27 +- 185.55.254.224/27 +- 185.55.255.224/27 + +Backend workers: + +- 185.55.252.64/28 +- 185.55.253.64/28 +- 185.55.254.64/28 +- 185.55.255.64/28 + +**May 2025** + +Narrowed the Bitrise build machines IP range from 74.122.200.0/22 to: + +- 74.122.200.224/27 +- 74.122.201.224/27 +- 74.122.202.224/27 +- 74.122.203.224/27 + +Narrowed the Bitrise backend workers IP range: from 74.122.200.0/22 to: + +- 74.122.200.64/28 +- 74.122.201.64/28 +- 74.122.202.64/28 +- 74.122.203.64/28 + +**April 2024** + +Added the 74.122.200.0/22 range to the IP ranges of both the build machines and the backend workers. + +**October 2022** + +Significantly increased the Linux/Docker stacks IP range. diff --git a/src/partials/does-bitrise-retain-customer-data-for-training.mdx b/src/partials/does-bitrise-retain-customer-data-for-training.mdx new file mode 100644 index 0000000..8544d99 --- /dev/null +++ b/src/partials/does-bitrise-retain-customer-data-for-training.mdx @@ -0,0 +1,10 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Does Bitrise retain Customer data for training? + +Customer data is classified into several categories of customer content. The Customer Content is then handled as follows: + +- **Non-Anonymizable Customer Sensitive Content** is never retained for training or fine-tuning purposes. For example, source code is never retained for any training/refining or any other purposes, whether or not such other purposes could lead Customer source code to leak into foundational or derivative models. +- A**nonymized Customer Sensitive Content** and **Customer Non-Sensitive Data** may be retained for use cases like fine tuning, predicting load, and to improve performance and reliability. diff --git a/src/partials/downloading-a-build-log.mdx b/src/partials/downloading-a-build-log.mdx new file mode 100644 index 0000000..11a1361 --- /dev/null +++ b/src/partials/downloading-a-build-log.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Downloading a build log + +If you need to send your build logs to people who do not have access to the app on Bitrise, or you want to store your logs in your own archives, you can simply download the log file from Bitrise. + +:::important[Log security] + +Please note that your build log can contain sensitive information! Make sure to check its contents before downloading the log file and sending it out to anyone. We recommend using [Secrets](/en/bitrise-ci/configure-builds/environment-variables.html) to make sure nothing sensitive appears in build logs. + +::: + +1. Open the [Bitrise CI](http://app.bitrise.io/dashboard) page and select your project from the project list. +1. Select the build you want to check out. +1. Open the **Logs** dropdown menu and click the **Download logs** button. diff --git a/src/partials/downloading-a-file-using-a-custom-script-step.mdx b/src/partials/downloading-a-file-using-a-custom-script-step.mdx new file mode 100644 index 0000000..868a2d4 --- /dev/null +++ b/src/partials/downloading-a-file-using-a-custom-script-step.mdx @@ -0,0 +1,107 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Downloading a file using a custom Script Step + +If you don't want to use the **File Downloader** Step to download and access an uploaded file in your build, you can use your own custom Script Step as well. All you need to do is to get the download URL and then download the file by specifying a full download path that exists on the build machine. + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add a **Script** Step to your Workflow. +1. Find the **Script content** input of the Step. +1. Add a script to download the file and store the destination path in an Env Var. + + :::tip[Uploading the file to Bitrise] + + If you [upload the file to Bitrise](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html), you can use the file's download URL in your script. + + ::: + + In the example below, the download URL is stored in the BITRISE_IO_MY_FILE_ID_URL Env Var. We're using envman to store the destination path in the BITRISEIO_MY_FILE_LOCAL_PATH Env Var. Subsequent Steps can use this Env Var to access the file. + + ``` + #!/bin/bash + set -ex + + # specify local download path + export file_local_path=download/path/to/my/file + + # download the file + wget -O "$file_local_path" "$BITRISEIO_MY_FILE_ID_URL" + echo "file downloaded to: $file_local_path" + + # OPTIONALLY: export the file's local path, to be able to use it in subsequent steps as an input value + envman add --key BITRISEIO_MY_FILE_LOCAL_PATH --value "$file_local_path" + ``` + + Alternatively, for example, you can set the location as an App Env Var and simply download it to that path instead of defining the path inside the Script Step. + + + + +1. Open the `bitrise.yml` file of your app. +1. Add a `script` Step to your Workflow. + + ``` + my-workflow: + steps: + script: + inputs: + - content: + ``` +1. In the `content` input, add a script to download the file and store the destination path in an Env Var. + + :::tip[Uploading the file to Bitrise] + + If you [upload the file to Bitrise](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html), you can use the file's download URL in your script. + + ::: + + In the example below, the download URL is stored in the BITRISE_IO_MY_FILE_ID_URL Env Var. We're using envman to store the destination path in the BITRISEIO_MY_FILE_LOCAL_PATH Env Var. Subsequent Steps can use this Env Var to access the file. + + ``` + my-workflow: + steps: + - script: + inputs: + - content: + #!/bin/bash + set -ex + + # specify local download path + export file_local_path=download/path/to/my/file + + # download the file + wget -O "$file_local_path" "$BITRISEIO_MY_FILE_ID_URL" + echo "file downloaded to: $file_local_path" + ``` + + Alternatively, for example, you can set the location as an App Env Var and simply download it to that path instead of defining the path inside the Script Step. +1. Optionally, export the file's local path so you can use it in subsequent Steps in the same Workflow. + + ``` + my-workflow: + steps: + - script: + inputs: + - content: + #!/bin/bash + set -ex + + # specify local download path + export file_local_path=download/path/to/my/file + + # download the file + wget -O "$file_local_path" "$BITRISEIO_MY_FILE_ID_URL" + echo "file downloaded to: $file_local_path" + + # export the file path for subsequent steps + envman add --key BITRISEIO_MY_FILE_LOCAL_PATH --value "$file_local_path" + ``` + + + diff --git a/src/partials/downloading-a-file-using-the-file-downloader-step.mdx b/src/partials/downloading-a-file-using-the-file-downloader-step.mdx new file mode 100644 index 0000000..216d27c --- /dev/null +++ b/src/partials/downloading-a-file-using-the-file-downloader-step.mdx @@ -0,0 +1,85 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Downloading a file using the File Downloader Step + +One of the ways to access a file in your build is by using the **File Downloader** Step. This Step is useful when you need to use a file in a Step input that only accepts local paths as a value. + +The Step downloads the file in a location you specify, and then every subsequent Step can access the file in that location. + + + + +1. Open the Workflow Editor. +1. Add the **File Downloader** Step to your Workflow. +1. In the **Download source url** input, add the location where the file can be found. + + :::note[Finding the download URL for an uploaded file] + + If you [uploaded the file to Bitrise](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds.html), you can find its download URL in the **Files** section of the **App settings** page. + + ::: +1. In the **Download destination path** input, specify the path where you want to download the file. It should be a path relative to the root of the repository. + + :::tip[Using an Env Var as the input value] + + You can store the filepath in an App Env Var instead of specifying it directly for the input. That way you can refer to the file through the Env Var in other Steps, you won’t have to specify the path every time. + + For example, if you store the path in the `BITRISEIO_MY_FILE_LOCAL_PATH` Env Var, you can use it as the path for the input, and also use it to access the file in every subsequent Step. + + ::: +1. Click **Save changes** in the top right corner. + + + + +1. Open the app's `bitrise.yml` file. +1. Add the `file-downloader` Step to your Workflow. + + ``` + workflows: + download: + steps: + - activate-ssh-key: {} + - git-clone: {} + - file-downloader: + inputs: + ``` +1. In the `source` input, add the location where the file can be found. + + ``` + workflows: + download: + steps: + - activate-ssh-key: {} + - git-clone: {} + - file-downloader: + inputs: + - source: "$BITRISEIO_BITRISE_TEST_URL" + ``` +1. In the `destination` input, specify the path where you want to download the file. It should be a path relative to the root of the repository. + + ``` + workflows: + download: + steps: + - activate-ssh-key: {} + - git-clone: {} + - file-downloader: + inputs: + - destination: "/" + - source: "$BITRISEIO_BITRISE_TEST_URL" + - deploy-to-bitrise-io: {} + ``` + + :::tip[Using an Env Var as the input value] + + You can store the filepath in an App Env Var instead of specifying it directly for the input. That way you can refer to the file through the Env Var in other Steps, you won’t have to specify the path every time. + + For example, if you store the path in the `BITRISEIO_MY_FILE_LOCAL_PATH` Env Var, you can use it as the path for the input, and also use it to access the file in every subsequent Step. + + ::: + + + diff --git a/src/partials/downloading-an-android-keystore-file.mdx b/src/partials/downloading-an-android-keystore-file.mdx new file mode 100644 index 0000000..38a3acb --- /dev/null +++ b/src/partials/downloading-an-android-keystore-file.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Downloading an Android keystore file + +Uploaded Android keystore files are stored in the General File Storage. You can retrieve them at any time by getting the download URL from the `android-keystore-files` endpoint. + +To call the endpoint, you need the file slug returned when [uploading the keystore file](/en/bitrise-ci/api/managing-android-keystore-files/creating-and-uploading-android-keystore-files) and the [app slug](/en/bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs). + +``` +curl -X GET "https://api.bitrise.io/v0.1/apps/APP-SLUG/android-keystore-files/ANDROID-KEYSTORE-FILE-SLUG" -H "accept: application/json" -H "Authorization: ACCESS-TOKEN" +``` + +The response will contain a `download_url` property, containing the URL in a string. You can use that URL to download the file itself. + +:::note[Availability of the `download_url`] + +Note that the `download_url` is generated only when the file’s `is_protected` attribute is false. + +::: diff --git a/src/partials/downloading-and-installing-unity-on-bitrise.mdx b/src/partials/downloading-and-installing-unity-on-bitrise.mdx new file mode 100644 index 0000000..bd31859 --- /dev/null +++ b/src/partials/downloading-and-installing-unity-on-bitrise.mdx @@ -0,0 +1,46 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Downloading and installing Unity software on Bitrise + +To be able to build a Unity project on Bitrise, you'll need to install Unity software on the virtual machine at the start of your build. This is the standard practice of running Unity software in the cloud and it only takes a few minutes. + +:::note[Xcode stacks] + +Make sure you use an Xcode stack to run Unity builds: the instructions on this page are valid for installing Unity on our Xcode stacks. + +::: + +1. Look up the Unity software version you want to download on the [Unity download archive](https://unity.com/releases/editor/archive). +1. Find the Unity Editor of the version you need, and copy its download link. + + The link will look something like this: https://download.unity3d.com/download_unity/b16b3b16c7a0/MacEditorInstallerArm64/Unity.pkg. +1. You will also need the download links for the two platform support packages (iOS and Android). You can find these on the [LTS Releases page](https://unity.com/releases/editor/qa/lts-releases). +1. Add a **Script** Step to the start of your Workflow. +1. In the **Content** input, add the curl commands to download the necessary Unity packages. For example: + + ``` + #workaround for .NET issue https://github.com/dotnet/runtime/issues/64103 + export COMPlus_ReadyToRun=0 + envman add --key COMPlus_ReadyToRun --value 0 + + #download unity pkg for Apple Silicon + curl -o ./unity.pkg http://download.unity3d.com/download_unity/8af3c3e441b1/MacEditorInstallerArm64/Unity-2021.3.12f1.pkg + + #download android support platform + curl -o ./android.pkg http://download.unity3d.com/download_unity/8af3c3e441b1/MacEditorTargetInstaller/UnitySetup-Android-Support-for-Editor-2021.3.12f1.pkg + + #download iOS support platform + curl -o ./ios.pkg http://download.unity3d.com/download_unity/8af3c3e441b1/MacEditorTargetInstaller/UnitySetup-iOS-Support-for-Editor-2021.3.12f1.pkg + ``` + + Replace the download links with the links for the versions you need. +1. Optionally, you can install a Unity software version for Apple silicon that supports [Rosetta](https://developer.apple.com/documentation/apple-silicon/about-the-rosetta-translation-environment): + + ``` + #download unity pkg for Apple Silicon with Rosetta support + curl -o ./unity.pkg http://download.unity3d.com/download_unity/8af3c3e441b1/MacEditorInstaller/Unity-2021.3.12f1.pkg + ``` + +If successful, you should be able to find Unity software at `/Applications/Unity/Unity.app/Contents/MacOS/Unity`. diff --git a/src/partials/downloading-docker-images-from-quayio.mdx b/src/partials/downloading-docker-images-from-quayio.mdx new file mode 100644 index 0000000..b9f0e02 --- /dev/null +++ b/src/partials/downloading-docker-images-from-quayio.mdx @@ -0,0 +1,42 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Downloading docker images + +1. Install [docker](https://www.docker.com/). +1. Make sure you have your `bitrise.yml` in your repository. + + You don’t have to commit it, but the file must exist in your repository’s root directory. +1. `cd` into your repository’s directory on your Mac/Linux. +1. Pull the image from its registry: + + ``` + docker pull bitriseio/android-20.04:latest + ``` +1. Run the following command: + + ``` + docker run --privileged --env CI=false --volume "$(pwd):/bitrise/src" --volume "/var/run/docker.sock:/var/run/docker.sock" --rm quay.io/bitriseio/android-20.04:latest bitrise run WORKFLOW` + ``` + + If you want to just jump into the container and experiment inside, you can replace `--rm quay.io/bitriseio/android-20.04:latest bitrise run WORKFLOW` with `-it quay.io/bitriseio/android-20.04:latest bash` to start an interactive bash shell inside the container. For example: + + ``` + docker run --privileged --env CI=false --volume "$(pwd):/bitrise/src" --volume "/var/run/docker.sock:/var/run/docker.sock" -it quay.io/bitriseio/android-20.04:latest bash + ``` + + In general, if your project is an Android project but you don’t use Android NDK, to preserve precious disk space, you should use the [quay.io/bitriseio/android](https://quay.io/repository/bitriseio/android) docker image. You can find other official Bitrise docker images on our [Quay page](https://quay.io/organization/bitriseio). In this example, we’re using the `quay.io/bitriseio/android` one. +1. Download docker images from the [Quay](https://quay.io/organization/bitriseio): + + ``` + docker pull bitriseio/android-20.04:latest` + ``` + + Be aware that this can take quite a bit of time, as this image is over 10 GB. If the download fails or hangs, you can restart it any time by running the same command again. +1. Download your Bitrise build configuration (`bitrise.yml`) to the root directory of your repository. + + You can [download]() your project’s `bitrise.yml` from the **bitrise.yml** tab of your Workflow Editor on [bitrise.io](https://www.bitrise.io). +1. In your Terminal / Command Line go to (`cd`) the root directory of your repository. Check if your `bitrise.yml` is at this location. + +If you try to reproduce an issue, you should `git clone` your repository into a NEW DIRECTORY, so that the directory will only contain the files which are committed into the repository! It’s a frequent reproducibility issue that you try to run the commands in your normal working directory, where you most likely have files which are not committed into your repository, for example, files which are in `.gitignore`. diff --git a/src/partials/downloading-workspace-invoices.mdx b/src/partials/downloading-workspace-invoices.mdx new file mode 100644 index 0000000..8a0cc83 --- /dev/null +++ b/src/partials/downloading-workspace-invoices.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Downloading Workspace invoices + +1. Sign in with an account that is an owner of the Workspace. +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Plan & billing** from the menu options. +1. Click **Manage subscription**. +1. In the dialog, select **Billing History**. + + ![download-invoice.png](/img/_paligo/uuid-95fcc51e-94c6-ec28-5d06-5578439cf173.png) +1. Select the invoice you need and click **Download**. diff --git a/src/partials/duplicating-an-existing-alert.mdx b/src/partials/duplicating-an-existing-alert.mdx new file mode 100644 index 0000000..b691b74 --- /dev/null +++ b/src/partials/duplicating-an-existing-alert.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Duplicating an existing alert + +You can duplicate any existing alert and then modify it during the alert creation process. This allows users to quickly create new alerts based on existing ones. + +To duplicate an alert: + +1. Open Insights for your app. +1. On the left, select **Alerts**. + + ![alerts.png](/img/_paligo/uuid-3c75e562-bf1f-266f-ec68-910589ed408e.png) +1. Select the alert you need and on the right, click the **View alert** button. + + ![existing-alert.png](/img/_paligo/uuid-387f919f-49c9-14ae-cb62-1bc4f47cda1e.png) +1. On the alert's page, click the ellipsis in the top right corner to open the context menu. + + ![edit-alert.png](/img/_paligo/uuid-a493c03e-ab64-9b02-748d-556fdd1c1b1a.png) +1. Select **Duplicate**. +1. The duplicate feature takes you [to the **Create alert** page](/en/insights/configuring-alerts-in-insights/creating-a-new-alert), with the existing alerts values already set. Make your changes and then click **Create** at the bottom of the page. diff --git a/src/partials/editing-a-scheduled-build.mdx b/src/partials/editing-a-scheduled-build.mdx new file mode 100644 index 0000000..18f91da --- /dev/null +++ b/src/partials/editing-a-scheduled-build.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Editing a scheduled build + +To change the configuration of a regularly scheduled build: + +1. Go to the **Builds** page of your app. +1. Find the **Scheduled builds** section and open it to view your scheduled builds. + + ![scheduled-build.png](/img/_paligo/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png) +1. Click the vertical ellipsis to open the context menu. +1. Select **Edit configuration**. + + ![edit-config.png](/img/_paligo/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png) +1. Make the changes you want and click **Save**. diff --git a/src/partials/editing-a-secret.mdx b/src/partials/editing-a-secret.mdx new file mode 100644 index 0000000..8353844 --- /dev/null +++ b/src/partials/editing-a-secret.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Editing an existing Secret + +Once you’ve added a new secret Env Var in the **Secrets** tab, you come back to it any time, modify its content or make it protected from curious eyes! + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Secrets**. +1. Click **Edit** next to the value of your Secret. +1. Modify its content as needed. +1. Click **Save**. diff --git a/src/partials/editing-an-existing-alert.mdx b/src/partials/editing-an-existing-alert.mdx new file mode 100644 index 0000000..11baa2b --- /dev/null +++ b/src/partials/editing-an-existing-alert.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Editing an existing alert + +Once an alert is in place in Insights, you can modify it at any time from the **Alerts** page. You can change the threshold, the granularity (the time period the alert applies to), or modify the notification providers. + +:::important[Metric type can't be changed] + +You can't modify the metric type that the alert monitors. For example, if the alert is monitoring build failure rate, you can't change it to monitor credit usage instead. Similarly, you can't change the filtering: if you were monitoring a specific app, you can't change the alert to monitor a different app instead. + +If you need a similar alert for a different metric or with a different filter, duplicate the existing alert: [Duplicating an existing alert](/en/insights/configuring-alerts-in-insights/duplicating-an-existing-alert). + +::: + +To edit an alert: + +1. Open Insights for your app. +1. On the left, select **Alerts**. + + ![alerts.png](/img/_paligo/uuid-3c75e562-bf1f-266f-ec68-910589ed408e.png) +1. Select the alert you need and on the right, click the **View alert** button. + + ![existing-alert.png](/img/_paligo/uuid-387f919f-49c9-14ae-cb62-1bc4f47cda1e.png) +1. On the alert's page, click the ellipsis in the top right corner to open the context menu. + + ![edit-alert.png](/img/_paligo/uuid-a493c03e-ab64-9b02-748d-556fdd1c1b1a.png) +1. Select **Edit alert**. +1. Modify the threshold, the granularity, or the notification provider. +1. Click **Save**. diff --git a/src/partials/editing-the-bitriseyml-file-locally.mdx b/src/partials/editing-the-bitriseyml-file-locally.mdx new file mode 100644 index 0000000..69e248b --- /dev/null +++ b/src/partials/editing-the-bitriseyml-file-locally.mdx @@ -0,0 +1,28 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Editing the bitrise.yml file locally + +Our YAML scheme is shared on [schemastore](http://schemastore.org/json/). This means that syntax highlight and auto-completion is available for the following files if you edit them locally: + +- `bitrise.yml` +- `step.yml` +- `bitrise.json` + +The following editors support the auto-complete feature: + +- IntelliJ IDEA +- PhpStorm +- PyCharm +- Rider +- RubyMine +- Visual Studio 2013+ +- Visual Studio Code +- Visual Studio for Mac +- WebStorm +- JSONBuddy + + ![autocomplete.png](/img/_paligo/uuid-949123a0-1356-b913-0a17-cd7270ba78c3.png) + +After editing your file locally, you can either copy its contents to the online `bitrise.yml` file or you can [store it in your own repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository). diff --git a/src/partials/editing-the-bitriseyml-file-online.mdx b/src/partials/editing-the-bitriseyml-file-online.mdx new file mode 100644 index 0000000..9956646 --- /dev/null +++ b/src/partials/editing-the-bitriseyml-file-online.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Editing the bitrise.yml file online + +You can edit your build config in yml format in the **bitrise.yml editor**. To do so, open the Workflow Editor and select **Configuration YAML** from the left navigation menu. + +![config-yaml.png](/img/_paligo/uuid-0c7ca206-84bb-e034-9ff5-3fb28c9a165d.png) + +You can edit the file directly here. Bitrise validates your configuration: if your `bitrise.yml` file is not valid, you won't be able to save the file. + +To download the current `bitrise.yml` file, click **Download**. Alternatively, you can simply select certain sections of the file and copy those into either a local `bitrise.yml` file or into another project's `bitrise.yml` file. diff --git a/src/partials/editing-your-build-configuration.mdx b/src/partials/editing-your-build-configuration.mdx new file mode 100644 index 0000000..e0a7781 --- /dev/null +++ b/src/partials/editing-your-build-configuration.mdx @@ -0,0 +1,26 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Editing your build configuration + +Your CI build configuration is defined in YAML format. The root configuration file is called `bitrise.yml`: it contains a project's entire build configuration. + +To edit the configuration on Bitrise: + +1. Open the [Bitrise CI page](https://app.bitrise.io/dashboard). +1. Select your project from the list of projects on the right. You can use the Search field to search for a specific one. + + ![project-list.png](/img/_paligo/uuid-624fc88e-8389-faf0-8638-465d3a7978ee.png) +1. Click **Workflows**. This takes you to the Workflow Editor where you can configure: + + - [Steps, Workflows, and Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.html). + - [Build stacks](/en/bitrise-build-hub/infrastructure/build-stacks.html) and [machine types](/en/bitrise-build-hub/infrastructure/build-machine-types.html). + - [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) on the project level. + - [Build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) that allow you to automatically trigger builds when a code event happens. + + :::note[Editing the YAML file directly] + + Select **Configuration YAML** to edit the configuration file directly. For detailed YAML syntax, see [Configuration YAML reference](/en/bitrise-ci/references/configuration-yaml-reference). + + ::: diff --git a/src/partials/enable-the-no-output-timeout-function-globally-for-all-steps.mdx b/src/partials/enable-the-no-output-timeout-function-globally-for-all-steps.mdx new file mode 100644 index 0000000..f212197 --- /dev/null +++ b/src/partials/enable-the-no-output-timeout-function-globally-for-all-steps.mdx @@ -0,0 +1,53 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Enabling the No Output Timeout function globally for all Steps + +:::important[Bitrise 1.50.0 or newer is required] + +You must use Bitrise 1.50.0 or a newer version to use the **No Output Timeout** function. + +::: + +To enable the **No Output Timeout** globally for all Steps: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Go to the **Secrets** tab. +1. Add a new secret Env Var: `BITRISE_NO_OUTPUT_TIMEOUT` and set its value to the number of seconds you want the build to wait for output logs before aborting. + + We recommend setting it to 600 seconds (10 minutes). + + ![app-level-secret.png](/img/_paligo/uuid-7d34c319-a1a2-05a1-90b0-ded10c048482.png) + + :::note[Aborting a hanging build automatically] + + Compared to [setting a time limit for Steps](/en/bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps.html), the **No Output Timeout** function only aborts a build no output log is generated for a set amount of time. + + Any log output will reset the timeout. This can result in a Step running longer than the value you set in `BITRISE_NO_OUTPUT_TIMEOUT`. + + ::: +1. Click **Save**. You can check the Build log of your build to determine if the function is enabled. + + ![step-force-output.png](/img/_paligo/uuid-dc3bfafa-9720-8935-557a-97c317a8a624.png) + +And that's it! From now on, whenever a Step does not produce an output log for the number of seconds you set in `BITRISE_NO_OUTPUT_TIMEOUT` , your build automatically aborts with the message: `Abort via Bitrise CLI (no output timeout)`. + +:::tip[Disabling the No Output Timeout function for a specific Step] + +If you enabled the **No Output Timeout** function globally and want to disable it for specific Steps, you can add the `no_output_timeout: 0` Step property just above the `inputs:` part of the chosen Step(s) in the `bitrise.yml`. + +For example: + +``` +steps: + - virtual-device-testing-for-ios@1: + no_output_timeout: 0 + inputs: + - zip_path: "$BITRISE_PROJECT_PATH" +``` + +::: diff --git a/src/partials/enabling-bitrise-app-for-a-group-or-an-organizational-unit.mdx b/src/partials/enabling-bitrise-app-for-a-group-or-an-organizational-unit.mdx new file mode 100644 index 0000000..d0c8382 --- /dev/null +++ b/src/partials/enabling-bitrise-app-for-a-group-or-an-organizational-unit.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Enabling Bitrise app for a group or an organizational unit + +All there is left to do on G Suite is to enable the newly created Bitrise app for a group or organization of your choice. + +1. Go to the **Web and mobile apps** page on G Suite and select **Bitrise** from the **Apps** list. +1. Click **User access** to get to the **Service status** page. +1. Select **ON for everyone** and hit **Save**. + + ![useraccess.jpg](/img/_paligo/uuid-ed1aa9a4-7926-3cfe-bf98-ac0f98a44237.jpg) diff --git a/src/partials/enabling-cloudwatch-bitrise-agent-logging.mdx b/src/partials/enabling-cloudwatch-bitrise-agent-logging.mdx new file mode 100644 index 0000000..6b86768 --- /dev/null +++ b/src/partials/enabling-cloudwatch-bitrise-agent-logging.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Enabling CloudWatch Bitrise Agent logging + +Setting up CloudWatch is optional, but we recommend doing so: it enables better build troubleshooting capabilities. Bitrise can provide you with faster support in case of an issue if you share the Bitrise Agent logs from your CloudWatch setup. + +To enable your AWS resources, such as EC2 instances, to send logs to CloudWatch, you must configure it in [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html). You need the following settings: + +- **CreatedBitriseAgentLogs**: When enabled, this setting initiates the creation of a CloudWatch log group for the log stream, along with the required role and an instance profile named `bitrise-agent-log-instance-profile`. +- **Bitrise Agent Logs Group Class**: The Bitrise Agent generates logs that are accessible to the customers in AWS. This configuration specifies what features the customer wants to use during log analysis. The default is **Infrequent access**, which provides a limited log analyzing capability at a lower cost. +- **Bitrise Agent Logs Retention In Days** (required): The days until AWS stores the Bitrise Agent logs. + +![agent-logging.png](/img/_paligo/uuid-639ad75f-9b32-7eb3-a08a-0f0a1c5035bf.png) diff --git a/src/partials/enabling-github-checks.mdx b/src/partials/enabling-github-checks.mdx new file mode 100644 index 0000000..27e6d44 --- /dev/null +++ b/src/partials/enabling-github-checks.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Enabling GitHub Checks on Bitrise + +Once [the Bitrise app is installed](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github/installing-the-bitrise-github-app-for-github-checks) on GitHub, you need to enable GitHub Checks on the project settings page on [Bitrise](https://app.bitrise.io/dashboard/builds). + +:::important[Enabling GitHub Checks is limited] + +Please note that only workspace owners and project admins can enable this toggle on the **Project settings** page of the project. + +::: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Integrations** and then go to the **Git provider** tab. +1. Scroll down and toggle on the **GitHub Checks** switch. + + :::important[Can't toggle the switch?] + + If you can't toggle the switch, check out [see topic](#section-idm4666788075920032682769339037). + + ::: +1. Trigger a build. You can do so either automatically or manually. If you trigger a build manually, provide a specific commit hash to build. + + This build is necessary to perform the first Bitrise check. Once there is a finished check, you can select Bitrise Checks in your branch protection rules. + +And you’re done! Now any pull request you open to your project on GitHub will be validated with Bitrise Checks and a build will get automatically started on Bitrise (if the [pull request trigger](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.html) is properly set on Bitrise). + +### Can't enable GitHub Checks + +There are two main reasons why you might not be able to toggle the switch to enable GitHub Checks: + +- You cannot toggle the switch unless you install the Bitrise GitHub app FIRST. Once it’s done, you can go ahead and toggle the switch to the right to enable it. +- If you have renamed or moved the GitHub repository of an app which has already been added to Bitrise and you have installed Bitrise Checks on it. The repository’s GitHub URL has obviously changed. **GitHub Checks** switch can only work if the URL on Github and on Bitrise fully match (no redirect URL is allowed). So in this case, you have to [manually update the **Repository URL** of your app](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch). diff --git a/src/partials/enabling-the-ai-code-reviewer.mdx b/src/partials/enabling-the-ai-code-reviewer.mdx new file mode 100644 index 0000000..8a3f83f --- /dev/null +++ b/src/partials/enabling-the-ai-code-reviewer.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Enabling the AI code reviewer + +To enable the AI code reviewer for a project: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Bitrise AI**. +1. Toggle **Code reviewer** on. +1. In the dialog, select the features you want to enable: + + - **Code review** + - **Walkthrough** + - **Summary** + + You must enable at least one of them. +1. Click **Save changes**. diff --git a/src/partials/enabling-the-no-output-timeout-function-for-specific-steps.mdx b/src/partials/enabling-the-no-output-timeout-function-for-specific-steps.mdx new file mode 100644 index 0000000..2fbe37d --- /dev/null +++ b/src/partials/enabling-the-no-output-timeout-function-for-specific-steps.mdx @@ -0,0 +1,50 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Enabling the No Output Timeout function for specific Steps + +:::important[Bitrise 1.50.0 or newer is required] + +You must use Bitrise 1.50.0 or a newer version to use the **No Output Timeout** function. + +::: + +You can enable the **No Output Timeout** function for specific Steps by adding the `no_output_timeout` Step property below a Step in your bitrise.yml file. + +To do so with the Workflow Editor: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Go to the **bitrise.yml** tab. +1. Search for the Step(s) where you would like to use the function. +1. Insert `no_output_timeout: 12` Step property and value just above the `inputs:` part of the chosen Step(s) to automatically abort a build if the Step does not produce an output log for 12 seconds. + + :::tip[Setting the `no_output_timeout` Step property to 0] + + You can disable the **No Output Timeout** function for a Step by setting the `no_output_timeout` Step property to 0. + + ::: + + Let's look at an example where a Script Step will always be aborted automatically: + + ``` + output_slows_down: + steps: + - script@1: + title: Output is slower and slower + no_output_timeout: 12 + inputs: + - content: |- + #!/usr/bin/env bash + for i in {1..5} + do + DURATION=$((5*i)) + echo "🏃‍step output (sleeping ${DURATION}s)" + sleep $DURATION + done + ``` + +And that's it! Now, if your Step hangs and does not produce a single output log for the number of seconds you specified in the `no_output_timeout` Step property, the build will be aborted automatically. diff --git a/src/partials/enabling-two-factor-authentication.mdx b/src/partials/enabling-two-factor-authentication.mdx new file mode 100644 index 0000000..5736dca --- /dev/null +++ b/src/partials/enabling-two-factor-authentication.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Enabling two-factor authentication + +1. Download and install [Google Authenticator](https://support.google.com/accounts/answer/1066447?hl=en) on your phone. +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. Select **Security** on the left. +1. Click on **2FA is enabled** under **Two-factor authentication**. + + ![2fa.png](/img/_paligo/uuid-cf53d41b-4a10-c359-3816-2f847f107db4.png) +1. Open your Google Authenticator and scan the QR-code that appears on your screen. +1. Enter the 6-digit code that was generated. +1. Once you have activated your 2FA and saved your recovery codes, you will receive a confirmation email from **letsconnect@bitrise.io**. diff --git a/src/partials/encrypting-your-files.mdx b/src/partials/encrypting-your-files.mdx new file mode 100644 index 0000000..d82cef7 --- /dev/null +++ b/src/partials/encrypting-your-files.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Encrypting your files + +In this example, we’ll use the **pwgen** password generator tool and **GPG** as the encryption software to encrypt a file. + +1. Open a Terminal/Command Line. +1. Create a 32 character passphrase for encryption. + + :::important[Keep the passphrase] + + You will need this passphrase to decrypt the file on Bitrise. + + ::: + + ``` + pwgen -s 32 1 + ``` +1. Encrypt your file. In this example, the file is called `my_secret_file`. + + ``` + gpg -c my_secret_file + ``` + + Optionally, you can encrypt your file(s) in a non-interactive way. + + ``` + gpg --batch --passphrase -c my_secret_file + ``` diff --git a/src/partials/enforcing-saml-sso-on-a-workspace.mdx b/src/partials/enforcing-saml-sso-on-a-workspace.mdx new file mode 100644 index 0000000..c85529b --- /dev/null +++ b/src/partials/enforcing-saml-sso-on-a-workspace.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Enforcing SAML SSO on a Workspace + +Enforcing SAML SSO on your Workspace provides an extra layer of security: you can enforce your own security guidelines to your Bitrise Workspace (for example, password format requirements, two-factor authentication). + +:::warning[Enforced SAML SSO] + +Enforcing SAML SSO in your Workspace makes SAML SSO the only way for logging in/signing up to the Workspace. + +::: + +:::caution[One Workspace only] + +You cannot be a member in two Workspaces that enforced SAML SSO on Bitrise. + +::: + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. Go to your Workspace’s **Single Sign On** tab. +1. Check the **Enforce SAML SSO** checkbox to enforce SAML SSO. + + ![enforce_saml.png](/img/_paligo/uuid-642c1745-3bb7-c296-bd5a-35a2368a3945.png) + + :::note[Unable to enforce SAML SSO] + + A Workspace owner cannot enforce SAML SSO on the Workspace if Workspace members have not enabled their SAML SSO connection yet or they enabled SAML SSO with another Workspace that enforces SAML SSO. + + ::: +1. Click **Save changes**. + +Now Workspace members can only log in via SAML SSO. diff --git a/src/partials/example-vpn-configurations.mdx b/src/partials/example-vpn-configurations.mdx new file mode 100644 index 0000000..e339252 --- /dev/null +++ b/src/partials/example-vpn-configurations.mdx @@ -0,0 +1,192 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Example VPN configurations + +In this section, we present three example configurations for connecting to a VPN during a build: + +- [Using an OpenVPN server](#UUID-c06c8ec2-9381-610c-6fed-aa196a13c81e). +- [Using Strongswan VPN](#UUID-0735a420-25a9-490f-306b-a638dc966e3e). +- [Using Cisco VPN](#UUID-8540fef2-571e-8024-d44a-9c2ed8a5ec1e). + +### Using the Connect to OpenVPN Server Step + +To use the **Connect to OpenVPN Server** Step, you need to build an OpenVPN server in advance, and then encode your certificate files and your private key. + +1. [Set up an OpenVPN Server](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-18-04). +1. Encode the following in Base64: + + - CA certificate + - client certificate + - client private key + + You can base64 encode files with the following command: + + ``` + $ base64 + ``` +1. Open your project on Bitrise and go to the Workflow Editor. +1. Register the encoded certificates and the key as [Secrets](/en/bitrise-ci/configure-builds/secrets.html). + + We recommend using the following keys as they are the default inputs for the VPN Step: + + - CA certificate: `$VPN_CA_CRT_BASE64` + - Client certificate: `$VPN_CLIENT_CRT_BASE64` + - Private key: `VPN_CLIENT_KEY_BASE64` +1. Add the **Connect to OpenVPN Server** Step to your Workflow. + + Add the Step before any Steps that might require VPN connection. +1. Add the previously created Secrets to their respective inputs: + + - **Base64 encoded CA Certificate** + - **Base64 encoded Client Certificate** + - **Base64 encoded Client Private Key** + + If you created the Secrets with the recommended keys, you do not have to change the inputs. +1. Fill in the other required inputs. + + - **Host**: the Open VPN Server IP or hostname + - **Port**: OpenVPN Server Port number + - **Protocol**: OpenVPN Server Protocol + +### Using Strongswan VPN + +This is an example script which you can either save into your repository and run it from there, or just copy paste its content into a **Script Step** in your `bitrise` configuration (`bitrise.yml` / Workflow). + +The script uses Strongswan VPN to connect to a VPN. It works on either macOS or Linux. Once the script has run successfully, any subsequent Bitrise Step can access devices and services over the VPN connection. + +``` +#!/usr/bin/env bash +set -e + +echo "WAN IP" +# This prints the servers Internet IP adress to the log, useful for debugging +curl http://httpbin.org/ip + +case "$OSTYPE" in + linux*) + echo "Configuring for Linux" + + # Variables + etc_dir=/etc + etc_sudo='sudo' # Sudo is needed for Linux Strongswan configuration + + # Install strongswan + echo "Installing Strongswan..." + sudo apt-get install -y strongswan + + ;; + darwin*) + echo "Configuring for Mac OS" + + # Variables + etc_dir=/usr/local/etc + etc_sudo='' # Sudo is NOT needed for Mac OS Strongswan configuration + + # Install Strongswan using homebrew + echo "Installing OpenSSL..." + # Manually install OpenSSL first to save time, since installing Strongswan directly compiles OpenSSL from source instead + brew install openssl + echo "Installing Strongswan..." + brew install strongswan + + ;; + *) + echo "Unknown operative system: $OSTYPE, exiting" + exit 1 + ;; +esac + + +# Method for rendering a template string file (when run, returns the input string with $VARIABLES replaced from env) +render_template() { + eval "echo \"$(cat $1)\"" +} + +# Create a temporary directory to hold files +temp_dir=/tmp/vpn-config +mkdir $temp_dir + +# IPsec config file, see examples at https://wiki.strongswan.org/projects/strongswan/wiki/IKEv1Examples and https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2Examples +echo "Downloading ipsec.conf..." +wget https://www.example.com/ipsec.conf.template -O $temp_dir/ipsec.conf.template +# IPsec credentials file, see documentation at https://wiki.strongswan.org/projects/strongswan/wiki/IpsecSecrets +echo "Downloading ipsec.secrets..." +wget https://www.example.com/ipsec.secrets.template -O $temp_dir/ipsec.secrets.template +# In some cases you might need to download the certificate, or certificate chain, of your other VPN endpoint +echo "Downloading server.crt..." +wget https://www.example.com/server.crt -O $temp_dir/server.crt + +echo "Rendering config templates" +render_template $temp_dir/ipsec.conf.template > $temp_dir/ipsec.conf +render_template $temp_dir/ipsec.secrets.template > $temp_dir/ipsec.secrets + +echo "Installing configuration" +$etc_sudo cp $temp_dir/ipsec.conf $etc_dir/ipsec.conf +$etc_sudo cp $temp_dir/ipsec.secrets $etc_dir/ipsec.secrets +$etc_sudo cp $temp_dir/server.crt $etc_dir/ipsec.d/ocspcerts/server.crt + +# Start the ipsec service +echo "Starting ipsec" +sudo ipsec start + +# We're sleeping between commands, mostly since Mac OS seems to have some problems otherwise +sleep 1 + +# Output some helpful status to the log +echo "Status ipsec" +sudo ipsec statusall + +sleep 1 + +# Switch out myconnection with the name of your connection in ipsec.conf +echo "Initiating VPN connection" +sudo ipsec up myconnection + +sleep 1 + +case "$OSTYPE" in + linux*) + ;; + darwin*) + # In Mac OS El Capitan, the `sudo ipsec up` command consistently fails the first time, but succeeds after a restart of the ipsec service + echo "Restarting ipsec" + sudo ipsec restart + + sleep 1 + + echo "Initiating VPN connection" + sudo ipsec up myconnection + + sleep 1 + + # This step might apply if you are routing all traffic trough the IPsec connection (that is, if your remote IP range is 0.0.0.0/0) + # Mac OS El Capitan seems to have problems getting the DNS configuration from the Strongswan interface. Also IPv6 sometimes causes issues. So we're manually turning off IPv6 and forcing a new DNS configuration. + echo "Disabling IPv6 and forcing DNS settings" + # Fetch main interface + main_interface=$(networksetup -listnetworkserviceorder | awk -F'\\) ' '/\(1\)/ {print $2}') + # Completely disable IPv6 + sudo networksetup -setv6off "$main_interface" + # Switch 10.0.0.1 with your DNS server + sudo networksetup -setdnsservers "$main_interface" 10.0.0.1 + ;; + *) ;; +esac + +# Your VPN connection should be up and running. Any following steps of your Bitrise workflow can access devices over your VPN connection 🎉 +``` + +### Using Cisco VPN + +You can use the **Cisco VPN connect** Step: it connects with Cisco VPN provided by VPN3000 Concentrator, Juniper/Netscreen, IOS and PIX using vpnc. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add the **Cisco VPN connect** Step at the start of your Workflow. +1. Provide VPN client settings and credentials required for the Step either by: + + - Using the existing vpnc configuration file: `vpnc.conf` + - Using the **Command line options** input of the Step. The options specified in this input will take precedence over the configuration file! + +For more information on setting up vpnc, check the [vpnc homepage](https://www.unix-ag.uni-kl.de//~massar/vpnc/) and the [vpnc manual](https://linux.die.net/man/8/vpnc). diff --git a/src/partials/examples-of-run-if-expressions.mdx b/src/partials/examples-of-run-if-expressions.mdx new file mode 100644 index 0000000..a4526b2 --- /dev/null +++ b/src/partials/examples-of-run-if-expressions.mdx @@ -0,0 +1,131 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Examples of run_if expressions + +There are many different ways of using a `run_if` expression. The following Workflow contains examples for most of them, with commented explanations. The expressions are used with **Script** Steps that, when successfully running, print that the used expression was true. + +All expressions are valid Go templates. To learn about Go templates, check out the documentation: [Go template docs](https://pkg.go.dev/text/template). + +``` +workflows: + primary: + steps: + # + # Check if an Environment Variable's value is equal to a given string + - script: + title: Run-If expression + run_if: |- + {{getenv "TEST_KEY" | eq "test value"}} + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # Use the enveq function to check if an Env Var's value is equal to a given string + - script: + title: Run-If expression + run_if: '{{enveq "TEST_KEY" "test value"}}' + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # Use envcontain to check if the value of an Env Var contains a given string. It works on the level of Pipelines, too + - script: + title: Run-If expression + run_if: '{{envcontain "TEST_KEY" "test value"}}' + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # Check if a given Env Var is NOT empty + - script: + title: Run-If expression + run_if: '{{getenv "TEST_KEY" | ne ""}}' + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # Check if two Env Vars have the same value + - script: + title: Run-If expression + run_if: '{{getenv "TEST_KEY_1" | eq (getenv "TEST_KEY_2")}}' + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # Use the available expression data properties + # like IsCI (checks if the build runs in a CI environment) or IsBuildFailed (checks if the build has failed) directly + - script: + title: Run-If expression + run_if: |- + {{.IsCI}} + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # You don't have to wrap the expression in {{...}} if it's a simple + # oneliner + - script: + title: Run-If expression + run_if: $.IsCI + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # You can even remove the $ sign, it's optional in a simple + # expression like this + - script: + title: Run-If expression + run_if: .IsCI + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # If-Else condition, in this example the Step will run if the build runs in a CI environment + - script: + title: Run-If expression + run_if: |- + {{if .IsCI}} + true + {{else}} + false + {{end}} + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # You can use multiple conditions + - script: + title: CI and Not Failed + run_if: |- + {{.IsCI | and (not .IsBuildFailed)}} + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + # + # Check if the build is a pull request or not + - script: + title: Only if NOT a pull request + run_if: not .IsPR + inputs: + - content: |- + #!/bin/bash + echo "RunIf expression was true" + - script: + title: Only if it was a Pull Request + run_if: .IsPR + inputs: + - content: |- + #!/bin/bash + echo "Pull Request ID: ${PULL_REQUEST_ID}" +``` diff --git a/src/partials/exiting-a-build-triggered-by-a-draft-pr.mdx b/src/partials/exiting-a-build-triggered-by-a-draft-pr.mdx new file mode 100644 index 0000000..48e7872 --- /dev/null +++ b/src/partials/exiting-a-build-triggered-by-a-draft-pr.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Skipping Steps triggered by a draft PR + +When you use the [draft PR function of GitHub](https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests), Bitrise inserts an Environment Variable called `GITHUB_PR_IS_DRAFT` into the build Environment Variable list. If this Env Var is available in your build Env Var list, its value is always set to `true`. + +You can use the `GITHUB_PR_IS_DRAFT` Env Var in your build as part of a conditional: for example, you can skip certain Steps in builds that are triggered by draft PRs: + +``` +workflow1: + steps: + - script: + run_if: '{{enveq "GITHUB_PR_IS_DRAFT" ""}}' + inputs: + - content: |- + #!/usr/bin/env bash + # fail if any commands fails + set -e + # debug log + set -x +``` + +In this example, the `run_if` condition means that the Step will only run if the build is NOT triggered by a draft PR. + +Yo recommend that you insert below `run_if` command to each Step in your Workflow to skip the Steps. + +:::note[Starting a new build after a draft PR] + +Clicking the **Ready for review** button on GitHub only triggers a new build on Bitrise if builds from draft pull requests are disabled. + +If draft pull requests are enabled to trigger builds and a specific draft pull request already triggered a build, submitting it for review won't trigger a new build. Any previous builds will also contain the draft PR related Env Vars. In this case, we recommend you manually start a brand new build from the website or trigger the CI with a new commit. + +::: diff --git a/src/partials/exporting-an-ad-fs-certificate.mdx b/src/partials/exporting-an-ad-fs-certificate.mdx new file mode 100644 index 0000000..7bf3828 --- /dev/null +++ b/src/partials/exporting-an-ad-fs-certificate.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Exporting an AD FS certificate + +1. You have to add a certificate generated by AD FS to the **SAML SSO provider certificate** field of the **Single Sign-On** page on Bitrise. If you’ve already created a certificate on AD FS, you can export it in PEM format from the AD FS server. If you haven’t created one yet, follow the instructions: [Obtain and Configure TS and TD Certificates for AD FS](https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-ts-td-certs-ad-fs#:\~:text=Open%20the%20AD%20FS%20Management,certificates%2C%20and%20then%20click%20OK.). +1. In **Server Manager**, click **Tools**, and select **AD FS Management**. +1. Select the **Certificates** folder on the left menu pane. +1. Click a certificate under **Token-signing**. This brings up the **Certificates** window. + + ![certtoken-1.jpg](/img/_paligo/uuid-cfe05e2a-2027-50fb-e4a8-56ef4164907f.jpg) +1. Click **Details** tab on the **Certificate** page. + + ![certificate-1.jpg](/img/_paligo/uuid-e960a587-dfa0-3b5d-aad8-6d03208a3ad6.jpg) +1. Hit **Next** on the **Certificate Export Wizard** window. + + ![certwizard.jpg](/img/_paligo/uuid-0ba8034b-4784-e042-02b9-32087bcde8d4.jpg) +1. Select the **Base-64 encoded X.509 (.CER)** the export file format. Click **Next**. + + ![baseencoded.jpg](/img/_paligo/uuid-9a300011-7818-826c-5874-c7ba6ade8176.jpg) +1. Give it a name in the **File name** field and hit **Save**. + + ![filenamesave.jpg](/img/_paligo/uuid-4510e204-8973-1a9a-0c2e-7ffc0c073aad.jpg) +1. Have a final look at your certificate settings. If you need to modify any of those, click the backward arrow next to **Certificate Export Wizard**. Otherwise, click **Finish**. Make sure you leave the AD FS window open as you will need it in a minute. + + ![completewizard.jpg](/img/_paligo/uuid-eaa066c4-99be-c8a5-9990-fe4a08a4154c.jpg) +1. Open the exported certificate by a text editor and copy/paste its content to the **SAML SSO provider certificate** field or upload the file itself from your local computer. +1. Save the settings by clicking **Configure SSO** on Bitrise. + + ![saml_sso_setup.png](/img/_paligo/uuid-26ad84be-65c7-1916-f079-6b553b4c436d.png) + + Let’s continue the SAML SSO configuration on AD FS by adding Bitrise. diff --git a/src/partials/exporting-ios-code-signing-certificates-manually.mdx b/src/partials/exporting-ios-code-signing-certificates-manually.mdx new file mode 100644 index 0000000..2afe037 --- /dev/null +++ b/src/partials/exporting-ios-code-signing-certificates-manually.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Exporting iOS code signing certificates manually + +1. Start Keychain Access. +1. On the top left sidebar select `login` and on the bottom left select `My Certificates`. +1. This will list all your installed certificates and the associated private key. +1. Select the one that you would like to export and choose `Export` from the pop-up menu. + + ![Export_certificate.png](/img/_paligo/uuid-10b69d2d-9cf7-8577-04a4-d035a5f06ad9.png) +1. Enter a filename in the Save As dialog. You can set a password and a verification to store it securely, but it’s not necessary. +1. Keychain Access will export the requested certificate in .p12 format. diff --git a/src/partials/exporting-ios-code-signing-certificates-with-xcode.mdx b/src/partials/exporting-ios-code-signing-certificates-with-xcode.mdx new file mode 100644 index 0000000..0fd7741 --- /dev/null +++ b/src/partials/exporting-ios-code-signing-certificates-with-xcode.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Exporting iOS code signing certificates with Xcode + +1. Start Xcode. +1. Select `Xcode > Preferences` from the navigation bar. +1. At the top of the window select `Accounts`. +1. Select your Apple ID and your team from the right side bar, then click on `View Details...`. +1. A dialog will appear where you will see your code signing identities and the provisioning profiles. +1. Select the certificates and choose `Export` from the pop-up menu. + + ![Export_certificate.png](/img/_paligo/uuid-a2ef477b-91fa-fd15-a651-76faeb65a665.png) +1. Enter a filename in the Save As dialog. You can set a password and a verification to store it securely, but it’s not necessary. +1. Xcode will export the requested certificate in .p12 format. diff --git a/src/partials/exporting-ios-provisioning-profiles-manually.mdx b/src/partials/exporting-ios-provisioning-profiles-manually.mdx new file mode 100644 index 0000000..92241c2 --- /dev/null +++ b/src/partials/exporting-ios-provisioning-profiles-manually.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Exporting iOS provisioning profiles manually + +1. Go to [https://developer.apple.com](https://developer.apple.com) and log in. +1. Select Certificates, Identifiers & Profiles from the left sidebar. +1. Navigate to Provisioning Profiles > All. +1. Find the Provisioning Profile you are looking for from the list or use the search to filter. +1. Click on the selected Provisioning Profile, this will expand the details. +1. If its status is invalid, you can click on the `Edit` button and save again. +1. Click on the `Download` button to download it and double click to install on your macOS. diff --git a/src/partials/exporting-ios-provisioning-profiles-with-xcode.mdx b/src/partials/exporting-ios-provisioning-profiles-with-xcode.mdx new file mode 100644 index 0000000..1ccb266 --- /dev/null +++ b/src/partials/exporting-ios-provisioning-profiles-with-xcode.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Exporting iOS provisioning profiles with Xcode + +1. Start Xcode. +1. Select `Xcode > Preferences` from the navigation bar. +1. At the top of the window select `Accounts`. +1. Select your Apple ID and your team from the right side bar, then click on `View Details...`. +1. A dialog will appear where you will see your code signing identities and the provisioning profiles. +1. Locate the profile that you are looking for under Provisioning Profiles. +1. If you don’t have it installed on the system, click on the `Download` button next to it. +1. Choose `Show in finder` from the pop-up menu, that will show you the installed provisioning profile for you. diff --git a/src/partials/exposing-a-secret-to-pull-requests.mdx b/src/partials/exposing-a-secret-to-pull-requests.mdx new file mode 100644 index 0000000..dc856b9 --- /dev/null +++ b/src/partials/exposing-a-secret-to-pull-requests.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Exposing a Secret to pull requests + +By default, pull requests do not have access to the values of Secrets. This means that if a pull request opened from a fork of a repository triggers a build, that build can't use the app's Secrets. + +If you need to grant pull request builds access to a particular Secret, you can expose that Secret to pull requests. However, even when exposed, its value won't be visible in the logs: it will be displayed as [REDACTED]. + +:::important[Protected Secrets can't be exposed] + +Once a Secret has been [made protected](/en/bitrise-ci/configure-builds/secrets/protecting-the-value-of-a-secret), you can't expose it to pull request builds. + +::: + +:::important[Public apps] + +If your app is a public app, you can't expose the app's Secrets to pull requests builds. + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Secrets**. +1. Click **Edit** next to the value of your Secret. +1. Toggle the **Expose for Pull Requests?** toggle. + +Once the Secret is exposed, pull request builds can access it. diff --git a/src/partials/exposing-env-vars-and-using-them-in-another-step-or-workflow.mdx b/src/partials/exposing-env-vars-and-using-them-in-another-step-or-workflow.mdx new file mode 100644 index 0000000..df61544 --- /dev/null +++ b/src/partials/exposing-env-vars-and-using-them-in-another-step-or-workflow.mdx @@ -0,0 +1,80 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting and managing Env Vars during a build + +You can set Env Vars during a build by defining them in a Step, typically a **Script** Step. To accomplish this, you can use the [envman](https://github.com/bitrise-io/envman/) tool. + +:::important[New Env Vars take effect from the next Step] + +Any Environment Variable you create with the `envman` tool takes effect only from the subsequent Step in the Workflow. In other words, you can't use a newly created Environment Variable in the same Step in which it was created. + +::: + +Here is a simple example where we're using `envman` to add a new Env Var with the key MY_RELEASE_NOTE: + +``` +envman add --key MY_RELEASE_NOTE --value "This is the release note" +``` + +You can call `envman` in any Step, including a **Script** Step, or even in your own script (stored in your repository) if you call it from a `bitrise` build. + +You can specify the value as the `--value` parameter, or by using pipe: + +``` +echo 'hi' | envman add --key MY_RELEASE_NOTE +``` + +You can also read the value from a file: + +``` +envman add --key MY_RELEASE_NOTE --valuefile ./some/file/path +``` + +Once the Env Var is exposed, you can use it like any other Env Var. You can use these exposed Env Vars in the inputs of other Steps as well. + +Here is an example where we’re exposing the release note Env Var and then using it in another **Script** Step and in a **Send a Slack message** Step: + +``` +workflows: + example: + steps: + - script: + inputs: + - content: | + #!/bin/bash + envman add --key MY_RELEASE_NOTE --value "This is the release note" + - script: + inputs: + - content: | + #!/bin/bash + echo "My Release Note: $MY_RELEASE_NOTE" + - slack: + inputs: + - channel: ... + - webhook_url: ... + - message: "Release Note: $MY_RELEASE_NOTE" +``` + +If you want to expose the value of an Env Var to be accessible through the key of another Env Var, you can do so. + +For example, to expose the value of `BITRISE_BUILD_NUMBER` under the key `MY_BUILD_NUMBER`: + +``` +envman add --key MY_BUILD_NUMBER --value "${BITRISE_BUILD_NUMBER}" +``` + +After this, subsequent Steps can get the value of `BITRISE_BUILD_NUMBER` from the `MY_BUILD_NUMBER` Env Var. If you change the value of `BITRISE_BUILD_NUMBER` after this, the value of `MY_BUILD_NUMBER` won’t be modified, it will still hold the original value! + +If you need to know if a custom Env Var has been defined, you can easily check it, and even overwrite its value: + +``` +#!/bin/bash +set -ex +if [ ! -z "$API_PROJECT_SCHEME" ] ; then + envman add --key PROJECT_SCHEME --value "$API_PROJECT_SCHEME" +fi +``` + +This script checks whether the `API_PROJECT_SCHEME` Env Var is defined, and if it is, its value will be assigned to the `PROJECT_SCHEME` Environment Variable, overwriting the original value of `PROJECT_SCHEME`. diff --git a/src/partials/extending-github-app-permissions-for-enterprise-server-users.mdx b/src/partials/extending-github-app-permissions-for-enterprise-server-users.mdx new file mode 100644 index 0000000..7a9e3bc --- /dev/null +++ b/src/partials/extending-github-app-permissions-for-enterprise-server-users.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Extending GitHub App permissions for Enterprise Server users + +The Bitrise GitHub App generates a short-term, temporary token for each build that is triggered via the app. This token has only one permission by default: `content:read`. This means the build can access the GitHub repository but can't do anything else. + +You can grant additional permissions for the build token by extending all the permissions of the GitHub App. For details, check out [Extending GitHub App permissions to the builds](/en/bitrise-platform/repository-access/github-app-integration/extending-github-app-permissions-to-the-builds). diff --git a/src/partials/extending-github-app-permissions-to-builds-api.mdx b/src/partials/extending-github-app-permissions-to-builds-api.mdx new file mode 100644 index 0000000..e6c3eb7 --- /dev/null +++ b/src/partials/extending-github-app-permissions-to-builds-api.mdx @@ -0,0 +1,28 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Extending GitHub app permissions to builds + +The Bitrise GitHub App generates a short-term, temporary token for each build that is triggered via the app. This token has only one permission by default: content:read. This means the build can access the GitHub repository but can't do anything else. + +You can extend these permissions so that you can perform other operations during a build. For example, this can enable users to push Git tags from their builds, create custom status reports, put a label on a pull request, or push a new version number. + +Use the `use_full_permission` parameter of the `PUT /apps/APP-SLUG/github-app-connection-configuration` endpoint to extend permissions: + +```bash +curl -X 'PUT' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/github-app-connection-configuration' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "use_full_permission_set": true +}' +``` + +:::tip[More information] + +Read more about extending permissions and how to do it on the GUI: [Extending GitHub App permissions to the builds](/en/bitrise-platform/repository-access/github-app-integration/extending-github-app-permissions-to-the-builds). + +::: diff --git a/src/partials/extending-github-app-permissions-to-the-builds.mdx b/src/partials/extending-github-app-permissions-to-the-builds.mdx new file mode 100644 index 0000000..cf12b13 --- /dev/null +++ b/src/partials/extending-github-app-permissions-to-the-builds.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Extending GitHub app permissions to the builds + +:::tip[Using the API] + +This section describes how to configure the feature on the Bitrise website. You can also configure it via the Bitrise API: [GitHub app configuration API](/en/bitrise-ci/api/github-app-configuration-api). + +::: + +The Bitrise GitHub app generates a short-term, temporary token for each build that is triggered via the app. This token has only one permission by default: `content:read`. This means the build can access the GitHub repository but can't do anything else. + +You can extend these permissions so that you can perform other operations during a build. For example, this can enable users to push Git tags from their builds, create custom status reports, put a label on a pull request, or push a new version number. + +:::important[Linked repositories] + +When extending permissions, you extend permissions to all [additional linked repositories](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories) as well! + +::: + +The exact permissions you can extend depends on your GitHub account: + +- On GitHub Cloud, the GitHub app has the following permissions: + + - Read access to issues and metadata + - Read and write access to checks, code, commit statuses, and pull requests +- [GitHub Enterprise Server](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise) users define their GitHub app permissions when creating the app. + +To extend the permissions: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. Select **Repository** from the menu. +1. Find the **Extend GitHub App permissions to builds** option and toggle it on. This extends permissions to the default repository and all additional linked repositories, too. diff --git a/src/partials/extending-the-availability-of-remote-access.mdx b/src/partials/extending-the-availability-of-remote-access.mdx new file mode 100644 index 0000000..fb6056f --- /dev/null +++ b/src/partials/extending-the-availability-of-remote-access.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Extending the availability of remote access + +Remote access is available while the build is running and for 10 minutes after the build is finished. If this is not enough, there’s a simple workaround to make sure remote access is available for a longer time. + +1. Add a **Script** Step after the Step that causes the build to fail. +1. Toggle the **Run if previous Step failed** option on to ensure the **Script** Step always runs. +1. Add a command to let the build “sleep” for a time specified in seconds: + + `sleep 5400` + + This example lets the build run for 90 minutes. It should be no more than your build time limit, of course. + +That’s it. While the build is still running, you can look around on the virtual machine for the possible issues that caused it to fail. diff --git a/src/partials/fetching-and-exchanging-tokens-with-gcp.mdx b/src/partials/fetching-and-exchanging-tokens-with-gcp.mdx new file mode 100644 index 0000000..74022a4 --- /dev/null +++ b/src/partials/fetching-and-exchanging-tokens-with-gcp.mdx @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Fetching and exchanging tokens with GCP + +After you successfully configured a workload identity pool and connected it to a Google service account, your Bitrise builds can exchange tokens with GCP. You can: + +- Use the **Authenticate with GCP** Step to handle the whole process. +- Fetch the token with **Get OIDC Identity Token** Step, then perform the credential exchange with a script. + +:::note[Information in the OIDC token] + +Bitrise includes the following claims in the OIDC token: [Information in the OIDC token](/en/bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview/authentication-to-external-services-with-oidc/information-in-the-oidc-token). + +::: + +### Using the Authenticate with GCP Step + +1. Open the Workflow Editor on Bitrise. +1. Add the **Authenticate with GCP** Step to your Workflow. +1. Set the **Client config** and the **Token audience** inputs: + + - The token audience should match the allowed audience you set when configuring the workload identity pool on Google Cloud. + - The **Client config** input should point to the file you downloaded at the end of the process. + +### Using the Get OIDC Identity token Step + +1. Open the Workflow Editor on Bitrise. +1. Add the **Get OIDC Identity Token** Step to your Workflow. +1. Use the BITRISE_IDENTITY_TOKEN Environment Variable: write it to a file and update the [client library configuration file](/en/bitrise-platform/integrations/oidc-authentication/oidc-for-gcp/connecting-a-google-service-account-to-the-workload-identity-pool) to reference the file containing the Env Var. You can set this up in a **Script** Step: + + ``` + tmpfile="$(mktemp)" + printf '%s' "$BITRISE_IDENTITY_TOKEN" > "$tmpfile" + + # Replace the token path in client library configuration + + gcloud auth login --cred-file=/path/to/updated-client-library-config.json + gcloud auth list + ``` + + After, the gcloud CLI will automatically pick them up and use them. Any kind of action through the CLI will just simply work. diff --git a/src/partials/fetching-and-exchanging-tokens.mdx b/src/partials/fetching-and-exchanging-tokens.mdx new file mode 100644 index 0000000..099b469 --- /dev/null +++ b/src/partials/fetching-and-exchanging-tokens.mdx @@ -0,0 +1,67 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Fetching and exchanging tokens + +After you successfully configured an OIDC identity provider with a custom trust policy on AWS, your Bitrise builds can exchange tokens with the service of your choice. You can: + +- Use the **Authenticate with AWS** Step to handle the whole process. +- Fetch the token with **Get OIDC Identity Token** Step, then perform the credential exchange with a script. + +:::note[Information in the OIDC token] + +Bitrise includes the following claims in the OIDC token: [Information in the OIDC token](/en/bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview/authentication-to-external-services-with-oidc/information-in-the-oidc-token). + +::: + +### Using the Authenticate with AWS Step + +The **Authenticate with AWS** Step requests an OIDC token and performs the credential exchange with AWS. That means you don't have to create your own script to perform the authentication, the Step will handle it for you. + +1. Open the Workflow Editor on Bitrise. +1. Add the **Authenticate with AWS** Step to your Workflow. +1. Set the **Token audience** input to `sts.amazonaws.com`. +1. Set the **AWS Role ARN** to the value of the IAM role ARN that you created earlier. + + :::tip[Docker login] + + Another convenience feature of the Step is that it can log in Docker to the EC2 Container Registry automatically. Find the **Docker** input group in the Step configuration, and set it to `true`. + + This is only supported on Linux stacks. + + ::: + +### Using the Get OIDC Identity Token Step + +1. Open the Workflow Editor on Bitrise. +1. Add the **Get OIDC Identity Token** Step to your Workflow. +1. Set the **Token audience** input to `sts.amazonaws.com`. +1. Use the BITRISE_IDENTITY_TOKEN Environment Variable: it can be fed to any CLI tool or API endpoint. + + You can create a script in a **Script** Step to perform the token exchange and extract credentials from the response. You'll need three Env Vars as credentials: + + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_SESSION_TOKEN + + After they are exported, the AWS CLI will automatically pick them up and use them. Any kind of action through the CLI will just simply work. + + For example, getting short term credentials and printing the current authenticated session details with the AWS CLI would look like this: + + ``` + # Perform the token exchange and save the response + AWS_RESPONSE=$(aws sts assume-role-with-web-identity \ + --role-arn "arn:aws:iam::065600603509:role/OIDC-TEST" \ + --role-session-name "bitrise-${BITRISE_BUILD_NUMBER}" \ + --web-identity-token "$BITRISE_IDENTITY_TOKEN" \ + --output json) + + # Extract the credentials from the reponse + export AWS_ACCESS_KEY_ID=$(echo "$AWS_RESPONSE" | jq -r '.Credentials.AccessKeyId') + export AWS_SECRET_ACCESS_KEY=$(echo "$AWS_RESPONSE" | jq -r '.Credentials.SecretAccessKey') + export AWS_SESSION_TOKEN=$(echo "$AWS_RESPONSE" | jq -r '.Credentials.SessionToken') + + # The AWS cli will automatically pick up the env vars from the section above + aws sts get-caller-identity + ``` diff --git a/src/partials/file-count-limit-on-provisioning-profiles.mdx b/src/partials/file-count-limit-on-provisioning-profiles.mdx new file mode 100644 index 0000000..12713c5 --- /dev/null +++ b/src/partials/file-count-limit-on-provisioning-profiles.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## File count limit on provisioning profiles + +The maximum number of provisioning profiles and .p12 certificates you can upload to the **Code Signing** tab on Bitrise is 30. If you’ve already reached this limit and wish to use even more, then here are a few tips on how to use even more provisioning profiles: + +- Use a Step with automatic provisioning, such as **Xcode Archive and Export for iOS**, **Export iOS and tvOS Xcode Archive**, **Xcode build for testing for iOS** , or **Manage iOS Code Signing**. These Steps only require the code signing identities (certificates with .p12 extension) to be uploaded to Bitrise. You can download the provisioning profiles from the Apple Developer portal on-the-fly during the build if you have [connected your Apple Developer account to Bitrise](/en/bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key.html). +- You can create a .zip file containing the required certificates/profiles. In this case, you don’t need to upload any certificates/profiles on Bitrise. During the build you can download the .zip file and update the certificate/profile related inputs of the **Certificate and Profile Installer** Step to match the path to the certificate/profile on the build machine. Note that the **Certificate and Profile Installer** Step supports local paths and URLs for certificates and profiles. +- You can host the profiles and certificates yourself, and only add an URL that is pointing to a given certificate/profile to the workflow. + +Also note that multiple URLs can be specified for both the certificate and profile inputs. Make sure you separate them with a pipe (`|`) character. diff --git a/src/partials/finding-a-build-log.mdx b/src/partials/finding-a-build-log.mdx new file mode 100644 index 0000000..bb75430 --- /dev/null +++ b/src/partials/finding-a-build-log.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Finding a build log + +When you run a build, a build log is generated automatically. Every build has its own log, with its own unique build log URL. The build log URL contains the build slug: a hexadecimal identifier for a specific build. + +:::note[Assisting Bitrise Support] + +When Bitrise Support asks for your build logs, the best thing to do is send the build URL. + +::: + +1. Open the [Bitrise CI](http://app.bitrise.io/dashboard) page and select your project from the project list. +1. Select the build you want to check out. +1. Make sure you have the **Log** tab selected. +1. On the **Log** tab, you can see the Steps of the Workflow and their status. By default, all failed Steps are expanded. + + ![build-log-basic.png](/img/_paligo/uuid-9bc938b1-ce78-a66a-d1d8-aa18ee948134.png) +1. Expand any Step's info by clicking the downward arrow on the right to the Step. This will show the relevant part of the build log. diff --git a/src/partials/finding-flaky-tests.mdx b/src/partials/finding-flaky-tests.mdx new file mode 100644 index 0000000..fc2abb6 --- /dev/null +++ b/src/partials/finding-flaky-tests.mdx @@ -0,0 +1,57 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Finding flaky tests + +When you open Bitrise Insights, you start on the **Overview** page. From here, you can go to either the **Bottlenecks** page, which lists the top 3 most flaky tests, or you can go to the **Tests** page under the **EXPLORE** section to list and filter all your flaky tests. This will help you track and investigate flaky tests. + +You can identify and quarantine flaky tests with [some of our testing Steps](https://docs.bitrise.io/en/bitrise-ci/testing/detecting-and-quarantining-flaky-tests.html). + +Let’s check the **Bottlenecks** page first. When you open the **Bottlenecks** page you’ll see all the negative trends and issues Bitrise Insights detected in the last 7 days. When you’re checking flaky tests you can use the **Flakiness** section: + +![flakiness-bottlenecks.png](/img/_paligo/uuid-f995aafc-a3ef-b1d1-5d31-751c5507e60a.png) + +This **Bottlenecks** section lists the test cases which had the most flaky runs in the last 7 days. Click on any of them and you’ll land on the relevant section of the **Tests** page. + +Another way to go about it, is to go to the **Tests** page and switch to the **Flaky runs** metric tab: + +![flaky-runs-tab.png](/img/_paligo/uuid-3bbc4214-3819-7b12-200a-d211bc965b7e.png) + +Just like on any other **Tests** metric pages, you’ll see two charts. The upper chart always shows you data for the filters you set. The lower chart is called the breakdown chart and it shows you data “one level deeper” than what you filtered on. + +If you only have a single app in your Workspace, Bitrise Insights will automatically select that app when you open any of the Explore pages. If you have multiple apps in your workspace, when you open the **Tests** page, the upper chart will show you the overall flaky runs of the workspace across all of your apps in that specific workspace. + +The lower chart in this case shows you the same data but on a per app basis. From this you can see which app had the most flaky runs in the selected time period: + +![flakiest-app.png](/img/_paligo/uuid-9b72d008-6924-060b-2efc-96f96390b627.png) + +Here, on the breakdown chart you can see that we have this application which had the most amount of flaky test runs in this workspace. Filter down to that app, and on the next level you'll find the per test suite breakdown: + +The upper chart now shows selected filters view, which in this case is the selected app's flaky test runs. On the lower breakdown chart, you can see which the test suite which had the most flaky test runs: + +Let's filter down to that test suite to investigate it a little further: + +![flakiest-test-suite.png](/img/_paligo/uuid-7c7f36d3-3226-2a6c-3549-cd3321895ef1.png) + +The upper chart now reflects this filtering, and the breakdown chart switched over to per branch flaky runs. Under the graphs you can see the **Test cases** list, which is filtered based on the filters that you set at the top and also on the time/date range that you set in the top right corner. + +Using this **Test cases** table you can find which test case is flaky most frequently (**Flaky rate**) or which test case had the most amount of flaky runs (**Flaky runs**) in the selected time period, app, and test suite. + +![test-cases-list.png](/img/_paligo/uuid-4775415f-854a-3e11-430a-34c233f7fc5f.png) + +Select the test case which had the most flaky runs to continue your investigation. + +This will set the relevant filters for you to focus only on this specific test case. As a result, the charts at the top will now only show the flaky run trends of this specific test case. + +Under the charts, Bitrise Insights automatically switched over to the **Related test case runs** tab: + +![related-test-cases-runs-tab.png](/img/_paligo/uuid-b53b6a0d-3e15-8891-131e-9c1b5637f0bc.png) + +The **Related test case runs** table lists the specific executions of the test case which had inconsistent results, either in a given build, or across builds with the same commit hash. As you can see on this example, the **testFlakyFeature()** test case had both successful and failed results for the same commit (for commit `f74ca14` and also for `c84f1fd`). + +Using the **Related test case runs** table you can see all the previous flaky runs of this specific test case, how long that run was and whether it was successful or not. Using the buttons in the test run popup you can quickly jump to the relevant build’s page and to the relevant test report’s page and then continue your investigation there: + +![case-report-card.png](/img/_paligo/uuid-603588f5-3a76-1594-bd18-53063a966a21.png) + +Keeping an eye on and fixing flaky tests helps you to reduce time waste during the app development process and to increase the overall test confidence of the team. diff --git a/src/partials/finding-frequently-failing-builds.mdx b/src/partials/finding-frequently-failing-builds.mdx new file mode 100644 index 0000000..22fd7fd --- /dev/null +++ b/src/partials/finding-frequently-failing-builds.mdx @@ -0,0 +1,39 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Finding frequently failing builds + +When you open Bitrise Insights, you can find the **Build failure** rate chart on the **Overview** page. + +Here you can see your overall build failure rate trend in the whole Workspace and you can also see the top 5 most frequently failing apps' build failure rate trends. + +From here you can continue your investigation using either the View details button or by clicking the **Builds** page under the **EXPLORE** section in the left sidebar. + +After you open the **Builds** page switch to the **Failure rate** tab. + +![failure-rate-tab.png](/img/_paligo/uuid-605f48bd-0c0c-9003-4605-0b682c26dc57.png) + +On the **Builds** page, depending on which filters are applied, you can start from the Workspace level which you can see on the upper chart. Using the intelligent breakdown (the 2nd, lower chart) you can drill into the data to find which application, which workflow, which step is causing the build failure rate trend that you are checking. + +Let's go through an example. Here on the breakdown chart you can see that we have this application which is failing most frequently in this Workspace: + +![most-failing-app.png](/img/_paligo/uuid-80961ec0-a95b-8cce-6af1-263d07fcc5a4.png) + +Filter down to that application, and on the next level you'll find the per Workflow breakdown. + +The upper chart now shows what is filtered on, so in this case it's the selected app's failure rate. On the lower, breakdown chart you can see which is the Workflow which fails most frequently. + +Let's filter down to that Workflow: + +![workflow-breakdown-chart.png](/img/_paligo/uuid-211085d7-b298-e040-1432-189aa06bca6c.png) + +The upper chart now reflects this filtering, and the breakdown chart switched over to per Step failure rate. Using the breakdown chart you can find out which Step is causing the failure rate trend that we are investigating. + +Under the graphs you can also see the build history which is filtered based on the filters that you set at the top and also on the time range that you set in the top right corner. + +Hovering on the bars you can see how long specific Steps took and in which build that step failed. + +When you find the builds which correlate with the trend that you're checking then you can quickly jump to the relevant build's page and then continue your investigation there. + +![failed-build-history.png](/img/_paligo/uuid-6507d4b6-e17c-fe9a-7fcf-286e99bf5447.png) diff --git a/src/partials/finding-frequently-failing-tests.mdx b/src/partials/finding-frequently-failing-tests.mdx new file mode 100644 index 0000000..c0f8ea9 --- /dev/null +++ b/src/partials/finding-frequently-failing-tests.mdx @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Finding frequently failing tests + +When you open Bitrise Insights, you can start with the Build failure rate chart on the **Overview** page to find the most frequently failing apps and builds. If you’re only interested in tests, you can switch to the **Tests** page under the **EXPLORE** section in the left sidebar. + +After you open the **Tests** page, switch to the **Failure rate** tab. + +![test-failure-rate-tab.png](/img/_paligo/uuid-fd3ff35c-c57e-151a-20ad-8170daf832dd.png) + +On all of the **Tests** metric pages. you’ll see two charts. The upper chart always shows you data for the filters you set. The lower chart is called the breakdown chart and it shows data one level deeper than what you filtered on. + +If you have only a single app in your Workspace then Insights will automatically select that app when you open any of the Explore pages. However, if you have multiple apps in your Workspace, when you open the **Tests** page the upper chart it will show you the overall test failure rate of the Workspace — based on test suite failure rates in all of your apps in the workspace.The lower chart, in this example, shows you the same data — but on a per-application basis. From this you can see which app’s test suites are failing the most. + +Here’s a working example. On the breakdown chart, you can see the application that has the most frequently failing test suites in the Workspace. When filtering down into that app, you'll find the per test suite breakdown: + +![most-failing-app-test.png](/img/_paligo/uuid-c46c2c36-ef48-dd8e-7fd4-d025a8c1403d.png) + +The upper chart now shows what is filtered — so in this case, the selected app's test suite failure rate is being displayed. On the lower, breakdown chart, you can see which test suite failed most frequently. + +Let's filter down to that test suite. + +![filter-test-suite.png](/img/_paligo/uuid-0fffb4e5-f4e4-037e-3378-fde21e261acb.png) + +The upper chart now reflects this filtering, and the breakdown chart switched over to per branch failure rate. Under the graphs, you can see the **Test cases** list, which is filtered based on the filters that you set at the top and also on the time range that you set in the top right corner. + +Using this **Test cases** table, you can find which test case is failing most frequently (**Failure rate**) or which test case failed the most amount of times (**Failure count**) in the selected time period, app, and test suite. + +![test-case-history.png](/img/_paligo/uuid-704db8ad-4a9b-ce01-8631-97ca9682edcc.png) + +Select the most frequently failing test case to continue your investigation. + +This will set the relevant filters for you to focus only on this specific test case. As a result, the charts at the top will now only show the failure rate trend of this specific test case. + +Under the charts, the Insights filter automatically switched over to the **Related test case runs** tab: + +![related-test-cases.png](/img/_paligo/uuid-7d85c0ea-4806-d797-750e-ef3b092eb2db.png) + +Using the **Related test case runs** table, you can see all the previous runs of this specific test case, how long that run was, and whether it was successful or not. Using the buttons on the right side you can quickly jump to the relevant build’s page and to the relevant test report’s page and then continue your investigation there: + +Keeping an eye on and improving your test failure rate helps you to reduce wait time during the app development process and to increase the efficiency and productivity of your team. diff --git a/src/partials/finding-slow-builds.mdx b/src/partials/finding-slow-builds.mdx new file mode 100644 index 0000000..18f8dc3 --- /dev/null +++ b/src/partials/finding-slow-builds.mdx @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Finding slow builds + +So, how can you monitor your build time and how can you diagnose and improve them using Bitrise Insights? + +When you open Bitrise Insights you can find the **Successful build time** chart on the **Overview** page. Here you can see your overall build time trends in the whole Workspace and you can also see the top 5 slowest apps' build time trends. + +From here you can continue your investigation using either the **View details** button or by clicking the **Builds** page under the **Explore** section in the left sidebar: + +![builds-explore.png](/img/_paligo/uuid-c73e996d-b1f3-422a-f317-5ec31fedcd68.png) + +When you open the **Build Explore** page there are two relevant [metrics](/en/insights/available-metrics-in-insights/bitrise-ci-metrics.html) you can check related to build times. The **Top build time (p90)**, which is the 90th percentile, and the **Typical build time (p50)**, which is the 50th percentile. + +:::note[Percentile definitions] + +50th percentile means that out of a hundred builds the 50th slowest one took this long to finish. The 90th percentile means that out of a hundred builds 90 finished around this time or faster. + +::: + +On the **Build Explore** page, you can start from the Workspace level, which you can see on the upper chart if there are no filters applied. Using the intelligent breakdown (the 2nd chart) you can drill into the data to find which application, which Workflow, and which Step is affecting the build time trend that you are checking. + +Let's go through an example. Here on the breakdown chart, you can see that we have this application which is the slowest in this Workspace: + +![explore-builds-example.png](/img/_paligo/uuid-1789f853-23db-4863-8ecc-70e6a837ad2f.png) + +Filter down to that app in the dropdown menu on the top left, and on the next level, you'll find the per Workflow breakdown. The upper chart now shows you what is filtered on, so in this case, it's the selected app's p90 build time. + +On the lower breakdown chart, you can see which Workflow takes the longest. + +Let's filter down to that Workflow. + +![filter-by-workflow.png](/img/_paligo/uuid-f1483521-2b52-d69c-9cbb-ae0eff053094.png) + +The upper chart now reflects this filtering, and the breakdown chart switched over to per-step build times. Using the breakdown chart you can find out which Step is causing the build time trend that we are investigating. + +Under the graphs, you can also see the build history which is filtered based on the filters that you set at the top and also on the time range that you set in the top right corner. + +When you find the builds that correlate with the trend that you're checking then you can quickly jump to the relevant build's page and then continue your investigation there: + +![build-history.png](/img/_paligo/uuid-ac92de93-beb4-8a7d-d28c-0fe5cc8296b8.png) diff --git a/src/partials/finding-your-files-on-the-vm.mdx b/src/partials/finding-your-files-on-the-vm.mdx new file mode 100644 index 0000000..b5f8498 --- /dev/null +++ b/src/partials/finding-your-files-on-the-vm.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Finding your files on the VM + +Once you successfully logged in to the Bitrise virtual machine that ran your build, you can dive into the files themselves to see what’s happening in real time. After Bitrise finished cloning your app on to the VM, you can always access it at the following location: + +``` +/Users/Vagrant/git +``` diff --git a/src/partials/following-a-build-log-live.mdx b/src/partials/following-a-build-log-live.mdx new file mode 100644 index 0000000..314066f --- /dev/null +++ b/src/partials/following-a-build-log-live.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Following a build log live + +You can check the log of a build live - that is, while the build is running. What’s more, you can even follow the log as the build is happening. That means that as the build progresses, the log will automatically scroll to the new sections as they appear. + +To do so: + +1. Start a build. +1. Go to the build’s page. +1. Scroll down to the log. +1. Click **Follow**. + + ![Build_logs.png](/img/_paligo/uuid-f0843f8b-8b7d-e417-cbee-54224507d25a.png) + +To stop following, you just need to manually navigate anywhere within the log. You can restart following any time. diff --git a/src/partials/formatting-your-annotations.mdx b/src/partials/formatting-your-annotations.mdx new file mode 100644 index 0000000..2c0e4e8 --- /dev/null +++ b/src/partials/formatting-your-annotations.mdx @@ -0,0 +1,50 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Styling and formatting your annotations + +Build annotations are a snippet of Markdown. The basic style of the snippet is determined by the `--style` flag of the annotation command. The possible values are: + +- `default`: +- `warning`: +- `error`: + +![annotation-styles.png](/img/_paligo/uuid-913fb5c6-4636-158b-0e87-8458323e0987.png) + +The annotations accept Markdown syntax. In addition to simple formatting, it also supports code blocks, using the ~ character or four-space indentation: + +``` +bitrise :annotations annotate " +~~~ +This is a codeblock +~~~ +" + +bitrise :annotations annotate " + This is also a codeblock +" +``` + +You can add expandable elements to your annotations: + +![annotations-expand.gif](/img/_paligo/uuid-b72c807f-04d5-72e5-9c85-670efa9bb40a.gif) + +- Place your content in a details tag to collapse it by default. +- If you want the card to be open by default, use details open. +- Use a summary tag to let users know what is inside the section. +- You can include headers, images, code blocks, and more inside a collapsed section. + +``` +
+ +Example summary + +### You can add a header + +You can add text within a collapsed section. + +You can add an image or a code block, too. + +
+``` diff --git a/src/partials/further-questions-in-compliance-and-security.mdx b/src/partials/further-questions-in-compliance-and-security.mdx new file mode 100644 index 0000000..a566a5f --- /dev/null +++ b/src/partials/further-questions-in-compliance-and-security.mdx @@ -0,0 +1,7 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Further questions in Compliance and Security? + +[Find out more here](https://bitrise.io/platform/devops/security). diff --git a/src/partials/generating-a-code-signing-certificate-manually.mdx b/src/partials/generating-a-code-signing-certificate-manually.mdx new file mode 100644 index 0000000..c805182 --- /dev/null +++ b/src/partials/generating-a-code-signing-certificate-manually.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Generating a code signing certificate manually + +1. Open your **Keychain Access** app on macOS. +1. Select **Keychain Access** > **Certificate Assistant** > **Request a Certificate From a Certificate Authority…** +1. Fill in the **User’s Email Address** and the **Common Name** and select **Saved to Disk**. +1. Click on **Continue** and save the generated `certSigningRequest` file locally. + + ![Certificate_Assistant.png](/img/_paligo/uuid-733ce0c0-f282-d8fc-a96e-6f3652aac049.png) +1. Go to [https://developer.apple.com](https://developer.apple.com) and log in to your account. +1. Select **Certificates, IDs & Profiles** from the left sidebar. +1. Go to **Certificates** and click on the **+** button on the top right corner. +1. Select **iOS App Development** and click **Continue**. +1. On the next page you see the instructions for creating the `certSigningRequest` file. Click **Continue**. +1. Upload the created `certSigningRequest` to the form and click **Continue**. It will generate your code signing certificate for you. +1. Download the certificate and double click to install it. Once installed it will be added to your **Keychain Access** app. diff --git a/src/partials/generating-a-code-signing-certificate-with-xcode.mdx b/src/partials/generating-a-code-signing-certificate-with-xcode.mdx new file mode 100644 index 0000000..dc53721 --- /dev/null +++ b/src/partials/generating-a-code-signing-certificate-with-xcode.mdx @@ -0,0 +1,28 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Generating a code signing certificate with Xcode + +First you have to add your Apple ID to Accounts preferences in Xcode. If you are already done with this, you can skip to [Selecting your Apple ID](#N1636036545174). + +1. Start Xcode. +1. Select **Xcode > Preferences** from the navigation bar. +1. At the top of the window select **Accounts**. +1. Click on the **+** on the lower left corner and select **Add Apple ID…** + + ![Adding_Apple_ID.png](/img/_paligo/uuid-b94ebc99-20bb-22e8-f056-568f725fff85.png) +1. A dialog will appear. Add your Apple ID and your password, then select **Sign in**. If you don’t have an account you can create your Apple ID by selecting **Create Apple ID**. + + ![Sign_in_to_Xcode.png](/img/_paligo/uuid-0ea2f6c9-aea8-8ba8-cad7-303666747894.png) +1. Select your Apple ID and your team from the right side bar, then click on **View Details…**. +1. A dialog will appear where you will see your code signing identities and the provisioning profiles. + + ![Xcode_team_details.png](/img/_paligo/uuid-46cdbdfc-b373-9709-b953-2ae3887f1543.png) +1. Under the signing identities locate the **iOS Development** and **iOS Distribution** profiles. If you have not created them you will see a **Create** button next to them. Simply select it and Xcode will issue and download your code signing identities for you. + +:::note[When to click **Reset** next to Code Signing Identities] + +If you already have Code Signing Identities issued, you will see a **Reset** button next to them. You can issue new certificates with it, that Xcode will generate and download, however note that this will invalidate your previous certificate, so only do this if you’ve lost those files or if you know what you are doing! + +::: diff --git a/src/partials/generating-a-provisioning-profile-manually.mdx b/src/partials/generating-a-provisioning-profile-manually.mdx new file mode 100644 index 0000000..305b9ad --- /dev/null +++ b/src/partials/generating-a-provisioning-profile-manually.mdx @@ -0,0 +1,30 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Generating a provisioning profile manually + +To generate a provisioning profile manually, you need a working Apple Developer account, and you need to set up an App ID for your project. + +### Setting up an App ID + +1. If you haven’t already created an App ID for your project, go to [https://developer.apple.com](https://developer.apple.com) and log in. +1. Select **Certificates, Identifiers & Profiles** from the left sidebar. +1. Navigate to **Identifiers > App IDs**. +1. In the **App ID Description** add a recognizable name for your App ID. +1. Select **Explicit App ID** and add your bundle identifier to the field. +1. Select any additional **App Services** that you need. +1. Click **Continue**. + +### Generating a provisioning profile + +1. Go to [https://developer.apple.com](https://developer.apple.com) and log in. +1. Select **Certificates, Identifiers & Profiles** from the left sidebar. +1. Navigate to **Provisioning Profiles > All**. +1. Select the **+** from the top right corner. +1. For development select the correct project type under `Development`, or for distribution select the correct one under `Distribution` and click continue. +1. Select the App ID you would like to use. +1. Select the certificates you wish to include in the provisioning profile. These certificates will be able to build with this profile; click **Continue**. +1. Select all the devices you would like to use with this profile and click continue. +1. Name your provisioning profile and click **Continue**. +1. Your profile is generated. You can download it to your device and double click to install it on your Mac. diff --git a/src/partials/generating-a-provisioning-profile-with-xcode.mdx b/src/partials/generating-a-provisioning-profile-with-xcode.mdx new file mode 100644 index 0000000..a4f6283 --- /dev/null +++ b/src/partials/generating-a-provisioning-profile-with-xcode.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Generating a provisioning profile with Xcode + +Xcode will automatically generate an App ID for your project, that matches your unique bundle ID for your project. An App ID is used to identify one or more of your apps. It can be an explicit App ID that only matches one unique bundle identifier or a wildcard App ID that can match multiple ones. + +Xcode will also create a Team Provisioning Profile for your project automatically, so you can start deploying to your device automatically. + +If you hit any issues you should make sure that the device is eligible, for example if the device doesn’t match the deployment target you will get an error. Also make sure that your app is connected to the correct Team. + +To generate a provisioning profile using Xcode: + +1. Select your project file from Xcode’s project navigator. +1. Go to the **Signing** section and under the **Team** select your correct team. + + ![Team_selector.png](/img/_paligo/uuid-ab2b08b0-8e9c-decb-e628-df8893aecb94.png) +1. Build your project in Xcode. + +To download a provisioning profile from Xcode: + +1. Start Xcode. +1. Select **Xcode > Preferences** from the navigation bar. +1. At the top of the window select **Accounts**. +1. Select your Apple ID and your team, then select **Download Manual Profiles**. +1. Go to `~/Library/MobileDevice/Provisioning Profiles/` and your profiles should be there. diff --git a/src/partials/generating-an-android-app-bundle-file.mdx b/src/partials/generating-an-android-app-bundle-file.mdx new file mode 100644 index 0000000..4b989f7 --- /dev/null +++ b/src/partials/generating-an-android-app-bundle-file.mdx @@ -0,0 +1,134 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Generating an Android App Bundle file + +You can create an Android App Bundle with either the **Gradle Runner** Step or with the **Android Build** Step. + +### Using the Gradle Runner Step + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Insert the **Gradle Runner** Step after the **Android Unit Test** and **Android Lint** Steps in your Workflow. +1. Click the **Config** section of **Gradle Runner**. +1. In the **Gradle task to run** input field, set, for example, `bundleRelease` or `bundleDebug` to create a bundle of your project. + + ![Generating_and_deploying_Android_app_bundles.jpg](/img/_paligo/uuid-b0a21607-f817-bdff-5480-e82a6f9a0152.jpg) + + :::tip[APK and AAB in the same Workflow] + + If you wish to generate an Android App Bundle and an APK in one Workflow, you can specify an additional task in the **Gradle task to run** input field: set the input value to `bundleRelease assembleRelease` to generate release versions. + + ::: + + + + +1. Open your app's Configuration YAML file. +1. Insert the `gradle-runner` Step after the `android-unit-test` and `android-lint` Steps in your Workflow. + + ``` + my-workflow: + steps: + - activate-ssh-key: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone: {} + - install-missing-android-tools: {} + - android-lint: {} + - android-unit-test: {} + - gradle-runner: + ``` +1. In the `gradle_task` input of `gradle-runner`, set, for example, `bundleRelease` or `bundleDebug` to create a bundle of your project. + + ``` + my-workflow: + steps: + - activate-ssh-key: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone: {} + - install-missing-android-tools: {} + - android-lint: {} + - android-unit-test: {} + - gradle-runner: + inputs: + - gradle_task: bundleRelease + ``` + + :::tip[APK and AAB in the same Workflow] + + If you wish to generate an Android App Bundle and an APK in one Workflow, you can specify an additional task in the `gradle_task` input field: set the input value to `bundleRelease assembleRelease` to generate release versions. + + ::: + + + + +This way the Step will generate an Android App Bundle instead of an APK. + +### Using the Android Build Step + +You can generate an Android App Bundle for your Android app with our **Android Build** Step as well: + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add the **Android Build** Step after the **Android Unit Test** and **Android Lint** Steps in your Workflow. +1. Provide the root directory of your Android project in the **Project Location** input field. +1. Go to **Build type** and select `aab` as build type. + + ![Generating_and_deploying_Android_app_bundles.jpg](/img/_paligo/uuid-e786c907-9370-70be-0d2f-7c9c6f028ac7.jpg) + + :::tip[APK and AAB in the same Workflow] + + If you wish to generate an APK and an Android App Bundle in one Workflow, add two **Android Build** Steps after each other and configure one to build an Android App Bundle and the other to build an APK. + + ::: + + + + +1. Open your app's Configuration YAML. +1. Add the `android-build` Step after the `android-unit-test` and `android-lint` Steps in your Workflow. + + ``` + my-workflow: + steps: + - activate-ssh-key: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone: {} + - install-missing-android-tools: {} + - android-lint: {} + - android-unit-test: {} + - android-build: + ``` +1. Provide the root directory of your Android project in the `project_location` input field. +1. Set the value of the `build-type` input to `aab`. + + ``` + my-workflow: + steps: + - activate-ssh-key: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone: {} + - install-missing-android-tools: {} + - android-lint: {} + - android-unit-test: {} + - android-build: + inputs: + - build-type: aab + ``` + + :::tip[APK and AAB in the same Workflow] + + If you wish to generate an APK and an Android App Bundle in one Workflow, add two `android-build` Steps after each other and configure one to build an Android App Bundle and the other to build an APK. + + ::: + + + diff --git a/src/partials/generating-export-options-plist.mdx b/src/partials/generating-export-options-plist.mdx new file mode 100644 index 0000000..913306e --- /dev/null +++ b/src/partials/generating-export-options-plist.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Generating export options plists + +The `ExportOptions.plist` file is automatically generated based on the [Xcode Archive for iOS](https://bitrise.io/integrations/steps/xcode-archive) Step inputs. You can, however, override these inputs and use it in the **Xcode Archive and Export for iOS** Step. + +1. Open your project on a local development machine Xcode. +1. Archive the project. +1. In the Organizer, select the newly created `.xcarchive` file. Click **Distribute App** to export it into an IPA file. Xcode will copy the used `ExportOptions.plist` file next to the generated IPA file. +1. Open this `ExportOptions.plist` file in your favorite text editor and copy its content. +1. Paste its content to the **Xcode Archive and Export for iOS** Step's **Export options plist** content input. + +**An example plist file:** + +``` + + + + + destination + export + method + debugging + signingStyle + automatic + stripSwiftSymbols + + + +``` diff --git a/src/partials/generating-multi-flavor-apks.mdx b/src/partials/generating-multi-flavor-apks.mdx new file mode 100644 index 0000000..1b8596e --- /dev/null +++ b/src/partials/generating-multi-flavor-apks.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Generating multi-flavor APKs + +To generate APK files for several different flavors: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Insert **Gradle Runner** Step after the Android testing Steps. **Android Build** Step can only build one variant so if this Step is part of your Workflow, then we advise you to replace it with our **Gradle Runner** Step. +1. Click the **Config** section of the Step. +1. Specify **assemble** Gradle tasks by adding your build variants’ task names in the **Gradle task to run** Step input field - as many task names as many build variants you want to build in one workflow. Each task name must be exactly the same build variant name what you have listed in the **Build Variant** window of Android Studio! Make sure you separate them only with a space, no need for a comma ! In this image, you can see the order of the Steps for the deploy workflow and the **Gradle Task to run** Step input with two build variants: + + `assembleDemo` and `assembleFull` (for APKs) or `bundleDemo` and `bundleFull` (for AABs) + + ![Generate_and_deploy_multiple_flavor_APKs_in_a_single_workflow.jpg](/img/_paligo/uuid-b702773a-d24b-62a5-fa83-208936e116a3.jpg) +1. **Gradle Runner** generates a `$BITRISE_APK_PATH_LIST` / `$BITRISE_AAB_PATH_LIST` Environment Variable output that contains APKs/AABs built for ALL build variants defined above. We will need this output Environment Variable later. diff --git a/src/partials/generating-your-own-ssh-keypair.mdx b/src/partials/generating-your-own-ssh-keypair.mdx new file mode 100644 index 0000000..d95975a --- /dev/null +++ b/src/partials/generating-your-own-ssh-keypair.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Generating your own SSH keypair + +You can always generate your own SSH keypair on your own device and use the generated public and private keys for your Bitrise project. This is completely optional as Bitrise can generate and automatically register SSH keys for you, either during the process of adding the project to Bitrise or later in the **Project settings** menu. + +Generate your own SSH keypair with a simple Command Line/Terminal command: + +``` +ssh-keygen -t rsa -b 4096 -P '' -f ./bitrise-ssh -m PEM +``` + +This generates two files in the current directory (the directory where you run the command): + +- `bitrise-ssh` (private key) +- `bitrise-ssh.pub` (public key) + +Copy and paste the **public key** to your Git hosting service (for example, GitHub), and when you add your project on [bitrise.io](https://www.bitrise.io), you’ll have to provide the **private key**. diff --git a/src/partials/getting-a-specific-ios-code-signing-files-data.mdx b/src/partials/getting-a-specific-ios-code-signing-files-data.mdx new file mode 100644 index 0000000..d87041a --- /dev/null +++ b/src/partials/getting-a-specific-ios-code-signing-files-data.mdx @@ -0,0 +1,50 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Getting a specific iOS code signing file's data + +:::note[Required role] + +You must have an admin or owner role on the app's team to manage iOS code signing files using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +Retrieve a specific iOS code signing file’s data with the GET method of the `provisioning-profiles` and `build-certificates` endpoints. The returned data includes, among other things, the file's name, size, and download URL, as well as its current status. + +The required parameters are: + +- app slug +- file slug + +**Retrieving a provisioning profile's data** + +Request: + +``` +curl -X GET -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/provisioning-profiles/PROVISIONING-PROFILE-SLUG' +``` + +Response: + +``` +{ + "data": { + "upload_file_name":"sample.provisionprofile", + "upload_file_size":2047, + "slug":"01C6FA6P6HRQT5PQ8RMMVVXE6W", + "processed":false, + "is_expose":true, + "is_protected":false, + "download_url":"https://concrete-userfiles-production.s3-us-west-2.amazonaws.com/prov_profile_documents/uploads/80144/original/sample.provisionprofile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAIOC7N256G7J2W2TQ%2F20180322%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20180322T091652Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=6dd7bb3db72aafb2d434da7b1a8f80a82a3a7a0276e84620137ed64de5025ab2" + } +} +``` + +:::note[Availability of the `download_url`] + +Note that the `download_url` is generated only when the file’s `is_protected` attribute is false. + +::: diff --git a/src/partials/getting-configuration-information-from-g-suite-and-bitrise.mdx b/src/partials/getting-configuration-information-from-g-suite-and-bitrise.mdx new file mode 100644 index 0000000..203b80c --- /dev/null +++ b/src/partials/getting-configuration-information-from-g-suite-and-bitrise.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Getting configuration information from Google Workspace and Bitrise + +1. Sign into your Google Admin Console. +1. Select **Apps** on the **Admin Console** page. + + ![googleadmin-apps.jpg](/img/_paligo/uuid-d00d79a9-94d7-7bf0-fa17-b6e3adab0619.jpg) +1. On the Apps page, click **SAML apps**. + + ![appsamlapp.jpg](/img/_paligo/uuid-6cf46631-6ee5-1108-8957-9da55ebd564b.jpg) +1. On the **Web and mobile apps** page, click the **Add apps** button, and select the **Add custom SAML app** option from the dropdown. + + ![addappsaml.jpg](/img/_paligo/uuid-bcfdf2cb-0157-100c-44ed-25e040d82e6b.jpg) +1. On the App details page add `Bitrise` as your app name. Please note it must be `Bitrise` as no other format is accepted. Click **Continue**. + + ![addappname.jpg](/img/_paligo/uuid-1a730b40-ecbe-d3dd-58a4-c46a0854f63a.jpg) +1. On the **Getting Identity Provider details** page: + + - Copy the **SSO URL** and paste it on the **SAML SSO provider Single Sing-On URL (SSO URL)** on Bitrise. + - Copy the whole content of the **Certificate** field and paste it in the **SAML SSO provider certificate** field of Bitrise. You can upload the **Certificate** from your local computer too. + + ![identityproviderdetails.jpg](/img/_paligo/uuid-21e11866-5b32-ba61-b232-0336d27e75e9.jpg) +1. While you are in Bitrise, click the **Copy Link** button to copy the **Assertion Consumer Service URL (ACS URL)**. We will need it on Google Workspace in a second. Let’s NOT click the **Configure SSO** button just now! +1. Let’s head back to the **Getting Identity Provider details** page of Google Workspace. Click **Continue**. +1. On the **Service provider details** page: + + - Paste the **Assertion Consumer Service URL (ACS URL)** of Bitrise in the **ACS URL** field on Google Workspace. (Remember, we got the link at Step 7.) + - Type `Bitrise` in the **Entity ID** field. Please note it must be `Bitrise` as no other format is accepted. + - Tick the **Signed response** checkbox under **START URL (optional)**. + - Click **CONTINUE**. + + ![serviceproviderdetails.jpg](/img/_paligo/uuid-dca4e3b0-8c11-d444-23c9-b5ae0f21990d.jpg) +1. Click the **Configure SSO** button on Bitrise. +1. On Google Workspace’s **Attribute mapping** page, click **Finish** - you do not have to configure anything here. diff --git a/src/partials/getting-to-release-configuration.mdx b/src/partials/getting-to-release-configuration.mdx new file mode 100644 index 0000000..32391b4 --- /dev/null +++ b/src/partials/getting-to-release-configuration.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Open Release Management, and select your app from the list. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) +1. Select **Releases** and then select the release you need. +1. Select **Configuration**. diff --git a/src/partials/getting-to-the-project-settings-page.mdx b/src/partials/getting-to-the-project-settings-page.mdx new file mode 100644 index 0000000..027168e --- /dev/null +++ b/src/partials/getting-to-the-project-settings-page.mdx @@ -0,0 +1,8 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) diff --git a/src/partials/getting-to-your-profile-settings.mdx b/src/partials/getting-to-your-profile-settings.mdx new file mode 100644 index 0000000..3fd7397 --- /dev/null +++ b/src/partials/getting-to-your-profile-settings.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) diff --git a/src/partials/getting-your-codepush-credentials.mdx b/src/partials/getting-your-codepush-credentials.mdx new file mode 100644 index 0000000..2d9f325 --- /dev/null +++ b/src/partials/getting-your-codepush-credentials.mdx @@ -0,0 +1,61 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Getting your CodePush credentials + +:::note[API only] + +If you use the GUI on bitrise.io to release your CodePush updates, you can skip this section. + +::: + +You need the following deployment credentials to be able to release CodePush updates with the API: + +- A [deployment ID](/en/release-management/codepush/creating-a-codepush-deployment.html) from Bitrise CodePush. + + iOS and Android require separate deployment IDs. +- An [app ID](/en/release-management/getting-started-with-release-management/adding-a-new-app-to-release-management) from Bitrise Release Management. + + iOS and Android require separate app IDs. +- A deployment key. + + iOS and Android require separate deployment keys. +- A Bitrise API token: it can be either a [personal access token](/en/bitrise-platform/accounts/personal-access-tokens.html) or a [workspace API token](/en/bitrise-platform/workspaces/workspace-api-token.html). + +You can save these credentials when creating the CodePush deployment. If you need to get them later, use the Release Management API: + +1. Make sure you have a Bitrise API token: + + - [Creating a personal access token](/en/bitrise-platform/accounts/personal-access-tokens/creating-a-personal-access-token). + - [Creating a Workspace API token](/en/bitrise-platform/workspaces/workspace-api-token/creating-a-workspace-api-token). +1. Get the app IDs from Release Management for both the iOS and the Android app: + + Open the app in Release Management, and copy the ID from the URL. It is the alphanumeric code at the end of the URL: https://app.bitrise.io/release-management/workspaces/4afb6c4bb001295/connected-apps/12a0cf2b-9cf1-401a-8904-393b18v449ca. +1. Get the deployment ID and the deployment key from the API: + + :::tip + + You can get both the ID and the key when creating the CodePush deployments. Read on if you didn't save them at the time. + + ::: + + For the deployment ID, call the `deployments` endpoint. It returns all deployments: + + ``` + curl -X 'GET' \ + 'https://api.bitrise.io/release-management/v1/connected-apps//code-push/deployments' \ + -H 'accept: application/json' \ + -H 'authorization: ' + ``` + + The response contains the deployment ID (`id`) for each deployment which you need in order to get the deployment key (`key`. Call `deployments` with the `id` value: + + ``` + curl -X 'GET' \ + 'https://api.bitrise.io/release-management/v1/connected-apps//code-push/deployments/' \ + -H 'accept: application/json' \ + -H 'authorization: ' + ``` + +With these credentials, you can proceed to release CodePush updates to your apps. diff --git a/src/partials/git-cloning-submodules-and-repository-dependencies.mdx b/src/partials/git-cloning-submodules-and-repository-dependencies.mdx new file mode 100644 index 0000000..54f8352 --- /dev/null +++ b/src/partials/git-cloning-submodules-and-repository-dependencies.mdx @@ -0,0 +1,45 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Git cloning submodules and repository dependencies + +You have three options when it comes to accessing multiple repositories during a Bitrise build: + +- Cloning all the repositories on the virtual machine, and accessing them as needed. +- Adding the additional repositories as submodules to your main repository. +- Using the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration) and [linking additional repositories](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories). + +In the latter case, you do not need to worry about cloning them: if you set up [SSH access](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) correctly, the **Git Clone** Step will take care of everything. + +If you don’t want to or can’t add your repository dependencies as submodules, read on: we’ll talk about how to clone them. + +:::note[The Git Clone Step] + +The **Git Clone** Step only works with the main repository. If you need to access multiple private repositories, do not add multiple **Git Clone** Steps. Use **Script** Steps to clone those repositories on the Bitrise virtual machine. + +::: + +To clone additional private repositories during the build: + +1. Make sure you added a user with the Bitrise public SSH key to all the repositories. +1. Make sure you have the **Activate SSH Key** Step and the **Git Clone** Step at the start of your Workflow. +1. Add one or more **Script** Steps to clone the additional private repositories to the build. +1. Run a build. + +:::note[Cloning issues] + +If you encounter issues with git cloning - for example, not all submodules are cloned - try the following command after cloning: + +``` +git submodule update –recursive –remote –merge –force +``` + +::: + +### Public vs private projects + +There is one important detail to keep in mind when you want to give access to all submodules or private repository dependencies for a Bitrise project: the project’s privacy settings determine what [git URL should you use](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch/changing-the-repository-url). + +- If you have a private project: use SSH URLs everywhere! Most services support SSH key based authentication only for SSH URLs (for example, `git@github.com:bitrise-io/bitrise.git`). Therefore every private repository you want to use have to be addressed with the SSH URL. If you have direct private git repo references in your CocoaPods Podfile, you’ll have to use the SSH URL there as well. The same applies for submodules and every other private git repository URL you want to use with [the SSH key you register](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) on [bitrise.io](https://www.bitrise.io/). +- If you have a public project: use HTTPS URLs everywhere! SSH URLs require SSH keys even if the repository is public. For security reasons, public projects CANNOT have SSH keys. As HTTPS git clone URLs do not require any authentication in the case of public repositories, they should be used for public Bitrise projects. diff --git a/src/partials/github-app.mdx b/src/partials/github-app.mdx new file mode 100644 index 0000000..14cfa13 --- /dev/null +++ b/src/partials/github-app.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## GitHub app + +The best way to connect your Bitrise account to your GitHub repositories is by integrating with [a GitHub app](https://docs.github.com/en/apps/overview). The Bitrise GitHub app has a number of features that make integration easier: + +- The app eliminates the need for an SSH key, a Personal Access Token, and a service credential user. For access, it generates a temporary access token before every build, significantly increasing security. +- It provides granular access to your repositories: no need to grant access to an entire GitHub organization, instead select the specific repositories the app can access. +- With the app installed, you automatically receive Bitrise status updates directly on GitHub with the GitHub Checks app. No need for configuring status reports separately. Note that while only one GitHub account can be connected to a Bitrise Workspace, GitHub Checks can still be configured for repositories owned by other GitHub accounts. + +:::important[HTTPS URL required] + +The GitHub App requires an HTTPS URL for your repository instead of an SSH one. Normally, you don't have to worry about this: setting up the GitHub App connection changes the URL of your project. If there's an issue, you can change the URL manually: [Changing the repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch/changing-the-repository-url). + +::: + +Repository access with the GitHub app is configured differently for GitHub Cloud and GitHub Enterprise users. + +- [GitHub Cloud guide](/en/bitrise-platform/repository-access/github-app-integration) +- [GitHub Enterprise guide](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise) diff --git a/src/partials/github-checks-test-summary.mdx b/src/partials/github-checks-test-summary.mdx new file mode 100644 index 0000000..fa8108d --- /dev/null +++ b/src/partials/github-checks-test-summary.mdx @@ -0,0 +1,55 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## GitHub Checks test summary + +If your project’s repository contains any UI or unit tests, you can run them by using the appropriate testing Steps in your Workflow. With the **Deploy to Bitrise.io** Step, your test results will be displayed in our **[test reports](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html)** page and you can also see them on GitHub Checks, too. + +For example, if you have an Android app, you can use the **Virtual Unit Testing for Android** Step to be able to see all your test results on GitHub Checks. + +![test_reports.png](/img/_paligo/uuid-6fb2370d-7bd0-a531-147b-deeb7a89c996.png) + +### Step by Step error report + +If a CI build runs, GitHub Checks' test summary displays the Steps' successful and failed tests in separate tabs on the left sidebar. If you click on a Step, a more detailed report summary comes up where a number of tests are listed with actionable error report. The build summary is available on the Bitrise tab. + +Please note that GitHub Checks' test summary can only print detailed information of the following Steps: + +- **Xcode Test for iOS** +- **Android Unit Test** +- **iOS Device Testing** +- **Virtual Device Testing for Android** +- **Flutter Test** + +You can export test results generated by any other Step to the **Deploy to Bitrise.io** Step in two ways: + +- We strongly recommend using our **Export test results to the Test Reports** Step: this Step locates the test results based on your inputs. +- You can configure your own custom **Script** Step that creates and exports the necessary files. + +### Checking the test results of a failed Step + +If your build has some failed tests, here is how to access them in GitHub Checks: + +1. Click the **Bitrise Checks** dropdown. +1. Click on a Step and view the error report of the specific Step. + +You can click on other Steps from here or the build summary. The **View more details on Bitrise Checks** link takes you to the build page on Bitrise. + +### Re-running a build using GitHub checks + +:::important[Role requirement] + +To re-run a build using GitHub Checks, [your GitHub account must connected to Bitrise](/en/bitrise-platform/repository-access/repository-access-with-oauth/connecting-a-git-provider-account-from-the-profile-settings-page), and you need to have at least Developer role in your app's team. If these conditions are not met, re-run checks will fail without an error. + +For a complete list of user roles and role cheatsheets, check [User roles on app teams](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + +::: + +If you would like to re-run a build using GitHub Checks: + +1. Open the pull request on GitHub where you would like to re-run checks. +1. Open the **Checks** tab. +1. Click **Re-run all checks**. + + ![re_run_test.png](/img/_paligo/uuid-9f07fdaf-fccd-365f-c732-7e489e246580.png) diff --git a/src/partials/global-access-groups.mdx b/src/partials/global-access-groups.mdx new file mode 100644 index 0000000..633b3c6 --- /dev/null +++ b/src/partials/global-access-groups.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Global access groups + +You can grant a workspace member access to all projects on all products. When you do that, the member is added to a global access group. + +A global access group is a workspace group, with a few differences compared to regular workspace groups: + +- It can't be removed from the workspace. +- Its roles can't be changed. + +You can add members to global access groups manually, just like to any other group. You can also rename global access groups at any time. diff --git a/src/partials/gradle-tasks-and-caching.mdx b/src/partials/gradle-tasks-and-caching.mdx new file mode 100644 index 0000000..14272ba --- /dev/null +++ b/src/partials/gradle-tasks-and-caching.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Gradle tasks and caching + +In the Gradle build system, the basic unit of action is a task. A task could be compiling classes, running unit tests, or creating a JAR. Each task has its own inputs, such as files or environmental variables, and outputs. + +Tasks usually generate their output in a specific build directory which is configurable for each module. The contents of this directory can be often reused between builds on the same machine. As such, Gradle saves time by executing only the tasks that can't be reused. For other tasks, the output from the build directory is reused and the task gets the `UP-TO-DATE` label. This process is what Gradle calls an [incremental build](https://docs.gradle.org/current/userguide/incremental_build.html). + +:::note[Incremental build vs incremental task execution] + +Incremental builds are not the same as incremental task execution! You can read about incremental tasks [in Gradle's official docs](https://docs.gradle.org/current/userguide/custom_tasks.html#incremental_tasks). + +::: + +### Gradle tasks in a CI environment + +When running Gradle in a CI environment, all tasks are either executed or retrieved from cache because the build directory is empty. After execution, Gradle saves metadata about the task inputs in the [project cache directory](https://docs.gradle.org/current/userguide/directory_layout.html). Gradle uses this metadata to be able to perfom incremental builds. + +For example, in the case of a compile task, Gradle saves the checksum of the source files and only re-compiles files that have changed, based on the checksums. For more information on how Gradle checks task inputs, [read Gradle’s docs on task inputs and outputs.](https://docs.gradle.org/current/userguide/incremental_build.html#sec:task_inputs_outputs) + +If metadata is not available, Gradle will execute all tasks. + +### Caching tasks + +If the metadata indicates that a task has to be executed, and the Bitrise build cache is enabled, the task inputs and certain Gradle properties such as the version are hashed into the cache key. If either the remote or local cache has a match for the cache key, the task does not have to be fully executed: its execution result is loaded from the cache and gets the `FROM-CACHE` outcome label. + +If there is no match for the cache key in the remote or local cache (a cache miss), the task is fully executed and its outputs are stored in the cache. + +When a task doesn't have the `UP-TO-DATE` label, the reasons for this are recorded and displayed in the task's row in the invocation details on Bitrise. Some of the possible reasons are as follows: + +- If the metadata is missing, **No history available** is displayed. +- If the outputs are missing, **Output... has been removed** is displayed. +- Tasks without the `UP-DO-DATE` label can still be cached if their inputs were cached at least once previously. diff --git a/src/partials/have-you-lost-your-authenticator-and-recovery-codes.mdx b/src/partials/have-you-lost-your-authenticator-and-recovery-codes.mdx new file mode 100644 index 0000000..6f0e3c7 --- /dev/null +++ b/src/partials/have-you-lost-your-authenticator-and-recovery-codes.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Have you lost your authenticator and recovery codes? + +2FA protects your account from unwanted login attempts (for example, with a stolen password) by providing an extra security step during the login flow. This also means that if you lose the device with the authenticator app, and you lose your recovery codes, you won't be able to access your account and Bitrise Support will not be able to remove the activated 2FA from your account. + +However, if there has been any third-party service (for example, GitLab, GitHub or Bitbucket) connected to your account before, you can try to log in through that. In the absence of a connected third-party account, we recommend you to create a new account on Bitrise. + +In very special cases, Bitrise can remove 2FA from your account. Please note that Bitrise can only disable the activated 2FA on your account if there is a Git provider account already connected to Bitrise. + +1. Contact our Support Team using the email address you provided when signing up to Bitrise. +1. Explain why you’re requesting us to remove 2FA. + + Our Support Team will ask you to create a new public repo on your git account with the title: `bitrise_verification` +1. Send the link of the created repo to our Support Team. + +Please note that our Support Team can deny your request if they find removing 2FA from the account might pose a security risk on your Bitrise account. diff --git a/src/partials/how-do-we-go-about-step-duplications.mdx b/src/partials/how-do-we-go-about-step-duplications.mdx new file mode 100644 index 0000000..b378c61 --- /dev/null +++ b/src/partials/how-do-we-go-about-step-duplications.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## How do we go about Step duplications? + +In general we try to keep our StepLib streamlined and avoid Step duplications for the same build task. Here you can find some questions and answers when it comes to any potential Step duplications. + +- *I was going to submit a Step and apply for the Verified badge, but found out there was an official Bitrise Step for the same build task in the StepLib. What should I do?* + +Submit your Step and go through the application process. Once your application is completed, we deprecate the official Bitrise Step and our users can use your new Verified Step. + +- *I was going to submit a Step and apply for the Verified badge, but found out there was a Community Step for the same build task. What should I do?* + +Submit your Step and go through the application process. Your new Verified Step and the Community Step will be both available in our StepLib. + +- *I was going to submit a Community Step but found out there was a Verified Step for the same build task. What should I do?* + +If a Verified Step is already available in our StepLib, we reject Community Step submission for the same build task to avoid Step duplication. We offer to the Community Step developer to work on future updates of the already existing Verified Step. diff --git a/src/partials/how-does-bitrise-approach-using-ai-capabilities-in-their-services.mdx b/src/partials/how-does-bitrise-approach-using-ai-capabilities-in-their-services.mdx new file mode 100644 index 0000000..360d353 --- /dev/null +++ b/src/partials/how-does-bitrise-approach-using-ai-capabilities-in-their-services.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## How does Bitrise approach using AI-capabilities in their services? + +When implementing AI in features, Bitrise aims to abide by the following: + +- AI suggestions are always recommendations, never irreversible actions. +- AI augments, but never replaces human judgment in decision making. +- AI decisions must be explainable in clear, non‑technical language where feasible. +- Critical flows (for example, deployment, billing, etc.) always require explicit human confirmation. +- Bitrise is committed to transparent incident investigation and timely corrective action through our internal policies. diff --git a/src/partials/how-is-customer-data-used-with-ai-on-bitrise.mdx b/src/partials/how-is-customer-data-used-with-ai-on-bitrise.mdx new file mode 100644 index 0000000..409a9e3 --- /dev/null +++ b/src/partials/how-is-customer-data-used-with-ai-on-bitrise.mdx @@ -0,0 +1,68 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## How is Customer data used with AI on Bitrise? + +Bitrise classifies Customer data into the following Customer Content categories: + +| **Customer content categories** | **Customer Sensitive Content** Content that must be handled with strict access controls and cannot be used for training, fine-tuning, or other secondary purposes, without explicit customer consent and appropriate privacy protections. | +| --- | --- | +| **Customer Non-sensitive data** Data that can be handled with standard operational controls and which may be used for service improvement, analytics, and operational purposes without requiring explicit customer consent. Includes Customer Non-Sensitive Content. | | + +Customer Sensitive Content and Non-sensitive Data shall be further classified as non-anonymizable, anonymizable, and directly useable, and may be processed as described below based on such classification: + +| Type of Customer Content | Processing category | +| --- | --- | +| **Non-Anonymizable (Customer Sensitive Content)** | Non-Anonymized:  Must be handled in original form or not at all. | +| **Anonymizable (Customer Sensitive Content)** | Anonymized:  Can be processed/aggregated with PII/sensitive details removed and Sensitive Customer Content is Anonymized. | +| **Directly Useable (Customer Non-Sensitive data)** | Directly Used:  Can be used as-is for operational purposes. | + +![ai-faq-data.png](/img/_paligo/uuid-70109545-5b55-93cb-dfa6-20a62c0cccdb.png) + +### Data classification details + +- **Customer Sensitive Content**: + + This is Customer Content that customer inputs into the Bitrise Services that is confidential or proprietary to the customer, or that if otherwise is exposed or mishandled, could cause harm, competitive disadvantage, or a breach of the customer's confidentiality. This typically includes: + + - Proprietary information (that is, source code, configuration secrets, business logic). + - Personal or identifying information that cannot be anonymized. + - Data subject to specific regulatory or contractual protection requirements. +- **Customer Non-Sensitive Data:** + + This is Customer data that provides information about the customer’s usage of the Bitrise Services or non-sensitive content input from the customer that, if exposed, would not cause business harm, competitive disadvantage, or breach of the customer’s confidentiality. This typically includes: + + - Aggregated metrics and operational statistics. + - Non-identifying technical telemetry. + - Public information or data the customer has made publicly available. + - System performance data that doesn't reveal proprietary information. + +The following table lists specific content types, their content classifications, and the type of processing they may be permitted  (or in the case of Non-Anonymizable, which is not permitted): + +| Data Type | Classification | Processing | +| --- | --- | --- | +| Customer’s source code | Customer Sensitive Content | Non-Anonymizable | +| Environment variables | Customer Sensitive Content | Non-Anonymizable | +| Secrets for builds | Customer Sensitive Content | Non-Anonymizable | +| Auth secrets for third party integrations | Customer Sensitive Content | Non-Anonymizable | +| Artifacts | Customer Sensitive Content | Non-Anonymizable | +| Build cache blobs | Customer Sensitive Content | Non-Anonymizable | +| Connected Git accounts (for example, GitHub username, organization) | Customer Sensitive Content | Non-Anonymizable | +| Outgoing webhook URLs they set up | Customer Sensitive Content | Non-Anonymizable | +| Users and groups | Customer Sensitive Content | Non-Anonymizable | +| Connected SAML accounts | Customer Sensitive Content | Non-Anonymizable | +| App release metadata (Release Management) | Customer Sensitive Content | Non-Anonymizable | +| Generic files (required for builds) | Customer Sensitive Content | Non-Anonymizable | +| Code signing related files (test device data, UUIDs) | Customer Sensitive Content | Non-Anonymizable | +| Build Insights data (build failures over time, build duration over time, flaky tests, utilization, Git statistics and so on) | Customer Sensitive Content | Anonymizable | +| Pipeline configuration (bitrise.yml) | Customer Sensitive Content | Anonymizable | +| Test reports | Customer Sensitive Content | Anonymizable | +| Build logs | Customer Sensitive Content | Anonymizable | +| Access log (IP address) | Customer Sensitive Content | Anonymizable | +| List of third party tools customers use | Customer Sensitive Content | Anonymizable | +| Usage data, like: build count, build length, error rate, cache hit rate, bytes transferred, CLI and Step telemetry | Customer Non-Sensitive Data | Directly Useable | +| Document center search query | Customer Non-Sensitive Data | Directly Useable | +| Marketing analytics (Google Analytics, and so on) | Customer Non-Sensitive Data | Directly Useable | +| Infrastructure related data: VM load (CPU and memory), datacenter location, and so on. | Customer Non-Sensitive Data | Directly Useable | +| Website analytics | Customer Non-Sensitive Data | Directly Useable | diff --git a/src/partials/how-often-does-bitrise-update-its-ai-models.mdx b/src/partials/how-often-does-bitrise-update-its-ai-models.mdx new file mode 100644 index 0000000..6abf7bd --- /dev/null +++ b/src/partials/how-often-does-bitrise-update-its-ai-models.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## How often does Bitrise update its AI models? + +Bitrise is continuously working to enhance AI features by testing and updating models regularly as they become available. + +These updates are designed to improve accuracy, security, and performance while respecting your data privacy and without interrupting your workflows. Models go through rigorous evaluations before they are elevated to production use. diff --git a/src/partials/how-the-code-reviewer-works.mdx b/src/partials/how-the-code-reviewer-works.mdx new file mode 100644 index 0000000..80fb96b --- /dev/null +++ b/src/partials/how-the-code-reviewer-works.mdx @@ -0,0 +1,44 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## How the code reviewer works + +To use the AI code reviewer, you must have a GitHub repository with one of the following connection types: + +- [GitHub app integration](/en/bitrise-platform/repository-access/github-app-integration) with the **write** permission enabled. The comments will be posted by the Bitrise GitHub app. We strongly recommend using this method. +- [GitHub OAuth connection](/en/bitrise-platform/repository-access/repository-access-with-oauth). The comments will be posted in the name of the [service credential user](/en/bitrise-platform/integrations/the-service-credential-user.html). + + :::tip[Bot user] + + If you use the OAuth connection, we recommend creating a bot user for this purpose and connect it as the service credential user on Bitrise. This makes it clear that the comments on the pull request come from a bot, not from an actual team member. + + ::: + +:::important[HTTPS connection] + +The AI code reviewer doesn't work with an HTTPS connection. We recommend switching to the GitHub app. + +::: + +The AI code reviewer runs a Bitrise build that shows up in your list of Bitrise CI builds. This build: + +- Doesn't count towards any of your resource limits (credits, build count, build minutes). +- Doesn't count towards concurrency limits. +- Increases the actual [build number](/en/bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning/changing-the-number-of-your-build). +- Is included in [Insights](urn:resource:publication:94879) data. + +For each new commit on a pull request, the code reviewer starts a new review and a new build. + +There is a limit of 10 reviews per PR. There is no limit on how many new PRs you can have reviewed. + +:::important[Third-party API vendor] + +Bitrise AI uses a third-party API vendor for this feature so data will leave Bitrise in order to generate the PR reviews. See our [AI FAQ](/en/bitrise-platform/ai/ai-faq---how-bitrise-leverages-ai-technologies-in-its-features-and-services.html) for more information on how Bitrise leverages AI. + +::: + +To configure the code reviewer: + +1. Enable AI features for your workspace: [Enabling AI features on Bitrise](/en/bitrise-platform/ai/enabling-ai-features-on-bitrise). +1. Enable the AI code reviewer for specific projects: [Enabling the AI code reviewer](/en/bitrise-platform/integrations/ai-code-reviewer/enabling-the-ai-code-reviewer). diff --git a/src/partials/https-authorization.mdx b/src/partials/https-authorization.mdx new file mode 100644 index 0000000..97e852d --- /dev/null +++ b/src/partials/https-authorization.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## HTTPS authorization + +If your repository URL is an HTTPS URL and you use an OAuth connection, you can authorize Bitrise with a personal access token. + +HTTPS authorization requires a personal access token for private projects. You create the token at your Git provider and register it at Bitrise. + +For most projects with OAuth connection, we recommend SSH URLs and SSH key authorization. We recommend using HTTPS URLs only for [public projects](/en/bitrise-platform/projects/public-projects.html): those can't have SSH keys. + +Set up HTTPS authorization: [Configuring HTTPS authorization credentials](/en/bitrise-platform/repository-access/configuring-https-authorization-credentials). diff --git a/src/partials/ignoring-a-failed-step-without-failing-the-build.mdx b/src/partials/ignoring-a-failed-step-without-failing-the-build.mdx new file mode 100644 index 0000000..d30338d --- /dev/null +++ b/src/partials/ignoring-a-failed-step-without-failing-the-build.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Ignoring a failed Step without failing the build + +Usually, when a Step fails during a build, the built itself fails, too. This isn't the case with every Step, of course: both the **Bitrise.io Cache:Pull** and the **Bitrise.io Cache:Push** Steps can fail without failing the build. You can also configure any other Step to ensure their failure doesn't fail the build. + +:::note[YAML mode only] + +You can't do this on the graphical UI of the Workflow Editor: you have to edit your app's `bitrise.yml` file. + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Configuration YAML** from the navigation menu. +1. Find the Step you need. +1. Add the `is_skippable` flag to it and set it to `true`: + + ``` + - script: + is_skippable: true + inputs: + - content: |- + # !/bin/bash + echo "Failing Step." + exit 1 + # exit 1 would mark this step as Failed, but it won't break the Build + # because of the is_skippable: true flag / property + ``` diff --git a/src/partials/important-artifact-retention-policy.mdx b/src/partials/important-artifact-retention-policy.mdx new file mode 100644 index 0000000..ebc63c9 --- /dev/null +++ b/src/partials/important-artifact-retention-policy.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::important[IMPORTANT: Artifact retention policy] + +Artifacts, including [build logs](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html), [build files](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html), installable artifacts, or [CodePush](/en/release-management/codepush/about-codepush.html) packages, are only stored for a limited amount of time. For details, see [Artifact retention policy](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy). + +::: diff --git a/src/partials/important-familiarity-with-the-structure-of-the-bitriseyml-file.mdx b/src/partials/important-familiarity-with-the-structure-of-the-bitriseyml-file.mdx new file mode 100644 index 0000000..1d00e54 --- /dev/null +++ b/src/partials/important-familiarity-with-the-structure-of-the-bitriseyml-file.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::important + +This requires some familiarity with the structure of a Bitrise configuration YAML file. Read more: [Configuration YAML reference](/en/bitrise-ci/references/configuration-yaml-reference). + +::: diff --git a/src/partials/important-no-inbound-traffic-required.mdx b/src/partials/important-no-inbound-traffic-required.mdx new file mode 100644 index 0000000..a9107e3 --- /dev/null +++ b/src/partials/important-no-inbound-traffic-required.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::important[No inbound traffic required] + +We’ve created the Bitrise on AWS offering with the highest security standards in mind, to match even the most strict company policy requirements. In all cases the Controller and the build machines will initiate network calls toward the Bitrise control plane, so no external inbound traffic is required. + +::: diff --git a/src/partials/important-no-step-input-modifications-needed.mdx b/src/partials/important-no-step-input-modifications-needed.mdx new file mode 100644 index 0000000..2e299a3 --- /dev/null +++ b/src/partials/important-no-step-input-modifications-needed.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::important[No Step input modifications needed] + +With this method, all Step inputs related to authenticating with an Apple API key are automatically populated once the connection is set up. You don't have to manually modify those Step input fields at all. + +::: diff --git a/src/partials/important-upload-the-distribution-and-the-development-signing-certificates.mdx b/src/partials/important-upload-the-distribution-and-the-development-signing-certificates.mdx new file mode 100644 index 0000000..90aa5ae --- /dev/null +++ b/src/partials/important-upload-the-distribution-and-the-development-signing-certificates.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::important[Upload the distribution AND the development signing certificates] + +We strongly recommend uploading BOTH the development and distribution signing certificates for your project. If you don't have an uploaded development signing certificate, Steps with automatic provisioning options will generate one on the fly every time you start a build. This can eventually lead to reaching the maximum number of certificates, blocking you from starting new builds. + +::: diff --git a/src/partials/important-yaml-files-size-limitation.mdx b/src/partials/important-yaml-files-size-limitation.mdx new file mode 100644 index 0000000..602eba9 --- /dev/null +++ b/src/partials/important-yaml-files-size-limitation.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::important[YAML files size limitation] + +Please note that the total, combined size of the `bitrise.yml` and the `bitrise.secrets.yml` file cannot exceed 400KB. + +::: diff --git a/src/partials/including-configuration-from-multiple-yaml-files.mdx b/src/partials/including-configuration-from-multiple-yaml-files.mdx new file mode 100644 index 0000000..5ac18a2 --- /dev/null +++ b/src/partials/including-configuration-from-multiple-yaml-files.mdx @@ -0,0 +1,51 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Including configuration from multiple YAML files + +To create a modular configuration, you need to: + +1. Store your `bitrise.yml` file in your repository. +1. Create more YAML files in addition to `bitrise.yml` and commit them to your repository. We refer to these files as configuration modules. + +:::important[File limit] + +You can have a total of 35 configuration files, including the root level `bitries.yml` file. + +::: + +In `bitrise.yml`, you can include the YAML configuration modules with the `include` keyword. If the module is in the same repository as the `bitrise.yml` file, the `include` keyword requires one parameter: `path` which points to the location of the module. + +The provided path must be relative to the repository's root: + +``` +include: + - path: file/path/common.yml +``` + +You can include a YAML configuration module from a different repository by specifying the repository that contains the file. In addition to the `repository` property, you need to also set at least one of the following: + +- `branch`: The branch containing the YAML configuration module. +- `commit`: The specific commit hash from which to include the YAML configuration module. +- `tag`: The Git tag that points to the YAML configuration module. + +The repository must belong to the same Git account or organization that your project's primary repository belongs to. You can check your [Bitrise project's repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch/changing-the-repository-url) on bitrise.io. For example, if your repository URL is git@github.com:MyOrg/main_repo.git, you can only refer to repositories belonging to MyOrg on GitHub. + +You only need to refer to the repository's name. For example, you can refer to git@github.com:MyOrg/another_repo.git with the value `another_repo`. + +``` +include: + - path: shared/common.yml + branch: test_branch + repository: another_repo +``` + +:::important[Accessing other repositories] + +Bitrise needs `read` access to all repositories where configuration YAML files are hosted. There are two ways to make sure Bitrise can access your repo: + +- If you use the [GitHub App](/en/bitrise-platform/repository-access/github-app-integration) integration, you can [link additional repositories](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories) to your project. +- For other authentication methods, check out this guide: [Apps with submodules or private repo dependencies](/en/bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies) + +::: diff --git a/src/partials/increasing-disk-size-on-a-mac-instance.mdx b/src/partials/increasing-disk-size-on-a-mac-instance.mdx new file mode 100644 index 0000000..3c2b85d --- /dev/null +++ b/src/partials/increasing-disk-size-on-a-mac-instance.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Increasing disk size on an EC2 Mac instance + +:::note[User data] + +To make sure instance behavior is consistent across all instances, we recommend configuring this as part of [user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-console) during [instance creation](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami). + +User data is provided either in plain text or in base64 encoded format. + +::: + +If you have configured a bigger Amazon EBS storage for your EC2 Mac instance than the default (400 GB), resize the partition so macOS can use all available disk space: + +``` +PDISK=$(diskutil list physical external | head -n1 | cut -d" " -f1) +APFSCONT=$(diskutil list physical external | grep "Apple_APFS" | tr -s " " | cut -d" " -f8) +yes | sudo diskutil repairDisk $PDISK + +sudo diskutil apfs resizeContainer $APFSCONT 0 +``` + +For more information, please refer to the [AWS macOS EC2 documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-mac-instances.html#mac-instance-increase-volume). diff --git a/src/partials/installing-an-ipa-file-on-test-devices-from-the-artifacts-tab.mdx b/src/partials/installing-an-ipa-file-on-test-devices-from-the-artifacts-tab.mdx new file mode 100644 index 0000000..6240e1b --- /dev/null +++ b/src/partials/installing-an-ipa-file-on-test-devices-from-the-artifacts-tab.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Installing an .ipa file on test devices from the Artifacts tab + +You can install an .ipa file from the **Artifacts** tab of your app's build. This provides a more secure way compared to the public install page but requires you to log in to your Bitrise account, making it less viable for external testers. + +To install an .ipa file from the **Artifacts** tab: + +1. Open your app on Bitrise. +1. Select the build with the .ipa file you would like to install. +1. Go to the **Artifacts** tab. +1. Click on **Download** next to the .ipa file. + + ![ipafile.png](/img/_paligo/uuid-caac5c40-bb61-c1fd-af8b-5e454a9680da.png) +1. Click **Install**, under the **Install the app on your iOS device** section. diff --git a/src/partials/installing-an-ipa-file-on-test-devices.mdx b/src/partials/installing-an-ipa-file-on-test-devices.mdx new file mode 100644 index 0000000..c99850b --- /dev/null +++ b/src/partials/installing-an-ipa-file-on-test-devices.mdx @@ -0,0 +1,158 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Installing an .ipa file on test devices from the public install page + +The public install page is a convenient way of sharing the latest version of your app with team members and any other stakeholders who wish to check the app out. The page includes all the important details of the build such as filename, size, version code, minimum SDK version, and build number. + +You can configure the **Deploy to Bitrise.io** Step to send an email to users with a link to the public install page. This link can be shared with anyone. + +During this whole flow, use a native, non-incognito Safari session instead of any other in-app browser type. If you follow the link in the notification email you got from Bitrise, the public install page will automatically open in a native Safari session. + +:::tip[Would you rather download the app?] + +If you only wish to download the app and manually upload it somewhere else, you can find the download button on the **Artifacts** page of the build. Please note that downloading an app does not mean you can install it on the test device. + +::: + +### Installing an app on a test device without a Bitrise account + +1. Long tap on the link you received from Bitrise. To open the link in native Safari, tap **Open Link**. It brings up the public install page in a native Safari session. If you copy the link from the email, make sure you paste it in a native Safari session. +1. Tap the link in the **Click here to check device compatibility of this device with this app** yellow message box. If you cannot see this message, you are most likely using another browser so switch to Safari. + + ![Installing_an_ipa_file_from_the_public_install_page.png](/img/_paligo/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png) +1. Tap **Allow** on the pop-up to install the configuration profile on your device. This configuration profile makes the device’s UDID available to Bitrise for the compatibility check. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg) +1. A pop-up confirms the configuration profile has been downloaded, and it can be installed in the **Settings** app. Tap **Close**. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg) +1. Tap the **Home** button to go the the home screen. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg) +1. Open **Settings**. You can find the downloaded profile at the top of the **Settings**. Tap **Profile Downloaded** menu item on the left to install the profile. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg) +1. Tap **Install**. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg) +1. Type your device’s passcode in the **Enter passcode** pop-up. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg) +1. Tap **Install** again. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg) +1. Wait until the profile is installed. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg) +1. Once the profile is installed, you’re directed to the public install page. As you can see, the **Install** button is now available. Tap it! + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg) +1. Tap **OK** on the next pop-up. + + ![Installing_an_ipa_file_from_the_public_install_page.png](/img/_paligo/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png) +1. As a final confirmation, tap on **Install** and press the **Home** button. Now you’re installing the app to your test device. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-6556fa37-6a3c-7358-f031-137d1ca1d26c.jpg) +1. Wait till the app installs on your test device’s home screen. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg) + +Check out the app you’ve successfully installed on your test device. + +#### Installing an app on a test device not registered to Bitrise + +If you’re accessing the public install page from a test device which displays the below message, you’ll have to register the device on Bitrise which is only a few steps different from the above flow. + +Please note that you can only add a test device to Bitrise if you already have a Bitrise account. + +![Installing_an_ipa_file_from_the_public_install_page.png](/img/_paligo/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png) + +1. Tap **Click here** to start the device registration process. +1. Tap **Allow** to download the configuration profile. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg) +1. When the configuration profile is downloaded, tap **Close**. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg) +1. Tap the **Home** button to go to your **Settings** app on your test device’s home screen. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg) +1. Open **Settings**. You can find the downloaded profile at the top of the **Settings**. Tap **Profile Downloaded** menu item on the left to install the profile. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg) +1. Tap **Install**. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg) +1. Type your device’s passcode in the **Enter Passcode** pop-up. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg) +1. Tap **Install** again in the **Install Profile** pop-up. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg) +1. Wait until the profile installation is complete. You automatically get redirected to the **Register your test device** page. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg) +1. Your device’s name and UDID gets populated automatically. You can only change the device name here. Tap **Register Device**. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-2d349c93-c464-218d-ac79-de7b3da38089.jpg) +1. You land on the public install page where the **Install** button is now available. Tap it! + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg) +1. Tap **OK** on the prompt. + + ![Installing_an_ipa_file_from_the_public_install_page.png](/img/_paligo/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png) +1. To install the app on your test device, tap on **Install**. Then press the **Home** button to follow the installment of your app. + +If all went well, you can find the installed app on your test device’s Home page. + +![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg) + +### Installing an app on a test device not registered to Bitrise + +If you’re accessing the public install page from a test device which displays the below message, you’ll have to register the device on Bitrise which is only a few steps different from the above flow. + +Please note that you can only add a test device to Bitrise if you already have a Bitrise account. + +![Installing_an_ipa_file_from_the_public_install_page.png](/img/_paligo/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png) + +1. Tap **Click here** to start the device registration process. +1. Tap **Allow** to download the configuration profile. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg) +1. When the configuration profile is downloaded, tap **Close**. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg) +1. Tap the **Home** button to go to your **Settings** app on your test device’s home screen. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg) +1. Open **Settings**. You can find the downloaded profile at the top of the **Settings**. Tap **Profile Downloaded** menu item on the left to install the profile. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg) +1. Tap **Install**. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg) +1. Type your device’s passcode in the **Enter Passcode** pop-up. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg) +1. Tap **Install** again in the **Install Profile** pop-up. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg) +1. Wait until the profile installation is complete. You automatically get redirected to the **Register your test device** page. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg) +1. Your device’s name and UDID gets populated automatically. You can only change the device name here. Tap **Register Device**. + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-2d349c93-c464-218d-ac79-de7b3da38089.jpg) +1. You land on the public install page where the **Install** button is now available. Tap it! + + ![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg) +1. Tap **OK** on the prompt. + + ![Installing_an_ipa_file_from_the_public_install_page.png](/img/_paligo/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png) +1. To install the app on your test device, tap on **Install**. Then press the **Home** button to follow the installment of your app. + +If all went well, you can find the installed app on your test device’s Home page. + +![Installing_an_ipa_file_from_the_public_install_page.jpg](/img/_paligo/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg) diff --git a/src/partials/installing-dependencies-for-ioniccordovareact-apps.mdx b/src/partials/installing-dependencies-for-ioniccordovareact-apps.mdx new file mode 100644 index 0000000..0bb2c2f --- /dev/null +++ b/src/partials/installing-dependencies-for-ioniccordovareact-apps.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Installing dependencies for ExpoIonic/CordovaReact Native apps + +If the Bitrise project scanner has successfully scanned your React NativeIonic/Cordova project, **Run npm command** or **Run yarn command** Steps will be included in your default Workflows. These Steps can install the missing Javascript dependencies for your app. + +For native Android dependencies, you can use the **Install missing Android SDK components** Step. + +For native iOS dependencies, you can use, among others, the **Brew install** Step or the **Run CocoaPods install** Step. + +To install Javascript dependencies with npm: + +:::note[Using Yarn instead of npm] + +In this guide, we're using npm to install Javascript dependencies. However, you can use the **Run yarn command** Step: it can install missing JS dependencies without any additional configuration required. + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Make sure your Workflow includes the **Run npm command** Step. +1. In **The 'npm' command with arguments to run** input variable, type `install`. + + ![Getting_started_with_React_Native_apps.png](/img/_paligo/uuid-021a140f-5b4c-697c-a5ac-4b5429ce1bab.png) + + :::tip[Using the `npm ci` command instead of `npm install`] + + If you already have an up to date `package-lock.json` file in your project, we recommend using the `ci` command in **The 'npm' command with arguments to run** input. Using `npm ci` can not only result in much faster build times compared to `npm install` but more reliable builds as well. + + ::: diff --git a/src/partials/installing-the-bitrise-cli-with-curl.mdx b/src/partials/installing-the-bitrise-cli-with-curl.mdx new file mode 100644 index 0000000..6d18b21 --- /dev/null +++ b/src/partials/installing-the-bitrise-cli-with-curl.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Installing the Bitrise CLI with curl + +1. Run the following command in a bash shell: + + ``` + curl -fL https://github.com/bitrise-io/bitrise/releases/latest/download/bitrise-$(uname -s)-$(uname -m) > /usr/local/bin/bitrise + ``` + + You can check the latest release of the Bitrise CLI on its [releases](https://github.com/bitrise-io/bitrise/releases) page. +1. Make the downloaded binary executable: + + ``` + chmod +x /usr/local/bin/bitrise + ``` +1. Run `bitrise setup`. + + This will verify if everything that is required for Bitrise to run is installed and available. If you skip this, the CLI will perform the setup anyway the first time you call `bitrise run`. diff --git a/src/partials/installing-the-bitrise-cli-with-homebrew.mdx b/src/partials/installing-the-bitrise-cli-with-homebrew.mdx new file mode 100644 index 0000000..a1e9137 --- /dev/null +++ b/src/partials/installing-the-bitrise-cli-with-homebrew.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Installing the Bitrise CLI with Homebrew + +If you have the Homebrew package manager installed on your Mac, you can use it to install the Bitrise CLI. + +1. Open the `Terminal` app on your Mac and run: + + ``` + brew update && brew install bitrise + ``` +1. Perform a first-time setup for the Bitrise CLI: + + ``` + bitrise setup + ``` + + This will verify if everything that is required for Bitrise to run is installed and available. If you skip this, the CLI will perform the setup anyway the first time you call `bitrise run`. diff --git a/src/partials/installing-the-bitrise-github-app-for-github-checks.mdx b/src/partials/installing-the-bitrise-github-app-for-github-checks.mdx new file mode 100644 index 0000000..4cbc666 --- /dev/null +++ b/src/partials/installing-the-bitrise-github-app-for-github-checks.mdx @@ -0,0 +1,40 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Installing the Bitrise GitHub app for GitHub Checks + +To use Bitrise Checks as a GitHub.com user, you need to install it as a GitHub app. + +If the workspace that owns the Bitrise project has the Bitrise GitHub App connected and granted access to the Bitrise project's repository, you can skip the procedure described here and start using GitHub Checks. + +:::important[GitHub.com users only] + +If you are a GitHub Enterprise Server user, you don't need to do this procedure. To enable GitHub Checks, you need to: + +1. [Install the GitHub Enterprise Server integration](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise). +1. [Enable GitHub Checks on Bitrise](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github/enabling-github-checks). + +::: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Integrations** from the menu options. +1. Click the link under the toggle. Don’t toggle the switch just yet, since you first need to install the Bitrise app. + + This link will take you to GitHub's **Bitrise** installation page. + + ![github_checks_install.png](/img/_paligo/uuid-f07c26d9-ec9e-bcab-3f8e-184408ae7fc2.png) +1. Select the user or GitHub Organization you want to add the Bitrise app to. +1. Select an option to install the GitHub app to: + + - **All repositories**: Applies to all current and future repositories. + - **Only select repositories**: Select the repositories that you need. + + With this, you authorize Bitrise to act on your behalf; for example, to check which repos you have access to, and use GitHub Checks to display check results. +1. Click **Install and authorize**. +1. In the GitHub prompt, provide your GitHub password. + +If all goes well, you land on the **Bitrise** page of GitHub. You should see a blue note at the top-left corner of the page that Bitrise has been successfully installed on your GitHub account. diff --git a/src/partials/installing-the-github-app-integration.mdx b/src/partials/installing-the-github-app-integration.mdx new file mode 100644 index 0000000..456602c --- /dev/null +++ b/src/partials/installing-the-github-app-integration.mdx @@ -0,0 +1,107 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Installing the GitHub app integration + +This guide is intended for GitHub Cloud users, including GitHub Enterprise Cloud users, who wish to install the Bitrise GitHub app and connect their Bitrise Workspace to a GitHub account or organization with the app. + +For GitHub Enterprise Server users, we have a separate guide: [Integrating GitHub Enterprise with Bitrise](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise) + +You can connect via the GitHub app integration in two ways: + +- From the **Workspace settings** page. +- When adding a new Bitrise project. + +:::important[GitHub App installations per Workspace] + +Note that: + +- A maximum of ten GitHub app installations can be connected to a Workspace. +- A GitHub app installation cannot be connected to multiple Workspaces. +- The GitHub Checks functionality of the app is available for repositories owned by other GitHub accounts. + +::: + +### Connecting a GitHub app from the Workspace settings page + +A Bitrise GitHub app installation is tied to a Workspace. You can always install and check its connection from the **Workspace settings** page. + +:::note[SSO on GitHub] + +If you install the GitHub App integration for a GitHub organization that requires SAML SSO, you need to have an active SAML SSO session on GitHub to be able to connect to the organization's repositories. + +If your installed GitHub app can't access all repositories it should, you might to need to revoke the app and authorize it again on GitHub while you have an active SAML SSO session. + +For more information and the detailed procedure, [check GitHub's documentation](https://docs.github.com/en/enterprise-cloud@latest/apps/using-github-apps/saml-and-github-apps). + +::: + +1. On the Bitrise main page, select your Workspace from the dropdown menu. +1. From the navigation menu on the left, select **Settings**. +1. On the **Workspace settings** page, select **Integrations**. +1. Select **GitHub** and click **Connect**. + + ![github-account-connection.png](/img/_paligo/uuid-1b49695a-ea36-fe03-f9a1-48a6bfc9a737.png) +1. If you haven't authorized the Bitrise GitHub app before, you will be prompted for authorization at this point. +1. You will be prompted to select the GitHub account or organization you want to connect. If you don't find the one you need in the list, you need to install the App to that account or organization first: click the link below the list of accounts. + + ![install-the-app.png](/img/_paligo/uuid-cae94617-17e3-33ce-8cf7-99205e85bd22.png) +1. Once you click the link, you will be prompted to select an account or organization. After selecting one, you will be transferred to the **Install & Authorize** page. +1. On the **Install & Authorize** page, select the access type: + + - **All repositories**: the Bitrise GitHub App will have access to all repositories belonging to the account or organization, including future ones. + - **Only select repositories**: Select one or more repositories that Bitrise will be able to access. You can add more later but to do so, you will need to reconfigure your repository access on the GitHub App's page. + + ![authorizing-app.png](/img/_paligo/uuid-a25560d9-ce2a-4181-2dc6-59cc4318c577.png) +1. When done, click **Install & Authorize**. You will be redirected to the **Workspace settings** page. + + :::important[Authorization] + + If you are not authorized on GitHub to install the app, you can still request the installation. Once a GitHub Admin approves the installation, you can come back and select the **App installation** from the list. + + ::: +1. If you have existing apps with OAuth connection, we recommend [switching them over to the GitHub App connection](/en/bitrise-platform/repository-access/github-app-integration/switching-from-oauth-connection-to-the-github-app). + +### Connecting a GitHub app when adding a new project + +:::note[SSO on GitHub] + +If you install the GitHub App integration for a GitHub organization that requires SAML SSO, you need to have an active SAML SSO session on GitHub to be able to connect to the organization's repositories. + +If your installed GitHub app can't access all repositories it should, you might to need to revoke the app and authorize it again on GitHub while you have an active SAML SSO session. + +For more information and the detailed procedure, [check GitHub's documentation](https://docs.github.com/en/enterprise-cloud@latest/apps/using-github-apps/saml-and-github-apps). + +::: + +During the process of [adding a new project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project) on Bitrise, you have to select how Bitrise can access your repository. This process allows connecting the project via the GitHub app. + +1. Start the process of [adding a new project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project). +1. At the **Select a repository** section, select **GitHub App (recommended)** from the **Provider** dropdown menu. + + ![select-repository.png](/img/_paligo/uuid-5fa460a4-aa40-627b-9ccd-d820ef1af5db.png) +1. Click **Connect account**. + + ![connect-github-app.png](/img/_paligo/uuid-bbcc5c35-f82c-f026-b5a7-92bb3040d6da.png) +1. You will be prompted to select the GitHub account or organization you want to connect. If you don't find the one you need in the list, you need to install the App to that account or organization first: click the link below the list of accounts. + + ![install-the-app.png](/img/_paligo/uuid-cae94617-17e3-33ce-8cf7-99205e85bd22.png) +1. Once you click the link, you will be prompted to select an account or organization. After selecting one, you will be transferred to the **Install & Authorize** page. +1. On the **Install & Authorize** page, select the access type: + + - **All repositories**: the Bitrise GitHub App will have access to all repositories belonging to the account or organization, including future ones. + - **Only select repositories**: Select one or more repositories that Bitrise will be able to access. You can add more later but to do so, you will need to reconfigure your repository access on the GitHub App's page. + + ![authorizing-app.png](/img/_paligo/uuid-a25560d9-ce2a-4181-2dc6-59cc4318c577.png) +1. When done, click **Install & Authorize**. You will be redirected to continue adding your new Bitrise project. + +:::note[Connecting multiple GitHub organizations to a Bitrise workspace] + +If you wish your builds to access code that is stored in different GitHub organizations/accounts from your main source code, you can connect multiple GitHub orgs to your Bitrise Workspace using the **+ Add GitHub account**button. + +On the **GitHub** app page of your Workspace, Project Admins, who have installed the Bitrise GitHub app, can find the **+ Add GitHub account** button. This way they can connect up to **10 GitHub accounts/orgs** to their workspace. + +![multipleGithuborgs.png](/img/_paligo/uuid-6986251f-485b-cef8-01b9-c6110f4e4e4f.png) + +::: diff --git a/src/partials/installing-the-offline-workflow-editor-to-your-computer.mdx b/src/partials/installing-the-offline-workflow-editor-to-your-computer.mdx new file mode 100644 index 0000000..0c750ff --- /dev/null +++ b/src/partials/installing-the-offline-workflow-editor-to-your-computer.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Installing the offline Workflow Editor to your computer + +1. [Install the Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html). +1. Make sure you have [Go](https://golang.org/) installed on your local computer. +1. Run `bitrise setup` to install offline Workflow Editor as part of the Bitrise Plugins. + + Running `bitrise setup` also checks if Bitrise Core tools, OS X tools, Bitrise Plugins and Toolkits are installed on your local machine. If not, the command will automatically install them. diff --git a/src/partials/integrated-sso-management-on-bitrise.mdx b/src/partials/integrated-sso-management-on-bitrise.mdx new file mode 100644 index 0000000..eabcf80 --- /dev/null +++ b/src/partials/integrated-sso-management-on-bitrise.mdx @@ -0,0 +1,7 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Integrated SSO management on Bitrise + +While in Jenkins you have to install an authorization plugin for SSO management, in Bitrise it comes as an integral part of our [paid plans](https://bitrise.io/pricing). Workspace with such plans [can set up SAML SSO](/en/bitrise-docs-20/bitrise-platform/accounts/saml-sso-in-bitrise) as their single gateway to their Workspace on Bitrise. No more remembering usernames and credentials! All the Workspace owner has to do is set up Bitrise as a SAML SSO app on the SAML SSO provider and invite Workspace members to the Bitrise Org. We have specific guides to the [different SAML SSO providers](https://docs.bitrise.io/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.html) to guide you through the steps. diff --git a/src/partials/integrating-codecov-with-bitrise.mdx b/src/partials/integrating-codecov-with-bitrise.mdx new file mode 100644 index 0000000..9c6d9ca --- /dev/null +++ b/src/partials/integrating-codecov-with-bitrise.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Integrating Codecov with Bitrise + +In order to start using Codecov, you must be generating coverage reports with your preferred coverage tool (for example, Xcode or Gradle). + +1. Create an account on [https://codecov.io](https://codecov.io). +1. Go to repository’s **Settings** tab on Codecov and copy the repository upload token. + + ![pic1.jpg](/img/_paligo/uuid-c8804850-f923-c194-e029-59d1d39e50d7.jpg) +1. Add the **Codecov** Step to your Workflow on Bitrise. Make sure you add the Step after the Steps that test and collect coverage. + + ![pic2.jpg](/img/_paligo/uuid-a0f5c42f-1f2c-8d2b-a381-5c37bb4fe37c.jpg) +1. Add the Codecov upload token as a secret variable, `CODECOV_TOKEN`, and set the **Expose for Pull Requests** option to `true`. Click **Add new**. + + ![pic3.jpg](/img/_paligo/uuid-cc9dfa1f-9277-fe9e-7d4a-92d5fb04d5d6.jpg) +1. Click **Save** and start a new build to get coverage metrics. + + :::tip[Additional options] + + The Codecov Step wraps around the Codecov bash uploader. You can add additional options in the Step listed in our arguments documentation. + + ::: diff --git a/src/partials/ioniccordova-code-signing-with-automatic-provisioning.mdx b/src/partials/ioniccordova-code-signing-with-automatic-provisioning.mdx new file mode 100644 index 0000000..7405144 --- /dev/null +++ b/src/partials/ioniccordova-code-signing-with-automatic-provisioning.mdx @@ -0,0 +1,57 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Ionic/Cordova code signing with automatic code signing asset management + +1. Make sure your .p12 signing certificates are uploaded to [bitrise.io](https://www.bitrise.io). +1. Add the **Cordova prepare** or the **Ionic prepare** Step to your Workflow. These Steps call the `platform rm` and `platform add` commands. +1. Add the **[Manage iOS Code Signing](https://www.bitrise.io/integrations/steps/manage-ios-code-signing)** Step to your Workflow. If you have both the **Certificate and Profile Installer** and the **Manage iOS Code Signing** Steps in your Workflow, your build might encounter unexpected issues. + + The Step will export: + + - The project’s development team. + - The installed codesign identity’s name. + - The installed provisioning profile. + + :::caution[One code signing Step only] + + If you have both the **Certificate and profile installer** and the **Manage iOS Code Signing** Steps in your Workflow, your build might encounter unexpected issues. + + ::: +1. Select the **Apple service connection method** (based on the [Apple service you have set up in Bitrise](/en/bitrise-platform/integrations/apple-services-connection.html)) and the **Distribution method**. + + ![manage-ios-code.png](/img/_paligo/uuid-de743a8c-7a79-dda4-b9de-e3c71f2ac32a.png) +1. Add the **Generate cordova build configuration** Step to your Workflow. +1. Configure the Step to use the code signing settings exported by the **Manage iOS Code Signing** Step: + + **Development distribution example**: + + ``` + - generate-cordova-build-configuration: + inputs: + - development_team: $BITRISE_DEVELOPER_TEAM + - package_type: development + - code_sign_identity: iPhone Developer + - configuration: debug + ``` + + **Production distribution example**: + + ``` + - generate-cordova-build-configuration: + inputs: + - development_team: $BITRISE_DEVELOPER_TEAM + - package_type: app-store + - code_sign_identity: iPhone Developer + - configuration: release + ``` +1. Add the **Cordova Archive** or the **Ionic Archive** Step to your Workflow. +1. Fill in the required inputs. + + - The **Platform** input needs to be set to: `device`. + - The **Build command configuration** input must match the **Build configuration** input of the **Generate cordova build configuration** Step. + + ![gen-cordova-build.png](/img/_paligo/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png) +1. Set the **Should remove platforms as prepare step?** to `false`. This is crucial: it ensures the Step will not remove and re-add the platform of the native projects generated in the **Cordova prepare** or the **Ionic prepare** Step. +1. Run your build! diff --git a/src/partials/ioniccordova-code-signing-with-manual-provisioning.mdx b/src/partials/ioniccordova-code-signing-with-manual-provisioning.mdx new file mode 100644 index 0000000..18ab8a7 --- /dev/null +++ b/src/partials/ioniccordova-code-signing-with-manual-provisioning.mdx @@ -0,0 +1,28 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Ionic/Cordova code signing with manual code signing asset management + +1. Generate the native Xcode project locally from your Ionic or Cordova project by calling `cordova platform add ios` or `ionic cordova platform add ios`. +1. Upload the files to [bitrise.io](https://www.bitrise.io): open the **Project settings** page and select **Code signing** on the left. Upload a certificate and a provisioning profile. + + ![upload-code-signing.png](/img/_paligo/uuid-88a3d6bf-be6f-1811-a908-9072b4b88a9a.png) +1. Make sure you have the **Certificate and profile installer** Step in your Workflow. +1. Add the **Generate cordova build configuration** Step to your Workflow. It must come after the **Certificate and profile installer** Step. +1. Fill in the required inputs for the Step. Please note that both the **Code Signing Identity** and the **Provisioning Profile** are required inputs for iOS apps even though they are not marked as such. + + - **Build configuration**: you can set it to either `debug` or `release`. + - **Code Sign Identity**: enter a Developer or a Distribution identity. + - **Provisioning Profile**: enter the appropriate provisioning profile. + - **Packaging Type**: this controls what type of build is generated by Xcode. Set the type of code signing you need. + + ![gen-cordova-build.png](/img/_paligo/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png) +1. Add the **Cordova archive** or the **Ionic archive** Step to your Workflow. +1. Fill in the required inputs. + + - The **Platform** input needs to be set to: `device`. + - The **Build command configuration** input must match the **Build configuration** input of the **Generate cordova build configuration** Step. + + This Step must come after the **Generate cordova build configuration** Step in the Workflow. +1. Run your build! diff --git a/src/partials/ios-code-signing-steps-fail.mdx b/src/partials/ios-code-signing-steps-fail.mdx new file mode 100644 index 0000000..e7916ba --- /dev/null +++ b/src/partials/ios-code-signing-steps-fail.mdx @@ -0,0 +1,10 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## iOS code signing Steps fail + +Our [iOS code signing Steps](/en/bitrise-ci/code-signing/ios-code-signing.html) manage your provisioning profiles for you: they download the profiles from the Apple Developer portal and install them for you. Here’s what you can do if these Steps fail: + +- Before trying to use this Step, generate an .ipa file locally - with the same export method you want to use on Bitrise - to ensure that the profiles are uploaded to the Apple Developer portal. +- Make sure that your Bitrise account is connected to the Apple Developer portal and that you have at least an Admin role in your Apple Developer team. diff --git a/src/partials/ip-addresses-for-the-bitrise-website.mdx b/src/partials/ip-addresses-for-the-bitrise-website.mdx new file mode 100644 index 0000000..70c3a00 --- /dev/null +++ b/src/partials/ip-addresses-for-the-bitrise-website.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## IP address ranges for Bitrise backend workers + +Bitrise backend workers are operating behind firewalls and NAT gateways. There are some use cases when our backend workers need to reach your services. + +These addresses may be relevant if you use self-hosted Git services or store your `bitrise.yml` file in the repository. In this way Bitrise can, for example, access the `bitrise.yml` file, or [send build status updates](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html) on commits and pull requests in a self-hosted repository. + +| Service type | IP address ranges for backend workers | +| --- | --- | +| Backend workers Our backend systems reach out to your services and webhooks, or send build status updates on commits, pull requests, and tags in a self-hosted repository. | 35.232.76.43 | +| 34.68.119.18 | | +| 34.135.186.58 | | +| 74.122.**200**.64/28 (74.122.**200.64** - 74.122.**200.78**) 74.122.**201**.64/28 (74.122.**201.64** - 74.122.**201.78**) 74.122.**202**.64/28 (74.122.**202.64** - 74.122.**202.78**) 74.122.**203**.64/28 (74.122.**203.64** - 74.122.**203.78**) | | +| 185.55.**252**.64/28 (185.55.**252.64** - 185.55.**252.78**) 185.55.**253**.64/28 (185.55.**253.64** - 185.55.**253.78**) 185.55.**254**.64/28 (185.55.**254.64** - 185.55.**254.78**) 185.55.**255**.64/28 (185.55.**255.64** - 185.55.**255.78**) | | diff --git a/src/partials/ip-addresses-for-the-build-machines.mdx b/src/partials/ip-addresses-for-the-build-machines.mdx new file mode 100644 index 0000000..dd196b7 --- /dev/null +++ b/src/partials/ip-addresses-for-the-build-machines.mdx @@ -0,0 +1,61 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## IP address ranges for the Bitrise build machines + +For most users, who host their repositories on cloud-based service providers, there is no need for any network configuration to be able to use Bitrise. All we need is permission to access the repository and for that, [an SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) or [an access token](/en/bitrise-platform/repository-access/configuring-https-authorization-credentials) is enough. + +However, your company security policy might not allow unknown and unauthorized IP addresses to communicate with the servers where your code is being stored - either on your own datacenter or in a private cloud. In that case, Bitrise won’t work unless the relevant IP addresses are added to your allow list. + +You will see IP addresses from the following ranges as source when your Bitrise build machines reach out to your services like Git to download your source code, or call into your test backend services, or any other services you run outside Bitrise that are required to be reached as part of your CI workflow. + +:::warning[Allowlist the entire subnet] + +If the provided public IP address is a subnet, you need to allow the entire subnet on your network! For example, 208.52.166.128/28 means all IP addresses between 208.52.166.128 and 208.52.166.143 (208.52.166.128, 208.52.166.129, 208.52.166.130, and so on, all the way to and including 208.52.166.143) have to be allowlisted. + +::: + +:::warning[Multi-tenant vs Single-tenant] + +The build machine IP ranges listed below are for the Bitrise multi-tenant environment. Depending on your organization's security requirements, it may not be advisable to allow access to your network from the Bitrise multi-tenant IP range. For organizations with enhanced security requirements, you can: + +- [Connect by VPN](/en/bitrise-platform/integrations/connecting-to-a-vpn-during-a-build.html). +- [Select a single-tenant environment](/en/bitrise-platform/infrastructure/customizable-enterprise-build-platforms.html). +- [Deploy runners to your own AWS account](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html). + +Feel free to [contact us](https://bitrise.io/contact) if you have questions. + +::: + +| Stack type | Public IP | +| --- | --- | +| Xcode stacks If you run your builds using Xcode stacks, they will run on machines with the IP address ranges in the **Public IP** column. For example, if you run `curl` from a build, the source IP will be from these IP ranges. | 74.122.**200**.224/27 (74.122.**200.224** - 74.122.**200.255**) 74.122.**201**.224/27 (74.122.**201.224** - 74.122.**201.255**) 74.122.**202**.224/27 (74.122.**202.224** - 74.122.**202.255**) 74.122.**203**.224/27 (74.122.**203.224** - 74.122.**203.255**) | +| 185.55.**252**.224/27 (185.55.**252.224** - 185.55.**252.255**) 185.55.**253**.224/27 (185.55.**253.224** - 185.55.**253.255**) 185.55.**254**.224/27 (185.55.**254.224** - 185.55.**254.255**) 185.55.**255**.224/27 (185.55.**255.224** - 185.55.**255.255**) | | +| 208.52.166.154/**32** 208.52.166.128/**28** | | +| 207.254.0.248/**29** 207.254.0.208/**28** | | +| 207.254.34.148/**32** 207.254.33.176/**28** | | +| Linux/Docker stacks If you run your builds using Linux/Docker stacks, they will run on machines with the IP address ranges in the **Public IP** column. For example, if you run `curl` from a build, the source IP will be from these IP ranges. | 74.122.**200**.224/27 (74.122.**200.224** - 74.122.**200.255**) 74.122.**201**.224/27 (74.122.**201.224** - 74.122.**201.255**) 74.122.**202**.224/27 (74.122.**202.224** - 74.122.**202.255**) 74.122.**203**.224/27 (74.122.**203.224** - 74.122.**203.255**) | +| 185.55.**252**.224/27 (185.55.**252.224** - 185.55.**252.255**) 185.55.**253**.224/27 (185.55.**253.224** - 185.55.**253.255**) 185.55.**254**.224/27 (185.55.**254.224** - 185.55.**254.255**) 185.55.**255**.224/27 (185.55.**255.224** - 185.55.**255.255**) | | +| 104.197.15.74/32 | | +| 34.123.172.192/32 | | +| 34.125.50.224/32 | | +| 34.125.82.130/32 | | +| 34.134.193.138/32 | | +| 34.138.187.10/32 | | +| 34.150.152.190/32 | | +| 34.162.185.129/32 | | +| 34.162.202.37/32 | | +| 34.162.229.32/32 | | +| 34.162.29.153/32 | | +| 34.162.88.79/32 | | +| 34.23.207.105/32 | | +| 34.85.139.176/32 | | +| 34.85.240.93/32 | | +| 34.86.56.118/32 | | +| 35.202.121.43/32 | | +| 35.225.44.167/32 | | +| 35.231.56.118/32 | | +| 35.237.165.17/32 | | +| 35.243.148.182/32 | | +| 35.245.56.67/32 | | diff --git a/src/partials/is-it-possible-to-disable-ai-features-on-bitrise.mdx b/src/partials/is-it-possible-to-disable-ai-features-on-bitrise.mdx new file mode 100644 index 0000000..4d69868 --- /dev/null +++ b/src/partials/is-it-possible-to-disable-ai-features-on-bitrise.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Is it possible to disable AI features on Bitrise? + +Yes. Customers may disable AI features at: + +- Feature level +- Workspace level + +Please [contact our support team](https://support.bitrise.io/en/articles/11689194-how-to-submit-a-ticket-to-bitrise-support) if you want to disable or enable any or all AI assisted features. diff --git a/src/partials/jenkins-pipeline-bitrise-workflow.mdx b/src/partials/jenkins-pipeline-bitrise-workflow.mdx new file mode 100644 index 0000000..b697925 --- /dev/null +++ b/src/partials/jenkins-pipeline-bitrise-workflow.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Jenkins Pipeline - Bitrise Workflow + +A Jenkins Pipeline is equivalent to a [Bitrise Workflow](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html), but the Bitrise Workflows are much easier to manage: you can quickly create new Workflows based on existing ones, chain multiple Workflows together in a single build, or delete Workflows that you no longer need. + +A Bitrise **Workflow** is a series of Steps, such as test, code sign, build APK/ ipa and deploy. When you add an project to Bitrise, a primary Workflow, created based on the project scanner’s findings, gets kicked off/triggered automatically. + +You can have several Workflows for a certain project. For example: + +- For any PR events, create a Workflow that, once triggered, runs quickly and only executes basic tests such as smoke tests. +- For a meatier Workflow, that runs all your test, we recommend creating another Workflow and run it overnight or schedule it on 6/12/24 hour interval. + +The **Workflow Editor** is the main place for configuring your Workflow. Jenkins **Stages** are equal to multiple Bitrise Workflows chained together inside a main Workflow. On Bitrise the Workflow Editor helps you to chain Workflows like one would chain toy trains after each other. + +The Workflow Editor has other powerful features built in to assist you with mobile development: + +- [Code signing](/en/bitrise-ci/code-signing/ios-code-signing.html): Upload certificates, provisioning profiles, and keystores into Bitrise and and use our [iOS](https://docs.bitrise.io/en/bitrise-ci/code-signing/ios-code-signing/ios-code-signing.html)and [Android](https://docs.bitrise.io/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html) signing Steps to do all the code signing automatically for you before releasing an app to an app store. +- [Secrets](/en/bitrise-ci/configure-builds/secrets): check out your project's secret Environment Variables or add new ones. +- [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables): there is no confusion of secrets and Env Vars in Bitrise. They are neatly organized into separate tabs so that you know where’s what. Add project Env Vars or Workflow specific Env Vars here. You can also reference Secrets as Env Vars with $. +- [Triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html): You can configure triggers: code push events, pull requests, or tags can all be set up to automatically start builds on Bitrise. +- [Stack](/en/bitrise-build-hub/infrastructure/build-stacks.html): Check out the default stack of your project, select a new one from a dropdown menu or select a specific stack for one of your Workflows. diff --git a/src/partials/jenkins-plugins-and-bitrise-steps.mdx b/src/partials/jenkins-plugins-and-bitrise-steps.mdx new file mode 100644 index 0000000..8aa1583 --- /dev/null +++ b/src/partials/jenkins-plugins-and-bitrise-steps.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Jenkins plugins and Bitrise Steps + +A [Step](https://docs.bitrise.io/en/bitrise-ci/workflows-and-pipelines/steps/steps-overview.html) is a pre-defined task in Bitrise just like the Jenkins Steps, however, a Bitrise Step can be easily configured on our intuitive UI or you can even pull in your own Step from your repository. You can configure the inputs and parameters that define a Step task, and view/reuse the outputs a Step generates. Reusing the output means that another Step in the same Workflow can use it as the value of one of its inputs. + +As being a continuous integration tool itself, Jenkins integrates with other services with the help of plugins. Jenkins users have to manage plugins in a centralized place, called **Manage plugins**, install them globally (on their Jenkins server), then use them in their specific projects. If Jenkins notifies of a newer plugin version, Jenkins admins have to doublecheck with their teams if they’re running any builds since updating a plugin requires the server to restart. With Jenkins plugins, reverting to an older version is not possible, since only the latest version is available. In Bitrise, however, you do not have to install any Steps first, because you can add or remove any Step in your Bitrise Workflow at any time as you wish and it won’t block any running builds of the project. You can always revert back to a previous Step version too if that’s what you need. + +What’s more: When editing your Workflow in the **Workflow Editor**, you can easily search for a Step based on functionality or platform you are looking for in the **Step Library** and add it to your Workflow straightaway - there is no need to install them prior to setting up your Workflow. + +You can [create your own custom Step](https://docs.bitrise.io/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step.html) too and store in a repository, then you can reference it by a URL in your Workflow. + +:::tip[A Step jolly joker: our Script Step] + +Do you have a [custom script](https://bitrise.io/integrations/steps/script) you’d like to run in your Workflow? Select the **Script** Step from the Step Library and add your custom code to the **Script content** input. + +::: + +Discover our Steps on our [Integrations](https://www.bitrise.io/integrations/steps) page or right when editing your Workflow. + +Learn what else you can do with Steps: + +- [Adding Steps to a Workflow](/en/bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow). +- [Step versions](/en/bitrise-ci/workflows-and-pipelines/steps/step-versions). +- [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). +- [Developing your own Bitrise Step](/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step). + +:::note[Using fastlane in Jenkins?] + +You can easily put your fastlane lanes to work on Bitrise too. All you have to do is add a Bitrise’s [**Fastlane**](https://www.bitrise.io/integrations/steps/fastlane) Step to your Workflow and add your lane name into the Step. Start a build and your lane will run on Bitrise. + +For more information, check out our guide on [see topic](urn:resource:component:77300). + +::: diff --git a/src/partials/jenkinsfile-bitrise-yaml.mdx b/src/partials/jenkinsfile-bitrise-yaml.mdx new file mode 100644 index 0000000..dacfcda --- /dev/null +++ b/src/partials/jenkinsfile-bitrise-yaml.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Jenkinsfile - Bitrise YAML + +A Jenkins Pipeline uses groovy code, while Bitrise uses the more highly structured YAML format. All Workflows are defined in the `bitrise.yml` file in YAML format, which you can edit by clicking the **bitrise.yml** tab of the Workflow Editor. + +You can store the `bitrise.yml` file of your app either on [bitrise.io](http://bitrise.io/) or [in your repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository). Don’t worry, your secrets (for example, credentials and IDs) are safe with us. + +You can also download the current `bitrise.yml` configuration of your app and run it locally with the [Installing and updating the Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli). + +### Jenkinsfile - Bitrise yml file comparison + +If you have been using a Jenkinsfile (Pipeline project) in Jenkins and and considering to switch to Bitrise, you can easily match Jenkinsfile stages with Bitrise Steps. If you have been using the old-school Freestyle project, then you have to map your configuration’s settings with a matching Bitrise Step or a Bitrise function. For example, match the **Build** section of your Freestyle project with a Bitrise build Step, such as the [Android Build](https://app.bitrise.io/integrations/steps/android-build) Step, or map the **Build Trigger** section of Jenkins with the [Triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) function of Bitrise. Make sure you check out our [Step Library](https://www.bitrise.io/integrations/steps) for more inspiration. + +:::tip[Migrating your Android app from Jenkins to Bitrise: a step-by-step guide] + +Check out our [blogpost](https://blog.bitrise.io/post/migrate-your-android-app-from-jenkins) on how to migrate your Android project from Jenkins to Bitrise. + +::: diff --git a/src/partials/key-based-caching-templates-and-functions.mdx b/src/partials/key-based-caching-templates-and-functions.mdx new file mode 100644 index 0000000..af0d839 --- /dev/null +++ b/src/partials/key-based-caching-templates-and-functions.mdx @@ -0,0 +1,54 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Key-based caching templates and functions + +Both key-based caching Steps support using template elements in their Step inputs. The Steps evaluate the key template at runtime and the final cache key to be used can change depending on the build environment or on certain files in the repository. + +### Available caching templates + +| Template expression | Definition | Possible values | +| --- | --- | --- | +| `cache-key-{{ .Branch }}` | Current git branch the build runs on. | The exact name of any existing branch of the app. | +| `cache-key-{{ .CommitHash }}` | SHA-256 hash of the git commit the build runs on. | Any existing commit hash. | +| `cache-key-{{ .Workflow }}` | Current Bitrise workflow name (for example, `primary`). | The exact name of any existing Workflow of the app. | +| `{{ .OS }}-cache-key` | Current operating system of the build stack (`linux` or `darwin`). | - `linux`: For Linux-based stacks. - `darwin`: For macOS-based stacks. | + +### Using functions in caching templates + +The key-based caching templates support the use of two different functions: + +- `checksum`: This function computes the SHA-256 checksum of the contents of one or more files. This is useful for creating unique cache keys based on files that describe content to cache. [see topic](#example-idm4632103908784033235626374715). +- `getenv`: This function returns the value of an [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) (Env Var) or an empty string if the variable is not defined. [see topic](#example-idm4632103911721633235681726838) + +**Using the checksum function** + +Use the `checksum` function to create a key that computes the checksum of the `package-lock.json` file: + +``` +- save-cache@1: + inputs: + - key: npm-cache-{{ checksum "package-lock.json" }} + - paths: node_modules +``` + +Use the `checksum` function to create a key that computes a checksum for any `.gradle` file and the `gradle.properties` file: + +``` +- save-cache@1: + inputs: + - key: gradle-cache-{{ checksum "**/*.gradle*" "gradle.properties" }} + - paths: AndroidApp +``` + +**Using the getenv function** + +Use the `getenv` function to create a key that contains the value of the BITRISE_BUILD_NUMBER Env Var. + +``` +- save-cache@1: + inputs: + - key: npm-cache-{{ getenv "BITRISE_BUILD_NUMBER" }} + - paths: node_modules +``` diff --git a/src/partials/key-matching-for-cache-archives.mdx b/src/partials/key-matching-for-cache-archives.mdx new file mode 100644 index 0000000..8944994 --- /dev/null +++ b/src/partials/key-matching-for-cache-archives.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Key matching for cache archives + +It's possible to define more than one key in the **Cache keys** input of the key-based caching Steps. You can specify additional keys by listing one key per line. The list is in priority order, so the Step will first try to find a match for the first key you provided, and if there is no cache stored for the key, it will move on to find a match for the second key (and so on). + +``` +inputs: + key: | + key-1 + key-2 + key-3 +``` + +In addition to listing multiple keys, each key can be a prefix of a saved cache key and still get a matching cache archive. For example, the key `my-cache-` can match an existing archive saved with the key `my-cache-a6a102ff`. We recommend configuring the keys in a way that the first key is an exact match to a checksum key, and to use a more generic prefix key as a fallback: + +``` +inputs: + key: | + npm-cache-{{ checksum "package-lock.json" }} + npm-cache- +``` diff --git a/src/partials/limitations-and-alternatives.mdx b/src/partials/limitations-and-alternatives.mdx new file mode 100644 index 0000000..8b8caa6 --- /dev/null +++ b/src/partials/limitations-and-alternatives.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Limitations and alternatives + +- **No visual editor**: This feature is configurable only in configuration YAML for now. +- **Dedicated version manager tools**: We recommend you use the approaches described in this page for installing tools. + + If you need to use `mise` or another tool directly, be aware that it is not installed on the stacks. You need to install it according to the official instructions. + + `asdf` is installed on stacks by default. We do not make guarantees that we pin a specific version, especially on edge stacks. `asdf` may be removed in a future edge stack. diff --git a/src/partials/listing-build-artifacts.mdx b/src/partials/listing-build-artifacts.mdx new file mode 100644 index 0000000..a6f8e58 --- /dev/null +++ b/src/partials/listing-build-artifacts.mdx @@ -0,0 +1,57 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Listing build artifacts + +:::note[Required role] + +You must have a tester/QA, developer, admin, or owner role on the app's team to list build artifacts using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +To be able to use build artifact endpoints, you have to first list all artifacts that belong to an app’s build. The response will list all artifacts along with their slug which you will need later. + +The required parameters are: + +- app slug +- build slug + +You can use the generated build artifact slug/s from the response output with other build artifact endpoints where the build artifact slug is a required parameter. + +**Listing the artifacts of an app** + +Request: + +``` +curl -X GET "https://api.bitrise.io/v0.1/apps/87a5991e180d91a9/builds/b234f959745082e0/artifacts" -H "accept: application/json" -H "Authorization: THE-ACCESS-TOKEN" +``` + +Response: + +``` +{ + "data": [ + { + "title": "another_app-debug.apk", + "artifact_type": "android-apk", + "is_public_page_enabled": true, + "slug": "92e0b6ecae87b832", + "file_size_bytes": 1574799 + }, + { + "title": "app-debug.apk", + "artifact_type": "android-apk", + "is_public_page_enabled": true, + "slug": "54ae701761c4f956", + "file_size_bytes": 1574793 + } + ], + "paging": { + "total_item_count": 2, + "page_item_limit": 50 + } +} +``` diff --git a/src/partials/listing-the-android-keystore-files-of-an-app.mdx b/src/partials/listing-the-android-keystore-files-of-an-app.mdx new file mode 100644 index 0000000..d00b717 --- /dev/null +++ b/src/partials/listing-the-android-keystore-files-of-an-app.mdx @@ -0,0 +1,58 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Listing the Android keystore files of an app + +:::important[Required role] + +You must have an admin or owner role on the app's team to manage Android keystore files using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [User roles on app teams](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + +::: + +Retrieve a list of the Android keystore files of an app with the GET method of the `android-keystore-files` endpoint. The returned data includes, among other things, the names of the files, their size, as well as their current status. + +The required parameter is: + +- app slug + +Optional parameters are: + +- next: slug of the first file in the response (as a string) +- limit: max number of elements per page (as an integer) where the default is 50. + +**Getting all Android keystore files of an app** + +Request: + +``` +curl -X GET -H  'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/android-keystore-files' +``` + +Response: + +``` +{ + "data": [ + { + "upload_file_name": "simplesample.jks", + "upload_file_size": 2062, + "slug": "01GDFZW5DZED3DQD4VK835FKTP", + "processed": true, + "is_expose": true, + "is_protected": false, + "user_env_key": "ANDROID_KEYSTORE", + "exposed_meta_datastore": { + "PASSWORD": "", + "ALIAS": "", + "PRIVATE_KEY_PASSWORD": "" + } + } + ], + "paging": { + "total_item_count": 1, + "page_item_limit": 50 + } +``` diff --git a/src/partials/listing-the-archived-builds-of-an-app.mdx b/src/partials/listing-the-archived-builds-of-an-app.mdx new file mode 100644 index 0000000..fd6dd66 --- /dev/null +++ b/src/partials/listing-the-archived-builds-of-an-app.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Listing the archived builds of an app + +By default, you can only view builds that aren't older than 200 days. This is true for most API endpoints, too. However, you can also view older, archived builds by calling the `GET /apps/{app-slug}/archived-builds` endpoint. + +The endpoint has two required parameters: + +- after +- before + +Both parameters are dates represented using Unix timestamps and both are required! In other words, you have to specify the exact time period in which you want to see your archived builds. + +**Listing all archived builds between 2021-01-01 and 2022-01-01** + +``` +curl -X 'GET' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/archived-builds?after=1609459200&before=1640995200' \ + -H 'accept: application/json' \ + -H 'Authorization: THE_ACCESS_TOKEN' +``` diff --git a/src/partials/listing-the-ios-code-signing-files-of-an-app.mdx b/src/partials/listing-the-ios-code-signing-files-of-an-app.mdx new file mode 100644 index 0000000..d897a7d --- /dev/null +++ b/src/partials/listing-the-ios-code-signing-files-of-an-app.mdx @@ -0,0 +1,61 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Listing the iOS code signing files of an app + +:::note[Required role] + +You must have an admin or owner role on the app's team to manage iOS code signing files using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +Wondering how many iOS code signing files belong to an app? Get a list of them using the `GET` method of the `provisioning-profiles` and `build-certificates` endpoints. + +The required parameter is: + +- app slug + +Optional parameters are: + +- next: slug of the first file in the response (as a string) +- limit: max number of elements per page (as an integer) where the default is 50. + +**Getting all provisioning profiles of an app** + +Request: + +``` +curl -X GET -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/provisioning-profiles' +``` + +Response: + +``` +{ + "data": [ + { + "upload_file_name":"sample.provisionprofile", + "upload_file_size":2047, + "slug":"01C6FA6P6HRQT5PQ8RMMVVXE6W", + "processed":false, + "is_expose":true, + "is_protected":false + }, + { + "upload_file_name":"sample2.provisionprofile", + "upload_file_size":2047, + "slug":"01C6FA6P6HRQT5PQ8RMMVVXE5T", + "processed":true, + "is_expose":true, + "is_protected":true + } + ], + "paging": { + "page_item_limit": 50, + "total_item_count": 2 + } +} +``` diff --git a/src/partials/listing-the-uploaded-files-of-an-app.mdx b/src/partials/listing-the-uploaded-files-of-an-app.mdx new file mode 100644 index 0000000..edd02f5 --- /dev/null +++ b/src/partials/listing-the-uploaded-files-of-an-app.mdx @@ -0,0 +1,57 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Listing the uploaded files of a project + +:::note[Required role] + +You must have an admin or owner role role on the app's team to manage files in the Generic File Storage using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +Get a list of a project's files that were [uploaded to the Generic File Storage](/en/bitrise-ci/run-and-analyze-builds/managing-build-files.html) using the `GET` method. Please note that the **maximum number of files is 50**. + +The required parameter is: + +- App slug + +Optional parameters are: + +- `next`: slug of the first file in the response (as a string) +- `limit`: max number of elements per page (as an integer) + +**Listing the apps** + +Request: + +``` +curl -X GET -H 'Authorization: ' 'https://api.bitrise.io/v0.1/apps//generic-project-files' +``` + +Response: + +``` +{ + "data": [ + { + "upload_file_name": "Test_File.md", + "upload_file_size": 4865, + "slug": "01D7F228E7N8Q8WQJKJM8FV3XM", + "processed": true, + "is_expose": true, + "is_protected": false, + "user_env_key": "Test_File", + "exposed_meta_datastore": null + } + ], + "paging": { + "total_item_count": 2, + "page_item_limit": 50 + } +} +``` + +As you can see, the example response shows the list of files specific to a project. diff --git a/src/partials/locking-a-step-to-a-major-or-minor-version.mdx b/src/partials/locking-a-step-to-a-major-or-minor-version.mdx new file mode 100644 index 0000000..de78372 --- /dev/null +++ b/src/partials/locking-a-step-to-a-major-or-minor-version.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Locking a Step to a major or minor version + +On the graphical UI of the Workflow Editor, you can choose between locking a Step to either a major version or a minor version in any of your Workflows. This determines what version of the Step your Workflow will use. + +Locking a Step to a version means that your Workflow is automatically updated to use the latest release of the Step’s selected version type, either major or minor, but it won’t get updated if a different major or minor version is released. + +- If a Step is locked to a major version, it is automatically updated if a new minor version or a new patch for that major version is released. If a new major version is released, it won’t be updated. +- If a Step is locked to a minor version, it is automatically updated only if a new patch for that minor version is released. If a new minor or major version is released, it won’t be updated. + +**Version locking** + +The Example Step’s current version in the Workflow is 2.3.3. A new minor version comes out: 2.4.0. + +- If the Step is locked to major version 2.x.x, the Step is updated to 2.4.0. +- If the Step is locked to minor version 2.3.x, the Step is NOT updated to 2.4.0. + +Now let’s say the Example Step gets a new major version: 3.0.0! + +In that case, the Step will not be automatically updated either way. If you want to use the new version, you need to lock the Step to either major version 3.x.x or minor version 3.0.x. This way you can be sure that a new update will not break your builds. + +To lock a Step to a major or minor version: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Select the Step. +1. Go to the **Properties** tab. +1. Open the **Version updates** dropdown menu, and select your version. + + ![step-versions.png](/img/_paligo/uuid-eec007b7-1459-0f25-5112-9c312f47a189.png) diff --git a/src/partials/maintaining-macos-stacks.mdx b/src/partials/maintaining-macos-stacks.mdx new file mode 100644 index 0000000..71f5f0f --- /dev/null +++ b/src/partials/maintaining-macos-stacks.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Maintaining Xcode stacks + +We offer a wide variety of Xcode stacks in order to make sure you do not need to immediately switch when a new version comes out. Our policy is as follows: + +- Keep the three most recent major versions of Xcode. +- Keep the two most recent minor versions for each major version of Xcode. + +We base our policy on Apple's current release cadence: first beta in June, general availability in September. + +1. The life cycle of a major Xcode version on our stacks is 36 months. +1. For 24 months, the stack is active and maintained according to our stack update policy. +1. After 24 months, the stack becomes frozen for 12 months and it will no longer receive updates. At this point, we strongly recommend migrating to an active stack. +1. After the end of the 36th month, the stacks of the major Xcode version are removed. + +**Maintaining Xcode stacks** + +When Xcode version 15.2.x is released, we will keep: + +All the latest patch releases for the two most recent minor versions of Xcode 15: + +- 15.2 +- 15.1 + +Xcode 15.0 will be removed. + +The two latest versions from the previous two Xcode major versions: + +- Xcode 14.3 +- Xcode 14.2 +- Xcode 13.4 (frozen) +- Xcode 13.3 (frozen) + +In all cases, there will be a minimum of four weeks' notice provided for the removal of these stacks. You can see all upcoming stack deprecations [on this page](https://stacks.bitrise.io/announcements/upcoming-stack-deprecations/). We also recommend subscribing to [RSS updates](https://stacks.bitrise.io/tips/get-notified/) of important announcements about stacks. diff --git a/src/partials/managing-an-existing-app.mdx b/src/partials/managing-an-existing-app.mdx new file mode 100644 index 0000000..8c380e2 --- /dev/null +++ b/src/partials/managing-an-existing-app.mdx @@ -0,0 +1,75 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing an existing app + +| Endpoints | Function | Required role on the app's team | +| --- | --- | --- | +| GET /apps | Get list of your apps. | Any | +| GET /apps/\{app-slug\} | Get a specific app. | Any | +| GET /apps/\{app-slug\}/bitrise.yml | Get the bitrise.yml of a specific app. | Owner or Admin | +| GET /apps/\{app-slug\}/branches | List the branches of an app’s repository. | Any | +| GET /organizations/\{org-slug\}/apps | Get list of the apps for a Workspace. | Any | +| GET /users/\{user-slug\}/apps | Get list of the apps for a user. | Any | +| PATCH /apps/\{app-slug\} | Update an existing app's parameters | Owner or Admin | + +The response to any GET request regarding one or more apps will contain the app slug, its project type, the git provider, the repository’s owner and URL: + +``` +{ + "data": [ + { + "slug": "eeeeefffff00000", + "title": "sample-app", + "project_type": "android", + "provider": "github", + "repo_owner": "example-user", + "repo_url": "git@github.com:example-user/sample-app.git", + "repo_slug": "android-gradle-kotlin-dsl", + "is_disabled": false, + "status": -1, + "is_public": false, + "owner": { + "account_type": "organization", + "name": "Test Org", + "slug": "fffffeeeee00000" + }, + "avatar_url": null + }, + { +``` + +You can also download the existing bitrise.yml file of any app: the response will contain the full YAML configuration. + +Would you like to change the title or the default git branch of an existing app? You can update an existing app's parameters by calling the PATCH method of the `apps` endpoint. + +:::important[Required role] + +You must have an admin or owner role on the app's team to update an existing app's parameters using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [User roles on app teams](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + +::: + +The required parameter is: + +- slug + +The optional parameters are: + +- apple_credential_user_id: The new apple credential user ID (recommendation: use the UI to set this) +- apple_credential_user_slug: The new apple credential user slug (recommendation: use the UI to set this) +- default_branch: The new default branch for the application. +- is_public: The new the value if the application should be publicly visible. +- repository_url: The new repository URL for the application. +- services_credential_user_id: The new service credential user ID (recommendation: use the UI to set this). +- title: The new title of the application. + +**Changing the name and the default branch of an existing app** + +Request: + +``` +curl -X 'PATCH' 'https://api.bitrise.io/v0.1/apps/THE-APP-SLUG' -H 'accept: application/json' -H 'Authorization: ACCESS-TOKEN' -H 'Content-Type: application/json' -d '{"default_branch": "main", "title": "Example_app_title_3"}' +``` diff --git a/src/partials/managing-app-access-for-workspace-groups.mdx b/src/partials/managing-app-access-for-workspace-groups.mdx new file mode 100644 index 0000000..a6edba0 --- /dev/null +++ b/src/partials/managing-app-access-for-workspace-groups.mdx @@ -0,0 +1,50 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing app access roles for Workspace groups + +You can grant [Workspace groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups/creating-groups-for-workspaces) access to application teams on Bitrise. It means that all members of the group will be able to work on the app in [the role assigned to the group](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + +List all groups that have been granted a given role on an app's team by using the `GET /apps/{app-slug}/roles/{role-name}` endpoint. The role-name parameter takes three possible values: + +- `admin` +- `manager`: this is the equivalent of the **Developer** role on bitrise.io. +- `member`: this is the equivalent of **Tester/QA** on bitrise.io. + +In this example, we're querying a list of Workspace groups that have been granted Admin role to a specific app: + +``` +curl -X 'GET' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/roles/admin' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' +``` + +Grant access to existing Workspace groups by using the `PUT /apps/{app-slug}/roles/{role-name}` endpoint. This endpoint requires a `groups` object that contains the slugs of all the groups that are granted access with the specified role. + +:::important[Specify all groups] + +This endpoint replaces all previous groups that had the specified role on the app's team. If, for example, you call the endpoint to grant the groups Alpha and Beta the Admin role on the app's team, only Alpha and Beta will have Admin access to the app afterwards. If another group - let's call it Delta - previously had Admin role on the team, it will be removed. + +::: + +:::tip[Getting the group slugs] + +To get the group slugs of your Workspace, use the `[GET /organizations/{org-slug}/groups](https://api-docs.bitrise.io/#/organizations/organzation-groups-list)` endpoint. + +::: + +In the following example, we'll be granting several groups Admin access: + +``` +curl -X 'PUT' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/roles/admin' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "groups": [ + "GROUP-SLUG-1", "GROUP-SLUG-2" + ] +}' +``` diff --git a/src/partials/managing-app-notifications.mdx b/src/partials/managing-app-notifications.mdx new file mode 100644 index 0000000..6d7d954 --- /dev/null +++ b/src/partials/managing-app-notifications.mdx @@ -0,0 +1,29 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing app notifications + +You can change [the email notification settings](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications/changing-your-email-notification-settings) of your apps via an API call at any time with the `PATCH/apps/{app-slug}/update-email-notifications` endpoint. The endpoint takes two parameters: + +- on_failure: Email notification settings for failed builds. +- on_success: Email notification settings for successful builds. + +Both parameters take three possible values: + +- `always`: Always send notification. The default value for failed builds. +- `never`: Never send notification. +- `change`: Send notification only when the [build status](/en/bitrise-ci/run-and-analyze-builds/build-statuses.html) changes compared to the previous build on the same branch. The default value for successful builds. + +For example, if you wish to receive a notification for a failed build only when the previous build was successful, you need to set the value of the on_failure parameter to `change` (replace the APP-SLUG in the example with your app's slug and ACCESS-TOKEN with your [personal access token](/en/bitrise-platform/accounts/personal-access-tokens.html)): + +``` +curl -X 'PATCH' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/update-email-notifications' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "on_failure": "change", +}' +``` diff --git a/src/partials/managing-builds-on-jenkins-and-on-bitrise.mdx b/src/partials/managing-builds-on-jenkins-and-on-bitrise.mdx new file mode 100644 index 0000000..2362915 --- /dev/null +++ b/src/partials/managing-builds-on-jenkins-and-on-bitrise.mdx @@ -0,0 +1,41 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing builds on Jenkins and on Bitrise + +A build on Bitrise is the process specified by the app’s [Workflow](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html). It is a series of [Steps](/en/bitrise-ci/workflows-and-pipelines/steps/steps-overview.html), defined in a Workflow, executed by the [Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html) on a clean virtual machine or locally on your machine. You can check your app’s builds on the Bitrise **Dashboard** or you can analyze your [build logs](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html) on your app’s own **Builds** page. + +### Triggering builds on Jenkins and Bitrise + +In this section we describe how you can trigger builds on Bitrise: + +- The **Build Now** function on Jenkins corresponds with [starting a build manually](/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html): click the button on your builds page and either simply start a new build or tinker away with the [Advanced configuration options](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds/scheduling-a-build/advanced-configuration-options). +- The **Build periodically** function of Jenkins is the [Scheduling builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds) function on Bitrise. A big advantage of Bitrise is that you don’t have to set up a `cron` job, like you would on Jenkins, to schedule a specific time. Instead, select a day/s from the timeline and type an hour and a month. No confusion over `cron` expressions any more! +- For any Git related events, such as code push, pull requests, and Git tags, you can [configure triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) that automatically start a build on Bitrise. +- The **Build after other projects** function of Jenkins is equivalent to the [chaining Workflows together](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows.html) on Bitrise where the Workflows run in succession. It’s surprisingly easy to chain Workflows together on Bitrise. +- You can trigger builds by any other remote system: use [Webhooks overview](/en/bitrise-platform/integrations/webhooks/webhooks-overview). We’re integrated with GitHub, Gitlab, Bitbucket, Gogs, Slack, Visual Studio, Assembla, and Deveo. +- You can also [push back build status reports](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html) to your Git provider (GitHub/GitLab/Bitbucket). + +### Environment Variables and Secrets on Bitrise + +[Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) (a key and value pair) can be defined on app, Workflow and Steps level. + +You can do lots of interesting things with Env Vars: + +- [Expose them and reuse them in another Step.](/en/bitrise-ci/configure-builds/environment-variables/exposing-env-vars-and-using-them-in-another-step-or-workflow) +- Copy an Env Var to another key. +- Overwrite an Env Var. +- Parameterize a build by adding custom Env Vars to a build. +- Set up Workflow-specific Env Vars on the **Env Vars** tab to run Workflows with Env Vars that are only available for that particular Workflow. + +Secrets are a type of Environment Variables but special ones. They hide sensitive information in an encrypted format so that your private input is not exposed in the build logs or in the `bitrise.yml`. Secret Environment Variables, or Secrets in short, can be set by adding a key and the variable in the **Secrets** tab of the Workflow Editor. This is again a built-in feature of Bitrise which ensures the following: + +- Your secrets are not shown in the `bitrise.yml`. +- Your secrets are stored encrypted. +- You can prevent exposing secrets on the UI by making them protected. +- Note that anyone might be able to do a workaround and log the value of secrets with a pull request, thus we advise NOT to expose secrets in PRs. + +### Build caching + +Every build on Bitrise runs on a clean virtual machine but it does not mean you have to do everything from scratch - [you can cache contents of important files and preserve them between builds.](/en/bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview) diff --git a/src/partials/managing-contributions.mdx b/src/partials/managing-contributions.mdx new file mode 100644 index 0000000..b85c0e0 --- /dev/null +++ b/src/partials/managing-contributions.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing contributions + +The following guidelines aim to help Verified Step authors categorize contributions. The Verified Step author is responsible for any contribution made to the Verified Step. The Verified Step author acknowledges the contribution by adding a label an estimated time to perform the fix, and merge the PR. There are four labels the author can use to categorize the type of contribution: + +- `critical-bug` label means that the current feature set has abnormal behavior, which blocks users from using the Step and there is no workaround to fix the issue. This critical bug must be fixed by the author. +- `bug` label means that the current feature set has abnormal behavior, which does not block users from using the Step and there is a workaround for the issue. This bug must be fixed by the author. +- `feature-request` label means that a new feature or Step is being requested. The Verified Step author can decide if the feature is worth implementing. +- `maintenance` label means improving the Step’s source code in a way that it does not add new features or potential bugs to the Step. The Verified Step author can decide whether the feature is worth implementing or not. +- `rejected` label means the contribution which gets rejected by the Verified Step author must be closed within the first response time, that is 5 business days. When rejecting a contribution, the Verified Step author has to provide an explanation to the contributor within the first response time. +- `accepted` contribution means that the given: critical-bug, bug, feature, maintenance will be fixed/merged within the given resolution time. + +First response time means that there is a 5 day window during which the Verified Step author should respond to the contribution with the accepted or rejected labels. + +Resolution time means a certain amount of business days during which the contribution (issue or PR) should be completed by the Verified Step author. + +| Type | First response time | Resolution time | +| --- | --- | --- | +| critical-bug | 5 business days | 10 business days | +| bug | 5 business days | 15 business days | +| feature-request | 5 business days | 20 business days | +| maintenance | 5 business days | 20 business days | diff --git a/src/partials/managing-dependencies-for-android-apps.mdx b/src/partials/managing-dependencies-for-android-apps.mdx new file mode 100644 index 0000000..b022185 --- /dev/null +++ b/src/partials/managing-dependencies-for-android-apps.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing dependencies for Android projects + +The Gradle build system allows you include external binaries or other library modules as dependencies. Bitrise can install these dependencies for your project during the build process. + +:::tip[Adding build dependencies] + +You can read more about adding dependencies to your Android project: [https://developer.android.com/studio/build/dependencies](https://developer.android.com/studio/build/dependencies) + +::: + +1. Make sure your project's `build.gradle` file lists all your dependencies. +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Make sure your Workflow includes the **Android Build** Step. + + If the project scanner generated a Workflow called **deploy** when first adding your app, that Workflow includes the Step. It installs all dependencies listed in the `build.gradle` file without any additional configuration. +1. Make sure your Workflow includes the **Install missing Android SDK components** Step. + + The Step must be BEFORE the **Android Build** Step in the Workflow. It will install all Android SDK tool that your project might need. diff --git a/src/partials/managing-dependencies-for-web-ci-projects.mdx b/src/partials/managing-dependencies-for-web-ci-projects.mdx new file mode 100644 index 0000000..44050c9 --- /dev/null +++ b/src/partials/managing-dependencies-for-web-ci-projects.mdx @@ -0,0 +1,48 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing dependencies + +Bitrise supports several dependency managers with dedicated Steps that make it easy to handle dependencies. For web CI projects, the most important ones are: + +- [Run npm command](https://bitrise.io/integrations/steps/npm): Default Workflows for Node.js contain the **npm** Step that runs `npm install`. This command installs all necessary packages defined in your `package.json` file. You can specify flags to configure the installation procedure to suit your requirements. + + Set up the command in the **The npm command with arguments to run** input. The default input value is **install**. In the configuration YAML file, look for the `command` input: + + ``` + - npm: + inputs: + - command: install -g + ``` +- [Run yarn command](https://bitrise.io/integrations/steps/yarn): Yarn, like npm, looks for your dependencies in the `package.json` file. The Step allows you to specify the `yarn` command you want to run, as well as any additional arguments. + + Add your command to **The yarn command to run** input. In your configuration YAML file, the input is called `command`. Leave it empty to install dependencies. + + ``` + - yarn: + inputs: + - command: + ``` + + Specify your yarn command arguments in the **Arguments for running yarn commands** input. In your configuration YAML file, the input is called `args`. You can add multiple arguments separated by a space character. + + ``` + - yarn: + inputs: + - args: "-dev" + ``` +- [Gradle Runner](https://bitrise.io/integrations/steps/gradle-runner): If your project is built with Gradle, you can use this Step to install your dependencies during the process. To do this, you need: + + - A Gradle Wrapper. + - A Gradle task that is configured correctly. + - Dependencies declared in your build script. + + The Step requires two inputs: the **Gradle task to run** input defines the Gradle task that will run during the build. The **Gradle Wrapper path** input defines the path to the `gradlew` file in your project. In your configuration YAML file, these inputs are called `gradle_task` and `gradlew_path`. + + ``` + - gradle-runner: + inputs: + - gradlew_path: ./cool_project/ + - gradle_task: install + ``` diff --git a/src/partials/managing-secrets-from-a-central-location.mdx b/src/partials/managing-secrets-from-a-central-location.mdx new file mode 100644 index 0000000..d778ce0 --- /dev/null +++ b/src/partials/managing-secrets-from-a-central-location.mdx @@ -0,0 +1,84 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing Secrets across multiple apps + +By default, all Secrets are handled on the app level. You can reuse Secret keys across multiple Bitrise apps, even if their corresponding values are different for each app. + +However, it is possible to set up a Secret that holds the same value for all your apps, and manage that Secret from one location. For example, if all your apps need access to the same API, it makes sense to store the Secret containing the API key in a central location. If the API key ever changes, you only need to change it in that single location and the change applies to all your Bitrise apps. + +There are two ways to achieve this: + +- [Managing your Secrets from a Workspace](#section-idm4572725706596834329392948656). This is only available on Enterprise plans. +- [Managing secrets from a central location](#section-idm4575482969265634329393418761) such as a vault or database and pulling it with a Step. + +### Managing Secrets on a Workspace level + +On Enterprise plans, you can store Secrets on a Workspace level. This means that the same Secret is accessible to all apps owned by that Workspace. This means increased security: only Workspace Owners and Managers can access these Secrets. + +:::note[Downgrading] + +If you downgrade from an Enterprise plan, Workspace Secrets will be converted to app level Secrets. + +::: + +When passing Secrets to your build, app level Secrets take precedence over Workspace level Secrets in the [availability order](/en/bitrise-ci/configure-builds/environment-variables/availability-order-of-environment-variables). This also means that if you have two Secrets with the same key, the app level Secret will be used during the build. + +To add a new secret: + +1. On the Bitrise main page, select **Settings** on the navigation menu on the left. It takes you to the **Workspace settings** page. +1. On the **Workspace settings** page, select **Shared resources**. + + ![shared-res.png](/img/_paligo/uuid-8b262205-594a-d6ae-9985-3c47a3df5175.png) +1. Click the **Add new** button. +1. Add a key and a value. + + ![ws-secrets.png](/img/_paligo/uuid-0d1616e8-82d6-9de7-f192-1aab7058880b.png) +1. Configure the usage details of the Secret: + + - **Replace variables in inputs**: This passes the value of the Secret as a string to the build. Use this for embedded Secrets or Environment Variables: when the value of your Secret is the key of another Secret or Environment Variable. For most use cases, you don't need this checked. + - **Expose for pull requests**: Exposing a Secret to a PR means that the Secret is available to use in pull request builds. Depending on your repository's privacy settings, this is a potential security risk! + - **Protected**: The value cannot be changed or viewed again. This setting is irreversible once saved. +1. When you're ready, click **Done**. + +### Managing Secrets from a central vault or database + +Setting up Secrets in a central location requires two things: + +- A central vault or database - such as HashiCorp or Doppler - to store the Secrets. It must be accessible via a CLI. +- A **Script** Step to access the central vault/database, pull the Secret and set it to sensitive on Bitrise. + +To create a new Secret and store it in a central location during a build: + +1. Add the Secrets as a key-value pair to your vault or database where you want to store them. +1. Add a **Script** Step to ALL Workflows where you want to use the Secrets. +1. Add the necessary commands to access your vault and pull the Secrets. The exact commands depend on the service you’re using. +1. Use the `envman` tool to mark the Secrets as sensitive. The envman tool has the following syntax: + + `envman add --key KEY --value value --sensitive` . +1. Make sure the Step doesn’t display the value of the Secret in the build log. To do so, remove `set -x` from the Step’s `content`. + +:::warning[Secret redaction] + +Please note that if you have Secret redaction turned off, your Secrets will not be redacted and thus their value can still be visible in logs. + +::: + +**Storing your Secrets in a HashiCorp Vault** + +Let’s say you have a [HashiCorp Vault](https://www.vaultproject.io/) instance called `secret/hello`. You have two Secrets in this vault instance: `foo` with the value `world` and `foo2` with the value `world2`. To use these Secrets in a Bitrise build, you need to: + +- Export them from the Vault instance. +- Iterate over them and mark both of them as sensitive. + +You can use this Script to achieve both: + +``` +# Exporting the Secrets +vault kv get --format=json secret/hello | jq -r '.data.data | to_entries[] | [.key, .value] | @tsv' | +# Iterating over the Secrets and marking them as sensitive +while IFS=$'\t' read -r key value; do + envman add --key "$key" --value "$value" --sensitive +done +``` diff --git a/src/partials/managing-your-workspaces.mdx b/src/partials/managing-your-workspaces.mdx new file mode 100644 index 0000000..9322f8b --- /dev/null +++ b/src/partials/managing-your-workspaces.mdx @@ -0,0 +1,26 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing your Workspaces + +Workspaces are fundamental to all aspects of Bitrise: only Workspaces can own projects and all subscriptions belong to Workspaces. + +When signing up for a personal account, we automatically create a new Workspace for you. A Bitrise personal account can own multiple Workspaces and can be invited to Workspaces owned by other accounts. + +To manage your Workspace, you have to get to the **Workspace settings** page: + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) + +On the **Workspace settings** page, you can: + +- Edit the basic information of the Workspace. +- Manage your subscription. +- [Invite members to your Workspace](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration) and create [Workspace groups](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups.html). +- Set up [SAML SSO](/en/bitrise-docs-20/bitrise-platform/accounts/saml-sso-in-bitrise). +- Check your projects, [transfer project ownership](/en/bitrise-platform/projects/changing-the-owner-of-a-project.html), and add new projects. +- Configure [Git integration for repository access](/en/bitrise-platform/repository-access/github-app-integration) and access to online stores. diff --git a/src/partials/master-and-agent-on-jenkins-bitrise-stacks.mdx b/src/partials/master-and-agent-on-jenkins-bitrise-stacks.mdx new file mode 100644 index 0000000..4a2b2cf --- /dev/null +++ b/src/partials/master-and-agent-on-jenkins-bitrise-stacks.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Master and agent on Jenkins - Bitrise stack + +A stack is the type of virtual machine we use to run your build. For example, for a native iOS app, the best stack is one of our Xcode stacks. Stacks come with all of the necessary tools pre-installed, and are regularly updated to make sure they will serve all of your needs. This way you don’t have to bother with maintaining master and agent instances or adding a node machine to your groovy code to run a build on a certain platform. + +When you add your app to Bitrise, our project selector automatically detects the type of your project and based on its platform type, adds a default stack to it. Your first build will run on this stack, which is a virtual machine with all the required tools pre-installed on it. Should you wish to use another stack, you can simply select it from the **Default Stack** dropdown menu on the **Stacks and Machines** tab. If you click the **More information** link, you can see the preinstalled tools with their versions. + +We support the latest Xcode version shortly after its official release. + +In our [system reports](http:// https://bitrise.io/stacks) you can check the installed tools and their versions on each stack. + +Learn more about our [macOS stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy). + +If you are interested in how to have a Bitrise-managed infrastructure on your AWS environment, check out our [guides](https://docs.bitrise.io/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller/bitrise-on-aws-overview.html). You can also run Bitrise on your self-hosted infrastructure if you follow [this guide](https://docs.bitrise.io/en/bitrise-platform/infrastructure/running-bitrise-builds-on-premise.html). diff --git a/src/partials/merge-queue-support.mdx b/src/partials/merge-queue-support.mdx new file mode 100644 index 0000000..38216fe --- /dev/null +++ b/src/partials/merge-queue-support.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Merge queue support + +GitHub Merge Queues allow multiple pull requests (PRs) to be merged automatically into a branch. You can verify the changes in each PR with a Bitrise build by setting up a trigger with `gh-readonly-queue/*` as the branch filter. You can read more about this prefix in the [GitHub documentation](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#triggering-merge-group-checks-with-third-party-ci-providers). + +The merge queue will only function correctly if your builds, triggered for the queue, report the same status names as the PR builds. + +For example, with the configuration below, all branches that are merged from a merge queue, trigger a build with the `ci-pipeline` Pipeline: + +``` +pipelines: + ci-pipeline: + triggers: + push: + - branch: "gh-readonly-queue/*" + status_report_name: ci/bitrise//pr +``` diff --git a/src/partials/migration-from-v1-to-v2.mdx b/src/partials/migration-from-v1-to-v2.mdx new file mode 100644 index 0000000..476bf3a --- /dev/null +++ b/src/partials/migration-from-v1-to-v2.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Migration from v1 to v2 + +The main structural differences between v1 and v2: + +- App identification: In v1, the app ID was a path parameter (for example, `/apps/{app_id}/installable-artifacts`). In v2, `app_id` is passed as a query parameter to the relevant sub-API. +- Tester groups and build distributions: Moved from the Apps sub-API to the dedicated Build Distributions sub-API. +- Code Push packages renamed: The `packages` resource in v1 Code Push is called `updates` in v2. +- Store releases: Apple App Store and Google Play store release management is now under the Store Releases sub-API. + +Each deprecated v1 endpoint's description specifies the equivalent v2 endpoint to use. Refer to [the API docs](https://api.bitrise.io/release-management/api-docs/index.html) for the full list. diff --git a/src/partials/modifying-and-deleting-outgoing-webhooks-with-the-api.mdx b/src/partials/modifying-and-deleting-outgoing-webhooks-with-the-api.mdx new file mode 100644 index 0000000..d68442c --- /dev/null +++ b/src/partials/modifying-and-deleting-outgoing-webhooks-with-the-api.mdx @@ -0,0 +1,49 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Modifying and deleting outgoing webhooks with the API + +To modify an existing webhook, you need to specify all the mandatory parameters in your request. In other words, even if you only want to change the URL, the request still has to contain a valid value for the `events` parameter. + +:::note[Required role] + +You must have an admin or owner role on the app's team to manage incoming or outgoing webhooks using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +**Modifying an outgoing webhook** + +Request: + +``` +curl -X PUT "https://api.bitrise.io/v0.1/apps/APP-SLUG/outgoing-webhooks/WEBHOOK-SLUG" -H "accept: application/json" -H "Authorization: ACCESS-TOKEN" -H "Content-Type: application/json" -d" { \"events\": [ \"all\" ], \"headers\": { \"Modified\": \"1212\" }, \"url\": \"example2.webhook.com\"}" +``` + +Response: + +``` +{ + "data": { + "slug": "WEBHOOK-SLUG", + "url": "example2.webhook.com", + "events": [ + "all" + ], + "headers": { + "Modified": "1212" + }, + "registered_by_addon": false, + "created_at": "2019-03-28T14:20:22.436825Z", + "updated_at": "2019-03-28T14:20:22.436825Z" + } +} +``` + +To delete an outgoing webhook, all you need to do is provide the app slug and the webhook slug in your request: + +``` +curl -X DELETE "https://api.bitrise.io/v0.1/apps/APP-SLUG/outgoing-webhooks/WEBHOOK-SLUG" -H "accept: application/json" -H "Authorization: ACCESS-TOKEN" +``` diff --git a/src/partials/moving-the-bitriseyml-file-back-to-bitriseio.mdx b/src/partials/moving-the-bitriseyml-file-back-to-bitriseio.mdx new file mode 100644 index 0000000..f815a0e --- /dev/null +++ b/src/partials/moving-the-bitriseyml-file-back-to-bitriseio.mdx @@ -0,0 +1,28 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Moving the bitrise.yml file back to bitrise.io + +The default setting is to store the `bitrise.yml` file on [bitrise.io](http://bitrise.io/): when you add a new app, we automatically create a `bitrise.yml` file for you and it’s stored on our website. If this works for you, then you don’t need to change anything! + +If, however, you changed your storage settings to keep the configuration file in your repository, you can easily change it back any time to store the file on [bitrise.io](http://bitrise.io/). + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. In the Workflow Editor, select **Configuration YAML** from the navigation menu on the left. +1. Click **Change** next to the source of the file. + + ![git-repo-source.png](/img/_paligo/uuid-2bda7822-cd88-2b01-ff4d-8f5eec392c66.png) +1. Choose which `bitrise.yml` file should be used on [bitrise.io](http://bitrise.io/) from now. + + You can copy the content of the `bitrise.yml` file stored in the app’s repository. + + You can copy the last version of the `bitrise.yml` file that you used on [bitrise.io](http://bitrise.io/). + + ![yaml-source-switchback-dialog.png](/img/_paligo/uuid-82197654-17c3-6b98-320e-cf408f16c8c9.png) +1. Click **Validate and save**. + +If all goes well, you should receive confirmation of successfully changing your `bitrise.yml` storage settings. diff --git a/src/partials/naming-and-describing-a-step.mdx b/src/partials/naming-and-describing-a-step.mdx new file mode 100644 index 0000000..c97892c --- /dev/null +++ b/src/partials/naming-and-describing-a-step.mdx @@ -0,0 +1,51 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Naming and describing a Step + +Every Step must have at least a title and a summary defined in the `step.yml` file. These will appear both on the [Integrations](https://www.bitrise.io/integrations/) page and in the [Workflow Editor](). The `description` property is optional but we strongly recommend providing one so that other users better understand how your Step works. + +:::tip[Description and summary] + +Both `description` and `summary` accept Markdown formatting in its values. + +::: + +### The title + +:::important[The title property] + +The `title` property is required! + +::: + +The `title` property sets the name of the Step, as it will appear on the Bitrise website. It should be short and descriptive. Include the name of the service and the function it fulfils, such as **Git Clone**. Here’s a few guidelines for your Step titles: + +- Do not use the word ‘Step’. +- Use imperative verbs instead of nouns when possible. For example, instead of **Script Runner**, it should be **Run Script**. +- Make sure you use the correct name of a service or tool. For example, GitHub instead of Github. +- Do not include implementation details. + +### The summary + +:::important[The summary property] + +The summary property is required! + +::: + +A single line of the most significant information about the Step. It can’t be longer than a 100 characters. + +The summary is visible by default on the Workflow Editor. If a user expands the summary, the Step’s description will be presented - if there is one, of course. + +### The description + +A detailed explanation of the Step. It should include: + +- What the Step does. +- The services and tools used by the Step. +- Configuration information, including the most important inputs. +- Troubleshooting information: potential issues and their solutions. + +By default, the Step’s description is collapsed on the Workflow Editor and the summary is presented. diff --git a/src/partials/nested-step-bundles.mdx b/src/partials/nested-step-bundles.mdx new file mode 100644 index 0000000..3dc55e4 --- /dev/null +++ b/src/partials/nested-step-bundles.mdx @@ -0,0 +1,54 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Nested Step bundles + +Step bundles allow nesting: you can add a Step bundle within another Step bundle. This allows you to create large, complex configurations with easily replaceable parts. You can add as many Step bundles within another Step bundles as you want. + + + + +1. Open the Workflow Editor. +1. On the left, select **Step bundles**. +1. Select a Step bundle from the dropdown menu in the middle. +1. If it's an empty bundle, click **Add Step or Step bundle**. + + If the bundle already has Steps in it, hover between Steps and click the plus sign. + + ![add-bundle-to-bundle.png](/img/_paligo/uuid-e4db471e-3219-872f-8c6f-7aa194b7f156.png) +1. In the dialog, go to the **Step bundle** tab. + + ![bundle-tab.png](/img/_paligo/uuid-68c17140-7ed7-eae8-4101-12d403bee8e4.png) +1. Select a bundle to add it to the original bundle. +1. Use drag-and-drop to move it within the bundle. +1. When done, click **Save changes** + + + + +1. In the configuration YAML file, define the Step bundle you want to nest within a `step_bundles` property. + + ``` + step_bundles: + initialize: + steps: + - activate-ssh-key: {} + - git-clone: {} + ``` +1. Nest this bundle within another one by using the `bundles` property. + + ``` + step_bundles: + initialize: + steps: + - activate-ssh-key: {} + - git-clone: {} + deploy_bundle: + steps: + - bundle::initialize: {} + - deploy-to-bitrise-io: {} + ``` + + + diff --git a/src/partials/note-build-retention-for-200-days.mdx b/src/partials/note-build-retention-for-200-days.mdx new file mode 100644 index 0000000..79fbbf9 --- /dev/null +++ b/src/partials/note-build-retention-for-200-days.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::note[Build retention for 200 days] + +On the **Builds** page of your app, we only show builds from the last 200 days. The same limit applies if you are [searching for specific builds](/en/bitrise-ci/run-and-analyze-builds/finding-a-specific-build.html) on the page. This limitation also applies to most API calls: the `GET/apps/{app-slug}/builds` endpoint and related endpoints can only return builds from the last 200 days. + +However, there are two methods to get a build that is older than 200 days: + +- If you know the exact build URL, you can access the build. +- You can use the `GET/apps/{app-slug}/archived-builds` API endpoint: [Listing the archived builds of an app](/en/bitrise-ci/api/managing-an-app-s-builds/listing-the-archived-builds-of-an-app). + +::: diff --git a/src/partials/note-do-you-have-a-bitrise-account.mdx b/src/partials/note-do-you-have-a-bitrise-account.mdx new file mode 100644 index 0000000..4f411bb --- /dev/null +++ b/src/partials/note-do-you-have-a-bitrise-account.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::note[Do you have a Bitrise account?] + +Make sure you have signed up to [bitrise.io](https://www.bitrise.io) and can access your Bitrise account. There are multiple ways of registering an account: + +- [Signing up with email](/en/bitrise-platform/getting-started/signing-up-for-bitrise/signing-up-with-email) +- [Signing up with a Git provider](/en/bitrise-platform/getting-started/signing-up-for-bitrise/signing-up-with-a-git-provider) + +::: diff --git a/src/partials/note-secrets-in-self-hosted-environments.mdx b/src/partials/note-secrets-in-self-hosted-environments.mdx new file mode 100644 index 0000000..bd40adc --- /dev/null +++ b/src/partials/note-secrets-in-self-hosted-environments.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::note[Secrets in self-hosted environments] + +In a self-hosted environment, you might not be able to host your Secrets on bitrise.io. To make sure your build configuration can still use Secrets, check out our guide: [Secrets in self-hosted environments](/en/bitrise-ci/configure-builds/secrets/secrets-in-self-hosted-environments). + +::: diff --git a/src/partials/note-signing-up-with-email.mdx b/src/partials/note-signing-up-with-email.mdx new file mode 100644 index 0000000..6363e6c --- /dev/null +++ b/src/partials/note-signing-up-with-email.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::note[Signing up with email] + +Please note that if you want to sign up for Bitrise with an email address, the address cannot contain the character **+**. + +::: diff --git a/src/partials/oauth-connection.mdx b/src/partials/oauth-connection.mdx new file mode 100644 index 0000000..f57a085 --- /dev/null +++ b/src/partials/oauth-connection.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## OAuth connection + +An OAuth connection allows a third-party application to access a user's data on a service without sharing their login credentials. On Bitrise, an OAuth connection means connecting your Bitrise account to your Git provider account. + +Bitrise supports an OAuth connection with three Git providers: GitHub, GitLab, and Bitbucket. With an OAuth connection, Bitrise can: + +- Retrieve and display a list of the available repositories when [adding a new project](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/adding-your-first-project). +- [Automatically register webhooks](/en/bitrise-platform/integrations/webhooks/adding-incoming-webhooks/registering-an-incoming-webhook-automatically). Webhooks allow setting up build triggers and enable the use of [Git Insights](/en/insights/git-insights.html). +- [Automatically register SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys.html). + +To set up an OAuth connection, check out: [Repository access with OAuth](/en/bitrise-platform/repository-access/repository-access-with-oauth). diff --git a/src/partials/offsetting-the-build-version.mdx b/src/partials/offsetting-the-build-version.mdx new file mode 100644 index 0000000..015f6ef --- /dev/null +++ b/src/partials/offsetting-the-build-version.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Offsetting the build version + +You can also offset your App’s build version numbers if you handled version tracking in a different way before for the same app: all you need to do is setting the value which should be added to the build number. The value can be either a fixed integer value or an Environment Variable. + +To offset your version number by your Bitrise build number every time a build is triggered, use the `$BITRISE_BUILD_NUMBER` Environment Variable: + +- For Android apps, find the **versionCode Offset** input of the **Change Android versionCode and versionName** Step and set `$BITRISE_BUILD_NUMBER` as its value. The value of the variable will be added to the value specified in the **versionCode** input. +- For iOS apps, find the **Build Number Offset** input of the **Set Xcode Project Build Number** Step and set `$BITRISE_BUILD_NUMBER` as its value. The value of the variable will be added to the value specified in the **Build Number** input. + +**Offsetting an Android app's version** + +Let’s say you have an app and you are about to run its fifth build on Bitrise. You wish to offset the Build Number by 6 as the app had six builds before starting to use Bitrise. The following configuration is used: + +``` +- Version Code: $BITRISE_BUILD_NUMBER +- Version Code Offset: 6 +- Version Name: 1.0.5 +``` + +The value of $BITRISE_BUILD_NUMBER (which equals 5 in our example) will be added to the Version Code Offset value. As such, android:versionName value will be set to 1.0.5 (11), indicating it’s the 11th build of the 1.0.5 version of your app. + +**Offsetting an iOS app's version** + +Let’s say you have an app and you are about to run its fifth build on Bitrise. You wish to offset the Build Number by 6 as the app had six builds before starting to use Bitrise. The following configuration is used: + +``` +- Build Number: $BITRISE_BUILD_NUMBER +- Build Number Offset: 6 +- Version Number: 1.1 +``` + +The value of $BITRISE_BUILD_NUMBER (which equals 5 in our example) will be added to the Build Number Offset value. As such, CFBundleShortVersionString will be set to 1.1 (11), indicating it’s the 11th build of the 1.1 version of your app. diff --git a/src/partials/opening-an-app-in-release-management.mdx b/src/partials/opening-an-app-in-release-management.mdx new file mode 100644 index 0000000..14df564 --- /dev/null +++ b/src/partials/opening-an-app-in-release-management.mdx @@ -0,0 +1,8 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Log in to Bitrise, and from the left sidebar, select **Releases**. +1. Select your app from the list. + + ![2025-08-07-rm-your-apps-list.png](/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png) diff --git a/src/partials/opening-the-workflow-editor-and-selecting-a-workflow.mdx b/src/partials/opening-the-workflow-editor-and-selecting-a-workflow.mdx new file mode 100644 index 0000000..f3a0ca9 --- /dev/null +++ b/src/partials/opening-the-workflow-editor-and-selecting-a-workflow.mdx @@ -0,0 +1,6 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. diff --git a/src/partials/opening-the-workflow-editor.mdx b/src/partials/opening-the-workflow-editor.mdx new file mode 100644 index 0000000..6178e6e --- /dev/null +++ b/src/partials/opening-the-workflow-editor.mdx @@ -0,0 +1,8 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) diff --git a/src/partials/opening-the-workspace-settings-page.mdx b/src/partials/opening-the-workspace-settings-page.mdx new file mode 100644 index 0000000..a912598 --- /dev/null +++ b/src/partials/opening-the-workspace-settings-page.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) diff --git a/src/partials/options.mdx b/src/partials/options.mdx new file mode 100644 index 0000000..6b42584 --- /dev/null +++ b/src/partials/options.mdx @@ -0,0 +1,102 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Options + +`Options` represents a question and the possible answers to the question. For example: + +- Question: What is the path to the iOS project files? +- Possible answers: List of possible paths to check + +These questions and answers are translated into Step inputs. The scanner should either determine the input value or let the user select or type the value. + +For example, the `Xcode Archive & Export for iOS` Step has an input called export-method. This informs the Step of the type of .ipa you want to export. The value cannot be determined based on the source code so the scanner collects every possible value and presents them to the user in the form of a list to choose from. + +Selecting an option can start a chain: it can lead to different options being presented afterwards. For example, if you select an Xcode scheme that has associated test targets, it leads to different “questions”. Similarly, selecting a certain option can lead to a different workflow being generated afterwards. + +### The option model + +The `OptionModel` represents an input option. It looks like this in Go: + +``` +// OptionModel ... +type OptionModel struct { + Title string + EnvKey string + + ChildOptionMap map[string]*OptionModel + Config string +} +``` + +- Title: the human readable name of the input. +- EnvKey: it represents the input’s key in the step model. +- ChildOptionMap: the map of the subsequent options if the user chooses a given value for the option. + +For example, let’s see a scenario where you choose a value for the Scheme input. You will have a value_map in the `options`. The possible values are: + +- SchemeWithTest +- SchemeWithoutTest + +By choosing `SchemeWithTest`, the next option will be related to the simulator used to perform the test. + +By choosing `SchemeWithoutTest`, the next option will be about the export method for the .ipa file. + +``` +{ + "title": "Scheme", + "env_key": "scheme", + "value_map": { + "SchemeWithTest": { + "title": "Simulator name", + "env_key": "simulator_name", + ... + }, + "SchemeWithoutTest": { + "title": "Export method", + "env_key": "export_method", + ... + } + } +} +``` + +Every option chain has a first option: this is called `head`. The possible values of the options can branch the option chain. + +Every option branch’s last `options` must have a config property set. config holds the id of the generated Bitrise configuration. + +An options chain’s last `options` cannot have a value_map. + +``` +{ + "title": "Scheme", + "env_key": "scheme", + "value_map": { + "SchemeWithTest": { + "title": "Simulator name", + "env_key": "simulator_name", + "value_map": { + "-": { + "config": "bitrise_config_with_test", + } + } + }, + "SchemeWithoutTest": { + "title": "Export method", + "env_key": "export_method", + "value_map": { + "development": { + "config": "bitrise_config_without_test", + }, + "app-store": { + "config": "bitrise_config_without_test", + }, + "ad-hoc": { + "config": "bitrise_config_without_test", + } + } + } + } +} +``` diff --git a/src/partials/order-of-precedence-for-priority-settings.mdx b/src/partials/order-of-precedence-for-priority-settings.mdx new file mode 100644 index 0000000..288158f --- /dev/null +++ b/src/partials/order-of-precedence-for-priority-settings.mdx @@ -0,0 +1,51 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Order of precedence for priority settings + +You can set priority levels for: + +- Pipelines and Workflows. +- Triggers. +- Manually triggered builds. + +These priorities can conflict. For example, you have a Workflow called test. It has a priority of 10. You also have a trigger configured for this Workflow: it is triggered if code is pushed to the development branch. This trigger has a priority of 15. + +In such a scenario, Bitrise determines the build priority by the order of precedence: + +1. Manual overrides: Manually starting a build overrides all other priority settings. +1. Trigger-specific priority settings: A trigger's priority setting overrides the priority settings of the Pipelines or Workflows it triggers. +1. Pipeline-level priority settings: The Pipeline's priority overrides the priority settings of its constituents Workflows which are all given the same priority as the Pipeline. +1. Workflow-level settings: If no other configuration element is given a priority setting, the Workflow priority determines overall build priority. + +Here’s an example snippet that shows how to set priorities at various levels: + +``` +workflows: +    A: +     steps: [] +    B: +     steps: [] +     priority: 4 + triggers: +    push: +     - branch: release +      priority: 2 +     - branch: development + + +  pipelines: +   P: +    priority: 3 +    workflows: +      A: {} +      B: {} +``` + +In this example: + +- If Workflow A is run as a standalone build, it has a priority of 0 (the default priority value). +- If Workflow B is run as a standalone build (for example, if code is pushed to the `development` branch), it has a priority of 4. +- If code is pushed to the `release` branch, Workflow B is triggered with a priority of 2. +- If Pipeline P is triggered, both A and B Workflows will run with priority 3. diff --git a/src/partials/our-requests-to-verified-step-maintainers.mdx b/src/partials/our-requests-to-verified-step-maintainers.mdx new file mode 100644 index 0000000..931b9e1 --- /dev/null +++ b/src/partials/our-requests-to-verified-step-maintainers.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Our requests to verified Step maintainers + +We ask verified Step maintainers to follow our best practices: + +- Monitor issues opened by users in your Step repository and respond in a timely manner. +- Be familiar with our [Stack update policy](/en/bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy.html), especially the cadence of breaking changes. Your Step might (accidentally or on purpose) depend on tools from the stack environment, and we don’t want Steps to be broken after stack updates. +- Test your Steps regularly on all available stacks and platforms. We recommend setting up CI workflows with scheduled builds and some form of notification if the build fails. + +If you need any help with Step-related questions, feel free to reach out! For example, we're happy to help with: + +- Best practices for performing common tasks in Steps. +- Best practices for Step inputs and outputs, chaining Steps. +- Troubleshooting Step errors. diff --git a/src/partials/owners.mdx b/src/partials/owners.mdx new file mode 100644 index 0000000..b77a441 --- /dev/null +++ b/src/partials/owners.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Owners + +Bitrise projects are owned by Workspaces. On the project's team, users who are owners in the Workspace have the **owner** access right to the project. + +Owners have unlimited access to projects. Only owners can destroy projects or transfer the ownership of projects, and only they have access to payment information. diff --git a/src/partials/parallelism-in-pipelines.mdx b/src/partials/parallelism-in-pipelines.mdx new file mode 100644 index 0000000..49059d2 --- /dev/null +++ b/src/partials/parallelism-in-pipelines.mdx @@ -0,0 +1,77 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running variations of the same Workflow + +Parallelism allows you to split the execution of a single Workflow in a Pipeline over many runners in a single instruction. This is particularly useful for test sharding: you can reuse a single testing Workflow several times over, without needing to specify boilerplate code for each shard. At runtime, Bitrise automatically creates a set of parallel Workflows and provides you with the shard number and total number of shards as environment variables. + +You can also use a parallel configuration to build and test multiple white label apps from the same codebase, or to achieve any other goal that requires running the same CI jobs multiple times. + +### Parallelism overview + +:::important[Graph pipelines only] + +Parallelism isn't available for Pipelines containing stages. To take advantage of the feature, convert your stage-based Pipelines into graph Pipelines: [Converting a Pipeline with stages into a graph Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline). + +::: + +You can create a parallel configuration for a Workflow by using the `parallel` property. A Pipeline can have multiple Workflows with a parallel configuration. These Workflows can depend on other Workflows. If a Workflow depends on a Workflow with a parallel configuration, it will depend on the execution of all copies of the Workflow. + +The `parallel` property takes an integer for a value: for example, if the value is 5, five copies of the Workflow will be executed. Each copy receives two new environment variables: + +- $BITRISE_IO_PARALLEL_INDEX: a zero based index for each copy of the Workflow. +- $BITRISE_IO_PARALLEL_TOTAL: the total number of copies. + +### Configuring parallelism + +To set up the configuration: + + + + +1. Open the Workflow Editor. +1. In the Pipeline graph, find your Workflow and click the gear icon to access the Workflow configuration. +1. On the **Configuration** tab, find the **Parallel copies** input and set a value. + + :::important[Value limitations] + + The value has to be a fixed number. You can only use integers. The maximum accepted value is 200. + + You can use an Environment Variable as the value: it allows you to dynamically calculate the optimal number of parallel copies during the build. + + ::: + + If another Workflow depends on the Workflow with a parallel configuration, it will run only if all copies of the Workflow have been successful. + + + + +1. Open your [configuration YAML](/en/bitrise-ci/configure-builds/configuration-yaml.html) file. +1. In the `workflows` property of your Pipeline, find the Workflow you need. +1. Add the `parallel` property to it and set a value. + + :::important[Value limitations] + + The value has to be a fixed number. You can only use integers. The maximum accepted value is 50. You can use an Environment Variable as the value. + + You can use an Environment Variable as the value: it allows you to dynamically calculate the optimal number of parallel copies during the build. + + ::: + + In this example, the `run-tests` Workflow is executed five times in parallel. The `report-results` Workflow depends on `run-tests` so it only runs once all 5 copies have been successful. + + ``` + pipelines: + my-ci-pipeline: + workflows: + build-without-testing: {} + run-tests: + depends_on: [build-without-testing] + parallel: 5 + report-results: + depends_on: [run-tests] + ``` + + + diff --git a/src/partials/passwords.mdx b/src/partials/passwords.mdx new file mode 100644 index 0000000..d0d381b --- /dev/null +++ b/src/partials/passwords.mdx @@ -0,0 +1,7 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Passwords + +Passwords are stored in a hashed, encrypted form. We are encrypting the passwords with [bcrypt algorithm](https://en.wikipedia.org/wiki/Bcrypt), using multiple stretches. diff --git a/src/partials/patching-on-linux-environment.mdx b/src/partials/patching-on-linux-environment.mdx new file mode 100644 index 0000000..1d3661f --- /dev/null +++ b/src/partials/patching-on-linux-environment.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Linux environment + +Linux instances on Bitrise on AWS operate on Bare Metal only, with no virtualization or Docker. All required tooling is baked directly into the Amazon Machine Image (AMI). + +| Component | Bitrise Update Frequency | Customer Responsibility | +| --- | --- | --- | +| **Bitrise AMI** | Bitrise updates the core Linux AMI for tooling changes (for example, Android tools) only. | The customer is responsible for applying OS security patches. | diff --git a/src/partials/patching-on-macos-bare-metal-environment.mdx b/src/partials/patching-on-macos-bare-metal-environment.mdx new file mode 100644 index 0000000..6628cd6 --- /dev/null +++ b/src/partials/patching-on-macos-bare-metal-environment.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## macOS bare metal environment + +In the macOS Bare Metal environment, Bitrise on AWS offers AMIs only for [stable stacks](https://bitrise.io/stacks/) only (not edge stacks). + +| Component | Bitrise Update Frequency | Customer Responsibility | +| --- | --- | --- | +| **Bitrise AMI** | Bitrise uses AWS's latest macOS version as the base when building a new host AMI. We monitor macOS vulnerabilities and rebuild and publish new AMI versions when internal information security assessments dictate. | It is the customer’s responsibility to use the newest AMIs. | + +:::note[Trust Center] + +Additional information on how Bitrise monitors and assesses vulnerabilities can be found in the [Trust Center](http://security.bitrise.io). + +::: diff --git a/src/partials/patching-on-macos-virtualized-environment.mdx b/src/partials/patching-on-macos-virtualized-environment.mdx new file mode 100644 index 0000000..953eb34 --- /dev/null +++ b/src/partials/patching-on-macos-virtualized-environment.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## macOS virtualized environment + +Bitrise on AWS offers AMIs with VM images of our [stable stacks](https://bitrise.io/stacks/) (not edge stacks) for the macOS virtualized environment. + +:::note[Regular tooling updates] + +Bitrise performs regular VM updates for tooling changes. When a new VM image is built due to a tooling update, the latest AWS macOS version is used for the host instance (AMI). The OS of the VM image will not change. + +::: + +| Component | Bitrise Update Frequency | Customer Responsibility | +| --- | --- | --- | +| **Host OS** | Bitrise does not perform general OS updates. OS security patches occur only if required by our internal information security assessment (as defined in our trust center). | It is the customer’s responsibility to use the newest AMIs. | +| **VM OS** | Bitrise does not perform general OS updates. OS security patches occur only if required by our internal information security assessment (as defined in our trust center). | It is the customer’s responsibility to use the newest AMIs. | diff --git a/src/partials/patching-scenarios-on-aws.mdx b/src/partials/patching-scenarios-on-aws.mdx new file mode 100644 index 0000000..01eafbc --- /dev/null +++ b/src/partials/patching-scenarios-on-aws.mdx @@ -0,0 +1,34 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Patching scenarios + +The method for applying security patches differs based on whether or not you are using the [Bitrise Controller](/en/bitrise-platform/infrastructure/bitrise-on-aws--cloud-controller.html). + +### Patching without the controller + +If you are using a manual setup, you have more flexibility for applying patches or updates in general to the instance. You can: + +- Create a custom AMI: start a Bitrise AMI, make a change (like an OS patch), take a new AMI snapshot, and then configure your environment to run with the ID of this new, custom AMI. +- Use a [user data script](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html): define your own script to execute commands upon instance startup. +- Use SSH updates: connect to your instances via SSH to perform updates manually with a guarantee that the updates will persist. + +### Patching with the controller + +You have multiple options to apply patches when using the controller: + +- Host warmup script: this script runs when an instance is started (a one-time operation). To apply updates to the instance, you can modify the host warmup script, drain the instance pool and then bring it back up, which will run the script for a fully updated instance. + + :::caution[Availability] + + Be mindful of Mac EC2 availability when performing this operation. + + ::: +- Controller with virtualization: the VM OS on stable stacks does not receive general updates, however, Bitrise monitors for OS vulnerabilities and publishes new AMIs based on internal information security assessments. The VM warmup script runs in the fresh VM for every new build that is started. This may not be a good option for VM OS patches due to the time they consume. + +:::important[Custom AMIs] + +You cannot use a custom AMI with the Bitrise Controller, which means you cannot take a snapshot of an updated AMI and use it with the Controller. The Controller only permits specific Bitrise AMIs. If you think this may be a requirement, please [contact us](https://bitrise.io/contact) to discuss. + +::: diff --git a/src/partials/people-management-in-jenkins-and-bitrise.mdx b/src/partials/people-management-in-jenkins-and-bitrise.mdx new file mode 100644 index 0000000..4f056a3 --- /dev/null +++ b/src/partials/people-management-in-jenkins-and-bitrise.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing teams and roles in Jenkins and Bitrise + +A Bitrise user is an individual with a Bitrise account and belongs to one or more workspace/s. A workspace is a group of users who collaborate on projects. You can create multiple workspaces and a contributor can be invited to multiple workspaces by other Bitrise contributors. A contributor must be assigned to a project to be able to work on it. + +Learn how you can [add contributors to a project](https://docs.bitrise.io/en/bitrise-platform/projects/managing-user-access-to-a-project.html) on the web UI either by adding existing workspace members or inviting outside contributors. + +Contributors can have different roles in workspaces that determine what they can do and cannot do: + +- When it comes to Bitrise CI, we differentiate [Owner, Admin, Platform Engineer, Developer, Testers/QA](https://docs.bitrise.io/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html) roles +- When it comes to [Release Management](https://docs.bitrise.io/en/release-management/configuring-connected-apps/release-management-roles-and-permissions.html), we differentiate workspace-level roles (Workspace Owner, Workspace Manager, Contributor and Viewer) and Release-level roles (Release Manager and App tester). Check out roles and permission tables on [Release management apps](https://docs.bitrise.io/en/release-management/configuring-connected-apps/release-management-roles-and-permissions.html#roles-and-permissions-for-release-management-apps) and [build distribution and releases](https://docs.bitrise.io/en/release-management/configuring-connected-apps/release-management-roles-and-permissions.html). + +You need a workspace to have a [paid subscription plan](https://bitrise.io/pricing?utm_medium=paid_search&utm_source=google&utm_campaign=all_misc_signup_paid_search_all_2025-04-10&utm_content=branding_pricing_emea&utm_source=google&utm_medium=cpc&utm_campaign=&utm_term=bitrise%20pricing&gad_source=1&gad_campaignid=22492269029&gbraid=0AAAAADEBC46C3y8wDrPzZEypPjE85IZGF&gclid=Cj0KCQiAq7HIBhDoARIsAOATDxDmUOF1Nw6xSIWC_imk3x-MBAxQW3VVSarlhc14CuKm4jV2yT3UDxMaApjPEALw_wcB) on Bitrise. Each of your workspaces can have a different subscription plan which determines how many credits your workspace's projects can use. + +You can use [SAML SSO or SCIM](https://docs.bitrise.io/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise.html) to securely onboard or offboard an enterprise to your workspace. diff --git a/src/partials/pipeline-level-properties.mdx b/src/partials/pipeline-level-properties.mdx new file mode 100644 index 0000000..e176974 --- /dev/null +++ b/src/partials/pipeline-level-properties.mdx @@ -0,0 +1,121 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Pipeline level properties + +### `pipelines::title` + +The title of the Pipeline. + +This is not the same as the ID of the Pipeline: you set the ID when creating the Pipeline. Unlike the ID, the title does not have to be unique. It appears on the Workflow Editor UI in the **Pipelines** section: if you open the Pipeline selector dropdown menu. + +**Example of `pipelines::title`** + +```yaml +pipelines: + test: + title: Test pipeline +``` + +### `pipelines::summary` + +A short summary of the Pipeline. Optional. + +**Example of `pipelines::summary`** + +```yaml +pipelines: + test: + summary: This Pipeline runs unit tests. +``` + +### `pipelines::description` + +A detailed description of the Pipeline. Optional. + +**Example of `pipelines::description`** + +```yaml +pipelines: + test: + description: 'This Pipeline runs unit tests in parallel, using test sharding.' +``` + +### `pipelines::triggers` + +Target-based triggers defined for the Pipeline: if a code event matches the condition defined in a trigger, Bitrise will trigger a build with the Pipeline. + +For the detailed syntax of the `triggers` property and its available options, check out: + +Read more: [YAML syntax for build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers). + +**Example of `pipelines::triggers`** + +In this example, any commit pushed to the `main` branch triggers a build of the Pipeline. + +```yaml +pipelines: + test: + triggers: + push: + - branch: main +``` + +### `pipelines::status_report_name` + +The name that will appear on the status report sent to connected services (like GitHub, GitLab, Bitbucket, and so on) after the build is finished. + +It can have both static and dynamic values, as well as combine the two types. + +**Supported characters and variables**: + +- `A-Za-z,.():/-_0-9 []|<>` +- ``: The unique identifier of your project. +- ``: Optional title of your project. +- ``: The ID of the triggered Workflow or Pipeline. +- ``: The code event that triggered the build: `PR/push/tag`. + +**Example of `pipelines::status_report_name`** + +```yaml +pipelines: + test: + status_report_name: ci/bitrise/510526/push +``` + +### `pipelines::workflows` + +The Workflows that are part of the Pipeline configuration. + +You can create dependencies between Workflows with the `depends_on` property. + +**Example of `pipelines::workflows`** + +```yaml +pipelines: + test: + workflows: + primary: +``` + +### `pipelines::priority` + +The priority setting determines the position of the Pipeline build in the build queue: the higher the priority, the sooner the Pipeline build will run. + +**Supported values:** + +- An integer between -100 and 100. + +**Read more:** + +- [Pipeline priority](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/pipeline-priority) +- [Build priority](/en/bitrise-ci/configure-builds/configuring-build-settings/build-priority) + +**Example of `pipelines::priority`** + +```yaml +pipelines: + test: + priority: 10 +``` diff --git a/src/partials/pipeline-priority.mdx b/src/partials/pipeline-priority.mdx new file mode 100644 index 0000000..35cc598 --- /dev/null +++ b/src/partials/pipeline-priority.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Pipeline priority + +You can set a priority for each Pipeline. The priority setting determines the position of the Pipeline build in the build queue: the higher the priority, the sooner the Pipeline build will run. + +You can assign a priority either in the Workflow Editor or in the configuration YAML file of your project. The priority is always an integer between -100 and 100: the higher the number, the higher the priority. The default priority is 0. + +For more information about build priority, and the order of precedence between different types of priorities, check out [Build priority](/en/bitrise-ci/configure-builds/configuring-build-settings/build-priority). diff --git a/src/partials/platform-engineers.mdx b/src/partials/platform-engineers.mdx new file mode 100644 index 0000000..0779bcc --- /dev/null +++ b/src/partials/platform-engineers.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Platform Engineers + +Here's the role cheatsheet for Platform Engineers: + +![platform-engineer-role.png](/img/_paligo/uuid-0db12ced-a7df-99c7-2c04-4818d5c52832.png) + +Platform Engineers can do everything that Developers can, and in addition to that, they can also edit Workflows. They can't access the project settings, manage team members or billing, and they can't delete the project. diff --git a/src/partials/pre-warming-the-disk-after-booting.mdx b/src/partials/pre-warming-the-disk-after-booting.mdx new file mode 100644 index 0000000..9676445 --- /dev/null +++ b/src/partials/pre-warming-the-disk-after-booting.mdx @@ -0,0 +1,40 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Pre-warming the disk after booting + +:::note[User data] + +To make sure instance behavior is consistent across all instances, we recommend configuring this as part of [user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-console) during [instance creation](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami). + +User data is provided either in plain text or in base64 encoded format. + +::: + +You can improve Amazon EBS performance by pre-warming the disk right after booting it up. You only need to do it once. + +:::important[Recommended for virtualization] + +We highly recommend pre-warming the disk if you use our virtualized offering. + +::: + +Mac instance + +Linux instance + +- ``` + export cnt=$(($(df -h | grep "/$" | awk '{print $4}' | grep -oE "[0-9]+")-2)) + sudo dd if=/dev/random of=bigfile bs=1g count=$cnt + ``` + +- ``` + sudo dd if=/dev/xvdf of=/dev/null bs=1M + ``` + + :::note[dev/xvfd] + + Be aware that `xvdf` might be different on your machine + + ::: diff --git a/src/partials/preparing-the-project.mdx b/src/partials/preparing-the-project.mdx new file mode 100644 index 0000000..02a292c --- /dev/null +++ b/src/partials/preparing-the-project.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Preparing the project + +Before you try adding a new project to Bitrise via our CLI, make sure a few things are in order: + +- You need a Bitrise account, with a connected Git provider. +- Your project must have a local Git repository on your machine and a remote repository at a Git provider. If you want to use an SSH key to access the repository, [the remote repository URL must be an SSH URL](https://help.github.com/en/articles/which-remote-url-should-i-use)! For example, `git@github.com:example-user/example.git`. + +You can also create a `bitrise.yml` in advance and you will be able to add that to your project during the creation process. This is optional: you can have the project scanner generate one for you during the process, just like on our website! + +This procedure guides you through adding a project which Bitrise will access with an SSH key. This requires that the project’s remote repository has an SSH URL, such as `git@github.com:example-user/example.git`. + +You can, of course, use an HTTPS URL to access your remote repository, too: in that case, you will not set an SSH key for your project. We only recommend using HTTPS URLs for public projects (open source projects). + +And that’s it! You are done: the URL to your new project will be printed out, and you can also view the project on your [Dashboard](https://project.bitrise.io/dashboard/). diff --git a/src/partials/preparing-your-ec2-instance.mdx b/src/partials/preparing-your-ec2-instance.mdx new file mode 100644 index 0000000..80793a2 --- /dev/null +++ b/src/partials/preparing-your-ec2-instance.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Preparing your EC2 Mac and Linux instance + + + + +1. [Configure a runner pool](/en/bitrise-build-hub/infrastructure/configuring-runner-pools) and copy the token required for authentication. +1. Get the token from the process of adding the runner pool on Bitrise. +1. [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) and store the token in the secret. +1. [Create an IAM role](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) with permission to read the secret. You will need to attach it to the EC2 instance. +1. [Allocate a dedicated host](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/allocating-a-dedicated-host-for-mac-instances) on AWS. You will need the automatically generated host ID. + + + + +1. [Configure a runner pool](/en/bitrise-build-hub/infrastructure/configuring-runner-pools) and copy the token required for authentication. +1. Get the token from the process of adding the runner pool on Bitrise. +1. [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) and store the token in the secret. +1. [Create an IAM role](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) with permission to read the secret. You will need to attach it to the EC2 instance. + + + diff --git a/src/partials/prepping-for-installation.mdx b/src/partials/prepping-for-installation.mdx new file mode 100644 index 0000000..918ed55 --- /dev/null +++ b/src/partials/prepping-for-installation.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Prepping for installation + +Before installing the app on any test device, the app’s developer has to complete a couple of steps to build the app and share it with anyone: + +- The device, on which the app will be installed, is registered as a test device at the developer’s Apple account. +- The device has to be included in the provisioning profile of the app. +- The device meets the minimum OS requirements of the app. + +Please note that if the test device is not registered on the Apple Developer portal, the developer has to manually add it to the device list, and re-build the app so that the .ipa file contains the test device/s the app can be installed on. We also recommend you [register the test device on Bitrise]() as well. + +:::tip[Which browser should I use with the public install page?] + +Anyone who wishes to install the app on a test device has to make sure that the public install page of the app is opened in a native Safari session with non-incognito mode. + +::: + +### Installing an .ipa file from Bitrise's public install page to an iPad with iPadOS + +If you are using an iPad running iPadOS, make sure that you open the Bitrise public install page in mobile mode. + +When you open the public install page of an .ipa file, Bitrise checks if the device is stored in the embedded provisioning profile or not. This check can only complete if you visit the public install page in mobile mode instead of the desktop version. We suggest that you switch to mobile mode temporarily. + +You can easily switch to mobile mode temporarily if you tap the ᴀA icon on the left corner of the Safari address bar and then tap the **Show Mobile Website**option. diff --git a/src/partials/prepping-workflows-of-a-white-label-app.mdx b/src/partials/prepping-workflows-of-a-white-label-app.mdx new file mode 100644 index 0000000..864fa9c --- /dev/null +++ b/src/partials/prepping-workflows-of-a-white-label-app.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Prepping Workflows of a white label app + +1. [Add your project](/en/bitrise-ci/getting-started/adding-a-new-project.html) to Bitrise in the usual way. +1. Select your project on the [Bitrise CI](https://app.bitrise.io/dashboard/) page and click **Workflows**. + + ![getting-to-workflows.png](/img/_paligo/uuid-32b5ff3d-8431-8fe3-9971-89d8aca076f4.png) +1. Open the dropdown menu of available Workflows and click **Create Workflow** to create your main Workflow. + + ![create-workflow.png](/img/_paligo/uuid-426d42b4-ca6f-d5de-d91a-b9e8a4fd8ba1.png) +1. Add a new Workflow based on an **Empty Workflow**. + + In this example, our main Workflow is called **allcolor**. This Workflow will start running your version-specific Workflows in the chain. +1. Click **+** again to create your version-specific Workflow. + + Keep adding as many Workflows as many different versions you wish to create. +1. Select **Env Vars** on the left navigation menu and add your version-specific parameters to each Workflow you’ve just created. + + In this example we’re adding Workflow Environment Variables to our **green**, **red** and **white** Workflows but leaving **allcolor** intact. + + ![env-ars-whitelabel.png](/img/_paligo/uuid-68837c3f-707c-19aa-86e2-bbac732be5a5.png) +1. Go back to **Workflows** and create a [utility Workflow](urn:resource:component:43026). + + Make sure you give a name that starts with an underscore, for example, **_runner**, otherwise Bitrise CLI will not treat it as a utility Workflow. +1. Add Steps to your utility Workflow. + + In this example, we’re adding a **Script** Step which will inherit the Environment Variable from the Workflows and print out the value in the build log. + + ![script-param.png](/img/_paligo/uuid-52def735-231b-d0ea-e01e-b8b12cfbe86a.png) diff --git a/src/partials/preventing-a-commit-from-triggering-a-build.mdx b/src/partials/preventing-a-commit-from-triggering-a-build.mdx new file mode 100644 index 0000000..d054270 --- /dev/null +++ b/src/partials/preventing-a-commit-from-triggering-a-build.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Preventing a commit from triggering a build + +To make sure a specific commit does not trigger a build, include either `[skip ci]` or `[ci skip]` in the commit message: + +``` +This is not important, please [skip ci] +``` + +Or: + +``` +I just changed the README + +[ci skip] +``` + +:::warning[Only the head/last commit message is checked!] + +If you push more than one commit, only the last (head) commit’s message will be checked for the `skip ci` pattern! + +::: + +If you do want to start a build after all, you have two choices: + +- Rebase the commit (change the commit message). +- Push another commit. + +:::tip[Pushing an empty commit] + +Git allows to create and push empty commits. If you want to build a skipped build you can do `git commit --allow-empty -m "I decided to run this"` on the related branch and push the commit. + +::: diff --git a/src/partials/preventing-a-pull-request-from-triggering-a-build.mdx b/src/partials/preventing-a-pull-request-from-triggering-a-build.mdx new file mode 100644 index 0000000..79eff11 --- /dev/null +++ b/src/partials/preventing-a-pull-request-from-triggering-a-build.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Preventing a pull request from triggering a build + +Pull requests are treated as (virtual) commits themselves, where the commit message is the title + description of the pull request. It is *not* the commit messages of the individual commits that make up the pull request. + +To skip a pull request include the `[skip ci]` pattern in the pull request’s title or its description. + +:::important[Individual commit messages are not checked] + +Putting the `[skip ci]` pattern in the commit message of individual commits that make up the pull request will not work: the pull request will trigger a build if the appropriate trigger is set up. + +::: + +Once you decide to not to skip the pull request, you can simply remove the `[skip ci]` pattern from the pull request’s title or description. This should automatically trigger a new build with the latest commit, and all future commits of the pull request will be built too (unless you add a `[skip ci]` pattern again). diff --git a/src/partials/product-access.mdx b/src/partials/product-access.mdx new file mode 100644 index 0000000..537e145 --- /dev/null +++ b/src/partials/product-access.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Product access + +Collaboration includes roles and permissions: what actions users can perform. On Bitrise, the roles and permissions differ by product: you can configure fine-grained access separately for Bitrise CI and Release Management. + +Product access is mostly independent of workspace roles and permissions. A user who is an Admin on a CI project or a Release Management app doesn't necessarily have full access to the settings of the workspace that owns the project. The exception to that is Workspace owners: all owners have full access to every aspect of the projects owned by the workspace. + +### Admin access + +You can grant **Admin access** to users and groups to enable them to manage all aspects of one or more selected projects. This includes access to all products, such as Bitrise CI and Release Management. + +You can configure admin access for users or groups both from the **Workspace settings** page and the **Project settings** page. + +For details, check out [Updating roles and permissions](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces/updating-roles-and-permissions). + +### Bitrise CI roles and permissions + +Bitrise CI has its own set of roles and permissions that define how users can interact with the CI/CD process. Each user or workspace group can be granted access to Bitrise CI and then assigned roles on CI projects. + +The specific CI roles and permissions define access to things such as project settings, Pipelines, Workflows, and other important parts of CI. + +For details, check out [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +### Release Management roles and permissions + +Release Management has its own set of roles and permissions. These define how users can interact with releases, test distribution, and CodePush. + +In addition, Release Management has a specific collaboration feature: tester groups. A tester group is a group of users who can automatically receive installable artifacts for testing. Testers have limited permissions and they can only be selected from users who are already members of the project that the Release Management app belongs to. + +For details, check out [Release Management roles and permissions](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). diff --git a/src/partials/project-based-trigger-components.mdx b/src/partials/project-based-trigger-components.mdx new file mode 100644 index 0000000..08f1b9b --- /dev/null +++ b/src/partials/project-based-trigger-components.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Project-based trigger components + +The components listed on this page are valid for legacy, project-based triggers. + +| Component | Description | Accepted values | Default value | +| --- | --- | --- | --- | +| `type` | Defines the type of a project-based trigger. A trigger with a given type only accepts trigger conditions belonging to that type. | - `push` - `pull_request` - `tag` | N/A | +| `enabled` | A boolean property that defines if the trigger is currently active. | - `true` - `false` | `true` | +| `workflow` or `pipeline` | The Workflow or Pipeline that is triggered. You can't set both. | The exact name of the Workflow or Pipeline. | N/A | + +| Component | Description | Default value | +| --- | --- | --- | +| `push_branch` | The branch of the repository where code is pushed to trigger a build. | `*` | +| `commit_message` | The commit message to trigger a build. | `*` | +| `changed_files` | The path to a file or folder where changes should trigger a build. | `*` | + +| Component | Description | Default value | +| --- | --- | --- | +| `pull_request_source_branch` | The branch of from which the pull request is opened. | `*` | +| `pull_request_target_branch` | The branch which is the merge target of the pull request. | `*` | +| `pull_request_label` | The pull request label. | `*` | +| `draft_pull_request_enabled` | A boolean property that defines if draft pull requests trigger builds. | `true` | +| `pull_request_comment` | A comment posted on a pull request. | `*` | +| `commit_message` | A specific commit message in pushes to a pull request. | `*` | +| `changed_files` | Specific files that are modified in a pull request. | `*` | + +| Component | Description | Default value | +| --- | --- | --- | +| `tag` | The value of the tag. Accepts a string value or a `regex` property. | `*` | diff --git a/src/partials/project-level-properties.mdx b/src/partials/project-level-properties.mdx new file mode 100644 index 0000000..ac8dd2a --- /dev/null +++ b/src/partials/project-level-properties.mdx @@ -0,0 +1,279 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Project level properties + +### `format_version` + +**Required**: A configuration YAML file is invalid without it. + +The version of the Bitrise configuration format. + +The Bitrise CLI checks it to ensure compatibility between the configuration file and the CLI version. This is relevant for locally run builds: on the Bitrise website, the CLI is always up to date, so the `format_version` property doesn't have an effect on builds triggered. + +**Example of `format_version`** + +```yaml +format_version: '25' +``` + +### `default_step_lib_source` + +The default Step library for the Steps used in your configuration. Bitrise uses this source if no specific source is provided for a given Step. + +The default value is https://github.com/bitrise-io/bitrise-steplib.git. You can use your own fork of this repository as a Step source, or you can refer to Steps by including their exact source repository: [Step reference/ID format](/en/bitrise-ci/references/steps-reference/step-reference-id-format). + +**Example of `default_step_lib_source`** + +```yaml +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +``` + +### `project_type` + +The type of your Bitrise project, such as `ios`, `android`, `flutter`, and so on. + +The project type can be modified at any point but after the initial setup, it has no relevance. + +**Example of `project_type`** + +```yaml +project_type: flutter +``` + +### `title` + +The title of the Bitrise configuration. + +**Example of `title`** + +```yaml +title: My Bitrise project +``` + +### `summary` + +A short summary of the Bitrise configuration. + +**Example of `summary`** + +```yaml +summary: This project runs tests for my app. +``` + +### `description` + +A detailed description of the Bitrise configuration. + +**Example of `description`** + +```yaml +description: This project runs unit and UI tests when a pull request is opened to the dev branch. +``` + +### `services` + +Docker container definitions used by Steps as service containers on Linux hosts. + +:::note[Linux only] + +This is only supported on Linux stacks: the property doesn't work on macOS stacks! + +::: + +One or more service can be configured for a group of Steps, allowing running Docker containers as services for advanced integration testing. These are tied to the lifecycle of a `with` group and will run alongside it in the background. When all Steps within the groups finish, they are cleaned up. + +You need to define: + +- The ID of the service which is used to refer to the service in a with group. +- The image name of the service. +- The image version of the service. + +Read more: [Service containers](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers). + +**Example of `services`** + +```yaml +services: + postgres: + image: postgres:16 + envs: + - POSTGRES_USER: postgres + - POSTGRES_DB: bitrise + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + redis: + image: redis:7 + ports: - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 +``` + +### `containers` + +Docker container definitions used by Steps as execution containers. + +Docker containers can be defined for any Bitrise project in the configuration YAML file. You define the container in the top level of the configuration file and then refer to it in a `with` group in the Workflow configuration. You need to define: + +- The ID of the containers. It will be used to reference this container. +- The name of the Docker image you want to use. +- The version of the image. + +`containers reference`: [Docker container properties](/en/bitrise-ci/references/configuration-yaml-reference/docker-container-properties). + +Read more: [Execution containers](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers). + +**Example of `containers`** + +```yaml +containers: + node-21: + image: node:21.6 +``` + +### `app` + +This property contains project-level configuration information, such as [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html). + +Meta information such as the build stack doesn't belong here but to the `meta` property. + +**Example of `app`** + +```yaml +app: + envs: + - TEST: '' + opts: + is_expand: false +``` + +### `meta` + +Stores project metadata key-value pairs related to the Bitrise configuration. Most importantly, it defines the default stack and the build machine type for the project. + +Read more: [Setting the stack in the bitrise.yml file](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds/setting-the-stack-in-the-bitriseyml-file). + +**Example of `meta`** + +```yaml +meta: + bitrise.io: + stack: linux-docker-android-22.04 + machine_type_id: g2.linux.2medium +``` + +### `trigger_map` + +Defines the build triggers on a project level. This is the legacy method of configuring triggers: we recommend using target-based triggers defined within a Pipeline or a Workflow instead. + +Read more: [Legacy project-based triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers). + +**Example of `trigger_map`** + +```yaml +trigger_map: +- pull_request_source_branch: "*" + type: pull_request + workflow: primary +``` + +### `pipelines` + +Define Pipelines in your project's configuration. Pipelines can be used to organize the entire CI/CD process and to set up advanced configurations with multiple different tasks running parallel and/or sequentially. + +`pipelines` reference: [Pipeline level properties](/en/bitrise-ci/references/configuration-yaml-reference/pipeline-level-properties). + +Read more: [About Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines). + +**Example of `pipelines`** + +```yaml +pipelines: + test: + title: Test Pipeline + summary: This Pipeline runs unit tests. + workflows: + primary: {} +``` + +### `workflows` + +The Workflows included in your configuration. A Workflow is a collection of Steps: reusable, configurable units of work. Steps are executed sequentially within a Workflow. + +`workflows` reference: [Workflow level properties](/en/bitrise-ci/references/configuration-yaml-reference/workflow-level-properties). + +**Example of `workflows`** + +```yaml +workflows: + primary: + steps: + - script: {} +``` + +### `step_bundles` + +Step bundles allow you to group multiple Steps into a single unit. With Step bundles, you can reuse Steps and sequences of Steps. + +You can insert Step bundles into any Workflow. Unlike utility Workflows and Workflow chaining, Step Bundles can be placed anywhere in a Workflow. + +`step_bundles` reference: [Step bundle properties](/en/bitrise-ci/references/configuration-yaml-reference/step-bundle-properties). + +Read more: [Step bundles](/en/bitrise-ci/workflows-and-pipelines/steps/step-bundles). + +**Example of `step_bundles`** + +```yaml +step_bundles: + primary: + steps: + - git-clone: {} + - restore-cache: {} +``` + +### `include` + +The `include` property allows you to use other configuration YAML files in your Bitrise configuration, to break down large, complex YAML files into smaller, modular components. + +A modular YAML configuration includes: + +- A `bitrise.yml` file in the root of your repository. +- Other YAML files in the same or a different repository. To include a file from a different repository, the repository must belong to the same Git account or organization as the primary repository. +- One or more `include` keywords in the bitrise.yml file. These point to other YAML files and bring their configuration into the main project configuration. + +Read more: [Modular YAML configuration](/en/bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration). + +**Example of `include`** + +```yaml +include: + - path: path/to/config_module.yml +``` + +### `tools` + +Tool version to set up. The version syntax supports: + +- Exact versions: for example, `'1.2.3'`. +- Partial matches to the latest release: for example, `'22:latest'`. +- Partial matches to installed versions: for example, `'1.2:installed'`. +- Special aliases `'latest'` and `'installed'` to select the latest or the highest installed version. + +Read more: [Configuring tool versions](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions). + +**Example of `tools`** + +```yaml +tools: + nodejs: 22:installed + ruby: 3.3:latest +``` diff --git a/src/partials/project-level-roles.mdx b/src/partials/project-level-roles.mdx new file mode 100644 index 0000000..c08fe59 --- /dev/null +++ b/src/partials/project-level-roles.mdx @@ -0,0 +1,30 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Project-level roles + +You can assign roles on different projects to members, workspace groups, and outside contributors. You can do so either when: + +- Creating a group. +- Modifying a group's settings. +- Modifying a member's details. + +Project-level roles are only relevant to a specific project. The exact roles and their permissions depend on the product: both Bitrise CI and Release Management have their own roles and permissions: + +- [Bitrise CI roles and permissions](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +- [Release Management roles and permissions](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). + +Both individual members and workspace groups can be assigned roles on the workspace's projects. You can set up: + +- **Admin access**: The user or group can access to both Bitrise CI and Release Management on the selected projects, with the project admin role. +- **Bitrise CI access**: The user or group can access Bitrise CI configurations of the selected projects. They can be assigned different roles on different projects. +- **Release Management access**: The user or group can access Release Management apps of the selected projects. + + :::note[New projects and Release Management apps] + + If a new project is added to a workspace, users won't automatically become members of the project. + + Similarly, if a new Release Management app is added to an existing project, the user or group won't automatically have access to it just because they have access to other apps of the project. + + ::: diff --git a/src/partials/properties-of-workflows-in-pipelines.mdx b/src/partials/properties-of-workflows-in-pipelines.mdx new file mode 100644 index 0000000..a92fba4 --- /dev/null +++ b/src/partials/properties-of-workflows-in-pipelines.mdx @@ -0,0 +1,145 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Properties of Workflows in Pipelines + +### `workflows:depends_on` + +This property defines the Workflows that this Workflow depends on. If any of the Workflows in the list fails, this Workflow won't run. + +You can use both types of YAML array syntax to list dependant Workflows: block sequence and flow sequence. Any Workflow appearing in the dependency list must be part of the same Pipeline. + +:::caution[No circle or loop configuration] + +The dependency graph resulting from your configuration can't contain a circle or loop. You can't start builds with an invalid Pipeline configuration. + +::: + +**Supported values**: Workflow names with YAML array syntax. + +Read more: [Configuring a Bitrise Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline). + +**Example of `workflows:depends_on`** + +Block sequence array syntax: + +```yaml +pipelines: + example: + workflows: + A: {} + B: + depends_on: + - A + C: + depends_on: + - A + D: + depends_on: + - B + - C +``` + +Flow sequence array syntax: + +```yaml +D: + depends_on: [B, C] +``` + +### `workflows:abort_on_fail` + +When this property is `true`, the Pipeline and any other running Workflows are aborted if this Workflow fails. + +**Supported values**: boolean + +Read more: [Configuring a Bitrise Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline). + +**Example of `workflows:abort_on_fail`** + +In this example, both A and B are running in parallel. If B fails, the entire Pipeline, including Workflow A, is immediately aborted. + +```yaml +pipelines: + example: + workflows: + A: {} + B: + abort_on_fail: true +``` + +### `workflows:should_always_run` + +This property defines whether a Workflow should run if a previous Workflow failed. + +Be aware of transitive dependency: if a Workflow that is set to always run has a parent Workflow that fails, it will still run. However, Workflows that depend on it will not. For example, let's say we have Workflow C that depends on Workflow B. Workflow B depends on Workflow A. Of the three Workflows, only B is set to always run: + +- If A fails, B will run but regardless of its result, C won't run because by depending on B, it also depends on A. +- C only runs if both A and B are successful. + +**Supported values:** + +- `none`: If a parent Workflow fails, the Workflow will not run. This is the default value. +- `workflow`: If a parent Workflow fails, the Workflow will run anyway. + +Read more: [Configuring a Bitrise Pipeline](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline) + +**Example of `workflows:should_always_run`** + +```yaml +pipelines: + example: + workflows: + A: {} + B: + depends_on: [ A ] + should_always_run: workflow + C: + depends_on: [ B ] + D: + depends_on: [ C ] + should_always_run: workflow +``` + +### `workflows:run_if` + +A Go template expression that defines the conditions for running the Workflow. + +The property needs an `expression` field that contains a Go template, with three helper functions: + +- `getenv`: Accesses an Environment Variable's value. +- `enveq`: Compares an Environment Variable to a given value. +- `envcontain`: Checks whether an Environment Variable contains a given string. + +The Bitrise CLI evaluates the expression during runtime. If a Workflow is skipped because of a `run_if` expression, it will be counted as a successful Workflow so its dependent Workflows will run. + +Read more: [Examples of run_if expressions](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally/examples-of-run-if-expressions). + +**Example of `workflows:run_if`** + +In this example, B will only run if the EXAMPLE_KEY Environment Variable has the value example value. + +```yaml +pipelines: + example: + workflows: + A: {} + B: + run_if: + expression: {{ enveq "EXAMPLE_KEY" "example value" }} + depends_on: [A] +``` + +### `workflows:parallel` + +The `parallel` property allows you to run copies of the same Workflow in parallel, in a single instruction. This is particularly useful for test sharding. + +The property determines the number of copies running in parallel. Each copy receives two new environment variables: + +- $BITRISE_IO_PARALLEL_INDEX: a zero based index for each copy of the Workflow. +- $BITRISE_IO_PARALLEL_TOTAL: the total number of copies. + +**Supported values**: An integer. + +Read more: [Parallelism in Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines). diff --git a/src/partials/protecting-the-value-of-a-secret.mdx b/src/partials/protecting-the-value-of-a-secret.mdx new file mode 100644 index 0000000..7a587b6 --- /dev/null +++ b/src/partials/protecting-the-value-of-a-secret.mdx @@ -0,0 +1,28 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Protecting the value of a Secret + +Normally, you can **show** and **hide** the value of a Secret by clicking the **eye** icon. This feature is useful if you have a long list of secret env vars in **Secrets** and you wish to check the value of only one Secret while leaving the other values hidden. If a value is hidden, it’s represented with the **crossed out eye** icon. + +However, you can hide the value of a Secret permanently by making it protected. If you do so, no one, including yourself, will be able to change or even view the value again. + +:::warning[A Secret's protection can't be undone] + +Making a Secret protected is irreversible. If you ever need to change the value, you will have to delete the Secret and create a new one. + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Secrets**. +1. Click **Edit** next to the value of your Secret. + + ![edit-button-secrets.png](/img/_paligo/uuid-2de8b6b8-3fc0-5da9-9f45-1b22546e1bb2.png) +1. Check **Protected**. +1. The dialog will warn that the process is irreversible. Click **Save and protect**. + +That's it. You can no longer view the value of the Secret. diff --git a/src/partials/protecting-your-uploaded-files.mdx b/src/partials/protecting-your-uploaded-files.mdx new file mode 100644 index 0000000..f531129 --- /dev/null +++ b/src/partials/protecting-your-uploaded-files.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Protecting your uploaded files + +Once you uploaded a file to Bitrise, you can set your uploaded files to Protected mode. This means that no one can download or reveal the file from your account but your builds can still use them. Bitrise will handle the Environment Variable attached to your uploaded files as a [Secret](/en/bitrise-ci/configure-builds/secrets.html). + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Files**. +1. Click the horizontal ellipsis button next to the name of the file, and select **Make protected**. +1. Click **Make it protected** in the dialog box. diff --git a/src/partials/provisioning-machines-for-github-actions.mdx b/src/partials/provisioning-machines-for-github-actions.mdx new file mode 100644 index 0000000..25bd48c --- /dev/null +++ b/src/partials/provisioning-machines-for-github-actions.mdx @@ -0,0 +1,10 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Provisioning machines for GitHub Actions + +When [creating a machine pool](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool), you must request a certain number of machines that will run your builds. The number of machines we keep running at a time depends on the [authentication method](/en/bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview/authentication): + +- If you use our GitHub app: We create and start machines on-demand. When a GitHub Actions workflow starts, we provision a machine. If you start multiple GitHub Actions workflows at the same time, we start a machine for each, up to the maximum number of machines defined by the machine pool configuration. When the GitHub Actions build ends, the machines are shut down. +- If you use a GitHub personal access token: We always keep running as many machines as you requested in the machine pool. If you need fewer machines at a given time, you need to manually reduce the number of machines in the machine pool configuration. diff --git a/src/partials/pushing-okta-groups-to-bitrise-using-scim.mdx b/src/partials/pushing-okta-groups-to-bitrise-using-scim.mdx new file mode 100644 index 0000000..1c15037 --- /dev/null +++ b/src/partials/pushing-okta-groups-to-bitrise-using-scim.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Pushing Okta groups to Bitrise using SCIM + +You can push groups from Okta to Bitrise using SCIM provisioning. Pushing a group either links an Okta group to an existing Bitrise group or creates a new group in your Bitrise Workspace. + +Either way, by pushing a group, you set up synchronization between an Okta group and a Bitrise group. + +1. Log into Okta and click **Admin**. +1. From the left menu, select **Applications** under the **Applications** section. +1. Select your Bitrise app. +1. Click the **Push Groups** tab. +1. Click on **Push Groups** and choose a filtering method. + + ![push_groups.png](/img/_paligo/uuid-da9ac0ed-a8fe-0d52-3e66-a8195414d1fa.png) +1. Find the group(s) you want to push. +1. You must either create a new group, which will create a brand new group in your Bitrise Workspace or link the Okta group to an existing Bitrise group. + + You can choose between these methods using the dropdown menu under the **Match result & push action**. + + :::caution[Linking a group] + + If you decide to link an Okta group to an existing Bitrise group, keep the following in mind: + + - If the Okta and Bitrise group names are different, the Bitrise group will be automatically renamed to match the name of the Okta group. + - When you manually push a group connected to an existing Bitrise group, if the group had members who were only added on Bitrise and not included in the Okta group, then they will be removed as Okta becomes the single source of truth. + + ::: + + ![linkGroup.png](/img/_paligo/uuid-e94688f6-c068-8c29-201a-bba3c7373dca.png) +1. Click **Save**. + + When the **Push Status** changes to **Active**, the synchronization between Okta and Bitrise is ready. Your group should be updated in a couple of seconds on your Bitrise Workspace as well. + + ![push_status_active.png](/img/_paligo/uuid-28f245c4-7eb3-89b2-1e4d-18d922bbc0a5.png) diff --git a/src/partials/quarantining-flaky-tests.mdx b/src/partials/quarantining-flaky-tests.mdx new file mode 100644 index 0000000..eb6284e --- /dev/null +++ b/src/partials/quarantining-flaky-tests.mdx @@ -0,0 +1,294 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Quarantining flaky tests + +This feature lets you temporarily isolate problematic tests without disrupting your entire test suite. You can mark [flaky tests](/en/bitrise-ci/testing/detecting-and-quarantining-flaky-tests/detecting-flaky-tests) as quarantined so Bitrise will skip them in future builds. + +Quarantined tests are tracked in a separate **Test Quarantine** tab and will continue being skipped from your builds until you remove them from quarantine. + +:::note[Use of Test Quarantine is limited] + +Please note that this feature is only available with the [Enterprise plan](https://bitrise.io/solutions/enterprise). Additionally, only an Admin, Platform Engineer and a Developer can have full read, write and edit access to quarantined tests. Testers and QA people have read-only access. + +::: + +It’s recommended to quarantine tests if, for example: + +- A test passes locally but fails intermittently in CI. +- You've identified a flaky test, but don't have time to fix it immediately. +- You want to maintain green builds while investigating test stability issues. +- You need to prevent automatic reruns from consuming build minutes on known problematic tests. + +### Adding tests to quarantine + +You can quarantine tests from the **Tests** tab or from **Insights** to prevent unexpected build failures: + +#### From the Tests tab + +1. Navigate to the **Flaky** tab on the **Tests** tab. +1. Click **Add to quarantine** next to any flaky test. +1. Define the quarantine scope (workflows, pipelines, or branches) by clicking **[Edit quarantine scope](/en/bitrise-ci/testing/detecting-and-quarantining-flaky-tests/quarantining-flaky-tests/defining-the-scope-of-quarantine)**. +1. Add an optional comment for future reference. + +![pipelinebuild-quarantine.png](/img/_paligo/uuid-917bf276-d9f8-706a-9bb8-6b9e4d1bba39.png) + +![editscope-quarantine.png](/img/_paligo/uuid-01568ffa-736b-b7a0-a692-03cf3784fd65.png) + +#### From Insights + +1. Go to **Insights** → **Tests** → **Flaky tests** → **Test cases**. +1. Apply the **Project filter**. +1. Click **Add to quarantine** next to any test in the breakdown view. +1. Configure the quarantine scope and conditions by clicking **[Edit quarantine scope](/en/bitrise-ci/testing/detecting-and-quarantining-flaky-tests/quarantining-flaky-tests/defining-the-scope-of-quarantine)**. +1. Submit to exclude the test from future runs. + +![insights-quarantine.png](/img/_paligo/uuid-722f22f9-7a85-48f3-69b6-78a16b9df4f0.png) + +### Defining the scope of quarantine + +By default, quarantine applies to all builds on your project, unless you specify otherwise. Leave fields empty to skip the test on all branches and all targets (workflows and pipelines). + +You can limit the scope by branches and targets: + +- Branch (optional): enter space-separated branch patterns with wildcard support (*). Examples: `main`, `release-*`, `feature/auth-*` +- Targets (optional): enter space-separated workflow and pipeline names. Examples: `ci`, `nightly-tests`, `release-pipeline` + +:::note[Combining branches and target to narrow the scope] + +If you set both branches and targets, the test is quarantined only when both the branch AND the target match. Keep patterns tight to avoid silencing too much. Prefer `release-*` over `*` and target the specific workflow that runs the flaky test. + +::: + +You can use the **Comment** field to note the quarantine reason and include a ticket link so you remember why you quarantined the test. + +You can edit or remove the scope later from the quarantine dashboard. + +### Managing quarantined tests + +Access the quarantine dashboard from the **Test Quarantine** tab on your CI home page. + +:::note[Accessing Quarantined tests] + +Please note that only an Admin, Platform Engineer and a Developer can have full read, write and edit access to quarantined tests. Testers and QA people have read-only access. + +::: + +The dashboard shows: + +- Test name and module path. +- The build where the test was quarantined. +- Timestamp and user who quarantined it. +- Direct links to insights for each test. + +![managingquarantinedtests.png](/img/_paligo/uuid-f06ef542-d72d-5bed-0c22-4d729b330691.png) + +Quarantined tests that were not executed in a build will not show up on your **Tests** tab. Quarantined tests remain in the dashboard until you remove them from the quarantine. + +We recommend that you scope narrowly; quarantine on the branches/workflows where the flakiness occurs. It is also helpful to leave a comment for future cleanup and set regular reviews for long-lived quarantines and fixed tests. + +### Environment Variable for quarantined tests + +During builds, Bitrise injects the scoped list of quarantined tests into the $BITRISE_QUARANTINED_TESTS_JSON Environment Variable. Supported Steps read this variable to skip those tests and exclude them from automatic reruns. If you use custom Steps or direct runner calls, parse $BITRISE_QUARANTINED_TESTS_JSON and filter your test runner arguments accordingly. Here is an example of the value in the Env Var: + +``` +BITRISE_QUARANTINED_TESTS_JSON = "[ + { + testCaseName: 'EnableQuarantiningDisabledByPlan', + testSuiteName: ['UITests', 'CI', 'Settings'], + className: 'BuildSettings' + }, + { + testCaseName: 'EnableQuarantiningDisabledByLDFlag', + testSuiteName: ['UITests', 'CI', 'Settings'], + className: 'BuildSettings' + } + ... +]" +``` + +:::note[Steps supporting quarantined tests] + +The following steps will automatically skip the quarantined tests within the specified scope. If you use custom steps or direct runner calls, parse $BITRISE_QUARANTINED_TESTS_JSON and filter your test runner arguments accordingly. + +- [Xcode Test for iOS](https://bitrise.io/integrations/steps/xcode-test) +- [iOS Device Testing](https://bitrise.io/integrations/steps/virtual-device-testing-for-ios) +- [Android Unit Test](https://bitrise.io/integrations/steps/android-unit-test) +- [Virtual Device Testing for Android](https://bitrise.io/integrations/steps/virtual-device-testing-for-android) + +::: + +#### Quarantine support for custom Steps + +Other Steps can convert the BITRISE_QUARANTINED_TESTS_JSON data to a suitable format for your test runner to skip given tests. For example, you can configure the fastlane `scan` action or a Gradle Init script to skip the quarantined tests. + +Here are some examples: + +**Fastlane - running scan action** + +You can run a fastlane lane in a Bitrise Workflow either with the official Bitrise **Fastlane** Step or using a **Script** Step. + +In either scenario, you will first need to convert the JSON data to a comma-separated list of `TestTarget/TestClass/TestMethod` items. + +You can convert the JSON data either in the configuration YAML file or in the fastlane config file (`Fastfile`). + +Configuration YAML + +Fastfile + +1. In this example, a **Script** Step converts the quarantined test JSON data to a comma-separated list of `TestTarget/TestClass/TestMethod` items and exposes the list in the BITRISE_QUARANTINED_TESTS_LIST Environment Variable: + + ``` + workflows: + test: + steps: + ... + - script: + title: Convert BITRISE_QUARANTINED_TESTS_JSON + inputs: + - content: |- + #!/usr/bin/env bash + set -e + + # Read JSON from environment variable + json="$BITRISE_QUARANTINED_TESTS_JSON" + + # Convert to array of TestTarget/TestClass/TestMethod + test_array=($(echo "$json" | jq -r '.[] | "\(.testSuiteName[0])/\(.className)/\(.testCaseName)"')) + + # Join the array elements with a comma + skip_testing_list=$(IFS=, ; echo "${test_array[*]}") + + # Export the comma-separated string as an environment variable to be used by following Fastlane Steps + envman add --key BITRISE_QUARANTINED_TESTS_LIST --value "$skip_testing_list" + - fastlane: + inputs: + - lane: test + ... + ``` +1. The BITRISE_QUARANTINED_TESTS_LIST variable can then be used to set the `skip testing` option for the `scan` action in fastlane: + + ``` + lane :test do + ... + scan(skip_testing: ENV['BITRISE_QUARANTINED_TESTS_LIST'].split(',')) + ... + end + ``` + +- Converting the data in the Fastfile also requires the BITRISE_QUARANTINED_TESTS_JSON variable. In the example below, the fastlane lane parses the list of quarantined tests into test identifiers and passes them to scan as `skip_testing`: + + ``` + lane :test do + ... + skip_testing = JSON.parse(ENV['BITRISE_QUARANTINED_TESTS_JSON']).map do |item| + "#{item['testSuiteName'][0]}/#{item['className']}/#{item['testCaseName']}" + end unless ENV['BITRISE_QUARANTINED_TESTS_JSON'].to_s.empty? + scan(skip_testing: skip_testing) + ... + end + ``` + +**Script Step - running xcodebuild test or test-without-building** + +This example converts the BITRISE_QUARANTINED_TESTS_JSON variable's value to `skip-testing` options for xcodebuild `test` or `test-without-building` commands. + +``` +workflows: + test: + steps: + - script: + title: Convert BITRISE_QUARANTINED_TESTS_JSON + inputs: + - content: |- + #!/usr/bin/env bash + set -e + + # Read JSON from environment variable + json="$BITRISE_QUARANTINED_TESTS_JSON" + + # Convert to array of -skip-testing:TestTarget/TestClass/TestMethod + test_array=($(echo "$json" | jq -r '.[] | "-skip-testing:\(.testSuiteName[0])/\(.className)/\(.testCaseName)"')) + + # Join the array elements with a space + skip_testing_list="${test_array[*]}" + + # Export the space-separated string as an environment variable to be used by following Fastlane Steps + envman add --key XCODEBUILD_SKIP_TESTING_OPTION --value "$skip_testing_list" + - script: + inputs: + - content: xcodebuild test -scheme -destination $XCODEBUILD_SKIP_TESTING_OPTION +``` + +**Script Step - running Gradle unit tests** + +When running Android local unit tests through Gradle (`/gradlew testUnitTest)`, a Gradle Init script can be used to skip quarantined test cases. + +``` +workflows: + test: + steps: + - script: + title: Create skip testing init script + inputs: + - content: |- + #!/bin/bash + + # Script to generate Gradle init script for quarantined tests + # Reads BITRISE_QUARANTINED_TESTS_JSON environment variable and generates + # a Gradle init script that excludes the specified tests + + set -ex + + # Check if BITRISE_QUARANTINED_TESTS_JSON is set + if [[ -z "${BITRISE_QUARANTINED_TESTS_JSON:-}" ]]; then + echo "Error: BITRISE_QUARANTINED_TESTS_JSON environment variable is not set" >&2 + exit 1 + fi + + # Parse JSON and extract test patterns + # Each test will be excluded using the pattern: className.testCaseName + excluded_tests=$(echo "$BITRISE_QUARANTINED_TESTS_JSON" | jq -r '.[] | .className + "." + .testCaseName') + + # Generate the Gradle init script + init_script_file=./gradle_quarantine_init.gradle.kts + cat << 'EOF' > "$init_script_file" + allprojects { + tasks.withType().configureEach { + EOF + + # Add filter.excludeTestsMatching lines for each excluded test + while IFS= read -r test_pattern; do + if [[ -n "$test_pattern" ]]; then + echo " filter.excludeTestsMatching(\"$test_pattern\")" >> "$init_script_file" + fi + done <<< "$excluded_tests" + + cat << 'EOF' >> "$init_script_file" + } + } + EOF + + # Output the path to the generated init script file + envman add --key GRADLE_INIT_SCRIPT_FILE --value "$init_script_file" + - script: + title: Run tests + inputs: + - content: |- + #!/bin/bash + set -ex + ./gradlew :app:testDebugUnitTest "--init-script" "$GRADLE_INIT_SCRIPT_FILE" +``` + +The `Create skip testing init script` Step creates the following Gradle init script: + +``` +allprojects { + tasks.withType().configureEach { + filter.excludeTestsMatching("..") + filter.excludeTestsMatching("..") + ... + } +} +``` diff --git a/src/partials/quick-start-guide.mdx b/src/partials/quick-start-guide.mdx new file mode 100644 index 0000000..c2e9bdc --- /dev/null +++ b/src/partials/quick-start-guide.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Quick start guide + +This Quick Start Guide helps you start your first build on Bitrise with minimum config. + +1. [Sign up for Bitrise](/en/bitrise-platform/getting-started/signing-up-for-bitrise.html) if you don’t have an account yet. +1. [Connect a repo](https://docs.bitrise.io/en/bitrise-platform/getting-started/getting-started-with-the-bitrise-platform.html)and run an automatically configured standard Workflow on any project. +1. Once you’ve looked through the generated YML, make the changes you need: if you’re opting for a custom code, pop it into our [Script Step](https://www.bitrise.io/integrations/steps/script), and run your first build. Or find the Steps in our [Step Library](https://www.github.com/bitrise-io/bitrise-steplib) to replicate your Jenkinsfile’s behaviors. You can also run builds locally on your computer by installing our [Bitrise CLI](https://docs.bitrise.io/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html), Bitrise's open source runner. +1. After getting to your new Workflow’s first green build, set up other jobs by configuring [automatic triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) or [scheduled builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds.html). +1. Optimize your Workflows with [key-based caching](https://docs.bitrise.io/en/bitrise-ci/dependencies-and-caching/key-based-caching.html) for faster, safer, and more reproducible builds. +1. Need help? [Contact us](https://support.bitrise.io/hc/en-us). + +If you are interested in the main Jenkins-Bitrise differences and how Bitrise enhance your mobile development process, then continue with the guide below. diff --git a/src/partials/rearranging-chained-workflows.mdx b/src/partials/rearranging-chained-workflows.mdx new file mode 100644 index 0000000..c3ea433 --- /dev/null +++ b/src/partials/rearranging-chained-workflows.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Rearranging chained Workflows + +Once you have a chain, you can easily rearrange the order of Workflows in a drag-and-drop menu. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Click the ellipsis labelled **Manage Workflows**. + + ![chaining-workflows-menu.png](/img/_paligo/uuid-69aa514f-9623-9dde-f80f-340c81d06044.png) +1. From the dropdown menu, select **Reorder Workflow chain** to bring up a drag-and-drop menu where you can rearrange the Workflows of the chain. + + ![reorder-workflow-chain.png](/img/_paligo/uuid-71e4b862-efd1-ece7-3627-d970b41f2d43.png) +1. Click **Save** in the top right corner. diff --git a/src/partials/rebuilding-a-failed-pipeline.mdx b/src/partials/rebuilding-a-failed-pipeline.mdx new file mode 100644 index 0000000..6929a6d --- /dev/null +++ b/src/partials/rebuilding-a-failed-pipeline.mdx @@ -0,0 +1,48 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Rebuilding a failed Pipeline + +You can rebuild an entire Pipeline or certain parts of it at any time. The Pipeline build page shows the status of every Workflow in your Pipeline when a build is running. If a Workflow fails, you can save time by re-running the failed Workflow instead of the whole Pipeline. + +:::important[Time limit for partial reruns] + +Partial pipeline reruns are available for 7 days after the original pipeline execution. Full reruns can be run at any time. + +::: + +### Rebuilding a failed Pipeline + +You can rebuild a Pipeline either in full or its unsuccessful Workflows with the click of a button: + +1. Open Bitrise CI. +1. Click a finished Pipeline build for your project. +1. On the Pipeline summary screen, click **Rebuild** to bring up the rebuild dropdown menu. +1. Select an option: + + - **Rebuild unsuccessful Workflows**: This option only rebuilds the Workflows that failed. This option might not be available for variant Workflows using the `parallel` property: [see topic](#section-id235364667633475). + - **Rebuild the entire Pipeline**: This option rebuilds the entire Pipeline from start to finish. + - **Rebuild unsuccessful Workflows with remote access**: Remote access allows you to access the build machine remotely while the build is running: [Remote access](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access). + - **Rebuild entire Pipeline with remote access**: See above. + +### Rebuilding a Pipeline from a failed Workflow + +You can rebuild a Pipeline from a specific failed Workflow. This will rebuild all Workflows that come after the failed Workflow in the Pipeline. + +This option might not be available for variant Workflows using the `parallel` property: [see topic](#section-id235364667633475). + +1. Open Bitrise CI. +1. Click a finished Pipeline build for your project. +1. Scroll down to the graph of the Pipeline. +1. Find the failed Workflow and hover over it on the right of the card. +1. Click the **Rebuild from here** button. + +### Rebuilding Pipelines using different Workflow variants + +If your Pipelines [use different variants of the same Workflow(s)](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines) with the `parallel` property, the available rebuild options depend on the Environment Variable defining the number of parallel runs. + +- If the Workflow which sets the number of parallel runs has already finished during the failed build, you have to rebuild the whole Pipeline. +- If the number hasn't been set yet during the build, you can use a partial rebuild: either rebuilding from a failed Workflow or rebuild all unsuccessful Workflows. + +This is because Bitrise only allows partial rebuilds if the rebuild runs with the same Pipeline configuration as the original build. Two Pipeline configurations are identical if they have the same number of Workflows and the Workflows have the same names. When the parallel count is set, Bitrise has no way of knowing if the number is going to be the same in the rebuild. If the number is different, the two Workflow configurations are also different so a full rebuild is the only option. diff --git a/src/partials/rebuilding-a-failed-workflow-build.mdx b/src/partials/rebuilding-a-failed-workflow-build.mdx new file mode 100644 index 0000000..e0f9d4a --- /dev/null +++ b/src/partials/rebuilding-a-failed-workflow-build.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Rerunning a failed Workflow build + +You can rebuild a failed Workflow at any time. Rebuilding means immediately launching a new build with the current configuration YAML file. + +1. Open Bitrise CI and find your project's build page. +1. On the top right corner, click **Rebuild**. + + :::tip[Remote access] + + You can also rebuild with remote access: click the downward arrow to open the dropdown menu and click **Rebuild with Remote Access**. To find out more: [Remote access](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access) + + ::: diff --git a/src/partials/recommended-flags-for-remote-build-execution.mdx b/src/partials/recommended-flags-for-remote-build-execution.mdx new file mode 100644 index 0000000..0ca5de3 --- /dev/null +++ b/src/partials/recommended-flags-for-remote-build-execution.mdx @@ -0,0 +1,42 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Recommended flags for remote build execution + +Bazel offers a number of command flags that are needed to get the most out of remote build execution. + +| Flag and recommend values | Description | +| --- | --- | +| `--jobs=100` | Defines the maximum number of build/test actions Bazel may have "in flight" at once. If you omit the flag Bazel silently falls back to the number of logical CPU cores on the host VM. That default is appropriate for local execution but severely under‑utilises the RBE cluster. `--jobs=100` is a good starting point for most Android/iOS monorepos but it can be increased gradually based on the worker count. | +| MacOS: `--remote_default_exec_properties=Arch=arm64` `--remote_default_exec_properties=OSFamily=Darwin` Linux: `--remote_default_exec_properties=Arch=amd64` `--remote_default_exec_properties=OSFamily=Linux` | Defines the default execution platform (worker pool). Supply key‑value pairs such as `Arch=arm64` or `OSFamily=Darwin`. Multiple occurrences are merged. Make sure that no other `exec_properties` are set anywhere for the targets, otherwise Bazel will not match the worker pool and the build will fail. | +| `--spawn_strategy=remote,local` | Determines the order in which Bazel tries to execute an action. Bazel will use the first strategy in the list that can run a given action. The default value is `remote,worker,sandboxed,local`. Keep remote first so actions run in your remote execution environment, with a graceful fallback to local execution. | +| `--noremote_upload_local_results` | Skips re‑uploading outputs that were produced locally. Remote workers already push artifacts to the cache, saving bandwidth. This config flag is also configured via Bitrise Build Cache CLI. If you use it, please make sure that `--cache-push` flag is false or off in the CLI when you use this flag. | + +We recommend adding these flags to your `.bazelrc` file and reuse: + +MacOS: + +``` +build:remote --jobs=100 +build:remote --noremote_upload_local_results +build:remote --spawn_strategy=remote,local +build:remote --remote_default_exec_properties=Arch=arm64 +build:remote --remote_default_exec_properties=OSFamily=Darwin +``` + +Linux: + +``` +build:remote --jobs=100 +build:remote --noremote_upload_local_results +build:remote --spawn_strategy=remote,local +build:remote --remote_default_exec_properties=Arch=amd64 +build:remote --remote_default_exec_properties=OSFamily=Linux +``` + +With everything in place, you can invoke remote build execution by adding the remote config to any Bazel command: + +``` +bazel build //... --config=remote +``` diff --git a/src/partials/redacting-secrets.mdx b/src/partials/redacting-secrets.mdx new file mode 100644 index 0000000..8074bd0 --- /dev/null +++ b/src/partials/redacting-secrets.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Redacting Secrets + +The Bitrise CLI automatically redacts your Secret Env Vars and prints `[REDACTED]` with newlines after the key so that the Secret Env Vars are NOT VISIBLE in the build log. This applies to both private and public apps. + +You can turn this off at any time though if you need to have your Secrets visible in logs. + +:::warning + +This is a potential security risk. We strongly recommend not to turn off Secret redaction. + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Secrets**. +1. Click **Add new** to register the `BITRISE_SECRET_FILTERING` secret Environment Variable with false value. +1. Click **Save changes** in the top right corner. diff --git a/src/partials/regenerating-a-personal-access-token.mdx b/src/partials/regenerating-a-personal-access-token.mdx new file mode 100644 index 0000000..77d5238 --- /dev/null +++ b/src/partials/regenerating-a-personal-access-token.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Regenerating a personal access token + +You can regenerate an existing personal access token at any time. However, you can't view the value of the previously generated token again, only the new value. + +1. Log in to Bitrise, and select **Bitrise CI** from the left navigation menu. +1. In the upper right corner, click the profile image to open the dropdown menu. +1. Select the **Account settings** option. + + ![account-settings-page.png](/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png) +1. Go to the **Security** tab. +1. Find your token in the **Personal access tokens** section. +1. Click **Edit**. +1. Click **Regenerate token**. +1. Copy the new token, and then click **Done**. diff --git a/src/partials/regenerating-a-workspace-api-token.mdx b/src/partials/regenerating-a-workspace-api-token.mdx new file mode 100644 index 0000000..844b908 --- /dev/null +++ b/src/partials/regenerating-a-workspace-api-token.mdx @@ -0,0 +1,28 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Regenerating a Workspace API token + +If a Workspace API token is lost for any reason, there is no way to view it again. You have the option of regenerating the existing token: this way you don't have to create an entirely new token and configure app access again. The regenerated token will: + +- Have a new expiration date. +- Have access to the exact same apps with the exact same roles as before. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Security**. +1. Find your token and click the **View details** icon next to its name. + + ![view-details-token.png](/img/_paligo/uuid-efe62dac-0331-a3e4-6bf8-57318826bcd3.png) +1. Click **Regenerate**. + + ![regenerate-token.png](/img/_paligo/uuid-3850ebd0-6ab7-934f-c232-4305ccffe249.png) +1. Select the new expiration date. +1. Click **Regenerate** to get the new token. +1. Click **Copy and close**. + + Make sure to save the token in a secure way: you won't be able to see it again. diff --git a/src/partials/register-a-test-device-manually.mdx b/src/partials/register-a-test-device-manually.mdx new file mode 100644 index 0000000..657cb8c --- /dev/null +++ b/src/partials/register-a-test-device-manually.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Register a test device manually + +1. On bitrise.io, open the account selector menu on the top right and select **Profile settings**. + + ![profile-settings-menu.png](/img/_paligo/uuid-99b0eb76-b2f2-4c0c-ae11-abdce5177774.png) +1. On the menu on the left side, select **Test devices**. + + ![test-devices-menu.png](/img/_paligo/uuid-7fb72644-6457-f137-c769-10345e5cb120.png) +1. Click on **Register device manually**. + + ![register-device-button.png](/img/_paligo/uuid-3b5d8be9-8f71-2547-1c6c-7c41113bf6b9.png) +1. In the **Register device** dialog, fill out the **Title** field and the **Identifier** field with your device’s UDID. +1. Click **Register Devices**. + + You can **get your UDID** if you plug your device into a computer, and open iTunes. Under **Summary**, you should see a Serial Number. If you click on it, it will reveal your device’s **UDID** which you can paste into the **Identifier** field on our [Test Devices](https://app.bitrise.io/users/sign_in#/test_devices). +1. Register this test device to the [Apple Developer Portal](https://developer.apple.com/) with the correct provisioning profile added to your device or use our [Auto Provisioning Step](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning) with enabling profile generation. + +Now you can see your registered test device under the **Registered test devices** section. + +You can remove this registered device any time if you click the orange **x** icon. diff --git a/src/partials/register-an-ios-device-using-safari.mdx b/src/partials/register-an-ios-device-using-safari.mdx new file mode 100644 index 0000000..335d40c --- /dev/null +++ b/src/partials/register-an-ios-device-using-safari.mdx @@ -0,0 +1,39 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Register an iOS device using Safari + +The most comfortable way to register your iOS test device on [bitrise.io](https://www.bitrise.io) is to open [bitrise.io](https://www.bitrise.io) with Safari. This way we can open your device’s Settings and create a temporary profile to get your Unique Device Identifier (UDID). This way you don’t have to look for it and manually copy/paste it. + +:::important[Clear the cache] + +When trying to install an app from the public install page, you should clear the cache: click the link appearing in the **If you synced your settings from your old device, you need to clear the cache and register your new device** line. The link redirects to the **Profile settings** page where you can follow the procedure described below. + +Read more about installing an app from the public install page in our [Deploying an iOS app to Bitrise.io]() guide. + +::: + +1. Open Safari in **non-incognito mode** on your iOS device and log into [bitrise.io](https://www.bitrise.io). +1. Go to your **Profile**. +1. Tap **Account Settings**. +1. Tap **Test devices** on the left. +1. Tap **Register this device**. +1. In the pop-up window, Tap **Allow** so that [bitrise.io](https://www.bitrise.io) can show your configuration profile. +1. Tap **Install** when the **Install Profile** dialog appears. +1. Enter your devices’s passcode. +1. Tap **Install** on the **Install Profile** again. Now you can see your UDID and your iOS device name in the **Register device** dialog. +1. Tap **Register device**. +1. Register this test device to the [Apple Developer Portal](https://developer.apple.com/) with the correct provisioning profile added to your device or use our [Auto Provisioning]() step with enabling profile generation. + +If you go back to `Test devices`, you can see the registered device: + +![test_devices.png](/img/_paligo/uuid-941f46db-0d8e-cfd4-0f29-7e89b30471a1.png) + +You can delete the registered device any time if you click on the **Remove** button. + +:::note[Safari as default browser] + +If you encounter any issues with your registered device, we recommend you make Safari your default browser. + +::: diff --git a/src/partials/registering-an-incoming-webhook-automatically.mdx b/src/partials/registering-an-incoming-webhook-automatically.mdx new file mode 100644 index 0000000..58ceb51 --- /dev/null +++ b/src/partials/registering-an-incoming-webhook-automatically.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Registering an incoming webhook automatically + +Automatic webhook registration is supported for projects that have their code hosted on GitHub, GitLab and Bitbucket. + +If you use one of the above services as your source code hosting provider, Bitrise automatically sets up a webhook for it with a click of a button at the end of your [project setup journey](/en/bitrise-ci/getting-started/adding-a-new-project.html). + +:::note[GitHub App integration] + +If you use [the Bitrise GitHub App](/en/bitrise-platform/repository-access/github-app-integration) to connect your Bitrise Workspace to a Git account or organization, you don't need a webhook. The app can trigger builds or send status updates without it. + +::: + +However, you can always change this webhook later or add a new one if you skipped registering a webhook when adding the project. + +You can automatically register a webhook to the repository on the **Project settings** page. Automatic registration means that Bitrise registers the webhook at the repository, so you don't have to manually go there and add it on your Git provider's website. This requires: + +- That you have admin rights to the repository. +- That the account that hosts the repository is connected to your Bitrise account. + +To register a webhook automatically: + +1. Make sure your Bitrise account is connected to the Git provider account that hosts the repository and that your Git account has admin rights to the repository. +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Integrations**. +1. On the top of the Integrations page, select the **Webhooks** tab. + + ![webhooks-tab.png](/img/_paligo/uuid-00d7e0d5-df77-2b41-222b-c7ff05829144.png) +1. In the **Incoming webhooks** section, select **Set up webhooks automatically**. + +Bitrise will automatically register a webhook at the project's repository. diff --git a/src/partials/registering-an-incoming-webhook-manually.mdx b/src/partials/registering-an-incoming-webhook-manually.mdx new file mode 100644 index 0000000..5d98271 --- /dev/null +++ b/src/partials/registering-an-incoming-webhook-manually.mdx @@ -0,0 +1,26 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Registering an incoming webhook manually + +You can manually setup or change your webhooks after you registered your project on Bitrise. The process is different depending on your Git provider but on Bitrise, the basic steps are the same for each. + +:::note[Create your own webhook implementation] + +[Our webhook processor is Open Sourced](https://github.com/bitrise-io/bitrise-webhooks). If you are looking for an unsupported solution, you can create an issue on the GitHub page or create a pull request with the implementation. You can also run your own webhook provider behind your own firewall if required. + +::: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. In the **Incoming webhooks** section, **Set up webhooks manually**. +1. On the top of the Integrations page, select the **Webhooks** tab. + + ![webhooks-tab.png](/img/_paligo/uuid-00d7e0d5-df77-2b41-222b-c7ff05829144.png) +1. Scroll down to the **Incoming webhooks** section and open **Manual webhooks**. + + ![manual-webhooks.png](/img/_paligo/uuid-c1dec9c9-49a4-90c6-40b3-c3d69088567b.png) +1. Copy the webhook URL and register it at your Git provider. diff --git a/src/partials/registering-an-incoming-webhook-with-the-api.mdx b/src/partials/registering-an-incoming-webhook-with-the-api.mdx new file mode 100644 index 0000000..1bec9d1 --- /dev/null +++ b/src/partials/registering-an-incoming-webhook-with-the-api.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Registering an incoming webhook with the API + +Incoming webhooks enable users to set up automatic triggers for their apps on Bitrise: for example, a Bitrise webhook registered on GitHub can automatically trigger a build when code is pushed to the GitHub repository. + +:::note[Required role] + +You must have an admin or owner role on the app's team to manage incoming or outgoing webhooks using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +To set up a webhook, you must [connect your Bitrise account to your Git provider account](/en/bitrise-platform/repository-access/repository-access-with-oauth): this allows Bitrise to register the webhook automatically. + +Register a webhook by calling the `register-webhook` endpoint with an existing app slug: + +``` +curl -X POST -H 'Authorization: ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/register-webhook' +``` + +This will register a webhook to the Git provider of the app. Afterwards, you can set up [automatic triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers.html) either on the website or via the Trigger Map in the app’s `bitrise.yml` file. diff --git a/src/partials/registering-devices-with-the-xcode-archive-step.mdx b/src/partials/registering-devices-with-the-xcode-archive-step.mdx new file mode 100644 index 0000000..85359ab --- /dev/null +++ b/src/partials/registering-devices-with-the-xcode-archive-step.mdx @@ -0,0 +1,147 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Registering devices on the Apple Developer Portal with the Xcode Archive Step + +The **Xcode Archive & Export for iOS** Step allows you to automatically register your test devices on the Apple Developer Portal. By default, the Step registers all test devices that you registered to your Bitrise account but you can configure it to only register a specific selection of devices. + +:::important[Apple Developer Portal limit] + +Please note that the Apple Developer Portal has a limit for devices registered for testing purposes, typically set at 100 devices per account. Devices registered with the **Xcode Archive & Export for iOS** Step count towards this limit and you can only remove registered devices once a year. + +::: + +### Registering all devices on the Apple Developer Portal + + + + +1. Register your devices on Bitrise. + + - [Register using an iOS device](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device/register-an-ios-device-using-safari). + - [Register manually on the **Profile settings** page](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device/register-a-test-device-manually). +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add the **Xcode Archive & Export for iOS** Step to your Workflow. +1. In the **Automatic code signing** input group, set the **Register test devices on the Apple Developer Portal** input to `yes`. + + ![register-yes.png](/img/_paligo/uuid-113925d0-226c-da20-a0ea-41eec556f750.png) + + + + +1. Register your devices on Bitrise. + + - [Register using an iOS device](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device/register-an-ios-device-using-safari). + - [Register manually on the **Profile settings** page](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device/register-a-test-device-manually). +1. In the Configuration YAML file, add the `xcode-archive` Step to your Workflow. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-archive: + inputs: + ``` +1. Set the `register_test_devices` input to `yes`. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-archive: + inputs: + - register_test_devices: 'yes' + ``` + + + + +### Registering a selection of devices on the Apple Developer Portal + + + + +1. Get the UDID of the devices you want to register: [Checking the available test devices for an app](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device/checking-the-available-test-devices-for-an-app). +1. Create a `.txt` file and add the UDIDs of all devices you want to register to the file in a comma-separated list: + + ``` + 00000000-0000000000000001,00000000-0000000000000002,00000000-0000000000000003 + ``` +1. Make sure Bitrise can access the file in a Workflow: + + You can commit it to your repository. + + [You can upload it to the Generic File Storage and use the **File Downloader** Step to access it](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds/downloading-a-file-using-the-file-downloader-step). + + You can dynamically generate the file during the build. +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add the **Xcode Archive & Export for iOS** Step to your Workflow. +1. In the **Automatic code signing** input group, set the **Register test devices on the Apple Developer Portal** input to **yes**. +1. In the same input group, add the path to the `.txt` file containing the UDIDs to the **Path of file containing the devices to be registered** input. + + ![registering-test-devices.png](/img/_paligo/uuid-139f4940-4762-210c-2a4d-59bc4e2b561d.png) + + :::note[Devices registered on Bitrise] + + This input takes priority over the devices registered to your Bitrise account. + + ::: + + + + +1. Get the UDID of the devices you want to register: [Checking the available test devices for an app](/en/bitrise-ci/testing/testing-ios-apps/registering-a-test-device/checking-the-available-test-devices-for-an-app). +1. Create a `.txt` file and add the UDIDs of all devices you want to register to the file in a comma-separated list: + + ``` + 00000000-0000000000000001,00000000-0000000000000002,00000000-0000000000000003 + ``` +1. Make sure Bitrise can access the file in a Workflow: + + You can commit it to your repository. + + [You can upload it to the Generic File Storage and use the **File Downloader** Step to access it](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds/downloading-a-file-using-the-file-downloader-step). + + You can dynamically generate the file during the build. +1. In the Configuration YAML file, add the `xcode-archive` Step to your Workflow. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-archive: + inputs: + ``` +1. Set the `register_test_devices` input to `yes`. + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-archive: + inputs: + - register_test_devices: 'yes' + ``` +1. Set the path to the `.txt` file containing the UDIDs in the `test_device_list_path` input. + + :::note[Devices registered on Bitrise] + + This input takes priority over the devices registered to your Bitrise account. + + ::: + + ```yaml + your-workflow: + steps: + - git-clone: {} + - xcode-archive: + inputs: + - register_test_devices: 'yes' + - test_device_list_path: path/to/the/file + ``` + + + diff --git a/src/partials/release-management-configuration.mdx b/src/partials/release-management-configuration.mdx new file mode 100644 index 0000000..95e98ae --- /dev/null +++ b/src/partials/release-management-configuration.mdx @@ -0,0 +1,8 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Open your app in Release Management. +1. On the left, select **Configuration**. + + ![20251216-configuration-rm.png](/img/_paligo/uuid-9e94e830-280a-4137-e869-f662722473df.png) diff --git a/src/partials/remote-access-with-screenshare.mdx b/src/partials/remote-access-with-screenshare.mdx new file mode 100644 index 0000000..d6af453 --- /dev/null +++ b/src/partials/remote-access-with-screenshare.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Remote access with screenshare + +To access a Bitrise build machine with a screenshare app, you will need the correct username, password, and address, as well as a VNC screenshare app: + +:::note[macOS only] + +Remote access with screenshare is only available for Workflows that run on a macOS-based stack. If the Workflow's stack (or in absence of Workflow-specific stacks, the app's default stack) is a Linux-based one, you won't see the screenshare instructions at all. + +::: + +1. Open the app on Bitrise. +1. On the main page of the app, find the build you want to re-run with remote access and click it. +1. On the **Rebuild** button, click the downward arrow to open the dropdown menu. +1. Select **Rebuild with remote access**. This starts a new build that you can access remotely. + + ![builds-remote-access.png](/img/_paligo/uuid-bc4b9514-6399-0d7d-1f0f-0308aa637c5c.png) +1. Under the **Screenshare** option, find the required information: + + - Address + - Username + - Password + + ![builds-ssh-remote-access-instructions.png](/img/_paligo/uuid-bf8f3c0e-81c1-d175-92da-bcbabe18bb3a.png) +1. Open a VNC screenshare application. + + The simplest option is using the default **Screen Sharing** application on macOS. +1. Fill out the required fields with the information from under the **Screenshare** option. + +And done! You should now be able to access the virtual machine where your build is running. diff --git a/src/partials/remote-access-with-ssh.mdx b/src/partials/remote-access-with-ssh.mdx new file mode 100644 index 0000000..71d16bf --- /dev/null +++ b/src/partials/remote-access-with-ssh.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Remote access with SSH + +To access a Bitrise build machine with SSH, you will need a command line interface and the correct command and password: + +1. Open the app on Bitrise. +1. On the main page of the app, find the build you want to re-run with remote access and click it. +1. On the **Rebuild** button, click the downward arrow to open the dropdown menu. +1. Select **Rebuild with remote access**. This starts a new build that you can access remotely. + + ![builds-remote-access.png](/img/_paligo/uuid-bc4b9514-6399-0d7d-1f0f-0308aa637c5c.png) +1. In the SSH section, find the **Command** and run it in a command line interface. + + ![builds-ssh-remote-access-instructions.png](/img/_paligo/uuid-bf8f3c0e-81c1-d175-92da-bcbabe18bb3a.png) + +And done! You should be able to access the virtual machine where your build is running. diff --git a/src/partials/remote-access-with-visual-studio-code.mdx b/src/partials/remote-access-with-visual-studio-code.mdx new file mode 100644 index 0000000..46c56b9 --- /dev/null +++ b/src/partials/remote-access-with-visual-studio-code.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Remote access with Visual Studio Code + +This remote access mechanism allows your local Visual Studio Code app to connect to the Bitrise build machine as a [remote repository](https://code.visualstudio.com/docs/remote/ssh). + +You can browse and edit files in real time, use the built-in terminal to execute commands, and even install a subset of VSCode extensions. + +1. Open the app on Bitrise. +1. On the main page of the app, find the build you want to re-run with remote access and click it. +1. On the **Rebuild** button, click the downward arrow to open the dropdown menu. +1. Select **Rebuild with remote access**. This starts a new build that you can access remotely. +1. Follow the on-screen instructions to install the Bitrise CLI, its remote access extension and the connection command. + + ![vscode.png](/img/_paligo/uuid-f0d69f0f-dab5-e9e9-b142-a9a5d584d1a6.png) diff --git a/src/partials/removing-a-step-from-a-workflow.mdx b/src/partials/removing-a-step-from-a-workflow.mdx new file mode 100644 index 0000000..766d26e --- /dev/null +++ b/src/partials/removing-a-step-from-a-workflow.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Removing a Step from a Workflow + +You can remove a Step at any time. Be aware, however, that if you add it back at a later date, the Step inputs will be set to the default value - any custom configuration will be gone. + +:::tip[Disabling a Step] + +If you don't want a Step to run but want to keep the Step configuration intact, you can disable the Step: [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Click the Step you want to remove. +1. Click the trash bin icon on the right. +1. Click **Save**. diff --git a/src/partials/removing-an-outgoing-webhook-from-a-release.mdx b/src/partials/removing-an-outgoing-webhook-from-a-release.mdx new file mode 100644 index 0000000..973e669 --- /dev/null +++ b/src/partials/removing-an-outgoing-webhook-from-a-release.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Removing an outgoing webhook from a release + +You can remove an outgoing webhook from an individual release or from a release preset template. + + + + +1. Open Release Management. +1. Select your app. +1. Select a release that hasn't finished. + + ![2025-10-29-releases.png](/img/_paligo/uuid-77ae83b9-c3d4-60a7-9997-ad0a27832d58.png) +1. Go to **Configuration**. +1. Find the **Outgoing webhooks** card and click **Show details**. +1. Click the remove configuration icon. + + ![2025-10-29-remove-webhooks-rm.png](/img/_paligo/uuid-32cdcf4a-27ea-2a5c-a439-3828a31fec7c.png) + + + + +1. Open Release Management. +1. Select your app. +1. Select **Release presets** on the left. + + ![2025-10-29-release-presets.png](/img/_paligo/uuid-05179598-b31c-84ba-3b1d-03720f842acc.png) +1. Find the release preset template you need and click ![3_dots.png](/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png) then select **Change**. +1. Find the **Outgoing webhooks** card and click **Show details**. +1. Click the remove configuration icon. + + + diff --git a/src/partials/removing-other-users-from-workspaces.mdx b/src/partials/removing-other-users-from-workspaces.mdx new file mode 100644 index 0000000..0cc608a --- /dev/null +++ b/src/partials/removing-other-users-from-workspaces.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Removing members from Workspaces + +:::important[Owners and managers only] + +Only Workspace owners and Workspace managers can remove users from a Workspace. + +::: + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Collaboration**. +1. Select the **Members** tab. +1. Search for the user you would like to remove, and click "![remove_png.png](/img/_paligo/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png)". +1. Click **Remove** to remove the selected user from your Workspace. + + ![remove_member_confirm.png](/img/_paligo/uuid-ecd84027-5433-4ce8-cfbe-bbd61a77c095.png) diff --git a/src/partials/removing-the-oauth-connection-api.mdx b/src/partials/removing-the-oauth-connection-api.mdx new file mode 100644 index 0000000..e5a3c74 --- /dev/null +++ b/src/partials/removing-the-oauth-connection-api.mdx @@ -0,0 +1,30 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Removing the OAuth connection + +If your GitHub app connection works, you can remove the components of the OAuth connection. This includes: + +- Removing the [service credential user](/en/bitrise-platform/integrations/the-service-credential-user.html). +- Removing either the SSH key or the HTTP token. + +### Removing the service credential user + +To remove the service credential user: + +```bash +curl -X 'DELETE' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/service-credential-user' \ + -H 'Authorization: ACCESS-TOKEN' +``` + +### Removing SSH or HTTP authorization + +To remove previous authorization methods: + +```bash +curl -X 'DELETE' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/repository-authorization ' \ + -H 'Authorization: ACCESS-TOKEN' +``` diff --git a/src/partials/replacing-caching-steps.mdx b/src/partials/replacing-caching-steps.mdx new file mode 100644 index 0000000..f3cfd67 --- /dev/null +++ b/src/partials/replacing-caching-steps.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Replacing branch-based caching Steps + +There are two ways to use key-based caching: either via the generic **Restore Cache** and **Save Cache** Steps or via the dedicated caching Steps for specific dependency managers. We strongly recommend using the dedicated Steps, unless your dependency manager is not supported or you need some special configuration. + +### Using the dedicated caching Steps + +Dedicated caching Steps cache dependencies for a specific dependency manager. + +For example, if you run Gradle in your build, you can cache Gradle dependencies with the dedicated Steps. The dedicated Steps usually don't need any further configuration: you just add them to your Workflow: + +:::tip[Full list of dedicated Steps] + +The procedure below is only an example for using dedicated key-based caching Steps. The example uses Gradle but we have several dedicated Steps. For the detailed list of Steps, see: [Dedicated caching Steps for dependency managers](/en/bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers). + +::: + +1. Replace the **Cache:Pull** Step with the **Restore Gradle Cache** Step in your Workflow. This Step will download your Gradle cache. +1. Replace the **Cache:Push** Step with the **Save Gradle Cache** Step. This Step updates the Gradle cache. + +All key-based caching Steps follow a similar naming convention: the Restore Steps download the cache while the Save Steps update it. After you ran at least two builds with a key-based setup, you can find and download the cache archive from the **Project settings** page: [Accessing key-based cache archives](/en/bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives). + +### Using the generic key-based caching Steps + +If the dedicated caching Steps don't produce the desired results, consider using the generic **Restore Cache** and **Save Cache** Steps. You can configure these Steps to perfectly fit your needs. You can: + +- [Use key-based caching templates and functions](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/key-based-caching-templates-and-functions). +- [Define multiple keys to match your cache archives](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/key-matching-for-cache-archives). +- [Use conditional caching with dynamic keys](/en/bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching/conditional-caching). + +:::tip[Cache recipes with the generic Steps] + +Check out our key-based cache recipes utilising the generic Steps: [Advanced key-based cache recipes](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/key-cache-advanced.md). + +::: diff --git a/src/partials/replacing-variables-in-inputs.mdx b/src/partials/replacing-variables-in-inputs.mdx new file mode 100644 index 0000000..c0731f5 --- /dev/null +++ b/src/partials/replacing-variables-in-inputs.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Replacing variables in inputs + +Replacing variables in inputs ensures that the value of the Env Var will be passed to the build instead of the key. For details, check [Replacing variables in inputs](/en/bitrise-ci/configure-builds/environment-variables/replacing-variables-in-inputs). + +Toggling on this option ensures that instead of the key of the Env Var, the value of the Env Var will be passed to the build. Normally, this is not necessary. + +Please note that if you add a new Environment Variable directly in the `bitrise.yml` file and do NOT set the `is_expand` property, the default value will be `true`. We recommend explicitly setting `is_expand` in this case: + +``` +envs: + - opts: + is_expand: false + KEY: VALUE +``` diff --git a/src/partials/reporting-step-issues.mdx b/src/partials/reporting-step-issues.mdx new file mode 100644 index 0000000..8f8be93 --- /dev/null +++ b/src/partials/reporting-step-issues.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Reporting Step issues + +If you’re a user of a Step which has critical (security or functionality) issues, please create a ticket in the Step’s Issue Tracker. Every Step declares the preferred way of reporting issues with the `support_url` attribute. + +If you don’t get a response from the Step’s maintainer for an extended period (for more than a couple of weeks) please create a GitHub issue in this repository: [https://github.com/bitrise-io/bitrise-steplib](https://github.com/bitrise-io/bitrise-steplib) and we’ll try to resolve the issue, following the Abandoned Step policy. Please be patient and keep in mind that everyone who contributes to this collection does so to help you by providing a Step for you to use! diff --git a/src/partials/requesting-an-email-report-of-third-party-steps.mdx b/src/partials/requesting-an-email-report-of-third-party-steps.mdx new file mode 100644 index 0000000..96977ea --- /dev/null +++ b/src/partials/requesting-an-email-report-of-third-party-steps.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Requesting an email report of third-party Steps + +You can request a usage report of third-party Steps: it contains all occurrences of third-party Steps in all Workflows, Step bundles, and Pipelines in a CSV file, sent via email. + +To request a usage report: + +1. Open the **Workspace settings** page. +1. Select **Security**. +1. Select the **Build restrictions** tab. +1. Request a report of Workflows using third-party Steps by clicking **Request report**. diff --git a/src/partials/rerunning-failed-tests-not-available-in-xcode-13.mdx b/src/partials/rerunning-failed-tests-not-available-in-xcode-13.mdx new file mode 100644 index 0000000..33ea42c --- /dev/null +++ b/src/partials/rerunning-failed-tests-not-available-in-xcode-13.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Rerunning failed tests (Not available in Xcode 13) + +The **Should retry test on failure? (Not available in Xcode 13+)** input in the **Test repetition** section of the **Xcode Test for iOS** Step allows you to automatically rerun ALL your tests, not just the failed ones. If you set this input to `yes`, the Step will run `xcodebuild` one more time in the case of test failure. + +From Xcode 13 and above, the feature is not available anymore. Use the **Test Repetitions Mode (Available in Xcode 13+)** input with the `retry_on_failure` option selected. This allows you to rerun only the failed test/s instead of running all your tests. You can find this test repetition feature with our **Xcode Test for iOS** Step from version 3.0.0 and above. diff --git a/src/partials/restoring-the-current-bitriseyml-to-the-builds-bitriseyml.mdx b/src/partials/restoring-the-current-bitriseyml-to-the-builds-bitriseyml.mdx new file mode 100644 index 0000000..47a9c3e --- /dev/null +++ b/src/partials/restoring-the-current-bitriseyml-to-the-builds-bitriseyml.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Restoring the configuration YAML + +You can always change the current configuration YAML to the configuration of one of your app's previous builds. This overrides the current configuration. To do so: + +1. Open Bitrise CI, select a project and then select one of the builds of the project. +1. Select **Configuration YAML** on the top right. +1. In the dropdown menu, select **Show configuration YAML**. +1. In the dialog, click the **Restore build's configuration YAML**. +1. Click **OK** in the dialog. diff --git a/src/partials/retrieving-a-specific-build-artifacts-data.mdx b/src/partials/retrieving-a-specific-build-artifacts-data.mdx new file mode 100644 index 0000000..a5ece4b --- /dev/null +++ b/src/partials/retrieving-a-specific-build-artifacts-data.mdx @@ -0,0 +1,47 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Retrieving a specific build artifact's data + +:::note[Required role] + +You must have a tester/QA, developer, admin, or owner role on the app's team to retrive a specific build's artifact data using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +You can retrieve detailed data of a specific build's artifacts with the artifacts endpoint. The response shows the filename, the artifact type, the download URL, and the file size. + +The required parameters are: + +- app slug +- build slug +- artifact slug + +**Retrieving the data of a specific artifact** + +Request: + +``` +curl -X GET "https://api.bitrise.io/v0.1/apps/87a5991e180d91a9/builds/b234f959745082e0/artifacts/92e0b6ecae87b832" -H "accept: application/json" -H "Authorization: THE-ACCESS-TOKEN" +``` + +Response: + +``` +{ + "data": { + "title": "another_app-debug.apk", + "artifact_type": "android-apk", + "expiring_download_url": "https://bitrise-prod-build-storage.s3.amazonaws.com/builds/b234f959745082e0/artifacts/7626902/another_app-debug.apk?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAIV2YZWMVCNWNR2HA%2F20190426%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190426T131627Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=9f1af26787f34b5cf0cbc18b2372313607b1e3c0203a9ce7e42da884a6ddf70f", + "is_public_page_enabled": true, + "slug": "92e0b6ecae87b832", + "public_install_page_url": "https://www.bitrise.io/artifact/7626902/p/8e5b2c62abe28fecef09b271de767920", + "file_size_bytes": 1574799 + } +} +``` + +By default, the value of the `is_public_page_enabled` input is set to `true`. This way the `public_install_page_url` becomes available and you can view some basic information about the artifact via this URL. You can also download the artifact using the download URL from the response output. diff --git a/src/partials/retrieving-a-specific-files-data.mdx b/src/partials/retrieving-a-specific-files-data.mdx new file mode 100644 index 0000000..b65392e --- /dev/null +++ b/src/partials/retrieving-a-specific-files-data.mdx @@ -0,0 +1,52 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Retrieving a specific file's data + +:::note[Required role] + +You must have an admin or owner role role on the app's team to manage files in the Generic File Storage using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +Retrieve a specific file’s data from the Generic File Storage with the GET method of the `generic-project-files` endpoint. The returned data includes, among other things, the file's name, size, and download URL, as well as its current status. + +The required parameters are: + +- App slug +- Generic project file slug + +**Retrieving a file** + +Request: + +``` +curl -X GET -H 'Authorization: ' 'https://api.bitrise.io/v0.1/apps//generic-project-files/' +``` + +Response: + +``` +{ + "data": { + "upload_file_name": "Test_File.md", + "upload_file_size": 4865, + "slug": "01D7F228E7N8Q8WQJKJM8FV3XM", + "processed": true, + "is_expose": true, + "is_protected": false, + "download_url": "https://concrete-userfiles-production.s3.us-west-2.amazonaws.com/project_file_storage_documents/uploads/24043/original/Test-File?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAIV2YZWMVCNWNR2HA%2F20190402%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20190402T132712Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=241be52184b63867262360743931c546c166a99719787ce417e3be11bc12bbed", + "user_env_key": "Test_File", + "exposed_meta_datastore": null + } +} +``` + +:::note[Availability of the `download_url`] + +Note that the `download_url` is generated only when the file’s `is_protected` attribute is false. + +::: diff --git a/src/partials/retrieving-saml-sso-information-from-auth0.mdx b/src/partials/retrieving-saml-sso-information-from-auth0.mdx new file mode 100644 index 0000000..1b2dad3 --- /dev/null +++ b/src/partials/retrieving-saml-sso-information-from-auth0.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Retrieving SAML SSO information from Auth0 + +Once you have enabled Bitrise as a web application on Auth0, it’s time to grab the certificate and the Identity provider’s unique login URL to finish up the SAML configuration on Bitrise. + +1. On Auth0, go to **Application**, then select the **Addons** tab to find your enabled Bitrise app. +1. Click the **SAML2 WEB APP** web app and select the **Usage** tab. Click on the **Download Auth0 certificate** link next to the **Identity Provider Certificate** label. Open the downloaded certificate file and copy its content into the **SAML SSO provider certificate** field of Bitrise or upload the file itself from your local computer. Go back to Auth0 and copy paste the **Identity Provider Login URL** into Bitrise’s **SAML SSO provider Single Sign-On URL (SSO URL)**. + + ![saml_sso_setup.png](/img/_paligo/uuid-26ad84be-65c7-1916-f079-6b553b4c436d.png) + + ![authzero_downloadcertificateusage9.png](/img/_paligo/uuid-e6cb3a32-c73c-f0cb-e7fe-9eab8e908679.png) +1. Click **Configure SSO** button on Bitrise. +1. Now you can close the dialog on Auth0. diff --git a/src/partials/reverting-to-an-oauth-connection.mdx b/src/partials/reverting-to-an-oauth-connection.mdx new file mode 100644 index 0000000..aed0170 --- /dev/null +++ b/src/partials/reverting-to-an-oauth-connection.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Reverting back to OAuth connection + +If you used an OAuth connection for repository access before switching to the GitHub app, you can revert back to it at any time. + +:::note + +The OAuth connection requires an SSH key or a personal access token at the Git provider, depending on the authorization method. When switching to the GitHub app, you don't have to remove these: if you didn't, you can use them when reverting to the OAuth connection. + +::: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. Under **Bitrise CI**, select **Integrations** and then the **Git provider** tab. +1. Find the **Connection type** card and click **Change**. +1. In the dialog, select **OAuth** and click **Change**. diff --git a/src/partials/revoking-access-to-an-app-from-a-group.mdx b/src/partials/revoking-access-to-an-app-from-a-group.mdx new file mode 100644 index 0000000..4cd0df3 --- /dev/null +++ b/src/partials/revoking-access-to-an-app-from-a-group.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Revoking access to a project from a group + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. From the menu on the left, select **Collaboration**. +1. Go to the **Group** tab. +1. Search for the group you would like to remove and click "![remove_png.png](/img/_paligo/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png)". + + ![remove-group.png](/img/_paligo/uuid-464e4d9f-1911-a722-1008-2b9f67b6bc5c.png) +1. Click **Remove** in the dialog to revoke the group's access from the project. diff --git a/src/partials/revoking-access-to-an-app-from-a-single-user.mdx b/src/partials/revoking-access-to-an-app-from-a-single-user.mdx new file mode 100644 index 0000000..87d52a9 --- /dev/null +++ b/src/partials/revoking-access-to-an-app-from-a-single-user.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Revoking access to a project from a single user + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. From the menu on the left, select **Collaboration**. +1. Go to the **Contributors** tab. +1. Find the user you would like to remove and click "![remove_png.png](/img/_paligo/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png)". + + ![remove-people.png](/img/_paligo/uuid-84805be3-7557-14df-e78e-44edaea87777.png) +1. Click **Remove** in the dialog. diff --git a/src/partials/rolling-update-percentage.mdx b/src/partials/rolling-update-percentage.mdx new file mode 100644 index 0000000..ba795b4 --- /dev/null +++ b/src/partials/rolling-update-percentage.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Rolling update percentage + +When creating a machine pool for Build Hub, you can set a rolling update percentage. This is the ratio of machines that are immediately and simultaneously rebooted after you reconfigure an existing machine pool. + +This allows users to update the runner configuration without losing ongoing builds. If you set the value to 100, all machines are rebooted immediately and ongoing builds are aborted. diff --git a/src/partials/run-ios-test-groups-in-parallel.mdx b/src/partials/run-ios-test-groups-in-parallel.mdx new file mode 100644 index 0000000..987d84e --- /dev/null +++ b/src/partials/run-ios-test-groups-in-parallel.mdx @@ -0,0 +1,41 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## (iOS) Run test groups in parallel + +### Description + +This example uses the [sample-swift-project-with-parallel-ui-test](https://github.com/bitrise-io/sample-swift-project-with-parallel-ui-test) iOS Open Source sample app, which has some example Unit and UI tests and uses Test Plans to group the tests. + +:::tip[XCode test plans] + +Xcode Test Plans provide a way to run a collection of tests with different test configurations. raywenderlich.com has a great [tutorial on how to get started with Xcode Test Plans](https://www.raywenderlich.com/10212963-xcode-test-plans-for-ios-getting-started). + +::: + +The example Pipeline config showcases how to run different test groups in parallel. + +`run_tests_groups` Pipeline runs two Stages sequentially: + +1. `build_tests` Stage that runs the `build_tests` Workflow. This Workflow git clones the sample project and runs the `xcode-build-for-test` Step to build the target and associated tests. The built test bundle is transferred to the next Stage (`run_tests_groups`) via the `deploy-to-bitrise-io` Step. +1. `run_tests_groups` Stage runs two Workflows in parallel: `run_ui_tests` and `run_unit_tests`. Both of these Workflows use the new x`code-test-without-building` Step, which executes the tests based on the previous Stage built test bundle. The pre-built test bundle is pulled by the `_pull_test_bundle` utility Workflow. + + ![iOS_example_2.png](/img/_paligo/uuid-789ed335-aeab-b87c-6045-270c5e87a641.png) + +### Instructions + +1. Visit the [Create New App page](https://app.bitrise.io/apps/add) to create a new App. +1. When prompted to select a git repository, choose **Other/Manual** and paste the sample project repository URL (`https://github.com/bitrise-io/sample-swift-project-with-parallel-ui-test`) in the **Git repository (clone) URL** field. +1. Confirm that this is a public repository in the resulting pop-up. +1. Select the `master` branch to scan. +1. Wait for the project scanner to complete. +1. Select any of the offered Distribution methods (for example **development**, it does not really matter as now we are focusing on testing). +1. Confirm the offered stack, skip choosing the app icon and the webhook registration and kick off the first build. +1. Open the new Bitrise project’s Workflow Editor. +1. Go to the **bitrise.yml** tab and replace the existing `bitrise.yml` with the contents of the example `[bitrise.yml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/ios-run-test-groups-in-parallel.md#bitriseyml)` file. +1. Click the **Start/Schedule a Build** button, and select the `run_tests_groups` option in the “**Workflow, Pipeline**” dropdown menu at the bottom of the popup. + +### bitrise.yml + +GitHub link: [https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/ios-run-test-groups-in-parallel.md#bitriseyml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/ios-run-test-groups-in-parallel.md#bitriseyml) diff --git a/src/partials/run-ios-tests-in-parallel-on-multiple-simulators.mdx b/src/partials/run-ios-tests-in-parallel-on-multiple-simulators.mdx new file mode 100644 index 0000000..08c8225 --- /dev/null +++ b/src/partials/run-ios-tests-in-parallel-on-multiple-simulators.mdx @@ -0,0 +1,49 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## (iOS) Run tests in parallel on multiple simulators + +### Description + +This example uses the [sample-swift-project-with-parallel-ui-test](https://github.com/bitrise-io/sample-swift-project-with-parallel-ui-test) iOS Open Source sample app, which has some example Unit and UI tests and uses Test Plans to group the tests. + +The example Pipeline config showcases how to run all the test cases of the project on different iOS simulators. + +`run_tests_on_simulators` Pipeline runs two Stages sequentially: + +1. `build_tests stage` that runs the `build_tests` Workflow. This Workflow git clones the sample project and runs the `xcode-build-for-test` Step to build the target and associated tests. The built test bundle is transferred to the next Stage (`run_tests_on_simulators`) via the `deploy-to-bitrise-io` Step. + + :::note[The build test bundle is compressed] + + `xcode-build-for-test` Step compresses the built test bundle and moves the generated zip to the $BITRISE_DEPLOY_DIR. That directory’s content is deployed to the Workflow artifacts by default via the `deploy-to-bitrise-io` Step. + + ::: + + :::important[Artifact file size limitation] + + There is no limitation on the number of files deployed to **Artifacts** per build. There is a limitation, however, on the file size which is 2GB per file. + + ::: +1. `run_tests_on_simulators` Stage runs three Workflows in parallel: `run_tests_iPad`, `run_tests_iPhone`, and `run_tests_iPod`. Both of these Workflows use the new `xcode-test-without-building` Step, which executes the tests based on the previous stage built test bundle. The pre-built test bundle is pulled by the `_pull_test_bundle`utility Workflow. + + ![iOS_example_modified.png](/img/_paligo/uuid-5b325bb0-a98a-bd3d-943f-c7d26897e362.png) + +### Instructions + +To test the configuration in a new Bitrise example project, do the following: + +1. Visit the [Create New App page](https://app.bitrise.io/apps/add) to create a new App. +1. When prompted to select a git repository, choose **Other/Manual** and paste the sample project repository URL (`https://github.com/bitrise-io/sample-swift-project-with-parallel-ui-test`) in the **Git repository (clone) URL** field. +1. Confirm that this is a public repository in the resulting pop-up. +1. Select the `master` branch to scan. +1. Wait for the project scanner to complete. +1. Select any of the offered Distribution methods (for example **development**, it does not really matter as now we are focusing on testing). +1. Confirm the offered stack, skip choosing the app icon and the webhook registration and kick off the first build. +1. Open the new Bitrise project’s Workflow Editor. +1. Go to the **bitrise.yml** tab and replace the existing `bitrise.yml` with the contents of the example `[bitrise.yml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/ios-run-tests-in-parallel-on-multiple-simulators.md#bitriseyml)` file. +1. Click the **Start/Schedule a Build** button, and select the **run_tests_on_simulators** option in the “**Workflow, Pipeline**” dropdown menu at the bottom of the popup. + +### bitrise.yml + +GitHub link: [https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/ios-run-tests-in-parallel-on-multiple-simulators.md#bitriseyml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/ios-run-tests-in-parallel-on-multiple-simulators.md#bitriseyml) diff --git a/src/partials/run-ui-tests-in-parallel-on-multiple-devices-or-shards.mdx b/src/partials/run-ui-tests-in-parallel-on-multiple-devices-or-shards.mdx new file mode 100644 index 0000000..4bae723 --- /dev/null +++ b/src/partials/run-ui-tests-in-parallel-on-multiple-devices-or-shards.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## (Android) Run UI tests in parallel on multiple devices or shards + +### Description + +Running the UI (instrumentation) tests of a single module in parallel Workflows utilizing pipelines. You can run the tests in parallel by shards or by devices. + +The Pipeline contains two Stages that are run serially: + +1. `build_for_ui_testing`: This Stage executes a Workflow — also named `build_for_ui_testing` — that runs the `android-build-for-ui-testing` Step to build APKs for use in testing, and runs the `deploy-to-bitrise-io` Step to save those APKs for use in the later Stages. Performing this Stage separately from the actual testing allows for each test Stage to use these pre-built APKs rather than having to rebuild them for each test Stage. +1. `run_ui_tests_on_devices`: This Stage executes three UI test Workflows in parallel — `ui_test_on_phone`, `ui_test_on_tablet`, `ui_test_on_foldable` — which use the `android-instrumented-test` Step to run the UI tests on the APKs built in the previous Workflow on each specific device type. + + ![android_example.png](/img/_paligo/uuid-f545c6a6-701f-485f-c852-70ed2222392a.png) + +### Instructions + +To test this configuration in a new Bitrise example project, do the following: + +1. Visit the [Create New App page](https://app.bitrise.io/apps/add) to create a new App. +1. When prompted to select a git repository, choose **Other/Manual** and paste the sample project repository URL (`https://github.com/bitrise-io/Bitrise-Android-Modules-Sample.git`) in the **Git repository (clone) URL** field. +1. Confirm that this is a public repository in the resulting pop-up. +1. Select the `main` branch to scan. +1. Wait for the project scanner to complete. +1. Enter `app` as the specified module. +1. Enter `debug` as the specified variant. +1. Continue through the prompts as normal — no changes are needed. +1. Open the new Bitrise project’s Workflow Editor. +1. Go to the **bitrise.yml** tab, and replace the existing yaml contents with the contents of the example `[bitrise.yml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-ui-tests-on-multiple-devices.md#bitriseyml)`. +1. Click the **Start/Schedule a Build** button, and select the `ui_test_on_multiple_devices` option in the **Workflow, Pipeline** dropdown menu at the bottom of the popup. + +### bitrise.yml + +GitHub link: [https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-ui-tests-on-multiple-devices.md#bitriseyml](https://github.com/bitrise-io/workflow-recipes/blob/main/recipes/android-parallel-ui-tests-on-multiple-devices.md#bitriseyml) diff --git a/src/partials/running-a-build.mdx b/src/partials/running-a-build.mdx new file mode 100644 index 0000000..703bbfd --- /dev/null +++ b/src/partials/running-a-build.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running a build + +After successfully adding a project, your first build starts automatically. You are automatically taken to the **Builds** page of your project where you can see the build in progress. Click on the build to see its [details](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details.html) and current progress. + +To start a CI build manually, click **Start build**. + +![start-build.png](/img/_paligo/uuid-111feaf8-6180-9531-fae4-51424aeb75dc.png) + +This opens up the dialog for [manually starting a build](/en/bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually.html). + +![start-build-basic.png](/img/_paligo/uuid-2fe105a3-6faa-4394-35fd-41fd3ed5cc42.png) + +A build is a series of jobs, defined in the project's [Workflows](/en/bitrise-ci/workflows-and-pipelines/workflows/workflows-overview.html) and [Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines.html). The jobs are called [Steps](/en/bitrise-ci/workflows-and-pipelines/steps/steps-overview.html) which represent blocks of script executions. + +You only need to specify a branch and a Workflow or Pipeline to run a build with the **Basic** options. When adding a new project, Bitrise automatically generates at least one [default Workflow](/en/bitrise-ci/workflows-and-pipelines/workflows/default-workflows.html) for you so you can immediately run your first build. + +When ready, click **Start build**. It takes you to the build page where you can track the progress of the build, view the [build logs](/en/bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs.html), and check the [generated build artifacts](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html). + +:::note[Triggering builds] + +You can also trigger builds automatically. Whenever a specified code event happens, Bitrise automatically starts a build: [Configuring build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers). + +::: diff --git a/src/partials/running-a-detox-test.mdx b/src/partials/running-a-detox-test.mdx new file mode 100644 index 0000000..2502427 --- /dev/null +++ b/src/partials/running-a-detox-test.mdx @@ -0,0 +1,88 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running a Detox test + +1. Create a release device configuration either in the `package.json` file under the `detox` section, or in a separate Detox configuration file. For more information on setting up a Detox configuration, check out the documentation: [Project setup](https://wix.github.io/Detox/docs/introduction/project-setup/). + + Example: + + ``` + "detox": { + "configurations": { + "ios.sim.debug": { + "binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/SampleProjectReactNative.app", + "build": "xcodebuild -project ios/SampleProjectReactNative.xcodeproj -scheme SampleProjectReactNative -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build -UseNewBuildSystem=NO", + "type": "ios.simulator", + "name": "iPhone 8" + }, + "ios.sim.release": { + "binaryPath": "ios/build/Build/Products/Release-iphonesimulator/SampleProjectReactNative.app", + "build": "xcodebuild -project ios/SampleProjectReactNative.xcodeproj -scheme SampleProjectReactNative -configuration Release -sdk iphonesimulator -derivedDataPath ios/build -UseNewBuildSystem=NO", + "type": "ios.simulator", + "name": "iPhone 8" + } + }, + ``` +1. On [bitrise.io](https://www.bitrise.io/), go to your project and open the **Workflow Editor.** +1. Switch to the Workflow you want to use. +1. Add a **Run npm command** Step to your Workflow. +1. Install the Detox CLI and the React Native CLI using the **npm command with arguments to run** input: + + ``` + install -g detox-cli + install -g react-native-cli + ``` +1. Install a test runner. + + For example, [our sample app](https://github.com/bitrise-samples/sample-project-react-native) uses `mocha`, installed with the `yarn` Step. To install yarn dependencies, just set the **The yarn command to run** input’s value to `install`. +1. Add a **Script** Step to install the necessary utilities and then run Detox. + + ``` + #!/bin/bash + + # applesimutils is a collection of utils for Apple simulators + brew tap wix/brew + brew install applesimutils + + # we are building and testing a release device configuration + detox build --configuration ios.sim.release + detox test --configuration ios.sim.release --cleanup + ``` + + You can, of course, put each of these commands in separate Script Steps, for the sake of modularity. +1. Run a build. + +If the build fails, check out our example `bitrise.yml` file: + +``` +--- +workflows: + primary: + steps: + - activate-ssh-key: {} + - git-clone: + inputs: + - clone_depth: '' + title: Git Clone Repo + - yarn@0.0.8: + inputs: + - command: install + - npm@1.0.1: + inputs: + - command: install -g detox-cli + title: Install Detox CLI + - script@1.1.5: + inputs: + - content: |- + #!/bin/bash + brew tap wix/brew + brew install applesimutils + + detox build --configuration ios.sim.release + detox test --configuration ios.sim.release --cleanup + title: Detox - Build and Test Release App + - deploy-to-bitrise-io@1.3.18: {} +Troubleshootin +``` diff --git a/src/partials/running-a-service-container.mdx b/src/partials/running-a-service-container.mdx new file mode 100644 index 0000000..650448b --- /dev/null +++ b/src/partials/running-a-service-container.mdx @@ -0,0 +1,92 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running a service container + +You can run service containers during the execution of a Step or a Step bundle. Refer to the containers in the Step or Step bundle configuration to run the defined services in the background during Step execution. + +You can: + +- Refer to the containers in a Step or a Step bundle within a Workflow. When that Workflow runs, the referred container will run background services. +- Refer to the containers in the Step bundle definition. When that Step bundle is added to the Workflow, it will run those service containers. + +:::note[Container nesting] + +You can define containers on different levels: Steps and Step bundles both support their own container configuration. This creates a hierarchy between different levels. For the principles governing the hierarchy, see [Container nesting rules](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise/container-nesting-rules). + +::: + + + + +1. Open the Workflow Editor. +1. Select a Step or a Step bundle in a Workflow. + + Alternatively, you can select **Step Bundles** on the left navigation menu and set containers in the Step bundle definition. The subsequent Steps are the same. + + :::important[Bundle definition] + + By default, the Step bundle will run all service containers defined in the bundle definition. You can add additional service containers to the bundle in any Workflow. + + ::: +1. Select **Containers**. +1. Under **Service Container**, click **Add container** and select a container from the menu. + + You can add multiple containers. +1. If your service container is already running but you want to run the services in a clean instance of the container, check the **Recreate container** option. + + By default, the Step or Step bundle will use an already running container if there is one. + + + + +1. Add the `service_containers` property and the container name to the Step or Step bundle you need. You can add multiple service containers using YAML array syntax. + + Add service containers to a Step: + + ``` + workflows: + ci: + steps: + - git-clone: {} + - script: + service_containers: + - postgres + - redis + ``` + + Add service containers to a Step bundle: + + ``` + workflows: + ci: + steps: + - git-clone: {} + - script: {} + - bundle::test-bundle-id: + service_containers: + - postgres + - redis + ``` +1. If your service container is already running but you want to run the services in a clean instance of the container, set the `recreate` property to `true` . + + By default, the Step or Step bundle will use an already running container if there is one. Use the property to change the default behavior. + + ``` + workflows: + ci: + steps: + - git-clone: {} + - script: + service_containers: + - postgres + - bundle::test-bundle-id: + service_containers: + - postgres + recreate: true + - redis + ``` + + + diff --git a/src/partials/running-a-step-only-if-the-build-failed.mdx b/src/partials/running-a-step-only-if-the-build-failed.mdx new file mode 100644 index 0000000..b281f86 --- /dev/null +++ b/src/partials/running-a-step-only-if-the-build-failed.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running a Step only if the build failed + +It is possible to run a Step ONLY if the build failed before it got to that particular Step. In addition to `run_if`, you will need to use the `is_always_run` property as well. + + + + +1. Open the Workflow you need. +1. Find the Step that you want to disable. +1. In the **Additional run conditions** input, type `.IsBuildFailed`. +1. Make sure the **Run even if previous Step(s) failed** option is toggled on. + + + + +1. Open your app’s `bitrise.yml` file. +1. Find the Step that you want to disable. +1. Add `run_if: .IsBuildFailed` to it. +1. Add `is_always_run: true` to it. + + This enables the Step to run even if a previous Step failed. + + ``` + - script: + is_always_run: true + run_if: .IsBuildFailed + inputs: + - content: |- + #!/bin/bash + echo "Build Failed!" + ``` + + + diff --git a/src/partials/running-a-step-only-in-a-ci-environment.mdx b/src/partials/running-a-step-only-in-a-ci-environment.mdx new file mode 100644 index 0000000..ea3f817 --- /dev/null +++ b/src/partials/running-a-step-only-in-a-ci-environment.mdx @@ -0,0 +1,39 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running a Step only in a CI environment + +Running a Step only in a CI environment means your build will skip that particular Step for local builds. Like disabling Steps, you can do this with a `run_if` expression. Use this to debug builds locally. + +:::tip[Enabling CI mode locally] + +CI mode can be enabled on your own Mac/PC by setting the `CI` environment to `true` (for example, run `export CI=true` in your Bash Terminal), or by running `bitrise run` with the `--ci` flag: `bitrise --ci run ...`. + +::: + + + + +1. Open the Workflow you need. +1. Find the Step you need. +1. In the **Additional run conditions** input, type `.IsCI`. + + + + +1. Open your app’s `bitrise.yml` file. +1. Find the Step you need. +1. Add `run_if: .IsCI` to its properties: + + ``` + - script: + run_if: .IsCI + inputs: + - content: |- + #!/bin/bash + echo "This will only ever run in a CI environment because run_if: IsCI" + ``` + + + diff --git a/src/partials/running-a-unity-build.mdx b/src/partials/running-a-unity-build.mdx new file mode 100644 index 0000000..f9cb68c --- /dev/null +++ b/src/partials/running-a-unity-build.mdx @@ -0,0 +1,29 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running a build using Unity software + +Once everything is set up, you can run a build using Unity software on Bitrise. You can build both an Android and an iOS version of your app, even in the same Workflow. + +To run a build using Unity software on Bitrise: + +1. [Add Unity license pools to Bitrise](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/unity-on-bitrise/setting-up-unity-licenses-on-bitrise). +1. [Activate your Unity license in the build](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/unity-on-bitrise/setting-up-unity-licenses-on-bitrise). +1. [Download and install Unity on the virtual machine](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/unity-on-bitrise/downloading-and-installing-unity-on-bitrise). +1. To build the Android version of your app, add a **Script** Step and in the **Content** input, add the following: + + ``` + /Applications/Unity/Unity.app/Contents/MacOS/Unity -nographics -quit -batchmode -logFile -projectPath "$BITRISE_SOURCE_DIR" -executeMethod BitriseUnity.Build -androidSdkPath "$ANDROID_HOME" -buildOutput "$BITRISE_DEPLOY_DIR/mygame.apk" -buildPlatform android + ``` +1. To create an Xcode project for the iOS version of your app, add the following to the **Script** Step: + + ``` + /Applications/Unity/Unity.app/Contents/MacOS/Unity -nographics -quit -batchmode -logFile -projectPath "$BITRISE_SOURCE_DIR" -executeMethod BitriseUnity.Build -buildOutput "$BITRISE_SOURCE_DIR/xcodebuild" -buildPlatform ios + ``` +1. [Create and export an IPA from the Xcode project](/en/bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects.html). +1. When you are done, deactivate your license: + + ``` + /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -logFile -returnlicense + ``` diff --git a/src/partials/running-an-execution-container.mdx b/src/partials/running-an-execution-container.mdx new file mode 100644 index 0000000..5936558 --- /dev/null +++ b/src/partials/running-an-execution-container.mdx @@ -0,0 +1,107 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running an execution container + +You can run a Step or a Step bundle in an execution container. To do so, refer to [a defined container](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers/defining-an-execution-container) in the Step or Step bundle configuration. + +You can: + +- Refer to the container in a Step or a Step bundle within a Workflow. When that Workflow runs, the Step or the Step bundle will run within that container. +- [Refer to the container in the Step bundle definition](#N1773826090960). When that Step bundle is added to the Workflow, it will run within that container by default, unless you override it within the Workflow. + +This guide covers both options. + +:::note[Container nesting] + +You can define containers on different levels: Steps and Step bundles both support their own container configuration. This creates a hierarchy between different levels. For the principles governing the hierarchy, see [Container nesting rules](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise/container-nesting-rules). + +::: + + + + +1. Open the Workflow Editor. +1. Select a Step or a Step bundle in a Workflow. + + Alternatively, you can select **Step Bundles** on the left navigation menu and set a container in the Step bundle definition. The subsequent steps in the procedure are the same. + + :::important[Bundle definition override] + + By default, if you set a container in the Step bundle definition the Step bundle will run in the referred container in any Workflow you add it to. + + However, if you set a container in a Step bundle instance (the Step bundle within a Workflow), it overrides the container set in the Step bundle definition. + + ::: +1. Select **Containers**. +1. Under **Execution Container**, click **Add container** and select a container from the menu. +1. If your container is already running but you want to run a clean instance of the container, check the **Recreate container** option. + + By default, the Step or Step bundle will use an already running container if there is one. + + + + +1. Open your configuration YAML file and find your Workflow. +1. Add the `execution_container` property with a container name to the Step or Step bundle you need. You can only refer to a single execution container. + + Add an execution container to a Step within a Workflow format: + + ``` + workflows: + ci: + steps: + - git-clone: {} + - script: + execution_container: node-21 + ``` + + Add an execution container to a Step bundle within a Workflow: + + ``` + workflows: + ci: + steps: + - git-clone: {} + - script: {} + - bundle::test-bundle-id: + execution_container: node-21 + ``` + + Add the execution container to a Step bundle definition: + + ``` + step_bundles: + test-bundle-id: + steps: + - git-clone@8: {} + - restore-cache@2: {} + execution_container: test-container + ``` + + :::important[Bundle definition override] + + By default, the Step bundle will run in the referred container in any Workflow you add it to. However, if you set a container for the Step bundle within a Workflow, it overrides the container set in the Step bundle definition. + + ::: +1. If your container is already running but you want to run a clean instance of the container, set the `recreate` property to `true` . + + By default, the Step or Step bundle will use an already running container if there is one. Use the property to change the default behavior. + + ``` + workflows: + ci: + steps: + - git-clone: {} + - script: + execution_container: + node:21 + - bundle::test-bundle-id: + execution_container: + node-21: + recreate: true + ``` + + + diff --git a/src/partials/running-device-tests-for-ios-apps.mdx b/src/partials/running-device-tests-for-ios-apps.mdx new file mode 100644 index 0000000..7cff4ed --- /dev/null +++ b/src/partials/running-device-tests-for-ios-apps.mdx @@ -0,0 +1,198 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running device tests with Firebase for iOS apps + +To run device tests for iOS apps with the Firebase Test Lab solution, you will need to add two Steps to your Workflow: + +- **Xcode Build for testing for iOS**. +- **iOS Device Testing**. + +:::note[Multiplatform apps] + +The Step can run device tests for iOS apps built with other frameworks, such as Flutter or React Native. You just need to make sure the **Xcode Build for testing for iOS** Step can access your app's `.xcodeproj` or `.xcworkspace` file. + +::: + +The **[Xcode Build for testing for iOS](https://www.bitrise.io/integrations/steps/xcode-build-for-test)** Step performs the `xcodebuild` command’s `build-for-testing` action: it builds the tests defined in your iOS app’s [Xcode scheme](https://developer.apple.com/library/archive/featuredarticles/XcodeConcepts/Concept-Schemes.html). The Step exports a .zip file that contains your test directory (by default, it’s `Debug-iphoneos`) and the `xctestrun` file. + +To use this Step, you will need [code signing](/en/bitrise-ci/code-signing/ios-code-signing.html) files for the test app. You can choose between using automatic provisioning and manual provisioning. + +The **[iOS Device Testing](https://github.com/bitrise-steplib/steps-virtual-device-testing-for-ios)** Step takes the path to this .zip file - exported as an Environment Variable - as input to run your tests and export the test results to Bitrise. + +:::important[Automatic vs manual code signing asset management] + +The **Xcode Build for testing for iOS** Step can manage your code signing assets without you having to manually manage your provisioning profiles. This only requires you to select the relevant inputs in the Step (see below) and upload the right certificates to the **Code Signing** tab. This is the [automatic code signing asset management](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning) method. + +If you decide to choose the [manual code signing asset management](/en/bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning), then add the **Certificate and Profile Installer** Step before the **Xcode Build for testing for iOS** Step. The former will take care of the code signing asset management while the latter builds your project. Make sure the **Automatic code signing method** input of the **Xcode Build for testing for iOS** Step is set to `off`. + +The instructions below detail the steps of setting up automatic code signing asset management on Bitrise with the **Xcode Build for testing for iOS** Step. + +::: + + + + +1. Add the **Xcode Build for testing for iOS** Step to your Workflow. + + :::tip[Build for testing] + + This guide only mentions the most important inputs for setting up an app for device testing. For more information about the Step, see [Xcode Build for testing for iOS](https://bitrise.io/integrations/steps/xcode-build-for-test). + + ::: +1. In the **Scheme name** input, set the Xcode Scheme you want to use. By default, the value of the input is the `$BITRISE_SCHEME` [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) which is stored when your app is created. +1. In the **Build Configuration** input, add the name of the [Xcode build configuration](https://developer.apple.com/documentation/xcode/configuring-the-build-settings-of-a-target) you want to use. + + If no configuration is specified, the Xcode project's default build configuration will be used. +1. Set a destination option for `xcodebuild` in the **Device destination specifier** input of the Step. + + The default value is `generic/platform=ios`: this means the tests can be run on any iOS device. +1. Set the **Automatic code signing method**input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` if you use [API key authorization](/en/bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.html). + - `apple-id`if you use [Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.html). +1. Add the **iOS Device Testing** Step to the Workflow.The Step has to come after the **Xcode Build for testing for iOS** Step. + + :::important[API setting inputs] + + The inputs related to the Test API (**Test API's base URL** and **API token** cannot be changed on the graphical UI. You should not attempt to modify their values. + + ::: +1. In the **Test devices** input field, specify the devices on which you want to test the app. + + Find the list of the available devices [here](https://firebase.google.com/docs/test-lab/ios/available-testing-devices). You can add multiple devices to the input, in the following format: `deviceID,version,language,orientation` +1. Make sure you have the **Deploy to Bitrise.io** Step in your Workflow, with version 1.4.1 or newer. With the older versions of the Step, you won’t be able to check your results in the **Tests** tab! +1. [Start a build](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). + + + + +1. Add the `xcode-build-for-test` Step to your Workflow. + + :::tip[Build for testing] + + This guide only mentions the most important inputs for setting up an app for device testing. For more information about the Step, see [Xcode Build for testing for iOS](https://bitrise.io/integrations/steps/xcode-build-for-test). + + ::: + + ``` + my-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + ``` +1. In the `scheme` input, set the Xcode Scheme you want to use. By default, the value of the input is the `$BITRISE_SCHEME` Environment Variable which is stored when your app is created. + + ``` + my-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + ``` +1. In the `configuration` input, add the name of the [Xcode build configuration](https://developer.apple.com/documentation/xcode/configuring-the-build-settings-of-a-target) you want to use. + + If no configuration is specified, the Xcode project's default build configuration will be used. + + ``` + my-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + ``` +1. Set a destination option for `xcodebuild` in the `destination` input of the Step. + + The default value is `generic/platform=ios`: this means the tests can be run on any iOS device. + + ``` + my-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS + ``` +1. Set the `automatic_code_signing` input to the Apple service connection you want to use for code signing. The available options are: + + - `off` if you don’t do automatic code signing. + - `api-key` if you use [API key authorization](/en/bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services.html). + - `apple-id` if you use [Apple ID authorization](/en/bitrise-platform/integrations/apple-services-connection.html). + + ``` + my-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS + - automatic_code_signing: api-key + ``` +1. Add the `virtual-device-testing-for-ios` Step to the Workflow. The Step has to come after the `xcode-build-for-test` Step. + + ``` + my-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS + - automatic_code_signing: api-key + - virtual-device-testing-for-ios: + inputs: + ``` +1. In the `test_devices` input field, specify the devices on which you want to test the app. + + Find the list of the available devices [here](https://firebase.google.com/docs/test-lab/ios/available-testing-devices). You can add multiple devices to the input, in the following format: `deviceID,version,language,orientation` + + ``` + my-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS + - automatic_code_signing: api-key + - virtual-device-testing-for-ios: + inputs: + - test_devices: 'iphone8,14.7,en,portrait + ``` +1. Make sure you have the `deploy-to-bitrise-io` Step in your Workflow, with version 1.4.1 or newer. With the older versions of the Step, you won’t be able to check your results in the **Tests** tab! + + ``` + fmy-workflow: + steps: + - git-clone: {} + - xcode-build-for-test: + inputs: + - scheme: $BITRISE_SCHEME + - configuration: Debug + - destination: generic/platform=iOS + - test_plan: test + - automatic_code_signing: api-key + - project_path: $BITRISE_PROJECT_PATH + - virtual-device-testing-for-ios: + inputs: + - test_devices: 'iphone8,14.7,en,portrait' + - deploy-to-bitrise-io: {} + ``` +1. [Start a build](/en/bitrise-ci/run-and-analyze-builds/starting-builds.html). + + + + +If all goes well, you should be able to view your results among the [build artifacts](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online.html) or in the Tests tab. diff --git a/src/partials/running-git-clone-with-linked-repositories.mdx b/src/partials/running-git-clone-with-linked-repositories.mdx new file mode 100644 index 0000000..bf251b8 --- /dev/null +++ b/src/partials/running-git-clone-with-linked-repositories.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running git clone with linked repositories + +If you attempt to run `git clone` or other git commands for a [linked repository](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories), your build might fail with an authentication error. This is because the authentication credentials are stored in a local `netrc` file. This file is automatically generated by the official **Git Clone** Step. + +However, if you use your own script to perform `git clone`, or you use any other Git command requiring authentication before the **Git Clone** Step, you need to create the `netrc` file. You have two ways: + +- You can do it manually. +- You can use the **[Authenticate host with netrc](https://bitrise.io/integrations/steps/authenticate-host-with-netrc)** Step. It should be the first Step of your Workflow. + +:::important[HTTP URLs] + +Make sure you always use HTTP URLs when cloning private repository dependencies. + +::: + +Using the Step requires specifying three inputs: the host, the Git username, and the Git password. The Bitrise GitHub App integration uses token-based authentication: each build receives a one time token under the GIT_HTTP_PASSWORD Environment Variable. This Env Var can be used as the password. The username can't be empty because the Step will fail but it is not used so it doesn't matter what you put there. + +``` +workflows: + example: + steps: + - authenticate-host-with-netrc@0: + inputs: + - host: github.com + - username: "username" + - password: "$GIT_HTTP_PASSWORD" +``` diff --git a/src/partials/running-instrumentation-tests.mdx b/src/partials/running-instrumentation-tests.mdx new file mode 100644 index 0000000..e26b37a --- /dev/null +++ b/src/partials/running-instrumentation-tests.mdx @@ -0,0 +1,123 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running instrumentation tests + + + + +1. Open the Workflow you want to use in the Workflow Editor. +1. Add the **Android Build for UI testing** Step to your Workflow. +1. To export an APK and a Test APK, you have to set the following input fields in the **Android Build for UI testing** Step. + + - **Project Location**: the root directory of your Android project. + - **Module**: set the module you wish to build. + - **Variant**: set the variant you wish to build (usually `Debug`). + + ![Device_testing_for_Android.png](/img/_paligo/uuid-7b6b432c-fb4f-61cd-a7cf-db6fd7cbe746.png) + + The Step outputs will be `BITRISE_APK_PATH` (which is the path of the generated APK after filtering) and `BITRISE_TEST_APK_PATH` (which is the path of the generated test APK after filtering). +1. Add the **Virtual Device Testing for Android** Step right after the **Android Build for UI testing** Step. +1. Set the **Test type** input to `instrumentation`. + + Our **Android Build for UI Testing** Step exports an APK and a Test APK and their paths get automatically set in the **APK path** and the **Test APK path** input fields of the **Virtual Device Testing for Android** Step. +1. Add the type of test device in the **Test devices** input field. + + If choosing a different device than the default, your input should have the format of `device ID`,`version`,`language`,`orientation` separated with a  `,`. + + ![Device_testing_for_Android.png](/img/_paligo/uuid-d39167fc-7bd0-258f-a6c6-01eb7ca58268.png) +1. Start a build and check your test results. + + + + +1. In the Configuration YAML file, find the Workflow you want to use or create a new one. +1. Add the `android-build-for-ui-testing` Step to your Workflow. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + ``` +1. To export an APK and a Test APK, you have to set the following input fields in the **Android Build for UI testing** Step. + + - `project_location`: the root directory of your Android project. + - `module`: set the module you wish to build. + - `variant`: set the variant you wish to build (usually debug). + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - module: module + - variant: variant + - project_location: $BITRISE_SOURCE_DIR + ``` + + The Step outputs will be `BITRISE_APK_PATH` (which is the path of the generated APK after filtering) and `BITRISE_TEST_APK_PATH` (which is the path of the generated test APK after filtering). +1. Add the `virtual-device-testing-for-android` Step right after the **Android Build for UI testing** Step. + + ```yaml + my-workflow: + steps: + - git-clone@8: {} + - android-build-for-ui-testing: + inputs: + - module: module + - variant: variant + - project_location: $BITRISE_SOURCE_DIR + - virtual-device-testing-for-android: + inputs: + ``` +1. Set the `test_type` input to `instrumentation`. + + Our `android-build-for-ui-testing` Step exports an APK and a Test APK and their paths get automatically set in the `app_path` and the `test_apk_path` input fields of the `virtual-device-testing-for-android` Step. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - module: module + - variant: variant + - apk_path_pattern: '*/build/outputs/apk/*.apk' + - arguments: arg + - project_location: $BITRISE_SOURCE_DIR + - virtual-device-testing-for-android: + inputs: + - test_type: instrumentation + - app_path: $BITRISE_APK_PATH + - test_apk_path: $BITRISE_TEST_APK_PATH + ``` +1. Add the type of test device in the `test_devices` input field. + + Your input should have the format of `device ID`,`version`,`language`,`orientation` separated with a  `,`. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build-for-ui-testing: + inputs: + - module: module + - variant: variant + - apk_path_pattern: '*/build/outputs/apk/*.apk' + - arguments: arg + - project_location: $BITRISE_SOURCE_DIR + - virtual-device-testing-for-android: + inputs: + - test_devices: 'Nexus9,24,en,portrait' + - test_type: instrumentation + - test_apk_path: $BITRISE_TEST_APK_PATH + - app_path: $BITRISE_APK_PATH + ``` +1. Start a build and check your test results. + + + diff --git a/src/partials/running-tests-for-your-web-ci-project.mdx b/src/partials/running-tests-for-your-web-ci-project.mdx new file mode 100644 index 0000000..33912ff --- /dev/null +++ b/src/partials/running-tests-for-your-web-ci-project.mdx @@ -0,0 +1,59 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running tests + +All Bitrise projects have a default testing Workflow called `run_tests`. The contents of the Workflow depends on the exact project type. + +### Testing with Gradle for Java and Kotlin + +For Java and Kotlin projects built with Gradle, testing revolves around the `test` Gradle task. Bitrise has a dedicated Step for this: **Run Gradle Tests** which is part of the default Workflow. + +- The Step needs a [Gradle Wrapper](https://docs.gradle.org/current/userguide/gradle_wrapper.html) in your project. The wrapper must contain at least one correctly configured test task. +- Use **Test task** input to set the Gradle task you want to run. By default, the Step executes the `test` task but you can configure any Gradle task for it. +- Use the **Additional flags** input to further customize your gradlew command. For example, you can set a flag to run a specific test class. + +### Testing with Maven for Java + +For Java projects built with Maven, your tests are run using a Script Step which runs the [Maven Wrapper's](https://maven.apache.org/tools/wrapper/) test command: `./mvnw test`. + +Script Steps are fully customizable: you can create whatever Maven configuration you need. You can freely modify the default configuration at any time to suit your purposes. For more information about running tests with Maven, check out [Surefire](https://maven.apache.org/surefire/index.html). + +### Testing Node.js projects + +For Node.js projects, a Bitrise default Workflow does two things: + +- Installs Node.js via a **Script** Step: As it's a Script Step, you can fully modify and customize the configuration to suit your own needs. The default solution simply installs Node.js with `asdf`: + + :::tip + + Bitrise stacks come with [asdf](https://github.com/asdf-vm/asdf-nodejs) pre-installed to help auto-switch between various software versions `asdf` looks for the Node.js version in these files: `.tool-versions`, `.nvmrc`, `.node-version` so it should work out-of-the-box even if the project uses another Node.js manager. + + ::: + + ``` + set -euxo pipefail + + export ASDF_NODEJS_LEGACY_FILE_DYNAMIC_STRATEGY=latest_installed + envman add --key ASDF_NODEJS_LEGACY_FILE_DYNAMIC_STRATEGY --value latest_installed + + pushd "${NODEJS_PROJECT_DIR:-.}" > /dev/null + + asdf install nodejs + + popd > /dev/null + ``` +- Runs `npm run lint` with [the npm Step](https://bitrise.io/integrations/steps/npm): The lint command will analyze your code for potential errors. + +The **npm** Step allows you to run tests as well: you can run the `test` command to run the tests defined in the `package.json` file. + +### Testing Ruby projects + +For Ruby projects, we automatically generate a testing Workflow with the right testing command. When adding a Ruby project, the scanner looks for testing frameworks and picks the right testing command based on what it finds: + +- RSpec: `bundle exec rspec` (optional in each test command, used only if Bundler is detected.) +- Minitest in a Rails project: `bundle exec rails test` +- Minitest with a Rakefile (non-Rails): `bundle exec rake test` +- Minitest without Rails or Rakefile: `bundle exec ruby -Itest test/**/*_test.rb` +- No test framework but a Rakefile exists: `bundle exec rake test`. diff --git a/src/partials/running-tests.mdx b/src/partials/running-tests.mdx new file mode 100644 index 0000000..a7312a3 --- /dev/null +++ b/src/partials/running-tests.mdx @@ -0,0 +1,160 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running tests + +With Bitrise, you can choose from 3 different test types: + +- robo (default test type in Bitrise). +- instrumentation. +- gameloop. + +If you want to read up on the difference between these test types, take a look at [Firebase’s documentation.](https://firebase.google.com/docs/test-lab/android/get-started) + +There is a small difference between configuring your Workflow for robo and instrumentation tests, so let’s see them separately! + +### Running robo tests + + + + +1. Open the Workflow you want to use in the Workflow Editor. +1. Add the **Android Build** Step to your Workflow to export an APK. + + The Step stores the APK path in an [Env Var](/en/bitrise-ci/configure-builds/environment-variables.html). You will need this Env Var later. +1. Add the `Debug` task to the **Variant** Step input field. + + ![Device_testing_for_Android.png](/img/_paligo/uuid-fbaea845-8f7c-7470-248b-b10caf86a078.png) +1. Add **Virtual Device Testing for Android** Step after the **Android Build** Step. +1. Set the `APK path` input field. +1. Set the **Test type** input to **robo**. +1. Add the type of test device in the **Test devices** input field. + + If choosing a different device than the default, your input should have the format of `deviceID`, `version`, `language`, `orientation` separated with `,`. Find the list of the available devices [here](https://firebase.google.com/docs/test-lab/android/available-testing-devices). +1. Start a build and [check your test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). + + + + +1. In the Configuration YAML file, find the Workflow you want to use or create a new one. +1. Add the `android-build` Step to your Workflow. + + The Step stores the APK path in an [Env Var](/en/bitrise-ci/configure-builds/environment-variables.html). You will need this Env Var later. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build: + inputs: + ``` +1. Set the `variant` input to `Debug`. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build: + inputs: + - variant: Debug + ``` +1. Add the `virtual-device-testing-for-android` Step. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build: + inputs: + - variant: Debug + - virtual-device-testing-for-android: + inputs: + ``` +1. Set the `app_path` input field: by default, its value is the $BITRISE_APK_PATH Env Var. This Env Var is exported by the `android-build` Step. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build: + inputs: + - variant: Debug + - virtual-device-testing-for-android: + inputs: + - app_path: $BITRISE_APK_PATH + ``` +1. Set the `test_type` input to `robo`. + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build: + inputs: + - variant: Debug + - virtual-device-testing-for-android: + inputs: + - test_type: robo + - app_path: $BITRISE_APK_PATH + ``` +1. Add the type of test device in the `test_devices` input field. + + Your input should have the format of `device ID`,`version`,`language`,`orientation` separated with a  `,`. + + :::tip[Supported models] + + You can check the supported device models by running the `gcloud firebase test android models list --filter=virtualgcloud firebase test android models list --filter=virtual` command in the Google Cloud CLI. + + ::: + + ```yaml + my-workflow: + steps: + - git-clone: {} + - android-build: + inputs: + - variant: Debug + - virtual-device-testing-for-android: + inputs: + - test_type: robo + - app_path: $BITRISE_APK_PATH + - test_devices: 'Nexus9,24,en,portrait' + ``` +1. Start a build and check your test results. + + + + +#### Setting user input with Robo directives for successful robo tests + +If your app needs specific user interaction for a successful robo test, you can use the Robo Directives input field to set those necessary inputs. For example, certain UI elements of the app are only accessible for robo testing if the required user inputs (username and email address) are populated for log in. + +1. Click the Virtual Device Testing for Android Step in your workflow. +1. Click the Robo Test section. +1. Find the Robo directives input field and set your required user input directives. + + - provide a comma-separated list of key-value pairs, where the key is the Android resource name of the target UI element, and the value is the text string. EditText fields are supported but not text fields in WebView UI elements. For example, you could use the following parameter for custom login: + + ``` + username_resource,username,ENTER_TEXT + password_resource,password,ENTER_TEXT + loginbtn_resource,,SINGLE_CLICK + ``` + - One directive per line, the parameters are separated with , character. For example: ResourceName,InputText,ActionType. + + ![Device_testing_for_Android.png](/img/_paligo/uuid-c9f67a4a-32c5-6ea8-fd0a-e1da4dccebf2.png) + +Based on the input you provide, you can successfully run a robo test (even on pages that are only accessible with a specific user input) and check the test results in the Tests tab on the Build page. The test results can be, for example: + +- Screenshots. + + Recorded video. + + Logs. + + Files. + +Here is a screenshot of a successful robo test, where the robo test got all the way through to My application by populating the email and password fields first with the pre-defined directives from the Robo directives. + +![Device_testing_for_Android.jpg](/img/_paligo/uuid-9b533252-b690-2350-8a3d-5929fcd79ffb.jpg) diff --git a/src/partials/running-the-build.mdx b/src/partials/running-the-build.mdx new file mode 100644 index 0000000..ab71b2e --- /dev/null +++ b/src/partials/running-the-build.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running the build + +Run your build with the following command: + +``` +docker run --privileged --env CI=false --volume "$(pwd):/bitrise/src" --volume "/var/run/docker.sock:/var/run/docker.sock" --rm quay.io/bitriseio/android:latest bitrise run WORKFLOW +``` + +- `--rm quay.io/bitriseio/android:latest bitrise run WORKFLOW` + + with `-it quay.io/bitriseio/android:latest bash` to start an interactive bash shell inside the container. + + For example: + + ``` + docker run --privileged --env CI=false --volume "$(pwd):/bitrise/src" --volume "/var/run/docker.sock:/var/run/docker.sock" -it quay.io/bitriseio/android:latest bash`. + ``` + + This command will share the current directory (the directory of your repository) as a shared volume with the docker container, and will make it available inside the container at the path `/bitrise/src`. + + After this, you can run `bitrise run WORKFLOW`, which will run the workflow inside the container. To exit from the container, just run `exit`. +- Don’t forget to replace `WORKFLOW` with the actual ID of your workflow in your `bitrise.yml`, with something like `primary`! + +- The `--env CI=false` flag sets the environment variable `CI` to `false` - this will make Bitrise CLI skip certain steps that only make sense to run in a CI environment. For example, our `Git Clone` Step - you already have your code, so there’s no need to git clone it again inside the docker container (that’s why we shared the code directory as a `--volume`). +- The `--rm` flag tells docker to discard the container after the `docker run` command finishes. This means that if you run the command again, the only thing which will persist between the `docker run ..` commands are the files stored at the shared `--volume` (in your repository’s directory). Every other file that is generated into a temp or any other location will be discarded / won’t be kept. + + If you want to debug the container after a failed build, feel free to remove the `--rm` flag, and check out a Docker tutorial about how you can connect to an existing docker container. Please note that simply running the command again will not use the same container, but will create a new one! +- The `--privileged` flag allows access control of the host from the docker container, so you should never use this flag unless you trust the docker image you will use! This flag is required for allowing VPNs to work (to change network configs of the host), for example. +- The `--volume "/var/run/docker.sock:/var/run/docker.sock"` flag exposes the docker socket from the host for the container - this is required if you want to run other docker containers from within the container, or if you want to run any `docker` command during your build / inside the container. diff --git a/src/partials/running-workflows-from-the-workflow-editor.mdx b/src/partials/running-workflows-from-the-workflow-editor.mdx new file mode 100644 index 0000000..5ab5c70 --- /dev/null +++ b/src/partials/running-workflows-from-the-workflow-editor.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Running Workflows from the Workflow Editor + +You can manually start a build by running a single Workflow from the Workflow Editor. + +To do so: + +1. Open your app on Bitrise and click the **Workflows** button to open the Workflow Editor. +1. On the **Workflows** tab, use the **WORKFLOW** drop-down menu to select the Workflow you would like to run. + + ![Workflow_selector.png](/img/_paligo/uuid-d83ea44a-429d-83ab-21eb-531ce6ce8416.png) +1. Click **Run Workflow**. + + ![run_workflow_edit.png](/img/_paligo/uuid-ec4d7f8f-0f68-0f4f-806f-64114da6716f.png) +1. Specify the branch that you want to build in the **Branch** field. + + ![select_branch.png](/img/_paligo/uuid-518781ac-bb0f-7bec-d0ec-26047fb2b16d.png) +1. Click **Run Workflow** to start the build. + +And that's it! As soon as you click the **Run Workflow** button, your build will be kicked off, and the build's page will open in a new tab. diff --git a/src/partials/saml-sso-before-you-start.mdx b/src/partials/saml-sso-before-you-start.mdx new file mode 100644 index 0000000..8af3f2c --- /dev/null +++ b/src/partials/saml-sso-before-you-start.mdx @@ -0,0 +1,6 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +- Be aware that only the Workspace owner can set up SAML SSO to a Bitrise Workspace. +- Your account on Bitrise has a Workspace with one of our [paid plans](https://bitrise.io/pricing). diff --git a/src/partials/scanners.mdx b/src/partials/scanners.mdx new file mode 100644 index 0000000..c27a25d --- /dev/null +++ b/src/partials/scanners.mdx @@ -0,0 +1,73 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Scanners + +Scanners generate the possible `options` chains and the possible workflows for the `options` per project type. The `ActiveScanner` variable holds each scanner implementation. Every specific scanner implements the `ScannerInterface`. + +``` +// ScannerInterface ... +type ScannerInterface interface { + Name() string + DetectPlatform(string) (bool, error) + + Options() (models.OptionModel, models.Warnings, error) + Configs() (models.BitriseConfigMap, error) + + DefaultOptions() models.OptionModel + DefaultConfigs() (models.BitriseConfigMap, error) + + ExcludedScannerNames() []string +} +``` + +- `Name() string`: This method is used for logging and storing the scanner output (warnings, options and configs). The scanner output is stored in `map[SCANNER_NAME]OUTPUT`. For example, the `options` for an iOS project is stored in `optionsMap[ios]options`. +- `DetectPlatform(string) (bool, error)`: This method is used to determine if the given search directory contains the project type or not. +- `Options() (models.OptionModel, models.Warnings, error)`: This method is used to generate option branches for the project. Each branch should define a complete and valid option set to build the final bitrise config model. Every option branch’s last `Options` has to store a configuration id, which will be filled with the selected options. +- `Configs() (models.BitriseConfigMap, error)`: This method is used to generate the possible configs. BitriseConfigMap’s each element is a bitrise config template which will be fulfilled with the user selected option values. +- `DefaultOptions() models.OptionModel and DefaultConfigs() (models.BitriseConfigMap, error)` : These methods are used to generate the options and configs without scanning the given project. In this case every required step input value is provided by the user. This way even if a scanner fails, the user has an option to get started. + +### Testing a scanner + +To test a scanner, we require both unit tests and integration tests. + +Unit tests are written using Go’s standard testing library. + +For integration tests, we are validating that the project type scanners are generating the desired Bitrise configurations for an instance of the project type. To do this, we use the new scanner to scan the given sample project and we modify the generated scan result to fit our integration tests. + +The reason for the modification is that the scanners are adding Steps to the generated config, but the Step versions are updated from time to time. The Step version definitions can be found at `steps/const.go`. + +So we call `bitrise-init --ci config` in the sample project’s root directory, and in the generated `scan_result.yml` file we replace the Step versions with `%s` and we use `fmt.Sprintf` to inject the latest defined Step versions into the config. + +In the integration tests, we are matching the `scan_result.yml` file generated by the scanner with the previously generated reference `scan_result` content. + +### Submitting your own scanner + +You can submit your own scanner to Bitrise: we will review it and integrate it to the bitrise-init tool once it’s approved! + +The development path for a new scanner starts with your own sample project and ends with updating the existing Steps for your project type. Let’s go through it! + +1. Find or create an open source sample app that demonstrates a typical instance of your project type. + + It should include: + + - a readme file (including tool versions required for updating, building and testing this project). + - a `bitrise.yml` file that is generated by your scanner. +1. Build and test your sample app with existing Steps or custom scripts. +1. Create the missing Steps the new project type needs. + + The PR for these Steps should link the scanner PR once you created the scanner. +1. Create a scanner for your project type. +1. Run the required unit tests and integration tests. +1. Open a scanner pull request to the bitrise-init project. + + It should: + + - link the new project type’s sample app. + - link the new project type’s guides for testing and building. + - include an icon for the new project type - otherwise we will create one for you. + - recommend the default stack by listing the required tools for building and testing the new project type. +1. Update the existing Steps with the new project type if necessary. + + The PR for these Steps should link the scanner PR. diff --git a/src/partials/scheduling-a-build.mdx b/src/partials/scheduling-a-build.mdx new file mode 100644 index 0000000..03311bd --- /dev/null +++ b/src/partials/scheduling-a-build.mdx @@ -0,0 +1,68 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Scheduling a build + +How to schedule a build with the basic configuration options on Bitrise: + +1. On the **Bitrise CI** page of your app, find the **Start build** button and click the button with the clock icon next to it. + + ![scheduling-builds.png](/img/_paligo/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png) +1. In the **Schedule build** dialog, set up the scheduling cadence: you can choose between **Basic** and **Cron** settings. + + - In the **Basic** settings, you need to set a start date, a start time in 24-hour time format, and select a timezone. + - In the **Cron** settings, you can set a `cron` [schedule expression](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html). The dialog will parse your expression and display the configured time in a human-readable format. +1. If you chose **Basic**, enable or disable repetition with the **Repetition** toggle. If you enable repetition, configure the frequency, from minutes to years. + + The build will be triggered with the configured frequency, always at the same time, determined by the scheduling cadence. For example, you can configure your builds to run on Monday and Thursday every week. + + ![repetition.png](/img/_paligo/uuid-e5013e56-2f65-12a8-c6c7-ba34733cde57.png) +1. When ready, click **Next** to proceed to the build configuration. +1. Select between **Basic** and **Advanced** configuration. + + Basic configuration offers three options: + + - A branch name. This is a required field. + - A message in the **Message** field. This is not related to Git commit messages at all. It's just a place to provide some optional information about your build. + - A Workflow or a Pipeline. You can select a specific one or use the **Based on trigger map** option to select one using the [the trigger map](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.html) in the app's `bitrise.yml` configuration file. + + :::note[Pull request branch] + + Starting a build of a pull request’s branch is NOT the same as a pull request build. The manually started build of a pull request branch will only build the state of the code on that branch. An automatically triggered pull request build, however, builds the state of the code as it will look like once you merged the pull request. + + ::: + + For advanced configuration options, see the [see topic](#UUID-b8758d13-9796-ea59-15cd-0ba401687e85) section. + + ![schedule-basic.png](/img/_paligo/uuid-9e21a75a-a3ed-54f2-9b07-53a46d9a3d2d.png) +1. When done, click **Schedule build**. + +### Advanced configuration options for starting/scheduling builds + +If you choose **Advanced** in the **Build configuration** window, you have all the options available with **Basic**, and a few more: + +You can select a source type in the **Source** dropdown menu. In addition to the default **Branch** option, you can also select: + +- **Git Tag**: Builds a particular branch or commit that is tagged with the Tag you enter. If you set this, you can't set a commit hash. + + :::important[Git Tags and commit hashes are conflicting options] + + You cannot specify both a Git Tag and a commit hash. When you set one, the other one will disappear. This ensures you cannot enter conflicting input values. + + ::: +- **Commit Hash**: Copy a specific commit’s hash here to build that particular commit. This option can even send a build status update to your git hosting service. If you set this, you can't set a Git Tag. + + :::note[Commit hash takes precedence over the Branch option] + + If the **Branch** option specifies a branch where the commit hash you chose doesn't exist, Bitrise will find the branch that does have the given commit and run a build with that branch. + + ::: + +![start-build-advanced.png](/img/_paligo/uuid-67f3a4f0-9315-bec3-0ea7-cca80d77b103.png) + +In addition to different sources, you can also add: + +- **Priority**: Determines the priority of your build in the build queue. The higher the number, the sooner your build will run. The priority must be an integer between -100 and 100. The default value is 0. For more information, check out [Build priority](/en/bitrise-ci/configure-builds/configuring-build-settings/build-priority). +- **Custom Environment Variables**: Create a custom Environment Variable that is used in the build. See [Setting a custom Env Var when starting a build](/en/bitrise-ci/configure-builds/environment-variables/setting-a-custom-env-var-when-starting-a-build). +- **Generated cURL command**: Based on the options you set in the Build configuration window, we provide an automatically generated cURL command. This can be copied and pasted, and you can run it on any platform that has cURL installed. diff --git a/src/partials/scope-of-environment-variables.mdx b/src/partials/scope-of-environment-variables.mdx new file mode 100644 index 0000000..da5d770 --- /dev/null +++ b/src/partials/scope-of-environment-variables.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Scope of Environment Variables + +Users can declare Environment Variables on three different levels: + +- App level. +- Workflow level. +- Step level. + +In addition to the user-declared Env Vars, there are Env Vars automatically exposed by either the Bitrise CLI or bitrise.io. These are always available in any build. You can find the list of these here: [Available environment variables](/en/bitrise-ci/references/available-environment-variables) + +**App level Env Vars** are available to every build of a given app. Whenever you create a new Workflow, for example, it immediately and automatically has access to every single app level Env Var. + +**A Workflow level Env Var** is only available to the specific Workflow it was defined in. If your `primary` Workflow has an Env Var with the key TEST_ENV, your `deploy` Workflow won't be able to access that Env Var. + +:::note[Chaining Workflows together] + +If you [chain Workflows together](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together), using the `after_run` parameter, and define an Env Var in one of the Workflows, all subsequent Workflows in the chain will be able to access that Env Var. + +::: + +**A Step level Env Var** is defined within a particular Step of a build. Such an Env Var is not available to other Workflows, or to the preceding Steps in the same Workflow. Subsequent Steps, however, can access it. Step outputs are also exposed as Environment Variables. + +You can set Environment Variables, regardless of level, in both the Workflow Editor, in your app's `bitrise.yml` file, or during a build with a custom Script using the [envman](https://github.com/bitrise-io/envman/) tool: + +- [Setting an Env Var in the Workflow Editor](/en/bitrise-ci/configure-builds/environment-variables/setting-an-env-var-in-the-workflow-editor) +- [Exposing Env Vars and using them in another Step or Workflow](/en/bitrise-ci/configure-builds/environment-variables/exposing-env-vars-and-using-them-in-another-step-or-workflow) + +Environment Variables have a given processing order based on their level: [Availability order of Environment Variables](/en/bitrise-ci/configure-builds/environment-variables/availability-order-of-environment-variables) diff --git a/src/partials/secrets-in-self-hosted-environments.mdx b/src/partials/secrets-in-self-hosted-environments.mdx new file mode 100644 index 0000000..7c9eb62 --- /dev/null +++ b/src/partials/secrets-in-self-hosted-environments.mdx @@ -0,0 +1,46 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Secrets in self-hosted environments + +You can run Bitrise builds on self-hosted infrastructure: hardware or virtualized environments that you control. If your security policy doesn't allow you to use Bitrise Secrets hosted on bitrise.io, this guide offers a different way of accessing Secrets and using them in your builds. + +In a self-hosted build, your host machine is behind your virtual private cloud. As such, you can access the secret service of your choice without exposing the Secrets to the Bitrise control plane and the website. Get the Secret from your service and then add it to the Bitrise build using `envman`: + +1. Optionally, create a placeholder Secret on Bitrise with any value: [Setting a Secret](/en/bitrise-ci/configure-builds/secrets/setting-a-secret). + + This is necessary only if you wish to use the Secret in a sensitive Step input on the GUI of the Workflow Editor. Sensitive inputs only accept Secrets and in the Workflow Editor you can only add existing Secrets as the value of a sensitive input. + + If you edit your Bitrise configuration in YAML, you don't need a placeholder as you can set any value to your input. +1. Use a **Script** Step to get your Secret from the service you use. +1. In the script, turn off debugging by setting `set +x`: + + This is very important: in debug mode, the value of the Secret might be visible in the build log! + + ``` + #!/usr/bin/env bash + # fail if any commands fails + set -e + # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all commands exit successfully + set -o pipefail + # debug log + set +x + ``` +1. Fetch the Secret value from the service you use and then add it to `envman`. + + ``` + set +x + GIT_PASSWORD_SECRET=TODO Your call to fetch the secret value + envman add --key GIT_HTTP_PASSWORD --value $GIT_PASSWORD_SECRET + ``` + + The actual commands depend on the service you use. For example, if you use Bitrise on AWS and your EC2 machine can access the AWS Secrets Manager, you could get the secret with a command similar to this: + + ``` + set +x + USERNAME=aws secretsmanager get-secret-value --secret-id BitriseDemoGitUsername --region eu-central-1 | jq -r '.SecretString' + envman add --key GIT_HTTP_USERNAME --value $USERNAME + PASS=aws secretsmanager get-secret-value --secret-id BitriseDemoGitPassword --region eu-central-1 | jq -r '.SecretString' + envman add --key GIT_HTTP_PASSWORD --value $PASS + ``` diff --git a/src/partials/security-patching-reference.mdx b/src/partials/security-patching-reference.mdx new file mode 100644 index 0000000..2ca5e67 --- /dev/null +++ b/src/partials/security-patching-reference.mdx @@ -0,0 +1,10 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Security patching reference + +| | macOS Virtualized - Controller | macOS Bare Metal - Controller | macOS Virtualized - Manual | macOS Bare Metal - Manual | Linux Bare Metal - Manual | +| --- | --- | --- | --- | --- | --- | +| **Host OS Update** | Can use host warm up script to perform updates. | Can use host warm up script to perform updates. | Can use custom AMI Can directly modify instance | Can use custom AMI Can directly modify instance | Can use custom AMI Can directly modify instance | +| **VM OS Update** | Bitrise is responsible for critical security updates. | N/A | Bitrise is responsible for critical security updates. | N/A | N/A | diff --git a/src/partials/sending-emails-with-a-step.mdx b/src/partials/sending-emails-with-a-step.mdx new file mode 100644 index 0000000..ab8861c --- /dev/null +++ b/src/partials/sending-emails-with-a-step.mdx @@ -0,0 +1,42 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Sending emails with a Step + +The **Send Email with Mailgun** Step can send emails to any email address with customized updates, in either HTML or plain text format. You can use environment variables to send information, as well as attach files to the emails. + +To use the Step, you need: + +- A Mailgun account. +- A Mailgun API key. +- Your Mailgun domain name. + +:::important[Make sure the Step runs in every build!] + +If you use the **Send Email with Mailgun** Step in your workflow, make sure that [it is always set to run even if the previous Step failed](/en/bitrise-ci/workflows-and-pipelines/steps/skipping-steps)! This is the default setting of the Step. If you change it, you will not receive emails if your builds fail. + +::: + +1. Create a Secret Environment Variable that holds your Mailgun API key. + + We recommend naming the key `$MAILGUN_API_KEY`. This is the default value of the Step’s relevant input. +1. Create a Secret Environment Variable that holds your Mailgun domain. + + We recommend naming the key `$MAILGUN_DOMAIN`. This is the default value of the Step’s relevant input. +1. Add the **Send Email with Mailgun** Step to the end of your workflow. +1. Find the **Send To emails** input of the Step. Click on the input and then click **Select secret variable**. +1. Create a new Secret Environment Variable that contains the list of the email addresses. + + You can choose any key you want. The addresses should be separated by a comma. + + ![Configuring_notifications.png](/img/_paligo/uuid-a7bfa471-3a28-7bb4-0335-cffbacb0bd8a.png) +1. Set the email subject, and the two potential email messages: one for a successful build, one for a failed build. + + - You can insert environment variables to any of the inputs (the subject and the messages). In the email, the values of the variables will be displayed. + - The default messages will send the name of the app, the number of the build and whether the build succeeded or failed. +1. Attach files, if necessary: the **File attachments** input accepts a file path or an environment variable as input. + + Multiple files can be attached: separate their paths with commas. + +Run a build - and check your emails! diff --git a/src/partials/service-credential-user-actions-and-their-required-repository-access.mdx b/src/partials/service-credential-user-actions-and-their-required-repository-access.mdx new file mode 100644 index 0000000..05f6e9b --- /dev/null +++ b/src/partials/service-credential-user-actions-and-their-required-repository-access.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Service credential user actions and their required repository access + +:::important[GitHub project] + +The service credential user is NOT required if you use the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration) to connect to your Git repositories. + +::: + +The service credential user allows Bitrise to execute a number of different actions that require access to your project's Git repository. Different actions require different levels of access: for example, [to use a `bitrise.yml` file from the repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository) requires **read** access on GitHub while [registering a new SSH key](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) requires **admin** access. + +The following table contains all the actions that require the service credential user, as well as the access level of the service credential user's account at the the three main Git providers + +| Action | Required access level on GitHub | Required access level on Bitbucket | Required access level on GitLab | +| --- | --- | --- | --- | +| [Using a `bitrise.yml` from the repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository) | read | read | reporter | +| List the branches of the repository | read | read | reporter | +| [Selective builds](/en/bitrise-ci/configure-builds/configuring-build-settings/selective-builds.html) | read | read | reporter | +| [Sending Git status reports](/en/bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider.html) | write | write | GitLab.com: developer Self-hosted GitLab: maintainer | +| [Registering SSH keys to the repository](/en/bitrise-platform/repository-access/configuring-ssh-keys.html) | admin | admin | maintainer | +| [Register a webhook](/en/bitrise-platform/integrations/webhooks/adding-incoming-webhooks/registering-an-incoming-webhook-automatically) | admin | admin | maintainer | +| Checking the Git connection on bitrise.io | admin | admin | maintainer | diff --git a/src/partials/setting-a-custom-env-var-when-starting-a-build.mdx b/src/partials/setting-a-custom-env-var-when-starting-a-build.mdx new file mode 100644 index 0000000..376b39c --- /dev/null +++ b/src/partials/setting-a-custom-env-var-when-starting-a-build.mdx @@ -0,0 +1,28 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting a custom Env Var when starting a build + +When scheduling a new build or starting a new build manually, you have the option to set up custom Environment Variables (Env Var). These variables are only available for the build you started or scheduled. + +:::caution[Don't use the same key as an App Env Var] + +App Environment Variables have precedence over custom Environment Variables! This means that if you define a custom Env Var with the same key as an App Env Var, the build will use the value of the App Env Var. + +::: + +1. On the **Bitrise CI** page of your app, find the **Start build** button and click the button with the clock icon next to it. + + ![scheduling-builds.png](/img/_paligo/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png) +1. In the **Build configuration** pop-up window, select the **Advanced** tab. +1. Find the **Custom Environment Variables** section. +1. Enter a key and a value. + + :::important[Replacing variables in inputs] + + Replacing variables in inputs ensures that the value of the Env Var will be passed to the build instead of the key. For details, check [Replacing variables in inputs](/en/bitrise-ci/configure-builds/environment-variables/replacing-variables-in-inputs). + + ::: +1. Press the **+ Add Environment Variable** button. +1. Finish starting or scheduling the build. diff --git a/src/partials/setting-a-secret.mdx b/src/partials/setting-a-secret.mdx new file mode 100644 index 0000000..c04fdb7 --- /dev/null +++ b/src/partials/setting-a-secret.mdx @@ -0,0 +1,56 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting a Secret + +:::note[Every Env Var value is a string] + +The value of an Environment Variable or Secret can only be a string. Even if you set a number (for example, 7), it will be passed on as a string. + +::: + +You can create a Secret either on the **Secrets** page in the Workflow Editor or when modifying Step inputs. + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Secrets**. +1. Under **Project level Secrets**, click the **Add new** button. + + ![secrets-screenshot.png](/img/_paligo/uuid-b269a597-65ef-34a5-1828-ad1ab954437d.png) +1. Add a key and a value. + + :::important[Using the $ character] + + You can use the `$` character in the value of an Env Var or Secret (for example, in a password) but in that case always leave the **Replace variables in inputs** option unchecked. If you replace the variable's key with its value in inputs, the Bitrise CLI will treat the value as another Env Var because of the `$` character. + + ::: +1. Optionally, you can [replace the key of your Secret with its value in inputs](/en/bitrise-ci/configure-builds/environment-variables/replacing-variables-in-inputs): check the **Replace variables in inputs** option. +1. Optionally, you can expose your Secret to pull requests by selecting the option. + + In most cases, we strongly recommend [not to expose Secrets](/en/bitrise-ci/configure-builds/secrets/exposing-a-secret-to-pull-requests). +1. Click **Save**. + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Select a Workflow and find the Step you want to configure. +1. Find the sensitive input you wish to modify. +1. Click the **$** sign and then click **Create** in the dialog. +1. In the **Create variable** dialog, specify a key and a value for your new Secret. + + ![create-variable.png](/img/_paligo/uuid-2a0854ff-b62a-6215-5c2e-09cf6b244786.png) +1. Optionally, you can [replace the key of your Secret with its value in inputs](/en/bitrise-ci/configure-builds/environment-variables/replacing-variables-in-inputs) by checking the option. +1. Click the **Add new** button. + + + diff --git a/src/partials/setting-additional-linked-repositories-api.mdx b/src/partials/setting-additional-linked-repositories-api.mdx new file mode 100644 index 0000000..2e9e981 --- /dev/null +++ b/src/partials/setting-additional-linked-repositories-api.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting additional linked repositories + +A linked repository is a repository that a Bitrise project can access using a GitHub app installation but it's not the project's primary repository. When an additional repository is linked to your Bitrise GitHub app installation, the tokens generated for the build can access the additional repository. + +Read more about additional linked repositories: [Additional linked repositories](/en/bitrise-platform/repository-access/github-app-integration/additional-linked-repositories). + +Use the `POST /apps/APP-SLUG/github-app-connection-configuration/update-linked-repositories` to link an additional repository. You have two choices: + +- Manually listing the full names of the repository. + + ```bash + curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/github-app-connection-configuration/update-linked-repositories' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "repositories": ["org1/repo1", "org1/repo2"] + }' + ``` +- Set the `unlimited_repo_access` field to true to let the builds access all the current and future repositories. + + ```bash + curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/github-app-connection-configuration/update-linked-repositories' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "unlimited_repo_access": true + }' + ``` diff --git a/src/partials/setting-an-env-var-in-the-workflow-editor.mdx b/src/partials/setting-an-env-var-in-the-workflow-editor.mdx new file mode 100644 index 0000000..b79b4af --- /dev/null +++ b/src/partials/setting-an-env-var-in-the-workflow-editor.mdx @@ -0,0 +1,39 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting an Env Var in the Workflow Editor + +:::note[Every Env Var value is a string] + +The value of an Environment Variable or Secret can only be a string. Even if you set a number (for example, 7), it will be passed on as a string. + +::: + +:::important[Using the $ character] + +You can use the `$` character in the value of an Env Var or Secret (for example, in a password) but in that case always leave the **Replace variables in inputs** option unchecked. If you replace the variable's key with its value in inputs, the Bitrise CLI will treat the value as another Env Var because of the `$` character. + +::: + +To set a new Environment Variable (Env Var): + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Env Vars** from the navigation menu. +1. Choose the level of the Env Var: + + Scroll down to the **App Environment Variables** section to set an app level Env Var. + + ![app-env-vars.png](/img/_paligo/uuid-b81a2b79-c62d-b113-a36a-e91351cc2d41.png) + + Scroll down to one of the **Workflow Environment Variables** sections to set an Env Var for that specific Workflow. + + ![Secrets_and_Env_Vars.png](/img/_paligo/uuid-ff754b01-bc60-0109-5a45-4c21b65d9855.png) +1. Click the **Add new** button in your chosen section. +1. Add a key and a value. +1. Click **Save changes** in the top right corner. + +That's it. Your new Env Var is saved and ready to be used. diff --git a/src/partials/setting-conditions-for-running-the-step.mdx b/src/partials/setting-conditions-for-running-the-step.mdx new file mode 100644 index 0000000..19c558e --- /dev/null +++ b/src/partials/setting-conditions-for-running-the-step.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting conditions for running the Step + +There are three properties that define whether a Step is run in a given Workflow or not: `is_always_run`, `is_skippable` and `run_if`. All of these properties can be set in the `step.yml` file to govern the default behavior of the Step, or set in a given app’s bitrise.yml file on a case-by-case basis. + +`is_always_run`: By default, Steps do not run if a previous Step in the Workflow failed. However, if the `is_always_run` property is set to `true`, the Step runs regardless of the status of previous Steps in the Workflow. This can be very useful, for example, in the case of Steps that can send notifications about the build: they can send notifications about failed builds. + +`is_skippable`: As mentioned above, Steps do not run if a previous Step in the Workflow failed. However, if a Step’s `is_skippable` property is set to `true`, the build will not fail and subsequent Steps will run even if that particular Step fails. A good example is the **Cache:Pull** Step: if an app has no build cache to pull from, the Step will fail but that is no reason to fail the build. + +`run_if`: If you want to make Step execution dependent on a certain condition, use the `run_if` property to define the run condition. For example, you can configure a Step so that it only runs in a CI environment. Read more in our [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally) guide about the possible use cases. diff --git a/src/partials/setting-env-vars-in-the-bitriseyml.mdx b/src/partials/setting-env-vars-in-the-bitriseyml.mdx new file mode 100644 index 0000000..a1ba3b9 --- /dev/null +++ b/src/partials/setting-env-vars-in-the-bitriseyml.mdx @@ -0,0 +1,45 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting Env Vars in the configuration YAML + +You can set Env Vars directly in the YAML configuration file for your app. You can set both app level and Workflow level Env Vars in your app's config file. + +In this example, we have a configuration with an app-level Env Var called TEST_KEY: + +``` +app: + envs: + - opts: + is_expand: false + TEST_KEY: test value +``` + +:::important[Replacing variables in inputs] + +Replacing variables in inputs ensures that the value of the Env Var will be passed to the build instead of the key. For details, check [Replacing variables in inputs](/en/bitrise-ci/configure-builds/environment-variables/replacing-variables-in-inputs). + +::: + +In this example, the `deploy-alpha` Workflow defines an Env Var called ENV_TYPE, and then runs another Workflow that can use that Env Var: + +``` +workflows: + + deploy-alpha: + envs: + - ENV_TYPE: alpha + after_run: + - _deploy + + _deploy: + steps: + - script: + inputs: + - content: | + #!/bin/bash + echo "ENV_TYPE: $ENV_TYPE" +``` + +If you run the `deploy-alpha` Workflow, that will set the `ENV_TYPE` Env Var to `alpha`, then it will run the `deploy` Workflow, which can use that Env Var. In this example, it will simply print its value (the printed text will be: `ENV_TYPE: alpha`). diff --git a/src/partials/setting-java-version-with-the-set-java-version-step.mdx b/src/partials/setting-java-version-with-the-set-java-version-step.mdx new file mode 100644 index 0000000..0e48715 --- /dev/null +++ b/src/partials/setting-java-version-with-the-set-java-version-step.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting Java version with the Set Java version Step + +Each Bitrise stack has multiple different [Java versions](https://stacks.bitrise.io/tools/java/) pre-installed and ready to use. You can easily switch between the different Java versions with our [**Set Java version** Step](https://www.bitrise.io/integrations/steps/set-java-version). The Step allows you to set the global Java version of the virtual machine that runs your build. This Step cannot install any Java version. It can only switch between the versions that are pre-installed on our stacks. + +1. Add the **Set Java version** Step to your Workflow. We recommend setting it as the first Step of the Workflow. +1. Find the **Java version to be set globally for the build** input. +1. Set it to the version you need. + +**YAML example** + +In this example, we're setting the Java version to 17 in the `bitrise.yml` file. + +``` +primary: + steps: + - set-java-version@1: + inputs: + - set_java_version: '17' +``` diff --git a/src/partials/setting-the-stack-in-the-bitriseyml-file.mdx b/src/partials/setting-the-stack-in-the-bitriseyml-file.mdx new file mode 100644 index 0000000..48ebda6 --- /dev/null +++ b/src/partials/setting-the-stack-in-the-bitriseyml-file.mdx @@ -0,0 +1,103 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting the stack in the Configuration YAML + +You can set both the default stack and Workflow-specific tasks in your project's Configuration YAML. Use the `meta` field with the appropriate stack ID: + +``` +meta:       + bitrise.io:        + stack:  +``` + +This is particularly useful if you [keep your `bitrise.yml` file stored in your app's repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository). + +:::note[Stack IDs] + +You can find the stack IDs on the top of each stack report: [Bitrise stack reports](https://stacks.bitrise.io/stack_reports/). Alternatively, you can set a stack in the Workflow Editor and then check out the ID on the **bitrise.yml** tab, by finding the `meta` field. + +The stack reports also show every [pre-installed tool](/en/bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks.html) that is available on the stack. + +::: + +### Setting the default stack in the Configuration YAML + +The default stack of your app is the stack that is used if you haven't set a specific stack for a Workflow. + +1. Open your project's Configuration YAML. +1. Add a `meta` entry outside the `workflows` property or at the end of your Configuration YAML: + + ``` + meta:       + bitrise.io:        + stack: + ``` + + Make sure you use double indentation. +1. Add the stack ID. + + You can find the stack IDs on the [stack reports page](https://stacks.bitrise.io/stack_reports/): the filenames without the `.log` extension are the stack IDs. + + ``` + meta:       + bitrise.io:        + stack:  + ``` + +### Setting Workflow-specific stacks in the Configuration YAML + +When you set a stack for a Workflow, that Workflow will always run on that stack, regardless of the default stack. + +1. Open your project's Configuration YAML. +1. Find the `workflows` property and find the name of the Workflow you need within. +1. Add a `meta` entry under the Workflow itself: + + ``` + workflows: + deploy: + meta:       + bitrise.io:        + stack: + ``` +1. Add the stack ID. + + You can find the stack IDs on the top of each [stack report page](https://stacks.bitrise.io/stack_reports/). + + ``` + workflows: + deploy: + meta:       + bitrise.io:        + stack:  + ``` + +### Setting the machine type in the Configuration YAML + +You can also define the machine type you want to use for your build in your project's Configuration YAML. Machine type refers to the hardware resources used in your build; for example, an Elite machine has more CPU cores and available RAM than a Standard machine. + +To set the machine type in Configuration YAML file, you need to use the `machine_type_id` attribute in a `meta` entry: + +:::note[Available machine IDs] + +You can find the available machine type IDs here: [Build machine types](/en/bitrise-build-hub/infrastructure/build-machine-types). + +::: + +1. Open your project's Configuration YAML file. +1. Find the `workflows` property and find the name of the Workflow you need within. +1. Add a `meta` entry: + + ``` + # setting an 8-core Gen2 machine for an Xcode stack as the default machine type of the app: + meta: + bitrise.io: + machine_type_id: g2.8core + # setting a 12-core Gen2 machine as a Workflow-specific machine type + workflows: + deploy: + meta: + bitrise.io: + machine_type_id: + ``` diff --git a/src/partials/setting-the-stack-in-the-workflow-editor.mdx b/src/partials/setting-the-stack-in-the-workflow-editor.mdx new file mode 100644 index 0000000..9456835 --- /dev/null +++ b/src/partials/setting-the-stack-in-the-workflow-editor.mdx @@ -0,0 +1,54 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting the stack in the Workflow Editor + +The simplest way to configure the [build stack](/en/bitrise-build-hub/infrastructure/build-stacks.html) is in the Workflow Editor. You can set both the default stack and Workflow-specific stacks. + +### Setting the default stack + +The default stack of your app is the stack that is used if you haven't set a specific stack for a Workflow. + +:::note[Project type] + +Note that if you change the project type on the app's **Settings** tab to a type that isn't compatible with your selected default stack, we'll automatically change the stack to a compatible one. + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Stacks & Machines**. +1. In the **Default Stack** section, open the dropdown menu and select the stack you need. +1. Click **Save changes** in the top right corner. + +### Setting a Workflow-specific stack + +When you set a stack for a Workflow, that Workflow will always run on that stack, regardless of the default stack. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Stacks & Machines**. +1. Scroll down to find the Workflow you need. +1. Select a stack. +1. Click **Save changes** in the top right corner. + +### Setting the machine type in the Workflow Editor + +You can define the machine type you want to use for your build in the Workflow Editor. The available machine types depend on the type of stack you use: [Build machine types](/en/bitrise-build-hub/infrastructure/build-machine-types). + +To set the machine type: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Stacks & Machines**. +1. In the **Default Stack** section, find the **Machine type for the default stack** section and choose a machine type. + + ![machine-type-selector.png](/img/_paligo/uuid-3541a0b4-b1d8-6530-46f1-0e3badfff2b3.png) +1. Optionally, choose a Workflow-specific machine type for any Workflow that has a Workflow-specific stack set. diff --git a/src/partials/setting-up-a-mapping-rule-for-your-bitrise-apps-client-id.mdx b/src/partials/setting-up-a-mapping-rule-for-your-bitrise-apps-client-id.mdx new file mode 100644 index 0000000..01ec955 --- /dev/null +++ b/src/partials/setting-up-a-mapping-rule-for-your-bitrise-apps-client-id.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up a mapping rule for your Bitrise app’s Client ID + +Bitrise authenticates SAML SSO users via email address so before you’d test SAML SSO, make sure you create a new mapping rule on Auth0. This way you map Auth0 Client ID to email for successful SAML authentication on Bitrise. + +1. On Auth0, click the **Auth Pipeline** on the left menu bar. Click **Rules**. +1. Click **+ Create** to set up a new mapping rule. +1. On the **Pick a rules template** page, click **<> Empty rule**. +1. Add the following codeblock to the **Script** box: You will need your new Bitrise app’s Client ID which you can get on the **Applications**’ page. + + ``` + function mapSamlAttributes(user, context, callback) { + if (context.clientID === '{your app's clientID'}') + context.samlConfiguration.mappings = { + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "email" + }; + } + callback(null, user, context); + } + ``` +1. Click **Save changes**. diff --git a/src/partials/setting-up-app-versioning-automatically-on-bitrise.mdx b/src/partials/setting-up-app-versioning-automatically-on-bitrise.mdx new file mode 100644 index 0000000..62e1be2 --- /dev/null +++ b/src/partials/setting-up-app-versioning-automatically-on-bitrise.mdx @@ -0,0 +1,57 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up app versioning automatically on Bitrise + +Track the version of your app in its Git repository by modifying the file containing the essential information about the app (for example, the `Info.plist` file for iOS apps and either the `build.gradle` file or the `AndroidManifest.xml` file for Android apps). + +Bitrise has two steps to do this for you. These two Steps can insert the Bitrise build number or some other specified number into their respective files: + +- **Change Android versionCode and versionName** for Android apps. +- **Set Xcode Project Build Number** for iOS apps. + +Both Steps accept either numbers (integers and/or numeric strings) or environment variables in their relevant inputs. By default, both use the $BITRISE_BUILD_NUMBER Environment Variable as their default value for the build number. + +### Setting the versionCode and the versionName of an Android app + +For an Android app, the setting is used as an internal version number, to determine if a build of the app is more recent than another build. The `versionName` setting is a string used as the version number shown to users. + +For in-depth information about Android versioning, please check out [the Android developer guide on the subject](https://developer.android.com/studio/publish/versioning). + +:::note[Version information in the manifest file] + +In this guide, we’re setting the version information in the `build.gradle` file. This is the recommended method: you can also set it directly in the `AndroidManifest.xml` file but be aware that any version info set in the manifest file before the build will be overwritten by the `build.gradle` file’s settings during the build. + +::: + +To configure Android versioning: + +1. Add the **[Change Android versionCode and versionName](https://bitrise.io/integrations/steps/change-android-versioncode-and-versionname)** Step to your Workflow. +1. Set the the path to your `build.gradle` file in the **Path to the build.gradle file** input. + + ![change-android-version.png](/img/_paligo/uuid-fb7fb260-5679-1832-9448-228a048e2b80.png) +1. Add a value in the **New versionCode** input. + + The default value is the $BITRISE_BUILD_NUMBER Environment Variable. +1. Add a value in the **New versionName** input. + +### Setting the CFBundleVersion and CFBundleShortVersionString of an iOS app + +For an iOS app, the value of the `CFBundleVersion` key (“Bundle version” in Xcode) is the build number of the app while the value of the `CFBundleShortVersionString` key (“Bundle versions string, short” in Xcode) is the version number of the app. + +For in-depth information about iOS versioning, including the functions of the `CFBundleVersion` and the `CFBundleShortVersionString` keys, please check out [this Apple technical note](https://developer.apple.com/library/archive/technotes/tn2420/_index.html); you can also look up the [summary of most important keys](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html). + +:::important[Setting up iOS versioning for apps using Xcode 13+] + +To set up iOS versioning on Bitrise using Xcode 13+, update the following in Xcode: + +- Set the **Generate Info.plist File** to `No`, under **PROJECT** and **TARGETS** on the **Build Settings** tab. +- Make sure you have all the necessary keys defined in the `Info.plist` file. + +::: + +1. Add the **Set Xcode Project Build Number** Step to your Workflow. +1. Set the file path to the `Info.plist` file in the **Project path, scheme and Target** input. +1. Add a value in the **Build Number** input. This sets the `CFBundleVersion` key to the specified value in the `Info.plist` file. The default value is the $BITRISE_BUILD_NUMBER Environment Value. +1. Optionally, add a value in the **Version Number** input. This will set the `CFBundleShortVersionString` key to the specified value in the `Info.plist` file. This input is not required. diff --git a/src/partials/setting-up-bitrise-on-premise.mdx b/src/partials/setting-up-bitrise-on-premise.mdx new file mode 100644 index 0000000..7ede6ef --- /dev/null +++ b/src/partials/setting-up-bitrise-on-premise.mdx @@ -0,0 +1,91 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up Bitrise on-premise + +To be able to run Bitrise builds on your own infrastructure, you need to get the Bitrise runner from [Homebrew](https://brew.sh/) and then configure your network to be able to access two Bitrise service endpoints. + +:::note[Tools and services] + +Please note that when using the Bitrise runner this way, you have to make sure you have all the tools you need installed on the machine. For now, we don't provide preinstalled tools for this on-premise solution. + +::: + + + + +1. Configure Bitrise runner pools in your **Workspace settings** page on bitrise.io: [Configuring runner pools](/en/bitrise-build-hub/infrastructure/configuring-runner-pools). + + Make sure to get the token from the process. +1. Fetch the `bitrise-den-agent` formula from Homebrew. + + ``` + brew tap bitrise-io/den-agent + ``` +1. Install the latest version. + + ``` + brew install bitrise-den-agent + ``` + + :::tip[Installing a specific version] + + You can also install a specific version by amending the version number to the command: + + ``` + brew install bitrise-den-agent@2.1.26 + ``` + + ::: +1. Install [the Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html). The CLI runs the builds based on YAML configurations. + + ``` + brew install bitrise + ``` +1. Configure your network to be able to access the following two services: + + - `https://den.services.bitrise.io` + - `https://build-log.services.bitrise.io` + + The agent needs to be able to access both of these to run your builds and communicate with the Bitrise website. +1. Generate a service daemon template. + + You need the runner pool token to finish the process. + + ``` + sudo $(brew --prefix)/bin/create_bitrise_daemon.sh --bitrise-agent-intro-secret=YOUR_TOKEN --enable-agent-self-update + ``` +1. Configure agent mode to clean up your build environment after a build: [Cleaning up persistent build environments](/en/bitrise-build-hub/infrastructure/cleaning-up-persistent-build-environments). + + + + +1. Configure Bitrise runner pools in your **Workspace settings** page on bitrise.io: [Configuring runner pools](/en/bitrise-build-hub/infrastructure/configuring-runner-pools). + + Make sure to get the token from the process. +1. Add a GPG public key. + + ``` + curl -fsSL https://bitrise-den-agent-deb.s3.amazonaws.com/DEB-GPG-KEY-bitrise.pub | + sudo gpg --dearmor -o /usr/share/keyrings/DEB-GPG-KEY-bitrise.gpg + ``` +1. Add the Bitrise DEN agent deb package repository. + + ``` + echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/DEB-GPG-KEY-bitrise.gpg] https://bitrise-den-agent-deb.s3.amazonaws.com stable main' | + sudo tee /etc/apt/sources.list.d/den-agent-deb.list + ``` +1. Install the runner and connect it on your machine to your Bitrise workspace. + + You need the runner pool token to finish the process. + + ``` + sudo apt update + sudo apt install bitrise-den-agent + /opt/bitrise/releases/bitrise-den-agent-configure.sh $TOKEN --enable-agent-self-update + ``` +1. Configure agent mode to clean up your build environment after a build: [Cleaning up persistent build environments](/en/bitrise-build-hub/infrastructure/cleaning-up-persistent-build-environments). + + + diff --git a/src/partials/setting-up-google-play-api-access.mdx b/src/partials/setting-up-google-play-api-access.mdx new file mode 100644 index 0000000..a1683ae --- /dev/null +++ b/src/partials/setting-up-google-play-api-access.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up Google Play API access + +Grant the Google Play API access to your project by creating a service account and granting the necessary user permissions to the service account. + +1. Turn on the Google Play Developer API for your project: [Enable the API](https://developers.google.com/android-publisher/getting_started#enable). +1. Create a service account on Google Cloud Platform: [Create service accounts](https://developers.google.com/android-publisher/getting_started#service-account). +1. Create a new JSON key for the service account: [Create and delete service account keys](https://cloud.google.com/iam/docs/keys-create-delete). + + :::note[Instant download] + + When you click **Create** at the end of the process, the service account JSON key is automatically downloaded. Make sure to save it as you cannot access or download it again! + + ::: +1. Invite your service account user on the **Users & Permissions** page in Google Play Console and grant the necessary permissions to be able to access and release apps on Google Play: [Use a service account](https://developers.google.com/android-publisher/getting_started#service-account). + +Check out the [Google Play Developer API](https://developers.google.com/android-publisher/getting_started) guide if you need more information on the process. + +You have successfully prepared your Google Play Console project. A services credential account has been created which is authorized to manage your releases. diff --git a/src/partials/setting-up-google-play-deployment-for-the-first-time.mdx b/src/partials/setting-up-google-play-deployment-for-the-first-time.mdx new file mode 100644 index 0000000..1073882 --- /dev/null +++ b/src/partials/setting-up-google-play-deployment-for-the-first-time.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up Google Play deployment for the first time + +Deploying to Google play publishes your app to Google's online store. When you do it for the first time, this requires a bit more work than simply deploying to [bitrise.io](https://www.bitrise.io/). Once the necessary configurations are in place, it becomes very simple. + +When configuring Google Play deployment for the first time, you need to link your Google Play Developer account to an API project, set up API access, and upload the service account JSON key to Bitrise. + +1. Upload the first AAB or APK manually to Google Play [using the Google Play Console](https://support.google.com/googleplay/android-developer/answer/113469?hl=en). +1. [Link](https://developers.google.com/android-publisher/getting_started) your Google Play Developer Console to an API project. +1. [Set up API Access Clients using a service account](https://developers.google.com/android-publisher/getting_started): Please note when you create your service account on the Google Developer Console, you have to choose `json` as **Key Type**. +1. Grant the necessary rights to the service account with your [Google Play Console](https://play.google.com/apps/publish). Go to **Settings**, then **Users & permissions**, then **Invite new user**. Due to the way the Google Play Publisher API works, you have to grant at least the following permissions to the service account: + + - Access level: View app information. + - Release management: Manage production releases, manage testing track releases. + - Store presence: Edit store listing, pricing & distribution. +1. As an optional step, you can add translations to your Store Listing: [Translate & localize your app](https://support.google.com/googleplay/android-developer/answer/3125566?hl=en). +1. [Connect your Google service account to Bitrise](/en/bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise). diff --git a/src/partials/setting-up-run-if-conditions-with-script-steps.mdx b/src/partials/setting-up-run-if-conditions-with-script-steps.mdx new file mode 100644 index 0000000..113402f --- /dev/null +++ b/src/partials/setting-up-run-if-conditions-with-script-steps.mdx @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up run_if conditions with Script Steps + +Sometimes the conditions required to determine whether a Step should run or not are complex and multi-layered. If so, using a complex chain of Go templates in a `run_if` expression can be overwhelming, especially if you prefer other languages instead of Go. + +In such cases, we recommend using a workaround: add a **Script** Step in your Workflow, and write a script that evaluates to a certain value. Store that value in an Environment Variable, and then the Step with the conditional expression only needs to check that value. + +**Using a non-Go script for a run_if expression** + +In this example, we'll create a simple Bash script and store its value, then check whether it matches a preset value. + +First, we add a Script Step, and in the script content, we define a value. Once the value is defined, we use `[envman](https://github.com/bitrise-io/envman/)` to store it in an Environment Variable. In this particular case, we define a variable in Bash, and use that variable as the value for our Env Var: + +``` +workflows: + example: + steps: + - script@1: + title: Do anything with Script step + inputs: + - content: |- + #!/usr/bin/env bash + # fail if any commands fails + set -e + # debug log + set -x + # creating the variable and storing it as an Env Var + my_variable='This is the value we need!' + envman add --key OUR_CONDITION --value "$my_variable" +``` + +We then create a simple `run_if` expression for the Step for which we need a condition. In this case, our Step is the **Save cache** Step, and we'll check if the value of the OUR_CONDITION variable matches the value stored in the previous Bash variable: + +``` +- save-cache@1: + run_if: |- + {{getenv "OUR_CONDITION" | eq "This is the value we need!"}} +``` + +Since the values match, the **Save cache** Step will run. diff --git a/src/partials/setting-up-saml-sso-between-bitrise-and-azure-ad.mdx b/src/partials/setting-up-saml-sso-between-bitrise-and-azure-ad.mdx new file mode 100644 index 0000000..cc930df --- /dev/null +++ b/src/partials/setting-up-saml-sso-between-bitrise-and-azure-ad.mdx @@ -0,0 +1,47 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up SAML SSO between Bitrise and Entra ID + +1. Click **Single sign-on** on the left menu. Select **SAML**. + + ![singlesignonazuread.png](/img/_paligo/uuid-9a20bdb0-2c68-3ce5-1f41-ac710e25b7be.png) +1. You will land on the **Set up Single Sign-On with SAML** page. + + ![sso2-1.jpg](/img/_paligo/uuid-6b74d41d-4d91-adb5-0d73-17380c293ab9.jpg) +1. Click the pencil symbol at **Basic SAML Configuration** to edit two fields. + + ![sso2a-1.jpg](/img/_paligo/uuid-954473da-632b-0628-2a76-9ff4471fcc9d.jpg) +1. Add `Bitrise` as the **Identifier (Entity ID)**. Leave this window open! We will come back to it with some information from Bitrise in a second. + + :::important[Multiple workspaces with the same Entra instance] + + If more than one Bitrise workspace uses the same EntraID instance, each workspace needs to be configured with its own distinct Entity ID. For each workspace, use its own Entity ID at any subsequent step in the process that requires it. + + For example, if you have an Alpha workspace and a Beta workspace, you can set **alpha** and **beta** as the Entity IDs. + + ::: + + ![sso3-2.jpg](/img/_paligo/uuid-39c02a1a-b3f2-3922-a9d1-fac312c98f92.jpg) +1. Head back to your workspace on Bitrise: open the **Workspace settings** page and go to **Single Sign-On** +1. If you have more than one workspace using the same Entra instance, add its own Entity ID in the **Application identifier** field. +1. Click the **Copy Link** button to copy the **Assertion Consumer Service URL (ACS URL)** from Bitrise. +1. Let’s head back to the **Basic SAML Configuration** window of Entra ID. +1. Paste the **Assertion Consumer Service URL** from Bitrise to the **Reply URL field on the Basic SAML Configuration** page of Entra ID. +1. Click **Save** and close the **Basic SAML Configuration** window. + + ![616541a82bf14.jpg](/img/_paligo/uuid-681bee8c-6be9-b47f-06fa-72a587e7add7.jpg) +1. On the **Single sign-on** page of Entra ID, scroll down to the **Set up Bitrise** section. +1. Copy the **Login URL** and paste it to the **SAML SSO provider Single Sign-On URL** **(SSO URL)** field on Bitrise. +1. On the **Single sign-on** page of Entra ID, scroll up a bit to the **SAML Signing Certificate** section. +1. Click **Download** next to **Certificate (Base64)** to download the certificate to your local computer. + + ![singlesignonsummary.jpg](/img/_paligo/uuid-da7593a8-e6df-1d97-e903-d375dc504b05.jpg) +1. Open the certificate file and copy/paste its content into the **SAML SSO provider certificate** field of Bitrise or you can upload the file itself from your local computer too. + + (If manually adding the content, you will need the full content (including `----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----` as well). +1. Open the **Workspace settings** page on Bitrise and go to **Single Sign-On**. +1. Click **Apply SSO configuration**. + +You have successfully set up Bitrise as a SAML SSO app on Entra ID. diff --git a/src/partials/setting-up-saml-sso-for-a-bitrise-workspace.mdx b/src/partials/setting-up-saml-sso-for-a-bitrise-workspace.mdx new file mode 100644 index 0000000..4e0c034 --- /dev/null +++ b/src/partials/setting-up-saml-sso-for-a-bitrise-workspace.mdx @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up SAML SSO for a Bitrise workspace + +In this tutorial, we describe how workspace owners can set up their SAML SSO and invite workspace members to set up their own connections. + +Before connecting SAML SSO to your workspace, you need: + +- A SAML SSO provider (Identity Provider) that you can connect Bitrise to and the administrator to the SAML SSO provider is at hand. +- An [owner or manager of the workspace](/en/bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration). Workspace members with the role of contributor or viewer can't set up SAML SSO. + +To start configuring SAML SSO: + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. Select the **Single Sign-On** tab on the left. +1. Click **Configure SAML SSO**. It opens the **Setup connection** screen. +1. Log in to your SAML SSO provider and add Bitrise as a SAML SSO application, using the values from the **Setup connection** screen in your Bitrise workspace settings: + + ![sso-setup.png](/img/_paligo/uuid-baadaff0-fbae-febb-cca3-077a707b1676.png) + + - Copy the **Assertion Consumer Service URL (ACS URL)** by clicking **Copy**. The provider sends the SAML response to the ACS URL. Some providers call it Reply URL, Callback URL, or Single Sign-On URL. + - Copy the **Single Logout URL** by clicking **Copy**. The provider sends the SAML logout response to the Single Logout URL. + + You will receive configuration values from your SAML SSO provider. +1. Add your SAML SSO provider configuration values: + + - **SSO URL**: Bitrise sends the SAML request to the SSO URL. Some providers call it Login URL. + - **SSO Logout URL (optional)**: Bitrise sends the SAML logout request to the SSO Logout URL. + - **Application Identifier (optional)**: This is necessary if multiple workspaces use the same identity provider. This may be called Entity ID, Audience URI, or something similar. +1. Upload the SAML SSO provider certificate. + + You can either upload the file or paste the certificate manually. + + ![sso-certificate.png](/img/_paligo/uuid-e1e79927-bba9-65ca-01a5-24ef83efe442.png) +1. Click **Save changes**. + +If you’ve completed the steps, you and workspace members should get a verification email about SAML SSO connected to the respective workspace. diff --git a/src/partials/setting-up-scim-provisioning-in-okta.mdx b/src/partials/setting-up-scim-provisioning-in-okta.mdx new file mode 100644 index 0000000..858cbd9 --- /dev/null +++ b/src/partials/setting-up-scim-provisioning-in-okta.mdx @@ -0,0 +1,62 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up SCIM provisioning in Okta + +You can set up SCIM provisioning for Bitrise using Okta. + +:::important[Managing Workspace groups] + +While SCIM is a great way to manage the access of your users for Bitrise Workspaces, you will have to do some initial configuration for your groups in Bitrise after finishing setting up the SCIM provisioning. For more information about configuring your groups, check out [Adding Workspace groups to a project](/en/bitrise-platform/projects/managing-user-access-to-a-project/adding-workspace-groups-to-a-project). + +::: + +We will be jumping back and forth from the Bitrise Workspace account to Okta, so make sure both pages are available. In practice, this means the Workspace owner should be logged into Bitrise, and the Okta admin should be logged in to Okta. + +1. On Bitrise, [configure domain control and generate your SCIM credentials](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim.html). You need to have: + + - A verified domain. + - An SCIM base URL and an SCIM authentication token. + + Make sure you save both of these because you will need them during the process later. +1. Log into Okta and click **Admin**. +1. From the left menu, select **Applications** under the **Applications** section. +1. Select your Bitrise app. +1. Click the **General** tab of your Bitrise app. +1. Click **Edit** next to the **App Settings** section and select the **SCIM** option using the radio button next to **Provisioning**. + + ![scim_setting.png](/img/_paligo/uuid-61cf9962-6cb6-6c24-74d4-132f9a1c066d.png) +1. Click **Save**. + + A new tab called **Provisioning** will appear. +1. Head back to Okta, and select the **Provisioning** tab, then click on **Edit**. +1. Paste the SCIM base URL you copied from Bitrise in the **SCIM connector base URL** field. +1. Add **userName** in the **Unique identifier field for users** field. + + ![scim_connection_2.png](/img/_paligo/uuid-96dabdf1-1006-5bdc-4457-92dfb91b8c70.png) +1. Select which provisioning actions you would like to enable using the checkboxes next to **Supported provisioning actions**. + + :::important[Push Groups are mandatory] + + Please note that you must enable Push Groups. This is because on Bitrise, Workspace membership works via groups and Okta/SCIM can control our Workspace groups via Push Groups. + + ::: +1. Select **HTTP Header** from the **Authorization Mode** dropdown menu. +1. Copy and paste your SCIM authentication token in the **Authorization** field. +1. Click **Test Connector Configuration** to test if everything is working correctly. + + ![test_connector.png](/img/_paligo/uuid-0d2d2b23-f9a9-d57d-3b14-44f085bfcc5f.png) +1. Close the **Test Connector Configuration** window and click **Save**. +1. Click the **Provisioning** tab of your Bitrise app, then click on **Edit** next to the **Provisioning to App** section. + + ![scim_provisioning.png](/img/_paligo/uuid-87a6ec99-9380-826b-9176-13034fefa22a.png) +1. Select which provisioning options you would like to enable and click **Save**. + + :::note[Sync password] + + We recommend keeping the **Sync Password** setting disabled. + + ::: + +That's it! You can now use SCIM provisioning in Okta to manage the access of your users to Bitrise. diff --git a/src/partials/setting-up-the-ec2-instance.mdx b/src/partials/setting-up-the-ec2-instance.mdx new file mode 100644 index 0000000..a7ef472 --- /dev/null +++ b/src/partials/setting-up-the-ec2-instance.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up the EC2 Mac or Linux instance + +To run Bitrise builds on an Amazon EC2 Mac or Linux instance, you need to: + +1. [Configure runner pools on Bitrise](#UUID-3c29d3e3-39ec-91ac-526a-a8e4ba8bd6ab): Set up a runner pool for your builds and get the token required to connect your Bitrise Workspace to your Amazon EC2 instance. +1. [Subscribe to the Bitrise AMI and launch an Amazon EC2 instance](#UUID-7547528d-d1ab-8e23-5367-d6d7ec761120). You can launch either an EC2 Mac or an EC2 Linux instance. For an EC2 Mac instance, you'll need to allocate a dedicated host before launching the instance. +1. [Use the token to connect the instance to your Bitrise Workspace](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup/launching-an-ec2-instance-for-the-bitrise-ami/connecting-the-instance-to-your-bitrise-workspace). This will allow the Bitrise agent to run your builds on your EC2 Mac or Linux instances. diff --git a/src/partials/setting-up-unity-licenses-on-bitrise.mdx b/src/partials/setting-up-unity-licenses-on-bitrise.mdx new file mode 100644 index 0000000..89e0bf6 --- /dev/null +++ b/src/partials/setting-up-unity-licenses-on-bitrise.mdx @@ -0,0 +1,68 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Setting up Unity licenses on Bitrise + +In alignment with Unity's policy, only paid plans are supporting command line… which means you need to add Unity license pools on Bitrise to be able to build a Unity project. Our build machines will be able to find the licence for your Workflow but you need to activate it by providing your Unity email address and password. + +:::important[Multiple licenses required] + +To run multiple builds concurrently, you need separate license keys for each build. For example, if you want to run three builds of a Unity app at the same time, you need at least three separate Unity licenses. + +::: + +### Adding Unity license pools + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Integrations**. +1. Select the **License pools** tab. +1. Click **Add license pool**. + + ![license_pools.png](/img/_paligo/uuid-260b6d8c-c6ae-d008-a72a-8b0552a1e348.png) +1. Fill out the fields. + + You must set: + + - A name: that's how you can find your pool in the Workflow Editor. + - An [Environment Variable](/en/bitrise-ci/configure-builds/environment-variables.html) key: this is how you can use the license in a build script. + - The license keys themselves. A license key can't have a space or any special character other than underscore in it. +1. Click **Save**. +1. Open the Workflow Editor for the app you need and go to the **Licenses** tab. +1. Select a license pool for each Workflow where you need them. + + ![license-wfe.png](/img/_paligo/uuid-bfc830a8-c22d-2fc3-1dab-16fba07460fa.png) + +### Activating a Unity license + +When trying to run a build, you need to activate your Unity license first. This requires providing your Unity email address and password. We recommend using [Secrets](/en/bitrise-ci/configure-builds/secrets.html) to store these. + +:::note[Deactivating a license] + +Once your build is finished, we strongly recommend deactivating the Unity license so you can reuse it: + +``` +/Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -logFile -returnlicense +``` + +::: + +1. Create two Secrets to store your email address and password. We recommend using the following keys: + + - UNITY_EMAIL, with your email address as the value. + - UNITY_PW, with your Unity password as a value. +1. Add the following code to a **Script** Step that comes after [the Step installing Unity software](/en/bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache/unity-on-bitrise/downloading-and-installing-unity-on-bitrise) in the Workflow: + + ``` + /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -serial "$UNITY_SERIAL" -username "$UNITY_EMAIL" -password "$UNITY_PW" -logfile + ``` + + :::tip[Use a Utility Workflow] + + A best practice is to create a [utility Workflow](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/utility-workflows) that contains this Step, and [run it before each Workflow](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together) that requires Unity. + + ::: diff --git a/src/partials/sharding-with-a-bitrise-step-calculating-the-test-split.mdx b/src/partials/sharding-with-a-bitrise-step-calculating-the-test-split.mdx new file mode 100644 index 0000000..fe6a13e --- /dev/null +++ b/src/partials/sharding-with-a-bitrise-step-calculating-the-test-split.mdx @@ -0,0 +1,63 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Sharding with a Bitrise Step calculating the test split + +You can have a Pipeline that automatically shards your tests based on an optimization algorithm provided by Bitrise Steps. This is supported for both iOS and Android projects. + +You need to: + +- Create a Pipeline that both builds and tests your app. +- Add the Steps performing the shard calculation to the Workflow that builds your app: the **[Xcode test shard calculation](https://bitrise.io/integrations/steps/xcode-test-shard-calculation)** Step for iOS projects and the **Gradle Runner** Step for Android projects. +- Configure parallelism so that multiple copies of the testing Workflow run in parallel. + + + + +1. Create [an Env Var](/en/bitrise-ci/configure-builds/environment-variables.html) that will contain the number of shards you need. For example, NUMBER_OF_SHARDS. +1. Add the [**Xcode test shard calculation**](https://bitrise.io/integrations/steps/xcode-test-shard-calculation) Step to your Workflow that builds your Xcode app. +1. Click the Step to open its options menu and go to the **Configuration** tab. +1. In the **Product path** input, add your new Env Var. + + ![shard-calculate-product-path.png](/img/_paligo/uuid-3474472d-9f45-e08c-37a0-82dcc3516481.png) +1. Add the **Deploy to Bitrise.io** Step to the same Workflow. +1. Find the **Pipeline Intermediate File Sharing** input group. +1. In the **Files to share between Pipeline stages** input, add two Env Vars: + + - BITRISE_TEST_SHARDS_PATH + - BITRISE_TEST_BUNDLE_PATH + + These are output variables automatically generated. + + ![shards-deploy-to-bitrise.png](/img/_paligo/uuid-2b040c7d-cbee-1050-4c6e-731d228fb547.png) +1. Open **Pipelines** and in your Pipeline, find the Workflow that runs your tests and click the gear icon to open the edit menu for the Workflow. +1. On the **Configuration** tab, open the **Pipeline Conditions** section. +1. Add the NUMBER_OF_SHARDS Environment Variable to the **Parallel copies** input. + + ![shards-pipeline.png](/img/_paligo/uuid-abd6b335-ae55-f91a-4cea-4a9df270ce2b.png) + + For more information about how to configure parallelism: [Parallelism in Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines). + + + + +1. Open your Pipeline and in the **Pipeline conditions** section, add the number of shards you need to the **Parallel copies** input. + + For more information about how to configure parallelism: [Parallelism in Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines). +1. Add the **Gradle Runner** Step to your Workflow. +1. Open the Step options and go to the **Configuration** tab. +1. In the **Config** input group, find the **Gradle task to run** input and add the following task to it: + + ``` + connectedAndroidTest \ + -Pandroid.testInstrumentationRunnerArguments.numShards=$BITRISE_IO_PARALLEL_TOTAL \ + -Pandroid.testInstrumentationRunnerArguments.shardIndex=$BITRISE_IO_PARALLEL_INDEX + ``` + + The $BITRISE_IO_PARALLEL_TOTAL and $BITRISE_IO_PARALLEL_INDEX environment variables will tell Gradle which tests to apply to each shard. + + ![gradle-runner.png](/img/_paligo/uuid-b3349767-289a-0a77-f7d6-0ae2c4752ef2.png) + + + diff --git a/src/partials/sharding-with-your-own-test-split-calculation.mdx b/src/partials/sharding-with-your-own-test-split-calculation.mdx new file mode 100644 index 0000000..eec6979 --- /dev/null +++ b/src/partials/sharding-with-your-own-test-split-calculation.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Sharding with your own test split calculation + +If you already have a means to calculate the optimal test split for sharding, you can set up test sharding by using the [parallelism](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines) feature in your Pipelines. + +Parellelism executes the same Workflow in parallel on separate virtual machines. You manually set the number of copies you need by setting the `parallel` property of a Workflow: + +``` +... +workflows: + test-without-building: + depends_on: [build-for-testing] + parallel: 5 +... +``` + +Each copy receives two new Environment Variables: + +- $BITRISE_IO_PARALLEL_INDEX: a zero based index for each copy of the Workflow. +- $BITRISE_IO_PARALLEL_TOTAL: the total number of copies. + +You can leverage these Environment Variables to run test sharding. For example, with Jest: + +``` +jest --shard=$((BITRISE_IO_PARALLEL_INDEX + 1))/$BITRISE_IO_PARALLEL_TOTAL +``` + +Or with yarn: + +``` +yarn test --ci --silent --shard=$((BITRISE_IO_PARALLEL_INDEX + 1))/$BITRISE_IO_PARALLEL_TOTAL +``` + +To read more about how to configure parallelism, check our guide: [Parallelism in Pipelines](/en/bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline/parallelism-in-pipelines). diff --git a/src/partials/sharing-a-new-step.mdx b/src/partials/sharing-a-new-step.mdx new file mode 100644 index 0000000..57be1a2 --- /dev/null +++ b/src/partials/sharing-a-new-step.mdx @@ -0,0 +1,90 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Sharing a new Step + +The sharing process is relatively straightforward - but please make sure to go through the process carefully when sharing a new Step. + +:::note[The bitrise share command] + +During Step development, you can get help anytime by simply running bitrise share. This will print a short guide on sharing. + +::: + +There are two ways to share a Step: + +- You can do it manually, using the `bitrise share` command. +- If you created the Step with the Step plugin, you can run the `share-this-step` Workflow in your Step’s directory. + +### Before you start + +Before you start, make sure that: + +- Your Step is in a public Git repository. +- The step.yml file contains a support_url property which points to a valid issue tracker (for example, the **Issues** page of your Step’s GitHub repository). +- The step.yml file contains a source_code_url property which points to the correct Git URL of your repository. + +:::important[Sharing more than one Step] + +Sharing more than one Step - that is, adding more than one new step.yml file to the Bitrise StepLib - must be done in separate pull requests! You cannot open a pull request that contains more than one new Step! + +::: + +If you’re ready, go ahead with your preferred sharing process! + +### Sharing with the bitrise share command + +1. Fork the [Bitrise StepLib](https://github.com/bitrise-io/bitrise-steplib.git) repository. +1. Prepare your forked StepLib locally for sharing: + + ``` + $ bitrise share start -c + ``` +1. Add the Step version tag to your Step’s repository. +1. Add the Step to your forked StepLib repository: + + ``` + $ bitrise share create --tag [step-version-tag] --git [step-git-uri].git --stepid [step-id] + ``` +1. Optionally, perform a complete health check on your forked StepLib: + + ``` + $ bitrise share audit -c + ``` +1. Review your Step’s step.yml file, and if you’re happy with it, finish the share process: This commits and pushes the step.yml file to the forked StepLib repository. + + ``` + $ bitrise share finish + ``` + + This commits and pushes the step.yml file to the forked StepLib repository. +1. Open a pull request in the official [Bitrise StepLib](https://github.com/bitrise-io/bitrise-steplib.git) repository. + +### Sharing with the share-this-step Workflow + +The share-this-step Workflow is included in the bitrise.yml file that the Step plugin automatically generates when you create a new Step with it. Using it, sharing a Step is incredibly easy: + +1. Fork the [Bitrise StepLib](https://github.com/bitrise-io/bitrise-steplib.git) repository. +1. Set the required Workflow Environment Variables as app level Environment Variables in the bitrise.yml file: + + ``` + app: envs: - BITRISE_STEP_ID: - BITRISE_STEP_VERSION: - BITRISE_STEP_GIT_CLONE_URL: - MY_STEPLIB_REPO_FORK_GIT_URL: + ``` +1. Run the share-this-step Workflow in the Bitrise CLI: + + ``` + $ bitrise run share-this-step + ``` + +### Fixing issues in a StepLib pull request + +Once you submitted your Step version to the StepLib, wait for the Bitrise team to review it. If we ask for changes: + +1. Close the pull request. +1. Delete the share branch from your fork of the Bitrise StepLib. +1. Fix the issues in the Step repository. +1. Add a new version tag to the commit that contains your fixes in the Step repository. +1. Run the [share process](/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users/sharing-a-new-step) again. + +Hopefully, after fixing the issues, we’ll be able to merge your pull request and release your Step to the public! diff --git a/src/partials/sharing-env-vars-between-stages.mdx b/src/partials/sharing-env-vars-between-stages.mdx new file mode 100644 index 0000000..17754cd --- /dev/null +++ b/src/partials/sharing-env-vars-between-stages.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Sharing Env Vars between Pipeline Stages + +You can reuse any environment variable from a Workflow and reuse it in subsequent Workflows using the [Share Pipeline variables](https://github.com/bitrise-steplib/bitrise-step-share-pipeline-variable) Step. + +:::tip[Optional Workflows using run_if conditions] + +You can easily combine the **Share Pipeline variables** Step with `run_if` expressions to create Pipelines with optional Workflows. For more information, check out [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). + +::: + +To do so: + +1. Add the **Share Pipeline variables** Step to the Workflow. +1. Optionally, you can define additional run conditions in the **Additional run conditions** input. The Step will only run if the conditions you specify here are true. +1. Add the Env Var(s) you would like to use in subsequent Workflows in the **Variables to share between Pipeline Workflows** input. + + :::tip[Using environment variable keys] + + You can define Env Vars using a `{key}={value}` syntax. For example, `MY_ENV_KEY=value`, or `INSTALL_PAGE_URL=$BITRISE_PUBLIC_PAGE_URL`. + + If you want to use the default environment variable keys, you can use a shorthand syntax. For example, `EXISTING_ENV_KEY`. + + Sharing Env Vars using this Step does not override existing Env Vars defined in the app. + + ::: + +That's it! You can now use the Env Var in any subsequent Stage! diff --git a/src/partials/signing-an-android-app-bundle-file.mdx b/src/partials/signing-an-android-app-bundle-file.mdx new file mode 100644 index 0000000..5992c47 --- /dev/null +++ b/src/partials/signing-an-android-app-bundle-file.mdx @@ -0,0 +1,97 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Signing an Android App bundle + +Signing an Android App Bundle file works the same way as signing an APK: the most convenient method is to upload your keystore files to Bitrise and use the **Android Sign** Step: + + + + +1. Upload your keystore file to Bitrise. +1. Open your Workflow in the Workflow Editor, and add the **Android Sign** Step AFTER the build Step. +1. Make sure that the **Keystore password**, **Key alias** and the **Key password** input fields are filled out. + + :::tip[Default input values] + + If you have uploaded your keystore file and filled out the required credentials, the **Android Sign** Step's **Keystore url**, **Keystore password**, **Keystore alias**, and the **Private key password** inputs will get populated automatically! + + ::: +1. Make sure the **App file path** input field displays the same output env var as the output of the build Step you've been using. + + For example, **Android Build** exports either a $BITRISE_APK_PATH or a $BITRISE_AAB_PATH Env Var that points to the APK and/or AAB file the Step generated. By default, this input points at these Env Vars. + + ![Generating_and_deploying_Android_app_bundles.jpg](/img/_paligo/uuid-8b24a99b-a80b-f23a-7708-af1136ffbedb.jpg) + + :::tip[Further configuration options] + + Check out all the available configuration options of the **Android Sign** Step in the Workflow Editor. You can: + + - Enable or disable memory page alignment with the **Page alignment** input. + - Use `apksigner` instead of the default `jarsigner` with the **Enables apksigner** input. + - Enforce a specific [Signature Scheme](https://source.android.com/docs/security/features/apksigning#schemes) with the **APK Signature Scheme** input. + + ::: + + + + +1. Upload your keystore file to Bitrise. +1. In your app's Configuration YAML file, add the `sign-apk` Step AFTER the build Step - for example, `android-build` - in your Workflow. + + ``` + sign-android-workflow: + steps: + - android-build: {} + - sign-apk@1: + inputs: + ``` +1. Make sure that the `keystore_url`, `keystore_password`, and `keystore_alias` inputs point to the correct location. + + ``` + sign-android-workflow: + steps: + - android-build: {} + - sign-apk@: + inputs: + - keystore_url: "$BITRISEIO_ANDROID_KEYSTORE_URL" + - keystore_password: "$BITRISEIO_ANDROID_KEYSTORE_PASSWORD" + - keystore_alias: "$BITRISEIO_ANDROID_KEYSTORE_ALIAS" + ``` + + :::tip[Default input values] + + If you have uploaded your keystore file to Bitrise and filled out the required credentials, you do not have to set the inputs at all: the default values, defined in the Step's `step.yml` configuration file, will point to the keystore file and the necessary credentials. + + ::: +1. Make sure the `android_app` input field displays the same output Env Var as the output of the build Step you've been using. + + For example, `android-build` exports either a $BITRISE_APK_PATH or a $BITRISE_AAB_PATH Env Var that points to the APK and/or AAB file the Step generated. By default, this input points at these Env Vars. + + The Step will look for a binary to sign at the locations provided in this input. + + ``` + sign-android-workflow: + steps: + - android-build: {} + - sign-apk@1: + inputs: + - keystore_url: "$BITRISEIO_ANDROID_KEYSTORE_URL" + - keystore_password: "$BITRISEIO_ANDROID_KEYSTORE_PASSWORD" + - keystore_alias: "$BITRISEIO_ANDROID_KEYSTORE_ALIAS" + - android_app: "$BITRISE_APK_PATH\\n$BITRISE_AAB_PATH" + ``` + + :::tip[Further configuration options] + + Check out all the available configuration options of the `android-sign` Step in [its step.yml file](https://github.com/bitrise-steplib/steps-sign-apk/blob/master/step.yml). You can: + + - Enable or disable memory page alignment with the `page_align` input. + - Use `apksigner` instead of the default `jarsigner` with the `use_apk_signer` input. + - Enforce a specific [Signature Scheme](https://source.android.com/docs/security/features/apksigning#schemes) with the `signer_scheme` input. + + ::: + + + diff --git a/src/partials/signing-an-ipa-file-with-a-different-teams-code-signing-file.mdx b/src/partials/signing-an-ipa-file-with-a-different-teams-code-signing-file.mdx new file mode 100644 index 0000000..66240ed --- /dev/null +++ b/src/partials/signing-an-ipa-file-with-a-different-teams-code-signing-file.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Signing an IPA file with a different team’s code signing file + +You might want to sign the IPA file with a different team’s code signing files. For example: + +- If you use your company’s code signing files for internal builds, but your client’s code signing files are used for App Store distribution. +- If you use Apple ID for automatic code signing and the Apple ID belongs to multiple teams, use The Developer Portal team to use for this export input to specify which team should be used for automatic code signing asset management. + +To do so: + +1. Make sure the right code signing files of the new development team are uploaded to Bitrise. +1. Set the The Developer Portal team to use for this export option as well (in addition to the **Distribution method**). +1. Set the **Distribution method**. diff --git a/src/partials/signing-and-deploying-multi-flavor-apks.mdx b/src/partials/signing-and-deploying-multi-flavor-apks.mdx new file mode 100644 index 0000000..af484ea --- /dev/null +++ b/src/partials/signing-and-deploying-multi-flavor-apks.mdx @@ -0,0 +1,19 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Signing and deploying multi-flavor APKs + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add one **Android Sign** Step AFTER the **Gradle Runner** Step if it’s missing from your Workflow. +1. Set the **App file path** input to `$BITRISE_APK_PATH_LIST` or `$BITRISE_AAB_PATH_LIST` depending on which app format you built in the previous **Gradle Runner** Step. + + This will make sure all APKs or AABs get code signed with the keystore file you uploaded to the **Code Signing** tab. The Step will export either the `$BITRISE_SIGNED_APK_PATH_LIST` or the `$BITRISE_SIGNED_AAB_PATH_LIST` Environment Variable output which contains the path of the signed app files for each build variant. +1. Make sure you set the following input fields in the **Android Sign** Step: + + - **Keystore url** + - **Keystore password** + - **Keystore alias** +1. Add the **Google Play Deploy** Step AFTER the **Android Sign** Step. +1. Set the `$BITRISE_SIGNED_APK_PATH` or the `$BITRISE_SIGNED_AAB_PATH` Environment Variable in the **APK or App Bundle file path** Step input field so that the **Google Play Deploy** Step can release all your build variants to the app store. diff --git a/src/partials/signing-up-with-a-git-provider.mdx b/src/partials/signing-up-with-a-git-provider.mdx new file mode 100644 index 0000000..e3658f6 --- /dev/null +++ b/src/partials/signing-up-with-a-git-provider.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Signing up with a Git provider + +1. You can sign up for Bitrise through the **Start for free** button in the upper right corner of [Bitrise](https://www.bitrise.io/). It will take you to the **Sign up** page. +1. On the **Sign up** page, scroll down to the **Or sign up with your git provider** section where you can pick a git provider. +1. Authorize your selected Git provider. + + If you chose GitHub, press the **Authorize bitrise-io** button, and then you will be redirected to Bitrise. + + ![authorize_github.png](/img/_paligo/uuid-245d62ac-c277-cae8-0f6d-6d60ae23bb70.png) + + If you chose Bitbucket, press the **Grant access** button on Bitbucket, and then you will be redirected to Bitrise. + + ![authorize-bitbucket.png](/img/_paligo/uuid-2b51312c-d04b-29f9-c83a-14dcfa9306d2.png) + + If you chose GitLab, press the **Authorize** button, and then you will be redirected to Bitrise. + + ![authorize-gitlab.png](/img/_paligo/uuid-78feab6d-8731-8d33-b453-bbf6b14a781c.png) +1. Pick a username and a password. When done, click **Sign up**. + + :::important[Strong password] + + Please note that you must provide a **strong password** which fulfills these requirements: + + - It should have at least 8 characters. + - One upper case character. + - One lower case character. + - One number. + - Cannot contain the same character more than 3 times in a row (aaa). + - Cannot contain your email or username. + + ::: + +After that, you are ready to roll. Your first workspace will be created automatically, and you will be redirected to the **Getting Started** page, where you can rename your workspace, run a demo project, or start adding new projects! diff --git a/src/partials/signing-up-with-email.mdx b/src/partials/signing-up-with-email.mdx new file mode 100644 index 0000000..fd0d98d --- /dev/null +++ b/src/partials/signing-up-with-email.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Signing up with email + +:::note[Don't use the + character] + +Please note that if you want to sign up for Bitrise with an email address, the address cannot contain the character **+**. + +::: + +1. You can sign up for Bitrise through the **Start for free** button in the upper right corner of [Bitrise](https://www.bitrise.io/). It will take you to the **Sign up** page. + + ![sign_up.png](/img/_paligo/uuid-d7118397-afd2-fcec-a464-e6537b882068.png) +1. Add your email address, username, and password. + + :::important[Strong password] + + Please note that you must provide a **strong password** which fulfills these requirements: + + - It should have at least 8 characters. + - One upper case character. + - One lower case character. + - One number. + - Cannot contain the same character more than 3 times in a row (aaa). + - Cannot contain your email or username. + + ::: +1. Check the **I agree to the Bitrise Terms of Service & Privacy Policy**, and click the **Sign up** button. +1. Check your inbox for a confirmation email from Bitrise and follow the instructions there. If you haven’t received a confirmation email from us, click the **Resend confirmation email** button. + + ![checkyourinbox.png](/img/_paligo/uuid-06a9ef1f-701a-678b-cc0c-8aad5c078cd2.png) + +And that's it! After confirming your account, your first Workspace will be created automatically, and you will be redirected to the **Getting Started** page. You can rename your Workspace, run demo apps, or start adding new apps! + +![get_started_bitrise.png](/img/_paligo/uuid-cfb7fa41-a106-26b8-af03-a12058f5639f.png) diff --git a/src/partials/signing-your-android-app.mdx b/src/partials/signing-your-android-app.mdx new file mode 100644 index 0000000..e255718 --- /dev/null +++ b/src/partials/signing-your-android-app.mdx @@ -0,0 +1,29 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Signing your Android app + +In order to publish an Android app to Google Play, you need to digitally sign the app. Bitrise can also do this for you: you'll just need to upload a keystore file, and provide the necessary authentication. + +:::note[Other code signing options] + +In this section, we'll go through how to sign an Android app with the Android Sign Step. There are other ways to sign your app - check out the other options in our relevant guides: [Android code signing](/en/bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step.html). + +::: + +1. [Generate a keystore file](https://developer.android.com/studio/publish/app-signing#generate-key)[Generate a keystore file](https://reactnative.dev/docs/signed-apk-android#generating-an-upload-key). + + 1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + 1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Code signing** from the menu. +1. Drag-and-drop your keystore file to the **ANDROID KEYSTORE FILE** field. +1. Fill out the **Keystore password**, **Keystore alias**, and **Private key password** fields and click **Save metadata**. + + ![keystore-alias.png](/img/_paligo/uuid-0b79fc48-3861-0744-0f53-53a6c65ffc2c.png) +1. Open the Workflow Editor. +1. Add the **Android Sign****Generate cordova build configuration** Step to your Workflow. + +And that's it. The next time you'll run a build, the **Android Sign** Step will sign the generated binary. diff --git a/src/partials/skipping-a-build-triggered-by-a-draft-pull-request.mdx b/src/partials/skipping-a-build-triggered-by-a-draft-pull-request.mdx new file mode 100644 index 0000000..1941bb9 --- /dev/null +++ b/src/partials/skipping-a-build-triggered-by-a-draft-pull-request.mdx @@ -0,0 +1,76 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Triggering builds from draft PRs + +GitHub and GitLab offers a feature called [draft pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests) (or merge request in the case of GitLab): when you create a pull request (PR), you can choose to create a pull request that is ready for review or a draft pull request. Draft pull requests cannot be merged, and code owners are not automatically requested to review draft pull requests. + +:::important[Git provider limitations] + +This feature is only supported for GitHub and GitLab repositories. + +::: + +By default, opening a draft PR triggers builds. You can disable this at any time. + +If opening a draft PR triggers a build, submitting it for review (converting it to "full" PR, in other words) will not trigger another. You can check out the exact code events that trigger builds depending on the draft PR trigger settings: [see topic](#UUID-6d1aaadd-62ca-4d11-16d4-2772e29d2cad). + +Each separate trigger has its own toggle: you can configure your app so that certain triggers start a build from draft PRs while other triggers don't. + +### Disabling builds from a draft PR + +:::tip[Skipping Steps if a build is triggered by a draft PR] + +This guide tells you how to disable triggering builds from a draft PR altogether. You can, however, also skip certain Steps in a build that is triggered by a draft pull request. You just need to use a `run_if` condition and the GITHUB_PR_IS_DRAFT Environment Variable: for more information, see [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). + +::: + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Open your Workflow and select the **Triggers** tab. + + If you have a Pipeline, you can only disable the setting in the configuration YAML file. +1. Find the trigger you need and click the vertical ellipsis next to its name. +1. Select **Edit trigger** from the menu. + + ![edit-trigger.png](/img/_paligo/uuid-7e1fea02-d6ed-650a-043c-d8bb81c5f98e.png) +1. Uncheck the **Include draft pull requests** option and click **Apply changes**. + + + + +1. Open your configuration YAML file. +1. Find the `triggers` element in all Workflows or Pipelines you want to modify. +1. Add `draft_enabled: false` to the trigger entries you need. + + ``` + triggers: + pull_request: + - target_branch: "develop" + draft_enabled: false + - target_branch: "main" + draft_enabled: false + - comment: 'run Bitrise' + ``` + + This will start workflows for non-draft PRs against the develop branch and the main branch, or anytime `run Bitrise` is commented on any PR. + + + + +### Build trigger behavior for draft PRs + +The table shows whether a build is triggered when a specific action is performed regarding draft PRs, depending on the draft PR trigger settings. For example, converting a draft PR to a PR doesn't trigger a build if the draft PR trigger is enabled but it does trigger a build when it's disabled. + +| Action | Draft PR trigger is enabled | Draft PR trigger is disabled | +| --- | --- | --- | +| Open a draft PR | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Push a commit to a draft PR | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Convert a draft PR to PR | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Convert PR to draft PR | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | diff --git a/src/partials/skipping-a-comment.mdx b/src/partials/skipping-a-comment.mdx new file mode 100644 index 0000000..dfd3dd4 --- /dev/null +++ b/src/partials/skipping-a-comment.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Skipping a comment + +PR comments can trigger builds but if you want to prevent that, you can skip a build by adding `[skip ci]` / `[ci skip]` or `[skip bitrise]` /`[bitrise skip]` in the build's PR comments. + +If you use tools that automatically comment on PRs and that starts a build, configure your tool to include a skip command in its comments. diff --git a/src/partials/skipping-bitrise-ci.mdx b/src/partials/skipping-bitrise-ci.mdx new file mode 100644 index 0000000..74f8e1b --- /dev/null +++ b/src/partials/skipping-bitrise-ci.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Skipping Bitrise CI + +If you manage multi-vendor or multi-platform CI workflows, you might want to skip builds on multiple systems or just on Bitrise. + +To skip builds on multiple vendors, use the `skip ci` or `ci skip` keywords. + +To skip builds on Bitrise only, use the `skip bitrise` or the `bitrise skip` keywords in your commit messages to prevent Bitrise builds from triggering. With these Bitrise-specific skip keywords, you get finer granularity and avoid unintentionally skipping builds on other parts of your CI pipeline. diff --git a/src/partials/source-code.mdx b/src/partials/source-code.mdx new file mode 100644 index 0000000..494693c --- /dev/null +++ b/src/partials/source-code.mdx @@ -0,0 +1,7 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Source code + +We don’t store your source code. The source code is only accessed on the build machines (virtual machines) the way you define it in your [Bitrise configuration](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file). If you don’t have a **Git Clone** Step or some other Step that accesses your Git repository in your configuration, then the source code won’t be touched at all. At the end of the build the whole virtual machine is destroyed. As such, any change you made to your source code on the virtual machine will be lost unless you commit your changes and push them to a remote repository. diff --git a/src/partials/special-step-sources.mdx b/src/partials/special-step-sources.mdx new file mode 100644 index 0000000..dff4175 --- /dev/null +++ b/src/partials/special-step-sources.mdx @@ -0,0 +1,44 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Special Step sources + +There are two special Step sources: + +- `git::` +- and `path::` + +When you use one of these sources, the Step won’t be identified through a Step Library but through the ID data you specify. + +### The git:: source + +The `git::` source is the repository of the Step on your git hosting provider. The `script` Step’s GitHub source is: `https://github.com/bitrise-io/steps-script`. To reference the `script` Step directly through a git reference, you can use the `git::` source, the Step’s git clone URL, and the branch or tag in the repository. + +To reference the `1.1.3` version tag of the script Step’s repository: + +``` +- git::https://github.com/bitrise-io/steps-script.git@1.1.3: +``` + +In general, whenever you can use a Step version through a Step Library, you should do that, instead of using the `git::` source type. Features like local step caching, network caching, or alternative download URLs are only supported for Steps shared in a StepLib. + +But this type of referencing allows certain things you can’t get through a StepLib. For example, the `git::` source type can be used for not-yet-published or work-in-progress states of a Step. If you develop your own Step, you can use this `git::` source type to test your step before you publish it in a StepLib. + +To reference `soon-to-be-released` branch of your repository where you're developing a Step: + +``` +- git::https://github.com/bitrise-io/steps-script.git@soon-to-be-released: +``` + +### The path:: source + +The `path::` source specifies a local path to a Step's repository, and it requires no version information. Both absolute and relative local paths are supported. A relative path is relative to the folder containing the `bitrise.yml` file. + +``` +- path::/path/to/my/step: + +- path::./relative/path: +``` + +This is useful for Step development. It can also be used if you want to include your build Steps in your project’s source code. diff --git a/src/partials/ssh-key-authorization.mdx b/src/partials/ssh-key-authorization.mdx new file mode 100644 index 0000000..926b2f1 --- /dev/null +++ b/src/partials/ssh-key-authorization.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## SSH key authorization + +If your repository URL is an SSH URL and you use an OAuth connection, you can authorize Bitrise with SSH keys. + +SSH key authorization requires a public and private SSH key. The public key is registered to your Bitrise project's Git repository. Information encrypted with the public key requires the private key, registered at Bitrise, to be decrypted. + +You can add an SSH key pair when adding a new project on Bitrise or you can configure them later at the **Project settings** page. You have the option to: + +- **Auto-add a generated SSH key to your repository**: Bitrise automatically registers a public SSH key to your GitHub repository. Choose this if you have administrator rights to the repository. +- **Copy a generated SSH key to your Git provider manually**: Bitrise generates an SSH keypair for you, and you have to manually register the public key to your Git repository. +- **Add your own SSH key**: You provide your own SSH keypair for authentication, and you have to manually register the public key to your Git repository. + +Set up SSH key authorization: [Configuring SSH keys](/en/bitrise-platform/repository-access/configuring-ssh-keys). diff --git a/src/partials/starting-a-build-basic-options-steps.mdx b/src/partials/starting-a-build-basic-options-steps.mdx new file mode 100644 index 0000000..d9e5d8c --- /dev/null +++ b/src/partials/starting-a-build-basic-options-steps.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Enter the branch you want to run into the **Source branch** input field. + + You can choose between typing the name or selecting it from a dropdown menu. Click **Select branch** to bring up the dropdown menu. + + You can only set one branch. If a pull request to your repository is made from a forked branch, type the name of that branch to run a build of the pull request. + + :::important[Pull request build] + + Starting a build of a pull request’s branch is NOT the same as a pull request build. The manually started build of a pull request branch will only build the state of the code on that branch. An automatically triggered pull request build, however, builds the state of the code as it will look like once you merged the pull request. + + ::: +1. Optionally, enter a build message in the **Message** field. + + Please note that entering the Git commit message of a specific commit doesn't trigger a build of that commit! +1. From the **Target** menu, select a Workflow or Pipeline. + + If you don't select one, Bitrise will choose a Workflow or Pipeline based on your app's [trigger setup](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.html). diff --git a/src/partials/starting-the-offline-workflow-editor.mdx b/src/partials/starting-the-offline-workflow-editor.mdx new file mode 100644 index 0000000..3c49c0d --- /dev/null +++ b/src/partials/starting-the-offline-workflow-editor.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Starting the offline Workflow Editor + +1. `cd` into a directory where you have your `bitrise.yml`. +1. Run `bitrise :workflow-editor` command to start your offline session. + +Here is the overall look and feel: + +![Installing_and_upgrading_the_offline_Workflow_Editor.png](/img/_paligo/uuid-29b363bc-ce14-f6a3-f310-62543138452e.png) diff --git a/src/partials/startingscheduling-a-build-first-two-steps.mdx b/src/partials/startingscheduling-a-build-first-two-steps.mdx new file mode 100644 index 0000000..f8fa97f --- /dev/null +++ b/src/partials/startingscheduling-a-build-first-two-steps.mdx @@ -0,0 +1,7 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. On the **Bitrise CI** page of your app, find the **Start build** button and click the button with the clock icon next to it. + + ![scheduling-builds.png](/img/_paligo/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png) diff --git a/src/partials/step-bundle-properties.mdx b/src/partials/step-bundle-properties.mdx new file mode 100644 index 0000000..1548968 --- /dev/null +++ b/src/partials/step-bundle-properties.mdx @@ -0,0 +1,115 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Step bundle properties + +### `step_bundles::title`** + +```yaml +step_bundles: + test: + title: Test bundle +``` + +### `step_bundles::summary` + +A short summary of the Step bundle. Optional. + +**Example of `step_bundles::summary`** + +```yaml +step_bundles: + test: + summary: "It's a bundle to test Step bundles." +``` + +### `step_bundles::description` + +A detailed description of the Step bundle. + +**Example of `step_bundles::description`** + +```yaml +step_bundles: + test: + description: "This Step bundle allows users to try out Step bundles on Bitrise. It includes a Git Clone Repository Step and a Script Step." +``` + +### `step_bundles::envs` + +The Environment Variables that are only available for the Step bundle. Steps outside the bundle can't access the variables defined here! As all Env Vars, it takes a key and a value. + +**Example of `step_bundles::envs`** + +```yaml +step_bundles: + test: + envs: + - MY_ENV: "value" +``` + +### `step_bundles::inputs` + +Inputs defined for the Step bundle: these are values that can be set when the Step bundle is added to a Workflow. + +Read more: [Step bundles](/en/bitrise-ci/workflows-and-pipelines/steps/step-bundles). + +**Example of `step_bundles::inputs`** + +```yaml +step_bundles: + test: + inputs: + - my_input: my_value +``` + +### `step_bundles::execution_container` + +The default execution container for all Steps in this bundle. Can be overridden at the call-site or by individual Steps. + +Read more: [About Docker containers on Bitrise](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise). + +**Example of `step_bundles::execution_container`** + +```yaml +step_bundles: + test: + execution_container: + test-container: {} +``` + +### `step_bundles::service_containers` + +The default service containers for all Steps in this bundle. Can be overridden at the call-site. + +**Supported values**: + +Read more: [Service containers](/en/bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers). + +**Example of `step_bundles::service_containers`** + +```yaml +step_bundles: + test: + service_containers: + test-container: {} +``` + +### `step_bundles::steps` + +The Steps included in the Step bundle. + +**Example of `step_bundles::steps`** + +```yaml +step_bundles: + test: + steps: + - git-clone: {} + - script: {} +``` diff --git a/src/partials/step-categories.mdx b/src/partials/step-categories.mdx new file mode 100644 index 0000000..80500aa --- /dev/null +++ b/src/partials/step-categories.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Step categories + +There is another thing we’d like to know about your Step: what type of Step is it? As you can see on our Integrations page or on the Workflow Editor, Steps are sorted into different categories based on two factors: the platforms for which they are available and their functionality. + +### Platforms + +The available platform types are controlled by the project_type_tags attribute. If your Step is available for every platform or project type, do not specify project_type_tags. In any other case, select all platform types for which your Step is available. + +The available values are: + +- `ios` +- `macos` +- `android` +- `react-native` +- `cordova` +- `ionic` +- `flutter` + +### Category + +Functional categories are controlled by the type_tags attribute in the `step.yml`. One Step should have only a single type tag assigned to it. Use `utility` only if you believe none of the other types fit your Step. + +The available values are: + +- `build` +- `code-sign` +- `test` +- `deploy` +- `notification` +- `access-control` +- `artifact-info` +- `installer` +- `dependency` +- `utility` diff --git a/src/partials/step-input-properties.mdx b/src/partials/step-input-properties.mdx new file mode 100644 index 0000000..b9c5b59 --- /dev/null +++ b/src/partials/step-input-properties.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Step input properties + +- `title`, `summary` and `description` : metadata, for comments, tools and GUI. + + :::tip[Meta properties as permanent comments] + + These meta properties can be used for permanent comments. Standard YML comments are not preserved when the YML is normalized, converted to JSON or otherwise generated or transformed. These meta properties are. + + ::: +- `is_expand` : can be set to `true` or `false`. The default value is `true` so the Bitrise CLI expands Environment Variables (Env Vars) before passing it on to the Step. That means that if a Step input's value is an Env Var, the Bitrise CLI will pass the variable's value to the Step. If set to `false`, the CLI will pass the Env Var's key as a string. +- `skip_if_empty` : can be set to `true` or `false`. If set to `true`, the input will not be used if its value is empty. +- `category` : used to categorize the input. Inputs with the same `category` will appear grouped under one menu on the website UI, for the sake of convenience. +- `value_options` : list of the available values. +- `is_required` : can be set to `true` or `false`. If set to `true`, the step requires a non-empty value to be set for the input. +- `is_dont_change_value` : can be set to `true` or `false`. If set to `true`, the value of the input should not be changed and/or should be hidden on UIs. Mainly used for debug inputs and for “**connection**” inputs (set to outputs of other Steps, to connect this Step with another one). +- `is_template` : can be set to `true` or `false`. If set to `true` + + , + + the input’s value will be evaulated as a Go template. +- `is_sensitive`: marking an input as sensitive means that it will only accept a Secret Environment Variable as its value. It is most frequently used for sensitive information such as passwords, API keys, tokens, but any input can be marked sensitive. diff --git a/src/partials/step-inputs.mdx b/src/partials/step-inputs.mdx new file mode 100644 index 0000000..0c11991 --- /dev/null +++ b/src/partials/step-inputs.mdx @@ -0,0 +1,45 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Step inputs + +Step inputs are Bitrise [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html): they consist of a key and value pair that users of the Step can set to control the Step behavior. For example, the **Git Clone** Step has an input with the key branch: + +``` +title: Git Clone Repository +summary: Clone a repository to the specified path on the VM +inputs: +- branch: master +``` + +The value of this input - master in the above example - is used to determine which branch of the repository will be cloned. + +Step inputs are visible on the Workflow Editor: they are presented in the order as they appear in the `step.yml`. As such, required and frequently used inputs should be at the top. + +### Step input keys and values + +Use lower case [snake case](https://en.wikipedia.org/wiki/Snake_case) style input keys. For example, project_path. + +:::warning[Using `opts` as an input key] + +The input key can not be `opts`, as it is a reserved word used for the input’s options. + +::: + +There is no need to add domain-specific prefixes to the input keys, as inputs are only exposed for the Step run process. This means project_path input will not overlap with subsequent Steps’ project_path inputs. + +Step input values are strings: the Bitrise CLI exposes the Step inputs as Environment Variables to the Steps. + +Provide default values for Step inputs if possible (and if it makes sense). That makes the Step configuration easier for Bitrise users. + +Environment Variables must not be used as default values, unless: + +- They are exposed by the [Bitrise CLI or by bitrise.io](). +- They are generated as an output by another Step (for example, $BITRISE_IPA_PATH, $BITRISE_AAB_PATH). + +This is because the Workflow Editor highlights required inputs without values to express the Step will not work without setting a valid value for the given input. If you set an Env Var, which does not have an automatically assigned value, as the default value for an input, the Workflow Editor will think the required input in question has a valid value set (even if the default Env Var has no value yet). + +Also, there is no reason to suggest a certain name for an Environment Variable this way: users might have the same value assigned to an Env Var with a different name. + +Let’s talk about how Step inputs are passed to code and how they are presented. diff --git a/src/partials/step-level-properties.mdx b/src/partials/step-level-properties.mdx new file mode 100644 index 0000000..c426d79 --- /dev/null +++ b/src/partials/step-level-properties.mdx @@ -0,0 +1,168 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Step level properties + +### `steps::title` + +The title of the Step. + +This appears on the Workflow Editor, replacing the Step ID. + +**Example of `steps::title`** + +```yaml +workflows: + steps: + - script@1: + title: Test sharding script +``` + +### `steps::summary` + +A short summary of the Step. + +**Example of `steps::summary`** + +```yaml +workflows: + steps: + - script@1: + summary: Custom script for sharding. +``` + +### `steps::description` + +A detailed description of the Step. + +**Example of `steps::description`** + +```yaml +workflows: + steps: + - script@1: + summary: A custom script for setting up test sharding for Flutter unit tests. +``` + +### `steps::is_always_run` + +If this property is true, the Step will always run, even if a previous Step in the Workflow failed. + +By default, if a previous Step fails in the Workflow, subsequent Steps will not run. A Step will only run if this property is set to `true`. + +**Supported values**: boolean + +Read more: [Skipping Steps](/en/bitrise-ci/workflows-and-pipelines/steps/skipping-steps). + +**Example of `steps::is_always_run`** + +```yaml +workflows: + primary: + steps: + - script: + is_always_run: true +``` + +### `steps::is_skippable` + +If this property is true, the build won't fail even if this Step fails. + +By default if a Step fails, subsequent Steps are not executed. If the first failing step has this property set to `true`, it won't make the build fail. Subsequent Steps will still run and the build can finish successfully. + +**Supported values**: boolean + +**Example of `steps::is_skippable`** + +```yaml +workflows: + primary: + steps: + - script: + is_skippable: true +``` + +### `steps::run_if` + +This property sets conditions for running a Step. It requires a valid Go template expression. + +A `run_if` can be any valid Go template, as long as it evaluates to true or false (or any of the String representation, for example `True`, `t`, `yes` or `y` are all considered to be true). If the template evaluates to `true`, the Step will run, otherwise it won’t. + +Read more: + +- [Enabling or disabling a Step conditionally](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally). +- [Examples of run_if expressions](/en/bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally/examples-of-run-if-expressions). + +**Example of `steps::run_if`** + +In this example, the build skips the Step if the value of CUSTOM_ENV_VAR_KEY is not `test value to test against`. + +```yaml +run_if: |- + {{enveq "CUSTOM_ENV_VAR_KEY" "test value to test against"}} +``` + +### `steps::timeout` + +This property defines a time limit for a Step: if the Step runs longer than the defined time, the Step fails. Define the limit in seconds. + +This is useful if, for example, your builds hang for not immediately obvious reasons - you can set timeouts for the Step or Steps which are suspected to have caused the problem. + +Read more: [Setting a time limit for Steps](/en/bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps). + +**Example of `steps::timeout`** + +```yaml +- xcode-test: + timeout: 120 +``` + +### `steps::no_output_timeout` + +This property defines a time limit for steps: if a Steps runs longer than the defined time without producing an output, the Step fails. Define the limit in seconds. + +Read more: [Detecting and aborting hanging Steps](/en/bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps). + +**Example of `steps::no_output_timeout`** + +```yaml +output_slows_down: + steps: + - script: + no_output_timeout: 12 +``` + +### `steps::inputs` + +Inputs defined for the Step: these are values that can be set when the Step is added to a Workflow. + +Step input syntax consists of a `KEY: value` pair. + +Read more: [Step inputs reference](/en/bitrise-ci/references/steps-reference/step-inputs-reference). + +**Example of `steps::inputs`** + +```yaml +inputs: +- my_key_for_the_env: "default value" +``` + +### `steps::outputs` + +Outputs defined for the Step: these are values that the Step can set during its execution, which can be used by other Steps in the Workflow. + +You can check out the default outputs of a Step in the Workflow Editor on bitrise.io or in the `step.yml` file of the Step. Step outputs can be defined in the `step.yml` file of the project by setting the `outputs` attribute. Step out syntax consists of two main parts: a `KEY: value` pair and an `opts` field. The key and the value are required, the `opts` field is optional. + +Read more: [Step outputs reference](/en/bitrise-ci/references/steps-reference/step-outputs-reference). + +**Example of `steps::outputs`** + +```yaml +workflows: + primary: + steps: + - gradle-runner: + outputs: + - BITRISE_APK_PATH: ALIAS_APK_PATH +``` diff --git a/src/partials/step-outputs.mdx b/src/partials/step-outputs.mdx new file mode 100644 index 0000000..eb31ad8 --- /dev/null +++ b/src/partials/step-outputs.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Step outputs + +Steps can generate outputs which can then be used in other Steps as inputs. That means that if a Step generates an artifact, the path to that artifact can be the input of another Step in the build. For example, the **Xcode Archive & Export for iOS** Step exposes the $BITRISE_API_PATH output which can then be used as an input value for the **Deploy to iTunesConnect** Step. + +Outputs are also defined in the `step.yml` file, under the outputs property. They have the same structure as inputs: they consist of a key and value pair. An output’s key can be used as an input value in a subsequent Step, just as Environment Variables exposed by [bitrise.io](http://bitrise.io) or the Bitrise CLI can be. + +### Step output keys and values + +For output keys, use upper case [snake case](https://en.wikipedia.org/wiki/Snake_case) style output keys, for example: OUTPUT_PATH. + +### Naming and describing Step outputs + +Step outputs are always exported as Environment Variables (Env Var). For example, the **Xcode Archive & Export for iOS Step** generates an IPA file: this output is exported as the BITRISE_IPA_PATH Env Var: + +``` +outputs: +- BITRISE_IPA_PATH: + opts: + title: .ipa file path + summary: Local path of the created .ipa file +``` + +As the example shows, the output definition contains a key (BITRISE_IPA_PATH) and under the `opts` property, it also includes a title and a summary. In the Workflow Editor, the key and the title are visible by default: these are required. In addition, you can add a summary and a description: + +- `title`: It should be a short and descriptive sentence or half sentence: Generated IPA path. This is required. +- `summary`: It is the short version of the description, which provides a quick overview of the output. This is optional, and only visible in the Workflow Editor if you click on the title. +- `description`: It is the user facing description of the Step output: this should provide a deeper, more detailed explanation of the output. This is optional, and only visible in the Workflow Editor if you click on the title. + +### Outputs with list of values + +It is absolutely possible to provide a list of values for a given output. If you wish to do so, we strongly recommend adding a LIST suffix to the key of the output (for example, `BITRISE_APK_PATH_LIST`), and expect the values to be provided as a newline character (\n) separated list (for example, first value\nsecond value). + +Please use this solution unless you really need to use another character for separating values. Based on our experience, the newline character (\n) works really well as a universal separator character, as it’s quite rare in input values (compared to ,, ;, = or other more common separator characters). diff --git a/src/partials/steps-that-require-connecting-to-your-apple-developer-account.mdx b/src/partials/steps-that-require-connecting-to-your-apple-developer-account.mdx new file mode 100644 index 0000000..2c523c8 --- /dev/null +++ b/src/partials/steps-that-require-connecting-to-your-apple-developer-account.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Steps that require connecting to your Apple Developer account + +The following Steps require connection to Apple services (such as App Store Connect or the Apple Developer Portal). If you’re using any of these Steps, make sure you establish connection with the right method. + +| Steps | Connection type | +| --- | --- | +| Manage iOS Code Signing | API key authentication, Apple ID authentication, API key authentication through Step inputs | +| Xcode Archive & Export for iOS | API key authentication, Apple ID authentication, API key authentication through Step inputs | +| Export iOS and tvOS Xcode archive | API key authentication, Apple ID authentication, API key authentication through Step inputs | +| Xcode Build for testing for iOS | API key authentication, Apple ID authentication, API key authentication through Step inputs | +| fastlane | API key authentication, Apple ID authentication, API key or Apple ID authentication through Step inputs | +| Deploy to App Store Connect with Deliver (formerly iTunes Connect) | API key authentication, Apple ID authentication, API key or Apple ID authentication through Step inputs | +| Deploy to App Store Connect - Application Loader (formerly iTunes Connect) | API key authentication, Apple ID authentication, API key or Apple ID authentication through Step | + +Depending on which authentication you can use in your project, you have the following options: + +- API key authentication: If you can, we recommend you use this authentication method. It does not require two-factor authentication. All it takes is connecting to the Apple services by providing **Name**, **Issuer ID**, **Key ID** and upload a **Private Key (.p8)**, then selecting an account under the **Team** tab in your app’s settings. The data you give automatically populates the respective fields of the Steps that work with API key authentication. +- Apple ID authentication: If you cannot use the API key authentication, you can authenticate with your Apple ID and password. Provide your **Apple ID**, **password**, **2FA code** and **app-specific password** then select an account under the **Team** tab in your app’s settings. The data you give automatically populates the respective fields of the Steps that work with the Apple ID authentication. +- API key or Apple Id authentication through Step inputs: If you wish to deploy to multiple teams or deploy to a team where authentication is different from the connected one you’ve been using, then you can add your preferred authentication into the Step’s inputs. Some Steps, such as Xcode Archive & Export for iOS, only have an API key authentication override option, while some Steps, like fastlane, have options for both API key and Apple ID Step level authentication override. diff --git a/src/partials/storing-a-bitriseyml-file-on-multiple-branches-in-the-repository.mdx b/src/partials/storing-a-bitriseyml-file-on-multiple-branches-in-the-repository.mdx new file mode 100644 index 0000000..8b0ef22 --- /dev/null +++ b/src/partials/storing-a-bitriseyml-file-on-multiple-branches-in-the-repository.mdx @@ -0,0 +1,17 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Storing a bitrise.yml file on multiple branches in the repository + +When you first add the `bitrise.yml` to your repository, it must be committed to the [default branch](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch/changing-the-default-branch). If you store the `bitrise.yml` file in the repository, the default branch must always have a `bitrise.yml`. + +However, once you did the initial configuration to set up using the `bitrise.yml` from your repository, you can store `bitrise.yml` files on other branches and use any of them to run builds. If you want to build a branch of your repository on Bitrise, you need to have a `bitrise.yml` file on that branch. And don’t forget that you always need to keep a `bitrise.yml` file on the default branch. + +**Bitrise setup with bitrise.yml files on multiple branches** + +Let’s say you have an app called FantasticApp. In FantasticApp’s Git repository, the default branch is called `main`. There is also a `deploy` branch. + +Any code push or pull request to `main` triggers a Workflow called `main-workflow`. Any code push or pull request to `deploy` triggers a Workflow called `deploy-workflow`. + +In the repository, there is a `bitrise.yml` file on both the `main` and the `deploy` branch, containing both Workflows. When making changes to the Workflows, the FantasticApp team commits the modified `bitrise.yml` file to both branches to ensure that their Workflows are up to date on both. diff --git a/src/partials/storing-the-bitriseyml-file-in-your-repository.mdx b/src/partials/storing-the-bitriseyml-file-in-your-repository.mdx new file mode 100644 index 0000000..b51a42c --- /dev/null +++ b/src/partials/storing-the-bitriseyml-file-in-your-repository.mdx @@ -0,0 +1,88 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Storing the bitrise.yml file in your repository + +When you store your configuration YAML file(s) in your repository, the build process on Bitrise will use that file to run your builds. This means that: + +- You have full control over versioning your configuration file. +- Every time you make a change to your Workflows or your trigger map, you must commit the changes to the file in the repository. + +You don’t need to create your own configuration YAML file in advance: you can use the file stored on [bitrise.io](https://www.bitrise.io/). + +The feature requires [service credential](/en/bitrise-platform/integrations/the-service-credential-user.html) integration or the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration). Hosting the YA file in a privately hosted repository where neither is available needs a [workaround](#section-idm234434652037879). + +1. Open the project on Bitrise and go to the **Project settings** page. +1. Select **Collaboration**. +1. Check the **Service credential user** section. The service credential user must be a Bitrise user who has at least `read` access to the repository. + + :::note[GitHub App integration] + + If you use the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration), you don't need the service credential user to store the configuration YAML file in your repository. + + ::: +1. Open the Workflow Editor. +1. In the Workflow Editor, select **Configuration YAML** from the navigation menu on the left. + + ![store-bitrise-yml.png](/img/_paligo/uuid-634355b9-8f8d-e62c-1bd2-1a36cb7921b5.png) +1. Above the YAML file, you can see where the file is currently stored. Click **Change**. +1. When prompted to add the `bitrise.yml` to your project's repository, you have two options: + + Copy the content of the current `bitrise.yml` file to the clipboard. You can then create your own file and copy the contents into it. + + Download the current `bitrise.yml` file. +1. In your repository, commit the `bitrise.yml` file. + + You can either: + + - Commit the file to the root of the repository. + - Commit the file to some other location. In this case you will need to provide the path on Bitrise. + + :::important[Default branch] + + The default branch of your app must always have a `bitrise.yml` file on it. You can store different `bitrise.yml` files on the other branches: [Storing a bitrise.yml file on multiple branches in the repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-a-bitriseyml-file-on-multiple-branches-in-the-repository). + + You can check your Bitrise project's default branch on [bitrise.io](https://www.bitrise.io/) by going to the **Settings** tab and finding the **DEFAULT BRANCH** option. + + ::: +1. Back on Bitrise, set a path to your configuration file in the **Bitrise.yml location** field: + + - If you store the config file in the root of your repository, leave the field empty. + - If you store the file somewhere else in the repository, provide the path. +1. Click **Validate and save**. + + :::caution[Validation] + + The `bitrise.yml` file in your repository always must be valid! If it contains incorrect syntax, it can break your builds. + + ::: + +If all goes well, you should receive confirmation of successfully changing your `bitrise.yml` storage settings. + +:::tip[Allowlist the Bitrise website IP addresses] + +If you use some form of self-hosted solution for storing your code, you might need to allowlist the static IP addresses of the Bitrise website and its background workers. This allows you to use such features as storing the `bitrise.yml` file in your own repository, or receiving build status updates from Bitrise: [IP addresses for the Bitrise website](/en/bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines/ip-addresses-for-the-bitrise-website). + +::: + +### Privately hosted repositories + +Unfortunately, this feature is not yet supported for users who can't use the service credential user integration or the [GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration); for example, if the repository is is only accessible under a private IP subnet. There's a workaround, however: [Storing the bitrise.yml in a privately hosted repository](https://support.bitrise.io/en/articles/9676637-storing-the-bitrise-yml-in-a-privately-hosted-repository). + +For GitHub Enterprise, we offer an integration that allows you to store your `bitrise.yml` file in a GitHub Enterprise repository: [Integrating GitHub Enterprise with Bitrise](/en/bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise). + +### Setting a custom path for your configuration YAML + +By default, Bitrise looks for your configuration YAML in the root of your repository when running builds but you can store the file elsewhere in the repository. + +To do so: + +1. Commit the configuration YAML file to your repository. +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Select **Configuration YAML** on the left. +1. Click **Change** next to **Source**. +1. In the **Bitrise.yml location** field, set the path where you committed the file. + + ![config-yaml-source.png](/img/_paligo/uuid-4908f90e-3721-b82f-2d79-937d6a9b14f3.png) diff --git a/src/partials/sub-apis.mdx b/src/partials/sub-apis.mdx new file mode 100644 index 0000000..830f504 --- /dev/null +++ b/src/partials/sub-apis.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Sub APIs + +The v2 API is organized into four sub APIs, each with its own base URL: + +| Sub-API | Description | Base URL | +| --- | --- | --- | +| Apps | Covers connected apps, installable artifacts, presets, public assets, outgoing webhooks, and Apple App Store draft versions. | `https://api.bitrise.io/release-management/v2/apps/v1` | +| Build Distributions | Covers tester groups, testers, and build distributions. | `https://api.bitrise.io/release-management/v2/build-distributions/v1` | +| Store Releases | Covers app versions, approvals, beta distribution, and store releases for both the App Store and Google Play. | `https://api.bitrise.io/release-management/v2/store-releases/v1` | +| Code Push | Covers deployments and updates. | `https://api.bitrise.io/release-management/v2/code-push/v1` | diff --git a/src/partials/submodules-and-step-dependencies.mdx b/src/partials/submodules-and-step-dependencies.mdx new file mode 100644 index 0000000..496ef6f --- /dev/null +++ b/src/partials/submodules-and-step-dependencies.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Submodules and Step dependencies + +Do not use submodules, or require any other resource downloaded on-demand in your Step! Try to include everything required for your Step in the Step’s repository. Otherwise you can run into problems if, say, the Step fails to download a resource because of a network error or some authorization problem. In the case of submodules, you should include the content of the other repository instead of using it as a submodule of your Step’s repository. + +You can, however, declare dependencies that you can fetch from an OS dependency manager, such as apt-get or brew. A Step dependency is installed by the Bitrise CLI if it is not available in the PATH Environment Variable. + +As Steps can be run in any environment where the Bitrise CLI can run, list every used dependency, even if you know that they are pre-installed on the Bitrise stacks. Unused dependencies (for example, git and wget added as a sample by default) waste build time. + +Step dependencies should not include toolkit dependencies, as the Bitrise CLI will take care of installing those automatically. A Step written in golang should not list go as a dependency if the Step uses the Go Bitrise CLI toolkit. + +The Bitrise CLI can install Step dependencies available in the Homebrew package manager: + +``` +deps: + brew: + - name: cmake +``` + +It can install apt-get dependencies available in the sources listed in the sources.list file on the host machine: + +``` +deps: + apt_get: + - name: cmake +``` + +### Accessing files in the Step repo with an Env Var + +If you need to keep a binary, assets or anything else required for your Step that should be bundled in the Step repository, then you can include them beside your `step.yml` file and the code of your Step. The Bitrise CLI automatically exports an Environment Variable called BITRISE_STEP_SOURCE_DIR that allows you to access these files at any time. + +For example, you can access a `.jar` file in the root of your Step’s repository like this: + +`$BITRISE_STEP_SOURCE_DIR/mytool.jar` diff --git a/src/partials/supported-tools.mdx b/src/partials/supported-tools.mdx new file mode 100644 index 0000000..0f74b05 --- /dev/null +++ b/src/partials/supported-tools.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Supported tools + +The system is designed to support a growing list of tools and languages, but Bitrise only verifies and tests the stability of the most common tools listed. If you need a tool not listed here, read more how to use community plugins. + +:::tip[Other tools] + +If you don’t find a tool listed on this page, you can use community plugins to perform the tool setup. If a community `asdf` plugin exists for the given tool, you can provide the tool-plugin’s `git clone` URL in the config. For example, this is how you set up the right version of Deno using its `asdf` plugin: + +``` +tools: + deno: 2.4.3 + +tool_config: + extra_plugins: + deno: https://github.com/asdf-community/asdf-deno.git +``` + +::: + +| Tool name | YAML example | Notes | +| --- | --- | --- | +| **Ruby** | Using a 3.3.x version, preferring a preinstalled version to save install time: ``` tools: ruby: 3.3:installed ``` | At the moment, Ruby versions have to be built from source using the [ruby-build project](https://github.com/rbenv/ruby-build), so each install adds a few minutes to each build. [Bitrise stacks](https://bitrise.io/stacks/) come with multiple preinstalled Ruby versions at all times, so you can avoid the install time by using a partial version that uses a preinstalled Ruby (if available). | +| **Go** | Installing the 1.24.0 version: ``` tools: golang: 1.24.0 ``` | | +| **Python** | Using a 3.12.x version, preferring a preinstalled version to save install time: ``` tools: python: 3.12:installed ``` | At the moment, Python versions have to be built from source, so each install adds a few minutes to each build. [Bitrise stacks](https://bitrise.io/stacks/) come with a preinstalled Python version at all times, so you can avoid the install time by using a partial version that uses a preinstalled Python (if available). | +| **Node.js** | Using a 22.x.y version, preferring a preinstalled version to save install time: ``` tools: nodejs: 22:installed ``` | | +| **Java** | Installing Java 25: ``` tools: java: openjdk-25.0.0 ``` | | +| **Flutter** | Flutter versions need to include the release channel as a suffix: ``` tools: flutter: 3.32.5-stable ``` | | +| **Tuist** | Installing the 4.54.0 version: ``` tools: tuist: 4.54.0 ``` | | diff --git a/src/partials/supported-trigger-conditions.mdx b/src/partials/supported-trigger-conditions.mdx new file mode 100644 index 0000000..e93422d --- /dev/null +++ b/src/partials/supported-trigger-conditions.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Supported trigger conditions + +Not all trigger conditions are available for all Git providers. As a general rule, all our trigger conditions are available for the cloud service of the three most frequently used Git providers: GitHub, GitLab, and Bitbucket. For other providers, or self-hosted Git repositories, check out the detailed table for both push triggers and pull request triggers. + +| Git provider | Branch | Commit message | Files changed | +| --- | --- | --- | --- | +| GitHub (cloud and self-hosted) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| GitLab (cloud and self-hosted) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Bitbucket (cloud and self-hosted) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Assembla | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Deveo (Perforce) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Gogs | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Azure DevOps | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | + +| Git provider | Source branch | Target branch | Labels | Comments | Commit message | Changed files | +| --- | --- | --- | --- | --- | --- | --- | +| GitHub (cloud and self-hosted) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| GitLab (cloud and self-hosted) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Bitbucket (cloud and self-hosted) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | N/A | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | +| Assembla | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | N/A | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Deveo (Perforce) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Gogs | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | +| Azure DevOps | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![tick.svg](/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | ![close-small.svg](/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg) | diff --git a/src/partials/switching-from-oauth-connection-to-the-github-app.mdx b/src/partials/switching-from-oauth-connection-to-the-github-app.mdx new file mode 100644 index 0000000..dc6135e --- /dev/null +++ b/src/partials/switching-from-oauth-connection-to-the-github-app.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Switching from OAuth connection to the GitHub app + +:::tip[Using the API] + +This section describes how to configure the feature on the Bitrise website. You can also configure it via the Bitrise API: [GitHub app configuration API](/en/bitrise-ci/api/github-app-configuration-api). + +::: + +If your Bitrise project has an OAuth connection set up to your GitHub account, you can change it to the Bitrise GitHub app at any time without losing any functionality. We strongly recommend doing the switch: with the Bitrise GitHub app installed, you no longer need the service credential user, an SSH key, or a webhook to run Bitrise builds. + +:::important[HTTPS URL required] + +Please note that the GitHub app requires an HTTPS URL for your repository instead of an SSH one. Normally, you don't have to worry about this: setting up the GitHub app connection changes the URL of your project. If there's an issue, you can change the URL manually: [Changing the repository URL](/en/bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch/changing-the-repository-url). + +::: + +To switch: + +1. Install the Bitrise GitHub App as described in the relevant guide: [Installing the GitHub App integration](/en/bitrise-platform/repository-access/github-app-integration/installing-the-github-app-integration). +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left navigation menu, select **Repository**. +1. You can see a blue card with information about GitHub App support. To switch, click **Setup GitHub App**. + + ![SCR-20260331-prho.png](/img/_paligo/uuid-3de8dcba-e678-997e-20f0-3055cd889bb0.png) +1. Make sure you remove any pre-existing manual Webhooks from the **Incoming Webhooks** page of the **Webhooks** tab once the GitHub App is configured. + + You can get to this page via **Project Settings** → **Integrations** → **Webhooks** tab → **Incoming Webhooks**. If you fail to do this, duplicate builds will get triggered. +1. Optionally, you can remove the service credential user and any SSH keys or personal access tokens used for OAuth connection. diff --git a/src/partials/synchronizing-groups-and-users-between-okta-and-bitrise.mdx b/src/partials/synchronizing-groups-and-users-between-okta-and-bitrise.mdx new file mode 100644 index 0000000..c4b7988 --- /dev/null +++ b/src/partials/synchronizing-groups-and-users-between-okta-and-bitrise.mdx @@ -0,0 +1,44 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Synchronizing groups and users between Okta and Bitrise + +After [pushing Okta groups to Bitrise](/en/bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise/pushing-okta-groups-to-bitrise-using-scim), you can synchronize your groups and users between Okta and Bitrise. To do so, you must manage the app integration assignments in Okta: + +1. Log into Okta and click **Admin**. +1. From the left menu, select **Applications** under the **Applications** section. +1. Select your Bitrise app. +1. Make sure that **Create Users** and **Deactivate Users** options are enabled on the **Provisioning** tab. + + ![provisioning_settings.png](/img/_paligo/uuid-d8a157ed-518f-ad9c-67bb-e66a50263ab7.png) + + :::note[Deprovisioning users] + + If you deprovision a user with SCIM, the user will be automatically logged off Bitrise and their PATs will be disabled. + + ::: +1. Go to the **Assignments** tab. +1. Click **Assign** and choose **Assign to People** to synchronize individual users or **Assign to Groups** to synchronize groups. + + ![assign_people.png](/img/_paligo/uuid-d6dbb0ec-3447-10ab-ba08-1bf5731153be.png) +1. Select the users or groups that you would like to synchronize, then click **Done**. + + :::important[Domain verification] + + New users without verified domains will receive an email invitation to join the Workspace. + + Existing users will also receive a verification email unless you verify your company domain: [Configuring SCIM](/en/bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim). + + ::: +1. After synchronizing your groups and users, you can check the **Push Groups** tab to see if the synchronization is finished. + + You can also manually push your updates by clicking on the dropdown menu in the **Push Status** column and selecting **Push now**. + + ![push_now.png](/img/_paligo/uuid-71166a22-3341-0ee5-6599-6b190f83e717.png) + + :::caution["Push now" overrides the Bitrise group] + + Users not included in your Okta group will be automatically removed from the linked Bitrise group. + + ::: diff --git a/src/partials/target-based-trigger-components.mdx b/src/partials/target-based-trigger-components.mdx new file mode 100644 index 0000000..2d1e449 --- /dev/null +++ b/src/partials/target-based-trigger-components.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Trigger components + +| Component | Description | Accepted values | Default value | +| --- | --- | --- | --- | +| `pull request` `push` `tag` | Defines the type of a trigger. The trigger conditions of a target-based trigger are children of these elements. | N/A | N/A | +| `enabled` | A boolean property that defines if the trigger is currently active. | - `true` - `false` | `true` | + +| Component | Description | Default value | +| --- | --- | --- | +| `branch` | The branch of the repository where code is pushed to trigger a build. | `*` | +| `commit_message` | The commit message to trigger a build. | `*` | +| `changed_files` | The path to a file or folder where changes should trigger a build. | `*` | +| `last_commit` | A boolean property that defines whether Bitrise should evaluate every commit message or changed file in a code push or only those belonging to the most recent commit. | `false` | + +| Component | Description | Default value | +| --- | --- | --- | +| `source_branch` | The branch of from which the pull request is opened. | `*` | +| `target_branch` | The branch which is the merge target of the pull request. | `*` | +| `label` | The pull request label. | `*` | +| `draft_enabled` | A boolean property that defines if draft pull requests trigger builds. | `true` | +| `comment` | A comment posted on a pull request. | `*` | +| `commit_message` | A specific commit message in pushes to a pull request. | `*` | +| `changed_files` | Specific files that are modified in a pull request. | `*` | + +| Component | Description | Default value | +| --- | --- | --- | +| `name` | The value of the tag. Accepts a string value or a `regex` property. | `*` | diff --git a/src/partials/target-scope.mdx b/src/partials/target-scope.mdx new file mode 100644 index 0000000..525b02b --- /dev/null +++ b/src/partials/target-scope.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Target scope + +When using a GitHub personal access token to authenticate the Build Hub, you need to set a target scope when [creating a machine pool](/en/bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions/creating-a-machine-pool). The target scope is the context in which the runner is allowed to operate, such as a specific repository or a GitHub organization. + +The accepted target scopes are: + +- GitHub Cloud organization: https://github.com/<org> +- GitHub Cloud repository: https://github.com/<owner>/<repo> +- GitHub Enterprise (GHE) Cloud: https://github.com/enterprises/<enterprise> +- GHE Server: https://<hostname>/enterprises/<enterprise> +- GHE organization: https://<hostname>/<org> +- GHE repository: https://<hostname>/<owner>/<repo> diff --git a/src/partials/target-versions.mdx b/src/partials/target-versions.mdx new file mode 100644 index 0000000..5e9575a --- /dev/null +++ b/src/partials/target-versions.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Target versions + +When creating an update for CodePush, you need to specify the app version when uploading the package to the CodePush server. This is a target version: users running the specified version of the app will receive the updates. + +You can use range expressions to specify the version: + +| Range expression | Who gets the update | +| --- | --- | +| 1.2.3 | Only devices running the specific binary app store version 1.2.3 of your app | +| * | Any device configured to consume updates from your CodePush app | +| 1.2.x | Devices running major version 1, minor version 2 and any patch version of your app | +| 1.2.3 - 1.2.7 | Devices running any binary version between 1.2.3 (inclusive) and 1.2.7 (inclusive) | +| >=1.2.3 <1.2.7 | Devices running any binary version between 1.2.3 (inclusive) and 1.2.7 (exclusive) | +| 1.2 | Equivalent to >=1.2.0 <1.3.0 | +| ~1.2.3 | Equivalent to >=1.2.3 <1.3.0 | +| ^1.2.3 | Equivalent to >=1.2.3 <2.0.0 | diff --git a/src/partials/test-repetitions.mdx b/src/partials/test-repetitions.mdx new file mode 100644 index 0000000..dfa7ac7 --- /dev/null +++ b/src/partials/test-repetitions.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Test Repetitions + +[Xcode’s test repetition modes](https://developer.apple.com/videos/play/wwdc2021/10296/) are available with the [Xcode Test for iOS Step](https://www.bitrise.io/integrations/steps/xcode-test) on stacks running Xcode 13 and above on Bitrise. With test repetitions, you can run any type of tests multiple times in various ways such as retry on failure, until failure and until max repetitions. + +The **Xcode Test for iOS** Step’s **Test Repetitions Mode (Available in Xcode 13+)** input offers the following options: + +- `none`: The tests won’t repeat. +- `until_failure`: Repeats a test until the test fails or until the maximum repetition. The default number of test runs is three. +- `retry_on_failure`: Failed tests run until they succeed or until the repetition number you specify. The default number of test repetitions is three. +- `up_until_maximum_repetitions`: Reruns all tests until maximum test repetition is reached regardless of the test outcomes. + +![test-repetition.png](/img/_paligo/uuid-d2ee7fd1-7743-7720-d114-5f38632cd2e1.png) + +Please note that these options are only available from **Xcode Test for iOS** version 3.0.0 and above. + +With the **Maximum Test Repetitions (Available in Xcode 13+)** input you can specify the maximum number of test repetitions. Please note that you have to add a greater number than one if the **Test Repetition Mode (Available in Xcode 13+)** input is set to other than `none`. + +Enable the **Relaunch Tests for Each Repetition (Available in Xcode 13+)** input to launch tests in a completely new process for each repetition. diff --git a/src/partials/testersqa.mdx b/src/partials/testersqa.mdx new file mode 100644 index 0000000..783ba58 --- /dev/null +++ b/src/partials/testersqa.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testers/QA + +Here’s the role cheatsheet for testers/QA: + +![tester-qa-role.png](/img/_paligo/uuid-7bb467f5-6ccc-d11e-73f9-f54d550668a8.png) + +Testers can only view builds. They cannot access build logs and they cannot modify the project in any way or form. + +They have no access to sensitive data such as payment information, access tokens or even webhooks. diff --git a/src/partials/testing-a-flutter-app.mdx b/src/partials/testing-a-flutter-app.mdx new file mode 100644 index 0000000..264cbdd --- /dev/null +++ b/src/partials/testing-a-flutter-app.mdx @@ -0,0 +1,39 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing a Flutter app + +You can write and run unit-, widget-, and integration tests with Flutter. For more information, check out [Flutter’s official documentation](https://flutter.io/docs/testing). + +You can use our automatically generated **primary** Workflow to test your Flutter app. It can include the **Flutter Test** Step that runs Flutter tests and can also generate code coverage reports. + +:::note[Test reports] + +The **Deploy to Bitrise.io** Step exports the results of the **Flutter Test** Step to **Tests** tab by default. + +::: + +To run tests on a Flutter app: + +1. Open your app’s Workflow Editor and open the **primary** Workflow, or any of your Workflows that you want to use to run tests. +1. In the **Flutter Install** Step, fill in the **Flutter SDK Version** input. + + You can specify either tags or branches of the Flutter SDK’s git repository. The default value is `stable`. This will use the latest stable branch of Flutter. + + - To find the available version tags, check: [https://github.com/flutter/flutter/releases](https://github.com/flutter/flutter/releases). + - To see the the available branches, check: [https://github.com/flutter/flutter/branches](https://github.com/flutter/flutter/branches). +1. Add the **Flutter Test** Step. In the **Additional parameters** input, enter any flags you wish to use to. + + The Step runs the `flutter test` command with the specified flags. To check the available flags, open a command line interface on your own machine and run `flutter test --help`. + + ![Getting_started_with_Flutter_apps.png](/img/_paligo/uuid-3c8c65d8-1de1-0a50-62cf-acf76dc76bf9.png) +1. Make sure the **Project Location** input of the **Flutter Test** Step is correct. + + The default value is the the Environment Variable (Env Var) created for your Flutter project’s location. +1. If you want to generate code coverage reports, set the **Generate code coverage files?** input to `yes`. + + This runs the `flutter test` command with the `--coverage` flag. +1. To export the test results to the **Tests** tab, add the **Deploy to Bitrise.io** Step to the end of your Workflow. + + For more information, check out [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). diff --git a/src/partials/testing-and-deployment.mdx b/src/partials/testing-and-deployment.mdx new file mode 100644 index 0000000..8dff265 --- /dev/null +++ b/src/partials/testing-and-deployment.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing, installing, deploying + +Testing your app and deploying your app are both done with the help of our Steps: we have Steps dedicated to both these functions, based on the platform type. Unit testing, UI testing, and real device testing are all possible on Bitrise: + +- [Device testing for Android](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android) +- [Device testing for iOS](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios) +- [Android unit tests](/en/bitrise-ci/testing/testing-android-apps/android-unit-tests) +- [Running unit and UI tests for iOS apps](/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps) + +You can find all your generated installable binaries in one place on Bitrise: [The Installable artifacts page](/en/bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online/the-installable-artifacts-page). From this page, you can easily install your apps on test devices, using either a private install page or by distributing a link to [a public install page](/en/bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page). + +Once your app is tested, built and ready to go, you can quickly deploy it to the store of your choice, for example, Google Play or the App Store. + +We also recommend trying out Release Management, our one-stop solution for all release-specific tasks. Once you have an installable binary, you can use Release Management to automatically take care of everything else related to releases: [see topic](urn:resource:publication:90740). diff --git a/src/partials/testing-ioniccordova-apps.mdx b/src/partials/testing-ioniccordova-apps.mdx new file mode 100644 index 0000000..3872a3e --- /dev/null +++ b/src/partials/testing-ioniccordova-apps.mdx @@ -0,0 +1,42 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing Ionic/Cordova apps + +You can run unit tests for Ionic/Cordova apps on Bitrise by using our **Karma Jasmine Test Runner** or **Jasmine Test Runner** Steps. + +If your Cordova/Ionic project has a Karma Jasmine dependency in its **package.json** file, our scanner will detect it when you're adding your app and automatically insert the respective testing Step into your Workflow. If this dependency is missing from your project, you can manually insert one of our testing steps to your Workflow using our Workflow Editor. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Make sure you have a testing Step in your Workflow. + + :::important[Installing dependencies] + + [You must install dependencies](/en/bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects/installing-dependencies-for-ioniccordovareact-apps) before you can run tests. + + ::: + + You can choose between the **Karma Jasmine Test Runner** and the **Jasmine Test Runner** Steps. + +**Cordova app configuration with Karma Jasmine Test Runner** + +In this example, you can find a `bitrise.yml` configuration that includes a Workflow called **primary**. This Workflow includes the **Karma Jasmine Test Runner** Step. + +``` +primary: + steps: + - activate-ssh-key@4.0.3: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@4.0.11: {} + - script@1.1.5: + title: Do anything with Script step + - npm@0.9.1: + inputs: + - command: install + - karma-jasmine-runner@0.9.1: {} + - deploy-to-bitrise-io@1.3.15: {} +``` diff --git a/src/partials/testing-on-app-center-and-on-bitrise.mdx b/src/partials/testing-on-app-center-and-on-bitrise.mdx new file mode 100644 index 0000000..6b01ab8 --- /dev/null +++ b/src/partials/testing-on-app-center-and-on-bitrise.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing on App Center and on Bitrise + +App Center Test is a test automation service for mobile apps: you can upload your app binary and test files to execute tests. + +Bitrise offers everything App Center Test does in our CI/CD service: we have multiple, platform-specific dedicated testing Steps that can find and run tests within your code. You can run your tests in simulators and on real devices. In addition to the dedicated testing Steps, you can run any script you want, so you can fully customize your tests. + +Just like building and deploying, testing is also automatic: set up build triggers so that code events trigger builds with tests. Everything can be integrated: you can build, test, and deploy your app within the very same Workflow, if you choose to. + +You can view all your test results and generated test artifacts in one place: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + +:::note[Test distribution solution] + +An enhanced Release Management solution with test distribution features is coming soon. You will be able to: + +- Easily access and distribute different versions of your app for testing from a directory-like page for IPA, APK, and AAB files. +- Share your app via either a public or a private install page, or distribute builds to your testers early, in the pre-production phase. + +::: diff --git a/src/partials/testing-with-a-full-clean-git-clone.mdx b/src/partials/testing-with-a-full-clean-git-clone.mdx new file mode 100644 index 0000000..1c5c406 --- /dev/null +++ b/src/partials/testing-with-a-full-clean-git-clone.mdx @@ -0,0 +1,16 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing with a full clean git clone + +1. Open your Terminal / Command Line interface on your machine. +1. Type in: `cd /tmp` +1. Clone your repository with: `git clone REPOURL ./quick-repo-test --branch BRANCH-YOU-WANT-TO-TEST`: + + ``` + git clone https://github.com/bitrise-io/bitrise.git ./quick-repo-test --branch master + ``` +1. Type `cd ./quick-repo-test.` + +Run the commands you want to test, to build your project, or to open the project file from this directory. diff --git a/src/partials/testing-with-the-bitrise-cli.mdx b/src/partials/testing-with-the-bitrise-cli.mdx new file mode 100644 index 0000000..4df123a --- /dev/null +++ b/src/partials/testing-with-the-bitrise-cli.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing with the Bitrise CLI + +After doing a full clean git clone, run a build locally, using the [Bitrise CLI](https://www.bitrise.io/cli). + +1. [Install the Bitrise CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html). +1. Download your app’s `bitrise.yml` file from [bitrise.io](https://www.bitrise.io/). +1. Run the build with: `bitrise run ` (for example, `bitrise run primary`). + +This should help reproducing the issues in most cases, and allows you to attempt to debug them on your own machine. + +If the build succeeds under these conditions but still fails on Bitrise, [contact our support!](https://www.bitrise.io/requests/new) diff --git a/src/partials/testing-your-android-app.mdx b/src/partials/testing-your-android-app.mdx new file mode 100644 index 0000000..fbdfb89 --- /dev/null +++ b/src/partials/testing-your-android-app.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing your Android app + +We have several Steps dedicated to assisting you in testing your Android app during the CI process. + +- The **[Android Lint](https://www.bitrise.io/integrations/steps/android-lint)** Step runs Lint on your Android project source files and detects potential syntax errors to keep your code error free. +- The **[Android Unit Test](https://www.bitrise.io/integrations/steps/android-unit-test)** Step runs your project's unit tests. You can run it for all your different modules and flavors. [Android unit tests](/en/bitrise-ci/testing/testing-android-apps/android-unit-tests) +- The [**Virtual Device Testing for Android**](https://www.bitrise.io/integrations/steps/virtual-device-testing-for-android) uses Firebase TestLab to run Android tests on virtual devices. [Device testing for Android](/en/bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android) + +The **[Android Unit Test](https://www.bitrise.io/integrations/steps/android-unit-test)** Step and the [**Virtual Device Testing for Android**](https://www.bitrise.io/integrations/steps/virtual-device-testing-for-android) Step can both export their results to [test reports](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). To do so, simply make sure that your Workflow includes the **Deploy to Bitrise.io** Step at the very end of the Workflow. diff --git a/src/partials/testing-your-ios-app.mdx b/src/partials/testing-your-ios-app.mdx new file mode 100644 index 0000000..26ee2b1 --- /dev/null +++ b/src/partials/testing-your-ios-app.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing your iOS app + +If you have test targets defined, the default Workflows of an iOS project include the two Steps you need to run your Xcode tests, and view their results on [bitrise.io](https://www.bitrise.io/): + +- **Xcode Test for iOS** +- **Deploy to Bitrise.io** + +The **Xcode Test for iOS** Step runs the pre-defined Xcode tests. It has a default configuration that does not need to be modified: if the tests are written correctly, they will work. You can find the same configuration options in Xcode, too. + +:::tip[Checking your selected stack] + +We recommend checking that the stack selected for your project has the same Xcode version you used to build the project. For example, if your simulator test fails with the Ineligible destinations for the scheme message, then make sure the Xcode version in the **Stacks & Machines** section is correct. You can read more about our stacks: [Build stacks](/en/bitrise-build-hub/infrastructure/build-stacks). + +::: + +The Deploy to Bitrise.io Step will deploy the following to the **Logs** and **Artifacts** tab of the build: + +- Your Xcode test results. +- Your raw xcodebuildoutput log. + +The **Deploy to Bitrise.io** Step also exports the results of the **Xcode Test for iOS** Step to [test reports](/en/bitrise-ci/testing/deploying-and-viewing-test-results.html). diff --git a/src/partials/testing-your-macos-app.mdx b/src/partials/testing-your-macos-app.mdx new file mode 100644 index 0000000..f786427 --- /dev/null +++ b/src/partials/testing-your-macos-app.mdx @@ -0,0 +1,25 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing your macOS app + +If you have test targets defined, a default Workflow of a macOS project includes the two Steps you need to run your Xcode tests, and view their results on [bitrise.io](https://bitrise.io/): + +- **Xcode Test for Mac** +- **Deploy to Bitrise.io** + +:::note[Code signing files] + +Running Xcode tests and deploying their results to Bitrise do not require any code signing files. So don’t worry about them just yet! + +::: + +The **Xcode Test for Mac** Step runs the pre-defined Xcode tests. It has a default configuration that does not need to be modified: if the tests are written correctly, they will work. You can find the same configuration options in Xcode, too. + +The **Deploy to Bitrise.io** will deploy the following: + +- your Xcode test results. +- your raw `xcodebuildoutput` log. + +You can view the results in one place: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). diff --git a/src/partials/testing-your-react-native-app.mdx b/src/partials/testing-your-react-native-app.mdx new file mode 100644 index 0000000..e95e692 --- /dev/null +++ b/src/partials/testing-your-react-native-app.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Testing your React Native app + +You can use React Native’s built in testing method, called **jest** to perform unit tests. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add the **run npm command** Step to your Workflow. +1. In the **npm command with arguments to run** input field, type `test`. + + ![Getting_started_with_React_Native_apps.png](/img/_paligo/uuid-f5f86a6c-d609-1970-a451-0de6d5b4edb3.png) + +For more detailed guides on React Native testing, check out [Testing React Native apps](/en/bitrise-ci/testing/testing-react-native-apps). + +### Viewing React Native test results + +Bitrise allows you to view and analyze your test results in one convenient place: [Deploying and viewing test results](/en/bitrise-ci/testing/deploying-and-viewing-test-results). + +By default, tests run with the **Run npm command** Step won't show up in test reports. However, you can export the results. . The basic process is as follows: + +1. Generate a `junit.xml` file during the build. + + For example, you can use [jest-junit](https://www.npmjs.com/package/jest-junit) to prepare a report. +1. Add the **Export test results to Test Reports** Step to your Workflow. + + ![Managing_an_app_s_bitrise.png](/img/_paligo/uuid-fd13332e-571f-e706-88ed-a20a29db7aea.png) +1. In the **Path where custom test results reside** input, add the folder in which your `junit.xml` file and other test results are located. +1. In the **Test result search pattern** input, set `*.xml`. +1. In the **The name of the test** input, set the name of the test run. + + The test results will be under this name. +1. Make sure you have the **Deploy to Bitrise.io** Step in your Workflow. diff --git a/src/partials/the-dashboards-page.mdx b/src/partials/the-dashboards-page.mdx new file mode 100644 index 0000000..7df3f37 --- /dev/null +++ b/src/partials/the-dashboards-page.mdx @@ -0,0 +1,69 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## The Dashboards page + +You can use the Insights Dashboards page to categorize the charts of your Workspace so that you can view them in one place. + +You can combine charts from the Builds, Tests, and Credits tab into a single dashboard, and you can have as many dashboards as you want. + +![dashboards.png](/img/_paligo/uuid-fc575279-c87c-1046-a747-4ea6a59fae5f.png) + +### Creating a new dashboard + +You can create a new dashboard either from the Dashboards page or by clicking on the **Add to dashboard** button (![Add_To_dashboard.png](/img/_paligo/uuid-26a387b3-ea77-211f-b2f8-09325e1cc44a.png)) and clicking the **Create dashboard** button. We will focus on the former method in this guide: + +1. Open Insights. +1. On the left, select **Dashboards**. +1. Click on **Create dashboard** to open the **Create dashboard** window. + + ![Create_dashboard.png](/img/_paligo/uuid-6da7408c-facc-9a1a-b494-b9acdf47accb.png) +1. Add the name of the dashboard under the **Dashboard name** filed and optionally add a description under the **Description** field. +1. Select the default view of granularity and time range. You can also change these options later. +1. Click on **Create**. + +### Accessing a dashboard + +To access a dashboard: + +1. Open Insights. +1. On the left, select **Dashboards**. +1. Click on the name of the dashboard or the arrow icon ("![project_selector_arrow.png](/img/_paligo/uuid-06b2413b-0794-39ff-c8b0-176c85c8e1e1.png)") to open a specific dashboard. + +From here, you can see the charts you previously added to your dashboard. For more information, check out [Adding a chart to a dashboard](/en/insights/getting-started-with-insights/the-dashboards-page/adding-a-chart-to-a-dashboard). + +### Adding a chart to a dashboard + +You can add any chart from the **Builds**, **Tests**, and **Credits** tabs to your dashboard: + +1. Open Insights. +1. Select the **Builds**, **Tests**, or **Credits** tab on the left. +1. Search for the metric you want to add to your dashboard. +1. Click on the **Add to dashboard** ( ![Add_To_dashboard.png](/img/_paligo/uuid-26a387b3-ea77-211f-b2f8-09325e1cc44a.png) ) button next to it. +1. Insert a name under the **Chart name** field. +1. Select the dashboard where you want to place this chart using the dropdown menu. +1. Click **Add**. + +That's it! From now on you will be able to see your chart on the **Dashboard** page. + +:::tip[Removing a chart from a dashboard] + +You can remove a chart from a dashboard using the edit mode. For more information, check out [Editing a dashboard](/en/insights/getting-started-with-insights/the-dashboards-page/editing-a-dashboard). + +::: + +### Editing a dashboard + +Once you have created a dashboard, you can edit it as you see fit. Among other things, you can edit the default time range or delete charts you may no longer need. To do so, you must use the **Edit mode**: + +1. Open Insights. +1. On the left, select **Dashboards**. +1. [Access the dashboard](/en/insights/getting-started-with-insights/the-dashboards-page/accessing-a-dashboard) you would like to edit. +1. Click on the "![3dots_2.png](/img/_paligo/uuid-811a202d-1f3a-d7eb-932f-555b5eeed51e.png)" icon, then click on **Edit mode**. + + ![Edit_mode.png](/img/_paligo/uuid-d21f2840-9772-4870-9818-a3fd1162be1f.png) +1. In the edit mode, you may change the dashboard's general settings by clicking on the **Settings** button. You can also change the name of previously added charts or remove them using the icons next to them. + + ![Edit_mode_opened.png](/img/_paligo/uuid-cac01df1-7cc0-598f-62b5-87a237ecc669.png) +1. Click on **Save** after you finish editing the dashboard. diff --git a/src/partials/the-importance-of-test-failure-rate.mdx b/src/partials/the-importance-of-test-failure-rate.mdx new file mode 100644 index 0000000..9a713e4 --- /dev/null +++ b/src/partials/the-importance-of-test-failure-rate.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## The importance of test failure rate + +A high mobile app test failure rate suggests that people frequently spend time debugging, fixing, and then retrying — and waiting for — tests and builds. Failure rate is especially critical for long tests and builds as engineers will have to wait even more when they do a fix and then run a new build and test. + +By tracking and analyzing where and why your mobile app’s tests fail the most, teams can improve their testing process and make it more resilient over time. Meaning, the time and effort spent on resolving test failures are minimized and the overall efficiency and productivity of your team are increased. + +The main goal of tracking your mobile app’s failing tests is to reduce the wait time throughout the development process. If you have tests that fail frequently, it means that sooner or later you’ll have to wait for that test and the related build, fix the issue, and then try it again. As part of this cyclical process, you’ll likely lose time either due to 1) context switching or, 2) because you can’t do anything useful while you’re waiting for the results of that test and build. diff --git a/src/partials/the-importance-of-tracking-flaky-tests.mdx b/src/partials/the-importance-of-tracking-flaky-tests.mdx new file mode 100644 index 0000000..5f8c0ec --- /dev/null +++ b/src/partials/the-importance-of-tracking-flaky-tests.mdx @@ -0,0 +1,20 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## The importance of tracking flaky tests + +First, what is a flaky test and how is it calculated? A test is flaky if it produces different results even when the code isn’t changed. For example, this simple code will sometimes fail and other times it’ll be successful, without any code change: + +``` +randNum := r1.Intn(100) +require.Equal(t, true, randNum > 40, "More than 40?") +``` + +Flaky tests are a special case of failing tests, and probably the most crucial ones to fix. + +Flaky tests are a persistent problem that can make a developer's life frustrating and challenging. They are a unique type of failing tests that may cause confusion and setbacks even when the code change being made is functioning as intended. Unlike other failing tests, flaky tests can cause failures in seemingly unrelated parts of the code, leading to time-consuming and frustrating debugging sessions. Fixing flaky tests is essential for ensuring a stable and reliable testing process. + +Eliminating flaky tests is not only important to prevent time waste, but is also crucial to improving developers' confidence in the tests. If tests fail randomly, developers will start to ignore test failures over time. + +Bitrise Insights can detect when a test produces inconsistent results for the same code state. For builds which have a code commit hash information specified when triggered (usually all builds except manually triggered and scheduled ones) it can detect this across builds (where the commit hash is the same, but the test had multiple different results on the same commit hash). Insights can also detect flaky tests in a given build, if the same test was performed multiple times in a single build, even if the build did not have a commit hash specified when it was triggered (common for manual and scheduled builds). diff --git a/src/partials/the-include-format-reference.mdx b/src/partials/the-include-format-reference.mdx new file mode 100644 index 0000000..9f82a29 --- /dev/null +++ b/src/partials/the-include-format-reference.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## The `include` format + +| Parameter | Required? | Description | +| --- | --- | --- | +| `path` | Required | The location of the YAML file you want to include. The path is relative to either: - The root of the repository in a CI environment. - The current directory in a local environment. | +| `branch` | Optional | The branch from which to include the YAML file. | +| `tag` | Optional | The tag from which to include the YAML file. If `branch` and `tag` are both specified, tag takes priority. | +| `commit` | Optional | The specific commit hash from which to include the YAML file. If `branch`, `tag`, and `commit` are all specified, the commit takes priority. | +| `repository` | Optional | The repository from which to pull the YAML file. You just need to set the name of the repository, not the URL. | diff --git a/src/partials/the-installable-artifacts-page.mdx b/src/partials/the-installable-artifacts-page.mdx new file mode 100644 index 0000000..c9c272f --- /dev/null +++ b/src/partials/the-installable-artifacts-page.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## The Installable artifacts page + +On the **Installable artifacts** page, you can: + +- View the installable binaries of past builds. +- Download the installable artifacts. +- Check the details page of these artifacts. This can include a [public install page](/en/bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page). + +To get to the page, log in to Bitrise, select the Workspace that owns the app, and open **Bitrise CI**. Select your app and you can see **Artifacts** on the left. + +You can filter your installable artifacts using several different filters: + +- Platform of your binary (iOS or Android). +- The timeframe of the build that generated it. + + ![timeframe-artifacts.png](/img/_paligo/uuid-243b3111-76a9-8f92-b5aa-e345cf67e363.png) +- The Workflow the build ran on. +- The branch of the repository that was built. diff --git a/src/partials/the-stepyml-file.mdx b/src/partials/the-stepyml-file.mdx new file mode 100644 index 0000000..97b6f3b --- /dev/null +++ b/src/partials/the-stepyml-file.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## The step.yml file + +The `step.yml` file is the Step interface definition, containing dependencies, Step inputs and Step outputs as well as other Step properties. It also points to the location of the Step’s source code. Every Step must have one. + +If you use the Step plugin to create a new Step, all the required properties will have a value assigned - but you can change any of them at any time. So don’t worry if the title you set during the initial process does not conform to the guidelines below. + +We’ll look at the most important configuration options of the `step.yml` file, including naming and describing your Step, as well as setting up Step inputs and Step outputs. diff --git a/src/partials/third-party-step-restrictions.mdx b/src/partials/third-party-step-restrictions.mdx new file mode 100644 index 0000000..eb3d638 --- /dev/null +++ b/src/partials/third-party-step-restrictions.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Third-party Step restrictions + +If you disable third-party Steps: + +- If your configuration YAML is [stored on bitrise.io](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository), builds with third‑party Steps will start, but you can't save Workflow changes until the Steps are removed. +- If your configuration YAML is [stored in the repository](/en/bitrise-ci/configure-builds/configuration-yaml/managing-a-projects-configuration-yaml-file/storing-the-bitriseyml-file-in-your-repository), we cannot validate it and builds won’t start. +- Script Steps are still present and can run arbitrary code, including [third-party tooling](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions.html). +- When using the Workflow Editor on Bitrise, you won't be able to select third-party Steps, only Steps maintained by Bitrise. diff --git a/src/partials/tip-meta-properties-as-permanent-comments.mdx b/src/partials/tip-meta-properties-as-permanent-comments.mdx new file mode 100644 index 0000000..ecf492d --- /dev/null +++ b/src/partials/tip-meta-properties-as-permanent-comments.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +:::tip[Meta properties as permanent comments] + +These meta properties can be used for permanent comments. Standard YML comments are not preserved when the YML is normalized, converted to JSON or otherwise generated or transformed. These meta properties are. + +::: diff --git a/src/partials/tool-setup-during-workflow-execution.mdx b/src/partials/tool-setup-during-workflow-execution.mdx new file mode 100644 index 0000000..9ff76bf --- /dev/null +++ b/src/partials/tool-setup-during-workflow-execution.mdx @@ -0,0 +1,91 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Tool setup during Workflow execution + +To perform tool setup during Workflow execution, you can use a purpose-built dependency installer Step or a CLI subcommand that you call from your own scripts. + +### Tool setup with CLI subcommand + +Call the `bitrise tools setup` from your Workflow. The tool looks for configuration or version file paths: if you don't specify a path, the tool detects files in the working directory. + +In the example, we're calling the command from a **Script** Step with a `--config` flag that finds the `.tool-versions` file. + +``` +workflows: + build-and-test: + steps: + # Project stores tool config in a .tool-versions file committed to the repo + - git-clone: {} + - script: + title: Set up environment + inputs: + # Set up tools based on the .tool-versions file in the repo + - content: bitrise tools setup --config .tool-versions + + # Rest of the workflow has access to the right tools and versions in $PATH +``` + +You can also install specific tools without a configuration file: + +``` +bitrise tools install [--provider PROVIDER] [--format FORMAT] [:SUFFIX] + +# Examples: +bitrise tools install nodejs 20.10.0 +bitrise tools install nodejs 22:latest +eval "$(bitrise tools install ruby 3.2.0 --format bash)" # activate in shell +``` + +By default, running `bitrise tools setup` doesn't activate tool changes in the same shell session (for example, if the tool setup and tool use happens in the same **Script** Step). In the example, we're installing a new Ruby version: + +``` +#! /bin/bash + +bitrise tools setup --config .ruby-version + +ruby --version +``` + +If you run this command in a **Script** Step, `PATH` will still point to the previous Ruby version. + +You can install and activate the tool in the same shell session using `eval`: + +``` +eval "$(bitrise tools setup --config .ruby-version --format bash)" + +ruby --version # $PATH is updated with the newly set up ruby version +``` + +Alternatively, you can run `bitrise tools setup` in a separate Step. + +``` +workflows: + build-and-test: + steps: + - git-clone: {} + - script: + title: Set up environment + inputs: + # Set up tools based on the .tool-versions file in the repo + - content: bitrise tools setup --config .tool-versions + + # Rest of the workflow has access to the right tools and versions in $PATH + - cocoapods-install: {} +``` + +### Tool setup with the Dependency installer Step + +The **[Dependency installer](https://bitrise.io/integrations/steps/dependency-installer)** Step is a wrapper for the CLI subcommand that executes tool install. It accepts several types of tool version files: for the full list, see the Step description. + +To use the Step, add it to your Workflow before the Steps that need the tools: + +``` +steps: + - activate-ssh-key@4: {} + - git-clone@8: {} + - dependency-installer@1: +     inputs: +     - tool_version_file: ".tool-versions" +``` diff --git a/src/partials/tool-version-managers.mdx b/src/partials/tool-version-managers.mdx new file mode 100644 index 0000000..04d3919 --- /dev/null +++ b/src/partials/tool-version-managers.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Changing tool version managers + +Bitrise uses tool version managers to install and provide the required tool at runtime. The primary manager is [mise](https://mise.jdx.dev/), but [asdf](https://asdf-vm.com/) is also supported and behaves the same. If you want to switch implementations for any reason, you can do so: + +``` +tool_config: + provider: asdf +``` diff --git a/src/partials/tracking-overall-credit-usage.mdx b/src/partials/tracking-overall-credit-usage.mdx new file mode 100644 index 0000000..c9be194 --- /dev/null +++ b/src/partials/tracking-overall-credit-usage.mdx @@ -0,0 +1,27 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Tracking overall credit usage + +When you open Bitrise Insights you start on the **Overview** page. + +Scroll down to the Credit usage section to see your Workspace’s overall credit usage and the top 5 apps using the most amount of credits. + +![overview-credits.png](/img/_paligo/uuid-c0daa517-7b8f-10d5-c390-511c68829d40.png) + +If you want to predict your credit usage switch over to the **Credits** page, either by clicking the **Credits** option under the **EXPLORE** section in the left sidebar, or click the **View details** button in the **Credit usage** section. + +On the **Credits** page by default you’ll see your last 12 weeks (3 months) credit usage trend on a week-by-week basis.To predict how much credits you’ll use you have a few options. + +![credits-page-home.png](/img/_paligo/uuid-cf875ee5-ad50-e67e-eeb9-059ac158285d.png) + +Switch to monthly view to see your last 6 months credit usage, the trend of your credit usage, and the current month’s usage so far. + +Alternatively you can also switch to daily view (**Last 30 days**) and change the chart to **Cumulative** to see how much credit you used in the last 30 days and the trend of it: + +![cumulative-credits.png](/img/_paligo/uuid-b309f819-a995-58ae-e686-2e98ac27a1c3.png) + +If the trend is fairly stable (no large jumps and drops) then most likely you’ll use about the same amount of credits than what you did in the last 30 days, which you can see in the upper left corner under **Credit usag**e. + +Comparing this daily to the monthly view should give you a good guidance about how much credit usage you should expect in the month and how that compares to your previous months' credit usage. diff --git a/src/partials/transferring-a-project-on-the-project-settings-page.mdx b/src/partials/transferring-a-project-on-the-project-settings-page.mdx new file mode 100644 index 0000000..187e414 --- /dev/null +++ b/src/partials/transferring-a-project-on-the-project-settings-page.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Transferring a project on the Project settings page + +1. Log in with an account that is an owner of the project. +1. Open the **Project settings** page. +1. Select **Basic settings** on the left and find the **Danger Zone** label. +1. Click the **Move project** button. + + ![move-project-button.png](/img/_paligo/uuid-2ce0bbbd-d455-1840-7b19-0bcfc6da8e12.png) +1. Select a Workspace to transfer the project to it. + + ![move-project-dialog.png](/img/_paligo/uuid-4c68fb66-ab5a-75a7-bb14-ab0f2617444f.png) +1. Click **Move project** to finalize. + + :::warning[Transferring ownership is permanent!] + + Only the new owner can change the project's ownership after the transfer has been completed! + + ::: diff --git a/src/partials/transferring-multiple-projects-at-the-same-time.mdx b/src/partials/transferring-multiple-projects-at-the-same-time.mdx new file mode 100644 index 0000000..fceb5eb --- /dev/null +++ b/src/partials/transferring-multiple-projects-at-the-same-time.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Transferring projects on the Workspace settings page + +:::important[Owners only] + +You must be an owner of the Workspace to transfer its projects to another Workspace. + +::: + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Projects** from the menu options. +1. Click the **Move project (↔)** button next to the project's name to select a project. + + :::note[Projects with outside contributors] + + When transferring projects with outside contributors to a Workspace that doesn't allow outside contributors, the existing contributors are automatically removed from the project's team. + + ::: +1. Select a user or Workspace to transfer the project to them. + + ![move-project.png](/img/_paligo/uuid-5aa8c4c0-1851-b6c3-810b-11ca0c3dda28.png) +1. Click **Move project** to finalize. + + :::warning[Transferring ownership is permanent] + + Only the new owner can change the project's ownership after the transfer has been completed! + + ::: diff --git a/src/partials/trigger-for-the-most-recent-git-commit.mdx b/src/partials/trigger-for-the-most-recent-git-commit.mdx new file mode 100644 index 0000000..a292b7f --- /dev/null +++ b/src/partials/trigger-for-the-most-recent-git-commit.mdx @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Creating a trigger for the most recent Git commit + +By default, when using the **Commit message** or **File change** condition in a code push trigger, Bitrise evaluates all commit messages and all changed files included in a single code push. + +However, you can configure your triggers to evaluate only the last commit in a push. If a push contains multiple commits, only the most recent one will be evaluated. + + + + +1. [Create a new push trigger](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers/creating-target-based-triggers). +1. Select either the **Commit message** or the **File change** condition. + + ![last-commit.png](/img/_paligo/uuid-31ba9329-7c53-4411-103e-df47df050799.png) +1. Under the condition, enable **Last commit only**. + + + + +1. Open your configuration YAML file and go to a Workflow. +1. Add a new push trigger. In the example, we're using the `commit_message` condition. + + ``` + my-workflow: + triggers: + push: + - commit_message: your_message + ``` +1. Add the `last_commit` property and set it to `true`. + + ``` + my-workflow: + triggers: + push: + - commit_message: your_message + last_commit: true + ``` + + + diff --git a/src/partials/trigger-priority.mdx b/src/partials/trigger-priority.mdx new file mode 100644 index 0000000..cb147cb --- /dev/null +++ b/src/partials/trigger-priority.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Trigger priority + +Triggers can be assigned a priority setting: this determines the priority of a build triggered by a specific trigger. The higher the priority, the higher the build is in the build queue. + +You can assign a priority either in the Workflow Editor or in the configuration YAML file of your project. The priority is always an integer between -100 and 100: the higher the number, the higher the priority. The default priority is 0. + +For more information about build priority, and the order of precedence between different types of priorities, check out [Build priority](/en/bitrise-ci/configure-builds/configuring-build-settings/build-priority). diff --git a/src/partials/trigger-properties.mdx b/src/partials/trigger-properties.mdx new file mode 100644 index 0000000..f1def84 --- /dev/null +++ b/src/partials/trigger-properties.mdx @@ -0,0 +1,335 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Trigger properties + +### `triggers:enabled` + +The property determines whether a defined trigger is active. The default value is `true`. If you want to disable the trigger, set it to `false`. + +**Supported values**: boolean + +**Example of `triggers:enabled`** + +In this example, the trigger is disabled. + +```yaml +workflows: + primary: + triggers: + enabled: false +``` + +### `triggers:push` + +Code push triggers define the conditions for triggering a Bitrise build when code is pushed to the project's repository. + +For example, a commit to the specified branch of the project's repository triggers a build. + +**Example of `triggers:push`** + +In this example, a code push to the `main` branch triggers a build. + +```yaml +workflows: + primary: + triggers: + push: + - branch: main +``` + +#### `triggers:push:branch` + +Triggers a build when code is pushed to the specified branch. + +**Supported values**: + +- A string. +- The `pattern` property which allows simple text matching within all types of triggers. +- The `regex` property which allows using regular expressions as a trigger condition. + +:::important[One type only] + +Use exactly one out of a string, a pattern, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:push:branch`** + +```yaml +workflows: + primary: + triggers: + push: + - branch: main +``` + +##### `triggers:push:commit_message` + +Triggers a build when code is pushed with the specified commit message. + +**Supported values**: + +- A string. +- The `pattern` property which allows simple text matching within all types of triggers. +- The `regex` property which allows using regular expressions as a trigger condition. +- The `last_commit` property that defines whether Bitrise should evaluate every commit message or changed file in a code push or only those belonging to the most recent commit. Its default value is `false`. + +:::important[One type only] + +Use exactly one out of a string, a pattern, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:push:commit_message`** + +In this example, a commit message that contains the string `[workflow: deploy]` triggers a build: + +```yaml +primary + triggers: + push: + - commit_message: + regex: '.*\[workflow: deploy\].*' +``` + +##### `triggers:push:changed_files` + +Triggers a build when a code push results in changes to the specified file or files. + +You can specify files or a folders. + +**Supported values**: + +- A string. +- The `pattern` property which allows simple text matching within all types of triggers. +- The `regex` property which allows using regular expressions as a trigger condition. +- The `last_commit` property that defines whether Bitrise should evaluate every commit message or changed file in a code push or only those belonging to the most recent commit. Its default value is `false`. + +:::important[One type only] + +Use exactly one out of a string, a pattern, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:push:changed_files`** + +```yaml +primary + triggers: + push: + - changed_files: + pattern: "myfile.txt" +``` + +### `triggers:pull_request` + +Pull request triggers: they define the conditions for triggering a Bitrise build when a pull request is opened in the project's repository. + +**Example of `triggers:pull_request`** + +```yaml +primary + triggers: + pull_request: + - source_branch: * +``` + +#### `triggers:pull_request:source_branch` + +The branch from which the pull request is opened. + +**Supported values**: + +- A string. +- The `regex` property which allows using regular expressions as a trigger condition. + +:::important[One type only] + +Use exactly one out of a string, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:pull_request:source_branch`** + +```yaml +primary + triggers: + pull_request: + - source_branch: main +``` + +#### `triggers:pull_request:target_branch` + +The branch which is the merge target of the pull request. + +**Supported values**: + +- A string. +- The `regex` property which allows using regular expressions as a trigger condition. + +:::important[One type only] + +Use exactly one out of a string, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:pull_request:target_branch`** + +```yaml +primary + triggers: + pull_request: + - target_branch: main +``` + +#### `triggers:pull_request:label` + +The pull request label. A build is triggered when the label is added and when code is pushed to an open pull request that has this label. + +**Supported values**: + +- A string. +- The `regex` property which allows using regular expressions as a trigger condition. + +:::important[One type only] + +Use exactly one out of a string, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:pull_request:label`** + +```yaml +primary + triggers: + pull_request: + - label: bugfix +``` + +#### `triggers:pull_request:draft_enabled` + +The property defines if draft pull requests trigger builds. + +**Supported values**: A boolean. + +Read more: [Disabling builds from a draft PR](/en/bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers/skipping-a-build-triggered-by-a-draft-pull-request/disabling-builds-from-a-draft-pr). + +**Example of `triggers:pull_request:draft_enabled`** + +```yaml +primary + triggers: + pull_request: + - draft_enabled: false +``` + +#### `triggers:pull_request:comment` + +A comment posted on a pull request. + +**Supported values**: + +- A string. +- The `regex` property which allows using regular expressions as a trigger condition. + +:::important[One type only] + +Use exactly one out of a string, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:pull_request:comment`** + +```yaml +primary + triggers: + pull_request: + - comment: approved +``` + +#### `triggers:pull_request:commit_message` + +A specific commit message in pushes to a pull request. + +**Supported values**: + +- A string. +- The `regex` property which allows using regular expressions as a trigger condition. + +:::important[One type only] + +Use exactly one out of a string, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:pull_request:commit_message`** + +```yaml +primary + triggers: + pull_request: + - commit_message: "fix for issue" +``` + +#### `triggers:pull_request:changed_files` + +Specific files that are modified in a pull request. + +**Supported values**: + +- A string. +- The `regex` property which allows using regular expressions as a trigger condition. + +:::important[One type only] + +Use exactly one out of a string, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:pull_request:changed_files`** + +```yaml +primary + triggers: + pull_request: + - changed_files: ./path/to/file +``` + +### `triggers:tag` + +Git tag triggers define the conditions for triggering a Bitrise build when a Git tag is pushed to the project's repository. + +**Example of `triggers:tag`** + +```yaml +primary + triggers: + tag: + - name: * +``` + +#### `triggers:tag:name` + +The value of the tag that should trigger a build. + +**Supported values**: + +- A string. +- The `regex` property which allows using regular expressions as a trigger condition. + +:::important[One type only] + +Use exactly one out of a string, or a regex. You can't use more than one in the same trigger! + +::: + +**Example of `triggers:tag:name`** + +```yaml +primary + triggers: + tag: + - name: 1.0 +``` diff --git a/src/partials/trigger-syntax.mdx b/src/partials/trigger-syntax.mdx new file mode 100644 index 0000000..6d8d3ef --- /dev/null +++ b/src/partials/trigger-syntax.mdx @@ -0,0 +1,91 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Trigger syntax + +Triggers must be included in a `triggers` element within a Workflow or Pipeline. A valid trigger in the `triggers` element includes the type of the trigger and at least one trigger condition. + +For example, the below trigger launches a build when code is pushed to the `release` branch. + +``` +workflows: + pipeline-tests: + triggers: + push: + - branch: "release" +``` + +### Multiple matching triggers + +We parse all triggers in a configuration YAML and start builds with all matching triggers. This means the order of the triggers doesn't matter. + +For example, if you have two Workflows with `push` triggers with the same `branch` condition, both will be triggered when a commit is pushed to that branch. In the configuration below, both triggers will launch a build if a commit is pushed to the `release` branch: + +- The `pipeline-tests` Workflow specifies the `release` branch. +- The `pipeline-build` Workflow uses [a wildcard](#section-idm46327760897120342656217268) so any commit triggers a build with it. + +``` +workflows: + pipeline-tests: + triggers: + push: + - branch: "release" + [...] + pipeline-build: + triggers: + push: + - branch: "*" +``` + +### Multiple trigger conditions + +If you define multiple trigger conditions, all of them must match to trigger a build. In the example below, a build will be triggered if: + +- A commit is pushed to the `release` branch. +- Certain files have changed in the commit. + +``` +workflows: + pipeline-builds: + triggers: + push: + - branch: release + changed_files: path/to/library-a/.* +``` + +### Wildcards and regex + +We support wildcards (`*`) for simple text matching within all types of triggers. Wildcards are a good choice when you don't need the advanced pattern matching capabilities of regular expressions. For example, a trigger based on commit messages starting with `fix` can be achieved using a wildcard. We recommend using the `pattern` property to achieve this: + +``` +my_awesome_workflow + triggers: + push: + - branch: main + - commit_message: + pattern: "hello" +``` + +:::note[Alternative syntax] + +You can also add your wildcard pattern right next to the `commit_message` field: `commit_message: "hello"`. We’ll continue to support this syntax. + +::: + +Wildcards are useful to match specific, fixed values appearing in the input. We recommend using regexes are needed when multiple alternative values, negation, capturing specific groups of characters or specific character types (for example, numbers only) are needed. + +To use regular expressions for a trigger condition, you need to add `regex:` to its value: + +``` +workflows: + deploy: + triggers: + tag: + - name: + regex: '^\d\.\d\.\d$' + pull_request: + - comment: "[workflow: deploy]" + commit_message: + regex: '.*\[workflow: deploy\].*' +``` diff --git a/src/partials/trigger-variables.mdx b/src/partials/trigger-variables.mdx new file mode 100644 index 0000000..9df4e8f --- /dev/null +++ b/src/partials/trigger-variables.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Trigger variables + +A number of Environment Variables related to build triggers are available during an automatically triggered build. These variables can give detailed context about build triggers and pull request attributes. Use these trigger variables to: + +- Use pull request data, such as comments, labels, and changed files, to automate complex workflows and decision-making processes. +- Understand who and how your builds are triggered and use that to better debug your workflows +- Implement precise build conditions to reduce unnecessary runs, saving time and resources. + +You can find all trigger variables and their definition in our reference table: [Available environment variables](/en/bitrise-ci/references/available-environment-variables). + +Trigger variables are only available if the requirements are met. For example, the BITRISE_GIT_PULL_REQUEST_COMMENT variable is only available if the build is triggered by a PR comment; in other words, the build trigger has a `pr_comment` condition. You can find the exact conditions in [Available environment variables](/en/bitrise-ci/references/available-environment-variables). + +### Use cases for trigger variables + +Here are some example use cases for trigger variables. These are merely suggestions: you can experiment with variables to find what suits your needs best. + +**Reporting back to the PR comment** + +BITRISE_GIT_PULL_REQUEST_COMMENT_ID: Use the pull request comment ID to post a status update directly to the original comment on the pull request. This can include details such as success, failure, logs, or any other relevant information. + +**Conditional test execution** + +BITRISE_GIT_CHANGED_FILES : Identify modified parts of the codebase and based on these changes, trigger specific test suites, such as running frontend tests for UI changes and backend tests for API modifications. + +**Deploying to different environments based on commit messages or labels** + +Use BITRISE_GIT_COMMIT_MESSAGES and BITRISE_GIT_PULL_REQUEST_LABELS to determine the deployment environment. For instance, if a commit message includes "[staging]" or a label "ready-for-staging" is present, deploy the code to the staging environment. diff --git a/src/partials/triggering-a-new-build-with-the-api.mdx b/src/partials/triggering-a-new-build-with-the-api.mdx new file mode 100644 index 0000000..2173bca --- /dev/null +++ b/src/partials/triggering-a-new-build-with-the-api.mdx @@ -0,0 +1,244 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Triggering a new build with the API + +To trigger a new build with the Bitrise API, call the `POST /apps/{APP-SLUG}/builds` endpoint. You need to specify an app slug and at least one build parameter in a JSON object: + +- A git tag or git commit hash +- A branch +- A Workflow ID or a Pipeline ID + +:::note[Required role] + +You must have a developer, admin, or owner role on the app's team to trigger a new build using the API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +The JSON object must also contain a `hook_info` object with a `type` key and `bitrise` as the value of the key. + +Here’s a minimal sample JSON body which specifies `main` as the value of the `branch` parameter: + +``` +{ + "hook_info": { + "type": "bitrise", + }, + "build_params": { + "branch": "main" + } +} +``` + +And here’s the curl request syntax for triggering a build with the `prod` Workflow on the `main` branch: + +``` +curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/builds' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "build_params": { + "branch": "main", + "workflow_id":"prod" + }, + "hook_info": { + "type": "bitrise" + } +}' +``` + +:::tip[Interactive cURL call configurator] + +You can find an interactive cURL call configurator by clicking on the `Start/Schedule a build` button on your app’s [bitrise.io](https://www.bitrise.io) page and switching to `Advanced` mode in the popup. At the bottom of the popup you can find a `curl` call, based on the parameters you specify in the popup. + +::: + +In the previous example, we passed this JSON payload as a string: to be precise, as a JSON object serialized to a string. + +You can also pass it as an object (for example, if you want to call it from JavaScript). To do so, include a root `payload` element or, alternatively, set the JSON object as the value of the `payload` POST parameter. + +Here’s a jQuery example using the `payload` parameter: + +``` +$.post("https://api.bitrise.io/v0.1/apps/APP-SLUG/builds/", { + "payload":{ + "hook_info":{ + "type":"bitrise", + }, + "build_params":{ + "branch":"main", + "workflow_id":"prod" + } + } +}) +``` + +You can specify several different build parameters when triggering a build. The parameters should be set in the `build_params` object. + +### Setting a branch, commit or tag to build + +You can set Git-specific parameters in your call. The `branch` parameter specifies the source branch to be built. This is either the branch of the git commit or, in the case of a pull request build, the source branch of the pull request. + +``` +curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/builds' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "hook_info": { + "type": "bitrise" + }, + "build_params": { + "branch": "main", + "workflow_id":"prod" + } + }' +``` + +You can also build a specific git commit or even a git tag: you just need to set either the commit hash or the tag in the `build_params` object. You can also set a commit message for the build with the `commit_message` parameter. + +``` +curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/builds' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "hook_info":{ + "type":"bitrise" + }, + "build_params": { + "commit_hash": "0000ffffeeeee", + "commit_message": "testing", + "workflow_id":"prod" + } +}' +``` + +:::important[Parameter priority] + +The `Git Clone` Step has the following parameter priority: + +1. commit_hash +1. tag +1. branch + +If you provide multiple parameters, the parameter with lower priority will be ignored. + +The ignored parameters will still be logged. They will be available for Steps and they will be visible on the Build’s **Details** page but the `Git Clone` Step will use the most specific parameter for checkout. + +::: + +### Setting parameters for pull request builds + +For a pull request build, use the `branch_dest` parameter to set up the destination or target branch of the pull request. The PR will be merged into this branch but before that, Bitrise will build your app based on how the code would look like after merging. This is what happens when a PR build is automatically triggered by a webhook, for example. + +The `branch_repo_owner` and `branch_dest_repo_owner` parameters are used to identify the owners of the repositories, to unambiguously identify the branches involved in the pull request. + +:::important[Pull request builds from forks] + +If you do not specify the `branch_repo_owner` and `branch_dest_repo_owner` parameters, the API will assume pull request builds are coming from a fork. As such, they might be put on hold pending manual approval: [Approving Pull Request builds](/en/bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds). + +::: + +To identify the PR itself, use the `pull_request_id` parameter: it takes an integer; for example, the number of the PR on GitHub. + +``` +curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/builds' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "hook_info":{ + "type":"bitrise" + }, + "build_params": { + "branch": "the-pr-branch", + "branch_dest": "main", + "commit_hash": "fffff000000eeeeee", + "pull_request_id": 1, + "workflow_id":"prod" + } +}' +``` + +If your git provider supports it, you can also use the `pull_request_merge_branch` parameter to build the pre-merged state of the branch of the PR. Another alternative is the `pull_request_head_branch` parameter: this is a special git ref that should point to the source of the PR. + +If you want to trigger a build from a PR opened from a fork of your repository, use the `pull_request_repository_url` parameter. The value should be the URL of the fork. + +### Skipping Git status reports + +If you have a [webhook](/en/bitrise-platform/integrations/webhooks.html) set up, Bitrise will send status reports to your git provider about your builds. However, this can be disabled via the API: use the `skip_git_status_report` parameter. If it is set to `true`, no build status report will be sent. + +``` +curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/builds' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "hook_info":{ + "type":"bitrise" + }, + "build_params": { + "branch": "the-pr-branch", + "branch_dest": "main", + "skip_git_status_report": true, + "workflow_id":"prod" + } +}' +``` + +### Specifying Environment Variables + +You can define additional [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables.html) (Env Vars) for your build. These additional variables will be handled with priority between `Secrets` and `App Env Vars`, which means that you can not overwrite Env Vars defined in your build configuration (for example, App Env Vars), only [Secrets](/en/bitrise-ci/configure-builds/secrets.html). + +Define additional Env Vars with the environments parameter. This parameter must be an **array of objects**, and every item of the array must include at least a `mapped_to` property. This must contain: + +- The key of the Env Var. +- The value of the Env Var. + +:::note[Replacing Env Var names] + +By default, Env Var names inside values will be replaced in triggered build by actual value from the target environment. This behavior can be disabled by setting the `is_expand` flag to `false`. + +::: + +``` +"environments":[ + {"mapped_to":"API_TEST_ENV","value":"This is the test value","is_expand":true}, + {"mapped_to":"HELP_ENV","value":"$HOME variable contains user's home directory path","is_expand":false}, +] +``` + +### Setting a Workflow for the build + +By default, the Workflow for a triggered build will be selected based on the content of `build_params` and your app’s [trigger map](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers.html). This is the same as how webhooks select the Workflow for the build automatically, based on the Trigger Map. + +With the API, you can overwrite this selection and specify exactly which Workflow you want to use. + +Add a `workflow_id` parameter to your `build_params` and specify the workflow you want to use for that specific build. Here’s an example call where we specify the `deploy` workflow: + +``` +curl -X 'POST' \ + 'https://api.bitrise.io/v0.1/apps/APP-SLUG/builds' \ + -H 'accept: application/json' \ + -H 'Authorization: ACCESS-TOKEN' \ + -H 'Content-Type: application/json' \ + -d '{ + "hook_info": { + "type": "bitrise" + }, + "build_params": { + "branch": "main", + "workflow_id": "deploy" + } +}' +``` diff --git a/src/partials/triggering-a-scheduled-build-manually.mdx b/src/partials/triggering-a-scheduled-build-manually.mdx new file mode 100644 index 0000000..7c66c01 --- /dev/null +++ b/src/partials/triggering-a-scheduled-build-manually.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Triggering a scheduled build manually + +To immediately trigger a scheduled build: + +1. Go to the **Builds** page of your app. +1. Find the **Scheduled builds** section and open it to view your scheduled builds. + + ![scheduled-build.png](/img/_paligo/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png) +1. Click **Trigger now**. diff --git a/src/partials/troubleshooting-build-status-reporting.mdx b/src/partials/troubleshooting-build-status-reporting.mdx new file mode 100644 index 0000000..5e66d31 --- /dev/null +++ b/src/partials/troubleshooting-build-status-reporting.mdx @@ -0,0 +1,44 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Troubleshooting build status reporting + +If your builds do not send status reports to your Git hosting provider - GitHub, GitLab or Bitbucket -, you will need to do a little investigating to find out what causes the problem. Let’s take a look at the potential issues! + +### Checking the service credential user + +[The service credential user](/en/bitrise-platform/integrations/the-service-credential-user.html) of the app on [bitrise.io](https://www.bitrise.io) must have connected their Bitrise account to their Git hosting account and must have access to the repository of the app on that Git account. + +You can check the service credential user and test their Git connection. + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. Go to your app’s page on [bitrise.io](https://www.bitrise.io). +1. Find the **Service credential user** section. + + ![service-credential-user.png](/img/_paligo/uuid-6519a945-1fd2-97fd-da4a-fdab48705503.png) + + :::note[Current user] + + In the figure, the current active user is the service credential user. If the service credential user is a different user, this looks a little different, including the button's text. + + ::: +1. Click the **Test <Git provider> connection** button to test the user's Git connection. + +### Checking repository permissions and repository URL + +Make sure that you granted Bitrise access to your Workspace or team. It might be that you did not grant Bitrise access or denied access to the GitHub Workspace or Bitbucket team that owns the repository. + +Make sure the URL repository is up to date: + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **General**. +1. Find the repository URL and make sure it's correct. + + ![apps-repository-url.png](/img/_paligo/uuid-0d8102bf-6e48-8787-cfe2-d24617d96950.png) diff --git a/src/partials/troubleshooting-detox-tests.mdx b/src/partials/troubleshooting-detox-tests.mdx new file mode 100644 index 0000000..da8e176 --- /dev/null +++ b/src/partials/troubleshooting-detox-tests.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Troubleshooting Detox tests + +If you run into issues with using Detox on Bitrise, we recommend trying to rebuild the entire Detox package before running the test. + +To do so, run the following command in your Bitrise build: + +``` +`npm rebuild detox` +``` + +If your Detox tests still fail or hang, contact our support! diff --git a/src/partials/troubleshooting-the-ghes-integration.mdx b/src/partials/troubleshooting-the-ghes-integration.mdx new file mode 100644 index 0000000..089a7e8 --- /dev/null +++ b/src/partials/troubleshooting-the-ghes-integration.mdx @@ -0,0 +1,36 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Troubleshooting the GHES integration + +If the GHES integration doesn't work, you can: + +- Check the status of the integration on the Bitrise **Integrations** page. +- Checking the webhook configuration and webhook deliveries on GitHub. + +### Checking the webhook configuration + +1. Open your GHES organization's page, and on the top navigation bar, select **Settings**. +1. On the left, select **Developer settings** and then **GitHub Apps**. +1. Find your GitHub app, and click **Edit** next to its name. +1. On the left, select **Advanced**. +1. Under the **Recent deliveries** section, check your webhook deliveries. + + If the webhook is configured correctly, you should see a 200 OK response with a green checkmark next to the deliveries. +1. If your webhook deliveries failed: + + - Check the webhook URL on both Bitrise and on GitHub. + - If necessary, re-create the webhook secret on GitHub and paste the new secret to the GHES integration on Bitrise. + +### Checking the integration on Bitrise + +You can test the integration for any of the projects connected to your GHES instance. + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left of the **Settings** page, select **Integrations**. +1. On the **Git provider** tab, find the **Git integration status** section. +1. Next to the GitHub Enterprise Server Instance, click the **Test connection** button to test the connection. diff --git a/src/partials/types-of-steps.mdx b/src/partials/types-of-steps.mdx new file mode 100644 index 0000000..da18b24 --- /dev/null +++ b/src/partials/types-of-steps.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Types of Steps + +Bitrise has over 300 Steps in its [Step Library (StepLib)](https://github.com/bitrise-steplib) which third-party companies or open-source teams can enrich with Steps based on their services/tools. + +There are three different types of Steps at Bitrise. You can identify each one based on their labels on our GUI: + +- **Official Bitrise Steps**: These Steps are created and maintained by Bitrise. These Steps are labeled by a green badge and a "B". +- **Verified Steps**: These Steps are created and maintained by the community, but they are owned by a service or tool or an open-source team that guarantees secure, maintained, consistent, and high-quality performance for any Bitrise user. These Steps are labeled by a blue badge and a check mark. For more information about Verified Steps, check out [our guide](/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps/about-verified-steps). +- **Community Steps**: These Steps can be created by anyone in the community. These Steps are not labeled and don't have a badge. If you would like to learn how to develop Steps and share them with the Bitrise community, check out [Developing a new Step](/en/bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step). + +![StepTypes.png](/img/_paligo/uuid-5b243f17-057e-1324-1fd8-31305be6c08c.png) diff --git a/src/partials/unselecting-notification-preferences.mdx b/src/partials/unselecting-notification-preferences.mdx new file mode 100644 index 0000000..56082ba --- /dev/null +++ b/src/partials/unselecting-notification-preferences.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Unselecting notification preferences + +By default Bitrise sends newsletters and platform updates to the email address you provide under your **Profile**. You can unselect this setting with 3 simple steps: + +1. Click **Profile settings** under your avatar. +1. Click **Notification** on the left menu bar. You can see that Newsletters and Platform updates are both enabled by default. +1. If you wish to rather not get any or one of the two, notifications, untick the relevant checkbox/es. diff --git a/src/partials/updating-a-bitriseyml-stored-in-the-repository.mdx b/src/partials/updating-a-bitriseyml-stored-in-the-repository.mdx new file mode 100644 index 0000000..ab33924 --- /dev/null +++ b/src/partials/updating-a-bitriseyml-stored-in-the-repository.mdx @@ -0,0 +1,33 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Updating a bitrise.yml stored in the repository + +When you store the `bitrise.yml` file in your repository, you can still use the online Workflow Editor to make changes to your build configuration. You just need to commit your changes after saving them in the Workflow Editor. + +:::note[Read-only mode] + +You can't directly edit the `bitrise.yml` file itself in the Workflow Editor. You need to use the GUI to make changes, or edit the file in your repository instead. + +::: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Make changes to the Workflows you want to update. +1. Click **Save changes** in the top right corner. +1. You're prompted to update the `bitrise.yml` file in your repository. You have two options: + + Copy the content of the current `bitrise.yml` file to the clipboard. You can then create your own file and copy the contents into it. + + Download the current `bitrise.yml` file. +1. In your repository, commit the `bitrise.yml` file. +1. On Bitrise, click **I'm done** to fetch the `bitrise.yml` from your repository. + + :::caution[Commit your changes first!] + + If you haven't committed your changes to the repository, this will overwrite them! + + ::: diff --git a/src/partials/updating-an-uploaded-ios-code-signing-file.mdx b/src/partials/updating-an-uploaded-ios-code-signing-file.mdx new file mode 100644 index 0000000..a7f6e09 --- /dev/null +++ b/src/partials/updating-an-uploaded-ios-code-signing-file.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Updating an uploaded iOS code signing file + +You can perform minor updates to an uploaded iOS code signing file using the `PATCH` method. If you’ve uploaded your file to [Bitrise](https://www.bitrise.io), you can visually check any changes to it on the **Code Signing & Files** tab. + +:::note[Required role] + +You must have an admin or owner role on the app's team to manage iOS code signing files using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +For example, to make a **provisioning profile** protected, you can set the `is_protected` flag of your provisioning profiles to `true`. + +``` +curl -X PATCH -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/provisioning-profiles/PROVISIONING-PROFILE-SLUG -d '{"is_protected":true}' +``` + +For a **build certificate** you can set the same attributes as above but you can modify the password too: + +``` +curl -X PATCH -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/build-certificates/BUILD-CERTIFICATE-SLUG -d '{"certificate_password":"s0m3-v3ry-s3cr3t-str1ng"}' +``` + +:::warning[Be careful when setting attributes] + +You can set the `is_protected`, `is_exposed` and `processed` attributes of the files you've uploaded: + +- Once the `is_protected` flag is set to `true,` it cannot be changed anymore. +- When the value of `is_protected` is true, then the `is_expose` flag cannot be set to another value. +- Once the `processed` flag is set to true, then its value cannot be changed anymore. + +::: diff --git a/src/partials/updating-roles-and-permissions.mdx b/src/partials/updating-roles-and-permissions.mdx new file mode 100644 index 0000000..95424f1 --- /dev/null +++ b/src/partials/updating-roles-and-permissions.mdx @@ -0,0 +1,68 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Managing roles and permissions in a workspace + +You can update the roles and permissions assigned to any workspace member or workspace group at any time. + +### Updating workspace roles for a member + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Collaboration**. +1. Select the **Members** tab and find the workspace member you need in the list. +1. Click the vertical ellipsis next to their name and click **View details**. +1. On the workspace role card, click **Change**. +1. Select the new role and click **Save changes**. + +### Managing product and project access for a member + +You can, at any time, modify product and project access for individual members of a workspace. You can modify access for all the projects a user has access to, or just to a specific project. + + + + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Collaboration**. +1. Select the **Members** tab and find the workspace member you need in the list. +1. Click the vertical ellipsis next to their name and click **View details**. +1. Click **Manage access**. +1. Click **Change settings** at the correct product type: + + - **Admin access**: Grants access to all products, managing all aspects of selected projects with the project admin role. + - **Bitrise CI**: The user has access to Bitrise CI only, and it can be assigned [Bitrise CI roles](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + - **Release Management**: The user has access to Release Management only, and it can be assigned [Release Management roles](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). +1. Set up project access and access roles. The roles will be different based on the product. +1. When done, click **Done** in the dialog, and then click **Save changes**. + + + + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Collaboration**. +1. Select the **Members** tab and find the workspace member you need in the list. +1. Click the vertical ellipsis next to their name and select **View details**. +1. Select the **Projects** tab and find the project you need in the list. +1. Click the vertical ellipsis next to its name and select **Change access**. +1. Click **Change settings** at the correct product type: + + - **Admin access**: Grants access to all products, managing all aspects of selected projects with the project admin role. + - **Bitrise CI**: The user has access to Bitrise CI only, and it can be assigned [Bitrise CI roles](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + - **Release Management**: The user has access to Release Management only, and it can be assigned [Release Management roles](/en/release-management/configuring-connected-apps/release-management-roles-and-permissions). +1. Set up project access and access roles. The roles will be different based on the product. +1. When done, click **Done** in the dialog, and then click **Save changes**. + + + diff --git a/src/partials/updating-saml-sso-configuration.mdx b/src/partials/updating-saml-sso-configuration.mdx new file mode 100644 index 0000000..f7bdb56 --- /dev/null +++ b/src/partials/updating-saml-sso-configuration.mdx @@ -0,0 +1,23 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Updating SAML SSO configuration + +You can update a Workspace’s configured SAML SSO using the **Configure SAML SSO provider** button on the **Single Sign-On** page. + +This comes in handy if your SAML SSO provider’s certificate has expired and you wish to insert the new certificate on Bitrise. Another use case is, for example, if SAML SSO has been configured a while ago and now you wish to check the current configuration details. + +:::important[Accessing the Update SSO button] + +As with other SAML SSO configurations, only the Workspace owner can access and use the Update SSO button. + +::: + +1. As the owner of the Workspace, click your Workspace’s **Single Sign-On** tab. +1. Click the **Configure SAML SSO provider** button. Now you can access the configuration details of Workspace’s SAML SSO. + + ![configure_update_sso.png](/img/_paligo/uuid-2b97d7ef-4512-cf79-868f-bc66e728b509.png) +1. Make the changes and click **Save changes**. + + From now on any SAML SSO request will use the new configuration automatically. diff --git a/src/partials/updating-the-bitrise-cli.mdx b/src/partials/updating-the-bitrise-cli.mdx new file mode 100644 index 0000000..dbb1689 --- /dev/null +++ b/src/partials/updating-the-bitrise-cli.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Updating the Bitrise CLI + +Updating the Bitrise CLI is easy, and it doesn’t matter if you installed it with Homebrew or from the GitHub release. + +Simply run `bitrise update` - that’s it! The CLI checks for updates once every day and notifies you as soon as there is a new version. diff --git a/src/partials/upgrading-workflow-editor-version.mdx b/src/partials/upgrading-workflow-editor-version.mdx new file mode 100644 index 0000000..edc6466 --- /dev/null +++ b/src/partials/upgrading-workflow-editor-version.mdx @@ -0,0 +1,7 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Upgrading Workflow Editor version + +You can upgrade to the latest version of the Workflow Editor by running `bitrise plugin update workflow-editor` command. diff --git a/src/partials/uploading-a-new-bitriseyml-file.mdx b/src/partials/uploading-a-new-bitriseyml-file.mdx new file mode 100644 index 0000000..0dea63e --- /dev/null +++ b/src/partials/uploading-a-new-bitriseyml-file.mdx @@ -0,0 +1,64 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Uploading a new bitrise.yml file + +:::note[Required role] + +You must have an admin or owner role on the app's team to upload a new `bitrise.yml` file. + +For a complete list of user roles and role cheatsheets, check [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). + +::: + +The bitrise.yml file contains the configuration of your builds. You can modify the current one via the API by posting a full YAML configuration. In the below example, we are: + +- Creating a `bitrise.yml` with format version 11. +- Setting the Bitrise Step Library as the default Step source. +- Setting the stack to Xcode 14. +- Setting the BITRISE_PROJECT_PATH Environment Variable to point to the `build.gradle` file. +- Adding a **Script** Step. +- Creating a trigger map that triggers the primary Workflow if code is pushed to any branch of the app's repository. + +``` +curl --fail -X POST -H "Authorization: $ACCESS_TOKEN" "https://api.bitrise.io/v0.1/apps/$APP_SLUG/bitrise.yml" -d \ +'{ + "app_config_datastore_yaml": { + "format_version": 11, + "default_step_lib_source": "https://github.com/bitrise-io/bitrise-steplib.git", + "meta": { + "bitrise.io": { + "stack": "osx-xcode-14.0.x" + } + }, + "app": { + "envs": [ + { + "BITRISE_PROJECT_PATH": "build.gradle", + "opts": { + "is_expand": false + } + } + ] + }, + "workflows": { + "primary": { + "steps": [ + { + "script@1": {} + } + ] + } + }, + "trigger_map": [ + { + "push_branch": "*", + "workflow": "primary" + } + ] + } +}' +``` + +By calling this endpoint, you replace the app’s current `bitrise.yml` file. You can, of course, modify this uploaded `bitrise.yml` either via the API or on the website itself. diff --git a/src/partials/uploading-ios-code-signing-certificates.mdx b/src/partials/uploading-ios-code-signing-certificates.mdx new file mode 100644 index 0000000..648187e --- /dev/null +++ b/src/partials/uploading-ios-code-signing-certificates.mdx @@ -0,0 +1,45 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Uploading iOS code signing certificates to Bitrise + +All iOS code signing methods require you to export and upload your iOS code signing certificates to Bitrise. + +:::tip[Generating code signing files] + +If you don't have the necessary code signing files ready, you can generate new files: [Generating iOS code signing files](/en/bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files) + +::: + +To upload the certificates to Bitrise, first you need to export the files in the .p12 file format. Once you successfully exported the files, you need to upload them to Bitrise. You have two options: + +- [Via an API call](/en/bitrise-ci/api/managing-ios-code-signing-files/creating-and-uploading-an-ios-code-signing-file). +- Uploading it manually. This guide focuses on this option. + +:::important[Upload the distribution AND the development signing certificates] + +We strongly recommend uploading BOTH the development and distribution signing certificates for your project. If you don't have an uploaded development signing certificate, Steps with automatic provisioning options will generate one on the fly every time you start a build. This can eventually lead to reaching the maximum number of certificates, blocking you from starting new builds. + +::: + +To export your certificates and upload them to Bitrise in the Workflow Editor: + +1. Make sure you have your .p12 certificates exported and ready. +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select the **Code signing** menu option. +1. Click **Add .p12 file** to add a certificate. +1. In the dialog box, either drag and drop the file into the **Select a code signing certificate** section, or click the same section and select the file you want to upload. + + ![ios-certificate-dialog.png](/img/_paligo/uuid-ff9689fa-fa0b-d8d1-afef-4649ccfcccc8.png) + + :::important[Certificate password] + + If your certificate is protected by a password, you need to set the password here, too. + + ::: +1. When done, click **Continue**. +1. Check the summary and if everything is okay, click **Add certificate**. diff --git a/src/partials/uploading-the-release-candidate-to-google-play.mdx b/src/partials/uploading-the-release-candidate-to-google-play.mdx new file mode 100644 index 0000000..19e912b --- /dev/null +++ b/src/partials/uploading-the-release-candidate-to-google-play.mdx @@ -0,0 +1,22 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Uploading the release candidate to Google Play + +Once you [selected a release candidate](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html) in Bitrise Release Management, you can continue with uploading your app to Google Play. + +:::note[Automatic upload] + +If you set up [auto-upload](/en/release-management/releases/configuring-a-release/configuring-auto-upload.html) during the release configuration or as a [release preset](/en/release-management/releases/release-presets.html), this stage will be completed automatically. + +::: + +To upload the [selected release candidate](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html) to Google Play manually: + +1. Open your release. +1. Select **Google Play** on the left navigation bar. +1. If you selected a valid release candidate, you should see **Ready to upload** under **Google Play**. Click **Upload version**. + + ![google-play-ready-to-upload.png](/img/_paligo/uuid-76fec79f-6b16-d420-3d74-53967ecf4d31.png) +1. Wait for the upload to finish. diff --git a/src/partials/uploading-the-release-candidate-to-testflight.mdx b/src/partials/uploading-the-release-candidate-to-testflight.mdx new file mode 100644 index 0000000..2472fca --- /dev/null +++ b/src/partials/uploading-the-release-candidate-to-testflight.mdx @@ -0,0 +1,18 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Uploading the release candidate to TestFlight + +Once you [selected a release candidate](/en/release-management/releases/managing-the-release-process/selecting-a-release-candidate.html) in Bitrise Release Management, you can continue with uploading your app to Testflight. + +1. Open your release. +1. Select **TestFlight** on the left navigation bar. +1. If you selected a valid release candidate, you should see **Ready to upload** under TestFlight. Click **Upload version** to start the upload. + + You can see the exact build artifact that will be uploaded. + + ![testflight-upload.png](/img/_paligo/uuid-1cc790d0-1d08-d98c-7fdf-2cafa999984d.png) +1. Wait for the upload to finish. + +You can create additional tasks at the **Approvals** stage. diff --git a/src/partials/user-roles-and-collaboration.mdx b/src/partials/user-roles-and-collaboration.mdx new file mode 100644 index 0000000..21eb5c1 --- /dev/null +++ b/src/partials/user-roles-and-collaboration.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## User roles and collaboration + +App Center offers three different roles to manage access to your apps. On Bitrise, control is a little more granular: on each project's team, you can set five different roles to make sure that your team members have the exact right access to the project. + +For more information, check out [Roles and permissions for Bitrise CI](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci). diff --git a/src/partials/using-a-machine-user-to-access-private-repositories.mdx b/src/partials/using-a-machine-user-to-access-private-repositories.mdx new file mode 100644 index 0000000..0ffc7d7 --- /dev/null +++ b/src/partials/using-a-machine-user-to-access-private-repositories.mdx @@ -0,0 +1,50 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using a machine user to access private repositories + +A [machine or bot user](https://docs.github.com/en/developers/overview/managing-deploy-keys#machine-users) is a GitHub user that is not used by humans, instead it is exclusively used for automation. This is the best way to access a private repository: you create a machine user, add a public SSH key to the user, and then provide the user read access to the repository. + +### Adding the machine user to your repository + +1. Create a new GitHub user account, one that will serve as the machine user. +1. Go to your repository on GitHub and select the **Settings** tab. +1. On the left side menu, select **Collaborators & teams**. + + ![Can_I_add_projects_with_submodules_or_with_private_repo_dependencies_.png](/img/_paligo/uuid-987a7495-6bb7-2c5e-0a19-6871b2ca8f1f.png) +1. Scroll down to the **Collaborators** window. +1. In the search input field, search for the username of your newly created account. +1. Click **Add Collaborator**. +1. Change the user permission to **Read**. + + By default, the invited collaborator’s permission is **Write**. You can keep it that way, of course, but a Read permission is enough for Bitrise. + +### Adding the SSH key to the machine user + +In order for Bitrise to be able to use the machine user to access your repository, you must add the same SSH key to the machine user and the project on Bitrise. + +#### When adding a new project + +1. Start the process of [adding your project on Bitrise](/en/bitrise-ci/getting-started/adding-a-new-project.html). +1. When prompted to setup repository access, you can choose from three options: + + **Auto-add a generated SSH key to your repository**: Bitrise automatically registers a public SSH key to your GitHub repository. + + **Copy a generated SSH key to your Git provider manually**: Bitrise generates an SSH keypair for you, and you have to manually register the public key to your Git repository. + + **Add your own SSH key**: You provide your own SSH keypair for authentication, and you have to manually register the public key to your Git repository. +1. Finish the process. +1. Add the same SSH key to your machine user that you added to the project. + +#### When your project already exists + +1. Open your project on Bitrise with a user that has the **Admin** [role on the project](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). +1. On the main page of the project, click on the **Project settings** button. + + ![project-settings-button.png](/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png) +1. On the left, select **Repository**. +1. In the **Authorization** section, find the **Authorization method** card, and click **Copy public key**. + + ![SCR-20260401-pvvq.png](/img/_paligo/uuid-f021126a-47d0-41a9-56f7-79b9c8461a0e.png) +1. [Add it to your GitHub machine user](https://help.github.com/en/articles/adding-a-new-ssh-key-to-your-github-account). diff --git a/src/partials/using-a-private-step-library-via-the-github-app.mdx b/src/partials/using-a-private-step-library-via-the-github-app.mdx new file mode 100644 index 0000000..1b8e4bf --- /dev/null +++ b/src/partials/using-a-private-step-library-via-the-github-app.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using a private Step library via the GitHub App + +Each Bitrise project has a default Step library: a repository of Steps. If the exact source of a Step is not specified in the configuration, the Bitrise CLI pulls the Step data from the default library. + +This library can be a private Step library. To access such a library via the GitHub App, you need to add the **[Authenticate host with netrc](https://bitrise.io/integrations/steps/authenticate-host-with-netrc)** Step as the very first Step which will run in your Workflow: + +``` +format_version: "13" +default_step_lib_source: https://github.com/my-private-org/my-bitrise-steplib.git +project_type: ios +workflows: + example: + steps: + - https://github.com/bitrise-io/bitrise-steplib.git::authenticate-host-with-netrc@0: +``` + +Note that the **[Authenticate host with netrc](https://bitrise.io/integrations/steps/authenticate-host-with-netrc)**Step has [a full source identifier](/en/bitrise-ci/references/steps-reference/step-reference-id-format.html) to ensure it is pulled from the official Bitrise Step library, not your private library. + +Using the Step requires specifying three inputs: the host, the Git username, and the Git password. The Bitrise GitHub App integration uses token-based authentication: each build receives a one time token under the GIT_HTTP_PASSWORD Environment Variable. This Env Var can be used as the password. The username can't be empty because the Step will fail but it is not used so it doesn't matter what you put there. + +``` +format_version: '13' +default_step_lib_source: https://github.com/tothszabi/steplib.git +project_type: ios +workflows: + example: + steps: + - https://github.com/bitrise-io/bitrise-steplib.git::authenticate-host-with-netrc@0: + inputs: + - host: github.com + - username: username + - password: "$GIT_HTTP_PASSWORD" + - private-script@1: {} +``` diff --git a/src/partials/using-a-specific-step-version.mdx b/src/partials/using-a-specific-step-version.mdx new file mode 100644 index 0000000..8d02529 --- /dev/null +++ b/src/partials/using-a-specific-step-version.mdx @@ -0,0 +1,32 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using a specific Step version + +You have the option of using a specific, static Step version. For example, version 3.2.2. This means that no matter what new versions are released for the Step, your Step version will not be updated in the Workflow. + +:::important[YAML mode only!] + +Please note that you cannot set a specific Step version on the graphical UI: you can only lock the Step to either a major or minor version. Setting a specific Step version is only possible in YAML mode. + +::: + +To set a specific Step version, you need to add that version to the Step reference in your app’s configuration YAML file: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Configuration YAML** +1. Find the Workflow and the Step you need. +1. Set the Step version as part of the Step reference. + + In this example, we're setting the **Activate SSH key** Step of the **primary** Workflow to version 4.0.3: + + ``` + workflows: + primary: + steps: + - activate-ssh-key@4.0.3: + ``` diff --git a/src/partials/using-an-env-var-as-a-step-input.mdx b/src/partials/using-an-env-var-as-a-step-input.mdx new file mode 100644 index 0000000..5324d74 --- /dev/null +++ b/src/partials/using-an-env-var-as-a-step-input.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using an Env Var in a Step input + +Many [Step inputs](/en/bitrise-ci/workflows-and-pipelines/steps/step-versions) accept Environment Variables (Env Var) and [Secrets](/en/bitrise-ci/configure-builds/secrets.html) as input values. + +:::important[Sensitive inputs] + +Input fields marked as **SENSITIVE** only accept Secrets as their input. Generally, we do not recommend changing the value of these inputs. + +::: + +To use an Env Var or a Secret as a Step input value: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Select **Env Vars** from the navigation menu on the left. +1. Select a Step from the Workflow. For example, the **Git Clone Repository** Step. +1. Choose a Step input. For example, the **Clone destination (local) directory path** input of the **Git Clone Repository** Step. +1. Next to the name of the input, click **Insert variable**. +1. Find the Env Var in the list, and select it. + + You can search for the Env Var by typing its key (or a part of it) into the **Filter by key** search field. + + :::note[Env Vars generated by Steps] + + The interactive list of Env Vars will show the Env Vars that are generated by previous Steps of the Workflow. For example, if you want to insert an Env Var into one of the inputs of the third Step in the Workflow, you can choose from the Env Vars generated by the first and second Steps. + + ::: + +That's it. The next time you run a build of that Workflow, the Step input will use the value of the inserted Env Var as the Step input value. diff --git a/src/partials/using-env-vars-in-the-value-of-an-env-var.mdx b/src/partials/using-env-vars-in-the-value-of-an-env-var.mdx new file mode 100644 index 0000000..92858ca --- /dev/null +++ b/src/partials/using-env-vars-in-the-value-of-an-env-var.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using Env Vars in the value of an Env Var + +Environment Variables (Env Var) normally contain a simple string value. However, it is possible to set up an Env Var that includes other Env Vars as values. + +:::note[Secrets as variable values] + +The methods described here also apply to [Secrets](/en/bitrise-ci/configure-builds/secrets.html). You can also embed a Secret within an Env Var. + +::: + +You can, at any time, use another Environment Variable in the value of an Env Var - embedding the Env Var, so to speak. For example, let's say we want to set the value of the $BITRISE_AUTH Env Var to $PERSONAL_ACCESS_TOKEN which is another Env Var. + +To do this, you need to make sure that the key of $BITRISE_AUTH is replaced with its value so that its the embedded Env Var that is passed on to the Workflows and Steps. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Env Vars** from the navigation menu. +1. Under the key of the Env Var you need, toggle the **Replace variables in inputs?** toggle to active. diff --git a/src/partials/using-template-expressions-for-step-inputs.mdx b/src/partials/using-template-expressions-for-step-inputs.mdx new file mode 100644 index 0000000..e37f5a8 --- /dev/null +++ b/src/partials/using-template-expressions-for-step-inputs.mdx @@ -0,0 +1,31 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using template expressions for Step inputs + +If you need a Step to use a certain value only in certain circumstances, use template expressions as Step inputs. Template expressions are evaluated before the Step uses the input. They are written in [Go’s template language](https://golang.org/pkg/text/template/). + +Set the `is_template` property in the `step.yml` file of your project to use template expressions. + +1. Open the `step.yml` file of your project. +1. Find the Step in which you wish to use a template expression. +1. Add an `opts` field to the `content` of the Step. +1. Add the `is_template` property to `opts` and set its value to `true`. +1. Add the template expression to the Step’s `content`. + +**Checking if the Bitrise CLI is in CI mode** + +``` +- script: + title: Template example + inputs: + - content: |- + {{if .IsCI}} + echo "CI mode" + {{else}} + echo "not CI mode" + {{end}} + opts: + is_template: true +``` diff --git a/src/partials/using-the-export-test-results-to-the-test-reports-step.mdx b/src/partials/using-the-export-test-results-to-the-test-reports-step.mdx new file mode 100644 index 0000000..df2e418 --- /dev/null +++ b/src/partials/using-the-export-test-results-to-the-test-reports-step.mdx @@ -0,0 +1,38 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using the Export test results to Test Reports Step + +You can use the **Export test results to Test Reports** Step to make sure your test results appear on the **Tests** tab, even if you use Steps that don’t automatically export their results. + +With the correct configuration, the Step finds the test results in your project’s repository and puts them in the export directory. + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. +1. Add the **Export test results to Test Reports** Step to your Workflow after the Step that runs your tests. +1. In the **The name of the test** input, set the name of the test run. +1. In the **Path where custom test results reside** input, set the path where your test results can be found. + + ![Managing_an_app_s_bitrise.png](/img/_paligo/uuid-fd13332e-571f-e706-88ed-a20a29db7aea.png) + + We recommend setting a folder here, though you can also set a specific filepath. The default value is the source directory of your project. Example patterns: + + - If your project’s root directory is `app`: `app/build/test-results/testDemoDebugUnitTest/` + - If your test results are within a project folder but `app` is not the root directory: ./app/build/test-results/testDemoDebugUnitTest/ +1. In the **Test result search pattern** input, set a pattern that matches your test result file. + + This search pattern is used to search every file and folder of the path that was set in the **Path where custom test results reside** input. + + If there is more than one match, the Step will export the first match with a warning in the logs. If you set a specific filepath in the previous input, just set * here. + + Example patterns: + + - Matching all files within the base path: `*` + - Matching all files within a given directory of the base path: `*/build/test-results/testDemoDebugUnitTest/*` +1. In the **Step’s test result directory** input, make sure the path is correct. + + Do NOT modify this input’s value: this is the folder where the **Deploy to Bitrise.io** Step will look for the test results to export them. It should be set to the `$BITRISE_TEST_RESULT_DIR` Env Var. +1. Make sure you have a **Deploy to Bitrise.io** Step in your Workflow. + + If your tests generate attachments, make sure the Step is of version 2.19.x or newer. diff --git a/src/partials/using-the-latest-available-version-of-the-step.mdx b/src/partials/using-the-latest-available-version-of-the-step.mdx new file mode 100644 index 0000000..bd2face --- /dev/null +++ b/src/partials/using-the-latest-available-version-of-the-step.mdx @@ -0,0 +1,26 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using the latest available version of the Step + +Locking on to the latest release of a Step means that if a new version of the Step is released, the user’s Workflow is updated to use that. This includes automatic update to a new major version, potentially breaking the build. So be careful! + +To make sure your Workflow will always use the latest available version of a given Step, all you have to do is remove any version information from the Step reference in the `bitrise.yml` file of your app: + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. On the left, select **Configuration YAML** from the navigation menu. +1. Find the Workflow and the Step you need. +1. Make sure the Step has no version information: + + In this example, we're setting the **Activate SSH key** Step of the **primary** Workflow to the latest version: + + ``` + workflows: + primary: + steps: + - activate-ssh-key: + ``` diff --git a/src/partials/using-the-previous-version-of-a-stack.mdx b/src/partials/using-the-previous-version-of-a-stack.mdx new file mode 100644 index 0000000..bba77cd --- /dev/null +++ b/src/partials/using-the-previous-version-of-a-stack.mdx @@ -0,0 +1,52 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Using the previous version of a stack + +We regularly update the Bitrise stacks based on user requests and external tooling changes. These updates can potentially introduce breaking changes, despite our efforts to avoid those. + +For those cases, we provide a temporary option to use the previous version of a given stack for a few days after the release of a new version. + +- This is meant to be a temporary mechanism only. Because of infrastructure reasons, we can't keep the previous release available forever. Usually, the previous version is removed a few days after a successful release. +- Once the previous version becomes unavailable, new builds run on the latest version even if this feature is enabled. +- If a previous version is not available for a given stack at a given time, the switch is inactive and the feature can't be turned on. Any build triggered will run on the current version of the stack. + +To use the previous version of your stack: + + + + +1. Log in to Bitrise and select **Bitrise CI** on the left, then select your project. +1. Click the **Workflows** button on the main page. + + ![workflows-button.png](/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png) +1. Go to the **Stacks & Machines** tab. +1. Find the stack you want to configure: either the default stack or one of the Workflow-specific stacks. +1. Under the machine type for the chosen stack, toggle the **Use previous version** switch. + + This modifies the `bitrise.yml` file: it adds the previous version of the stack to the `meta` block. + + ![prev-vers.png](/img/_paligo/uuid-eefe9d3d-ab41-f2c3-9657-97994dab1f73.png) + + + + +1. Find the `meta` block in your `bitrise.yml` file. +1. Add a `stack_rollback_version` field with the given version string. + + :::tip[Finding out the previous version number] + + To find out the previous version string, open an older build, switch to the **Details** tab, and look for the **Stack image version** field. + + ::: + + ``` + meta: + stack: osx-xcode-15.0.x + machine_type_id: g2-m1.8core + stack_rollback_version: 2-16-2 + ``` + + + diff --git a/src/partials/using-the-pull-pipeline-intermediate-files-step.mdx b/src/partials/using-the-pull-pipeline-intermediate-files-step.mdx new file mode 100644 index 0000000..871e6e7 --- /dev/null +++ b/src/partials/using-the-pull-pipeline-intermediate-files-step.mdx @@ -0,0 +1,61 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Sharing files between Workflows in a Pipeline + +To share files between Workflows in a Pipeline, you can use the **Deploy to Bitrise.io** Step and the **Pull Pipeline intermediate files** Step. The Step downloads Pipeline intermediate files to a local folder. + +To configure file sharing: + + + + +1. Add the **Deploy to Bitrise.io** Step to the Workflow that generates the file(s) you need. +1. In the **Pipeline Intermediate File Sharing** input group, find the **Files to share between Pipeline Workflows** input and add the files as a newline-separated list of colon-separated items using the following structure: `:`. + + You can use another Environment Variable as a filepath: for an iOS project, `$BITRISE_IPA_PATH:BITRISE_IPA_PATH` is a valid way to share a generated IPA with other Workflows. +1. Add the **[Pull Pipeline intermediate files](https://www.bitrise.io/integrations/steps/pull-intermediate-files)** Step to any Workflow that needs the generated files. +1. Use the **Intermediate file source** input to specify a set of Workflows from which you need files. + + ![pipeline-intermediate.png](/img/_paligo/uuid-5d9fd00b-0507-1ae7-80a2-b42a4377343e.png) + + You can use wildcards in the input. In the example above, we’re pulling all intermediate files from all Workflows which have a name starting with `workflow`. +1. When the Step finishes, your files and directories specified via the **[Deploy to Bitrise.io - Apps, Logs, Artifacts](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step should be available. + + + + +1. Add the **Deploy to Bitrise.io** Step to the Workflow that generates the file(s) you need. +1. Add the files to the `pipeline_intermediate_files` input as a newline-separated list of colon-separated items using the following structure: `:`. + + You can use another Environment Variable as a filepath: for an iOS project, `$BITRISE_IPA_PATH:BITRISE_IPA_PATH` is a valid way to share a generated IPA with other Workflows. + + ``` + steps: + - deploy-to-bitrise-io: { + inputs: + - pipeline_intermediate_files: "$BITRISE_IPA_PATH:BITRISE_IPA_PATH" + ``` +1. Add the **[Pull Pipeline intermediate files](https://www.bitrise.io/integrations/steps/pull-intermediate-files)** Step to any Workflow that needs the generated files: + + ``` + steps: + - pull-intermediate-files: {} + ``` +1. Use the `artifact_sources` input to specify a set of Workflows from which you need files: + + ``` + steps: + - pull-intermediate-files@1: + inputs: + - artifact_sources: workflow.* + ``` + + You can use wildcards in the input. In the example above, we’re pulling all intermediate files from all Workflows which have a name starting with `workflow`. +1. When the Step finishes, your files and directories specified via the **[Deploy to Bitrise.io - Apps, Logs, Artifacts](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)** Step should be available. + + + + +For more information and details, check out the [Step repository](https://www.bitrise.io/integrations/steps/pull-intermediate-files). diff --git a/src/partials/utility-workflows.mdx b/src/partials/utility-workflows.mdx new file mode 100644 index 0000000..08aa2bf --- /dev/null +++ b/src/partials/utility-workflows.mdx @@ -0,0 +1,52 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Utility Workflows + +:::important[Step bundles] + +Instead of utility Workflows, we strongly recommend using [Step bundles](/en/bitrise-ci/workflows-and-pipelines/steps/step-bundles.html). They allow you to group multiple Steps into a single unit and reuse them at any point of a Workflow. + +::: + +Bitrise supports a special type of Workflow called a utility Workflow. A utility Workflow's ID always starts with an underscore character: for example, `_setup`. They are usually used to perform tasks that are required either at the start or at the end of several different Workflows: for example, you can separate git cloning and activating your SSH key into a utility Workflow instead of adding those Steps to every Workflow of an app. + +You can create a utility Workflow [the exact same way](/en/bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow.html) as you create a regular one. To denote it as a utility Workflow, you just need to prefix the name with an underscore. + +:::important[Utility Workflows cannot run alone] + +Utility Workflows cannot be run as standalone Workflows. They need to be chained together with a normal Workflow, either before or after the Workflow: [Chaining Workflows together](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together). + +::: + +**Utility Workflow in YAML** + +In this example, we have two utility Workflows, called `_setup` and `_send-notifications`. They are chained together with two Workflows called `test` and `ci` using the before_run and after_run parameters. + +``` +workflows: + _send-notifications: + steps: + # send notifications + + _setup: + steps: + # setup Steps to run + + test: + before_run: + - _setup + envs: + - IS_TEST: "true" + steps: + # test Steps to run + + ci: + before_run: + - test + after_run: + - _send-notifications +``` + +For more information on how to manage Workflows directly in the `bitrise.yml` file, check [Workflow level properties](/en/bitrise-ci/references/configuration-yaml-reference/workflow-level-properties). diff --git a/src/partials/verified-domain.mdx b/src/partials/verified-domain.mdx new file mode 100644 index 0000000..449ec8d --- /dev/null +++ b/src/partials/verified-domain.mdx @@ -0,0 +1,29 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Verifying your domain + +You can add and verify your corporate domains from where you will manage Bitrise users. You can have multiple verified domains on Bitrise but you can only add one domain at a time. Multiple subdomains of the same domain count as different domains as Bitrise expects an exact match. + +Verifying your domain is a requirement for configuring SCIM and it makes it much more convenient for users to sign up and log in to Bitrise via SAML SSO. We recommend starting your SAML SSO setup with verifying your domain as the process can take some time. + +1. Log in to Bitrise and hover over the left navigation bar. +1. Make sure you have the right workspace selected in the **Workspace** menu. +1. Select **Settings**. + + ![workspace-settings.png](/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png) +1. On the left, select **Single sign-on**. +1. Select the **Domains** tab. +1. In the **Domain control** section, click **Add domain**. +1. Enter your domain name in the dialog box, and click **Next**. + + :::important[Handling subdomains] + + Bitrise expects an exact match for the domain names. If you use subdomains, you need to add the full name of the subdomain. For example, if you own mydomain.com and you want to use its subdomain external.mydomain.com, you should write it out the subdomain's name when setting up domain control on Bitrise. + + ::: +1. You will see a domain verification code. You need to add this code to as a DNS TXT record at your domain provider. +1. Click **Copy and close** to copy the verification code and close the dialog box. + +After you've added the DNS TXT record at your domain provider, we'll commence domain verification. This can take up to 72 hours. You will receive an email once it is completed. diff --git a/src/partials/viewing-data-from-a-specific-timeframe.mdx b/src/partials/viewing-data-from-a-specific-timeframe.mdx new file mode 100644 index 0000000..f45e939 --- /dev/null +++ b/src/partials/viewing-data-from-a-specific-timeframe.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Viewing data from a specific timeframe + +By default, all Insights pages display your metrics on a weekly basis from the last 12 weeks. Modify the basis and timeframe by opening the respective dropdown menu in the top right of the page, and selecting the options you need. + +![builds_timeframe.png](/img/_paligo/uuid-a5b75043-f9b0-b1c3-51ac-dc1be80e1034.png) diff --git a/src/partials/viewing-test-results.mdx b/src/partials/viewing-test-results.mdx new file mode 100644 index 0000000..32c9c6b --- /dev/null +++ b/src/partials/viewing-test-results.mdx @@ -0,0 +1,37 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Viewing test results + +:::note[Rich HTML reporting] + +If you use [rich HTML test reports](/en/bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format.html), you can still find those on the **Artifacts** tab. + +::: + +To view your results, open the build page and select the **Tests** tab. Your tests are sorted into different tabs based on their status: + +- Failed +- Passed +- Skipped +- Error +- Flaky + +By default, Bitrise shows the list of failed tests. You can view test run details within each of these categories. + +Click any test to check the details: the duration of the test, the output, and any attachments that the test generated. For easier debugging of failures, test reports display attached image files in line with their associated test cases. + +:::note[Supported file formats] + +Currently, we support the following file formats for attachments: + +`.jpg, .jpeg, .png, .txt, .log, .mp4, .webm, .ogg` + +::: + +You can view flaky tests on the **Flaky** tab. Flaky tests are tests that sometimes fail and sometimes succeed without any changes in the code. If a test fails and then succeeds on [an automatic retry](/en/bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps/test-repetitions), Bitrise marks the test as flaky, and you can view it on the **Flaky** tab. It also displays the details and attachments for each retry of the test. You can find more information on how to detect flaky tests and how to quarantine them, if needed, in [Detecting and quarantining flaky tests](https://docs.bitrise.io/en/bitrise-ci/testing/detecting-and-quarantining-flaky-tests.html). + +![test-run.png](/img/_paligo/uuid-53eba539-6b4d-b4cf-c33d-6168fca79640.png) + +Test reports also support the use of the `system-out` tag in JUnit. If a test case includes this tag, we display its contents on the **Test output** tab. If a test case has both a `system-out` tag and produces an error message, we display both. diff --git a/src/partials/viewing-the-build-data-of-an-app.mdx b/src/partials/viewing-the-build-data-of-an-app.mdx new file mode 100644 index 0000000..99fcbec --- /dev/null +++ b/src/partials/viewing-the-build-data-of-an-app.mdx @@ -0,0 +1,175 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Viewing the build data of an app + +You can access all relevant build information with the help of the API. + +You can get all builds of an app with the `GET /apps/{app-slug}/builds` endpoint. You can set additional parameters, such as the Workflow that was used for the build, to act as filters. Set parameters in the following format: + +``` +GET /apps/{app-slug}/builds?parameter_name=parameter_value&other_parameter_name=other_parameter_value +``` + +The full list of parameters can be found in the [API reference](/en/bitrise-ci/api/api-reference) documentation. + +:::note[Build retention for 200 days] + +On the **Builds** page of your app, we only show builds from the last 200 days. The same limit applies if you are [searching for specific builds](/en/bitrise-ci/run-and-analyze-builds/finding-a-specific-build.html) on the page. This limitation also applies to most API calls: the `GET/apps/{app-slug}/builds` endpoint and related endpoints can only return builds from the last 200 days. + +However, there are two methods to get a build that is older than 200 days: + +- If you know the exact build URL, you can access the build. +- You can use the `GET/apps/{app-slug}/archived-builds` API endpoint: [Listing the archived builds of an app](/en/bitrise-ci/api/managing-an-app-s-builds/listing-the-archived-builds-of-an-app). + +::: + +**Listing builds that built the `development` branch with the primary Workflow** + +Request: + +``` +curl -X GET 'https://api.bitrise.io/v0.1/apps/$APP-SLUG/builds?branch=development&workflow=primary' -H 'accept: application/json' -H 'Authorization: $ACCESS_TOKEN' +``` + +Response (in this example, the response shows only a single build): + +``` +{ + "data": [ + { + "triggered_at": "2022-07-18T13:12:35Z", + "started_on_worker_at": null, + "environment_prepare_finished_at": null, + "finished_at": "2022-07-18T13:12:47Z", + "slug": "294e02x8-554c-44f8-84a5-59867a66df83", + "status": 3, + "status_text": "aborted", + "abort_reason": "User X requested to abort this build.", + "is_on_hold": false, + "is_processed": true, + "is_status_sent": false, + "branch": "development", + "build_number": 8, + "commit_hash": null, + "commit_message": null, + "tag": null, + "triggered_workflow": "primary", + "triggered_by": null, + "machine_type_id": "g2.4core", + "stack_identifier": "osx-xcode-13.3.x", + "original_build_params": { + "branch": "development" + }, + "pipeline_workflow_id": null, + "pull_request_id": 0, + "pull_request_target_branch": null, + "pull_request_view_url": null, + "commit_view_url": null, + "credit_cost": null + } + ], + "paging": { + "total_item_count": 1, + "page_item_limit": 50 + } +} +``` + +To get the same data for a specific build, call `GET /apps/{app-slug}/builds/{build-slug}`. You can also view the `bitrise.yml` file of the build by adding `/bitrise.yml` to the end of the URL. + +**Listing failed builds using the status integer** + +You can use the status integer to filter your builds based on build statuses. The status integers are: + +- 0 - Not finished (these are builds that are either starting, running, or on hold) +- 1 - Successful +- 2 - Failed +- 3 - Aborted with failure +- 4 - Aborted with success + +Request: + +``` +curl -X GET 'https://api.bitrise.io/v0.1/apps/$APP-SLUG/builds?branch=development&status=2' -H 'accept: application/json' -H 'Authorization: $ACCESS_TOKEN' +``` + +Response (in this example there were two failed builds): + +``` +{ + "data": [ + { + "triggered_at": "2022-08-01T09:20:11Z", + "started_on_worker_at": "2022-08-01T09:20:15Z", + "environment_prepare_finished_at": "2022-08-01T09:20:15Z", + "finished_at": "2022-08-01T09:21:32Z", + "slug": "104d4527-f6a0-4362-b595-77349ccc1264", + "status": 2, + "status_text": "error", + "abort_reason": null, + "is_on_hold": false, + "is_processed": true, + "is_status_sent": false, + "branch": "main", + "build_number": 26, + "commit_hash": null, + "commit_message": null, + "tag": null, + "triggered_workflow": "Appetize.io", + "triggered_by": "manual-danicsorba", + "machine_type_id": "g2.4core", + "stack_identifier": "osx-xcode-13.2.x", + "original_build_params": { + "branch": "main", + "workflow_id": "Appetize.io" + }, + "pipeline_workflow_id": null, + "pull_request_id": 0, + "pull_request_target_branch": null, + "pull_request_view_url": null, + "commit_view_url": null, + "credit_cost": 4 + }, + { + "triggered_at": "2022-04-27T10:25:47Z", + "started_on_worker_at": "2022-04-27T10:26:24Z", + "environment_prepare_finished_at": "2022-04-27T10:26:24Z", + "finished_at": "2022-04-27T10:27:16Z", + "slug": "b8599c39-201d-4cc9-8ef5-f28b75b7d910", + "status": 2, + "status_text": "error", + "abort_reason": null, + "is_on_hold": false, + "is_processed": true, + "is_status_sent": false, + "branch": "main", + "build_number": 25, + "commit_hash": null, + "commit_message": null, + "tag": null, + "triggered_workflow": "Appetize.io", + "triggered_by": "manual-danicsorba", + "machine_type_id": "g2.4core", + "stack_identifier": "osx-xcode-13.2.x", + "original_build_params": { + "branch": "main", + "workflow_id": "Appetize.io" + }, + "pipeline_workflow_id": null, + "pull_request_id": 0, + "pull_request_target_branch": null, + "pull_request_view_url": null, + "commit_view_url": null, + "credit_cost": 2 + } + ], + "paging": { + "total_item_count": 2, + "page_item_limit": 50 + } +} +``` + +You can try any of these endpoints in the [API reference](/en/bitrise-ci/api/api-reference) documentation. diff --git a/src/partials/viewing-the-secrets-of-an-app.mdx b/src/partials/viewing-the-secrets-of-an-app.mdx new file mode 100644 index 0000000..eac7c40 --- /dev/null +++ b/src/partials/viewing-the-secrets-of-an-app.mdx @@ -0,0 +1,35 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Viewing the Secrets of an app + +:::important[Required role] + +You must have an admin or owner role on the app's team to view Secrets using the Bitrise API. + +For a complete list of user roles and role cheatsheets, check [User roles on app teams](/en/bitrise-platform/projects/roles-and-permissions-for-bitrise-ci.html). + +::: + +You can view the Secrets of an app with the help of the API. + +You can get a list of all the Secrets of an app with the `GET/apps/{app-slug}/secrets` endpoint. + +You can view a specific Secret if its `is_protected` value is set to `false`. + +**Viewing an app's Secret called "test"** + +Request: + +``` +curl -X GET -H 'Authorization: THE-ACCESS-TOKEN' 'https://api.bitrise.io/v0.1/apps/APP-SLUG/secrets/test/value' +``` + +The response will give the value of the Secret if its `is_protected` value is set to `false`: + +``` +{ + "value": "123ld" +} +``` diff --git a/src/partials/viewing-your-coverage-reports-on-codecov.mdx b/src/partials/viewing-your-coverage-reports-on-codecov.mdx new file mode 100644 index 0000000..c853125 --- /dev/null +++ b/src/partials/viewing-your-coverage-reports-on-codecov.mdx @@ -0,0 +1,13 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Viewing your coverage reports on Codecov + +To view your coverage on Codecov, you can do the following: + +- View the URL supplied on the Codecov Step on Bitrise. + + ![pic4.png](/img/_paligo/uuid-d981eb34-fe27-6796-ff24-0e9206369758.png) +- Go to[https://codecov.io](https://about.codecov.io/)and navigate directly to the applicable pull request or commit. +- Click on the links provided by Codecov that are available on your code host’s status checks or pull request comment. diff --git a/src/partials/warmup-script-for-github-actions.mdx b/src/partials/warmup-script-for-github-actions.mdx new file mode 100644 index 0000000..9d95ed1 --- /dev/null +++ b/src/partials/warmup-script-for-github-actions.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Warmup script + +Use a warmup script to customize your build environment and improve speed and performance. You can add any script to your configuration when creating a machine pool. The script will run when the machine is set up. + +Make sure that it returns a non-zero exit code in case of an error. The script will only fail if your script returns with a non-zero exit code. diff --git a/src/partials/watching-an-app.mdx b/src/partials/watching-an-app.mdx new file mode 100644 index 0000000..b80a2f9 --- /dev/null +++ b/src/partials/watching-an-app.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Watching a project + +Watching a Bitrise project means getting email notifications for that project. Turning off watching the project means you won't get automatic notifications. + +To enable watching: + +1. Open [Bitrise CI](https://app.bitrise.io/dashboard). +1. From the project list on the right, select your project. +1. On the left, toggle **Watching**. + + ![watching-app.png](/img/_paligo/uuid-ed3b91d2-8138-ca73-f9f2-048ab808f5ca.png) diff --git a/src/partials/webhook-events.mdx b/src/partials/webhook-events.mdx new file mode 100644 index 0000000..defd4b9 --- /dev/null +++ b/src/partials/webhook-events.mdx @@ -0,0 +1,96 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Webhook events + +Multiple release automation events can trigger a webhook. All webhooks contain the following fields: + +| `Field name` | `Format` | +| --- | --- | +| `app_id` | | +| `project_id` | | +| `release_candidate_artifact_id` | | +| `release_id` | | +| `sent_at` | Nanosecond precision UNIX timestamp | +| `store_app_id` | | +| `triggered_at` | Nanosecond precision UNIX timestamp | +| `triggered_by` | Either a user slug or one of: `Automation`, `Apple App Store`, `Google Play Store` | +| `trigger_event` | | +| `webhook_config_id` | | +| `webhook_connection_id` | | +| `webhook_event_unique_id` | `WEBHOOK_ID@TRIGGER_TIMESTAMP_NANO` | +| `workspace_id` | | + +The following webhook events are available. The **Fields** column contains the additional fields that the triggering event adds to the webhook payload. + +| Webhook name | Trigger event | Fields | +| --- | --- | --- | +| App version added | `app_version_added` | - `description` - `preset_template_id` | +| Release description changed | `release_description_changed` | - `description` | +| Auto-upload enabled | `auto-upload_enabled` | | +| Auto-upload disabled | `auto-upload_disabled` | | +| Slack connection changed | `slack_connection_changed` | | +| Microsoft Teams connection changed | `microsoft_teams_connection_changed` | | +| Automation added | `automation_added` | - `event_name` - `pipeline_name` - `workflow_name` | +| Automation removed | `automation_removed` | - `event_name` - `pipeline_name` - `workflow_name` | +| Outgoing webhook added | `outgoing_webhook_added` | - `all_events` Available values: `true/false` - `events`: Listed only if `all_events` are false. - `workspace_webhook_id` | +| Outgoing webhook updated | `outgoing_webhook_updated` | - `all_events` true/false - `events`: Listed only if `all_events` are false - `workspace_webhook_id` | +| Outgoing webhook deleted | `outgoing_webhook_deleted` | - `all_events` Available values: `true/false` - `events` Listed only if `all_events` are false - `workspace_webhook_id` | +| Stopped managing release | `stopped_managing_release` | - `reason_for_stopping` Available values: `abandoned/completed externally` | +| Release candidate source changed | `release_candidate_source_changed` | - `from_source` Available values: `ci/api/empty string` - `to_source` Available values: `ci/api` - `from_branch`: Only if the value of `from_source` is `ci` - `from_workflow`: Only if the value of `from_source` is `ci`. - `to_branch`: Only if the value of `to_source` is `ci`. - `to_workflow`: Only if the value of `to_source` is `ci`. | +| Release candidate auto select latest build disabled | `release_candidate_auto_select_latest_build_disabled` | | +| Release candidate auto select latest build enabled | `release_candidate_auto_select_latest_build_enabled` | | +| Release candidate build selected | `release_candidate_build_selected` | - `file_name` - `version` - `version_code` | +| TestFlight upload started | `testflight_upload_started` | - `file_name` - `version` - `version_code` | +| TestFlight upload failed | `testflight_upload_failed` | - `file_name` - `version` - `version_code` | +| TestFlight upload completed | `testflight_upload_completed` | - `file_name` - `version` - `version_code` | +| TestFlight processing failed | `testflight_processing_failed` | - `file_name` - `version` - `version_code` | +| TestFlight processing completed | `testflight_processing_completed` | - `file_name` - `version` - `version_code` | +| TestFlight what to test added | `testflight_what_to_test_added` | - `language` - `what_to_test` | +| TestFlight what to test changed | `testflight_what_to_test_changed` | - `language` - `what_to_test` | +| TestFlight what to test deleted | `testflight_what_to_test_deleted` | - `language` | +| TestFlight app review submitted | `testflight_app_review_submitted` | - `testflight_beta_build_id` | +| TestFlight app review approved | `testflight_app_review_approved` | - `testflight_beta_build_id` | +| TestFlight app review rejected | `testflight_app_review_rejected` | - `testflight_beta_build_id` | +| TestFlight distribution started | `testflight_distribution_started` | - `group_id` - `testflight_beta_build_id` | +| TestFlight distribution start failed | `testflight_distribution_start_failed` | - `group_id` - `testflight_beta_build_id` | +| TestFlight distribution stopped | `testflight_distribution_stopped` | - `group_id` - `testflight_beta_build_id` | +| Google Play upload started | `google_play_upload_started` | - `file_name` - `version` - `version_code` | +| Google Play upload completed | `google_play_upload_completed` | - `file_name` - `version` - `version_code` | +| Google Play upload failed | `google_play_upload_failed` | - `file_name` - `version` - `version_code` | +| Google Play testing track release completed | `google_play_testing_track_release_completed` | - `file_name` - `track_name` - `version` - `version_code` | +| Google Play testing track release failed | `google_play_testing_track_release_failed` | - `file_name` - `track_name` - `version` - `version_code` | +| Approval tasks completed | `approval_tasks_completed` | - `approval_task_ids` - `skipped_with_zero_tasks (boolean)` | +| Approval task added | `approval_task_added` | - `approval_id` - `assigned_to` - `created_by` - `description` - `due_date` - `title` | +| Approval task changed | `approval_task_changed` | - `approval_id` - `assigned_to` - `created_by` - `description` - `due_date` - `title` | +| Approval task completed | `approval_task_completed` | - `approval_id` - `assigned_to` - `created_by` - `description` - `due_date` - `title` | +| Approval task deleted | `approval_task_deleted` | - `approval_id` - `assigned_to` - `created_by` - `description` - `due_date` - `title` | +| Approval task reopened | `approval_task_reopened` | - `approval_id` - `assigned_to` - `created_by` - `description` - `due_date` - `title` | +| App store version created | `app_store_version_created` | - `version` | +| App store version updated | `app_store_version_updated` | - `version` | +| Metadata localization added | `metadata_localization_added` | - `language` - `added_values` | +| Metadata localization changed | `metadata_localization_changed` | - `language` - `changed_values` | +| Metadata localization removed | `metadata_localization_removed` | - `language` | +| Release settings changed | `release_settings_changed` | - `earliest_release_date` - `phased_release` - `release_type` - `version_string` | +| Phased release enabled | `phased_release_enabled` | | +| Phased release disabled | `phased_release_disabled` | | +| App store review submitted | `app_store_review_submitted` | - `file_name` - `version` - `version_code` | +| App store review cancelled | `app_store_review_cancelled` | - `file_name` - `version` - `version_code` | +| App store review rejected | `app_store_review_rejected` | - `file_name` - `reason` - `version` - `version_code` | +| App store review approved | `app_store_review_approved` | - `file_name` - `version` - `version_code` | +| App store release cancelled | `app_store_release_cancelled` | - `file_name` - `version` - `version_code` | +| Phased release paused | `phased_release_paused` | - `percentage_of_users` | +| Phased release resumed | `phased_release_resumed` | - `percentage_of_users` | +| App store release started | `app_store_release_started` | | +| App store release completed | `app_store_release_completed` | | +| Google Play release notes localization added | `google_play_release_notes_localization_added` | - `language` - `release_notes` | +| Google Play release notes localization changed | `google_play_release_notes_localization_changed` | - `language` - `release_notes` | +| Google Play release notes localization removed | `google_play_release_notes_localization_removed` | - `language` - `release_notes` | +| Google Play release started | `google_play_release_started` | - `release_method` - `staged_release` | +| Google Play rollout percentage changed | `google_play_rollout_percentage_changed` | - `release_method` - `rollout_percentage_from` - `rollout_percentage_to` | +| Google Play automated rollout configured | `google_play_automated_rollout_configured` | - `rollout_start_time` | +| Google Play automated rollout paused | `google_play_automated_rollout_paused` | - `rollout_percentage` | +| Google Play automated rollout resumed | `google_play_automated_rollout_resumed` | - `rollout_percentage` | +| Google Play automated rollout cancelled | `google_play_automated_rollout_cancelled` | | +| Google Play release completed | `google_play_release_completed` | | diff --git a/src/partials/whats-next.mdx b/src/partials/whats-next.mdx new file mode 100644 index 0000000..ac24286 --- /dev/null +++ b/src/partials/whats-next.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## What's next? + +Now that you have code coverage reports, you can take it to the next level with the following suggestions: + +- Set [non-blocking status checks](https://docs.codecov.com/docs/common-recipe-list#set-non-blocking-status-checks) to get your developers in the habit of thinking about code coverage. +- Start working towards code coverage by setting status checks to[increase overall coverage](https://docs.codecov.com/docs/common-recipe-list#increase-overall-coverage-on-each-pull-request) on every pull request. +- Isolate your coverage reports for different types of tests or different parts of your system with [Flags](https://docs.codecov.io/docs/flags) to measure what matters. +- Already using flags and don’t want to run your entire test suite with every Bitrise CI run? Try out [Carryforward Flags](https://docs.codecov.io/docs/carryforward-flags) to measure only what changes. diff --git a/src/partials/when-to-choose-the-aws-option.mdx b/src/partials/when-to-choose-the-aws-option.mdx new file mode 100644 index 0000000..6aec122 --- /dev/null +++ b/src/partials/when-to-choose-the-aws-option.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## When to choose the AWS option + +If you need to run Bitrise builds on infrastructure that you control, we offer two options: using Amazon EC2 Mac or Linux instances or our on-premise option. + +We recommend using Amazon EC2 instances to run Bitrise builds if you or your company already has an AWS account to operate important infrastructure. Using an Amazon EC2 instance comes with several advantages: + +- Plug and play: we provide the Amazon Machine Image (AMI) as a mobile-specific build environment, with all required tools preinstalled. No specific setup needed: you only need to configure the EC2 Mac or Linux instance. +- Control your environment: you can configure network and storage settings during the launch of the instance (for example, you can configure a separate subnet for your Bitrise builds) to make sure all build machines run in their own AWS environment and operate according to company security policies. +- Security: your code base will remain entirely in your control. + + :::caution[Information leaving the AWS environment] + + Using certain features means leaving the AWS environment: for example, using the build cache, generating build artifacts or test results. + + ::: + +If you don't have an AWS account, use some other cloud provider, or already manage your own machines, we recommend checking out [our on-premise runner offering](/en/bitrise-platform/infrastructure/running-bitrise-builds-on-premise.html). diff --git a/src/partials/when-to-use-the-on-premise-option.mdx b/src/partials/when-to-use-the-on-premise-option.mdx new file mode 100644 index 0000000..55908d4 --- /dev/null +++ b/src/partials/when-to-use-the-on-premise-option.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## When to use the on-premise runner + +If you need to run Bitrise builds on infrastructure that you control, Bitrise offers two options: using Amazon EC2 Mac or Linux instances, or the on-premise runner option. + +We only recommend using the on-premise runner if you have the necessary machines or use a cloud provider other than AWS for your infrastructure needs. The on-premise runner is NOT plug and play: you need to make sure all necessary tools and services are installed on your machines. + +If you do have an AWS account for managing your infrastructure, we recommend checking our [AWS offering](/en/bitrise-platform/infrastructure/bitrise-on-aws--manual-setup.html). diff --git a/src/partials/where-does-bitrise-run-its-llm-inference.mdx b/src/partials/where-does-bitrise-run-its-llm-inference.mdx new file mode 100644 index 0000000..e38807b --- /dev/null +++ b/src/partials/where-does-bitrise-run-its-llm-inference.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Where does Bitrise run its LLM inference? + +Bitrise differentiates between the following **Inference Locations** (where the model is used and meets Customer data). Not all models are available at all Inference Locations. + +| Inference Location | Deployment / Inference Location | +| --- | --- | +| "Local" | On-device, where the service is running – for example, on the same server where the build/test process is happening | +| "Bitrise-hosted GPU" | Inside Bitrise-managed VPC and servers | +| "Bitrise-controlled CSP account" | For example, AWS Bedrock, GCP Vertex AI | +| "Third-party API vendor" | For example, OpenAI, Anthropic | diff --git a/src/partials/which-bitrise-features-use-aillms.mdx b/src/partials/which-bitrise-features-use-aillms.mdx new file mode 100644 index 0000000..748c3c2 --- /dev/null +++ b/src/partials/which-bitrise-features-use-aillms.mdx @@ -0,0 +1,12 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Which Bitrise features use AI/LLMs? + +| Feature | Type of Customer data involved | Allowed Inference Locations | Allowed Models | +| --- | --- | --- | --- | +| Code reviewer | - Parts of Customer’s source code (diff hunks, changed files, and so on) | all | all | +| Bitrise Coding Agent | - Customer’s source code - Environment variables - Secrets for builds | all | all | +| Compare invocations / analysis | - Usage data: build count, build length, error rate, cache hit rate, bytes transferred, etc. - Infrastructure related data: VM load (CPU and memory) and related telemetry, datacenter location - Environment variables - Parts of customer’s source code | all | all | +| AI Assistant | - Parts of Customer's build log (failed Step log chunks) - Build metadata like: Step title, stack name, machine type, Git branch name, commit messages. | all | all | diff --git a/src/partials/which-large-language-models-llms-does-bitrise-use.mdx b/src/partials/which-large-language-models-llms-does-bitrise-use.mdx new file mode 100644 index 0000000..17c9607 --- /dev/null +++ b/src/partials/which-large-language-models-llms-does-bitrise-use.mdx @@ -0,0 +1,15 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Which large language models (LLMs) does Bitrise use? + +Bitrise utilizes the following model families, with their Inference Location indicating where each model is used and interacts with Customer data. + +| Model name / Provider | Deployment / Inference Location | Data RetentionThe Data Retention is set by the LLM service provider for regulatory/safety compliance. Bitrise does not retain data and works with LLM service providers to set Zero Data Retention wherever possible. by the service provider | +| --- | --- | --- | +| Gemini models (proprietary models) | GCP Vertex AI | Zero Data Retention | +| OpenAI models (proprietary models) | OpenAI hosted API endpoints | Ephemeral <30 days | +| Anthropic models (proprietary models) | Anthropic hosted API endpoints | Zero Data Retention | +| Anthropic models (proprietary models) | AWS Bedrock | Zero Data Retention | +| Grok models | X.ai hosted API endpoints | Zero Data Retention | diff --git a/src/partials/who-owns-the-intellectual-property-generated-by-llms.mdx b/src/partials/who-owns-the-intellectual-property-generated-by-llms.mdx new file mode 100644 index 0000000..e2cc3fa --- /dev/null +++ b/src/partials/who-owns-the-intellectual-property-generated-by-llms.mdx @@ -0,0 +1,21 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Who owns the intellectual property generated by LLMs? + +Ownership follows the same data‑classification logic we apply throughout this FAQ: the more closely a piece of AI output can be traced back to your original, non‑anonymizable material, the more completely it belongs to you. Everything else remains ours. + +| Category of input data that produced the AI output | Who owns the output? | Rationale | +| --- | --- | --- | +| **Non-Anonymizable Customer Sensitive Content** (for example, your source code, build secrets, etc.) | **Customer** (you) | This output is effectively an extension of content you already own and that we commit never to retain or use for secondary purposes. | +| **Anonymized Customer Sensitive Content** (for example, anonymized build logs, failure statistics, etc.) | **Bitrise** | Once sensitive fields are stripped, the output no longer carries proprietary customer information. We may reuse it to improve the service. | +| **Customer Non-Sensitive Data** (for example, telemetry, publicly available metadata, search input string, etc.) | **Bitrise** | These inputs are either non-sensitive in nature, or generated by or already belong to Bitrise. | + +### What you can do with Bitrise‑owned output + +Bitrise-owned outputs that are made available to you as part of the Bitrise Services are available for you to use together with the Bitrise Services that you are otherwise licensed to use. + +### What Bitrise can do with customer‑owned output + +If the output is derived from your Non‑Anonymizable Sensitive Content, Bitrise keeps no rights beyond those needed to generate and display it back to you. We do not reuse or re‑train models on that output without your explicit permission and all intellectual property rights remain with you. For example, if a coding agent operated by Bitrise generates code changes based on your source code, you fully own the generated code. diff --git a/src/partials/why-bother-migrating.mdx b/src/partials/why-bother-migrating.mdx new file mode 100644 index 0000000..0cf3e08 --- /dev/null +++ b/src/partials/why-bother-migrating.mdx @@ -0,0 +1,24 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Why bother migrating? + +Jenkins is a self-hosted CI server where you have to manually install and maintain most of the functionalities before you could run any build. It also requires dedicated engineering resources for regular maintenance. When you switch to Bitrise, you get to experience the comfort of using a cloud-based, mobile first CI/CD platform which offers out-of-the box functionalities for all your mobile development needs on one platform. This means there is: + +- No need to download anything. +- No need for any on-premise servers or plugins. +- No need to worry about infrastructure, tools and virtualization. + +Bitrise takes care of all of the above. We have a vast array of automatized Steps, [API](/en/bitrise-ci/api/api-overview.html), [CLI](/en/bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli.html), and [up-to-date Stacks](https://stacks.bitrise.io) with a highly intuitive GUI, called Workflow Editor, all available at your fingertips. + +Learn more about our security measures on our [Security page](https://bitrise.io/platform/devops/security)which includes details on product, data, application, network, physical and business security. + +Check out the world of automated mobile development with Bitrise! + +:::note[How Bitrise helped top companies migrate] + +- Discover how payments giant PagSeguro optimized mobile CI by moving from Jenkins to Bitrise: [Read the case study](https://bitrise.io/blog/post/smart-ways-to-optimize-your-ci). +- Looking for a feature-by-feature breakdown of Bitrise vs Jenkins? [Check out our comparison page](https://bitrise.io/resources/compare/jenkins). + +::: diff --git a/src/partials/workflow-level-properties.mdx b/src/partials/workflow-level-properties.mdx new file mode 100644 index 0000000..710e896 --- /dev/null +++ b/src/partials/workflow-level-properties.mdx @@ -0,0 +1,265 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Workflow level properties + +### `workflows::title` + +The title of the Workflow. + +It appears on the UI of the Workflow Editor. + +**Example of `workflows::title`** + +```yaml +workflows: + primary: + title: Primary Workflow +``` + +### `workflows::summary` + +A short summary of the Workflow. + +**Example of** + +```yaml +workflows: + primary: + summary: This Workflow runs unit tests. +``` + +### `workflows::description` + +A detailed description of the Workflow. + +**Example of `workflows::description`** + +```yaml +workflows: + primary: + description: This Workflow runs unit tests with test sharding, and exports the test results to the test reports page. +``` + +### `workflows::triggers` + +Target-based triggers defined for the Workflow: if a code event matches the condition defined in a trigger, Bitrise will trigger a build with the Workflow. + +Each trigger defines a code event and at least one condition. If you define multiple conditions in a single trigger, all of them must match to trigger a build. + +For the detailed syntax of the `triggers` property and its available options, check out: + +Read more: [YAML syntax for build triggers](/en/bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers). + +**Example of `workflows::triggers`** + +In this example, a build is triggered if: + +- A commit is pushed to the `main` branch. +- A pull request is opened from any branch. + +```yaml +workflows: + primary: + triggers: + push: + - branch: main + pull_request: + - source_branch: "*" +``` + +### `workflows::status_report_name` + +The name that will appear on the status report sent to connected services (like GitHub, GitLab, Bitbucket, and so on) after the build is finished. + +It can have both static and dynamic values, as well as combine the two types. + +**Supported characters and variables**: + +- `A-Za-z,.():/-_0-9 []|<>` +- ``: The unique identifier of your project. +- ``: Optional title of your project. +- ``: The ID of the triggered Workflow or Pipeline. +- ``: The code event that triggered the build: `PR/push/tag`. + +**Example of `workflows::status_report_name`** + +```yaml +workflows: + test: + status_report_name: ci/bitrise/510526/push +``` + +### `workflows::before_run` + +:::tip[Step bundles] + +This is a legacy feature. We recommend using Step bundles instead: [Step bundles](/en/bitrise-ci/workflows-and-pipelines/steps/step-bundles). + +::: + +The Workflows that will run before this Workflow starts. + +Use this property and `after_run` to create chains of Workflows. + +Read more: [Chaining Workflows together](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together). + +**Example of `workflows::before_run`** + +In this example, we're creating a configuration in which the `test` Workflow runs before the `deploy` Workflow: + +```yaml +workflows: + test: + steps: + # test Steps + + deploy: + before_run: + - test + steps: + # deploy Steps +``` + +### `workflows::after_run` + +:::tip[Step bundles] + +This is a legacy feature. We recommend using Step bundles instead: [Step bundles](/en/bitrise-ci/workflows-and-pipelines/steps/step-bundles). + +::: + +The Workflows that will run after this Workflow is successfully finished. + +Use this property and `before_run` to create chains of Workflows. + +Read more: [Chaining Workflows together](/en/bitrise-ci/workflows-and-pipelines/workflows/managing-workflows/chaining-workflows-together). + +**Example of `workflows::before_run`** + +In this example, we're creating a configuration in which the `deploy` Workflow runs after the `ci` Workflow: + +```yaml +workflows: + deploy: + steps: + # deploy Steps + + ci: + after_run: + - deploy + steps: + # CI Steps +``` + +### `workflows::envs` + +Environment Variables defined for the Workflow. + +Each Environment Variable is a key-value pair. Environment Variables can use other Environment Variables as values: [Using Env Vars in the value of an Env Var](/en/bitrise-ci/configure-builds/environment-variables/using-env-vars-in-the-value-of-an-env-var). + +These variables are only available for the selected Workflow. Other Workflows defined in the same configuration YAML file can't access them. Project-level Environment variables have a higher priority: [Availability order of Environment Variables](/en/bitrise-ci/configure-builds/environment-variables/availability-order-of-environment-variables). + +Read more: [Environment Variables](/en/bitrise-ci/configure-builds/environment-variables). + +**Example of `workflows::envs`** + +```yaml +workflows: + primary: + envs: + - TEST: test + - ENV_LABEL: dev + opts: + is_expand: false +``` + +### `workflows::steps` + +The list of Steps in the Workflow. + +The basic syntax of a Step reference is: `::@:`. The Step ID is always required; the source and the version are optional. + +- If you don't set a source, `default_step_lib_source` will be used: [Project level properties](/en/bitrise-ci/references/configuration-yaml-reference/project-level-properties). +- If you don't set a version, the latest version will be used. + +Read more: + +- [Step reference/ID format](/en/bitrise-ci/references/steps-reference/step-reference-id-format) +- [Step versions](/en/bitrise-ci/workflows-and-pipelines/steps/step-versions) + +**Examples of `workflows::steps`** + +In this example, we don't specify an exact source and we use the latest version of major version 1: + +```yaml +workflows: + steps: + - script: {} +``` + +In this example we're providing a source for the Step: + +```yaml +workflows: + steps: + - https://github.com/bitrise-io/bitrise-steplib.git::script@1: {} +``` + +### `workflows::priority` + +The priority setting determines the position of the Workflow build in the build queue: the higher the priority, the sooner the Workflow build will run. + +**Supported values**: An integer between -100 and 100. + +Read more: [Build priority](/en/bitrise-ci/configure-builds/configuring-build-settings/build-priority). + +**Example of `workflows::priority`** + +```yaml +workflows: + primary: + priority: 10 +``` + +### `workflows::tools` + +Declarative configuration for tool versions used in the build. + +You can define tool versions for specific Workflows. Instead of defining the tools property at the top level of the configuration, you nest it under one or more Workflows. + +The version syntax supports: + +- Exact versions: for example, `'1.2.3'`. +- Partial matches to the latest release: for example, `'22:latest'`. +- Partial matches to installed versions: for example, `'1.2:installed'`. +- Special aliases `'latest'` and `'installed'` to select the latest or the highest installed version. + +Read more: [Configuring tool versions](/en/bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions). + +**Example of `workflows::tools`** + +```yaml +workflows: + primary: + tools: + nodejs: 22:installed +``` + +### `workflows::meta` + +Stores project metadata key-value pairs. Most importantly, it defines the stack and the machine type for the Workflow. + +Read more: [Setting the stack in the bitrise.yml file](/en/bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds/setting-the-stack-in-the-bitriseyml-file). + +**Example of `workflows::meta`** + +```yaml +workflows: + deploy: + meta: + bitrise.io: + stack: linux-docker-android-22.04 + machine_type_id: g2.linux.2medium +``` diff --git a/src/partials/workflow-priority.mdx b/src/partials/workflow-priority.mdx new file mode 100644 index 0000000..b1e4d03 --- /dev/null +++ b/src/partials/workflow-priority.mdx @@ -0,0 +1,11 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Workflow priority + +You can set a priority for each individual Workflow. The priority setting determines the position of a standalone build of the Workflow in the build queue: the higher the priority, the sooner the Workflow's build will run. + +You can assign a priority either in the Workflow Editor or in the configuration YAML file of your project. The priority is always an integer between -100 and 100: the higher the number, the higher the priority. The default priority is 0. + +For more information about build priority, and the order of precedence between different types of priorities, check out [Build priority](/en/bitrise-ci/configure-builds/configuring-build-settings/build-priority). diff --git a/src/partials/workflow-properties-in-pipelines.mdx b/src/partials/workflow-properties-in-pipelines.mdx new file mode 100644 index 0000000..0cfe530 --- /dev/null +++ b/src/partials/workflow-properties-in-pipelines.mdx @@ -0,0 +1,9 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +1. Open your Pipeline. +1. Hover over the Workflow you need and click the gear icon to open the Edit Workflow dialog. + + ![workflow-properties-edit.png](/img/_paligo/uuid-df55cc4e-3e1f-2b08-c111-6e0a231065fd.png) +1. Select **Pipeline Conditions**. diff --git a/src/partials/workspace-level-roles.mdx b/src/partials/workspace-level-roles.mdx new file mode 100644 index 0000000..57d6245 --- /dev/null +++ b/src/partials/workspace-level-roles.mdx @@ -0,0 +1,14 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Workspace-level roles + +There are four main roles in a workspace: + +- **Owner**: The workspace owner has access to all CI projects and Release Management apps and have full control over them. +- **Manager**: The user can access and modify workspace settings such as connected service accounts, can manage members but can't access billing details and can't delete the workspace. Workspace Managers can create new Bitrise projects. Within projects they have created, they can create CI configurations and/or Release Management connected apps. They cannot access or modify CI configurations or connected apps in Bitrise projects that they haven’t been given direct access to via user or group access settings. +- **Contributor**: The user can't access workspace settings and can't add new members or manage existing members. They don't have access to any projects or Release Management apps by default and they can't add new projects or Release Management apps. +- **Viewer**: The user can't add CI projects or Release Management apps to the workspace. + +These roles mainly determine the user's permissions within the workspace. However, in the case of the workspace owners and the workspace managers, they provide additional permissions on the project level, as described above. But project access is mostly determined by project-level roles. diff --git a/src/partials/xcode-stack-updates.mdx b/src/partials/xcode-stack-updates.mdx new file mode 100644 index 0000000..9458ac9 --- /dev/null +++ b/src/partials/xcode-stack-updates.mdx @@ -0,0 +1,157 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import GlossTerm from '@site/src/components/GlossTerm'; + +## Xcode stack updates + +You can select macOS stacks based on the Xcode version you need. Under the hood, one VM image contains multiple Xcode versions installed and your requested Xcode version is activated at runtime before your Workflow starts. + +As a rule of thumb, Xcode minor versions of the same major version share the same VM image, but there might be exceptions based on compatibility issues and other considerations. + +:::note[Versioning] + +When talking about versions, we use [semver](https://semver.org/) terminology, regardless of how the various tools define their versions. + +::: + +Stacks have a lifecycle and have four different states: Edge, Stable, Frozen and Removed. + +![stack-lifecycle.png](/img/_paligo/uuid-faa7bf60-0cae-0042-f910-e8e6240fc647.png) + +- **Edge**: These stacks are for previewing upcoming versions and changes. They are updated in-place regularly, and they include the latest stable release of Xcode, the latest beta release of Xcode (if available) and the latest stable version of pre-installed tools. Regular weekly updates could add or remove tools, as well as upgrade the OS. Backwards compatibility for weekly updates is not guaranteed on an Edge stack. Run builds on Edge stacks to preview upcoming tool version changes (such as Ruby 3.2 becoming the default) and get access to the latest pre-release Xcode (such as Xcode 15 Beta). +- **Stable**: These stacks are only updated with Xcode patch versions, and with critical security fixes. For maximum reliability and reproducible builds, we recommend pinning exact tool versions in Workflows instead of relying on the stack defaults (for example, pinning a Ruby version). +- **Frozen**: These stacks are no longer updated and flagged for removal in accordance with the [Stack deprecation and removal policy](/en/bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy.html). The stack is still available for yourbuilds but you will see the final removal date on the UI. Preinstalled tools are not updated, so it’s your responsibility to keep up with bugfixes and security patches. +- **Removed**: These stacks are no longer available to use. + +### State transitions for Xcode stacks + +During the lifecycle of a stack it will transition between states when triggered by new Xcode and macOS releases. Stacks transition as follows: + +- Edge to Stable. +- Stable to Frozen. +- Frozen to Removed. + +#### Edge stack updates + +Edge stacks provide a way to preview and test upcoming changes. Xcode Beta versions become available as Edge stacks while final Xcode releases become available as new Stable stacks. Xcode Edge stacks change when: + +1. The first Beta version of a new major Xcode version is released. +1. The first Beta version of a new minor Xcode version is released. +1. A new version of an Xcode Beta version is released. + +When an Xcode minor version is released as a beta, it becomes available as an Edge stack. Other Edge stacks do not transition to Stable until the beta version in question is released as a GA version. + +**First Beta version of a new major Xcode version** + +In this example: + +- The current latest Xcode version is 15.3. +- A new Beta version of a new major Xcode version is released: Xcode 16.0 Beta 1. + +![stack-updates-edge.png](/img/_paligo/uuid-1aecaab6-06d6-4a03-4d67-f6e4e5efaf7e.png) + +Once the new Beta version is released, we update our stacks: + +- The new Xcode release becomes available on Bitrise as an Edge stack. In our example, Xcode 16.0 Beta 1 becomes available as the Edge stack. +- Current Edge stacks are phased out, and users are automatically migrated to the new Edge stack. This happens a few days after the new Xcode release. In this example, this means phasing out Xcode 15.x Edge stacks. +- Stable stacks are not affected at this point. + +**First Beta version of a new minor Xcode version** + +In this example: + +- The current latest Xcode version is 15.2. +- A new Beta version of a new minor Xcode version is released: Xcode 15.3 Beta 1. + +![stack-updates-edge-minor.png](/img/_paligo/uuid-1045ef58-753d-f496-2c8a-4e4c9542ad63.png) + +Once the new Beta version is released, we update our stacks: + +- The new Xcode release becomes available as an Edge stack. In this example, Xcode 15.3 Beta 1 becomes available as an Edge stack. +- Stable stacks are not affected at this point. + +**A new Beta version of an Xcode Beta version** + +In this example: + +- The current latest Xcode version is 16.0 Beta 1. +- A new Beta version is released: 16.0 Beta 2. + +![stack-updates-edge-beta.png](/img/_paligo/uuid-f91e8132-cff5-b5c3-142e-2184b4883382.png) + +Once the new Beta version is released, we update our stacks: + +- Xcode 16.0 Beta 2 replaces 16.0 Beta 1 on the Xcode 16.0 Edge stack. +- Stable stacks are not affected at this point. + +#### Stable stack updates + +Stable stacks change less often than Edge stacks as we want to avoid unexpected breaking changes on these stacks. + +Existing Stable stacks change when: + +1. A new major Xcode version is released. +1. A new minor Xcode version is released. + +**A new major Xcode version** + +In this example: + +- The current latest Xcode version is 15.3.0. +- A new major Xcode version is released: Xcode 16.0. + +![stable-stack.png](/img/_paligo/uuid-0d392a7d-4fcd-13cb-e67a-7326e954c87a.png) + +When the new major version is released, we update our stacks: + +- New Stable stack: Xcode 16.0 becomes available on Bitrise as a new Stable stack. +- Oldest Stable stacks become Frozen. In this example, Xcode 14.x stacks become Frozen, but still available for building. Tool versions are not changing on these stacks: their latest state is frozen. +- Old Frozen stacks are removed: in this example, Xcode 13.x stacks are removed. The remaining users are migrated to newer stacks. + +**A new minor Xcode version** + +In this example: + +- The current latest Xcode version is Xcode 15.2. +- A new minor Xcode version is released: Xcode 15.3. + +When the new minor version is released, we update our stacks: + +- New Stable stack: Xcode 15.3 becomes available on Bitrise as a Stable stack. +- Xcode 15.3 Edge stack is updated with the final Xcode version. + +![stack-updates-stable-xcode-minor.png](/img/_paligo/uuid-166098b3-ad6e-d65e-fe83-e0819fcf52a3.png) + +#### macOS releases + +The exact macOS version is always highlighted on the [stack report pages](https://stacks.bitrise.io/stack_reports/). + +When a new major macOS version is released, we upgrade the Edge stacks to the new OS after an internal testing period. + +As a general rule, we don’t upgrade macOS on Stable stacks to avoid unexpected build failures. We wait until a future Xcode release starts requiring the new OS version (for example, Xcode 15.0, 15.1 and 15.2 are compatible with macOS Ventura, but 15.3 requires Sonoma). Once this happens, the Stable stack variant of this Xcode version is based on the new major OS version, while older Stable Xcode stacks remain on the older OS version. + +While the new major OS is not available as a Stable stack, we recommend testing it on one of the Edge stacks. We are looking for your feedback, including edge cases and performance regressions. + +#### Events not triggering a state transition + +Not all Xcode releases trigger a transition. For example, Xcode beta minor version releases do not trigger an Edge to Stable stack transition: the new beta version simply replaces the old one. Xcode patch releases do not trigger an Edge to Stable stack transition. Instead, the Stable stacks will be updated in place with the new patch version. + +### Simulator runtimes on Xcode stacks + +You can find the list of preinstalled tools, including simulator runtimes on our stacks on the [stack reports pages](https://stacks.bitrise.io/stack_reports/). + +You can expect the following simulator runtimes to be installed: + +- The matching runtime versions of a given Xcode version: these are the iOS, watchOS, tvOS and visionOS runtime versions that Xcode prompts you to download at first launch. +- For iOS, we also install two additional versions: the two previous major versions, of which the latest minor version is installed. +- For watchOS, we also install the previous major release’s latest minor version. + +For example, when selecting the Xcode 15.0 stack, you can expect: + +- iOS 17.0: the matching runtime of this Xcode. +- iOS 16.4: the latest minor release of the previous major iOS version. +- iOS 15.5: the latest minor release of the second-previous major iOS version. +- watchOS 10.0: the matching runtime of this Xcode. +- watchOS 9.4: the latest minor release of the previous major version. +- tvOS 17.0: the matching runtime of this Xcode. +- visionOS 1.0: the matching runtime of this Xcode diff --git a/static/CNAME b/static/CNAME new file mode 100644 index 0000000..d9b95f9 --- /dev/null +++ b/static/CNAME @@ -0,0 +1 @@ +docs.bitrise.io \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..b7a59b0 Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/img/_paligo/uuid-0022d0d2-8794-bad9-bf5d-a7413b7bb473.png b/static/img/_paligo/uuid-0022d0d2-8794-bad9-bf5d-a7413b7bb473.png new file mode 100644 index 0000000..a9655d0 Binary files /dev/null and b/static/img/_paligo/uuid-0022d0d2-8794-bad9-bf5d-a7413b7bb473.png differ diff --git a/static/img/_paligo/uuid-00d7e0d5-df77-2b41-222b-c7ff05829144.png b/static/img/_paligo/uuid-00d7e0d5-df77-2b41-222b-c7ff05829144.png new file mode 100644 index 0000000..7f882de Binary files /dev/null and b/static/img/_paligo/uuid-00d7e0d5-df77-2b41-222b-c7ff05829144.png differ diff --git a/static/img/_paligo/uuid-01568ffa-736b-b7a0-a692-03cf3784fd65.png b/static/img/_paligo/uuid-01568ffa-736b-b7a0-a692-03cf3784fd65.png new file mode 100644 index 0000000..f44bd38 Binary files /dev/null and b/static/img/_paligo/uuid-01568ffa-736b-b7a0-a692-03cf3784fd65.png differ diff --git a/static/img/_paligo/uuid-019f250f-8d48-a51c-738b-db46d0829339.png b/static/img/_paligo/uuid-019f250f-8d48-a51c-738b-db46d0829339.png new file mode 100644 index 0000000..de2192e Binary files /dev/null and b/static/img/_paligo/uuid-019f250f-8d48-a51c-738b-db46d0829339.png differ diff --git a/static/img/_paligo/uuid-021a140f-5b4c-697c-a5ac-4b5429ce1bab.png b/static/img/_paligo/uuid-021a140f-5b4c-697c-a5ac-4b5429ce1bab.png new file mode 100644 index 0000000..b1d7203 Binary files /dev/null and b/static/img/_paligo/uuid-021a140f-5b4c-697c-a5ac-4b5429ce1bab.png differ diff --git a/static/img/_paligo/uuid-0242fdf7-4025-4aca-215a-ffbecf5e62b9.png b/static/img/_paligo/uuid-0242fdf7-4025-4aca-215a-ffbecf5e62b9.png new file mode 100644 index 0000000..cac1092 Binary files /dev/null and b/static/img/_paligo/uuid-0242fdf7-4025-4aca-215a-ffbecf5e62b9.png differ diff --git a/static/img/_paligo/uuid-0247679e-247c-dd61-77eb-340600f634c9.png b/static/img/_paligo/uuid-0247679e-247c-dd61-77eb-340600f634c9.png new file mode 100644 index 0000000..ce3e1f5 Binary files /dev/null and b/static/img/_paligo/uuid-0247679e-247c-dd61-77eb-340600f634c9.png differ diff --git a/static/img/_paligo/uuid-0268c55e-cc52-4a65-4f01-f1db5f281a4e.jpg b/static/img/_paligo/uuid-0268c55e-cc52-4a65-4f01-f1db5f281a4e.jpg new file mode 100644 index 0000000..381f8cc Binary files /dev/null and b/static/img/_paligo/uuid-0268c55e-cc52-4a65-4f01-f1db5f281a4e.jpg differ diff --git a/static/img/_paligo/uuid-02de5b3a-d9bd-5890-cfc3-52462a3c8ff2.png b/static/img/_paligo/uuid-02de5b3a-d9bd-5890-cfc3-52462a3c8ff2.png new file mode 100644 index 0000000..2be4de2 Binary files /dev/null and b/static/img/_paligo/uuid-02de5b3a-d9bd-5890-cfc3-52462a3c8ff2.png differ diff --git a/static/img/_paligo/uuid-035193f8-4a3b-65de-4c0b-8054d2e63586.png b/static/img/_paligo/uuid-035193f8-4a3b-65de-4c0b-8054d2e63586.png new file mode 100644 index 0000000..cc059dc Binary files /dev/null and b/static/img/_paligo/uuid-035193f8-4a3b-65de-4c0b-8054d2e63586.png differ diff --git a/static/img/_paligo/uuid-0356f699-7e6f-0169-7fb3-82576e470b62.png b/static/img/_paligo/uuid-0356f699-7e6f-0169-7fb3-82576e470b62.png new file mode 100644 index 0000000..21b6b7e Binary files /dev/null and b/static/img/_paligo/uuid-0356f699-7e6f-0169-7fb3-82576e470b62.png differ diff --git a/static/img/_paligo/uuid-044617c9-e24c-068d-1978-df721db2a9f8.png b/static/img/_paligo/uuid-044617c9-e24c-068d-1978-df721db2a9f8.png new file mode 100644 index 0000000..797a2ba Binary files /dev/null and b/static/img/_paligo/uuid-044617c9-e24c-068d-1978-df721db2a9f8.png differ diff --git a/static/img/_paligo/uuid-04948b79-fd8e-253c-85c5-3c0e66f9dbd9.png b/static/img/_paligo/uuid-04948b79-fd8e-253c-85c5-3c0e66f9dbd9.png new file mode 100644 index 0000000..2ea4539 Binary files /dev/null and b/static/img/_paligo/uuid-04948b79-fd8e-253c-85c5-3c0e66f9dbd9.png differ diff --git a/static/img/_paligo/uuid-04f62e3f-a98e-7b0f-4b1f-7d592e42db65.png b/static/img/_paligo/uuid-04f62e3f-a98e-7b0f-4b1f-7d592e42db65.png new file mode 100644 index 0000000..45c641f Binary files /dev/null and b/static/img/_paligo/uuid-04f62e3f-a98e-7b0f-4b1f-7d592e42db65.png differ diff --git a/static/img/_paligo/uuid-05179598-b31c-84ba-3b1d-03720f842acc.png b/static/img/_paligo/uuid-05179598-b31c-84ba-3b1d-03720f842acc.png new file mode 100644 index 0000000..e051d4d Binary files /dev/null and b/static/img/_paligo/uuid-05179598-b31c-84ba-3b1d-03720f842acc.png differ diff --git a/static/img/_paligo/uuid-05ba3ed0-0f1c-c4be-e46f-cc500b21041c.png b/static/img/_paligo/uuid-05ba3ed0-0f1c-c4be-e46f-cc500b21041c.png new file mode 100644 index 0000000..cb13a37 Binary files /dev/null and b/static/img/_paligo/uuid-05ba3ed0-0f1c-c4be-e46f-cc500b21041c.png differ diff --git a/static/img/_paligo/uuid-06a9ef1f-701a-678b-cc0c-8aad5c078cd2.png b/static/img/_paligo/uuid-06a9ef1f-701a-678b-cc0c-8aad5c078cd2.png new file mode 100644 index 0000000..3d487e5 Binary files /dev/null and b/static/img/_paligo/uuid-06a9ef1f-701a-678b-cc0c-8aad5c078cd2.png differ diff --git a/static/img/_paligo/uuid-06b2413b-0794-39ff-c8b0-176c85c8e1e1.png b/static/img/_paligo/uuid-06b2413b-0794-39ff-c8b0-176c85c8e1e1.png new file mode 100644 index 0000000..88f552f Binary files /dev/null and b/static/img/_paligo/uuid-06b2413b-0794-39ff-c8b0-176c85c8e1e1.png differ diff --git a/static/img/_paligo/uuid-06ef3d25-d255-8ba0-18d6-be2ca01c356c.png b/static/img/_paligo/uuid-06ef3d25-d255-8ba0-18d6-be2ca01c356c.png new file mode 100644 index 0000000..06f626b Binary files /dev/null and b/static/img/_paligo/uuid-06ef3d25-d255-8ba0-18d6-be2ca01c356c.png differ diff --git a/static/img/_paligo/uuid-0876f906-f150-c883-a882-3d1da1ae42dc.png b/static/img/_paligo/uuid-0876f906-f150-c883-a882-3d1da1ae42dc.png new file mode 100644 index 0000000..6f764bf Binary files /dev/null and b/static/img/_paligo/uuid-0876f906-f150-c883-a882-3d1da1ae42dc.png differ diff --git a/static/img/_paligo/uuid-088fa6df-9163-1518-308d-87ad0916c60f.jpg b/static/img/_paligo/uuid-088fa6df-9163-1518-308d-87ad0916c60f.jpg new file mode 100644 index 0000000..7d2b3c7 Binary files /dev/null and b/static/img/_paligo/uuid-088fa6df-9163-1518-308d-87ad0916c60f.jpg differ diff --git a/static/img/_paligo/uuid-09615e71-c7e5-0a43-b41d-b611e25b0c29.png b/static/img/_paligo/uuid-09615e71-c7e5-0a43-b41d-b611e25b0c29.png new file mode 100644 index 0000000..83f837f Binary files /dev/null and b/static/img/_paligo/uuid-09615e71-c7e5-0a43-b41d-b611e25b0c29.png differ diff --git a/static/img/_paligo/uuid-09bb51b3-e156-8f2e-4141-e71b46951f5c.png b/static/img/_paligo/uuid-09bb51b3-e156-8f2e-4141-e71b46951f5c.png new file mode 100644 index 0000000..08b9a25 Binary files /dev/null and b/static/img/_paligo/uuid-09bb51b3-e156-8f2e-4141-e71b46951f5c.png differ diff --git a/static/img/_paligo/uuid-0a57f576-6cbd-5055-e09e-078920e410ce.jpg b/static/img/_paligo/uuid-0a57f576-6cbd-5055-e09e-078920e410ce.jpg new file mode 100644 index 0000000..44e56cd Binary files /dev/null and b/static/img/_paligo/uuid-0a57f576-6cbd-5055-e09e-078920e410ce.jpg differ diff --git a/static/img/_paligo/uuid-0b5537ea-42ab-780f-cd11-05072d508a72.png b/static/img/_paligo/uuid-0b5537ea-42ab-780f-cd11-05072d508a72.png new file mode 100644 index 0000000..59b76ca Binary files /dev/null and b/static/img/_paligo/uuid-0b5537ea-42ab-780f-cd11-05072d508a72.png differ diff --git a/static/img/_paligo/uuid-0b79fc48-3861-0744-0f53-53a6c65ffc2c.png b/static/img/_paligo/uuid-0b79fc48-3861-0744-0f53-53a6c65ffc2c.png new file mode 100644 index 0000000..64fae96 Binary files /dev/null and b/static/img/_paligo/uuid-0b79fc48-3861-0744-0f53-53a6c65ffc2c.png differ diff --git a/static/img/_paligo/uuid-0ba8034b-4784-e042-02b9-32087bcde8d4.jpg b/static/img/_paligo/uuid-0ba8034b-4784-e042-02b9-32087bcde8d4.jpg new file mode 100644 index 0000000..fc40c9a Binary files /dev/null and b/static/img/_paligo/uuid-0ba8034b-4784-e042-02b9-32087bcde8d4.jpg differ diff --git a/static/img/_paligo/uuid-0c1048ad-a593-b587-4dad-63c8cb4ddfc1.png b/static/img/_paligo/uuid-0c1048ad-a593-b587-4dad-63c8cb4ddfc1.png new file mode 100644 index 0000000..bf7d0de Binary files /dev/null and b/static/img/_paligo/uuid-0c1048ad-a593-b587-4dad-63c8cb4ddfc1.png differ diff --git a/static/img/_paligo/uuid-0c7ca206-84bb-e034-9ff5-3fb28c9a165d.png b/static/img/_paligo/uuid-0c7ca206-84bb-e034-9ff5-3fb28c9a165d.png new file mode 100644 index 0000000..5a1847a Binary files /dev/null and b/static/img/_paligo/uuid-0c7ca206-84bb-e034-9ff5-3fb28c9a165d.png differ diff --git a/static/img/_paligo/uuid-0d1616e8-82d6-9de7-f192-1aab7058880b.png b/static/img/_paligo/uuid-0d1616e8-82d6-9de7-f192-1aab7058880b.png new file mode 100644 index 0000000..6ef4205 Binary files /dev/null and b/static/img/_paligo/uuid-0d1616e8-82d6-9de7-f192-1aab7058880b.png differ diff --git a/static/img/_paligo/uuid-0d2d2b23-f9a9-d57d-3b14-44f085bfcc5f.png b/static/img/_paligo/uuid-0d2d2b23-f9a9-d57d-3b14-44f085bfcc5f.png new file mode 100644 index 0000000..4ead7d4 Binary files /dev/null and b/static/img/_paligo/uuid-0d2d2b23-f9a9-d57d-3b14-44f085bfcc5f.png differ diff --git a/static/img/_paligo/uuid-0d392a7d-4fcd-13cb-e67a-7326e954c87a.png b/static/img/_paligo/uuid-0d392a7d-4fcd-13cb-e67a-7326e954c87a.png new file mode 100644 index 0000000..aef76f6 Binary files /dev/null and b/static/img/_paligo/uuid-0d392a7d-4fcd-13cb-e67a-7326e954c87a.png differ diff --git a/static/img/_paligo/uuid-0d8102bf-6e48-8787-cfe2-d24617d96950.png b/static/img/_paligo/uuid-0d8102bf-6e48-8787-cfe2-d24617d96950.png new file mode 100644 index 0000000..3e7942d Binary files /dev/null and b/static/img/_paligo/uuid-0d8102bf-6e48-8787-cfe2-d24617d96950.png differ diff --git a/static/img/_paligo/uuid-0db12ced-a7df-99c7-2c04-4818d5c52832.png b/static/img/_paligo/uuid-0db12ced-a7df-99c7-2c04-4818d5c52832.png new file mode 100644 index 0000000..5c13507 Binary files /dev/null and b/static/img/_paligo/uuid-0db12ced-a7df-99c7-2c04-4818d5c52832.png differ diff --git a/static/img/_paligo/uuid-0ea2f6c9-aea8-8ba8-cad7-303666747894.png b/static/img/_paligo/uuid-0ea2f6c9-aea8-8ba8-cad7-303666747894.png new file mode 100644 index 0000000..6112eb5 Binary files /dev/null and b/static/img/_paligo/uuid-0ea2f6c9-aea8-8ba8-cad7-303666747894.png differ diff --git a/static/img/_paligo/uuid-0edf6398-0b97-f558-978e-f7d8bae394e0.png b/static/img/_paligo/uuid-0edf6398-0b97-f558-978e-f7d8bae394e0.png new file mode 100644 index 0000000..bd494cb Binary files /dev/null and b/static/img/_paligo/uuid-0edf6398-0b97-f558-978e-f7d8bae394e0.png differ diff --git a/static/img/_paligo/uuid-0ef22e95-4303-25ce-b8e9-69884bbe7cf7.jpg b/static/img/_paligo/uuid-0ef22e95-4303-25ce-b8e9-69884bbe7cf7.jpg new file mode 100644 index 0000000..1b94c20 Binary files /dev/null and b/static/img/_paligo/uuid-0ef22e95-4303-25ce-b8e9-69884bbe7cf7.jpg differ diff --git a/static/img/_paligo/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg b/static/img/_paligo/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg new file mode 100644 index 0000000..3bf6166 Binary files /dev/null and b/static/img/_paligo/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg differ diff --git a/static/img/_paligo/uuid-0fffb4e5-f4e4-037e-3378-fde21e261acb.png b/static/img/_paligo/uuid-0fffb4e5-f4e4-037e-3378-fde21e261acb.png new file mode 100644 index 0000000..4b7c675 Binary files /dev/null and b/static/img/_paligo/uuid-0fffb4e5-f4e4-037e-3378-fde21e261acb.png differ diff --git a/static/img/_paligo/uuid-1042aa27-f21e-16e5-4065-4088112ae116.jpg b/static/img/_paligo/uuid-1042aa27-f21e-16e5-4065-4088112ae116.jpg new file mode 100644 index 0000000..2bc4dca Binary files /dev/null and b/static/img/_paligo/uuid-1042aa27-f21e-16e5-4065-4088112ae116.jpg differ diff --git a/static/img/_paligo/uuid-1045ef58-753d-f496-2c8a-4e4c9542ad63.png b/static/img/_paligo/uuid-1045ef58-753d-f496-2c8a-4e4c9542ad63.png new file mode 100644 index 0000000..b0b39d4 Binary files /dev/null and b/static/img/_paligo/uuid-1045ef58-753d-f496-2c8a-4e4c9542ad63.png differ diff --git a/static/img/_paligo/uuid-10b69d2d-9cf7-8577-04a4-d035a5f06ad9.png b/static/img/_paligo/uuid-10b69d2d-9cf7-8577-04a4-d035a5f06ad9.png new file mode 100644 index 0000000..ce3b09b Binary files /dev/null and b/static/img/_paligo/uuid-10b69d2d-9cf7-8577-04a4-d035a5f06ad9.png differ diff --git a/static/img/_paligo/uuid-111feaf8-6180-9531-fae4-51424aeb75dc.png b/static/img/_paligo/uuid-111feaf8-6180-9531-fae4-51424aeb75dc.png new file mode 100644 index 0000000..3b38cd1 Binary files /dev/null and b/static/img/_paligo/uuid-111feaf8-6180-9531-fae4-51424aeb75dc.png differ diff --git a/static/img/_paligo/uuid-113925d0-226c-da20-a0ea-41eec556f750.png b/static/img/_paligo/uuid-113925d0-226c-da20-a0ea-41eec556f750.png new file mode 100644 index 0000000..4828de1 Binary files /dev/null and b/static/img/_paligo/uuid-113925d0-226c-da20-a0ea-41eec556f750.png differ diff --git a/static/img/_paligo/uuid-11509388-3538-06e7-23f3-7ef27a956386.png b/static/img/_paligo/uuid-11509388-3538-06e7-23f3-7ef27a956386.png new file mode 100644 index 0000000..2286cf3 Binary files /dev/null and b/static/img/_paligo/uuid-11509388-3538-06e7-23f3-7ef27a956386.png differ diff --git a/static/img/_paligo/uuid-115c121e-082e-a3b6-6741-f53cdab5d89e.png b/static/img/_paligo/uuid-115c121e-082e-a3b6-6741-f53cdab5d89e.png new file mode 100644 index 0000000..1a7663d Binary files /dev/null and b/static/img/_paligo/uuid-115c121e-082e-a3b6-6741-f53cdab5d89e.png differ diff --git a/static/img/_paligo/uuid-122c50be-0438-4aad-87f8-cc148ee26d49.png b/static/img/_paligo/uuid-122c50be-0438-4aad-87f8-cc148ee26d49.png new file mode 100644 index 0000000..67cf39c Binary files /dev/null and b/static/img/_paligo/uuid-122c50be-0438-4aad-87f8-cc148ee26d49.png differ diff --git a/static/img/_paligo/uuid-12b52688-9137-1a9a-47d8-2944653f1d74.png b/static/img/_paligo/uuid-12b52688-9137-1a9a-47d8-2944653f1d74.png new file mode 100644 index 0000000..f02cd69 Binary files /dev/null and b/static/img/_paligo/uuid-12b52688-9137-1a9a-47d8-2944653f1d74.png differ diff --git a/static/img/_paligo/uuid-130fe737-4629-1dfa-3234-9c03ad22f5dc.png b/static/img/_paligo/uuid-130fe737-4629-1dfa-3234-9c03ad22f5dc.png new file mode 100644 index 0000000..f6e4c55 Binary files /dev/null and b/static/img/_paligo/uuid-130fe737-4629-1dfa-3234-9c03ad22f5dc.png differ diff --git a/static/img/_paligo/uuid-139f4940-4762-210c-2a4d-59bc4e2b561d.png b/static/img/_paligo/uuid-139f4940-4762-210c-2a4d-59bc4e2b561d.png new file mode 100644 index 0000000..9e8228c Binary files /dev/null and b/static/img/_paligo/uuid-139f4940-4762-210c-2a4d-59bc4e2b561d.png differ diff --git a/static/img/_paligo/uuid-13e965a3-cef3-17c5-970b-b4308460ae26.png b/static/img/_paligo/uuid-13e965a3-cef3-17c5-970b-b4308460ae26.png new file mode 100644 index 0000000..a775961 Binary files /dev/null and b/static/img/_paligo/uuid-13e965a3-cef3-17c5-970b-b4308460ae26.png differ diff --git a/static/img/_paligo/uuid-14a7856e-16ca-8a64-04fa-acf92ba93cc2.png b/static/img/_paligo/uuid-14a7856e-16ca-8a64-04fa-acf92ba93cc2.png new file mode 100644 index 0000000..eafdd5a Binary files /dev/null and b/static/img/_paligo/uuid-14a7856e-16ca-8a64-04fa-acf92ba93cc2.png differ diff --git a/static/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png b/static/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png new file mode 100644 index 0000000..4011f11 Binary files /dev/null and b/static/img/_paligo/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png differ diff --git a/static/img/_paligo/uuid-1610488e-2548-99b4-8386-9f2f66bb7f03.svg b/static/img/_paligo/uuid-1610488e-2548-99b4-8386-9f2f66bb7f03.svg new file mode 100644 index 0000000..c44d4ac --- /dev/null +++ b/static/img/_paligo/uuid-1610488e-2548-99b4-8386-9f2f66bb7f03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/_paligo/uuid-1640f128-3b4d-356a-f7d0-5d40e60fa6b3.png b/static/img/_paligo/uuid-1640f128-3b4d-356a-f7d0-5d40e60fa6b3.png new file mode 100644 index 0000000..e1ae276 Binary files /dev/null and b/static/img/_paligo/uuid-1640f128-3b4d-356a-f7d0-5d40e60fa6b3.png differ diff --git a/static/img/_paligo/uuid-166098b3-ad6e-d65e-fe83-e0819fcf52a3.png b/static/img/_paligo/uuid-166098b3-ad6e-d65e-fe83-e0819fcf52a3.png new file mode 100644 index 0000000..d7f5996 Binary files /dev/null and b/static/img/_paligo/uuid-166098b3-ad6e-d65e-fe83-e0819fcf52a3.png differ diff --git a/static/img/_paligo/uuid-175bfd17-e0a5-d198-a2f9-36dc24735c28.jpg b/static/img/_paligo/uuid-175bfd17-e0a5-d198-a2f9-36dc24735c28.jpg new file mode 100644 index 0000000..b348e56 Binary files /dev/null and b/static/img/_paligo/uuid-175bfd17-e0a5-d198-a2f9-36dc24735c28.jpg differ diff --git a/static/img/_paligo/uuid-1789f853-23db-4863-8ecc-70e6a837ad2f.png b/static/img/_paligo/uuid-1789f853-23db-4863-8ecc-70e6a837ad2f.png new file mode 100644 index 0000000..deefc66 Binary files /dev/null and b/static/img/_paligo/uuid-1789f853-23db-4863-8ecc-70e6a837ad2f.png differ diff --git a/static/img/_paligo/uuid-187924e0-afdb-8c78-53fe-809168944982.png b/static/img/_paligo/uuid-187924e0-afdb-8c78-53fe-809168944982.png new file mode 100644 index 0000000..9cfd391 Binary files /dev/null and b/static/img/_paligo/uuid-187924e0-afdb-8c78-53fe-809168944982.png differ diff --git a/static/img/_paligo/uuid-193b49ae-3ccd-9f68-5288-55ed12c9edb1.png b/static/img/_paligo/uuid-193b49ae-3ccd-9f68-5288-55ed12c9edb1.png new file mode 100644 index 0000000..bc77fb9 Binary files /dev/null and b/static/img/_paligo/uuid-193b49ae-3ccd-9f68-5288-55ed12c9edb1.png differ diff --git a/static/img/_paligo/uuid-195577ac-fbba-5fe4-810b-3749e614682c.png b/static/img/_paligo/uuid-195577ac-fbba-5fe4-810b-3749e614682c.png new file mode 100644 index 0000000..1ae54b1 Binary files /dev/null and b/static/img/_paligo/uuid-195577ac-fbba-5fe4-810b-3749e614682c.png differ diff --git a/static/img/_paligo/uuid-19da748e-432f-46b4-353f-a426a92cdd75.png b/static/img/_paligo/uuid-19da748e-432f-46b4-353f-a426a92cdd75.png new file mode 100644 index 0000000..5b5a8fb Binary files /dev/null and b/static/img/_paligo/uuid-19da748e-432f-46b4-353f-a426a92cdd75.png differ diff --git a/static/img/_paligo/uuid-1a730b40-ecbe-d3dd-58a4-c46a0854f63a.jpg b/static/img/_paligo/uuid-1a730b40-ecbe-d3dd-58a4-c46a0854f63a.jpg new file mode 100644 index 0000000..3670ebf Binary files /dev/null and b/static/img/_paligo/uuid-1a730b40-ecbe-d3dd-58a4-c46a0854f63a.jpg differ diff --git a/static/img/_paligo/uuid-1aecaab6-06d6-4a03-4d67-f6e4e5efaf7e.png b/static/img/_paligo/uuid-1aecaab6-06d6-4a03-4d67-f6e4e5efaf7e.png new file mode 100644 index 0000000..353acfa Binary files /dev/null and b/static/img/_paligo/uuid-1aecaab6-06d6-4a03-4d67-f6e4e5efaf7e.png differ diff --git a/static/img/_paligo/uuid-1afefa9a-7cc1-db41-6186-0ee56293458c.png b/static/img/_paligo/uuid-1afefa9a-7cc1-db41-6186-0ee56293458c.png new file mode 100644 index 0000000..f40ac46 Binary files /dev/null and b/static/img/_paligo/uuid-1afefa9a-7cc1-db41-6186-0ee56293458c.png differ diff --git a/static/img/_paligo/uuid-1b49695a-ea36-fe03-f9a1-48a6bfc9a737.png b/static/img/_paligo/uuid-1b49695a-ea36-fe03-f9a1-48a6bfc9a737.png new file mode 100644 index 0000000..c2caee2 Binary files /dev/null and b/static/img/_paligo/uuid-1b49695a-ea36-fe03-f9a1-48a6bfc9a737.png differ diff --git a/static/img/_paligo/uuid-1b7bc413-da80-4910-5b25-f2a057bbf4d0.png b/static/img/_paligo/uuid-1b7bc413-da80-4910-5b25-f2a057bbf4d0.png new file mode 100644 index 0000000..545f1bf Binary files /dev/null and b/static/img/_paligo/uuid-1b7bc413-da80-4910-5b25-f2a057bbf4d0.png differ diff --git a/static/img/_paligo/uuid-1bbd8347-eb11-4439-9ece-315d004d74fe.png b/static/img/_paligo/uuid-1bbd8347-eb11-4439-9ece-315d004d74fe.png new file mode 100644 index 0000000..2ae4ded Binary files /dev/null and b/static/img/_paligo/uuid-1bbd8347-eb11-4439-9ece-315d004d74fe.png differ diff --git a/static/img/_paligo/uuid-1bc3b149-c8cd-82d2-2d94-62bbc35b89df.png b/static/img/_paligo/uuid-1bc3b149-c8cd-82d2-2d94-62bbc35b89df.png new file mode 100644 index 0000000..c3f51bf Binary files /dev/null and b/static/img/_paligo/uuid-1bc3b149-c8cd-82d2-2d94-62bbc35b89df.png differ diff --git a/static/img/_paligo/uuid-1c68a37c-df87-a7ef-90e6-37ca83ac1ba2.jpg b/static/img/_paligo/uuid-1c68a37c-df87-a7ef-90e6-37ca83ac1ba2.jpg new file mode 100644 index 0000000..18eaa8f Binary files /dev/null and b/static/img/_paligo/uuid-1c68a37c-df87-a7ef-90e6-37ca83ac1ba2.jpg differ diff --git a/static/img/_paligo/uuid-1c93dfa7-c82d-5694-1717-62b9239fe667.png b/static/img/_paligo/uuid-1c93dfa7-c82d-5694-1717-62b9239fe667.png new file mode 100644 index 0000000..934c54c Binary files /dev/null and b/static/img/_paligo/uuid-1c93dfa7-c82d-5694-1717-62b9239fe667.png differ diff --git a/static/img/_paligo/uuid-1cc790d0-1d08-d98c-7fdf-2cafa999984d.png b/static/img/_paligo/uuid-1cc790d0-1d08-d98c-7fdf-2cafa999984d.png new file mode 100644 index 0000000..96454ee Binary files /dev/null and b/static/img/_paligo/uuid-1cc790d0-1d08-d98c-7fdf-2cafa999984d.png differ diff --git a/static/img/_paligo/uuid-1e2babf9-a88c-0bd8-653d-9b5c7e8217a5.png b/static/img/_paligo/uuid-1e2babf9-a88c-0bd8-653d-9b5c7e8217a5.png new file mode 100644 index 0000000..1769b52 Binary files /dev/null and b/static/img/_paligo/uuid-1e2babf9-a88c-0bd8-653d-9b5c7e8217a5.png differ diff --git a/static/img/_paligo/uuid-1e81f309-27a2-8904-b36b-676b27000dfe.png b/static/img/_paligo/uuid-1e81f309-27a2-8904-b36b-676b27000dfe.png new file mode 100644 index 0000000..81b5ad0 Binary files /dev/null and b/static/img/_paligo/uuid-1e81f309-27a2-8904-b36b-676b27000dfe.png differ diff --git a/static/img/_paligo/uuid-1ec5901d-3577-8321-6e4f-faa9fa366c21.png b/static/img/_paligo/uuid-1ec5901d-3577-8321-6e4f-faa9fa366c21.png new file mode 100644 index 0000000..855dc7f Binary files /dev/null and b/static/img/_paligo/uuid-1ec5901d-3577-8321-6e4f-faa9fa366c21.png differ diff --git a/static/img/_paligo/uuid-1ed505cf-f524-a74a-9a5e-d56161782c4c.png b/static/img/_paligo/uuid-1ed505cf-f524-a74a-9a5e-d56161782c4c.png new file mode 100644 index 0000000..bf43234 Binary files /dev/null and b/static/img/_paligo/uuid-1ed505cf-f524-a74a-9a5e-d56161782c4c.png differ diff --git a/static/img/_paligo/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png b/static/img/_paligo/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png new file mode 100644 index 0000000..64f212f Binary files /dev/null and b/static/img/_paligo/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png differ diff --git a/static/img/_paligo/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png b/static/img/_paligo/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png new file mode 100644 index 0000000..308f6af Binary files /dev/null and b/static/img/_paligo/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png differ diff --git a/static/img/_paligo/uuid-2106af45-7e79-2a1c-5974-9a8f0bb78ffe.png b/static/img/_paligo/uuid-2106af45-7e79-2a1c-5974-9a8f0bb78ffe.png new file mode 100644 index 0000000..9be144c Binary files /dev/null and b/static/img/_paligo/uuid-2106af45-7e79-2a1c-5974-9a8f0bb78ffe.png differ diff --git a/static/img/_paligo/uuid-211085d7-b298-e040-1432-189aa06bca6c.png b/static/img/_paligo/uuid-211085d7-b298-e040-1432-189aa06bca6c.png new file mode 100644 index 0000000..4460850 Binary files /dev/null and b/static/img/_paligo/uuid-211085d7-b298-e040-1432-189aa06bca6c.png differ diff --git a/static/img/_paligo/uuid-21e11866-5b32-ba61-b232-0336d27e75e9.jpg b/static/img/_paligo/uuid-21e11866-5b32-ba61-b232-0336d27e75e9.jpg new file mode 100644 index 0000000..02f9813 Binary files /dev/null and b/static/img/_paligo/uuid-21e11866-5b32-ba61-b232-0336d27e75e9.jpg differ diff --git a/static/img/_paligo/uuid-223b519e-cddd-6157-de92-bfdf36d7ba2d.png b/static/img/_paligo/uuid-223b519e-cddd-6157-de92-bfdf36d7ba2d.png new file mode 100644 index 0000000..5fdad71 Binary files /dev/null and b/static/img/_paligo/uuid-223b519e-cddd-6157-de92-bfdf36d7ba2d.png differ diff --git a/static/img/_paligo/uuid-22736f46-339f-3986-05c1-cbbcf7eb57f6.png b/static/img/_paligo/uuid-22736f46-339f-3986-05c1-cbbcf7eb57f6.png new file mode 100644 index 0000000..b1430f2 Binary files /dev/null and b/static/img/_paligo/uuid-22736f46-339f-3986-05c1-cbbcf7eb57f6.png differ diff --git a/static/img/_paligo/uuid-22b5a6f5-fedb-0cc6-b685-1bb5406d1e12.png b/static/img/_paligo/uuid-22b5a6f5-fedb-0cc6-b685-1bb5406d1e12.png new file mode 100644 index 0000000..23b3dc7 Binary files /dev/null and b/static/img/_paligo/uuid-22b5a6f5-fedb-0cc6-b685-1bb5406d1e12.png differ diff --git a/static/img/_paligo/uuid-22e6048e-7f47-9480-fea3-958eb9a0348b.png b/static/img/_paligo/uuid-22e6048e-7f47-9480-fea3-958eb9a0348b.png new file mode 100644 index 0000000..fb7316f Binary files /dev/null and b/static/img/_paligo/uuid-22e6048e-7f47-9480-fea3-958eb9a0348b.png differ diff --git a/static/img/_paligo/uuid-23a8ca33-3d33-1a67-07d4-273f1c69e194.png b/static/img/_paligo/uuid-23a8ca33-3d33-1a67-07d4-273f1c69e194.png new file mode 100644 index 0000000..5b6feef Binary files /dev/null and b/static/img/_paligo/uuid-23a8ca33-3d33-1a67-07d4-273f1c69e194.png differ diff --git a/static/img/_paligo/uuid-23aa2f50-cde3-e87d-c8bd-0c2b1d512540.png b/static/img/_paligo/uuid-23aa2f50-cde3-e87d-c8bd-0c2b1d512540.png new file mode 100644 index 0000000..b76d71c Binary files /dev/null and b/static/img/_paligo/uuid-23aa2f50-cde3-e87d-c8bd-0c2b1d512540.png differ diff --git a/static/img/_paligo/uuid-23eca453-8f3c-1bbf-e189-eae6a638e144.png b/static/img/_paligo/uuid-23eca453-8f3c-1bbf-e189-eae6a638e144.png new file mode 100644 index 0000000..012bda3 Binary files /dev/null and b/static/img/_paligo/uuid-23eca453-8f3c-1bbf-e189-eae6a638e144.png differ diff --git a/static/img/_paligo/uuid-243b3111-76a9-8f92-b5aa-e345cf67e363.png b/static/img/_paligo/uuid-243b3111-76a9-8f92-b5aa-e345cf67e363.png new file mode 100644 index 0000000..6377055 Binary files /dev/null and b/static/img/_paligo/uuid-243b3111-76a9-8f92-b5aa-e345cf67e363.png differ diff --git a/static/img/_paligo/uuid-245d62ac-c277-cae8-0f6d-6d60ae23bb70.png b/static/img/_paligo/uuid-245d62ac-c277-cae8-0f6d-6d60ae23bb70.png new file mode 100644 index 0000000..3efa3ee Binary files /dev/null and b/static/img/_paligo/uuid-245d62ac-c277-cae8-0f6d-6d60ae23bb70.png differ diff --git a/static/img/_paligo/uuid-260b6d8c-c6ae-d008-a72a-8b0552a1e348.png b/static/img/_paligo/uuid-260b6d8c-c6ae-d008-a72a-8b0552a1e348.png new file mode 100644 index 0000000..66e2d17 Binary files /dev/null and b/static/img/_paligo/uuid-260b6d8c-c6ae-d008-a72a-8b0552a1e348.png differ diff --git a/static/img/_paligo/uuid-26832e7b-a5be-8098-d683-cd04a9d2cc04.png b/static/img/_paligo/uuid-26832e7b-a5be-8098-d683-cd04a9d2cc04.png new file mode 100644 index 0000000..f20adfa Binary files /dev/null and b/static/img/_paligo/uuid-26832e7b-a5be-8098-d683-cd04a9d2cc04.png differ diff --git a/static/img/_paligo/uuid-26903c72-7c1d-66a1-37d7-15be1fbd6379.png b/static/img/_paligo/uuid-26903c72-7c1d-66a1-37d7-15be1fbd6379.png new file mode 100644 index 0000000..a8c53ff Binary files /dev/null and b/static/img/_paligo/uuid-26903c72-7c1d-66a1-37d7-15be1fbd6379.png differ diff --git a/static/img/_paligo/uuid-26a387b3-ea77-211f-b2f8-09325e1cc44a.png b/static/img/_paligo/uuid-26a387b3-ea77-211f-b2f8-09325e1cc44a.png new file mode 100644 index 0000000..46b3720 Binary files /dev/null and b/static/img/_paligo/uuid-26a387b3-ea77-211f-b2f8-09325e1cc44a.png differ diff --git a/static/img/_paligo/uuid-26ad84be-65c7-1916-f079-6b553b4c436d.png b/static/img/_paligo/uuid-26ad84be-65c7-1916-f079-6b553b4c436d.png new file mode 100644 index 0000000..d32af95 Binary files /dev/null and b/static/img/_paligo/uuid-26ad84be-65c7-1916-f079-6b553b4c436d.png differ diff --git a/static/img/_paligo/uuid-2700f022-4822-82fe-77e4-1a0995b41ab6.png b/static/img/_paligo/uuid-2700f022-4822-82fe-77e4-1a0995b41ab6.png new file mode 100644 index 0000000..e1733c5 Binary files /dev/null and b/static/img/_paligo/uuid-2700f022-4822-82fe-77e4-1a0995b41ab6.png differ diff --git a/static/img/_paligo/uuid-27ceb4dd-22a3-a162-b569-73261ba2fef7.jpg b/static/img/_paligo/uuid-27ceb4dd-22a3-a162-b569-73261ba2fef7.jpg new file mode 100644 index 0000000..9b344d1 Binary files /dev/null and b/static/img/_paligo/uuid-27ceb4dd-22a3-a162-b569-73261ba2fef7.jpg differ diff --git a/static/img/_paligo/uuid-27ec3df6-bdce-7f78-95be-647668661e56.png b/static/img/_paligo/uuid-27ec3df6-bdce-7f78-95be-647668661e56.png new file mode 100644 index 0000000..293f905 Binary files /dev/null and b/static/img/_paligo/uuid-27ec3df6-bdce-7f78-95be-647668661e56.png differ diff --git a/static/img/_paligo/uuid-286c4817-1c22-6e11-06ec-26a34ce81273.png b/static/img/_paligo/uuid-286c4817-1c22-6e11-06ec-26a34ce81273.png new file mode 100644 index 0000000..c5ea57d Binary files /dev/null and b/static/img/_paligo/uuid-286c4817-1c22-6e11-06ec-26a34ce81273.png differ diff --git a/static/img/_paligo/uuid-28812c0e-a307-6879-8d90-d0d516765519.png b/static/img/_paligo/uuid-28812c0e-a307-6879-8d90-d0d516765519.png new file mode 100644 index 0000000..a45951c Binary files /dev/null and b/static/img/_paligo/uuid-28812c0e-a307-6879-8d90-d0d516765519.png differ diff --git a/static/img/_paligo/uuid-28b052ba-a18f-12ee-7a9a-04720bb6fdd1.png b/static/img/_paligo/uuid-28b052ba-a18f-12ee-7a9a-04720bb6fdd1.png new file mode 100644 index 0000000..f18ca6a Binary files /dev/null and b/static/img/_paligo/uuid-28b052ba-a18f-12ee-7a9a-04720bb6fdd1.png differ diff --git a/static/img/_paligo/uuid-28f245c4-7eb3-89b2-1e4d-18d922bbc0a5.png b/static/img/_paligo/uuid-28f245c4-7eb3-89b2-1e4d-18d922bbc0a5.png new file mode 100644 index 0000000..d69dde9 Binary files /dev/null and b/static/img/_paligo/uuid-28f245c4-7eb3-89b2-1e4d-18d922bbc0a5.png differ diff --git a/static/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png b/static/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png new file mode 100644 index 0000000..11826d3 Binary files /dev/null and b/static/img/_paligo/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png differ diff --git a/static/img/_paligo/uuid-299959e9-b519-88a2-05a2-ee89fa6963cd.png b/static/img/_paligo/uuid-299959e9-b519-88a2-05a2-ee89fa6963cd.png new file mode 100644 index 0000000..ca36e89 Binary files /dev/null and b/static/img/_paligo/uuid-299959e9-b519-88a2-05a2-ee89fa6963cd.png differ diff --git a/static/img/_paligo/uuid-29b1db0e-2fa8-8f7e-ba48-da85ed4db64b.png b/static/img/_paligo/uuid-29b1db0e-2fa8-8f7e-ba48-da85ed4db64b.png new file mode 100644 index 0000000..0a85c23 Binary files /dev/null and b/static/img/_paligo/uuid-29b1db0e-2fa8-8f7e-ba48-da85ed4db64b.png differ diff --git a/static/img/_paligo/uuid-29b363bc-ce14-f6a3-f310-62543138452e.png b/static/img/_paligo/uuid-29b363bc-ce14-f6a3-f310-62543138452e.png new file mode 100644 index 0000000..92e2792 Binary files /dev/null and b/static/img/_paligo/uuid-29b363bc-ce14-f6a3-f310-62543138452e.png differ diff --git a/static/img/_paligo/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg b/static/img/_paligo/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg new file mode 100644 index 0000000..a5f8dda Binary files /dev/null and b/static/img/_paligo/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg differ diff --git a/static/img/_paligo/uuid-2a0854ff-b62a-6215-5c2e-09cf6b244786.png b/static/img/_paligo/uuid-2a0854ff-b62a-6215-5c2e-09cf6b244786.png new file mode 100644 index 0000000..dc8237b Binary files /dev/null and b/static/img/_paligo/uuid-2a0854ff-b62a-6215-5c2e-09cf6b244786.png differ diff --git a/static/img/_paligo/uuid-2a3bef35-3d78-72e7-102b-8aa11def397f.png b/static/img/_paligo/uuid-2a3bef35-3d78-72e7-102b-8aa11def397f.png new file mode 100644 index 0000000..1d5e140 Binary files /dev/null and b/static/img/_paligo/uuid-2a3bef35-3d78-72e7-102b-8aa11def397f.png differ diff --git a/static/img/_paligo/uuid-2aed5814-692a-476b-f993-617cdb2c338f.png b/static/img/_paligo/uuid-2aed5814-692a-476b-f993-617cdb2c338f.png new file mode 100644 index 0000000..9d4d31a Binary files /dev/null and b/static/img/_paligo/uuid-2aed5814-692a-476b-f993-617cdb2c338f.png differ diff --git a/static/img/_paligo/uuid-2b040c7d-cbee-1050-4c6e-731d228fb547.png b/static/img/_paligo/uuid-2b040c7d-cbee-1050-4c6e-731d228fb547.png new file mode 100644 index 0000000..a6e0b18 Binary files /dev/null and b/static/img/_paligo/uuid-2b040c7d-cbee-1050-4c6e-731d228fb547.png differ diff --git a/static/img/_paligo/uuid-2b06167e-f54e-eb64-2314-315d36a5d17f.png b/static/img/_paligo/uuid-2b06167e-f54e-eb64-2314-315d36a5d17f.png new file mode 100644 index 0000000..48f9da6 Binary files /dev/null and b/static/img/_paligo/uuid-2b06167e-f54e-eb64-2314-315d36a5d17f.png differ diff --git a/static/img/_paligo/uuid-2b430e36-ee56-c8ce-3599-f267c550062a.png b/static/img/_paligo/uuid-2b430e36-ee56-c8ce-3599-f267c550062a.png new file mode 100644 index 0000000..d6ad4d4 Binary files /dev/null and b/static/img/_paligo/uuid-2b430e36-ee56-c8ce-3599-f267c550062a.png differ diff --git a/static/img/_paligo/uuid-2b51312c-d04b-29f9-c83a-14dcfa9306d2.png b/static/img/_paligo/uuid-2b51312c-d04b-29f9-c83a-14dcfa9306d2.png new file mode 100644 index 0000000..cd3b22d Binary files /dev/null and b/static/img/_paligo/uuid-2b51312c-d04b-29f9-c83a-14dcfa9306d2.png differ diff --git a/static/img/_paligo/uuid-2b97d7ef-4512-cf79-868f-bc66e728b509.png b/static/img/_paligo/uuid-2b97d7ef-4512-cf79-868f-bc66e728b509.png new file mode 100644 index 0000000..cd77353 Binary files /dev/null and b/static/img/_paligo/uuid-2b97d7ef-4512-cf79-868f-bc66e728b509.png differ diff --git a/static/img/_paligo/uuid-2bda7822-cd88-2b01-ff4d-8f5eec392c66.png b/static/img/_paligo/uuid-2bda7822-cd88-2b01-ff4d-8f5eec392c66.png new file mode 100644 index 0000000..cd76f34 Binary files /dev/null and b/static/img/_paligo/uuid-2bda7822-cd88-2b01-ff4d-8f5eec392c66.png differ diff --git a/static/img/_paligo/uuid-2c2a82f9-5bea-aa62-cd49-339aa061c265.png b/static/img/_paligo/uuid-2c2a82f9-5bea-aa62-cd49-339aa061c265.png new file mode 100644 index 0000000..a198249 Binary files /dev/null and b/static/img/_paligo/uuid-2c2a82f9-5bea-aa62-cd49-339aa061c265.png differ diff --git a/static/img/_paligo/uuid-2ce0bbbd-d455-1840-7b19-0bcfc6da8e12.png b/static/img/_paligo/uuid-2ce0bbbd-d455-1840-7b19-0bcfc6da8e12.png new file mode 100644 index 0000000..17545b0 Binary files /dev/null and b/static/img/_paligo/uuid-2ce0bbbd-d455-1840-7b19-0bcfc6da8e12.png differ diff --git a/static/img/_paligo/uuid-2d246b3d-6d4f-d215-8ee7-7d628492f7aa.png b/static/img/_paligo/uuid-2d246b3d-6d4f-d215-8ee7-7d628492f7aa.png new file mode 100644 index 0000000..e3b97d2 Binary files /dev/null and b/static/img/_paligo/uuid-2d246b3d-6d4f-d215-8ee7-7d628492f7aa.png differ diff --git a/static/img/_paligo/uuid-2d349c93-c464-218d-ac79-de7b3da38089.jpg b/static/img/_paligo/uuid-2d349c93-c464-218d-ac79-de7b3da38089.jpg new file mode 100644 index 0000000..ab59be8 Binary files /dev/null and b/static/img/_paligo/uuid-2d349c93-c464-218d-ac79-de7b3da38089.jpg differ diff --git a/static/img/_paligo/uuid-2da28206-9def-429e-3b2f-d3d769b15c3b.png b/static/img/_paligo/uuid-2da28206-9def-429e-3b2f-d3d769b15c3b.png new file mode 100644 index 0000000..c9ce766 Binary files /dev/null and b/static/img/_paligo/uuid-2da28206-9def-429e-3b2f-d3d769b15c3b.png differ diff --git a/static/img/_paligo/uuid-2de8b6b8-3fc0-5da9-9f45-1b22546e1bb2.png b/static/img/_paligo/uuid-2de8b6b8-3fc0-5da9-9f45-1b22546e1bb2.png new file mode 100644 index 0000000..262c8f7 Binary files /dev/null and b/static/img/_paligo/uuid-2de8b6b8-3fc0-5da9-9f45-1b22546e1bb2.png differ diff --git a/static/img/_paligo/uuid-2e0224cb-0d48-8c50-3bb4-c5a126fff586.png b/static/img/_paligo/uuid-2e0224cb-0d48-8c50-3bb4-c5a126fff586.png new file mode 100644 index 0000000..6fee25b Binary files /dev/null and b/static/img/_paligo/uuid-2e0224cb-0d48-8c50-3bb4-c5a126fff586.png differ diff --git a/static/img/_paligo/uuid-2e8a2cfc-6fe9-cf2b-9b4a-b4ec2f051568.jpg b/static/img/_paligo/uuid-2e8a2cfc-6fe9-cf2b-9b4a-b4ec2f051568.jpg new file mode 100644 index 0000000..6cd5d25 Binary files /dev/null and b/static/img/_paligo/uuid-2e8a2cfc-6fe9-cf2b-9b4a-b4ec2f051568.jpg differ diff --git a/static/img/_paligo/uuid-2fe105a3-6faa-4394-35fd-41fd3ed5cc42.png b/static/img/_paligo/uuid-2fe105a3-6faa-4394-35fd-41fd3ed5cc42.png new file mode 100644 index 0000000..bc81a51 Binary files /dev/null and b/static/img/_paligo/uuid-2fe105a3-6faa-4394-35fd-41fd3ed5cc42.png differ diff --git a/static/img/_paligo/uuid-311c03e1-c104-9bed-9744-f751497444a1.png b/static/img/_paligo/uuid-311c03e1-c104-9bed-9744-f751497444a1.png new file mode 100644 index 0000000..b00c635 Binary files /dev/null and b/static/img/_paligo/uuid-311c03e1-c104-9bed-9744-f751497444a1.png differ diff --git a/static/img/_paligo/uuid-3138c36f-fad8-3630-46b8-dfd9910807cc.png b/static/img/_paligo/uuid-3138c36f-fad8-3630-46b8-dfd9910807cc.png new file mode 100644 index 0000000..b22ea0c Binary files /dev/null and b/static/img/_paligo/uuid-3138c36f-fad8-3630-46b8-dfd9910807cc.png differ diff --git a/static/img/_paligo/uuid-31ba9329-7c53-4411-103e-df47df050799.png b/static/img/_paligo/uuid-31ba9329-7c53-4411-103e-df47df050799.png new file mode 100644 index 0000000..fed67f7 Binary files /dev/null and b/static/img/_paligo/uuid-31ba9329-7c53-4411-103e-df47df050799.png differ diff --git a/static/img/_paligo/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg b/static/img/_paligo/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg new file mode 100644 index 0000000..ea38b94 Binary files /dev/null and b/static/img/_paligo/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg differ diff --git a/static/img/_paligo/uuid-324a0ec5-3e09-e10f-9e9e-7ae1359ffdc2.png b/static/img/_paligo/uuid-324a0ec5-3e09-e10f-9e9e-7ae1359ffdc2.png new file mode 100644 index 0000000..f6c4d70 Binary files /dev/null and b/static/img/_paligo/uuid-324a0ec5-3e09-e10f-9e9e-7ae1359ffdc2.png differ diff --git a/static/img/_paligo/uuid-32b5ff3d-8431-8fe3-9971-89d8aca076f4.png b/static/img/_paligo/uuid-32b5ff3d-8431-8fe3-9971-89d8aca076f4.png new file mode 100644 index 0000000..09f936b Binary files /dev/null and b/static/img/_paligo/uuid-32b5ff3d-8431-8fe3-9971-89d8aca076f4.png differ diff --git a/static/img/_paligo/uuid-32cdcf4a-27ea-2a5c-a439-3828a31fec7c.png b/static/img/_paligo/uuid-32cdcf4a-27ea-2a5c-a439-3828a31fec7c.png new file mode 100644 index 0000000..6f521d1 Binary files /dev/null and b/static/img/_paligo/uuid-32cdcf4a-27ea-2a5c-a439-3828a31fec7c.png differ diff --git a/static/img/_paligo/uuid-33016129-6c3c-5427-c4ac-8dca1c01770d.png b/static/img/_paligo/uuid-33016129-6c3c-5427-c4ac-8dca1c01770d.png new file mode 100644 index 0000000..b859897 Binary files /dev/null and b/static/img/_paligo/uuid-33016129-6c3c-5427-c4ac-8dca1c01770d.png differ diff --git a/static/img/_paligo/uuid-3305dee6-a952-5073-e44b-02fd8c3925c1.png b/static/img/_paligo/uuid-3305dee6-a952-5073-e44b-02fd8c3925c1.png new file mode 100644 index 0000000..fb09d89 Binary files /dev/null and b/static/img/_paligo/uuid-3305dee6-a952-5073-e44b-02fd8c3925c1.png differ diff --git a/static/img/_paligo/uuid-33093867-a2c4-50e5-79ca-cf8fba179e41.png b/static/img/_paligo/uuid-33093867-a2c4-50e5-79ca-cf8fba179e41.png new file mode 100644 index 0000000..23e4960 Binary files /dev/null and b/static/img/_paligo/uuid-33093867-a2c4-50e5-79ca-cf8fba179e41.png differ diff --git a/static/img/_paligo/uuid-336544f8-0f74-08ad-8a5d-616f33d62736.png b/static/img/_paligo/uuid-336544f8-0f74-08ad-8a5d-616f33d62736.png new file mode 100644 index 0000000..8167661 Binary files /dev/null and b/static/img/_paligo/uuid-336544f8-0f74-08ad-8a5d-616f33d62736.png differ diff --git a/static/img/_paligo/uuid-33ad7b4b-fc7e-c184-895e-b8b81463b2ee.png b/static/img/_paligo/uuid-33ad7b4b-fc7e-c184-895e-b8b81463b2ee.png new file mode 100644 index 0000000..3108626 Binary files /dev/null and b/static/img/_paligo/uuid-33ad7b4b-fc7e-c184-895e-b8b81463b2ee.png differ diff --git a/static/img/_paligo/uuid-33deefaf-a687-276f-ff84-cb0b6e45e885.png b/static/img/_paligo/uuid-33deefaf-a687-276f-ff84-cb0b6e45e885.png new file mode 100644 index 0000000..22ffcfb Binary files /dev/null and b/static/img/_paligo/uuid-33deefaf-a687-276f-ff84-cb0b6e45e885.png differ diff --git a/static/img/_paligo/uuid-3424f770-b6c1-749a-b936-6d073bab7469.png b/static/img/_paligo/uuid-3424f770-b6c1-749a-b936-6d073bab7469.png new file mode 100644 index 0000000..90a7b7f Binary files /dev/null and b/static/img/_paligo/uuid-3424f770-b6c1-749a-b936-6d073bab7469.png differ diff --git a/static/img/_paligo/uuid-3452d29c-7dd3-8a00-dbc3-c69620063c48.png b/static/img/_paligo/uuid-3452d29c-7dd3-8a00-dbc3-c69620063c48.png new file mode 100644 index 0000000..eafcbdb Binary files /dev/null and b/static/img/_paligo/uuid-3452d29c-7dd3-8a00-dbc3-c69620063c48.png differ diff --git a/static/img/_paligo/uuid-3474472d-9f45-e08c-37a0-82dcc3516481.png b/static/img/_paligo/uuid-3474472d-9f45-e08c-37a0-82dcc3516481.png new file mode 100644 index 0000000..8cf781f Binary files /dev/null and b/static/img/_paligo/uuid-3474472d-9f45-e08c-37a0-82dcc3516481.png differ diff --git a/static/img/_paligo/uuid-3541a0b4-b1d8-6530-46f1-0e3badfff2b3.png b/static/img/_paligo/uuid-3541a0b4-b1d8-6530-46f1-0e3badfff2b3.png new file mode 100644 index 0000000..0b18c32 Binary files /dev/null and b/static/img/_paligo/uuid-3541a0b4-b1d8-6530-46f1-0e3badfff2b3.png differ diff --git a/static/img/_paligo/uuid-35998534-7cfb-c0c6-7277-bb12dd6bc345.png b/static/img/_paligo/uuid-35998534-7cfb-c0c6-7277-bb12dd6bc345.png new file mode 100644 index 0000000..7946e06 Binary files /dev/null and b/static/img/_paligo/uuid-35998534-7cfb-c0c6-7277-bb12dd6bc345.png differ diff --git a/static/img/_paligo/uuid-35a66242-8cc5-8b66-380d-a996c3012825.png b/static/img/_paligo/uuid-35a66242-8cc5-8b66-380d-a996c3012825.png new file mode 100644 index 0000000..4ab73b2 Binary files /dev/null and b/static/img/_paligo/uuid-35a66242-8cc5-8b66-380d-a996c3012825.png differ diff --git a/static/img/_paligo/uuid-35da65f6-1384-de64-328a-42f8232d2574.png b/static/img/_paligo/uuid-35da65f6-1384-de64-328a-42f8232d2574.png new file mode 100644 index 0000000..9f8ab59 Binary files /dev/null and b/static/img/_paligo/uuid-35da65f6-1384-de64-328a-42f8232d2574.png differ diff --git a/static/img/_paligo/uuid-3850ebd0-6ab7-934f-c232-4305ccffe249.png b/static/img/_paligo/uuid-3850ebd0-6ab7-934f-c232-4305ccffe249.png new file mode 100644 index 0000000..955c91f Binary files /dev/null and b/static/img/_paligo/uuid-3850ebd0-6ab7-934f-c232-4305ccffe249.png differ diff --git a/static/img/_paligo/uuid-3861bf61-778c-af22-dad4-28d5b52cf1f0.png b/static/img/_paligo/uuid-3861bf61-778c-af22-dad4-28d5b52cf1f0.png new file mode 100644 index 0000000..89a68c1 Binary files /dev/null and b/static/img/_paligo/uuid-3861bf61-778c-af22-dad4-28d5b52cf1f0.png differ diff --git a/static/img/_paligo/uuid-387f919f-49c9-14ae-cb62-1bc4f47cda1e.png b/static/img/_paligo/uuid-387f919f-49c9-14ae-cb62-1bc4f47cda1e.png new file mode 100644 index 0000000..ae8f521 Binary files /dev/null and b/static/img/_paligo/uuid-387f919f-49c9-14ae-cb62-1bc4f47cda1e.png differ diff --git a/static/img/_paligo/uuid-38cefb5d-2dc6-7a86-98cd-d1dac6484ded.png b/static/img/_paligo/uuid-38cefb5d-2dc6-7a86-98cd-d1dac6484ded.png new file mode 100644 index 0000000..f0b5b36 Binary files /dev/null and b/static/img/_paligo/uuid-38cefb5d-2dc6-7a86-98cd-d1dac6484ded.png differ diff --git a/static/img/_paligo/uuid-39c02a1a-b3f2-3922-a9d1-fac312c98f92.jpg b/static/img/_paligo/uuid-39c02a1a-b3f2-3922-a9d1-fac312c98f92.jpg new file mode 100644 index 0000000..8f3998b Binary files /dev/null and b/static/img/_paligo/uuid-39c02a1a-b3f2-3922-a9d1-fac312c98f92.jpg differ diff --git a/static/img/_paligo/uuid-39f030dd-13a5-7302-6200-44aa39114f17.jpg b/static/img/_paligo/uuid-39f030dd-13a5-7302-6200-44aa39114f17.jpg new file mode 100644 index 0000000..9384881 Binary files /dev/null and b/static/img/_paligo/uuid-39f030dd-13a5-7302-6200-44aa39114f17.jpg differ diff --git a/static/img/_paligo/uuid-3a2a9de6-726f-577c-175c-a3022d1cc2c0.png b/static/img/_paligo/uuid-3a2a9de6-726f-577c-175c-a3022d1cc2c0.png new file mode 100644 index 0000000..40a0f5a Binary files /dev/null and b/static/img/_paligo/uuid-3a2a9de6-726f-577c-175c-a3022d1cc2c0.png differ diff --git a/static/img/_paligo/uuid-3a873c33-52fb-926c-64d7-faeb23df7e64.png b/static/img/_paligo/uuid-3a873c33-52fb-926c-64d7-faeb23df7e64.png new file mode 100644 index 0000000..c460cad Binary files /dev/null and b/static/img/_paligo/uuid-3a873c33-52fb-926c-64d7-faeb23df7e64.png differ diff --git a/static/img/_paligo/uuid-3ab9024b-207a-0b06-c099-714f8c053ecd.png b/static/img/_paligo/uuid-3ab9024b-207a-0b06-c099-714f8c053ecd.png new file mode 100644 index 0000000..0ed4133 Binary files /dev/null and b/static/img/_paligo/uuid-3ab9024b-207a-0b06-c099-714f8c053ecd.png differ diff --git a/static/img/_paligo/uuid-3b1378b0-3006-c0d1-a710-7c4a51821841.png b/static/img/_paligo/uuid-3b1378b0-3006-c0d1-a710-7c4a51821841.png new file mode 100644 index 0000000..79e96d8 Binary files /dev/null and b/static/img/_paligo/uuid-3b1378b0-3006-c0d1-a710-7c4a51821841.png differ diff --git a/static/img/_paligo/uuid-3b5d8be9-8f71-2547-1c6c-7c41113bf6b9.png b/static/img/_paligo/uuid-3b5d8be9-8f71-2547-1c6c-7c41113bf6b9.png new file mode 100644 index 0000000..46f56b9 Binary files /dev/null and b/static/img/_paligo/uuid-3b5d8be9-8f71-2547-1c6c-7c41113bf6b9.png differ diff --git a/static/img/_paligo/uuid-3bb43658-43d6-234e-9788-d71d49d5c1db.png b/static/img/_paligo/uuid-3bb43658-43d6-234e-9788-d71d49d5c1db.png new file mode 100644 index 0000000..d697d7b Binary files /dev/null and b/static/img/_paligo/uuid-3bb43658-43d6-234e-9788-d71d49d5c1db.png differ diff --git a/static/img/_paligo/uuid-3bbc4214-3819-7b12-200a-d211bc965b7e.png b/static/img/_paligo/uuid-3bbc4214-3819-7b12-200a-d211bc965b7e.png new file mode 100644 index 0000000..b7f3631 Binary files /dev/null and b/static/img/_paligo/uuid-3bbc4214-3819-7b12-200a-d211bc965b7e.png differ diff --git a/static/img/_paligo/uuid-3c75e562-bf1f-266f-ec68-910589ed408e.png b/static/img/_paligo/uuid-3c75e562-bf1f-266f-ec68-910589ed408e.png new file mode 100644 index 0000000..c575e5d Binary files /dev/null and b/static/img/_paligo/uuid-3c75e562-bf1f-266f-ec68-910589ed408e.png differ diff --git a/static/img/_paligo/uuid-3c8c65d8-1de1-0a50-62cf-acf76dc76bf9.png b/static/img/_paligo/uuid-3c8c65d8-1de1-0a50-62cf-acf76dc76bf9.png new file mode 100644 index 0000000..2c26dc8 Binary files /dev/null and b/static/img/_paligo/uuid-3c8c65d8-1de1-0a50-62cf-acf76dc76bf9.png differ diff --git a/static/img/_paligo/uuid-3ca810bc-4569-859b-f0be-784644322a22.png b/static/img/_paligo/uuid-3ca810bc-4569-859b-f0be-784644322a22.png new file mode 100644 index 0000000..c945e14 Binary files /dev/null and b/static/img/_paligo/uuid-3ca810bc-4569-859b-f0be-784644322a22.png differ diff --git a/static/img/_paligo/uuid-3cab36a0-7c43-5fb3-40cb-d7c03cd8ab00.png b/static/img/_paligo/uuid-3cab36a0-7c43-5fb3-40cb-d7c03cd8ab00.png new file mode 100644 index 0000000..e561242 Binary files /dev/null and b/static/img/_paligo/uuid-3cab36a0-7c43-5fb3-40cb-d7c03cd8ab00.png differ diff --git a/static/img/_paligo/uuid-3de8dcba-e678-997e-20f0-3055cd889bb0.png b/static/img/_paligo/uuid-3de8dcba-e678-997e-20f0-3055cd889bb0.png new file mode 100644 index 0000000..9692a63 Binary files /dev/null and b/static/img/_paligo/uuid-3de8dcba-e678-997e-20f0-3055cd889bb0.png differ diff --git a/static/img/_paligo/uuid-3edf7fb2-6a3c-9e72-52c2-a5ec796816e7.png b/static/img/_paligo/uuid-3edf7fb2-6a3c-9e72-52c2-a5ec796816e7.png new file mode 100644 index 0000000..5b7f340 Binary files /dev/null and b/static/img/_paligo/uuid-3edf7fb2-6a3c-9e72-52c2-a5ec796816e7.png differ diff --git a/static/img/_paligo/uuid-4023a0e5-a889-7041-05ab-f31969f8e898.png b/static/img/_paligo/uuid-4023a0e5-a889-7041-05ab-f31969f8e898.png new file mode 100644 index 0000000..5ca0270 Binary files /dev/null and b/static/img/_paligo/uuid-4023a0e5-a889-7041-05ab-f31969f8e898.png differ diff --git a/static/img/_paligo/uuid-4033d0af-df38-8e77-9963-4812d259f9ad.jpg b/static/img/_paligo/uuid-4033d0af-df38-8e77-9963-4812d259f9ad.jpg new file mode 100644 index 0000000..f70c974 Binary files /dev/null and b/static/img/_paligo/uuid-4033d0af-df38-8e77-9963-4812d259f9ad.jpg differ diff --git a/static/img/_paligo/uuid-40c38dac-74da-dcc2-0e07-64366c2732dc.png b/static/img/_paligo/uuid-40c38dac-74da-dcc2-0e07-64366c2732dc.png new file mode 100644 index 0000000..935e781 Binary files /dev/null and b/static/img/_paligo/uuid-40c38dac-74da-dcc2-0e07-64366c2732dc.png differ diff --git a/static/img/_paligo/uuid-41d604b4-d929-893c-2ac9-aa44b3e01e85.png b/static/img/_paligo/uuid-41d604b4-d929-893c-2ac9-aa44b3e01e85.png new file mode 100644 index 0000000..47f69ac Binary files /dev/null and b/static/img/_paligo/uuid-41d604b4-d929-893c-2ac9-aa44b3e01e85.png differ diff --git a/static/img/_paligo/uuid-426d42b4-ca6f-d5de-d91a-b9e8a4fd8ba1.png b/static/img/_paligo/uuid-426d42b4-ca6f-d5de-d91a-b9e8a4fd8ba1.png new file mode 100644 index 0000000..0dd970e Binary files /dev/null and b/static/img/_paligo/uuid-426d42b4-ca6f-d5de-d91a-b9e8a4fd8ba1.png differ diff --git a/static/img/_paligo/uuid-42c797d6-13f2-d5b3-c183-c48546d78983.png b/static/img/_paligo/uuid-42c797d6-13f2-d5b3-c183-c48546d78983.png new file mode 100644 index 0000000..835f9d7 Binary files /dev/null and b/static/img/_paligo/uuid-42c797d6-13f2-d5b3-c183-c48546d78983.png differ diff --git a/static/img/_paligo/uuid-435d30ce-97a4-4f6a-995c-b48fea89bad9.png b/static/img/_paligo/uuid-435d30ce-97a4-4f6a-995c-b48fea89bad9.png new file mode 100644 index 0000000..e3daa83 Binary files /dev/null and b/static/img/_paligo/uuid-435d30ce-97a4-4f6a-995c-b48fea89bad9.png differ diff --git a/static/img/_paligo/uuid-43ba1d01-1168-f540-9414-ace775c44ac5.png b/static/img/_paligo/uuid-43ba1d01-1168-f540-9414-ace775c44ac5.png new file mode 100644 index 0000000..01279be Binary files /dev/null and b/static/img/_paligo/uuid-43ba1d01-1168-f540-9414-ace775c44ac5.png differ diff --git a/static/img/_paligo/uuid-447a76c6-96e0-a493-214d-484d92a36dc8.png b/static/img/_paligo/uuid-447a76c6-96e0-a493-214d-484d92a36dc8.png new file mode 100644 index 0000000..38f0a1c Binary files /dev/null and b/static/img/_paligo/uuid-447a76c6-96e0-a493-214d-484d92a36dc8.png differ diff --git a/static/img/_paligo/uuid-4504890a-1b65-20b5-d16c-548bf94a890e.png b/static/img/_paligo/uuid-4504890a-1b65-20b5-d16c-548bf94a890e.png new file mode 100644 index 0000000..0a86d5d Binary files /dev/null and b/static/img/_paligo/uuid-4504890a-1b65-20b5-d16c-548bf94a890e.png differ diff --git a/static/img/_paligo/uuid-4510e204-8973-1a9a-0c2e-7ffc0c073aad.jpg b/static/img/_paligo/uuid-4510e204-8973-1a9a-0c2e-7ffc0c073aad.jpg new file mode 100644 index 0000000..669afa8 Binary files /dev/null and b/static/img/_paligo/uuid-4510e204-8973-1a9a-0c2e-7ffc0c073aad.jpg differ diff --git a/static/img/_paligo/uuid-464e4d9f-1911-a722-1008-2b9f67b6bc5c.png b/static/img/_paligo/uuid-464e4d9f-1911-a722-1008-2b9f67b6bc5c.png new file mode 100644 index 0000000..26864f0 Binary files /dev/null and b/static/img/_paligo/uuid-464e4d9f-1911-a722-1008-2b9f67b6bc5c.png differ diff --git a/static/img/_paligo/uuid-46cdbdfc-b373-9709-b953-2ae3887f1543.png b/static/img/_paligo/uuid-46cdbdfc-b373-9709-b953-2ae3887f1543.png new file mode 100644 index 0000000..57b59c1 Binary files /dev/null and b/static/img/_paligo/uuid-46cdbdfc-b373-9709-b953-2ae3887f1543.png differ diff --git a/static/img/_paligo/uuid-4775415f-854a-3e11-430a-34c233f7fc5f.png b/static/img/_paligo/uuid-4775415f-854a-3e11-430a-34c233f7fc5f.png new file mode 100644 index 0000000..1cff949 Binary files /dev/null and b/static/img/_paligo/uuid-4775415f-854a-3e11-430a-34c233f7fc5f.png differ diff --git a/static/img/_paligo/uuid-47aacb1a-a7a9-f93e-8130-83ad51654298.png b/static/img/_paligo/uuid-47aacb1a-a7a9-f93e-8130-83ad51654298.png new file mode 100644 index 0000000..e5e3640 Binary files /dev/null and b/static/img/_paligo/uuid-47aacb1a-a7a9-f93e-8130-83ad51654298.png differ diff --git a/static/img/_paligo/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png b/static/img/_paligo/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png new file mode 100644 index 0000000..e4bccfb Binary files /dev/null and b/static/img/_paligo/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png differ diff --git a/static/img/_paligo/uuid-4822cd7c-0379-35e2-9ab3-d483dc8c6355.jpg b/static/img/_paligo/uuid-4822cd7c-0379-35e2-9ab3-d483dc8c6355.jpg new file mode 100644 index 0000000..407f637 Binary files /dev/null and b/static/img/_paligo/uuid-4822cd7c-0379-35e2-9ab3-d483dc8c6355.jpg differ diff --git a/static/img/_paligo/uuid-48a9ebfc-c07d-81f3-7b87-09f6fdcc1794.png b/static/img/_paligo/uuid-48a9ebfc-c07d-81f3-7b87-09f6fdcc1794.png new file mode 100644 index 0000000..e8d5931 Binary files /dev/null and b/static/img/_paligo/uuid-48a9ebfc-c07d-81f3-7b87-09f6fdcc1794.png differ diff --git a/static/img/_paligo/uuid-48b2ff90-e029-0d70-f0d7-f0b05e989540.png b/static/img/_paligo/uuid-48b2ff90-e029-0d70-f0d7-f0b05e989540.png new file mode 100644 index 0000000..7e6817f Binary files /dev/null and b/static/img/_paligo/uuid-48b2ff90-e029-0d70-f0d7-f0b05e989540.png differ diff --git a/static/img/_paligo/uuid-4908f90e-3721-b82f-2d79-937d6a9b14f3.png b/static/img/_paligo/uuid-4908f90e-3721-b82f-2d79-937d6a9b14f3.png new file mode 100644 index 0000000..a8b09aa Binary files /dev/null and b/static/img/_paligo/uuid-4908f90e-3721-b82f-2d79-937d6a9b14f3.png differ diff --git a/static/img/_paligo/uuid-4955154b-d553-bb34-5b96-c1779bfecbed.png b/static/img/_paligo/uuid-4955154b-d553-bb34-5b96-c1779bfecbed.png new file mode 100644 index 0000000..25cd6ce Binary files /dev/null and b/static/img/_paligo/uuid-4955154b-d553-bb34-5b96-c1779bfecbed.png differ diff --git a/static/img/_paligo/uuid-49707b16-e6a3-6f4e-ea0a-869f23923758.png b/static/img/_paligo/uuid-49707b16-e6a3-6f4e-ea0a-869f23923758.png new file mode 100644 index 0000000..3188c76 Binary files /dev/null and b/static/img/_paligo/uuid-49707b16-e6a3-6f4e-ea0a-869f23923758.png differ diff --git a/static/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png b/static/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png new file mode 100644 index 0000000..b6deb18 Binary files /dev/null and b/static/img/_paligo/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png differ diff --git a/static/img/_paligo/uuid-4ababac0-1bb5-1f86-165a-f31d14fa9f28.png b/static/img/_paligo/uuid-4ababac0-1bb5-1f86-165a-f31d14fa9f28.png new file mode 100644 index 0000000..531a6ca Binary files /dev/null and b/static/img/_paligo/uuid-4ababac0-1bb5-1f86-165a-f31d14fa9f28.png differ diff --git a/static/img/_paligo/uuid-4c68fb66-ab5a-75a7-bb14-ab0f2617444f.png b/static/img/_paligo/uuid-4c68fb66-ab5a-75a7-bb14-ab0f2617444f.png new file mode 100644 index 0000000..1fd5c9a Binary files /dev/null and b/static/img/_paligo/uuid-4c68fb66-ab5a-75a7-bb14-ab0f2617444f.png differ diff --git a/static/img/_paligo/uuid-4d8bea06-abe3-0ad5-9a37-d840ad2c0875.png b/static/img/_paligo/uuid-4d8bea06-abe3-0ad5-9a37-d840ad2c0875.png new file mode 100644 index 0000000..bffc224 Binary files /dev/null and b/static/img/_paligo/uuid-4d8bea06-abe3-0ad5-9a37-d840ad2c0875.png differ diff --git a/static/img/_paligo/uuid-4defa7e8-2933-8118-8b32-414f4a4994d2.png b/static/img/_paligo/uuid-4defa7e8-2933-8118-8b32-414f4a4994d2.png new file mode 100644 index 0000000..7468bb7 Binary files /dev/null and b/static/img/_paligo/uuid-4defa7e8-2933-8118-8b32-414f4a4994d2.png differ diff --git a/static/img/_paligo/uuid-4e5bd057-700c-f047-f6ae-498ebd98f1a2.png b/static/img/_paligo/uuid-4e5bd057-700c-f047-f6ae-498ebd98f1a2.png new file mode 100644 index 0000000..84d3a96 Binary files /dev/null and b/static/img/_paligo/uuid-4e5bd057-700c-f047-f6ae-498ebd98f1a2.png differ diff --git a/static/img/_paligo/uuid-4f7e400b-3a64-eb42-5b85-c51a3f41da03.png b/static/img/_paligo/uuid-4f7e400b-3a64-eb42-5b85-c51a3f41da03.png new file mode 100644 index 0000000..9bfbd5e Binary files /dev/null and b/static/img/_paligo/uuid-4f7e400b-3a64-eb42-5b85-c51a3f41da03.png differ diff --git a/static/img/_paligo/uuid-4f8203e0-c79b-b9ec-7537-53e96b0f1924.png b/static/img/_paligo/uuid-4f8203e0-c79b-b9ec-7537-53e96b0f1924.png new file mode 100644 index 0000000..e620eef Binary files /dev/null and b/static/img/_paligo/uuid-4f8203e0-c79b-b9ec-7537-53e96b0f1924.png differ diff --git a/static/img/_paligo/uuid-5169df38-e851-52da-fb4f-d37c3f98e8d8.svg b/static/img/_paligo/uuid-5169df38-e851-52da-fb4f-d37c3f98e8d8.svg new file mode 100644 index 0000000..9c2b7b8 --- /dev/null +++ b/static/img/_paligo/uuid-5169df38-e851-52da-fb4f-d37c3f98e8d8.svg @@ -0,0 +1 @@ +
Not updated
Builds cannot be launched on it
Not updated...
Removed
Removed
Tooling changes
Experimental features
Tooling changes...
Edge
Edge
Update frequency: often
Update frequency: often
Reliable with rarely changing tools
Reliable with rarely changing t...
Stable
Stable
Update frequency: only critical and required updates
Update frequency: only critical...
w
Soon to be removed
Consider migrating to a newer stack
Soon to be removed...
Frozen
Frozen
Update frequency: not receiving updates
Update frequency: not re...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/_paligo/uuid-518781ac-bb0f-7bec-d0ec-26047fb2b16d.png b/static/img/_paligo/uuid-518781ac-bb0f-7bec-d0ec-26047fb2b16d.png new file mode 100644 index 0000000..f24b230 Binary files /dev/null and b/static/img/_paligo/uuid-518781ac-bb0f-7bec-d0ec-26047fb2b16d.png differ diff --git a/static/img/_paligo/uuid-527aa0a4-a647-f9e9-7a56-ea38c1366f33.png b/static/img/_paligo/uuid-527aa0a4-a647-f9e9-7a56-ea38c1366f33.png new file mode 100644 index 0000000..3218271 Binary files /dev/null and b/static/img/_paligo/uuid-527aa0a4-a647-f9e9-7a56-ea38c1366f33.png differ diff --git a/static/img/_paligo/uuid-52def735-231b-d0ea-e01e-b8b12cfbe86a.png b/static/img/_paligo/uuid-52def735-231b-d0ea-e01e-b8b12cfbe86a.png new file mode 100644 index 0000000..a29cbf1 Binary files /dev/null and b/static/img/_paligo/uuid-52def735-231b-d0ea-e01e-b8b12cfbe86a.png differ diff --git a/static/img/_paligo/uuid-53eba539-6b4d-b4cf-c33d-6168fca79640.png b/static/img/_paligo/uuid-53eba539-6b4d-b4cf-c33d-6168fca79640.png new file mode 100644 index 0000000..a7dc220 Binary files /dev/null and b/static/img/_paligo/uuid-53eba539-6b4d-b4cf-c33d-6168fca79640.png differ diff --git a/static/img/_paligo/uuid-541a72f2-6396-7422-0446-823ce23549a0.png b/static/img/_paligo/uuid-541a72f2-6396-7422-0446-823ce23549a0.png new file mode 100644 index 0000000..3658f79 Binary files /dev/null and b/static/img/_paligo/uuid-541a72f2-6396-7422-0446-823ce23549a0.png differ diff --git a/static/img/_paligo/uuid-5447e1bd-56ac-3503-4473-18f9784a64bf.png b/static/img/_paligo/uuid-5447e1bd-56ac-3503-4473-18f9784a64bf.png new file mode 100644 index 0000000..65a9373 Binary files /dev/null and b/static/img/_paligo/uuid-5447e1bd-56ac-3503-4473-18f9784a64bf.png differ diff --git a/static/img/_paligo/uuid-54d3257f-0147-d101-0dde-c0296dcb798a.png b/static/img/_paligo/uuid-54d3257f-0147-d101-0dde-c0296dcb798a.png new file mode 100644 index 0000000..834ec53 Binary files /dev/null and b/static/img/_paligo/uuid-54d3257f-0147-d101-0dde-c0296dcb798a.png differ diff --git a/static/img/_paligo/uuid-55c4990e-7f00-98a4-fa17-c3a9d0e3ba76.png b/static/img/_paligo/uuid-55c4990e-7f00-98a4-fa17-c3a9d0e3ba76.png new file mode 100644 index 0000000..522d28a Binary files /dev/null and b/static/img/_paligo/uuid-55c4990e-7f00-98a4-fa17-c3a9d0e3ba76.png differ diff --git a/static/img/_paligo/uuid-55dc2023-f61b-5331-f1af-94924727ff25.png b/static/img/_paligo/uuid-55dc2023-f61b-5331-f1af-94924727ff25.png new file mode 100644 index 0000000..d9e478a Binary files /dev/null and b/static/img/_paligo/uuid-55dc2023-f61b-5331-f1af-94924727ff25.png differ diff --git a/static/img/_paligo/uuid-563e93b4-6feb-8322-27f7-7b86d6957992.png b/static/img/_paligo/uuid-563e93b4-6feb-8322-27f7-7b86d6957992.png new file mode 100644 index 0000000..b44c6f9 Binary files /dev/null and b/static/img/_paligo/uuid-563e93b4-6feb-8322-27f7-7b86d6957992.png differ diff --git a/static/img/_paligo/uuid-56915efe-d16d-4ab6-6535-f2b18d6ee6af.png b/static/img/_paligo/uuid-56915efe-d16d-4ab6-6535-f2b18d6ee6af.png new file mode 100644 index 0000000..79c8b26 Binary files /dev/null and b/static/img/_paligo/uuid-56915efe-d16d-4ab6-6535-f2b18d6ee6af.png differ diff --git a/static/img/_paligo/uuid-56c193b1-5aaf-9bc1-63f3-61739dfcd68d.png b/static/img/_paligo/uuid-56c193b1-5aaf-9bc1-63f3-61739dfcd68d.png new file mode 100644 index 0000000..4011f11 Binary files /dev/null and b/static/img/_paligo/uuid-56c193b1-5aaf-9bc1-63f3-61739dfcd68d.png differ diff --git a/static/img/_paligo/uuid-573f2524-97b7-94ea-38d4-c76306fafa29.png b/static/img/_paligo/uuid-573f2524-97b7-94ea-38d4-c76306fafa29.png new file mode 100644 index 0000000..f258db8 Binary files /dev/null and b/static/img/_paligo/uuid-573f2524-97b7-94ea-38d4-c76306fafa29.png differ diff --git a/static/img/_paligo/uuid-58597c24-04b0-d59c-c007-abd9c802360a.png b/static/img/_paligo/uuid-58597c24-04b0-d59c-c007-abd9c802360a.png new file mode 100644 index 0000000..29bfbe2 Binary files /dev/null and b/static/img/_paligo/uuid-58597c24-04b0-d59c-c007-abd9c802360a.png differ diff --git a/static/img/_paligo/uuid-588d950a-8b3c-1984-18f6-d251651222a2.png b/static/img/_paligo/uuid-588d950a-8b3c-1984-18f6-d251651222a2.png new file mode 100644 index 0000000..0435722 Binary files /dev/null and b/static/img/_paligo/uuid-588d950a-8b3c-1984-18f6-d251651222a2.png differ diff --git a/static/img/_paligo/uuid-58a8bc7f-8220-32ed-3cc3-193aa78e8cf4.png b/static/img/_paligo/uuid-58a8bc7f-8220-32ed-3cc3-193aa78e8cf4.png new file mode 100644 index 0000000..923f739 Binary files /dev/null and b/static/img/_paligo/uuid-58a8bc7f-8220-32ed-3cc3-193aa78e8cf4.png differ diff --git a/static/img/_paligo/uuid-58be0b4a-94fa-0a4b-1bac-91d7f81078a1.png b/static/img/_paligo/uuid-58be0b4a-94fa-0a4b-1bac-91d7f81078a1.png new file mode 100644 index 0000000..7db18ff Binary files /dev/null and b/static/img/_paligo/uuid-58be0b4a-94fa-0a4b-1bac-91d7f81078a1.png differ diff --git a/static/img/_paligo/uuid-594370f7-8b76-f5b1-3042-d09c9f06bfe7.png b/static/img/_paligo/uuid-594370f7-8b76-f5b1-3042-d09c9f06bfe7.png new file mode 100644 index 0000000..1cf55c1 Binary files /dev/null and b/static/img/_paligo/uuid-594370f7-8b76-f5b1-3042-d09c9f06bfe7.png differ diff --git a/static/img/_paligo/uuid-59d1dcd7-7e29-7221-cbfb-b648ab73102b.png b/static/img/_paligo/uuid-59d1dcd7-7e29-7221-cbfb-b648ab73102b.png new file mode 100644 index 0000000..0732114 Binary files /dev/null and b/static/img/_paligo/uuid-59d1dcd7-7e29-7221-cbfb-b648ab73102b.png differ diff --git a/static/img/_paligo/uuid-5aa8c4c0-1851-b6c3-810b-11ca0c3dda28.png b/static/img/_paligo/uuid-5aa8c4c0-1851-b6c3-810b-11ca0c3dda28.png new file mode 100644 index 0000000..5b2f0d2 Binary files /dev/null and b/static/img/_paligo/uuid-5aa8c4c0-1851-b6c3-810b-11ca0c3dda28.png differ diff --git a/static/img/_paligo/uuid-5b243f17-057e-1324-1fd8-31305be6c08c.png b/static/img/_paligo/uuid-5b243f17-057e-1324-1fd8-31305be6c08c.png new file mode 100644 index 0000000..0f028d1 Binary files /dev/null and b/static/img/_paligo/uuid-5b243f17-057e-1324-1fd8-31305be6c08c.png differ diff --git a/static/img/_paligo/uuid-5b325bb0-a98a-bd3d-943f-c7d26897e362.png b/static/img/_paligo/uuid-5b325bb0-a98a-bd3d-943f-c7d26897e362.png new file mode 100644 index 0000000..4187883 Binary files /dev/null and b/static/img/_paligo/uuid-5b325bb0-a98a-bd3d-943f-c7d26897e362.png differ diff --git a/static/img/_paligo/uuid-5b529235-9f88-8b16-64c4-9438f3cc9498.jpg b/static/img/_paligo/uuid-5b529235-9f88-8b16-64c4-9438f3cc9498.jpg new file mode 100644 index 0000000..9bed6f0 Binary files /dev/null and b/static/img/_paligo/uuid-5b529235-9f88-8b16-64c4-9438f3cc9498.jpg differ diff --git a/static/img/_paligo/uuid-5b7fd557-dadc-4d73-eaa5-39119cd3b63f.png b/static/img/_paligo/uuid-5b7fd557-dadc-4d73-eaa5-39119cd3b63f.png new file mode 100644 index 0000000..7525e7d Binary files /dev/null and b/static/img/_paligo/uuid-5b7fd557-dadc-4d73-eaa5-39119cd3b63f.png differ diff --git a/static/img/_paligo/uuid-5be9939f-1e31-2a9d-6c18-016f86734943.png b/static/img/_paligo/uuid-5be9939f-1e31-2a9d-6c18-016f86734943.png new file mode 100644 index 0000000..ddf179c Binary files /dev/null and b/static/img/_paligo/uuid-5be9939f-1e31-2a9d-6c18-016f86734943.png differ diff --git a/static/img/_paligo/uuid-5d4f1f7c-0ca9-93fb-251c-4b63c26f1f4b.png b/static/img/_paligo/uuid-5d4f1f7c-0ca9-93fb-251c-4b63c26f1f4b.png new file mode 100644 index 0000000..517dcc6 Binary files /dev/null and b/static/img/_paligo/uuid-5d4f1f7c-0ca9-93fb-251c-4b63c26f1f4b.png differ diff --git a/static/img/_paligo/uuid-5d668c02-0f6c-cbcb-3206-b2e5a711979f.png b/static/img/_paligo/uuid-5d668c02-0f6c-cbcb-3206-b2e5a711979f.png new file mode 100644 index 0000000..3b08afd Binary files /dev/null and b/static/img/_paligo/uuid-5d668c02-0f6c-cbcb-3206-b2e5a711979f.png differ diff --git a/static/img/_paligo/uuid-5d9fd00b-0507-1ae7-80a2-b42a4377343e.png b/static/img/_paligo/uuid-5d9fd00b-0507-1ae7-80a2-b42a4377343e.png new file mode 100644 index 0000000..c644051 Binary files /dev/null and b/static/img/_paligo/uuid-5d9fd00b-0507-1ae7-80a2-b42a4377343e.png differ diff --git a/static/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg b/static/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg new file mode 100644 index 0000000..9fa0b2f --- /dev/null +++ b/static/img/_paligo/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/_paligo/uuid-5e41d5a0-b686-edc7-44a5-42c09bf1b12b.png b/static/img/_paligo/uuid-5e41d5a0-b686-edc7-44a5-42c09bf1b12b.png new file mode 100644 index 0000000..1416f43 Binary files /dev/null and b/static/img/_paligo/uuid-5e41d5a0-b686-edc7-44a5-42c09bf1b12b.png differ diff --git a/static/img/_paligo/uuid-5e4c921b-80ff-3392-c91f-22e7389ce5e3.png b/static/img/_paligo/uuid-5e4c921b-80ff-3392-c91f-22e7389ce5e3.png new file mode 100644 index 0000000..ea2db41 Binary files /dev/null and b/static/img/_paligo/uuid-5e4c921b-80ff-3392-c91f-22e7389ce5e3.png differ diff --git a/static/img/_paligo/uuid-5e506f8a-6c68-cbef-ee53-8e97df232093.png b/static/img/_paligo/uuid-5e506f8a-6c68-cbef-ee53-8e97df232093.png new file mode 100644 index 0000000..4312901 Binary files /dev/null and b/static/img/_paligo/uuid-5e506f8a-6c68-cbef-ee53-8e97df232093.png differ diff --git a/static/img/_paligo/uuid-5f7b1066-7b97-56e9-54c2-cd2094b7e2d5.png b/static/img/_paligo/uuid-5f7b1066-7b97-56e9-54c2-cd2094b7e2d5.png new file mode 100644 index 0000000..42df8bb Binary files /dev/null and b/static/img/_paligo/uuid-5f7b1066-7b97-56e9-54c2-cd2094b7e2d5.png differ diff --git a/static/img/_paligo/uuid-5fa460a4-aa40-627b-9ccd-d820ef1af5db.png b/static/img/_paligo/uuid-5fa460a4-aa40-627b-9ccd-d820ef1af5db.png new file mode 100644 index 0000000..88c6c5c Binary files /dev/null and b/static/img/_paligo/uuid-5fa460a4-aa40-627b-9ccd-d820ef1af5db.png differ diff --git a/static/img/_paligo/uuid-603588f5-3a76-1594-bd18-53063a966a21.png b/static/img/_paligo/uuid-603588f5-3a76-1594-bd18-53063a966a21.png new file mode 100644 index 0000000..1ae1273 Binary files /dev/null and b/static/img/_paligo/uuid-603588f5-3a76-1594-bd18-53063a966a21.png differ diff --git a/static/img/_paligo/uuid-605f48bd-0c0c-9003-4605-0b682c26dc57.png b/static/img/_paligo/uuid-605f48bd-0c0c-9003-4605-0b682c26dc57.png new file mode 100644 index 0000000..a1cd596 Binary files /dev/null and b/static/img/_paligo/uuid-605f48bd-0c0c-9003-4605-0b682c26dc57.png differ diff --git a/static/img/_paligo/uuid-60a84ba2-ab5d-e077-877b-a2be85014efc.png b/static/img/_paligo/uuid-60a84ba2-ab5d-e077-877b-a2be85014efc.png new file mode 100644 index 0000000..a2cb476 Binary files /dev/null and b/static/img/_paligo/uuid-60a84ba2-ab5d-e077-877b-a2be85014efc.png differ diff --git a/static/img/_paligo/uuid-60ec20cb-92a4-2e4d-c084-55988b170c60.png b/static/img/_paligo/uuid-60ec20cb-92a4-2e4d-c084-55988b170c60.png new file mode 100644 index 0000000..c00a1bf Binary files /dev/null and b/static/img/_paligo/uuid-60ec20cb-92a4-2e4d-c084-55988b170c60.png differ diff --git a/static/img/_paligo/uuid-6186a9bb-4a81-f79c-3200-1e65de613b47.png b/static/img/_paligo/uuid-6186a9bb-4a81-f79c-3200-1e65de613b47.png new file mode 100644 index 0000000..fc5ad25 Binary files /dev/null and b/static/img/_paligo/uuid-6186a9bb-4a81-f79c-3200-1e65de613b47.png differ diff --git a/static/img/_paligo/uuid-61cf9962-6cb6-6c24-74d4-132f9a1c066d.png b/static/img/_paligo/uuid-61cf9962-6cb6-6c24-74d4-132f9a1c066d.png new file mode 100644 index 0000000..7d5f39f Binary files /dev/null and b/static/img/_paligo/uuid-61cf9962-6cb6-6c24-74d4-132f9a1c066d.png differ diff --git a/static/img/_paligo/uuid-623c579f-869c-110a-da28-346d2a574ac0.png b/static/img/_paligo/uuid-623c579f-869c-110a-da28-346d2a574ac0.png new file mode 100644 index 0000000..f8b4978 Binary files /dev/null and b/static/img/_paligo/uuid-623c579f-869c-110a-da28-346d2a574ac0.png differ diff --git a/static/img/_paligo/uuid-624b318c-ddc6-58e7-4c58-e426c2f3db50.png b/static/img/_paligo/uuid-624b318c-ddc6-58e7-4c58-e426c2f3db50.png new file mode 100644 index 0000000..dfb9275 Binary files /dev/null and b/static/img/_paligo/uuid-624b318c-ddc6-58e7-4c58-e426c2f3db50.png differ diff --git a/static/img/_paligo/uuid-624fc88e-8389-faf0-8638-465d3a7978ee.png b/static/img/_paligo/uuid-624fc88e-8389-faf0-8638-465d3a7978ee.png new file mode 100644 index 0000000..6a77186 Binary files /dev/null and b/static/img/_paligo/uuid-624fc88e-8389-faf0-8638-465d3a7978ee.png differ diff --git a/static/img/_paligo/uuid-62976d61-b5fa-6258-5880-7f55090b5881.png b/static/img/_paligo/uuid-62976d61-b5fa-6258-5880-7f55090b5881.png new file mode 100644 index 0000000..581771b Binary files /dev/null and b/static/img/_paligo/uuid-62976d61-b5fa-6258-5880-7f55090b5881.png differ diff --git a/static/img/_paligo/uuid-634355b9-8f8d-e62c-1bd2-1a36cb7921b5.png b/static/img/_paligo/uuid-634355b9-8f8d-e62c-1bd2-1a36cb7921b5.png new file mode 100644 index 0000000..883a329 Binary files /dev/null and b/static/img/_paligo/uuid-634355b9-8f8d-e62c-1bd2-1a36cb7921b5.png differ diff --git a/static/img/_paligo/uuid-635b3416-2294-9063-b841-674935c2f4ab.jpg b/static/img/_paligo/uuid-635b3416-2294-9063-b841-674935c2f4ab.jpg new file mode 100644 index 0000000..0129e0f Binary files /dev/null and b/static/img/_paligo/uuid-635b3416-2294-9063-b841-674935c2f4ab.jpg differ diff --git a/static/img/_paligo/uuid-636d0224-45fb-307d-a1d5-69a7d8e84d9f.png b/static/img/_paligo/uuid-636d0224-45fb-307d-a1d5-69a7d8e84d9f.png new file mode 100644 index 0000000..644248e Binary files /dev/null and b/static/img/_paligo/uuid-636d0224-45fb-307d-a1d5-69a7d8e84d9f.png differ diff --git a/static/img/_paligo/uuid-639ad75f-9b32-7eb3-a08a-0f0a1c5035bf.png b/static/img/_paligo/uuid-639ad75f-9b32-7eb3-a08a-0f0a1c5035bf.png new file mode 100644 index 0000000..42da41a Binary files /dev/null and b/static/img/_paligo/uuid-639ad75f-9b32-7eb3-a08a-0f0a1c5035bf.png differ diff --git a/static/img/_paligo/uuid-63ec803d-7551-ebbb-ca47-b3915c746ea2.png b/static/img/_paligo/uuid-63ec803d-7551-ebbb-ca47-b3915c746ea2.png new file mode 100644 index 0000000..797b318 Binary files /dev/null and b/static/img/_paligo/uuid-63ec803d-7551-ebbb-ca47-b3915c746ea2.png differ diff --git a/static/img/_paligo/uuid-642c1745-3bb7-c296-bd5a-35a2368a3945.png b/static/img/_paligo/uuid-642c1745-3bb7-c296-bd5a-35a2368a3945.png new file mode 100644 index 0000000..2b80fdc Binary files /dev/null and b/static/img/_paligo/uuid-642c1745-3bb7-c296-bd5a-35a2368a3945.png differ diff --git a/static/img/_paligo/uuid-642e1898-479a-7590-b0ae-3d3a5cc6b9c7.png b/static/img/_paligo/uuid-642e1898-479a-7590-b0ae-3d3a5cc6b9c7.png new file mode 100644 index 0000000..5a608f6 Binary files /dev/null and b/static/img/_paligo/uuid-642e1898-479a-7590-b0ae-3d3a5cc6b9c7.png differ diff --git a/static/img/_paligo/uuid-6466da39-be6a-66e4-fc28-662201fbb0b2.png b/static/img/_paligo/uuid-6466da39-be6a-66e4-fc28-662201fbb0b2.png new file mode 100644 index 0000000..74aca9d Binary files /dev/null and b/static/img/_paligo/uuid-6466da39-be6a-66e4-fc28-662201fbb0b2.png differ diff --git a/static/img/_paligo/uuid-64d8fb90-4d9e-e19e-6a2c-754caca6b060.png b/static/img/_paligo/uuid-64d8fb90-4d9e-e19e-6a2c-754caca6b060.png new file mode 100644 index 0000000..ae738c5 Binary files /dev/null and b/static/img/_paligo/uuid-64d8fb90-4d9e-e19e-6a2c-754caca6b060.png differ diff --git a/static/img/_paligo/uuid-6507d4b6-e17c-fe9a-7fcf-286e99bf5447.png b/static/img/_paligo/uuid-6507d4b6-e17c-fe9a-7fcf-286e99bf5447.png new file mode 100644 index 0000000..6b4593d Binary files /dev/null and b/static/img/_paligo/uuid-6507d4b6-e17c-fe9a-7fcf-286e99bf5447.png differ diff --git a/static/img/_paligo/uuid-6519a945-1fd2-97fd-da4a-fdab48705503.png b/static/img/_paligo/uuid-6519a945-1fd2-97fd-da4a-fdab48705503.png new file mode 100644 index 0000000..4910c3f Binary files /dev/null and b/static/img/_paligo/uuid-6519a945-1fd2-97fd-da4a-fdab48705503.png differ diff --git a/static/img/_paligo/uuid-6556fa37-6a3c-7358-f031-137d1ca1d26c.jpg b/static/img/_paligo/uuid-6556fa37-6a3c-7358-f031-137d1ca1d26c.jpg new file mode 100644 index 0000000..2f24a5d Binary files /dev/null and b/static/img/_paligo/uuid-6556fa37-6a3c-7358-f031-137d1ca1d26c.jpg differ diff --git a/static/img/_paligo/uuid-6657cf32-779e-915b-aaea-453f88b28ec8.png b/static/img/_paligo/uuid-6657cf32-779e-915b-aaea-453f88b28ec8.png new file mode 100644 index 0000000..1bfb9c0 Binary files /dev/null and b/static/img/_paligo/uuid-6657cf32-779e-915b-aaea-453f88b28ec8.png differ diff --git a/static/img/_paligo/uuid-66a9dd86-282a-8695-d1c9-aa89bb61ef49.png b/static/img/_paligo/uuid-66a9dd86-282a-8695-d1c9-aa89bb61ef49.png new file mode 100644 index 0000000..5baf43e Binary files /dev/null and b/static/img/_paligo/uuid-66a9dd86-282a-8695-d1c9-aa89bb61ef49.png differ diff --git a/static/img/_paligo/uuid-676b848d-85db-ff48-883e-6ca489d799d3.png b/static/img/_paligo/uuid-676b848d-85db-ff48-883e-6ca489d799d3.png new file mode 100644 index 0000000..f2d7a68 Binary files /dev/null and b/static/img/_paligo/uuid-676b848d-85db-ff48-883e-6ca489d799d3.png differ diff --git a/static/img/_paligo/uuid-67f3a4f0-9315-bec3-0ea7-cca80d77b103.png b/static/img/_paligo/uuid-67f3a4f0-9315-bec3-0ea7-cca80d77b103.png new file mode 100644 index 0000000..0434eef Binary files /dev/null and b/static/img/_paligo/uuid-67f3a4f0-9315-bec3-0ea7-cca80d77b103.png differ diff --git a/static/img/_paligo/uuid-67fb8500-b869-116e-8e97-2b1427eec451.png b/static/img/_paligo/uuid-67fb8500-b869-116e-8e97-2b1427eec451.png new file mode 100644 index 0000000..0dd970e Binary files /dev/null and b/static/img/_paligo/uuid-67fb8500-b869-116e-8e97-2b1427eec451.png differ diff --git a/static/img/_paligo/uuid-681bee8c-6be9-b47f-06fa-72a587e7add7.jpg b/static/img/_paligo/uuid-681bee8c-6be9-b47f-06fa-72a587e7add7.jpg new file mode 100644 index 0000000..238651c Binary files /dev/null and b/static/img/_paligo/uuid-681bee8c-6be9-b47f-06fa-72a587e7add7.jpg differ diff --git a/static/img/_paligo/uuid-683647fc-3131-1c5a-8667-2fa719d617cd.png b/static/img/_paligo/uuid-683647fc-3131-1c5a-8667-2fa719d617cd.png new file mode 100644 index 0000000..dee58b8 Binary files /dev/null and b/static/img/_paligo/uuid-683647fc-3131-1c5a-8667-2fa719d617cd.png differ diff --git a/static/img/_paligo/uuid-68837c3f-707c-19aa-86e2-bbac732be5a5.png b/static/img/_paligo/uuid-68837c3f-707c-19aa-86e2-bbac732be5a5.png new file mode 100644 index 0000000..1bebbbc Binary files /dev/null and b/static/img/_paligo/uuid-68837c3f-707c-19aa-86e2-bbac732be5a5.png differ diff --git a/static/img/_paligo/uuid-68c17140-7ed7-eae8-4101-12d403bee8e4.png b/static/img/_paligo/uuid-68c17140-7ed7-eae8-4101-12d403bee8e4.png new file mode 100644 index 0000000..7844075 Binary files /dev/null and b/static/img/_paligo/uuid-68c17140-7ed7-eae8-4101-12d403bee8e4.png differ diff --git a/static/img/_paligo/uuid-68fb84b2-a10a-f7b9-f1e3-7ab0accbae3a.png b/static/img/_paligo/uuid-68fb84b2-a10a-f7b9-f1e3-7ab0accbae3a.png new file mode 100644 index 0000000..9278060 Binary files /dev/null and b/static/img/_paligo/uuid-68fb84b2-a10a-f7b9-f1e3-7ab0accbae3a.png differ diff --git a/static/img/_paligo/uuid-6986251f-485b-cef8-01b9-c6110f4e4e4f.png b/static/img/_paligo/uuid-6986251f-485b-cef8-01b9-c6110f4e4e4f.png new file mode 100644 index 0000000..c22525b Binary files /dev/null and b/static/img/_paligo/uuid-6986251f-485b-cef8-01b9-c6110f4e4e4f.png differ diff --git a/static/img/_paligo/uuid-69955083-387a-53a2-2da4-ba67c85ef5bb.png b/static/img/_paligo/uuid-69955083-387a-53a2-2da4-ba67c85ef5bb.png new file mode 100644 index 0000000..59350bb Binary files /dev/null and b/static/img/_paligo/uuid-69955083-387a-53a2-2da4-ba67c85ef5bb.png differ diff --git a/static/img/_paligo/uuid-69aa514f-9623-9dde-f80f-340c81d06044.png b/static/img/_paligo/uuid-69aa514f-9623-9dde-f80f-340c81d06044.png new file mode 100644 index 0000000..aba73e0 Binary files /dev/null and b/static/img/_paligo/uuid-69aa514f-9623-9dde-f80f-340c81d06044.png differ diff --git a/static/img/_paligo/uuid-69f86006-5ed4-0af7-716e-220d09da2165.png b/static/img/_paligo/uuid-69f86006-5ed4-0af7-716e-220d09da2165.png new file mode 100644 index 0000000..f9c4ae4 Binary files /dev/null and b/static/img/_paligo/uuid-69f86006-5ed4-0af7-716e-220d09da2165.png differ diff --git a/static/img/_paligo/uuid-6a389697-3c42-fd18-6bfb-c5c854e695d3.png b/static/img/_paligo/uuid-6a389697-3c42-fd18-6bfb-c5c854e695d3.png new file mode 100644 index 0000000..506cd06 Binary files /dev/null and b/static/img/_paligo/uuid-6a389697-3c42-fd18-6bfb-c5c854e695d3.png differ diff --git a/static/img/_paligo/uuid-6affd72d-61b9-8755-539a-5b26f62516a5.png b/static/img/_paligo/uuid-6affd72d-61b9-8755-539a-5b26f62516a5.png new file mode 100644 index 0000000..2b098fa Binary files /dev/null and b/static/img/_paligo/uuid-6affd72d-61b9-8755-539a-5b26f62516a5.png differ diff --git a/static/img/_paligo/uuid-6b2fbeca-bd57-7bfa-2ba6-7bb84f9036b4.png b/static/img/_paligo/uuid-6b2fbeca-bd57-7bfa-2ba6-7bb84f9036b4.png new file mode 100644 index 0000000..cceac2f Binary files /dev/null and b/static/img/_paligo/uuid-6b2fbeca-bd57-7bfa-2ba6-7bb84f9036b4.png differ diff --git a/static/img/_paligo/uuid-6b6e5440-9a6c-5fec-0970-63b75c992d1a.png b/static/img/_paligo/uuid-6b6e5440-9a6c-5fec-0970-63b75c992d1a.png new file mode 100644 index 0000000..ea019e4 Binary files /dev/null and b/static/img/_paligo/uuid-6b6e5440-9a6c-5fec-0970-63b75c992d1a.png differ diff --git a/static/img/_paligo/uuid-6b74d41d-4d91-adb5-0d73-17380c293ab9.jpg b/static/img/_paligo/uuid-6b74d41d-4d91-adb5-0d73-17380c293ab9.jpg new file mode 100644 index 0000000..d5a6fe8 Binary files /dev/null and b/static/img/_paligo/uuid-6b74d41d-4d91-adb5-0d73-17380c293ab9.jpg differ diff --git a/static/img/_paligo/uuid-6c73acd6-91b0-2cf7-80bb-b0ef7e8b6618.png b/static/img/_paligo/uuid-6c73acd6-91b0-2cf7-80bb-b0ef7e8b6618.png new file mode 100644 index 0000000..7e57e69 Binary files /dev/null and b/static/img/_paligo/uuid-6c73acd6-91b0-2cf7-80bb-b0ef7e8b6618.png differ diff --git a/static/img/_paligo/uuid-6ca09ed8-f6fb-b286-2327-e41d25cdf10a.png b/static/img/_paligo/uuid-6ca09ed8-f6fb-b286-2327-e41d25cdf10a.png new file mode 100644 index 0000000..5f6cf5c Binary files /dev/null and b/static/img/_paligo/uuid-6ca09ed8-f6fb-b286-2327-e41d25cdf10a.png differ diff --git a/static/img/_paligo/uuid-6cf46631-6ee5-1108-8957-9da55ebd564b.jpg b/static/img/_paligo/uuid-6cf46631-6ee5-1108-8957-9da55ebd564b.jpg new file mode 100644 index 0000000..400188f Binary files /dev/null and b/static/img/_paligo/uuid-6cf46631-6ee5-1108-8957-9da55ebd564b.jpg differ diff --git a/static/img/_paligo/uuid-6da7408c-facc-9a1a-b494-b9acdf47accb.png b/static/img/_paligo/uuid-6da7408c-facc-9a1a-b494-b9acdf47accb.png new file mode 100644 index 0000000..1662abf Binary files /dev/null and b/static/img/_paligo/uuid-6da7408c-facc-9a1a-b494-b9acdf47accb.png differ diff --git a/static/img/_paligo/uuid-6df6ae6a-869d-58a9-dbea-2fa93fba24e2.png b/static/img/_paligo/uuid-6df6ae6a-869d-58a9-dbea-2fa93fba24e2.png new file mode 100644 index 0000000..83dac16 Binary files /dev/null and b/static/img/_paligo/uuid-6df6ae6a-869d-58a9-dbea-2fa93fba24e2.png differ diff --git a/static/img/_paligo/uuid-6ebb926e-6275-81b7-fdb8-559128c87944.jpg b/static/img/_paligo/uuid-6ebb926e-6275-81b7-fdb8-559128c87944.jpg new file mode 100644 index 0000000..e0b7782 Binary files /dev/null and b/static/img/_paligo/uuid-6ebb926e-6275-81b7-fdb8-559128c87944.jpg differ diff --git a/static/img/_paligo/uuid-6f5bdb24-c8e6-3923-723f-07a33eae84bc.png b/static/img/_paligo/uuid-6f5bdb24-c8e6-3923-723f-07a33eae84bc.png new file mode 100644 index 0000000..1a5e866 Binary files /dev/null and b/static/img/_paligo/uuid-6f5bdb24-c8e6-3923-723f-07a33eae84bc.png differ diff --git a/static/img/_paligo/uuid-6fb2370d-7bd0-a531-147b-deeb7a89c996.png b/static/img/_paligo/uuid-6fb2370d-7bd0-a531-147b-deeb7a89c996.png new file mode 100644 index 0000000..83f7c3a Binary files /dev/null and b/static/img/_paligo/uuid-6fb2370d-7bd0-a531-147b-deeb7a89c996.png differ diff --git a/static/img/_paligo/uuid-70109545-5b55-93cb-dfa6-20a62c0cccdb.png b/static/img/_paligo/uuid-70109545-5b55-93cb-dfa6-20a62c0cccdb.png new file mode 100644 index 0000000..bf77e6c Binary files /dev/null and b/static/img/_paligo/uuid-70109545-5b55-93cb-dfa6-20a62c0cccdb.png differ diff --git a/static/img/_paligo/uuid-704db8ad-4a9b-ce01-8631-97ca9682edcc.png b/static/img/_paligo/uuid-704db8ad-4a9b-ce01-8631-97ca9682edcc.png new file mode 100644 index 0000000..93fbca4 Binary files /dev/null and b/static/img/_paligo/uuid-704db8ad-4a9b-ce01-8631-97ca9682edcc.png differ diff --git a/static/img/_paligo/uuid-71015c65-9c35-e1b8-e5fc-9bf9d1833731.png b/static/img/_paligo/uuid-71015c65-9c35-e1b8-e5fc-9bf9d1833731.png new file mode 100644 index 0000000..1919ec6 Binary files /dev/null and b/static/img/_paligo/uuid-71015c65-9c35-e1b8-e5fc-9bf9d1833731.png differ diff --git a/static/img/_paligo/uuid-71148b6a-fbf8-6a5f-5423-a5ac2817e866.png b/static/img/_paligo/uuid-71148b6a-fbf8-6a5f-5423-a5ac2817e866.png new file mode 100644 index 0000000..04bbd2a Binary files /dev/null and b/static/img/_paligo/uuid-71148b6a-fbf8-6a5f-5423-a5ac2817e866.png differ diff --git a/static/img/_paligo/uuid-71166a22-3341-0ee5-6599-6b190f83e717.png b/static/img/_paligo/uuid-71166a22-3341-0ee5-6599-6b190f83e717.png new file mode 100644 index 0000000..2b241c4 Binary files /dev/null and b/static/img/_paligo/uuid-71166a22-3341-0ee5-6599-6b190f83e717.png differ diff --git a/static/img/_paligo/uuid-712cfa80-b11d-3b99-d09a-158ea80f051b.png b/static/img/_paligo/uuid-712cfa80-b11d-3b99-d09a-158ea80f051b.png new file mode 100644 index 0000000..81443ce Binary files /dev/null and b/static/img/_paligo/uuid-712cfa80-b11d-3b99-d09a-158ea80f051b.png differ diff --git a/static/img/_paligo/uuid-71e4b862-efd1-ece7-3627-d970b41f2d43.png b/static/img/_paligo/uuid-71e4b862-efd1-ece7-3627-d970b41f2d43.png new file mode 100644 index 0000000..ff4b601 Binary files /dev/null and b/static/img/_paligo/uuid-71e4b862-efd1-ece7-3627-d970b41f2d43.png differ diff --git a/static/img/_paligo/uuid-7225cae0-64cd-a1cf-b878-270a054e58da.png b/static/img/_paligo/uuid-7225cae0-64cd-a1cf-b878-270a054e58da.png new file mode 100644 index 0000000..f6f332e Binary files /dev/null and b/static/img/_paligo/uuid-7225cae0-64cd-a1cf-b878-270a054e58da.png differ diff --git a/static/img/_paligo/uuid-722f22f9-7a85-48f3-69b6-78a16b9df4f0.png b/static/img/_paligo/uuid-722f22f9-7a85-48f3-69b6-78a16b9df4f0.png new file mode 100644 index 0000000..9b1c5a3 Binary files /dev/null and b/static/img/_paligo/uuid-722f22f9-7a85-48f3-69b6-78a16b9df4f0.png differ diff --git a/static/img/_paligo/uuid-7235d345-4190-c1be-6ee3-fc25e1eb183e.png b/static/img/_paligo/uuid-7235d345-4190-c1be-6ee3-fc25e1eb183e.png new file mode 100644 index 0000000..565d830 Binary files /dev/null and b/static/img/_paligo/uuid-7235d345-4190-c1be-6ee3-fc25e1eb183e.png differ diff --git a/static/img/_paligo/uuid-733ce0c0-f282-d8fc-a96e-6f3652aac049.png b/static/img/_paligo/uuid-733ce0c0-f282-d8fc-a96e-6f3652aac049.png new file mode 100644 index 0000000..e69d921 Binary files /dev/null and b/static/img/_paligo/uuid-733ce0c0-f282-d8fc-a96e-6f3652aac049.png differ diff --git a/static/img/_paligo/uuid-734ff7ef-99f2-2ad4-e962-6fb90c3f936a.png b/static/img/_paligo/uuid-734ff7ef-99f2-2ad4-e962-6fb90c3f936a.png new file mode 100644 index 0000000..7daf772 Binary files /dev/null and b/static/img/_paligo/uuid-734ff7ef-99f2-2ad4-e962-6fb90c3f936a.png differ diff --git a/static/img/_paligo/uuid-7389987f-3a26-24d3-6298-787eb51002e0.png b/static/img/_paligo/uuid-7389987f-3a26-24d3-6298-787eb51002e0.png new file mode 100644 index 0000000..17b5d06 Binary files /dev/null and b/static/img/_paligo/uuid-7389987f-3a26-24d3-6298-787eb51002e0.png differ diff --git a/static/img/_paligo/uuid-73afe848-4767-6771-43fb-4675ecc1a189.jpg b/static/img/_paligo/uuid-73afe848-4767-6771-43fb-4675ecc1a189.jpg new file mode 100644 index 0000000..a35da61 Binary files /dev/null and b/static/img/_paligo/uuid-73afe848-4767-6771-43fb-4675ecc1a189.jpg differ diff --git a/static/img/_paligo/uuid-73d46a9a-1191-00d2-578e-184d0bb3cb3d.png b/static/img/_paligo/uuid-73d46a9a-1191-00d2-578e-184d0bb3cb3d.png new file mode 100644 index 0000000..b6c1d6d Binary files /dev/null and b/static/img/_paligo/uuid-73d46a9a-1191-00d2-578e-184d0bb3cb3d.png differ diff --git a/static/img/_paligo/uuid-73f89e6b-1f74-1d1d-8947-e06b996648ba.png b/static/img/_paligo/uuid-73f89e6b-1f74-1d1d-8947-e06b996648ba.png new file mode 100644 index 0000000..2c9bc0a Binary files /dev/null and b/static/img/_paligo/uuid-73f89e6b-1f74-1d1d-8947-e06b996648ba.png differ diff --git a/static/img/_paligo/uuid-74153d13-4c04-d223-7389-268265192245.png b/static/img/_paligo/uuid-74153d13-4c04-d223-7389-268265192245.png new file mode 100644 index 0000000..07c5271 Binary files /dev/null and b/static/img/_paligo/uuid-74153d13-4c04-d223-7389-268265192245.png differ diff --git a/static/img/_paligo/uuid-74995bb5-af37-b70b-03e0-218fc8e978f7.png b/static/img/_paligo/uuid-74995bb5-af37-b70b-03e0-218fc8e978f7.png new file mode 100644 index 0000000..9b2d2e4 Binary files /dev/null and b/static/img/_paligo/uuid-74995bb5-af37-b70b-03e0-218fc8e978f7.png differ diff --git a/static/img/_paligo/uuid-74f65dc6-6662-db11-e97a-9ba3d039cea9.jpg b/static/img/_paligo/uuid-74f65dc6-6662-db11-e97a-9ba3d039cea9.jpg new file mode 100644 index 0000000..21ced7e Binary files /dev/null and b/static/img/_paligo/uuid-74f65dc6-6662-db11-e97a-9ba3d039cea9.jpg differ diff --git a/static/img/_paligo/uuid-76fec79f-6b16-d420-3d74-53967ecf4d31.png b/static/img/_paligo/uuid-76fec79f-6b16-d420-3d74-53967ecf4d31.png new file mode 100644 index 0000000..3e1d29d Binary files /dev/null and b/static/img/_paligo/uuid-76fec79f-6b16-d420-3d74-53967ecf4d31.png differ diff --git a/static/img/_paligo/uuid-774a69fb-d5b9-333d-f373-eab6cab793cb.png b/static/img/_paligo/uuid-774a69fb-d5b9-333d-f373-eab6cab793cb.png new file mode 100644 index 0000000..28035fa Binary files /dev/null and b/static/img/_paligo/uuid-774a69fb-d5b9-333d-f373-eab6cab793cb.png differ diff --git a/static/img/_paligo/uuid-77517798-21b7-dd6d-6df8-5fdf12758e59.png b/static/img/_paligo/uuid-77517798-21b7-dd6d-6df8-5fdf12758e59.png new file mode 100644 index 0000000..a5e43ce Binary files /dev/null and b/static/img/_paligo/uuid-77517798-21b7-dd6d-6df8-5fdf12758e59.png differ diff --git a/static/img/_paligo/uuid-7755ec1f-eb8f-5036-05b3-be1b330f2143.png b/static/img/_paligo/uuid-7755ec1f-eb8f-5036-05b3-be1b330f2143.png new file mode 100644 index 0000000..35b3516 Binary files /dev/null and b/static/img/_paligo/uuid-7755ec1f-eb8f-5036-05b3-be1b330f2143.png differ diff --git a/static/img/_paligo/uuid-77ae83b9-c3d4-60a7-9997-ad0a27832d58.png b/static/img/_paligo/uuid-77ae83b9-c3d4-60a7-9997-ad0a27832d58.png new file mode 100644 index 0000000..a2270f9 Binary files /dev/null and b/static/img/_paligo/uuid-77ae83b9-c3d4-60a7-9997-ad0a27832d58.png differ diff --git a/static/img/_paligo/uuid-78124fdc-5f54-e675-590c-e3b54a083649.svg b/static/img/_paligo/uuid-78124fdc-5f54-e675-590c-e3b54a083649.svg new file mode 100644 index 0000000..7370500 --- /dev/null +++ b/static/img/_paligo/uuid-78124fdc-5f54-e675-590c-e3b54a083649.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/_paligo/uuid-789ed335-aeab-b87c-6045-270c5e87a641.png b/static/img/_paligo/uuid-789ed335-aeab-b87c-6045-270c5e87a641.png new file mode 100644 index 0000000..aa8196f Binary files /dev/null and b/static/img/_paligo/uuid-789ed335-aeab-b87c-6045-270c5e87a641.png differ diff --git a/static/img/_paligo/uuid-78feab6d-8731-8d33-b453-bbf6b14a781c.png b/static/img/_paligo/uuid-78feab6d-8731-8d33-b453-bbf6b14a781c.png new file mode 100644 index 0000000..9b6b2ab Binary files /dev/null and b/static/img/_paligo/uuid-78feab6d-8731-8d33-b453-bbf6b14a781c.png differ diff --git a/static/img/_paligo/uuid-7902ae23-26f7-bcf3-ffee-11dd4e08a183.png b/static/img/_paligo/uuid-7902ae23-26f7-bcf3-ffee-11dd4e08a183.png new file mode 100644 index 0000000..f68f179 Binary files /dev/null and b/static/img/_paligo/uuid-7902ae23-26f7-bcf3-ffee-11dd4e08a183.png differ diff --git a/static/img/_paligo/uuid-794fef65-3c3b-12e1-e60f-f01f02802b37.png b/static/img/_paligo/uuid-794fef65-3c3b-12e1-e60f-f01f02802b37.png new file mode 100644 index 0000000..892badb Binary files /dev/null and b/static/img/_paligo/uuid-794fef65-3c3b-12e1-e60f-f01f02802b37.png differ diff --git a/static/img/_paligo/uuid-79a85107-1f7e-60a6-6934-cbec5be94c28.png b/static/img/_paligo/uuid-79a85107-1f7e-60a6-6934-cbec5be94c28.png new file mode 100644 index 0000000..f55b5c6 Binary files /dev/null and b/static/img/_paligo/uuid-79a85107-1f7e-60a6-6934-cbec5be94c28.png differ diff --git a/static/img/_paligo/uuid-7a681d2b-732b-b061-0eb1-ecd158c0a9b9.png b/static/img/_paligo/uuid-7a681d2b-732b-b061-0eb1-ecd158c0a9b9.png new file mode 100644 index 0000000..8cb2c4d Binary files /dev/null and b/static/img/_paligo/uuid-7a681d2b-732b-b061-0eb1-ecd158c0a9b9.png differ diff --git a/static/img/_paligo/uuid-7b4d08a4-23ee-c089-5e7a-a8f2ea99abda.png b/static/img/_paligo/uuid-7b4d08a4-23ee-c089-5e7a-a8f2ea99abda.png new file mode 100644 index 0000000..af0d308 Binary files /dev/null and b/static/img/_paligo/uuid-7b4d08a4-23ee-c089-5e7a-a8f2ea99abda.png differ diff --git a/static/img/_paligo/uuid-7b6b432c-fb4f-61cd-a7cf-db6fd7cbe746.png b/static/img/_paligo/uuid-7b6b432c-fb4f-61cd-a7cf-db6fd7cbe746.png new file mode 100644 index 0000000..cedabbe Binary files /dev/null and b/static/img/_paligo/uuid-7b6b432c-fb4f-61cd-a7cf-db6fd7cbe746.png differ diff --git a/static/img/_paligo/uuid-7bb467f5-6ccc-d11e-73f9-f54d550668a8.png b/static/img/_paligo/uuid-7bb467f5-6ccc-d11e-73f9-f54d550668a8.png new file mode 100644 index 0000000..86616dc Binary files /dev/null and b/static/img/_paligo/uuid-7bb467f5-6ccc-d11e-73f9-f54d550668a8.png differ diff --git a/static/img/_paligo/uuid-7bf083ec-108e-2c84-cb3e-b47a85b69a48.png b/static/img/_paligo/uuid-7bf083ec-108e-2c84-cb3e-b47a85b69a48.png new file mode 100644 index 0000000..2bf09c5 Binary files /dev/null and b/static/img/_paligo/uuid-7bf083ec-108e-2c84-cb3e-b47a85b69a48.png differ diff --git a/static/img/_paligo/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png b/static/img/_paligo/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png new file mode 100644 index 0000000..343c728 Binary files /dev/null and b/static/img/_paligo/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png differ diff --git a/static/img/_paligo/uuid-7c7f36d3-3226-2a6c-3549-cd3321895ef1.png b/static/img/_paligo/uuid-7c7f36d3-3226-2a6c-3549-cd3321895ef1.png new file mode 100644 index 0000000..9566085 Binary files /dev/null and b/static/img/_paligo/uuid-7c7f36d3-3226-2a6c-3549-cd3321895ef1.png differ diff --git a/static/img/_paligo/uuid-7d34c319-a1a2-05a1-90b0-ded10c048482.png b/static/img/_paligo/uuid-7d34c319-a1a2-05a1-90b0-ded10c048482.png new file mode 100644 index 0000000..8f10f4c Binary files /dev/null and b/static/img/_paligo/uuid-7d34c319-a1a2-05a1-90b0-ded10c048482.png differ diff --git a/static/img/_paligo/uuid-7d6dc7a5-d2ad-0a24-e940-6ce654e08db4.png b/static/img/_paligo/uuid-7d6dc7a5-d2ad-0a24-e940-6ce654e08db4.png new file mode 100644 index 0000000..2fc5e7c Binary files /dev/null and b/static/img/_paligo/uuid-7d6dc7a5-d2ad-0a24-e940-6ce654e08db4.png differ diff --git a/static/img/_paligo/uuid-7d85c0ea-4806-d797-750e-ef3b092eb2db.png b/static/img/_paligo/uuid-7d85c0ea-4806-d797-750e-ef3b092eb2db.png new file mode 100644 index 0000000..80a1874 Binary files /dev/null and b/static/img/_paligo/uuid-7d85c0ea-4806-d797-750e-ef3b092eb2db.png differ diff --git a/static/img/_paligo/uuid-7dc1ff71-7abf-8c37-8117-a2f7abb13861.png b/static/img/_paligo/uuid-7dc1ff71-7abf-8c37-8117-a2f7abb13861.png new file mode 100644 index 0000000..33e6e17 Binary files /dev/null and b/static/img/_paligo/uuid-7dc1ff71-7abf-8c37-8117-a2f7abb13861.png differ diff --git a/static/img/_paligo/uuid-7e1fea02-d6ed-650a-043c-d8bb81c5f98e.png b/static/img/_paligo/uuid-7e1fea02-d6ed-650a-043c-d8bb81c5f98e.png new file mode 100644 index 0000000..2d7fff9 Binary files /dev/null and b/static/img/_paligo/uuid-7e1fea02-d6ed-650a-043c-d8bb81c5f98e.png differ diff --git a/static/img/_paligo/uuid-7e451b81-22e3-0f16-af91-380ad8026de1.jpg b/static/img/_paligo/uuid-7e451b81-22e3-0f16-af91-380ad8026de1.jpg new file mode 100644 index 0000000..92ac4ce Binary files /dev/null and b/static/img/_paligo/uuid-7e451b81-22e3-0f16-af91-380ad8026de1.jpg differ diff --git a/static/img/_paligo/uuid-7fb72644-6457-f137-c769-10345e5cb120.png b/static/img/_paligo/uuid-7fb72644-6457-f137-c769-10345e5cb120.png new file mode 100644 index 0000000..ee1657d Binary files /dev/null and b/static/img/_paligo/uuid-7fb72644-6457-f137-c769-10345e5cb120.png differ diff --git a/static/img/_paligo/uuid-8051df2c-f4c0-70ff-b957-0f15c737b323.png b/static/img/_paligo/uuid-8051df2c-f4c0-70ff-b957-0f15c737b323.png new file mode 100644 index 0000000..d8ef97b Binary files /dev/null and b/static/img/_paligo/uuid-8051df2c-f4c0-70ff-b957-0f15c737b323.png differ diff --git a/static/img/_paligo/uuid-80961ec0-a95b-8cce-6af1-263d07fcc5a4.png b/static/img/_paligo/uuid-80961ec0-a95b-8cce-6af1-263d07fcc5a4.png new file mode 100644 index 0000000..0b3670d Binary files /dev/null and b/static/img/_paligo/uuid-80961ec0-a95b-8cce-6af1-263d07fcc5a4.png differ diff --git a/static/img/_paligo/uuid-80fbbf58-d67b-34af-96aa-4b5124ef844e.png b/static/img/_paligo/uuid-80fbbf58-d67b-34af-96aa-4b5124ef844e.png new file mode 100644 index 0000000..78a8dd9 Binary files /dev/null and b/static/img/_paligo/uuid-80fbbf58-d67b-34af-96aa-4b5124ef844e.png differ diff --git a/static/img/_paligo/uuid-811a202d-1f3a-d7eb-932f-555b5eeed51e.png b/static/img/_paligo/uuid-811a202d-1f3a-d7eb-932f-555b5eeed51e.png new file mode 100644 index 0000000..22472d5 Binary files /dev/null and b/static/img/_paligo/uuid-811a202d-1f3a-d7eb-932f-555b5eeed51e.png differ diff --git a/static/img/_paligo/uuid-81638e95-5198-7da7-ecb8-f2d9835f64be.jpg b/static/img/_paligo/uuid-81638e95-5198-7da7-ecb8-f2d9835f64be.jpg new file mode 100644 index 0000000..6742ce5 Binary files /dev/null and b/static/img/_paligo/uuid-81638e95-5198-7da7-ecb8-f2d9835f64be.jpg differ diff --git a/static/img/_paligo/uuid-81bb90b8-85ea-ae9e-7349-3783f7af230e.png b/static/img/_paligo/uuid-81bb90b8-85ea-ae9e-7349-3783f7af230e.png new file mode 100644 index 0000000..477f472 Binary files /dev/null and b/static/img/_paligo/uuid-81bb90b8-85ea-ae9e-7349-3783f7af230e.png differ diff --git a/static/img/_paligo/uuid-820b4fbc-df87-77b2-04c1-8f688d9f6433.png b/static/img/_paligo/uuid-820b4fbc-df87-77b2-04c1-8f688d9f6433.png new file mode 100644 index 0000000..e8d4bf6 Binary files /dev/null and b/static/img/_paligo/uuid-820b4fbc-df87-77b2-04c1-8f688d9f6433.png differ diff --git a/static/img/_paligo/uuid-82197654-17c3-6b98-320e-cf408f16c8c9.png b/static/img/_paligo/uuid-82197654-17c3-6b98-320e-cf408f16c8c9.png new file mode 100644 index 0000000..f562aa5 Binary files /dev/null and b/static/img/_paligo/uuid-82197654-17c3-6b98-320e-cf408f16c8c9.png differ diff --git a/static/img/_paligo/uuid-821c4edf-e9a6-a85e-a6e5-8cce61ab5f42.png b/static/img/_paligo/uuid-821c4edf-e9a6-a85e-a6e5-8cce61ab5f42.png new file mode 100644 index 0000000..757fefd Binary files /dev/null and b/static/img/_paligo/uuid-821c4edf-e9a6-a85e-a6e5-8cce61ab5f42.png differ diff --git a/static/img/_paligo/uuid-822f879a-7f22-981d-d28f-55c91311b281.png b/static/img/_paligo/uuid-822f879a-7f22-981d-d28f-55c91311b281.png new file mode 100644 index 0000000..99c4368 Binary files /dev/null and b/static/img/_paligo/uuid-822f879a-7f22-981d-d28f-55c91311b281.png differ diff --git a/static/img/_paligo/uuid-823c9a6f-187a-6778-36eb-130492487193.png b/static/img/_paligo/uuid-823c9a6f-187a-6778-36eb-130492487193.png new file mode 100644 index 0000000..06af380 Binary files /dev/null and b/static/img/_paligo/uuid-823c9a6f-187a-6778-36eb-130492487193.png differ diff --git a/static/img/_paligo/uuid-841839d9-140d-afa4-254a-5587922a594b.png b/static/img/_paligo/uuid-841839d9-140d-afa4-254a-5587922a594b.png new file mode 100644 index 0000000..e27eb24 Binary files /dev/null and b/static/img/_paligo/uuid-841839d9-140d-afa4-254a-5587922a594b.png differ diff --git a/static/img/_paligo/uuid-84805be3-7557-14df-e78e-44edaea87777.png b/static/img/_paligo/uuid-84805be3-7557-14df-e78e-44edaea87777.png new file mode 100644 index 0000000..2b026ab Binary files /dev/null and b/static/img/_paligo/uuid-84805be3-7557-14df-e78e-44edaea87777.png differ diff --git a/static/img/_paligo/uuid-84db9e9c-38a7-4d55-1911-7671964db062.png b/static/img/_paligo/uuid-84db9e9c-38a7-4d55-1911-7671964db062.png new file mode 100644 index 0000000..3848099 Binary files /dev/null and b/static/img/_paligo/uuid-84db9e9c-38a7-4d55-1911-7671964db062.png differ diff --git a/static/img/_paligo/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png b/static/img/_paligo/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png new file mode 100644 index 0000000..ee753d7 Binary files /dev/null and b/static/img/_paligo/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png differ diff --git a/static/img/_paligo/uuid-85ec7e12-6811-a14d-5388-d5502f87fc22.png b/static/img/_paligo/uuid-85ec7e12-6811-a14d-5388-d5502f87fc22.png new file mode 100644 index 0000000..bd19f94 Binary files /dev/null and b/static/img/_paligo/uuid-85ec7e12-6811-a14d-5388-d5502f87fc22.png differ diff --git a/static/img/_paligo/uuid-86871cee-ac96-75d5-d63b-bc5daa5b56c2.png b/static/img/_paligo/uuid-86871cee-ac96-75d5-d63b-bc5daa5b56c2.png new file mode 100644 index 0000000..efe498c Binary files /dev/null and b/static/img/_paligo/uuid-86871cee-ac96-75d5-d63b-bc5daa5b56c2.png differ diff --git a/static/img/_paligo/uuid-86def2f6-adbf-52b0-1bf9-dbe7ca05c08f.png b/static/img/_paligo/uuid-86def2f6-adbf-52b0-1bf9-dbe7ca05c08f.png new file mode 100644 index 0000000..cd35798 Binary files /dev/null and b/static/img/_paligo/uuid-86def2f6-adbf-52b0-1bf9-dbe7ca05c08f.png differ diff --git a/static/img/_paligo/uuid-86e5dd1c-f147-0a08-49bb-da4f53b9a960.png b/static/img/_paligo/uuid-86e5dd1c-f147-0a08-49bb-da4f53b9a960.png new file mode 100644 index 0000000..127317a Binary files /dev/null and b/static/img/_paligo/uuid-86e5dd1c-f147-0a08-49bb-da4f53b9a960.png differ diff --git a/static/img/_paligo/uuid-87908768-bac5-5e86-6412-826381a0b8a4.png b/static/img/_paligo/uuid-87908768-bac5-5e86-6412-826381a0b8a4.png new file mode 100644 index 0000000..1f7ebd7 Binary files /dev/null and b/static/img/_paligo/uuid-87908768-bac5-5e86-6412-826381a0b8a4.png differ diff --git a/static/img/_paligo/uuid-87a6ec99-9380-826b-9176-13034fefa22a.png b/static/img/_paligo/uuid-87a6ec99-9380-826b-9176-13034fefa22a.png new file mode 100644 index 0000000..8a56833 Binary files /dev/null and b/static/img/_paligo/uuid-87a6ec99-9380-826b-9176-13034fefa22a.png differ diff --git a/static/img/_paligo/uuid-8821de29-e79d-0932-c3dd-f5deea8eba32.png b/static/img/_paligo/uuid-8821de29-e79d-0932-c3dd-f5deea8eba32.png new file mode 100644 index 0000000..dcaedf1 Binary files /dev/null and b/static/img/_paligo/uuid-8821de29-e79d-0932-c3dd-f5deea8eba32.png differ diff --git a/static/img/_paligo/uuid-88a3d6bf-be6f-1811-a908-9072b4b88a9a.png b/static/img/_paligo/uuid-88a3d6bf-be6f-1811-a908-9072b4b88a9a.png new file mode 100644 index 0000000..cabfc4b Binary files /dev/null and b/static/img/_paligo/uuid-88a3d6bf-be6f-1811-a908-9072b4b88a9a.png differ diff --git a/static/img/_paligo/uuid-8a1664ba-48bd-f04b-5453-60cd9641e2ca.png b/static/img/_paligo/uuid-8a1664ba-48bd-f04b-5453-60cd9641e2ca.png new file mode 100644 index 0000000..bf8fdba Binary files /dev/null and b/static/img/_paligo/uuid-8a1664ba-48bd-f04b-5453-60cd9641e2ca.png differ diff --git a/static/img/_paligo/uuid-8b24a99b-a80b-f23a-7708-af1136ffbedb.jpg b/static/img/_paligo/uuid-8b24a99b-a80b-f23a-7708-af1136ffbedb.jpg new file mode 100644 index 0000000..50e8198 Binary files /dev/null and b/static/img/_paligo/uuid-8b24a99b-a80b-f23a-7708-af1136ffbedb.jpg differ diff --git a/static/img/_paligo/uuid-8b262205-594a-d6ae-9985-3c47a3df5175.png b/static/img/_paligo/uuid-8b262205-594a-d6ae-9985-3c47a3df5175.png new file mode 100644 index 0000000..26fc971 Binary files /dev/null and b/static/img/_paligo/uuid-8b262205-594a-d6ae-9985-3c47a3df5175.png differ diff --git a/static/img/_paligo/uuid-8b6d8a17-8028-3064-a48d-9a43b0328391.png b/static/img/_paligo/uuid-8b6d8a17-8028-3064-a48d-9a43b0328391.png new file mode 100644 index 0000000..821870a Binary files /dev/null and b/static/img/_paligo/uuid-8b6d8a17-8028-3064-a48d-9a43b0328391.png differ diff --git a/static/img/_paligo/uuid-8ca5abc9-91d0-2f49-c804-dd8b60f92c39.png b/static/img/_paligo/uuid-8ca5abc9-91d0-2f49-c804-dd8b60f92c39.png new file mode 100644 index 0000000..a78e3b9 Binary files /dev/null and b/static/img/_paligo/uuid-8ca5abc9-91d0-2f49-c804-dd8b60f92c39.png differ diff --git a/static/img/_paligo/uuid-8dad9adf-f9a7-fe6b-e598-972b45ecca27.png b/static/img/_paligo/uuid-8dad9adf-f9a7-fe6b-e598-972b45ecca27.png new file mode 100644 index 0000000..d16fe30 Binary files /dev/null and b/static/img/_paligo/uuid-8dad9adf-f9a7-fe6b-e598-972b45ecca27.png differ diff --git a/static/img/_paligo/uuid-8e971849-b560-9393-f308-ed2587195b2c.png b/static/img/_paligo/uuid-8e971849-b560-9393-f308-ed2587195b2c.png new file mode 100644 index 0000000..86c0a35 Binary files /dev/null and b/static/img/_paligo/uuid-8e971849-b560-9393-f308-ed2587195b2c.png differ diff --git a/static/img/_paligo/uuid-8f7bf7cb-1d82-dacf-ecc0-b3e98438c118.png b/static/img/_paligo/uuid-8f7bf7cb-1d82-dacf-ecc0-b3e98438c118.png new file mode 100644 index 0000000..314292e Binary files /dev/null and b/static/img/_paligo/uuid-8f7bf7cb-1d82-dacf-ecc0-b3e98438c118.png differ diff --git a/static/img/_paligo/uuid-8fc9a70b-c1a9-6ce2-4369-8701e891f0d5.png b/static/img/_paligo/uuid-8fc9a70b-c1a9-6ce2-4369-8701e891f0d5.png new file mode 100644 index 0000000..7295e12 Binary files /dev/null and b/static/img/_paligo/uuid-8fc9a70b-c1a9-6ce2-4369-8701e891f0d5.png differ diff --git a/static/img/_paligo/uuid-904a51d4-081b-8a05-0b56-3522007e3a46.jpg b/static/img/_paligo/uuid-904a51d4-081b-8a05-0b56-3522007e3a46.jpg new file mode 100644 index 0000000..5b9712f Binary files /dev/null and b/static/img/_paligo/uuid-904a51d4-081b-8a05-0b56-3522007e3a46.jpg differ diff --git a/static/img/_paligo/uuid-9073242e-afd9-262e-25cf-395ab1881ea6.png b/static/img/_paligo/uuid-9073242e-afd9-262e-25cf-395ab1881ea6.png new file mode 100644 index 0000000..c2f4123 Binary files /dev/null and b/static/img/_paligo/uuid-9073242e-afd9-262e-25cf-395ab1881ea6.png differ diff --git a/static/img/_paligo/uuid-909bb98f-3195-8726-8b09-a60a33209ccb.png b/static/img/_paligo/uuid-909bb98f-3195-8726-8b09-a60a33209ccb.png new file mode 100644 index 0000000..3f9ecae Binary files /dev/null and b/static/img/_paligo/uuid-909bb98f-3195-8726-8b09-a60a33209ccb.png differ diff --git a/static/img/_paligo/uuid-90d0f8f9-8de5-2c9c-f8e7-2279dc5d48ef.png b/static/img/_paligo/uuid-90d0f8f9-8de5-2c9c-f8e7-2279dc5d48ef.png new file mode 100644 index 0000000..ceb41ef Binary files /dev/null and b/static/img/_paligo/uuid-90d0f8f9-8de5-2c9c-f8e7-2279dc5d48ef.png differ diff --git a/static/img/_paligo/uuid-913fb5c6-4636-158b-0e87-8458323e0987.png b/static/img/_paligo/uuid-913fb5c6-4636-158b-0e87-8458323e0987.png new file mode 100644 index 0000000..b275fbb Binary files /dev/null and b/static/img/_paligo/uuid-913fb5c6-4636-158b-0e87-8458323e0987.png differ diff --git a/static/img/_paligo/uuid-917bf276-d9f8-706a-9bb8-6b9e4d1bba39.png b/static/img/_paligo/uuid-917bf276-d9f8-706a-9bb8-6b9e4d1bba39.png new file mode 100644 index 0000000..87951b6 Binary files /dev/null and b/static/img/_paligo/uuid-917bf276-d9f8-706a-9bb8-6b9e4d1bba39.png differ diff --git a/static/img/_paligo/uuid-918b42a8-4b92-3f05-5514-1b137c85e283.png b/static/img/_paligo/uuid-918b42a8-4b92-3f05-5514-1b137c85e283.png new file mode 100644 index 0000000..ea467bd Binary files /dev/null and b/static/img/_paligo/uuid-918b42a8-4b92-3f05-5514-1b137c85e283.png differ diff --git a/static/img/_paligo/uuid-91fa95b8-0325-7201-68ee-ddb01087718a.png b/static/img/_paligo/uuid-91fa95b8-0325-7201-68ee-ddb01087718a.png new file mode 100644 index 0000000..6fddf5d Binary files /dev/null and b/static/img/_paligo/uuid-91fa95b8-0325-7201-68ee-ddb01087718a.png differ diff --git a/static/img/_paligo/uuid-92405804-e42c-f788-4026-7339492f1113.png b/static/img/_paligo/uuid-92405804-e42c-f788-4026-7339492f1113.png new file mode 100644 index 0000000..e132eef Binary files /dev/null and b/static/img/_paligo/uuid-92405804-e42c-f788-4026-7339492f1113.png differ diff --git a/static/img/_paligo/uuid-941f46db-0d8e-cfd4-0f29-7e89b30471a1.png b/static/img/_paligo/uuid-941f46db-0d8e-cfd4-0f29-7e89b30471a1.png new file mode 100644 index 0000000..ef8322a Binary files /dev/null and b/static/img/_paligo/uuid-941f46db-0d8e-cfd4-0f29-7e89b30471a1.png differ diff --git a/static/img/_paligo/uuid-949123a0-1356-b913-0a17-cd7270ba78c3.png b/static/img/_paligo/uuid-949123a0-1356-b913-0a17-cd7270ba78c3.png new file mode 100644 index 0000000..861acca Binary files /dev/null and b/static/img/_paligo/uuid-949123a0-1356-b913-0a17-cd7270ba78c3.png differ diff --git a/static/img/_paligo/uuid-94e2570d-ce4b-720a-db91-52b46de0a96a.png b/static/img/_paligo/uuid-94e2570d-ce4b-720a-db91-52b46de0a96a.png new file mode 100644 index 0000000..973cf3a Binary files /dev/null and b/static/img/_paligo/uuid-94e2570d-ce4b-720a-db91-52b46de0a96a.png differ diff --git a/static/img/_paligo/uuid-9502548e-c9ec-985e-7224-7e06aa0dfbda.png b/static/img/_paligo/uuid-9502548e-c9ec-985e-7224-7e06aa0dfbda.png new file mode 100644 index 0000000..64c8314 Binary files /dev/null and b/static/img/_paligo/uuid-9502548e-c9ec-985e-7224-7e06aa0dfbda.png differ diff --git a/static/img/_paligo/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png b/static/img/_paligo/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png new file mode 100644 index 0000000..b5a807a Binary files /dev/null and b/static/img/_paligo/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png differ diff --git a/static/img/_paligo/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png b/static/img/_paligo/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png new file mode 100644 index 0000000..54bbe08 Binary files /dev/null and b/static/img/_paligo/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png differ diff --git a/static/img/_paligo/uuid-954473da-632b-0628-2a76-9ff4471fcc9d.jpg b/static/img/_paligo/uuid-954473da-632b-0628-2a76-9ff4471fcc9d.jpg new file mode 100644 index 0000000..5137176 Binary files /dev/null and b/static/img/_paligo/uuid-954473da-632b-0628-2a76-9ff4471fcc9d.jpg differ diff --git a/static/img/_paligo/uuid-9547e14a-19b8-4d74-9d5a-6558fdc1f8ea.png b/static/img/_paligo/uuid-9547e14a-19b8-4d74-9d5a-6558fdc1f8ea.png new file mode 100644 index 0000000..580bb1c Binary files /dev/null and b/static/img/_paligo/uuid-9547e14a-19b8-4d74-9d5a-6558fdc1f8ea.png differ diff --git a/static/img/_paligo/uuid-955d7e00-c03b-fa26-f239-dcf2f2b2708a.png b/static/img/_paligo/uuid-955d7e00-c03b-fa26-f239-dcf2f2b2708a.png new file mode 100644 index 0000000..1a40685 Binary files /dev/null and b/static/img/_paligo/uuid-955d7e00-c03b-fa26-f239-dcf2f2b2708a.png differ diff --git a/static/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png b/static/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png new file mode 100644 index 0000000..fb0778e Binary files /dev/null and b/static/img/_paligo/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png differ diff --git a/static/img/_paligo/uuid-95e5fcc6-46bd-1efe-69a0-538ef9c8c8cb.png b/static/img/_paligo/uuid-95e5fcc6-46bd-1efe-69a0-538ef9c8c8cb.png new file mode 100644 index 0000000..4f23f11 Binary files /dev/null and b/static/img/_paligo/uuid-95e5fcc6-46bd-1efe-69a0-538ef9c8c8cb.png differ diff --git a/static/img/_paligo/uuid-95fcc51e-94c6-ec28-5d06-5578439cf173.png b/static/img/_paligo/uuid-95fcc51e-94c6-ec28-5d06-5578439cf173.png new file mode 100644 index 0000000..061f59e Binary files /dev/null and b/static/img/_paligo/uuid-95fcc51e-94c6-ec28-5d06-5578439cf173.png differ diff --git a/static/img/_paligo/uuid-96dabdf1-1006-5bdc-4457-92dfb91b8c70.png b/static/img/_paligo/uuid-96dabdf1-1006-5bdc-4457-92dfb91b8c70.png new file mode 100644 index 0000000..26eb770 Binary files /dev/null and b/static/img/_paligo/uuid-96dabdf1-1006-5bdc-4457-92dfb91b8c70.png differ diff --git a/static/img/_paligo/uuid-97037eee-6e35-4a1f-1e4e-a252c78b2317.jpg b/static/img/_paligo/uuid-97037eee-6e35-4a1f-1e4e-a252c78b2317.jpg new file mode 100644 index 0000000..02ae58c Binary files /dev/null and b/static/img/_paligo/uuid-97037eee-6e35-4a1f-1e4e-a252c78b2317.jpg differ diff --git a/static/img/_paligo/uuid-974582cb-d9c3-a954-0909-c78a76915d55.png b/static/img/_paligo/uuid-974582cb-d9c3-a954-0909-c78a76915d55.png new file mode 100644 index 0000000..784da2f Binary files /dev/null and b/static/img/_paligo/uuid-974582cb-d9c3-a954-0909-c78a76915d55.png differ diff --git a/static/img/_paligo/uuid-974f5427-db6a-201d-a112-9bb8fee4ae7f.jpg b/static/img/_paligo/uuid-974f5427-db6a-201d-a112-9bb8fee4ae7f.jpg new file mode 100644 index 0000000..f6b1249 Binary files /dev/null and b/static/img/_paligo/uuid-974f5427-db6a-201d-a112-9bb8fee4ae7f.jpg differ diff --git a/static/img/_paligo/uuid-97ca8e78-eae6-ff2b-f6b5-523718161a8e.jpg b/static/img/_paligo/uuid-97ca8e78-eae6-ff2b-f6b5-523718161a8e.jpg new file mode 100644 index 0000000..7d1313c Binary files /dev/null and b/static/img/_paligo/uuid-97ca8e78-eae6-ff2b-f6b5-523718161a8e.jpg differ diff --git a/static/img/_paligo/uuid-97e3fccd-f3f6-fdc8-5f55-75f85a525e95.png b/static/img/_paligo/uuid-97e3fccd-f3f6-fdc8-5f55-75f85a525e95.png new file mode 100644 index 0000000..0ab95d1 Binary files /dev/null and b/static/img/_paligo/uuid-97e3fccd-f3f6-fdc8-5f55-75f85a525e95.png differ diff --git a/static/img/_paligo/uuid-987a7495-6bb7-2c5e-0a19-6871b2ca8f1f.png b/static/img/_paligo/uuid-987a7495-6bb7-2c5e-0a19-6871b2ca8f1f.png new file mode 100644 index 0000000..bac16b2 Binary files /dev/null and b/static/img/_paligo/uuid-987a7495-6bb7-2c5e-0a19-6871b2ca8f1f.png differ diff --git a/static/img/_paligo/uuid-98bd1fcb-463a-c828-a627-5d3adaf78d32.png b/static/img/_paligo/uuid-98bd1fcb-463a-c828-a627-5d3adaf78d32.png new file mode 100644 index 0000000..53eda29 Binary files /dev/null and b/static/img/_paligo/uuid-98bd1fcb-463a-c828-a627-5d3adaf78d32.png differ diff --git a/static/img/_paligo/uuid-99b0eb76-b2f2-4c0c-ae11-abdce5177774.png b/static/img/_paligo/uuid-99b0eb76-b2f2-4c0c-ae11-abdce5177774.png new file mode 100644 index 0000000..7bf2b76 Binary files /dev/null and b/static/img/_paligo/uuid-99b0eb76-b2f2-4c0c-ae11-abdce5177774.png differ diff --git a/static/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png b/static/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png new file mode 100644 index 0000000..4711f3e Binary files /dev/null and b/static/img/_paligo/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png differ diff --git a/static/img/_paligo/uuid-9a20bdb0-2c68-3ce5-1f41-ac710e25b7be.png b/static/img/_paligo/uuid-9a20bdb0-2c68-3ce5-1f41-ac710e25b7be.png new file mode 100644 index 0000000..a596dc1 Binary files /dev/null and b/static/img/_paligo/uuid-9a20bdb0-2c68-3ce5-1f41-ac710e25b7be.png differ diff --git a/static/img/_paligo/uuid-9a300011-7818-826c-5874-c7ba6ade8176.jpg b/static/img/_paligo/uuid-9a300011-7818-826c-5874-c7ba6ade8176.jpg new file mode 100644 index 0000000..d534bee Binary files /dev/null and b/static/img/_paligo/uuid-9a300011-7818-826c-5874-c7ba6ade8176.jpg differ diff --git a/static/img/_paligo/uuid-9b533252-b690-2350-8a3d-5929fcd79ffb.jpg b/static/img/_paligo/uuid-9b533252-b690-2350-8a3d-5929fcd79ffb.jpg new file mode 100644 index 0000000..63ecd1d Binary files /dev/null and b/static/img/_paligo/uuid-9b533252-b690-2350-8a3d-5929fcd79ffb.jpg differ diff --git a/static/img/_paligo/uuid-9b72d008-6924-060b-2efc-96f96390b627.png b/static/img/_paligo/uuid-9b72d008-6924-060b-2efc-96f96390b627.png new file mode 100644 index 0000000..db7e5d3 Binary files /dev/null and b/static/img/_paligo/uuid-9b72d008-6924-060b-2efc-96f96390b627.png differ diff --git a/static/img/_paligo/uuid-9bc938b1-ce78-a66a-d1d8-aa18ee948134.png b/static/img/_paligo/uuid-9bc938b1-ce78-a66a-d1d8-aa18ee948134.png new file mode 100644 index 0000000..66957d2 Binary files /dev/null and b/static/img/_paligo/uuid-9bc938b1-ce78-a66a-d1d8-aa18ee948134.png differ diff --git a/static/img/_paligo/uuid-9cf7ca34-d643-d13c-d241-42cefd6dc847.png b/static/img/_paligo/uuid-9cf7ca34-d643-d13c-d241-42cefd6dc847.png new file mode 100644 index 0000000..7141ffc Binary files /dev/null and b/static/img/_paligo/uuid-9cf7ca34-d643-d13c-d241-42cefd6dc847.png differ diff --git a/static/img/_paligo/uuid-9d5b8607-e8f3-2fa7-aa78-8891c184533e.png b/static/img/_paligo/uuid-9d5b8607-e8f3-2fa7-aa78-8891c184533e.png new file mode 100644 index 0000000..76a5d64 Binary files /dev/null and b/static/img/_paligo/uuid-9d5b8607-e8f3-2fa7-aa78-8891c184533e.png differ diff --git a/static/img/_paligo/uuid-9d7fd7fc-e125-4f45-d011-f5ddcabe0106.png b/static/img/_paligo/uuid-9d7fd7fc-e125-4f45-d011-f5ddcabe0106.png new file mode 100644 index 0000000..3c015a6 Binary files /dev/null and b/static/img/_paligo/uuid-9d7fd7fc-e125-4f45-d011-f5ddcabe0106.png differ diff --git a/static/img/_paligo/uuid-9de8c3bc-abac-16bb-8a19-be18a97ac998.png b/static/img/_paligo/uuid-9de8c3bc-abac-16bb-8a19-be18a97ac998.png new file mode 100644 index 0000000..e11c39d Binary files /dev/null and b/static/img/_paligo/uuid-9de8c3bc-abac-16bb-8a19-be18a97ac998.png differ diff --git a/static/img/_paligo/uuid-9def1cb2-5111-b6a3-58af-ade8becde4e4.png b/static/img/_paligo/uuid-9def1cb2-5111-b6a3-58af-ade8becde4e4.png new file mode 100644 index 0000000..300f116 Binary files /dev/null and b/static/img/_paligo/uuid-9def1cb2-5111-b6a3-58af-ade8becde4e4.png differ diff --git a/static/img/_paligo/uuid-9e21a75a-a3ed-54f2-9b07-53a46d9a3d2d.png b/static/img/_paligo/uuid-9e21a75a-a3ed-54f2-9b07-53a46d9a3d2d.png new file mode 100644 index 0000000..8a2c24e Binary files /dev/null and b/static/img/_paligo/uuid-9e21a75a-a3ed-54f2-9b07-53a46d9a3d2d.png differ diff --git a/static/img/_paligo/uuid-9e8845d9-aa8e-6c98-642a-4e13fddf93ea.png b/static/img/_paligo/uuid-9e8845d9-aa8e-6c98-642a-4e13fddf93ea.png new file mode 100644 index 0000000..c367f2a Binary files /dev/null and b/static/img/_paligo/uuid-9e8845d9-aa8e-6c98-642a-4e13fddf93ea.png differ diff --git a/static/img/_paligo/uuid-9e8a91b7-c03a-f513-62a7-0e91426f1676.png b/static/img/_paligo/uuid-9e8a91b7-c03a-f513-62a7-0e91426f1676.png new file mode 100644 index 0000000..5e10b77 Binary files /dev/null and b/static/img/_paligo/uuid-9e8a91b7-c03a-f513-62a7-0e91426f1676.png differ diff --git a/static/img/_paligo/uuid-9e94e830-280a-4137-e869-f662722473df.png b/static/img/_paligo/uuid-9e94e830-280a-4137-e869-f662722473df.png new file mode 100644 index 0000000..f0a6229 Binary files /dev/null and b/static/img/_paligo/uuid-9e94e830-280a-4137-e869-f662722473df.png differ diff --git a/static/img/_paligo/uuid-9f07fdaf-fccd-365f-c732-7e489e246580.png b/static/img/_paligo/uuid-9f07fdaf-fccd-365f-c732-7e489e246580.png new file mode 100644 index 0000000..67d5db6 Binary files /dev/null and b/static/img/_paligo/uuid-9f07fdaf-fccd-365f-c732-7e489e246580.png differ diff --git a/static/img/_paligo/uuid-9fdfc68c-9744-f7ae-fee6-b4cc984bdf3e.png b/static/img/_paligo/uuid-9fdfc68c-9744-f7ae-fee6-b4cc984bdf3e.png new file mode 100644 index 0000000..12fffa1 Binary files /dev/null and b/static/img/_paligo/uuid-9fdfc68c-9744-f7ae-fee6-b4cc984bdf3e.png differ diff --git a/static/img/_paligo/uuid-a01cfa75-834c-9ffe-57bc-0a097a6df676.jpg b/static/img/_paligo/uuid-a01cfa75-834c-9ffe-57bc-0a097a6df676.jpg new file mode 100644 index 0000000..b6b66fc Binary files /dev/null and b/static/img/_paligo/uuid-a01cfa75-834c-9ffe-57bc-0a097a6df676.jpg differ diff --git a/static/img/_paligo/uuid-a0f5c42f-1f2c-8d2b-a381-5c37bb4fe37c.jpg b/static/img/_paligo/uuid-a0f5c42f-1f2c-8d2b-a381-5c37bb4fe37c.jpg new file mode 100644 index 0000000..7ffd74d Binary files /dev/null and b/static/img/_paligo/uuid-a0f5c42f-1f2c-8d2b-a381-5c37bb4fe37c.jpg differ diff --git a/static/img/_paligo/uuid-a25560d9-ce2a-4181-2dc6-59cc4318c577.png b/static/img/_paligo/uuid-a25560d9-ce2a-4181-2dc6-59cc4318c577.png new file mode 100644 index 0000000..69ff4ba Binary files /dev/null and b/static/img/_paligo/uuid-a25560d9-ce2a-4181-2dc6-59cc4318c577.png differ diff --git a/static/img/_paligo/uuid-a286382b-396d-e852-1b7e-7aa8006f29ef.png b/static/img/_paligo/uuid-a286382b-396d-e852-1b7e-7aa8006f29ef.png new file mode 100644 index 0000000..c071bbb Binary files /dev/null and b/static/img/_paligo/uuid-a286382b-396d-e852-1b7e-7aa8006f29ef.png differ diff --git a/static/img/_paligo/uuid-a2ef477b-91fa-fd15-a651-76faeb65a665.png b/static/img/_paligo/uuid-a2ef477b-91fa-fd15-a651-76faeb65a665.png new file mode 100644 index 0000000..5e9805d Binary files /dev/null and b/static/img/_paligo/uuid-a2ef477b-91fa-fd15-a651-76faeb65a665.png differ diff --git a/static/img/_paligo/uuid-a30a61ec-5dea-3792-44ea-3e6d9c96b19d.png b/static/img/_paligo/uuid-a30a61ec-5dea-3792-44ea-3e6d9c96b19d.png new file mode 100644 index 0000000..5d8cff6 Binary files /dev/null and b/static/img/_paligo/uuid-a30a61ec-5dea-3792-44ea-3e6d9c96b19d.png differ diff --git a/static/img/_paligo/uuid-a3ebc86e-b8db-eedf-bcff-64947885e344.png b/static/img/_paligo/uuid-a3ebc86e-b8db-eedf-bcff-64947885e344.png new file mode 100644 index 0000000..c112182 Binary files /dev/null and b/static/img/_paligo/uuid-a3ebc86e-b8db-eedf-bcff-64947885e344.png differ diff --git a/static/img/_paligo/uuid-a40d7228-e976-458e-0508-99ded152069c.jpg b/static/img/_paligo/uuid-a40d7228-e976-458e-0508-99ded152069c.jpg new file mode 100644 index 0000000..45ebf36 Binary files /dev/null and b/static/img/_paligo/uuid-a40d7228-e976-458e-0508-99ded152069c.jpg differ diff --git a/static/img/_paligo/uuid-a41c4d89-eb5f-0913-ac80-a0af31f99b54.png b/static/img/_paligo/uuid-a41c4d89-eb5f-0913-ac80-a0af31f99b54.png new file mode 100644 index 0000000..8bd3038 Binary files /dev/null and b/static/img/_paligo/uuid-a41c4d89-eb5f-0913-ac80-a0af31f99b54.png differ diff --git a/static/img/_paligo/uuid-a4204c31-4165-2af9-290e-e3116ef784a3.png b/static/img/_paligo/uuid-a4204c31-4165-2af9-290e-e3116ef784a3.png new file mode 100644 index 0000000..ca864ee Binary files /dev/null and b/static/img/_paligo/uuid-a4204c31-4165-2af9-290e-e3116ef784a3.png differ diff --git a/static/img/_paligo/uuid-a493c03e-ab64-9b02-748d-556fdd1c1b1a.png b/static/img/_paligo/uuid-a493c03e-ab64-9b02-748d-556fdd1c1b1a.png new file mode 100644 index 0000000..8fe2fd5 Binary files /dev/null and b/static/img/_paligo/uuid-a493c03e-ab64-9b02-748d-556fdd1c1b1a.png differ diff --git a/static/img/_paligo/uuid-a52e93de-ff50-544e-c914-5aa20dbdeadd.png b/static/img/_paligo/uuid-a52e93de-ff50-544e-c914-5aa20dbdeadd.png new file mode 100644 index 0000000..4bb327e Binary files /dev/null and b/static/img/_paligo/uuid-a52e93de-ff50-544e-c914-5aa20dbdeadd.png differ diff --git a/static/img/_paligo/uuid-a5864e82-1efc-0191-b37c-a162cfcb8f42.png b/static/img/_paligo/uuid-a5864e82-1efc-0191-b37c-a162cfcb8f42.png new file mode 100644 index 0000000..27c2d15 Binary files /dev/null and b/static/img/_paligo/uuid-a5864e82-1efc-0191-b37c-a162cfcb8f42.png differ diff --git a/static/img/_paligo/uuid-a5b75043-f9b0-b1c3-51ac-dc1be80e1034.png b/static/img/_paligo/uuid-a5b75043-f9b0-b1c3-51ac-dc1be80e1034.png new file mode 100644 index 0000000..f14dfc8 Binary files /dev/null and b/static/img/_paligo/uuid-a5b75043-f9b0-b1c3-51ac-dc1be80e1034.png differ diff --git a/static/img/_paligo/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg b/static/img/_paligo/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg new file mode 100644 index 0000000..a57208b Binary files /dev/null and b/static/img/_paligo/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg differ diff --git a/static/img/_paligo/uuid-a6c8e931-615c-8697-8cf6-ab8d5269420b.png b/static/img/_paligo/uuid-a6c8e931-615c-8697-8cf6-ab8d5269420b.png new file mode 100644 index 0000000..0a8c17f Binary files /dev/null and b/static/img/_paligo/uuid-a6c8e931-615c-8697-8cf6-ab8d5269420b.png differ diff --git a/static/img/_paligo/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png b/static/img/_paligo/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png new file mode 100644 index 0000000..a193992 Binary files /dev/null and b/static/img/_paligo/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png differ diff --git a/static/img/_paligo/uuid-a7bfa471-3a28-7bb4-0335-cffbacb0bd8a.png b/static/img/_paligo/uuid-a7bfa471-3a28-7bb4-0335-cffbacb0bd8a.png new file mode 100644 index 0000000..d440302 Binary files /dev/null and b/static/img/_paligo/uuid-a7bfa471-3a28-7bb4-0335-cffbacb0bd8a.png differ diff --git a/static/img/_paligo/uuid-a8509ed5-9cc9-8851-c8df-9d298c5ae3bc.jpg b/static/img/_paligo/uuid-a8509ed5-9cc9-8851-c8df-9d298c5ae3bc.jpg new file mode 100644 index 0000000..6034e98 Binary files /dev/null and b/static/img/_paligo/uuid-a8509ed5-9cc9-8851-c8df-9d298c5ae3bc.jpg differ diff --git a/static/img/_paligo/uuid-a87ac3d9-b1bf-89bc-8d33-84e7edc358c9.png b/static/img/_paligo/uuid-a87ac3d9-b1bf-89bc-8d33-84e7edc358c9.png new file mode 100644 index 0000000..2dcd2db Binary files /dev/null and b/static/img/_paligo/uuid-a87ac3d9-b1bf-89bc-8d33-84e7edc358c9.png differ diff --git a/static/img/_paligo/uuid-a8e8da8b-6759-e159-5aa4-6a97f83896dc.png b/static/img/_paligo/uuid-a8e8da8b-6759-e159-5aa4-6a97f83896dc.png new file mode 100644 index 0000000..621ddd9 Binary files /dev/null and b/static/img/_paligo/uuid-a8e8da8b-6759-e159-5aa4-6a97f83896dc.png differ diff --git a/static/img/_paligo/uuid-a928eed7-d498-758b-6a6c-5a8ef7b202d1.png b/static/img/_paligo/uuid-a928eed7-d498-758b-6a6c-5a8ef7b202d1.png new file mode 100644 index 0000000..32e3ad8 Binary files /dev/null and b/static/img/_paligo/uuid-a928eed7-d498-758b-6a6c-5a8ef7b202d1.png differ diff --git a/static/img/_paligo/uuid-aa579855-a0d6-a545-6a4f-24f543dd36ab.png b/static/img/_paligo/uuid-aa579855-a0d6-a545-6a4f-24f543dd36ab.png new file mode 100644 index 0000000..6c0a1b0 Binary files /dev/null and b/static/img/_paligo/uuid-aa579855-a0d6-a545-6a4f-24f543dd36ab.png differ diff --git a/static/img/_paligo/uuid-aac41e7c-0756-9d0b-d3a3-9fdf2db628dc.png b/static/img/_paligo/uuid-aac41e7c-0756-9d0b-d3a3-9fdf2db628dc.png new file mode 100644 index 0000000..ce3ed92 Binary files /dev/null and b/static/img/_paligo/uuid-aac41e7c-0756-9d0b-d3a3-9fdf2db628dc.png differ diff --git a/static/img/_paligo/uuid-aad02a5a-3899-01eb-0842-76bfcc14b1d4.png b/static/img/_paligo/uuid-aad02a5a-3899-01eb-0842-76bfcc14b1d4.png new file mode 100644 index 0000000..c885ab9 Binary files /dev/null and b/static/img/_paligo/uuid-aad02a5a-3899-01eb-0842-76bfcc14b1d4.png differ diff --git a/static/img/_paligo/uuid-ab2808a9-e648-a309-8e76-6aa126e8047c.gif b/static/img/_paligo/uuid-ab2808a9-e648-a309-8e76-6aa126e8047c.gif new file mode 100644 index 0000000..c17dd84 Binary files /dev/null and b/static/img/_paligo/uuid-ab2808a9-e648-a309-8e76-6aa126e8047c.gif differ diff --git a/static/img/_paligo/uuid-ab2b08b0-8e9c-decb-e628-df8893aecb94.png b/static/img/_paligo/uuid-ab2b08b0-8e9c-decb-e628-df8893aecb94.png new file mode 100644 index 0000000..efab0d7 Binary files /dev/null and b/static/img/_paligo/uuid-ab2b08b0-8e9c-decb-e628-df8893aecb94.png differ diff --git a/static/img/_paligo/uuid-ab9cf08d-eb9e-d46d-7bb2-740827ec96b9.png b/static/img/_paligo/uuid-ab9cf08d-eb9e-d46d-7bb2-740827ec96b9.png new file mode 100644 index 0000000..85e9161 Binary files /dev/null and b/static/img/_paligo/uuid-ab9cf08d-eb9e-d46d-7bb2-740827ec96b9.png differ diff --git a/static/img/_paligo/uuid-abd6b335-ae55-f91a-4cea-4a9df270ce2b.png b/static/img/_paligo/uuid-abd6b335-ae55-f91a-4cea-4a9df270ce2b.png new file mode 100644 index 0000000..aa87615 Binary files /dev/null and b/static/img/_paligo/uuid-abd6b335-ae55-f91a-4cea-4a9df270ce2b.png differ diff --git a/static/img/_paligo/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png b/static/img/_paligo/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png new file mode 100644 index 0000000..01b9cd2 Binary files /dev/null and b/static/img/_paligo/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png differ diff --git a/static/img/_paligo/uuid-ac4d6375-b153-bb6a-d78d-f0bd9bebf824.png b/static/img/_paligo/uuid-ac4d6375-b153-bb6a-d78d-f0bd9bebf824.png new file mode 100644 index 0000000..7300959 Binary files /dev/null and b/static/img/_paligo/uuid-ac4d6375-b153-bb6a-d78d-f0bd9bebf824.png differ diff --git a/static/img/_paligo/uuid-ac92de93-beb4-8a7d-d28c-0fe5cc8296b8.png b/static/img/_paligo/uuid-ac92de93-beb4-8a7d-d28c-0fe5cc8296b8.png new file mode 100644 index 0000000..d110692 Binary files /dev/null and b/static/img/_paligo/uuid-ac92de93-beb4-8a7d-d28c-0fe5cc8296b8.png differ diff --git a/static/img/_paligo/uuid-acd14919-6069-8806-9834-df5d53a539a5.png b/static/img/_paligo/uuid-acd14919-6069-8806-9834-df5d53a539a5.png new file mode 100644 index 0000000..64c34b6 Binary files /dev/null and b/static/img/_paligo/uuid-acd14919-6069-8806-9834-df5d53a539a5.png differ diff --git a/static/img/_paligo/uuid-ad094f49-47bd-4ee0-a1f3-899a5d2a61a4.png b/static/img/_paligo/uuid-ad094f49-47bd-4ee0-a1f3-899a5d2a61a4.png new file mode 100644 index 0000000..0248aa2 Binary files /dev/null and b/static/img/_paligo/uuid-ad094f49-47bd-4ee0-a1f3-899a5d2a61a4.png differ diff --git a/static/img/_paligo/uuid-af9f1f82-169a-eb0c-6c50-1d23315691dc.png b/static/img/_paligo/uuid-af9f1f82-169a-eb0c-6c50-1d23315691dc.png new file mode 100644 index 0000000..25eeeb0 Binary files /dev/null and b/static/img/_paligo/uuid-af9f1f82-169a-eb0c-6c50-1d23315691dc.png differ diff --git a/static/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png b/static/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png new file mode 100644 index 0000000..201a492 Binary files /dev/null and b/static/img/_paligo/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png differ diff --git a/static/img/_paligo/uuid-b09fdf6d-9e83-e454-23c7-005f1344b4aa.png b/static/img/_paligo/uuid-b09fdf6d-9e83-e454-23c7-005f1344b4aa.png new file mode 100644 index 0000000..0434a52 Binary files /dev/null and b/static/img/_paligo/uuid-b09fdf6d-9e83-e454-23c7-005f1344b4aa.png differ diff --git a/static/img/_paligo/uuid-b0a21607-f817-bdff-5480-e82a6f9a0152.jpg b/static/img/_paligo/uuid-b0a21607-f817-bdff-5480-e82a6f9a0152.jpg new file mode 100644 index 0000000..0c2e0dd Binary files /dev/null and b/static/img/_paligo/uuid-b0a21607-f817-bdff-5480-e82a6f9a0152.jpg differ diff --git a/static/img/_paligo/uuid-b104fac1-d553-69d3-ebcb-b8260e8a3595.png b/static/img/_paligo/uuid-b104fac1-d553-69d3-ebcb-b8260e8a3595.png new file mode 100644 index 0000000..82b2b07 Binary files /dev/null and b/static/img/_paligo/uuid-b104fac1-d553-69d3-ebcb-b8260e8a3595.png differ diff --git a/static/img/_paligo/uuid-b13100e0-e250-6f21-1b90-31ba26ae8486.png b/static/img/_paligo/uuid-b13100e0-e250-6f21-1b90-31ba26ae8486.png new file mode 100644 index 0000000..e2de69e Binary files /dev/null and b/static/img/_paligo/uuid-b13100e0-e250-6f21-1b90-31ba26ae8486.png differ diff --git a/static/img/_paligo/uuid-b15d9482-748d-bb6a-1aaa-c1153ed8392b.png b/static/img/_paligo/uuid-b15d9482-748d-bb6a-1aaa-c1153ed8392b.png new file mode 100644 index 0000000..e1ee2ed Binary files /dev/null and b/static/img/_paligo/uuid-b15d9482-748d-bb6a-1aaa-c1153ed8392b.png differ diff --git a/static/img/_paligo/uuid-b1dd1c66-369b-691d-8842-752bd6f33919.png b/static/img/_paligo/uuid-b1dd1c66-369b-691d-8842-752bd6f33919.png new file mode 100644 index 0000000..fbdf49d Binary files /dev/null and b/static/img/_paligo/uuid-b1dd1c66-369b-691d-8842-752bd6f33919.png differ diff --git a/static/img/_paligo/uuid-b2225b17-758e-9676-2e0a-615aebd28335.png b/static/img/_paligo/uuid-b2225b17-758e-9676-2e0a-615aebd28335.png new file mode 100644 index 0000000..1df57ec Binary files /dev/null and b/static/img/_paligo/uuid-b2225b17-758e-9676-2e0a-615aebd28335.png differ diff --git a/static/img/_paligo/uuid-b269a597-65ef-34a5-1828-ad1ab954437d.png b/static/img/_paligo/uuid-b269a597-65ef-34a5-1828-ad1ab954437d.png new file mode 100644 index 0000000..69299c1 Binary files /dev/null and b/static/img/_paligo/uuid-b269a597-65ef-34a5-1828-ad1ab954437d.png differ diff --git a/static/img/_paligo/uuid-b2fabd61-e0f2-af2c-3074-70940d45d4cc.png b/static/img/_paligo/uuid-b2fabd61-e0f2-af2c-3074-70940d45d4cc.png new file mode 100644 index 0000000..de54211 Binary files /dev/null and b/static/img/_paligo/uuid-b2fabd61-e0f2-af2c-3074-70940d45d4cc.png differ diff --git a/static/img/_paligo/uuid-b309f819-a995-58ae-e686-2e98ac27a1c3.png b/static/img/_paligo/uuid-b309f819-a995-58ae-e686-2e98ac27a1c3.png new file mode 100644 index 0000000..56ba246 Binary files /dev/null and b/static/img/_paligo/uuid-b309f819-a995-58ae-e686-2e98ac27a1c3.png differ diff --git a/static/img/_paligo/uuid-b3349767-289a-0a77-f7d6-0ae2c4752ef2.png b/static/img/_paligo/uuid-b3349767-289a-0a77-f7d6-0ae2c4752ef2.png new file mode 100644 index 0000000..61d2985 Binary files /dev/null and b/static/img/_paligo/uuid-b3349767-289a-0a77-f7d6-0ae2c4752ef2.png differ diff --git a/static/img/_paligo/uuid-b3f12826-15e7-22c6-5688-9f3be3f519fd.jpg b/static/img/_paligo/uuid-b3f12826-15e7-22c6-5688-9f3be3f519fd.jpg new file mode 100644 index 0000000..571cfde Binary files /dev/null and b/static/img/_paligo/uuid-b3f12826-15e7-22c6-5688-9f3be3f519fd.jpg differ diff --git a/static/img/_paligo/uuid-b4d1eb0b-3222-87c7-f672-82695ed71e87.png b/static/img/_paligo/uuid-b4d1eb0b-3222-87c7-f672-82695ed71e87.png new file mode 100644 index 0000000..4f2da09 Binary files /dev/null and b/static/img/_paligo/uuid-b4d1eb0b-3222-87c7-f672-82695ed71e87.png differ diff --git a/static/img/_paligo/uuid-b51f2636-2f9d-89c2-595e-db6ab80d5416.png b/static/img/_paligo/uuid-b51f2636-2f9d-89c2-595e-db6ab80d5416.png new file mode 100644 index 0000000..9ee2981 Binary files /dev/null and b/static/img/_paligo/uuid-b51f2636-2f9d-89c2-595e-db6ab80d5416.png differ diff --git a/static/img/_paligo/uuid-b53b6a0d-3e15-8891-131e-9c1b5637f0bc.png b/static/img/_paligo/uuid-b53b6a0d-3e15-8891-131e-9c1b5637f0bc.png new file mode 100644 index 0000000..4dffb80 Binary files /dev/null and b/static/img/_paligo/uuid-b53b6a0d-3e15-8891-131e-9c1b5637f0bc.png differ diff --git a/static/img/_paligo/uuid-b69592cf-9d58-0267-7327-c3265b1e4462.png b/static/img/_paligo/uuid-b69592cf-9d58-0267-7327-c3265b1e4462.png new file mode 100644 index 0000000..ef157dc Binary files /dev/null and b/static/img/_paligo/uuid-b69592cf-9d58-0267-7327-c3265b1e4462.png differ diff --git a/static/img/_paligo/uuid-b702773a-d24b-62a5-fa83-208936e116a3.jpg b/static/img/_paligo/uuid-b702773a-d24b-62a5-fa83-208936e116a3.jpg new file mode 100644 index 0000000..8b84068 Binary files /dev/null and b/static/img/_paligo/uuid-b702773a-d24b-62a5-fa83-208936e116a3.jpg differ diff --git a/static/img/_paligo/uuid-b72c807f-04d5-72e5-9c85-670efa9bb40a.gif b/static/img/_paligo/uuid-b72c807f-04d5-72e5-9c85-670efa9bb40a.gif new file mode 100644 index 0000000..5935736 Binary files /dev/null and b/static/img/_paligo/uuid-b72c807f-04d5-72e5-9c85-670efa9bb40a.gif differ diff --git a/static/img/_paligo/uuid-b744552e-6efc-a532-0dd6-142bc77a1fcb.png b/static/img/_paligo/uuid-b744552e-6efc-a532-0dd6-142bc77a1fcb.png new file mode 100644 index 0000000..c0bb1b2 Binary files /dev/null and b/static/img/_paligo/uuid-b744552e-6efc-a532-0dd6-142bc77a1fcb.png differ diff --git a/static/img/_paligo/uuid-b76a80c6-dd43-0542-65aa-98a4f8e44407.png b/static/img/_paligo/uuid-b76a80c6-dd43-0542-65aa-98a4f8e44407.png new file mode 100644 index 0000000..6f0e49e Binary files /dev/null and b/static/img/_paligo/uuid-b76a80c6-dd43-0542-65aa-98a4f8e44407.png differ diff --git a/static/img/_paligo/uuid-b793f623-9381-97af-5a8b-72719a0223fa.png b/static/img/_paligo/uuid-b793f623-9381-97af-5a8b-72719a0223fa.png new file mode 100644 index 0000000..e9ed098 Binary files /dev/null and b/static/img/_paligo/uuid-b793f623-9381-97af-5a8b-72719a0223fa.png differ diff --git a/static/img/_paligo/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg b/static/img/_paligo/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg new file mode 100644 index 0000000..7f24736 Binary files /dev/null and b/static/img/_paligo/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg differ diff --git a/static/img/_paligo/uuid-b80417cb-80b7-3d51-5609-11f078c68a79.png b/static/img/_paligo/uuid-b80417cb-80b7-3d51-5609-11f078c68a79.png new file mode 100644 index 0000000..3dc8d8b Binary files /dev/null and b/static/img/_paligo/uuid-b80417cb-80b7-3d51-5609-11f078c68a79.png differ diff --git a/static/img/_paligo/uuid-b81a2b79-c62d-b113-a36a-e91351cc2d41.png b/static/img/_paligo/uuid-b81a2b79-c62d-b113-a36a-e91351cc2d41.png new file mode 100644 index 0000000..e8e577d Binary files /dev/null and b/static/img/_paligo/uuid-b81a2b79-c62d-b113-a36a-e91351cc2d41.png differ diff --git a/static/img/_paligo/uuid-b94ebc99-20bb-22e8-f056-568f725fff85.png b/static/img/_paligo/uuid-b94ebc99-20bb-22e8-f056-568f725fff85.png new file mode 100644 index 0000000..a019964 Binary files /dev/null and b/static/img/_paligo/uuid-b94ebc99-20bb-22e8-f056-568f725fff85.png differ diff --git a/static/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png b/static/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png new file mode 100644 index 0000000..c223dc5 Binary files /dev/null and b/static/img/_paligo/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png differ diff --git a/static/img/_paligo/uuid-ba20e7c6-49cf-1ec0-ca6a-5630eb89c357.jpg b/static/img/_paligo/uuid-ba20e7c6-49cf-1ec0-ca6a-5630eb89c357.jpg new file mode 100644 index 0000000..bf273d9 Binary files /dev/null and b/static/img/_paligo/uuid-ba20e7c6-49cf-1ec0-ca6a-5630eb89c357.jpg differ diff --git a/static/img/_paligo/uuid-ba3b2ff2-116c-1ae2-0e8d-72c0e73826ee.jpg b/static/img/_paligo/uuid-ba3b2ff2-116c-1ae2-0e8d-72c0e73826ee.jpg new file mode 100644 index 0000000..3c820a7 Binary files /dev/null and b/static/img/_paligo/uuid-ba3b2ff2-116c-1ae2-0e8d-72c0e73826ee.jpg differ diff --git a/static/img/_paligo/uuid-baadaff0-fbae-febb-cca3-077a707b1676.png b/static/img/_paligo/uuid-baadaff0-fbae-febb-cca3-077a707b1676.png new file mode 100644 index 0000000..ad26008 Binary files /dev/null and b/static/img/_paligo/uuid-baadaff0-fbae-febb-cca3-077a707b1676.png differ diff --git a/static/img/_paligo/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg b/static/img/_paligo/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg new file mode 100644 index 0000000..81a7cb4 Binary files /dev/null and b/static/img/_paligo/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg differ diff --git a/static/img/_paligo/uuid-bba07440-4913-8b44-0391-1dd275534500.png b/static/img/_paligo/uuid-bba07440-4913-8b44-0391-1dd275534500.png new file mode 100644 index 0000000..023daae Binary files /dev/null and b/static/img/_paligo/uuid-bba07440-4913-8b44-0391-1dd275534500.png differ diff --git a/static/img/_paligo/uuid-bbcc5c35-f82c-f026-b5a7-92bb3040d6da.png b/static/img/_paligo/uuid-bbcc5c35-f82c-f026-b5a7-92bb3040d6da.png new file mode 100644 index 0000000..b2c3535 Binary files /dev/null and b/static/img/_paligo/uuid-bbcc5c35-f82c-f026-b5a7-92bb3040d6da.png differ diff --git a/static/img/_paligo/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png b/static/img/_paligo/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png new file mode 100644 index 0000000..5545b3b Binary files /dev/null and b/static/img/_paligo/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png differ diff --git a/static/img/_paligo/uuid-bc4b9514-6399-0d7d-1f0f-0308aa637c5c.png b/static/img/_paligo/uuid-bc4b9514-6399-0d7d-1f0f-0308aa637c5c.png new file mode 100644 index 0000000..a0ed2e7 Binary files /dev/null and b/static/img/_paligo/uuid-bc4b9514-6399-0d7d-1f0f-0308aa637c5c.png differ diff --git a/static/img/_paligo/uuid-bcc68f5e-feec-8292-2e57-1bfb0dd9d9b9.svg b/static/img/_paligo/uuid-bcc68f5e-feec-8292-2e57-1bfb0dd9d9b9.svg new file mode 100644 index 0000000..4970342 --- /dev/null +++ b/static/img/_paligo/uuid-bcc68f5e-feec-8292-2e57-1bfb0dd9d9b9.svg @@ -0,0 +1,2 @@ +


Ubuntu Jammy - 2025 Edition

Ubuntu Jammy - 2025 Edition


2024
2024
2025
2025
2026
2026
2027
2027
2028
2028
2029
2029

Ubuntu Noble - 2025 Edition

Ubuntu Noble - 202...




Ubuntu 26.04 - 2026 Edition

Ubuntu 26.04 - 2026 E...


Removed
Remov...
Stable
Stab...
Frozen
Froz...
Edge
Edge

Ubuntu Focal - Bitrise Edition 

Ubuntu Focal - Bitrise...

Ubuntu 26.04 - 2027 Edition

Ubuntu 26.04 - 2027 E...


Ubuntu 28.04 - 2027 Edition

Ubuntu 28.04 -...

Ubuntu 26.04 LTS release*

Ubuntu 26.04 LT...

Ubuntu 28.04 LTS release*

Ubuntu 28.04 LT...
 Stack uses Ubuntu Focal 20.04
 Stack uses Ubuntu Focal 20.04
 Stack uses Ubuntu Jammy 22.04
 Stack uses Ubuntu Jammy 22.04
 Stack uses Ubuntu Noble 24.04
 Stack uses Ubuntu Noble 24.04
 Stack uses Ubuntu 26.04
 Stack uses Ubuntu 26.04
 Stack uses Ubuntu 28.04
 Stack uses Ubuntu 28.04
*estimate based on previous years
*estimate based on previ...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/_paligo/uuid-bce20b25-c8cc-fed6-c43c-627647f4c5a4.png b/static/img/_paligo/uuid-bce20b25-c8cc-fed6-c43c-627647f4c5a4.png new file mode 100644 index 0000000..ca85b96 Binary files /dev/null and b/static/img/_paligo/uuid-bce20b25-c8cc-fed6-c43c-627647f4c5a4.png differ diff --git a/static/img/_paligo/uuid-bcfdf2cb-0157-100c-44ed-25e040d82e6b.jpg b/static/img/_paligo/uuid-bcfdf2cb-0157-100c-44ed-25e040d82e6b.jpg new file mode 100644 index 0000000..257739d Binary files /dev/null and b/static/img/_paligo/uuid-bcfdf2cb-0157-100c-44ed-25e040d82e6b.jpg differ diff --git a/static/img/_paligo/uuid-bd209862-be8e-f0b7-c8c6-23b6f23d2329.png b/static/img/_paligo/uuid-bd209862-be8e-f0b7-c8c6-23b6f23d2329.png new file mode 100644 index 0000000..8b39ebb Binary files /dev/null and b/static/img/_paligo/uuid-bd209862-be8e-f0b7-c8c6-23b6f23d2329.png differ diff --git a/static/img/_paligo/uuid-bdbb02c7-b8e7-bf04-fb52-7cacd2231760.png b/static/img/_paligo/uuid-bdbb02c7-b8e7-bf04-fb52-7cacd2231760.png new file mode 100644 index 0000000..3ee0255 Binary files /dev/null and b/static/img/_paligo/uuid-bdbb02c7-b8e7-bf04-fb52-7cacd2231760.png differ diff --git a/static/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png b/static/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png new file mode 100644 index 0000000..9b17170 Binary files /dev/null and b/static/img/_paligo/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png differ diff --git a/static/img/_paligo/uuid-bf544047-689a-3954-029d-58b65a35c540.png b/static/img/_paligo/uuid-bf544047-689a-3954-029d-58b65a35c540.png new file mode 100644 index 0000000..4527ad5 Binary files /dev/null and b/static/img/_paligo/uuid-bf544047-689a-3954-029d-58b65a35c540.png differ diff --git a/static/img/_paligo/uuid-bf85c17c-277e-088a-13b0-3fe96e79cc7d.png b/static/img/_paligo/uuid-bf85c17c-277e-088a-13b0-3fe96e79cc7d.png new file mode 100644 index 0000000..302210b Binary files /dev/null and b/static/img/_paligo/uuid-bf85c17c-277e-088a-13b0-3fe96e79cc7d.png differ diff --git a/static/img/_paligo/uuid-bf8ba810-c8e2-5323-8d6b-30b9a030b59d.jpg b/static/img/_paligo/uuid-bf8ba810-c8e2-5323-8d6b-30b9a030b59d.jpg new file mode 100644 index 0000000..555e6d7 Binary files /dev/null and b/static/img/_paligo/uuid-bf8ba810-c8e2-5323-8d6b-30b9a030b59d.jpg differ diff --git a/static/img/_paligo/uuid-bf8f3c0e-81c1-d175-92da-bcbabe18bb3a.png b/static/img/_paligo/uuid-bf8f3c0e-81c1-d175-92da-bcbabe18bb3a.png new file mode 100644 index 0000000..568438c Binary files /dev/null and b/static/img/_paligo/uuid-bf8f3c0e-81c1-d175-92da-bcbabe18bb3a.png differ diff --git a/static/img/_paligo/uuid-bfadf366-bdfc-4440-d2db-5e9f68843f9f.png b/static/img/_paligo/uuid-bfadf366-bdfc-4440-d2db-5e9f68843f9f.png new file mode 100644 index 0000000..3665596 Binary files /dev/null and b/static/img/_paligo/uuid-bfadf366-bdfc-4440-d2db-5e9f68843f9f.png differ diff --git a/static/img/_paligo/uuid-bfc425a6-84a8-0672-31bb-d3d7b07b56ce.png b/static/img/_paligo/uuid-bfc425a6-84a8-0672-31bb-d3d7b07b56ce.png new file mode 100644 index 0000000..fce3688 Binary files /dev/null and b/static/img/_paligo/uuid-bfc425a6-84a8-0672-31bb-d3d7b07b56ce.png differ diff --git a/static/img/_paligo/uuid-bfc830a8-c22d-2fc3-1dab-16fba07460fa.png b/static/img/_paligo/uuid-bfc830a8-c22d-2fc3-1dab-16fba07460fa.png new file mode 100644 index 0000000..97778cb Binary files /dev/null and b/static/img/_paligo/uuid-bfc830a8-c22d-2fc3-1dab-16fba07460fa.png differ diff --git a/static/img/_paligo/uuid-bff97bcb-df0b-c062-3f8b-e446d171d6e9.png b/static/img/_paligo/uuid-bff97bcb-df0b-c062-3f8b-e446d171d6e9.png new file mode 100644 index 0000000..afbdc60 Binary files /dev/null and b/static/img/_paligo/uuid-bff97bcb-df0b-c062-3f8b-e446d171d6e9.png differ diff --git a/static/img/_paligo/uuid-c09d6420-4a98-85f8-8bdc-c96e59c07779.png b/static/img/_paligo/uuid-c09d6420-4a98-85f8-8bdc-c96e59c07779.png new file mode 100644 index 0000000..0a79546 Binary files /dev/null and b/static/img/_paligo/uuid-c09d6420-4a98-85f8-8bdc-c96e59c07779.png differ diff --git a/static/img/_paligo/uuid-c0daa517-7b8f-10d5-c390-511c68829d40.png b/static/img/_paligo/uuid-c0daa517-7b8f-10d5-c390-511c68829d40.png new file mode 100644 index 0000000..723ce7c Binary files /dev/null and b/static/img/_paligo/uuid-c0daa517-7b8f-10d5-c390-511c68829d40.png differ diff --git a/static/img/_paligo/uuid-c139a2c3-3f9a-980e-41f0-a85bc3ea6bbb.png b/static/img/_paligo/uuid-c139a2c3-3f9a-980e-41f0-a85bc3ea6bbb.png new file mode 100644 index 0000000..f3f14a4 Binary files /dev/null and b/static/img/_paligo/uuid-c139a2c3-3f9a-980e-41f0-a85bc3ea6bbb.png differ diff --git a/static/img/_paligo/uuid-c1bacf0c-d211-9674-a2d6-625665e9b381.png b/static/img/_paligo/uuid-c1bacf0c-d211-9674-a2d6-625665e9b381.png new file mode 100644 index 0000000..0f1f153 Binary files /dev/null and b/static/img/_paligo/uuid-c1bacf0c-d211-9674-a2d6-625665e9b381.png differ diff --git a/static/img/_paligo/uuid-c1dec9c9-49a4-90c6-40b3-c3d69088567b.png b/static/img/_paligo/uuid-c1dec9c9-49a4-90c6-40b3-c3d69088567b.png new file mode 100644 index 0000000..c9a61cc Binary files /dev/null and b/static/img/_paligo/uuid-c1dec9c9-49a4-90c6-40b3-c3d69088567b.png differ diff --git a/static/img/_paligo/uuid-c26b5123-a015-a06f-1e80-0845b40a2895.png b/static/img/_paligo/uuid-c26b5123-a015-a06f-1e80-0845b40a2895.png new file mode 100644 index 0000000..f3f6314 Binary files /dev/null and b/static/img/_paligo/uuid-c26b5123-a015-a06f-1e80-0845b40a2895.png differ diff --git a/static/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png b/static/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png new file mode 100644 index 0000000..26b4527 Binary files /dev/null and b/static/img/_paligo/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png differ diff --git a/static/img/_paligo/uuid-c46c2c36-ef48-dd8e-7fd4-d025a8c1403d.png b/static/img/_paligo/uuid-c46c2c36-ef48-dd8e-7fd4-d025a8c1403d.png new file mode 100644 index 0000000..0aab2ea Binary files /dev/null and b/static/img/_paligo/uuid-c46c2c36-ef48-dd8e-7fd4-d025a8c1403d.png differ diff --git a/static/img/_paligo/uuid-c56aac7c-384f-7b63-c38e-216a32143c86.png b/static/img/_paligo/uuid-c56aac7c-384f-7b63-c38e-216a32143c86.png new file mode 100644 index 0000000..b793ed4 Binary files /dev/null and b/static/img/_paligo/uuid-c56aac7c-384f-7b63-c38e-216a32143c86.png differ diff --git a/static/img/_paligo/uuid-c73e996d-b1f3-422a-f317-5ec31fedcd68.png b/static/img/_paligo/uuid-c73e996d-b1f3-422a-f317-5ec31fedcd68.png new file mode 100644 index 0000000..d0bcc67 Binary files /dev/null and b/static/img/_paligo/uuid-c73e996d-b1f3-422a-f317-5ec31fedcd68.png differ diff --git a/static/img/_paligo/uuid-c79c0bb4-943a-7604-d40b-f8478be408bd.png b/static/img/_paligo/uuid-c79c0bb4-943a-7604-d40b-f8478be408bd.png new file mode 100644 index 0000000..7b759cb Binary files /dev/null and b/static/img/_paligo/uuid-c79c0bb4-943a-7604-d40b-f8478be408bd.png differ diff --git a/static/img/_paligo/uuid-c81ac3ec-31ee-45b9-3be1-497feae7a780.png b/static/img/_paligo/uuid-c81ac3ec-31ee-45b9-3be1-497feae7a780.png new file mode 100644 index 0000000..4be6e19 Binary files /dev/null and b/static/img/_paligo/uuid-c81ac3ec-31ee-45b9-3be1-497feae7a780.png differ diff --git a/static/img/_paligo/uuid-c82d552a-8d31-148f-82e4-bb4ec929c183.png b/static/img/_paligo/uuid-c82d552a-8d31-148f-82e4-bb4ec929c183.png new file mode 100644 index 0000000..783ce5c Binary files /dev/null and b/static/img/_paligo/uuid-c82d552a-8d31-148f-82e4-bb4ec929c183.png differ diff --git a/static/img/_paligo/uuid-c8804850-f923-c194-e029-59d1d39e50d7.jpg b/static/img/_paligo/uuid-c8804850-f923-c194-e029-59d1d39e50d7.jpg new file mode 100644 index 0000000..adfff45 Binary files /dev/null and b/static/img/_paligo/uuid-c8804850-f923-c194-e029-59d1d39e50d7.jpg differ diff --git a/static/img/_paligo/uuid-c88d4641-9945-2d84-dd14-ef30fdd68fc4.png b/static/img/_paligo/uuid-c88d4641-9945-2d84-dd14-ef30fdd68fc4.png new file mode 100644 index 0000000..0732114 Binary files /dev/null and b/static/img/_paligo/uuid-c88d4641-9945-2d84-dd14-ef30fdd68fc4.png differ diff --git a/static/img/_paligo/uuid-c8b3be87-8669-d4d7-d100-ad03c3055645.png b/static/img/_paligo/uuid-c8b3be87-8669-d4d7-d100-ad03c3055645.png new file mode 100644 index 0000000..e629f5e Binary files /dev/null and b/static/img/_paligo/uuid-c8b3be87-8669-d4d7-d100-ad03c3055645.png differ diff --git a/static/img/_paligo/uuid-c920feb2-3a96-88d7-710a-27d3d4fcba1c.jpg b/static/img/_paligo/uuid-c920feb2-3a96-88d7-710a-27d3d4fcba1c.jpg new file mode 100644 index 0000000..872760d Binary files /dev/null and b/static/img/_paligo/uuid-c920feb2-3a96-88d7-710a-27d3d4fcba1c.jpg differ diff --git a/static/img/_paligo/uuid-c92d5036-7f13-9541-6a80-0614d27e928d.png b/static/img/_paligo/uuid-c92d5036-7f13-9541-6a80-0614d27e928d.png new file mode 100644 index 0000000..b394a3b Binary files /dev/null and b/static/img/_paligo/uuid-c92d5036-7f13-9541-6a80-0614d27e928d.png differ diff --git a/static/img/_paligo/uuid-c92f6dbc-0dee-4ec9-3680-53b83a30f2a2.png b/static/img/_paligo/uuid-c92f6dbc-0dee-4ec9-3680-53b83a30f2a2.png new file mode 100644 index 0000000..6830166 Binary files /dev/null and b/static/img/_paligo/uuid-c92f6dbc-0dee-4ec9-3680-53b83a30f2a2.png differ diff --git a/static/img/_paligo/uuid-c93bbd2a-6d87-97d3-11ee-ca32475064af.png b/static/img/_paligo/uuid-c93bbd2a-6d87-97d3-11ee-ca32475064af.png new file mode 100644 index 0000000..01ddeda Binary files /dev/null and b/static/img/_paligo/uuid-c93bbd2a-6d87-97d3-11ee-ca32475064af.png differ diff --git a/static/img/_paligo/uuid-c9c66545-e909-2236-e073-d55e134d6548.png b/static/img/_paligo/uuid-c9c66545-e909-2236-e073-d55e134d6548.png new file mode 100644 index 0000000..af655e3 Binary files /dev/null and b/static/img/_paligo/uuid-c9c66545-e909-2236-e073-d55e134d6548.png differ diff --git a/static/img/_paligo/uuid-c9f67a4a-32c5-6ea8-fd0a-e1da4dccebf2.png b/static/img/_paligo/uuid-c9f67a4a-32c5-6ea8-fd0a-e1da4dccebf2.png new file mode 100644 index 0000000..36cb441 Binary files /dev/null and b/static/img/_paligo/uuid-c9f67a4a-32c5-6ea8-fd0a-e1da4dccebf2.png differ diff --git a/static/img/_paligo/uuid-ca5383f8-2b6e-a07a-1876-35ad58894b5f.png b/static/img/_paligo/uuid-ca5383f8-2b6e-a07a-1876-35ad58894b5f.png new file mode 100644 index 0000000..ad31818 Binary files /dev/null and b/static/img/_paligo/uuid-ca5383f8-2b6e-a07a-1876-35ad58894b5f.png differ diff --git a/static/img/_paligo/uuid-ca83e0fe-3980-65b0-809c-86ab6bd95b36.png b/static/img/_paligo/uuid-ca83e0fe-3980-65b0-809c-86ab6bd95b36.png new file mode 100644 index 0000000..1b225bb Binary files /dev/null and b/static/img/_paligo/uuid-ca83e0fe-3980-65b0-809c-86ab6bd95b36.png differ diff --git a/static/img/_paligo/uuid-ca915855-de3e-21af-a1d7-539b1020af65.png b/static/img/_paligo/uuid-ca915855-de3e-21af-a1d7-539b1020af65.png new file mode 100644 index 0000000..489e384 Binary files /dev/null and b/static/img/_paligo/uuid-ca915855-de3e-21af-a1d7-539b1020af65.png differ diff --git a/static/img/_paligo/uuid-caac5c40-bb61-c1fd-af8b-5e454a9680da.png b/static/img/_paligo/uuid-caac5c40-bb61-c1fd-af8b-5e454a9680da.png new file mode 100644 index 0000000..5401cc2 Binary files /dev/null and b/static/img/_paligo/uuid-caac5c40-bb61-c1fd-af8b-5e454a9680da.png differ diff --git a/static/img/_paligo/uuid-cac01df1-7cc0-598f-62b5-87a237ecc669.png b/static/img/_paligo/uuid-cac01df1-7cc0-598f-62b5-87a237ecc669.png new file mode 100644 index 0000000..41ea52c Binary files /dev/null and b/static/img/_paligo/uuid-cac01df1-7cc0-598f-62b5-87a237ecc669.png differ diff --git a/static/img/_paligo/uuid-cae7939a-c5e3-917f-5121-e7ef852362d5.png b/static/img/_paligo/uuid-cae7939a-c5e3-917f-5121-e7ef852362d5.png new file mode 100644 index 0000000..fb324e9 Binary files /dev/null and b/static/img/_paligo/uuid-cae7939a-c5e3-917f-5121-e7ef852362d5.png differ diff --git a/static/img/_paligo/uuid-cae94617-17e3-33ce-8cf7-99205e85bd22.png b/static/img/_paligo/uuid-cae94617-17e3-33ce-8cf7-99205e85bd22.png new file mode 100644 index 0000000..9361780 Binary files /dev/null and b/static/img/_paligo/uuid-cae94617-17e3-33ce-8cf7-99205e85bd22.png differ diff --git a/static/img/_paligo/uuid-cb123ebc-f548-8e87-615f-aab39fefa078.svg b/static/img/_paligo/uuid-cb123ebc-f548-8e87-615f-aab39fefa078.svg new file mode 100644 index 0000000..421491d --- /dev/null +++ b/static/img/_paligo/uuid-cb123ebc-f548-8e87-615f-aab39fefa078.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/_paligo/uuid-cb1811cf-42dd-3707-9288-42d1291a9780.png b/static/img/_paligo/uuid-cb1811cf-42dd-3707-9288-42d1291a9780.png new file mode 100644 index 0000000..592d39f Binary files /dev/null and b/static/img/_paligo/uuid-cb1811cf-42dd-3707-9288-42d1291a9780.png differ diff --git a/static/img/_paligo/uuid-cc676406-6eb6-010a-1daa-9a687d3902ea.png b/static/img/_paligo/uuid-cc676406-6eb6-010a-1daa-9a687d3902ea.png new file mode 100644 index 0000000..33b9ca4 Binary files /dev/null and b/static/img/_paligo/uuid-cc676406-6eb6-010a-1daa-9a687d3902ea.png differ diff --git a/static/img/_paligo/uuid-cc9dfa1f-9277-fe9e-7d4a-92d5fb04d5d6.jpg b/static/img/_paligo/uuid-cc9dfa1f-9277-fe9e-7d4a-92d5fb04d5d6.jpg new file mode 100644 index 0000000..780fce0 Binary files /dev/null and b/static/img/_paligo/uuid-cc9dfa1f-9277-fe9e-7d4a-92d5fb04d5d6.jpg differ diff --git a/static/img/_paligo/uuid-ccdbd639-8424-98d8-f569-ddf58f73cbec.png b/static/img/_paligo/uuid-ccdbd639-8424-98d8-f569-ddf58f73cbec.png new file mode 100644 index 0000000..d8735f7 Binary files /dev/null and b/static/img/_paligo/uuid-ccdbd639-8424-98d8-f569-ddf58f73cbec.png differ diff --git a/static/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png b/static/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png new file mode 100644 index 0000000..8080bcb Binary files /dev/null and b/static/img/_paligo/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png differ diff --git a/static/img/_paligo/uuid-ce7f8183-941b-0b73-92c2-185e235442ee.jpg b/static/img/_paligo/uuid-ce7f8183-941b-0b73-92c2-185e235442ee.jpg new file mode 100644 index 0000000..f994232 Binary files /dev/null and b/static/img/_paligo/uuid-ce7f8183-941b-0b73-92c2-185e235442ee.jpg differ diff --git a/static/img/_paligo/uuid-ce8ef015-6c7d-9b31-d3ce-69669a18b4ac.png b/static/img/_paligo/uuid-ce8ef015-6c7d-9b31-d3ce-69669a18b4ac.png new file mode 100644 index 0000000..c5d5343 Binary files /dev/null and b/static/img/_paligo/uuid-ce8ef015-6c7d-9b31-d3ce-69669a18b4ac.png differ diff --git a/static/img/_paligo/uuid-cf02074e-b629-4880-6b9c-92ee73910849.png b/static/img/_paligo/uuid-cf02074e-b629-4880-6b9c-92ee73910849.png new file mode 100644 index 0000000..cdd428f Binary files /dev/null and b/static/img/_paligo/uuid-cf02074e-b629-4880-6b9c-92ee73910849.png differ diff --git a/static/img/_paligo/uuid-cf217fec-a57c-6c47-f625-d7b47d74e9d5.png b/static/img/_paligo/uuid-cf217fec-a57c-6c47-f625-d7b47d74e9d5.png new file mode 100644 index 0000000..a79fc14 Binary files /dev/null and b/static/img/_paligo/uuid-cf217fec-a57c-6c47-f625-d7b47d74e9d5.png differ diff --git a/static/img/_paligo/uuid-cf53d41b-4a10-c359-3816-2f847f107db4.png b/static/img/_paligo/uuid-cf53d41b-4a10-c359-3816-2f847f107db4.png new file mode 100644 index 0000000..35ee03a Binary files /dev/null and b/static/img/_paligo/uuid-cf53d41b-4a10-c359-3816-2f847f107db4.png differ diff --git a/static/img/_paligo/uuid-cf5db37b-0d3a-2292-c706-28a35c9c342e.png b/static/img/_paligo/uuid-cf5db37b-0d3a-2292-c706-28a35c9c342e.png new file mode 100644 index 0000000..2bdf4c5 Binary files /dev/null and b/static/img/_paligo/uuid-cf5db37b-0d3a-2292-c706-28a35c9c342e.png differ diff --git a/static/img/_paligo/uuid-cf875ee5-ad50-e67e-eeb9-059ac158285d.png b/static/img/_paligo/uuid-cf875ee5-ad50-e67e-eeb9-059ac158285d.png new file mode 100644 index 0000000..5cb9855 Binary files /dev/null and b/static/img/_paligo/uuid-cf875ee5-ad50-e67e-eeb9-059ac158285d.png differ diff --git a/static/img/_paligo/uuid-cfafb8d7-1a0e-d967-5609-385cc5db90e2.jpg b/static/img/_paligo/uuid-cfafb8d7-1a0e-d967-5609-385cc5db90e2.jpg new file mode 100644 index 0000000..cff313c Binary files /dev/null and b/static/img/_paligo/uuid-cfafb8d7-1a0e-d967-5609-385cc5db90e2.jpg differ diff --git a/static/img/_paligo/uuid-cfb7fa41-a106-26b8-af03-a12058f5639f.png b/static/img/_paligo/uuid-cfb7fa41-a106-26b8-af03-a12058f5639f.png new file mode 100644 index 0000000..d90014e Binary files /dev/null and b/static/img/_paligo/uuid-cfb7fa41-a106-26b8-af03-a12058f5639f.png differ diff --git a/static/img/_paligo/uuid-cfe05e2a-2027-50fb-e4a8-56ef4164907f.jpg b/static/img/_paligo/uuid-cfe05e2a-2027-50fb-e4a8-56ef4164907f.jpg new file mode 100644 index 0000000..4223ab3 Binary files /dev/null and b/static/img/_paligo/uuid-cfe05e2a-2027-50fb-e4a8-56ef4164907f.jpg differ diff --git a/static/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg b/static/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg new file mode 100644 index 0000000..f8b6a47 --- /dev/null +++ b/static/img/_paligo/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/_paligo/uuid-d00d79a9-94d7-7bf0-fa17-b6e3adab0619.jpg b/static/img/_paligo/uuid-d00d79a9-94d7-7bf0-fa17-b6e3adab0619.jpg new file mode 100644 index 0000000..2cc9c9a Binary files /dev/null and b/static/img/_paligo/uuid-d00d79a9-94d7-7bf0-fa17-b6e3adab0619.jpg differ diff --git a/static/img/_paligo/uuid-d0da76d5-0ec1-fd85-9ebd-b8d529c150be.png b/static/img/_paligo/uuid-d0da76d5-0ec1-fd85-9ebd-b8d529c150be.png new file mode 100644 index 0000000..9ec1e5c Binary files /dev/null and b/static/img/_paligo/uuid-d0da76d5-0ec1-fd85-9ebd-b8d529c150be.png differ diff --git a/static/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png b/static/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png new file mode 100644 index 0000000..069fbfd Binary files /dev/null and b/static/img/_paligo/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png differ diff --git a/static/img/_paligo/uuid-d1f6b886-e707-4116-3eb6-331b765507ba.png b/static/img/_paligo/uuid-d1f6b886-e707-4116-3eb6-331b765507ba.png new file mode 100644 index 0000000..e3a0d42 Binary files /dev/null and b/static/img/_paligo/uuid-d1f6b886-e707-4116-3eb6-331b765507ba.png differ diff --git a/static/img/_paligo/uuid-d21f2840-9772-4870-9818-a3fd1162be1f.png b/static/img/_paligo/uuid-d21f2840-9772-4870-9818-a3fd1162be1f.png new file mode 100644 index 0000000..d5e8901 Binary files /dev/null and b/static/img/_paligo/uuid-d21f2840-9772-4870-9818-a3fd1162be1f.png differ diff --git a/static/img/_paligo/uuid-d24fc560-4da7-49d1-f0b4-e14e365fba68.png b/static/img/_paligo/uuid-d24fc560-4da7-49d1-f0b4-e14e365fba68.png new file mode 100644 index 0000000..b070e10 Binary files /dev/null and b/static/img/_paligo/uuid-d24fc560-4da7-49d1-f0b4-e14e365fba68.png differ diff --git a/static/img/_paligo/uuid-d2661447-265a-5f94-41dc-40c36c7acad6.png b/static/img/_paligo/uuid-d2661447-265a-5f94-41dc-40c36c7acad6.png new file mode 100644 index 0000000..e41bd43 Binary files /dev/null and b/static/img/_paligo/uuid-d2661447-265a-5f94-41dc-40c36c7acad6.png differ diff --git a/static/img/_paligo/uuid-d2e802df-0b0d-afba-f36c-ad6a9af244bb.png b/static/img/_paligo/uuid-d2e802df-0b0d-afba-f36c-ad6a9af244bb.png new file mode 100644 index 0000000..ff49911 Binary files /dev/null and b/static/img/_paligo/uuid-d2e802df-0b0d-afba-f36c-ad6a9af244bb.png differ diff --git a/static/img/_paligo/uuid-d2ee7fd1-7743-7720-d114-5f38632cd2e1.png b/static/img/_paligo/uuid-d2ee7fd1-7743-7720-d114-5f38632cd2e1.png new file mode 100644 index 0000000..93b78ae Binary files /dev/null and b/static/img/_paligo/uuid-d2ee7fd1-7743-7720-d114-5f38632cd2e1.png differ diff --git a/static/img/_paligo/uuid-d36425af-6967-473f-d8d7-07fdaed7ebc1.png b/static/img/_paligo/uuid-d36425af-6967-473f-d8d7-07fdaed7ebc1.png new file mode 100644 index 0000000..e632fbb Binary files /dev/null and b/static/img/_paligo/uuid-d36425af-6967-473f-d8d7-07fdaed7ebc1.png differ diff --git a/static/img/_paligo/uuid-d39167fc-7bd0-258f-a6c6-01eb7ca58268.png b/static/img/_paligo/uuid-d39167fc-7bd0-258f-a6c6-01eb7ca58268.png new file mode 100644 index 0000000..01e4f0a Binary files /dev/null and b/static/img/_paligo/uuid-d39167fc-7bd0-258f-a6c6-01eb7ca58268.png differ diff --git a/static/img/_paligo/uuid-d3db0692-cdd1-86cb-615a-955fd97587e9.png b/static/img/_paligo/uuid-d3db0692-cdd1-86cb-615a-955fd97587e9.png new file mode 100644 index 0000000..a2a32f4 Binary files /dev/null and b/static/img/_paligo/uuid-d3db0692-cdd1-86cb-615a-955fd97587e9.png differ diff --git a/static/img/_paligo/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg b/static/img/_paligo/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg new file mode 100644 index 0000000..4448eb3 Binary files /dev/null and b/static/img/_paligo/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg differ diff --git a/static/img/_paligo/uuid-d50cbc2f-3b77-a344-44dc-2a45449893e1.png b/static/img/_paligo/uuid-d50cbc2f-3b77-a344-44dc-2a45449893e1.png new file mode 100644 index 0000000..53d5a44 Binary files /dev/null and b/static/img/_paligo/uuid-d50cbc2f-3b77-a344-44dc-2a45449893e1.png differ diff --git a/static/img/_paligo/uuid-d5bbba7f-b660-6c42-3745-ce80f0c72abf.png b/static/img/_paligo/uuid-d5bbba7f-b660-6c42-3745-ce80f0c72abf.png new file mode 100644 index 0000000..7e95c6d Binary files /dev/null and b/static/img/_paligo/uuid-d5bbba7f-b660-6c42-3745-ce80f0c72abf.png differ diff --git a/static/img/_paligo/uuid-d5eac9a8-1c74-efd6-459a-aaa24af4877a.jpg b/static/img/_paligo/uuid-d5eac9a8-1c74-efd6-459a-aaa24af4877a.jpg new file mode 100644 index 0000000..3465841 Binary files /dev/null and b/static/img/_paligo/uuid-d5eac9a8-1c74-efd6-459a-aaa24af4877a.jpg differ diff --git a/static/img/_paligo/uuid-d626ceb8-0cf3-d459-5cd7-9e59e0fef81a.jpg b/static/img/_paligo/uuid-d626ceb8-0cf3-d459-5cd7-9e59e0fef81a.jpg new file mode 100644 index 0000000..bb507c2 Binary files /dev/null and b/static/img/_paligo/uuid-d626ceb8-0cf3-d459-5cd7-9e59e0fef81a.jpg differ diff --git a/static/img/_paligo/uuid-d6541f5d-351c-81f9-7a8b-41cfa8c1a21d.png b/static/img/_paligo/uuid-d6541f5d-351c-81f9-7a8b-41cfa8c1a21d.png new file mode 100644 index 0000000..30a5bd3 Binary files /dev/null and b/static/img/_paligo/uuid-d6541f5d-351c-81f9-7a8b-41cfa8c1a21d.png differ diff --git a/static/img/_paligo/uuid-d6600b5b-3ad8-aee2-a28b-62f4ca2b1394.jpg b/static/img/_paligo/uuid-d6600b5b-3ad8-aee2-a28b-62f4ca2b1394.jpg new file mode 100644 index 0000000..d7f17c9 Binary files /dev/null and b/static/img/_paligo/uuid-d6600b5b-3ad8-aee2-a28b-62f4ca2b1394.jpg differ diff --git a/static/img/_paligo/uuid-d696a899-d634-978b-1d7d-037f0a01ee5b.png b/static/img/_paligo/uuid-d696a899-d634-978b-1d7d-037f0a01ee5b.png new file mode 100644 index 0000000..57f6175 Binary files /dev/null and b/static/img/_paligo/uuid-d696a899-d634-978b-1d7d-037f0a01ee5b.png differ diff --git a/static/img/_paligo/uuid-d6dbb0ec-3447-10ab-ba08-1bf5731153be.png b/static/img/_paligo/uuid-d6dbb0ec-3447-10ab-ba08-1bf5731153be.png new file mode 100644 index 0000000..1594dc6 Binary files /dev/null and b/static/img/_paligo/uuid-d6dbb0ec-3447-10ab-ba08-1bf5731153be.png differ diff --git a/static/img/_paligo/uuid-d7118397-afd2-fcec-a464-e6537b882068.png b/static/img/_paligo/uuid-d7118397-afd2-fcec-a464-e6537b882068.png new file mode 100644 index 0000000..933a942 Binary files /dev/null and b/static/img/_paligo/uuid-d7118397-afd2-fcec-a464-e6537b882068.png differ diff --git a/static/img/_paligo/uuid-d7b270fb-8c64-ce2d-c083-c1dbcfdde87f.png b/static/img/_paligo/uuid-d7b270fb-8c64-ce2d-c083-c1dbcfdde87f.png new file mode 100644 index 0000000..d6aad97 Binary files /dev/null and b/static/img/_paligo/uuid-d7b270fb-8c64-ce2d-c083-c1dbcfdde87f.png differ diff --git a/static/img/_paligo/uuid-d83ea44a-429d-83ab-21eb-531ce6ce8416.png b/static/img/_paligo/uuid-d83ea44a-429d-83ab-21eb-531ce6ce8416.png new file mode 100644 index 0000000..85d5c9c Binary files /dev/null and b/static/img/_paligo/uuid-d83ea44a-429d-83ab-21eb-531ce6ce8416.png differ diff --git a/static/img/_paligo/uuid-d84d9f1d-68d7-2706-a7cb-b2023ffe96a5.png b/static/img/_paligo/uuid-d84d9f1d-68d7-2706-a7cb-b2023ffe96a5.png new file mode 100644 index 0000000..844fd7e Binary files /dev/null and b/static/img/_paligo/uuid-d84d9f1d-68d7-2706-a7cb-b2023ffe96a5.png differ diff --git a/static/img/_paligo/uuid-d85ee7fd-2f40-5ae8-34ce-c79f638f3879.png b/static/img/_paligo/uuid-d85ee7fd-2f40-5ae8-34ce-c79f638f3879.png new file mode 100644 index 0000000..2c16e67 Binary files /dev/null and b/static/img/_paligo/uuid-d85ee7fd-2f40-5ae8-34ce-c79f638f3879.png differ diff --git a/static/img/_paligo/uuid-d8a157ed-518f-ad9c-67bb-e66a50263ab7.png b/static/img/_paligo/uuid-d8a157ed-518f-ad9c-67bb-e66a50263ab7.png new file mode 100644 index 0000000..c66d3a8 Binary files /dev/null and b/static/img/_paligo/uuid-d8a157ed-518f-ad9c-67bb-e66a50263ab7.png differ diff --git a/static/img/_paligo/uuid-d981eb34-fe27-6796-ff24-0e9206369758.png b/static/img/_paligo/uuid-d981eb34-fe27-6796-ff24-0e9206369758.png new file mode 100644 index 0000000..4c4d72c Binary files /dev/null and b/static/img/_paligo/uuid-d981eb34-fe27-6796-ff24-0e9206369758.png differ diff --git a/static/img/_paligo/uuid-d9ad5624-810e-4fbf-507a-f900e03620e5.png b/static/img/_paligo/uuid-d9ad5624-810e-4fbf-507a-f900e03620e5.png new file mode 100644 index 0000000..ff191a3 Binary files /dev/null and b/static/img/_paligo/uuid-d9ad5624-810e-4fbf-507a-f900e03620e5.png differ diff --git a/static/img/_paligo/uuid-da7593a8-e6df-1d97-e903-d375dc504b05.jpg b/static/img/_paligo/uuid-da7593a8-e6df-1d97-e903-d375dc504b05.jpg new file mode 100644 index 0000000..0c31401 Binary files /dev/null and b/static/img/_paligo/uuid-da7593a8-e6df-1d97-e903-d375dc504b05.jpg differ diff --git a/static/img/_paligo/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png b/static/img/_paligo/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png new file mode 100644 index 0000000..bb3a09f Binary files /dev/null and b/static/img/_paligo/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png differ diff --git a/static/img/_paligo/uuid-da9ac0ed-a8fe-0d52-3e66-a8195414d1fa.png b/static/img/_paligo/uuid-da9ac0ed-a8fe-0d52-3e66-a8195414d1fa.png new file mode 100644 index 0000000..860a9f0 Binary files /dev/null and b/static/img/_paligo/uuid-da9ac0ed-a8fe-0d52-3e66-a8195414d1fa.png differ diff --git a/static/img/_paligo/uuid-dada2b23-2bc7-5796-3d98-9131dbaa2a87.png b/static/img/_paligo/uuid-dada2b23-2bc7-5796-3d98-9131dbaa2a87.png new file mode 100644 index 0000000..95d97b3 Binary files /dev/null and b/static/img/_paligo/uuid-dada2b23-2bc7-5796-3d98-9131dbaa2a87.png differ diff --git a/static/img/_paligo/uuid-dbb181a9-053e-bed3-133f-11e485313efa.gif b/static/img/_paligo/uuid-dbb181a9-053e-bed3-133f-11e485313efa.gif new file mode 100644 index 0000000..f394724 Binary files /dev/null and b/static/img/_paligo/uuid-dbb181a9-053e-bed3-133f-11e485313efa.gif differ diff --git a/static/img/_paligo/uuid-dbe3dd32-b361-1fe0-2883-cf93cd64102d.png b/static/img/_paligo/uuid-dbe3dd32-b361-1fe0-2883-cf93cd64102d.png new file mode 100644 index 0000000..775b3cf Binary files /dev/null and b/static/img/_paligo/uuid-dbe3dd32-b361-1fe0-2883-cf93cd64102d.png differ diff --git a/static/img/_paligo/uuid-dbf18dae-38c9-f32a-fb61-6afbb08edb2f.png b/static/img/_paligo/uuid-dbf18dae-38c9-f32a-fb61-6afbb08edb2f.png new file mode 100644 index 0000000..ce0b13f Binary files /dev/null and b/static/img/_paligo/uuid-dbf18dae-38c9-f32a-fb61-6afbb08edb2f.png differ diff --git a/static/img/_paligo/uuid-dc3bfafa-9720-8935-557a-97c317a8a624.png b/static/img/_paligo/uuid-dc3bfafa-9720-8935-557a-97c317a8a624.png new file mode 100644 index 0000000..56b39d2 Binary files /dev/null and b/static/img/_paligo/uuid-dc3bfafa-9720-8935-557a-97c317a8a624.png differ diff --git a/static/img/_paligo/uuid-dca4e3b0-8c11-d444-23c9-b5ae0f21990d.jpg b/static/img/_paligo/uuid-dca4e3b0-8c11-d444-23c9-b5ae0f21990d.jpg new file mode 100644 index 0000000..dcea81f Binary files /dev/null and b/static/img/_paligo/uuid-dca4e3b0-8c11-d444-23c9-b5ae0f21990d.jpg differ diff --git a/static/img/_paligo/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg b/static/img/_paligo/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg new file mode 100644 index 0000000..085bac8 Binary files /dev/null and b/static/img/_paligo/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg differ diff --git a/static/img/_paligo/uuid-dd9a98bf-41aa-d933-c06f-34d69bb56148.png b/static/img/_paligo/uuid-dd9a98bf-41aa-d933-c06f-34d69bb56148.png new file mode 100644 index 0000000..cd1acf9 Binary files /dev/null and b/static/img/_paligo/uuid-dd9a98bf-41aa-d933-c06f-34d69bb56148.png differ diff --git a/static/img/_paligo/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg b/static/img/_paligo/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg new file mode 100644 index 0000000..50ba665 Binary files /dev/null and b/static/img/_paligo/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg differ diff --git a/static/img/_paligo/uuid-de743a8c-7a79-dda4-b9de-e3c71f2ac32a.png b/static/img/_paligo/uuid-de743a8c-7a79-dda4-b9de-e3c71f2ac32a.png new file mode 100644 index 0000000..545f1bf Binary files /dev/null and b/static/img/_paligo/uuid-de743a8c-7a79-dda4-b9de-e3c71f2ac32a.png differ diff --git a/static/img/_paligo/uuid-df55cc4e-3e1f-2b08-c111-6e0a231065fd.png b/static/img/_paligo/uuid-df55cc4e-3e1f-2b08-c111-6e0a231065fd.png new file mode 100644 index 0000000..0c4730b Binary files /dev/null and b/static/img/_paligo/uuid-df55cc4e-3e1f-2b08-c111-6e0a231065fd.png differ diff --git a/static/img/_paligo/uuid-e05bd9fd-2b96-f6dd-9d2b-b3ad8ba5510e.png b/static/img/_paligo/uuid-e05bd9fd-2b96-f6dd-9d2b-b3ad8ba5510e.png new file mode 100644 index 0000000..10d3a8f Binary files /dev/null and b/static/img/_paligo/uuid-e05bd9fd-2b96-f6dd-9d2b-b3ad8ba5510e.png differ diff --git a/static/img/_paligo/uuid-e09272e9-48fe-2dba-c52c-24b79391c293.png b/static/img/_paligo/uuid-e09272e9-48fe-2dba-c52c-24b79391c293.png new file mode 100644 index 0000000..ce0a57c Binary files /dev/null and b/static/img/_paligo/uuid-e09272e9-48fe-2dba-c52c-24b79391c293.png differ diff --git a/static/img/_paligo/uuid-e09eda1b-3f0e-58ce-ab3f-979d05e557e6.png b/static/img/_paligo/uuid-e09eda1b-3f0e-58ce-ab3f-979d05e557e6.png new file mode 100644 index 0000000..a3d19e2 Binary files /dev/null and b/static/img/_paligo/uuid-e09eda1b-3f0e-58ce-ab3f-979d05e557e6.png differ diff --git a/static/img/_paligo/uuid-e0c8a32c-f635-adb8-8380-03c13b38026d.png b/static/img/_paligo/uuid-e0c8a32c-f635-adb8-8380-03c13b38026d.png new file mode 100644 index 0000000..352eb31 Binary files /dev/null and b/static/img/_paligo/uuid-e0c8a32c-f635-adb8-8380-03c13b38026d.png differ diff --git a/static/img/_paligo/uuid-e0ec0de8-1ae0-a3e9-ea57-fb0fa50b58df.png b/static/img/_paligo/uuid-e0ec0de8-1ae0-a3e9-ea57-fb0fa50b58df.png new file mode 100644 index 0000000..05c1467 Binary files /dev/null and b/static/img/_paligo/uuid-e0ec0de8-1ae0-a3e9-ea57-fb0fa50b58df.png differ diff --git a/static/img/_paligo/uuid-e1c9e6b8-a0cf-6513-8b88-7ad65a2df1fe.png b/static/img/_paligo/uuid-e1c9e6b8-a0cf-6513-8b88-7ad65a2df1fe.png new file mode 100644 index 0000000..551673e Binary files /dev/null and b/static/img/_paligo/uuid-e1c9e6b8-a0cf-6513-8b88-7ad65a2df1fe.png differ diff --git a/static/img/_paligo/uuid-e1e79927-bba9-65ca-01a5-24ef83efe442.png b/static/img/_paligo/uuid-e1e79927-bba9-65ca-01a5-24ef83efe442.png new file mode 100644 index 0000000..037c449 Binary files /dev/null and b/static/img/_paligo/uuid-e1e79927-bba9-65ca-01a5-24ef83efe442.png differ diff --git a/static/img/_paligo/uuid-e3205cde-6fb9-f316-9666-a22617129183.png b/static/img/_paligo/uuid-e3205cde-6fb9-f316-9666-a22617129183.png new file mode 100644 index 0000000..944d366 Binary files /dev/null and b/static/img/_paligo/uuid-e3205cde-6fb9-f316-9666-a22617129183.png differ diff --git a/static/img/_paligo/uuid-e39aa886-e484-fe54-2563-8d5295796112.png b/static/img/_paligo/uuid-e39aa886-e484-fe54-2563-8d5295796112.png new file mode 100644 index 0000000..f969761 Binary files /dev/null and b/static/img/_paligo/uuid-e39aa886-e484-fe54-2563-8d5295796112.png differ diff --git a/static/img/_paligo/uuid-e444bc09-0aed-9c9d-6ebb-8531a391fb75.png b/static/img/_paligo/uuid-e444bc09-0aed-9c9d-6ebb-8531a391fb75.png new file mode 100644 index 0000000..4ba283a Binary files /dev/null and b/static/img/_paligo/uuid-e444bc09-0aed-9c9d-6ebb-8531a391fb75.png differ diff --git a/static/img/_paligo/uuid-e4db471e-3219-872f-8c6f-7aa194b7f156.png b/static/img/_paligo/uuid-e4db471e-3219-872f-8c6f-7aa194b7f156.png new file mode 100644 index 0000000..9a592bd Binary files /dev/null and b/static/img/_paligo/uuid-e4db471e-3219-872f-8c6f-7aa194b7f156.png differ diff --git a/static/img/_paligo/uuid-e5013e56-2f65-12a8-c6c7-ba34733cde57.png b/static/img/_paligo/uuid-e5013e56-2f65-12a8-c6c7-ba34733cde57.png new file mode 100644 index 0000000..3776f71 Binary files /dev/null and b/static/img/_paligo/uuid-e5013e56-2f65-12a8-c6c7-ba34733cde57.png differ diff --git a/static/img/_paligo/uuid-e51ea807-fef9-bfc9-8666-2092740c7a52.png b/static/img/_paligo/uuid-e51ea807-fef9-bfc9-8666-2092740c7a52.png new file mode 100644 index 0000000..daaec37 Binary files /dev/null and b/static/img/_paligo/uuid-e51ea807-fef9-bfc9-8666-2092740c7a52.png differ diff --git a/static/img/_paligo/uuid-e5387f19-bcbb-472b-a2fa-9c9d9aeb1c6d.png b/static/img/_paligo/uuid-e5387f19-bcbb-472b-a2fa-9c9d9aeb1c6d.png new file mode 100644 index 0000000..70ac0f6 Binary files /dev/null and b/static/img/_paligo/uuid-e5387f19-bcbb-472b-a2fa-9c9d9aeb1c6d.png differ diff --git a/static/img/_paligo/uuid-e5531ad0-351f-de58-e68e-320c039ab434.png b/static/img/_paligo/uuid-e5531ad0-351f-de58-e68e-320c039ab434.png new file mode 100644 index 0000000..c2d9651 Binary files /dev/null and b/static/img/_paligo/uuid-e5531ad0-351f-de58-e68e-320c039ab434.png differ diff --git a/static/img/_paligo/uuid-e6cb3a32-c73c-f0cb-e7fe-9eab8e908679.png b/static/img/_paligo/uuid-e6cb3a32-c73c-f0cb-e7fe-9eab8e908679.png new file mode 100644 index 0000000..a8ada32 Binary files /dev/null and b/static/img/_paligo/uuid-e6cb3a32-c73c-f0cb-e7fe-9eab8e908679.png differ diff --git a/static/img/_paligo/uuid-e786c907-9370-70be-0d2f-7c9c6f028ac7.jpg b/static/img/_paligo/uuid-e786c907-9370-70be-0d2f-7c9c6f028ac7.jpg new file mode 100644 index 0000000..a49e844 Binary files /dev/null and b/static/img/_paligo/uuid-e786c907-9370-70be-0d2f-7c9c6f028ac7.jpg differ diff --git a/static/img/_paligo/uuid-e85b689a-0101-6664-7f58-6e9ae5c851a7.png b/static/img/_paligo/uuid-e85b689a-0101-6664-7f58-6e9ae5c851a7.png new file mode 100644 index 0000000..be454ed Binary files /dev/null and b/static/img/_paligo/uuid-e85b689a-0101-6664-7f58-6e9ae5c851a7.png differ diff --git a/static/img/_paligo/uuid-e94688f6-c068-8c29-201a-bba3c7373dca.png b/static/img/_paligo/uuid-e94688f6-c068-8c29-201a-bba3c7373dca.png new file mode 100644 index 0000000..39d51c5 Binary files /dev/null and b/static/img/_paligo/uuid-e94688f6-c068-8c29-201a-bba3c7373dca.png differ diff --git a/static/img/_paligo/uuid-e960a587-dfa0-3b5d-aad8-6d03208a3ad6.jpg b/static/img/_paligo/uuid-e960a587-dfa0-3b5d-aad8-6d03208a3ad6.jpg new file mode 100644 index 0000000..1ab1bd2 Binary files /dev/null and b/static/img/_paligo/uuid-e960a587-dfa0-3b5d-aad8-6d03208a3ad6.jpg differ diff --git a/static/img/_paligo/uuid-ea11f723-edcb-2e88-0d83-c4c60f1cb794.png b/static/img/_paligo/uuid-ea11f723-edcb-2e88-0d83-c4c60f1cb794.png new file mode 100644 index 0000000..1dd0928 Binary files /dev/null and b/static/img/_paligo/uuid-ea11f723-edcb-2e88-0d83-c4c60f1cb794.png differ diff --git a/static/img/_paligo/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png b/static/img/_paligo/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png new file mode 100644 index 0000000..9126ccc Binary files /dev/null and b/static/img/_paligo/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png differ diff --git a/static/img/_paligo/uuid-ea47d90b-0ff0-7cd5-2f80-4013e10f7fb3.png b/static/img/_paligo/uuid-ea47d90b-0ff0-7cd5-2f80-4013e10f7fb3.png new file mode 100644 index 0000000..69f7d18 Binary files /dev/null and b/static/img/_paligo/uuid-ea47d90b-0ff0-7cd5-2f80-4013e10f7fb3.png differ diff --git a/static/img/_paligo/uuid-ea5d2cad-6d99-e1e7-e389-6cb1c2170256.jpg b/static/img/_paligo/uuid-ea5d2cad-6d99-e1e7-e389-6cb1c2170256.jpg new file mode 100644 index 0000000..6438e59 Binary files /dev/null and b/static/img/_paligo/uuid-ea5d2cad-6d99-e1e7-e389-6cb1c2170256.jpg differ diff --git a/static/img/_paligo/uuid-eaa066c4-99be-c8a5-9990-fe4a08a4154c.jpg b/static/img/_paligo/uuid-eaa066c4-99be-c8a5-9990-fe4a08a4154c.jpg new file mode 100644 index 0000000..dcc67d5 Binary files /dev/null and b/static/img/_paligo/uuid-eaa066c4-99be-c8a5-9990-fe4a08a4154c.jpg differ diff --git a/static/img/_paligo/uuid-ec4d7f8f-0f68-0f4f-806f-64114da6716f.png b/static/img/_paligo/uuid-ec4d7f8f-0f68-0f4f-806f-64114da6716f.png new file mode 100644 index 0000000..05cf01f Binary files /dev/null and b/static/img/_paligo/uuid-ec4d7f8f-0f68-0f4f-806f-64114da6716f.png differ diff --git a/static/img/_paligo/uuid-ecd84027-5433-4ce8-cfbe-bbd61a77c095.png b/static/img/_paligo/uuid-ecd84027-5433-4ce8-cfbe-bbd61a77c095.png new file mode 100644 index 0000000..798c3a7 Binary files /dev/null and b/static/img/_paligo/uuid-ecd84027-5433-4ce8-cfbe-bbd61a77c095.png differ diff --git a/static/img/_paligo/uuid-ed1aa9a4-7926-3cfe-bf98-ac0f98a44237.jpg b/static/img/_paligo/uuid-ed1aa9a4-7926-3cfe-bf98-ac0f98a44237.jpg new file mode 100644 index 0000000..d608744 Binary files /dev/null and b/static/img/_paligo/uuid-ed1aa9a4-7926-3cfe-bf98-ac0f98a44237.jpg differ diff --git a/static/img/_paligo/uuid-ed3b91d2-8138-ca73-f9f2-048ab808f5ca.png b/static/img/_paligo/uuid-ed3b91d2-8138-ca73-f9f2-048ab808f5ca.png new file mode 100644 index 0000000..86db8f9 Binary files /dev/null and b/static/img/_paligo/uuid-ed3b91d2-8138-ca73-f9f2-048ab808f5ca.png differ diff --git a/static/img/_paligo/uuid-ed66ae06-8ebc-cb93-e3e3-ce6c2e94b1de.png b/static/img/_paligo/uuid-ed66ae06-8ebc-cb93-e3e3-ce6c2e94b1de.png new file mode 100644 index 0000000..a04c63a Binary files /dev/null and b/static/img/_paligo/uuid-ed66ae06-8ebc-cb93-e3e3-ce6c2e94b1de.png differ diff --git a/static/img/_paligo/uuid-ee309b75-e71d-aaea-5b0f-2477d3c77231.png b/static/img/_paligo/uuid-ee309b75-e71d-aaea-5b0f-2477d3c77231.png new file mode 100644 index 0000000..0e7893a Binary files /dev/null and b/static/img/_paligo/uuid-ee309b75-e71d-aaea-5b0f-2477d3c77231.png differ diff --git a/static/img/_paligo/uuid-ee43070a-a23d-02a4-3860-9899749044e2.png b/static/img/_paligo/uuid-ee43070a-a23d-02a4-3860-9899749044e2.png new file mode 100644 index 0000000..5d6a9b0 Binary files /dev/null and b/static/img/_paligo/uuid-ee43070a-a23d-02a4-3860-9899749044e2.png differ diff --git a/static/img/_paligo/uuid-ee6c9c9d-82a3-5470-9e0d-f5dd4f971414.jpg b/static/img/_paligo/uuid-ee6c9c9d-82a3-5470-9e0d-f5dd4f971414.jpg new file mode 100644 index 0000000..687c66d Binary files /dev/null and b/static/img/_paligo/uuid-ee6c9c9d-82a3-5470-9e0d-f5dd4f971414.jpg differ diff --git a/static/img/_paligo/uuid-eebfeceb-3b6a-7e5d-3f3e-4431b4c200ba.png b/static/img/_paligo/uuid-eebfeceb-3b6a-7e5d-3f3e-4431b4c200ba.png new file mode 100644 index 0000000..f411ae3 Binary files /dev/null and b/static/img/_paligo/uuid-eebfeceb-3b6a-7e5d-3f3e-4431b4c200ba.png differ diff --git a/static/img/_paligo/uuid-eec007b7-1459-0f25-5112-9c312f47a189.png b/static/img/_paligo/uuid-eec007b7-1459-0f25-5112-9c312f47a189.png new file mode 100644 index 0000000..74ac18a Binary files /dev/null and b/static/img/_paligo/uuid-eec007b7-1459-0f25-5112-9c312f47a189.png differ diff --git a/static/img/_paligo/uuid-eeea6d87-30fd-8069-c988-d71da65580db.png b/static/img/_paligo/uuid-eeea6d87-30fd-8069-c988-d71da65580db.png new file mode 100644 index 0000000..5588901 Binary files /dev/null and b/static/img/_paligo/uuid-eeea6d87-30fd-8069-c988-d71da65580db.png differ diff --git a/static/img/_paligo/uuid-eefe9d3d-ab41-f2c3-9657-97994dab1f73.png b/static/img/_paligo/uuid-eefe9d3d-ab41-f2c3-9657-97994dab1f73.png new file mode 100644 index 0000000..963ad60 Binary files /dev/null and b/static/img/_paligo/uuid-eefe9d3d-ab41-f2c3-9657-97994dab1f73.png differ diff --git a/static/img/_paligo/uuid-ef391d65-8868-242c-c6b6-380d117676b7.png b/static/img/_paligo/uuid-ef391d65-8868-242c-c6b6-380d117676b7.png new file mode 100644 index 0000000..5ba0850 Binary files /dev/null and b/static/img/_paligo/uuid-ef391d65-8868-242c-c6b6-380d117676b7.png differ diff --git a/static/img/_paligo/uuid-efe62dac-0331-a3e4-6bf8-57318826bcd3.png b/static/img/_paligo/uuid-efe62dac-0331-a3e4-6bf8-57318826bcd3.png new file mode 100644 index 0000000..59bb9f6 Binary files /dev/null and b/static/img/_paligo/uuid-efe62dac-0331-a3e4-6bf8-57318826bcd3.png differ diff --git a/static/img/_paligo/uuid-f021126a-47d0-41a9-56f7-79b9c8461a0e.png b/static/img/_paligo/uuid-f021126a-47d0-41a9-56f7-79b9c8461a0e.png new file mode 100644 index 0000000..aca2804 Binary files /dev/null and b/static/img/_paligo/uuid-f021126a-47d0-41a9-56f7-79b9c8461a0e.png differ diff --git a/static/img/_paligo/uuid-f06634d9-f49d-0cc1-0c09-3d660920c3ba.png b/static/img/_paligo/uuid-f06634d9-f49d-0cc1-0c09-3d660920c3ba.png new file mode 100644 index 0000000..852f7d4 Binary files /dev/null and b/static/img/_paligo/uuid-f06634d9-f49d-0cc1-0c09-3d660920c3ba.png differ diff --git a/static/img/_paligo/uuid-f06ef542-d72d-5bed-0c22-4d729b330691.png b/static/img/_paligo/uuid-f06ef542-d72d-5bed-0c22-4d729b330691.png new file mode 100644 index 0000000..33faaa6 Binary files /dev/null and b/static/img/_paligo/uuid-f06ef542-d72d-5bed-0c22-4d729b330691.png differ diff --git a/static/img/_paligo/uuid-f07c26d9-ec9e-bcab-3f8e-184408ae7fc2.png b/static/img/_paligo/uuid-f07c26d9-ec9e-bcab-3f8e-184408ae7fc2.png new file mode 100644 index 0000000..0f2bbad Binary files /dev/null and b/static/img/_paligo/uuid-f07c26d9-ec9e-bcab-3f8e-184408ae7fc2.png differ diff --git a/static/img/_paligo/uuid-f0843f8b-8b7d-e417-cbee-54224507d25a.png b/static/img/_paligo/uuid-f0843f8b-8b7d-e417-cbee-54224507d25a.png new file mode 100644 index 0000000..48bc365 Binary files /dev/null and b/static/img/_paligo/uuid-f0843f8b-8b7d-e417-cbee-54224507d25a.png differ diff --git a/static/img/_paligo/uuid-f0d69f0f-dab5-e9e9-b142-a9a5d584d1a6.png b/static/img/_paligo/uuid-f0d69f0f-dab5-e9e9-b142-a9a5d584d1a6.png new file mode 100644 index 0000000..b867104 Binary files /dev/null and b/static/img/_paligo/uuid-f0d69f0f-dab5-e9e9-b142-a9a5d584d1a6.png differ diff --git a/static/img/_paligo/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg b/static/img/_paligo/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg new file mode 100644 index 0000000..4da8090 Binary files /dev/null and b/static/img/_paligo/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg differ diff --git a/static/img/_paligo/uuid-f1483521-2b52-d69c-9cbb-ae0eff053094.png b/static/img/_paligo/uuid-f1483521-2b52-d69c-9cbb-ae0eff053094.png new file mode 100644 index 0000000..d1c6984 Binary files /dev/null and b/static/img/_paligo/uuid-f1483521-2b52-d69c-9cbb-ae0eff053094.png differ diff --git a/static/img/_paligo/uuid-f1bdccd2-c501-e9ae-ace8-61c3c7e82a9b.png b/static/img/_paligo/uuid-f1bdccd2-c501-e9ae-ace8-61c3c7e82a9b.png new file mode 100644 index 0000000..bfde7e0 Binary files /dev/null and b/static/img/_paligo/uuid-f1bdccd2-c501-e9ae-ace8-61c3c7e82a9b.png differ diff --git a/static/img/_paligo/uuid-f20ee280-d116-8015-6f87-2fd8b74da9a2.png b/static/img/_paligo/uuid-f20ee280-d116-8015-6f87-2fd8b74da9a2.png new file mode 100644 index 0000000..a6d5dda Binary files /dev/null and b/static/img/_paligo/uuid-f20ee280-d116-8015-6f87-2fd8b74da9a2.png differ diff --git a/static/img/_paligo/uuid-f2b44f50-8b8a-8c8e-48dd-c12a800692d0.png b/static/img/_paligo/uuid-f2b44f50-8b8a-8c8e-48dd-c12a800692d0.png new file mode 100644 index 0000000..a880a00 Binary files /dev/null and b/static/img/_paligo/uuid-f2b44f50-8b8a-8c8e-48dd-c12a800692d0.png differ diff --git a/static/img/_paligo/uuid-f2b9bb79-63bb-0c15-7e8d-4304c3fa2a51.png b/static/img/_paligo/uuid-f2b9bb79-63bb-0c15-7e8d-4304c3fa2a51.png new file mode 100644 index 0000000..26e68c9 Binary files /dev/null and b/static/img/_paligo/uuid-f2b9bb79-63bb-0c15-7e8d-4304c3fa2a51.png differ diff --git a/static/img/_paligo/uuid-f316a946-dc82-c3b9-9e73-a65f9f12349c.png b/static/img/_paligo/uuid-f316a946-dc82-c3b9-9e73-a65f9f12349c.png new file mode 100644 index 0000000..7accdf3 Binary files /dev/null and b/static/img/_paligo/uuid-f316a946-dc82-c3b9-9e73-a65f9f12349c.png differ diff --git a/static/img/_paligo/uuid-f52635e0-c0c6-f09a-042a-4d8e785fb35c.png b/static/img/_paligo/uuid-f52635e0-c0c6-f09a-042a-4d8e785fb35c.png new file mode 100644 index 0000000..09fad49 Binary files /dev/null and b/static/img/_paligo/uuid-f52635e0-c0c6-f09a-042a-4d8e785fb35c.png differ diff --git a/static/img/_paligo/uuid-f545c6a6-701f-485f-c852-70ed2222392a.png b/static/img/_paligo/uuid-f545c6a6-701f-485f-c852-70ed2222392a.png new file mode 100644 index 0000000..55fa770 Binary files /dev/null and b/static/img/_paligo/uuid-f545c6a6-701f-485f-c852-70ed2222392a.png differ diff --git a/static/img/_paligo/uuid-f5c2904f-3e0b-71ae-b96a-b6059f61bed2.svg b/static/img/_paligo/uuid-f5c2904f-3e0b-71ae-b96a-b6059f61bed2.svg new file mode 100644 index 0000000..0bac144 --- /dev/null +++ b/static/img/_paligo/uuid-f5c2904f-3e0b-71ae-b96a-b6059f61bed2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/_paligo/uuid-f5f86a6c-d609-1970-a451-0de6d5b4edb3.png b/static/img/_paligo/uuid-f5f86a6c-d609-1970-a451-0de6d5b4edb3.png new file mode 100644 index 0000000..d4458f2 Binary files /dev/null and b/static/img/_paligo/uuid-f5f86a6c-d609-1970-a451-0de6d5b4edb3.png differ diff --git a/static/img/_paligo/uuid-f63b2a01-2f9d-fb91-dc1d-a94aa4d3e386.png b/static/img/_paligo/uuid-f63b2a01-2f9d-fb91-dc1d-a94aa4d3e386.png new file mode 100644 index 0000000..e93dce3 Binary files /dev/null and b/static/img/_paligo/uuid-f63b2a01-2f9d-fb91-dc1d-a94aa4d3e386.png differ diff --git a/static/img/_paligo/uuid-f6505a6f-5c4e-7cf1-8a81-f8325898b1be.jpg b/static/img/_paligo/uuid-f6505a6f-5c4e-7cf1-8a81-f8325898b1be.jpg new file mode 100644 index 0000000..60a4a28 Binary files /dev/null and b/static/img/_paligo/uuid-f6505a6f-5c4e-7cf1-8a81-f8325898b1be.jpg differ diff --git a/static/img/_paligo/uuid-f655a8a5-c151-d103-6de5-55a0b3355322.jpg b/static/img/_paligo/uuid-f655a8a5-c151-d103-6de5-55a0b3355322.jpg new file mode 100644 index 0000000..1b6ed96 Binary files /dev/null and b/static/img/_paligo/uuid-f655a8a5-c151-d103-6de5-55a0b3355322.jpg differ diff --git a/static/img/_paligo/uuid-f87af39b-bb44-1167-0051-389e3b38c612.png b/static/img/_paligo/uuid-f87af39b-bb44-1167-0051-389e3b38c612.png new file mode 100644 index 0000000..9ee9fc3 Binary files /dev/null and b/static/img/_paligo/uuid-f87af39b-bb44-1167-0051-389e3b38c612.png differ diff --git a/static/img/_paligo/uuid-f8d70389-5398-fa2c-3a98-db70ffa63853.png b/static/img/_paligo/uuid-f8d70389-5398-fa2c-3a98-db70ffa63853.png new file mode 100644 index 0000000..4d5540a Binary files /dev/null and b/static/img/_paligo/uuid-f8d70389-5398-fa2c-3a98-db70ffa63853.png differ diff --git a/static/img/_paligo/uuid-f90189a9-c8f8-0720-69f3-b02983eb74f3.jpg b/static/img/_paligo/uuid-f90189a9-c8f8-0720-69f3-b02983eb74f3.jpg new file mode 100644 index 0000000..a841827 Binary files /dev/null and b/static/img/_paligo/uuid-f90189a9-c8f8-0720-69f3-b02983eb74f3.jpg differ diff --git a/static/img/_paligo/uuid-f91e8132-cff5-b5c3-142e-2184b4883382.png b/static/img/_paligo/uuid-f91e8132-cff5-b5c3-142e-2184b4883382.png new file mode 100644 index 0000000..c9bf427 Binary files /dev/null and b/static/img/_paligo/uuid-f91e8132-cff5-b5c3-142e-2184b4883382.png differ diff --git a/static/img/_paligo/uuid-f98768da-d01e-4c46-d399-7e1d614a023e.png b/static/img/_paligo/uuid-f98768da-d01e-4c46-d399-7e1d614a023e.png new file mode 100644 index 0000000..07149c9 Binary files /dev/null and b/static/img/_paligo/uuid-f98768da-d01e-4c46-d399-7e1d614a023e.png differ diff --git a/static/img/_paligo/uuid-f995aafc-a3ef-b1d1-5d31-751c5507e60a.png b/static/img/_paligo/uuid-f995aafc-a3ef-b1d1-5d31-751c5507e60a.png new file mode 100644 index 0000000..f451f20 Binary files /dev/null and b/static/img/_paligo/uuid-f995aafc-a3ef-b1d1-5d31-751c5507e60a.png differ diff --git a/static/img/_paligo/uuid-f9d557bf-8cd0-2856-4555-61352d73ca56.png b/static/img/_paligo/uuid-f9d557bf-8cd0-2856-4555-61352d73ca56.png new file mode 100644 index 0000000..9ca66e9 Binary files /dev/null and b/static/img/_paligo/uuid-f9d557bf-8cd0-2856-4555-61352d73ca56.png differ diff --git a/static/img/_paligo/uuid-f9f9d575-5b1f-73c1-53ae-94ae13e0da3f.png b/static/img/_paligo/uuid-f9f9d575-5b1f-73c1-53ae-94ae13e0da3f.png new file mode 100644 index 0000000..1787010 Binary files /dev/null and b/static/img/_paligo/uuid-f9f9d575-5b1f-73c1-53ae-94ae13e0da3f.png differ diff --git a/static/img/_paligo/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png b/static/img/_paligo/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png new file mode 100644 index 0000000..d81dd4c Binary files /dev/null and b/static/img/_paligo/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png differ diff --git a/static/img/_paligo/uuid-faa7bf60-0cae-0042-f910-e8e6240fc647.png b/static/img/_paligo/uuid-faa7bf60-0cae-0042-f910-e8e6240fc647.png new file mode 100644 index 0000000..8b621c4 Binary files /dev/null and b/static/img/_paligo/uuid-faa7bf60-0cae-0042-f910-e8e6240fc647.png differ diff --git a/static/img/_paligo/uuid-fad00841-d167-7313-ac2b-413697d749d6.png b/static/img/_paligo/uuid-fad00841-d167-7313-ac2b-413697d749d6.png new file mode 100644 index 0000000..cb4213b Binary files /dev/null and b/static/img/_paligo/uuid-fad00841-d167-7313-ac2b-413697d749d6.png differ diff --git a/static/img/_paligo/uuid-fafa8157-e6f0-6495-1da6-7112515830d8.png b/static/img/_paligo/uuid-fafa8157-e6f0-6495-1da6-7112515830d8.png new file mode 100644 index 0000000..f7e4073 Binary files /dev/null and b/static/img/_paligo/uuid-fafa8157-e6f0-6495-1da6-7112515830d8.png differ diff --git a/static/img/_paligo/uuid-fb66f7d5-2c56-4480-4a54-4d79a29c6c67.png b/static/img/_paligo/uuid-fb66f7d5-2c56-4480-4a54-4d79a29c6c67.png new file mode 100644 index 0000000..ea9ee16 Binary files /dev/null and b/static/img/_paligo/uuid-fb66f7d5-2c56-4480-4a54-4d79a29c6c67.png differ diff --git a/static/img/_paligo/uuid-fb6f7300-1ac4-523d-0a04-b6c2850e5621.png b/static/img/_paligo/uuid-fb6f7300-1ac4-523d-0a04-b6c2850e5621.png new file mode 100644 index 0000000..fb2b3d2 Binary files /dev/null and b/static/img/_paligo/uuid-fb6f7300-1ac4-523d-0a04-b6c2850e5621.png differ diff --git a/static/img/_paligo/uuid-fb7fb260-5679-1832-9448-228a048e2b80.png b/static/img/_paligo/uuid-fb7fb260-5679-1832-9448-228a048e2b80.png new file mode 100644 index 0000000..aed71c9 Binary files /dev/null and b/static/img/_paligo/uuid-fb7fb260-5679-1832-9448-228a048e2b80.png differ diff --git a/static/img/_paligo/uuid-fb91dae2-cdfe-d531-2559-c02a58915ce3.png b/static/img/_paligo/uuid-fb91dae2-cdfe-d531-2559-c02a58915ce3.png new file mode 100644 index 0000000..4783ddf Binary files /dev/null and b/static/img/_paligo/uuid-fb91dae2-cdfe-d531-2559-c02a58915ce3.png differ diff --git a/static/img/_paligo/uuid-fbaea845-8f7c-7470-248b-b10caf86a078.png b/static/img/_paligo/uuid-fbaea845-8f7c-7470-248b-b10caf86a078.png new file mode 100644 index 0000000..ea7e3fa Binary files /dev/null and b/static/img/_paligo/uuid-fbaea845-8f7c-7470-248b-b10caf86a078.png differ diff --git a/static/img/_paligo/uuid-fc4a47cb-98f9-e217-042d-73780f712eb2.png b/static/img/_paligo/uuid-fc4a47cb-98f9-e217-042d-73780f712eb2.png new file mode 100644 index 0000000..4ecd692 Binary files /dev/null and b/static/img/_paligo/uuid-fc4a47cb-98f9-e217-042d-73780f712eb2.png differ diff --git a/static/img/_paligo/uuid-fc53715a-add5-8c4c-d4a6-9a04f5da6d3b.png b/static/img/_paligo/uuid-fc53715a-add5-8c4c-d4a6-9a04f5da6d3b.png new file mode 100644 index 0000000..406aea3 Binary files /dev/null and b/static/img/_paligo/uuid-fc53715a-add5-8c4c-d4a6-9a04f5da6d3b.png differ diff --git a/static/img/_paligo/uuid-fc575279-c87c-1046-a747-4ea6a59fae5f.png b/static/img/_paligo/uuid-fc575279-c87c-1046-a747-4ea6a59fae5f.png new file mode 100644 index 0000000..fae17c0 Binary files /dev/null and b/static/img/_paligo/uuid-fc575279-c87c-1046-a747-4ea6a59fae5f.png differ diff --git a/static/img/_paligo/uuid-fcb0bba9-a8a5-e874-c5ba-a5e0f08d8a80.png b/static/img/_paligo/uuid-fcb0bba9-a8a5-e874-c5ba-a5e0f08d8a80.png new file mode 100644 index 0000000..8efe3bc Binary files /dev/null and b/static/img/_paligo/uuid-fcb0bba9-a8a5-e874-c5ba-a5e0f08d8a80.png differ diff --git a/static/img/_paligo/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png b/static/img/_paligo/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png new file mode 100644 index 0000000..1583802 Binary files /dev/null and b/static/img/_paligo/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png differ diff --git a/static/img/_paligo/uuid-fd13332e-571f-e706-88ed-a20a29db7aea.png b/static/img/_paligo/uuid-fd13332e-571f-e706-88ed-a20a29db7aea.png new file mode 100644 index 0000000..68d7589 Binary files /dev/null and b/static/img/_paligo/uuid-fd13332e-571f-e706-88ed-a20a29db7aea.png differ diff --git a/static/img/_paligo/uuid-fd3ff35c-c57e-151a-20ad-8170daf832dd.png b/static/img/_paligo/uuid-fd3ff35c-c57e-151a-20ad-8170daf832dd.png new file mode 100644 index 0000000..bfa8335 Binary files /dev/null and b/static/img/_paligo/uuid-fd3ff35c-c57e-151a-20ad-8170daf832dd.png differ diff --git a/static/img/_paligo/uuid-fd63cf77-e2f7-bfce-3000-4a80b87f158f.png b/static/img/_paligo/uuid-fd63cf77-e2f7-bfce-3000-4a80b87f158f.png new file mode 100644 index 0000000..5e648bb Binary files /dev/null and b/static/img/_paligo/uuid-fd63cf77-e2f7-bfce-3000-4a80b87f158f.png differ diff --git a/static/img/_paligo/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png b/static/img/_paligo/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png new file mode 100644 index 0000000..d45083b Binary files /dev/null and b/static/img/_paligo/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png differ diff --git a/static/img/_paligo/uuid-fd697193-d536-bade-12f6-341e9ecb2df9.jpg b/static/img/_paligo/uuid-fd697193-d536-bade-12f6-341e9ecb2df9.jpg new file mode 100644 index 0000000..94578a2 Binary files /dev/null and b/static/img/_paligo/uuid-fd697193-d536-bade-12f6-341e9ecb2df9.jpg differ diff --git a/static/img/_paligo/uuid-fd923003-5828-07e5-376b-b1d9e05c9652.png b/static/img/_paligo/uuid-fd923003-5828-07e5-376b-b1d9e05c9652.png new file mode 100644 index 0000000..8a90c66 Binary files /dev/null and b/static/img/_paligo/uuid-fd923003-5828-07e5-376b-b1d9e05c9652.png differ diff --git a/static/img/_paligo/uuid-fda915ec-d2ed-00a0-707c-b8a120221095.png b/static/img/_paligo/uuid-fda915ec-d2ed-00a0-707c-b8a120221095.png new file mode 100644 index 0000000..5cf2df0 Binary files /dev/null and b/static/img/_paligo/uuid-fda915ec-d2ed-00a0-707c-b8a120221095.png differ diff --git a/static/img/_paligo/uuid-fe3755f8-efba-2923-17e8-fa4ffd1ef16e.svg b/static/img/_paligo/uuid-fe3755f8-efba-2923-17e8-fa4ffd1ef16e.svg new file mode 100644 index 0000000..562cb50 --- /dev/null +++ b/static/img/_paligo/uuid-fe3755f8-efba-2923-17e8-fa4ffd1ef16e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/_paligo/uuid-ff754b01-bc60-0109-5a45-4c21b65d9855.png b/static/img/_paligo/uuid-ff754b01-bc60-0109-5a45-4c21b65d9855.png new file mode 100644 index 0000000..7af5dc8 Binary files /dev/null and b/static/img/_paligo/uuid-ff754b01-bc60-0109-5a45-4c21b65d9855.png differ diff --git a/static/img/_paligo/uuid-ff9689fa-fa0b-d8d1-afef-4649ccfcccc8.png b/static/img/_paligo/uuid-ff9689fa-fa0b-d8d1-afef-4649ccfcccc8.png new file mode 100644 index 0000000..7d047c7 Binary files /dev/null and b/static/img/_paligo/uuid-ff9689fa-fa0b-d8d1-afef-4649ccfcccc8.png differ diff --git a/static/img/addappname.jpg b/static/img/addappname.jpg new file mode 100644 index 0000000..3670ebf Binary files /dev/null and b/static/img/addappname.jpg differ diff --git a/static/img/addappsaml.jpg b/static/img/addappsaml.jpg new file mode 100644 index 0000000..257739d Binary files /dev/null and b/static/img/addappsaml.jpg differ diff --git a/static/img/addreplyingpartytrust.jpg b/static/img/addreplyingpartytrust.jpg new file mode 100644 index 0000000..6cd5d25 Binary files /dev/null and b/static/img/addreplyingpartytrust.jpg differ diff --git a/static/img/appsamlapp.jpg b/static/img/appsamlapp.jpg new file mode 100644 index 0000000..400188f Binary files /dev/null and b/static/img/appsamlapp.jpg differ diff --git a/static/img/assets/2025-08-05-project-settings.png b/static/img/assets/2025-08-05-project-settings.png new file mode 100644 index 0000000..797b318 Binary files /dev/null and b/static/img/assets/2025-08-05-project-settings.png differ diff --git a/static/img/assets/2025-08-07-access-in-rm-dialog.png b/static/img/assets/2025-08-07-access-in-rm-dialog.png new file mode 100644 index 0000000..7525e7d Binary files /dev/null and b/static/img/assets/2025-08-07-access-in-rm-dialog.png differ diff --git a/static/img/assets/2025-08-07-add-group-to-project.png b/static/img/assets/2025-08-07-add-group-to-project.png new file mode 100644 index 0000000..5ca0270 Binary files /dev/null and b/static/img/assets/2025-08-07-add-group-to-project.png differ diff --git a/static/img/assets/2025-08-07-assign-group-from-workspace.png b/static/img/assets/2025-08-07-assign-group-from-workspace.png new file mode 100644 index 0000000..835f9d7 Binary files /dev/null and b/static/img/assets/2025-08-07-assign-group-from-workspace.png differ diff --git a/static/img/assets/2025-09-04-rm-what-to-test.png b/static/img/assets/2025-09-04-rm-what-to-test.png new file mode 100644 index 0000000..ce3ed92 Binary files /dev/null and b/static/img/assets/2025-09-04-rm-what-to-test.png differ diff --git a/static/img/assets/2025-10-29-outgoing-webhooks-rm.png b/static/img/assets/2025-10-29-outgoing-webhooks-rm.png new file mode 100644 index 0000000..f18ca6a Binary files /dev/null and b/static/img/assets/2025-10-29-outgoing-webhooks-rm.png differ diff --git a/static/img/assets/2025-10-29-release-presets.png b/static/img/assets/2025-10-29-release-presets.png new file mode 100644 index 0000000..e051d4d Binary files /dev/null and b/static/img/assets/2025-10-29-release-presets.png differ diff --git a/static/img/assets/2025-10-29-releases.png b/static/img/assets/2025-10-29-releases.png new file mode 100644 index 0000000..a2270f9 Binary files /dev/null and b/static/img/assets/2025-10-29-releases.png differ diff --git a/static/img/assets/2025-10-29-remove-webhooks-rm.png b/static/img/assets/2025-10-29-remove-webhooks-rm.png new file mode 100644 index 0000000..6f521d1 Binary files /dev/null and b/static/img/assets/2025-10-29-remove-webhooks-rm.png differ diff --git a/static/img/assets/2025-10-29-rm-add-outgoing-webhook.png b/static/img/assets/2025-10-29-rm-add-outgoing-webhook.png new file mode 100644 index 0000000..9ca66e9 Binary files /dev/null and b/static/img/assets/2025-10-29-rm-add-outgoing-webhook.png differ diff --git a/static/img/assets/2025-11-11-aws-iam-provider.png b/static/img/assets/2025-11-11-aws-iam-provider.png new file mode 100644 index 0000000..de2192e Binary files /dev/null and b/static/img/assets/2025-11-11-aws-iam-provider.png differ diff --git a/static/img/assets/2025-11-11-aws-roles.png b/static/img/assets/2025-11-11-aws-roles.png new file mode 100644 index 0000000..7295e12 Binary files /dev/null and b/static/img/assets/2025-11-11-aws-roles.png differ diff --git a/static/img/assets/2025-11-11-custom-trust-policy.png b/static/img/assets/2025-11-11-custom-trust-policy.png new file mode 100644 index 0000000..9d4d31a Binary files /dev/null and b/static/img/assets/2025-11-11-custom-trust-policy.png differ diff --git a/static/img/assets/2025-11-12-get-oidc-token-step.png b/static/img/assets/2025-11-12-get-oidc-token-step.png new file mode 100644 index 0000000..c885ab9 Binary files /dev/null and b/static/img/assets/2025-11-12-get-oidc-token-step.png differ diff --git a/static/img/assets/20250808-build-log-tool-setup.png b/static/img/assets/20250808-build-log-tool-setup.png new file mode 100644 index 0000000..3dc8d8b Binary files /dev/null and b/static/img/assets/20250808-build-log-tool-setup.png differ diff --git a/static/img/assets/2026-03-11-oicd-new-policy.png b/static/img/assets/2026-03-11-oicd-new-policy.png new file mode 100644 index 0000000..ea9ee16 Binary files /dev/null and b/static/img/assets/2026-03-11-oicd-new-policy.png differ diff --git a/static/img/assets/2026-03-11-oicd-trust-policies.png b/static/img/assets/2026-03-11-oicd-trust-policies.png new file mode 100644 index 0000000..90a7b7f Binary files /dev/null and b/static/img/assets/2026-03-11-oicd-trust-policies.png differ diff --git a/static/img/assets/3_dots.png b/static/img/assets/3_dots.png new file mode 100644 index 0000000..b6deb18 Binary files /dev/null and b/static/img/assets/3_dots.png differ diff --git a/static/img/assets/3dots_2.png b/static/img/assets/3dots_2.png new file mode 100644 index 0000000..22472d5 Binary files /dev/null and b/static/img/assets/3dots_2.png differ diff --git a/static/img/assets/616541a82bf14.jpg b/static/img/assets/616541a82bf14.jpg new file mode 100644 index 0000000..238651c Binary files /dev/null and b/static/img/assets/616541a82bf14.jpg differ diff --git a/static/img/assets/Add_To_dashboard.png b/static/img/assets/Add_To_dashboard.png new file mode 100644 index 0000000..46b3720 Binary files /dev/null and b/static/img/assets/Add_To_dashboard.png differ diff --git a/static/img/assets/Add_member_new.png b/static/img/assets/Add_member_new.png new file mode 100644 index 0000000..5a608f6 Binary files /dev/null and b/static/img/assets/Add_member_new.png differ diff --git a/static/img/assets/Build_logs.png b/static/img/assets/Build_logs.png new file mode 100644 index 0000000..48bc365 Binary files /dev/null and b/static/img/assets/Build_logs.png differ diff --git a/static/img/assets/Create_dashboard.png b/static/img/assets/Create_dashboard.png new file mode 100644 index 0000000..1662abf Binary files /dev/null and b/static/img/assets/Create_dashboard.png differ diff --git a/static/img/assets/CrossPlatform.png b/static/img/assets/CrossPlatform.png new file mode 100644 index 0000000..c460cad Binary files /dev/null and b/static/img/assets/CrossPlatform.png differ diff --git a/static/img/assets/Device_testing_for_Android-1.png b/static/img/assets/Device_testing_for_Android-1.png new file mode 100644 index 0000000..36cb441 Binary files /dev/null and b/static/img/assets/Device_testing_for_Android-1.png differ diff --git a/static/img/assets/Device_testing_for_Android-2.png b/static/img/assets/Device_testing_for_Android-2.png new file mode 100644 index 0000000..cedabbe Binary files /dev/null and b/static/img/assets/Device_testing_for_Android-2.png differ diff --git a/static/img/assets/Device_testing_for_Android-3.png b/static/img/assets/Device_testing_for_Android-3.png new file mode 100644 index 0000000..01e4f0a Binary files /dev/null and b/static/img/assets/Device_testing_for_Android-3.png differ diff --git a/static/img/assets/Device_testing_for_Android.jpg b/static/img/assets/Device_testing_for_Android.jpg new file mode 100644 index 0000000..63ecd1d Binary files /dev/null and b/static/img/assets/Device_testing_for_Android.jpg differ diff --git a/static/img/assets/Device_testing_for_Android.png b/static/img/assets/Device_testing_for_Android.png new file mode 100644 index 0000000..ea7e3fa Binary files /dev/null and b/static/img/assets/Device_testing_for_Android.png differ diff --git a/static/img/assets/Edit_mode.png b/static/img/assets/Edit_mode.png new file mode 100644 index 0000000..d5e8901 Binary files /dev/null and b/static/img/assets/Edit_mode.png differ diff --git a/static/img/assets/Edit_mode_opened.png b/static/img/assets/Edit_mode_opened.png new file mode 100644 index 0000000..41ea52c Binary files /dev/null and b/static/img/assets/Edit_mode_opened.png differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-1.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-1.jpg new file mode 100644 index 0000000..4448eb3 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-1.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-1.png b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-1.png new file mode 100644 index 0000000..e4bccfb Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-1.png differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-10.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-10.jpg new file mode 100644 index 0000000..7f24736 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-10.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-11.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-11.jpg new file mode 100644 index 0000000..ab59be8 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-11.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-2.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-2.jpg new file mode 100644 index 0000000..a57208b Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-2.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-3.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-3.jpg new file mode 100644 index 0000000..3bf6166 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-3.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-4.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-4.jpg new file mode 100644 index 0000000..50ba665 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-4.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-5.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-5.jpg new file mode 100644 index 0000000..ea38b94 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-5.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-6.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-6.jpg new file mode 100644 index 0000000..085bac8 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-6.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-7.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-7.jpg new file mode 100644 index 0000000..4da8090 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-7.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-8.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-8.jpg new file mode 100644 index 0000000..81a7cb4 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-8.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-9.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-9.jpg new file mode 100644 index 0000000..2f24a5d Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page-9.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page.jpg b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page.jpg new file mode 100644 index 0000000..a5f8dda Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page.jpg differ diff --git a/static/img/assets/Installing_an_ipa_file_from_the_public_install_page.png b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page.png new file mode 100644 index 0000000..a193992 Binary files /dev/null and b/static/img/assets/Installing_an_ipa_file_from_the_public_install_page.png differ diff --git a/static/img/assets/Logs_delete.png b/static/img/assets/Logs_delete.png new file mode 100644 index 0000000..c0bb1b2 Binary files /dev/null and b/static/img/assets/Logs_delete.png differ diff --git a/static/img/assets/Managing_an_app_s_bitrise.png b/static/img/assets/Managing_an_app_s_bitrise.png new file mode 100644 index 0000000..68d7589 Binary files /dev/null and b/static/img/assets/Managing_an_app_s_bitrise.png differ diff --git a/static/img/assets/SCR-20260309-pxsf.png b/static/img/assets/SCR-20260309-pxsf.png new file mode 100644 index 0000000..c3f51bf Binary files /dev/null and b/static/img/assets/SCR-20260309-pxsf.png differ diff --git a/static/img/assets/SCR-20260313-pnzl.png b/static/img/assets/SCR-20260313-pnzl.png new file mode 100644 index 0000000..7946e06 Binary files /dev/null and b/static/img/assets/SCR-20260313-pnzl.png differ diff --git a/static/img/assets/SCR-20260313-pruq.png b/static/img/assets/SCR-20260313-pruq.png new file mode 100644 index 0000000..dee58b8 Binary files /dev/null and b/static/img/assets/SCR-20260313-pruq.png differ diff --git a/static/img/assets/SCR-20260313-ptnr.png b/static/img/assets/SCR-20260313-ptnr.png new file mode 100644 index 0000000..e9ed098 Binary files /dev/null and b/static/img/assets/SCR-20260313-ptnr.png differ diff --git a/static/img/assets/SCR-20260320-mmwy.png b/static/img/assets/SCR-20260320-mmwy.png new file mode 100644 index 0000000..1a7663d Binary files /dev/null and b/static/img/assets/SCR-20260320-mmwy.png differ diff --git a/static/img/assets/SCR-20260320-nqmt.png b/static/img/assets/SCR-20260320-nqmt.png new file mode 100644 index 0000000..fc5ad25 Binary files /dev/null and b/static/img/assets/SCR-20260320-nqmt.png differ diff --git a/static/img/assets/SCR-20260320-nseo.png b/static/img/assets/SCR-20260320-nseo.png new file mode 100644 index 0000000..a5e43ce Binary files /dev/null and b/static/img/assets/SCR-20260320-nseo.png differ diff --git a/static/img/assets/SCR-20260320-nsxn.png b/static/img/assets/SCR-20260320-nsxn.png new file mode 100644 index 0000000..23b3dc7 Binary files /dev/null and b/static/img/assets/SCR-20260320-nsxn.png differ diff --git a/static/img/assets/SCR-20260331-pmhi.png b/static/img/assets/SCR-20260331-pmhi.png new file mode 100644 index 0000000..f6c4d70 Binary files /dev/null and b/static/img/assets/SCR-20260331-pmhi.png differ diff --git a/static/img/assets/SCR-20260331-prho.png b/static/img/assets/SCR-20260331-prho.png new file mode 100644 index 0000000..9692a63 Binary files /dev/null and b/static/img/assets/SCR-20260331-prho.png differ diff --git a/static/img/assets/SCR-20260331-przw.png b/static/img/assets/SCR-20260331-przw.png new file mode 100644 index 0000000..d81dd4c Binary files /dev/null and b/static/img/assets/SCR-20260331-przw.png differ diff --git a/static/img/assets/SCR-20260401-pvvq.png b/static/img/assets/SCR-20260401-pvvq.png new file mode 100644 index 0000000..aca2804 Binary files /dev/null and b/static/img/assets/SCR-20260401-pvvq.png differ diff --git a/static/img/assets/StepTypes.png b/static/img/assets/StepTypes.png new file mode 100644 index 0000000..0f028d1 Binary files /dev/null and b/static/img/assets/StepTypes.png differ diff --git a/static/img/assets/Verified_Steps.jpg b/static/img/assets/Verified_Steps.jpg new file mode 100644 index 0000000..7d2b3c7 Binary files /dev/null and b/static/img/assets/Verified_Steps.jpg differ diff --git a/static/img/assets/Workflow_selector.png b/static/img/assets/Workflow_selector.png new file mode 100644 index 0000000..85d5c9c Binary files /dev/null and b/static/img/assets/Workflow_selector.png differ diff --git a/static/img/assets/add-api-key-apple.png b/static/img/assets/add-api-key-apple.png new file mode 100644 index 0000000..4f23f11 Binary files /dev/null and b/static/img/assets/add-api-key-apple.png differ diff --git a/static/img/assets/add-bundle-to-bundle.png b/static/img/assets/add-bundle-to-bundle.png new file mode 100644 index 0000000..9a592bd Binary files /dev/null and b/static/img/assets/add-bundle-to-bundle.png differ diff --git a/static/img/assets/add-outgoing-webhook.png b/static/img/assets/add-outgoing-webhook.png new file mode 100644 index 0000000..7e57e69 Binary files /dev/null and b/static/img/assets/add-outgoing-webhook.png differ diff --git a/static/img/assets/addanothertrigger.png b/static/img/assets/addanothertrigger.png new file mode 100644 index 0000000..bf8fdba Binary files /dev/null and b/static/img/assets/addanothertrigger.png differ diff --git a/static/img/assets/adding-users.png b/static/img/assets/adding-users.png new file mode 100644 index 0000000..a3d19e2 Binary files /dev/null and b/static/img/assets/adding-users.png differ diff --git a/static/img/assets/addnewtrigger.png b/static/img/assets/addnewtrigger.png new file mode 100644 index 0000000..e3b97d2 Binary files /dev/null and b/static/img/assets/addnewtrigger.png differ diff --git a/static/img/assets/admin-role.png b/static/img/assets/admin-role.png new file mode 100644 index 0000000..99c4368 Binary files /dev/null and b/static/img/assets/admin-role.png differ diff --git a/static/img/assets/agent-logging.png b/static/img/assets/agent-logging.png new file mode 100644 index 0000000..42da41a Binary files /dev/null and b/static/img/assets/agent-logging.png differ diff --git a/static/img/assets/ai-faq-data.png b/static/img/assets/ai-faq-data.png new file mode 100644 index 0000000..bf77e6c Binary files /dev/null and b/static/img/assets/ai-faq-data.png differ diff --git a/static/img/assets/alert-filters.png b/static/img/assets/alert-filters.png new file mode 100644 index 0000000..ea467bd Binary files /dev/null and b/static/img/assets/alert-filters.png differ diff --git a/static/img/assets/alerts.png b/static/img/assets/alerts.png new file mode 100644 index 0000000..c575e5d Binary files /dev/null and b/static/img/assets/alerts.png differ diff --git a/static/img/assets/android_example.png b/static/img/assets/android_example.png new file mode 100644 index 0000000..55fa770 Binary files /dev/null and b/static/img/assets/android_example.png differ diff --git a/static/img/assets/android_example2.png b/static/img/assets/android_example2.png new file mode 100644 index 0000000..f258db8 Binary files /dev/null and b/static/img/assets/android_example2.png differ diff --git a/static/img/assets/android_example_3.png b/static/img/assets/android_example_3.png new file mode 100644 index 0000000..4783ddf Binary files /dev/null and b/static/img/assets/android_example_3.png differ diff --git a/static/img/assets/annotation-styles.png b/static/img/assets/annotation-styles.png new file mode 100644 index 0000000..b275fbb Binary files /dev/null and b/static/img/assets/annotation-styles.png differ diff --git a/static/img/assets/annotations-expand.gif b/static/img/assets/annotations-expand.gif new file mode 100644 index 0000000..5935736 Binary files /dev/null and b/static/img/assets/annotations-expand.gif differ diff --git a/static/img/assets/api-key-app-store.png b/static/img/assets/api-key-app-store.png new file mode 100644 index 0000000..2ae4ded Binary files /dev/null and b/static/img/assets/api-key-app-store.png differ diff --git a/static/img/assets/api-key-chart.png b/static/img/assets/api-key-chart.png new file mode 100644 index 0000000..69f7d18 Binary files /dev/null and b/static/img/assets/api-key-chart.png differ diff --git a/static/img/assets/api-key-enterprise.png b/static/img/assets/api-key-enterprise.png new file mode 100644 index 0000000..33e6e17 Binary files /dev/null and b/static/img/assets/api-key-enterprise.png differ diff --git a/static/img/assets/app-level-secret.png b/static/img/assets/app-level-secret.png new file mode 100644 index 0000000..8f10f4c Binary files /dev/null and b/static/img/assets/app-level-secret.png differ diff --git a/static/img/assets/app_integration_okta.png b/static/img/assets/app_integration_okta.png new file mode 100644 index 0000000..6c0a1b0 Binary files /dev/null and b/static/img/assets/app_integration_okta.png differ diff --git a/static/img/assets/apps-repository-url.png b/static/img/assets/apps-repository-url.png new file mode 100644 index 0000000..3e7942d Binary files /dev/null and b/static/img/assets/apps-repository-url.png differ diff --git a/static/img/assets/assign_people.png b/static/img/assets/assign_people.png new file mode 100644 index 0000000..1594dc6 Binary files /dev/null and b/static/img/assets/assign_people.png differ diff --git a/static/img/assets/assignments_okta.png b/static/img/assets/assignments_okta.png new file mode 100644 index 0000000..934c54c Binary files /dev/null and b/static/img/assets/assignments_okta.png differ diff --git a/static/img/assets/authorizing-app.png b/static/img/assets/authorizing-app.png new file mode 100644 index 0000000..69ff4ba Binary files /dev/null and b/static/img/assets/authorizing-app.png differ diff --git a/static/img/assets/aws-markplace-amis.png b/static/img/assets/aws-markplace-amis.png new file mode 100644 index 0000000..477f472 Binary files /dev/null and b/static/img/assets/aws-markplace-amis.png differ diff --git a/static/img/assets/bell.png b/static/img/assets/bell.png new file mode 100644 index 0000000..d6aad97 Binary files /dev/null and b/static/img/assets/bell.png differ diff --git a/static/img/assets/beta-testing-google-play.png b/static/img/assets/beta-testing-google-play.png new file mode 100644 index 0000000..a9655d0 Binary files /dev/null and b/static/img/assets/beta-testing-google-play.png differ diff --git a/static/img/assets/beta-testing-testflight.png b/static/img/assets/beta-testing-testflight.png new file mode 100644 index 0000000..ce3e1f5 Binary files /dev/null and b/static/img/assets/beta-testing-testflight.png differ diff --git a/static/img/assets/bitrisedashboard.png b/static/img/assets/bitrisedashboard.png new file mode 100644 index 0000000..0732114 Binary files /dev/null and b/static/img/assets/bitrisedashboard.png differ diff --git a/static/img/assets/bottlenecks-menu-option.png b/static/img/assets/bottlenecks-menu-option.png new file mode 100644 index 0000000..89a68c1 Binary files /dev/null and b/static/img/assets/bottlenecks-menu-option.png differ diff --git a/static/img/assets/bottlenecks-overview.png b/static/img/assets/bottlenecks-overview.png new file mode 100644 index 0000000..cceac2f Binary files /dev/null and b/static/img/assets/bottlenecks-overview.png differ diff --git a/static/img/assets/build-history.png b/static/img/assets/build-history.png new file mode 100644 index 0000000..d110692 Binary files /dev/null and b/static/img/assets/build-history.png differ diff --git a/static/img/assets/build-log-basic.png b/static/img/assets/build-log-basic.png new file mode 100644 index 0000000..66957d2 Binary files /dev/null and b/static/img/assets/build-log-basic.png differ diff --git a/static/img/assets/build-numbering.png b/static/img/assets/build-numbering.png new file mode 100644 index 0000000..d8735f7 Binary files /dev/null and b/static/img/assets/build-numbering.png differ diff --git a/static/img/assets/builds-explore.png b/static/img/assets/builds-explore.png new file mode 100644 index 0000000..d0bcc67 Binary files /dev/null and b/static/img/assets/builds-explore.png differ diff --git a/static/img/assets/builds-remote-access.png b/static/img/assets/builds-remote-access.png new file mode 100644 index 0000000..a0ed2e7 Binary files /dev/null and b/static/img/assets/builds-remote-access.png differ diff --git a/static/img/assets/builds-ssh-remote-access-instructions.png b/static/img/assets/builds-ssh-remote-access-instructions.png new file mode 100644 index 0000000..568438c Binary files /dev/null and b/static/img/assets/builds-ssh-remote-access-instructions.png differ diff --git a/static/img/assets/bundle-tab.png b/static/img/assets/bundle-tab.png new file mode 100644 index 0000000..7844075 Binary files /dev/null and b/static/img/assets/bundle-tab.png differ diff --git a/static/img/assets/cache-hit-rate-workflow.png b/static/img/assets/cache-hit-rate-workflow.png new file mode 100644 index 0000000..2bdf4c5 Binary files /dev/null and b/static/img/assets/cache-hit-rate-workflow.png differ diff --git a/static/img/assets/case-report-card.png b/static/img/assets/case-report-card.png new file mode 100644 index 0000000..1ae1273 Binary files /dev/null and b/static/img/assets/case-report-card.png differ diff --git a/static/img/assets/chaining-workflows-menu.png b/static/img/assets/chaining-workflows-menu.png new file mode 100644 index 0000000..aba73e0 Binary files /dev/null and b/static/img/assets/chaining-workflows-menu.png differ diff --git a/static/img/assets/checkout.png b/static/img/assets/checkout.png new file mode 100644 index 0000000..bd19f94 Binary files /dev/null and b/static/img/assets/checkout.png differ diff --git a/static/img/assets/close-small.svg b/static/img/assets/close-small.svg new file mode 100644 index 0000000..9fa0b2f --- /dev/null +++ b/static/img/assets/close-small.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/assets/config-yaml-source.png b/static/img/assets/config-yaml-source.png new file mode 100644 index 0000000..a8b09aa Binary files /dev/null and b/static/img/assets/config-yaml-source.png differ diff --git a/static/img/assets/configure_update_sso.png b/static/img/assets/configure_update_sso.png new file mode 100644 index 0000000..cd77353 Binary files /dev/null and b/static/img/assets/configure_update_sso.png differ diff --git a/static/img/assets/connect-github-app.png b/static/img/assets/connect-github-app.png new file mode 100644 index 0000000..b2c3535 Binary files /dev/null and b/static/img/assets/connect-github-app.png differ diff --git a/static/img/assets/controller-diagram.png b/static/img/assets/controller-diagram.png new file mode 100644 index 0000000..25eeeb0 Binary files /dev/null and b/static/img/assets/controller-diagram.png differ diff --git a/static/img/assets/costliest-app.png b/static/img/assets/costliest-app.png new file mode 100644 index 0000000..293f905 Binary files /dev/null and b/static/img/assets/costliest-app.png differ diff --git a/static/img/assets/costliest-workflow.png b/static/img/assets/costliest-workflow.png new file mode 100644 index 0000000..1919ec6 Binary files /dev/null and b/static/img/assets/costliest-workflow.png differ diff --git a/static/img/assets/create-alert-button.png b/static/img/assets/create-alert-button.png new file mode 100644 index 0000000..83dac16 Binary files /dev/null and b/static/img/assets/create-alert-button.png differ diff --git a/static/img/assets/create-per-app.png b/static/img/assets/create-per-app.png new file mode 100644 index 0000000..28035fa Binary files /dev/null and b/static/img/assets/create-per-app.png differ diff --git a/static/img/assets/create-token.svg b/static/img/assets/create-token.svg new file mode 100644 index 0000000..c44d4ac --- /dev/null +++ b/static/img/assets/create-token.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/assets/create-variable.png b/static/img/assets/create-variable.png new file mode 100644 index 0000000..dc8237b Binary files /dev/null and b/static/img/assets/create-variable.png differ diff --git a/static/img/assets/create-workflow.png b/static/img/assets/create-workflow.png new file mode 100644 index 0000000..0dd970e Binary files /dev/null and b/static/img/assets/create-workflow.png differ diff --git a/static/img/assets/create_new_app_integration.png b/static/img/assets/create_new_app_integration.png new file mode 100644 index 0000000..4bb327e Binary files /dev/null and b/static/img/assets/create_new_app_integration.png differ diff --git a/static/img/assets/credential_details_2.png b/static/img/assets/credential_details_2.png new file mode 100644 index 0000000..b76d71c Binary files /dev/null and b/static/img/assets/credential_details_2.png differ diff --git a/static/img/assets/credits-page-home.png b/static/img/assets/credits-page-home.png new file mode 100644 index 0000000..5cb9855 Binary files /dev/null and b/static/img/assets/credits-page-home.png differ diff --git a/static/img/assets/cumulative-credits.png b/static/img/assets/cumulative-credits.png new file mode 100644 index 0000000..56ba246 Binary files /dev/null and b/static/img/assets/cumulative-credits.png differ diff --git a/static/img/assets/dashboards.png b/static/img/assets/dashboards.png new file mode 100644 index 0000000..fae17c0 Binary files /dev/null and b/static/img/assets/dashboards.png differ diff --git a/static/img/assets/developer.png b/static/img/assets/developer.png new file mode 100644 index 0000000..d8ef97b Binary files /dev/null and b/static/img/assets/developer.png differ diff --git a/static/img/assets/disable_sso.png b/static/img/assets/disable_sso.png new file mode 100644 index 0000000..1dd0928 Binary files /dev/null and b/static/img/assets/disable_sso.png differ diff --git a/static/img/assets/download-invoice.png b/static/img/assets/download-invoice.png new file mode 100644 index 0000000..061f59e Binary files /dev/null and b/static/img/assets/download-invoice.png differ diff --git a/static/img/assets/edit-alert.png b/static/img/assets/edit-alert.png new file mode 100644 index 0000000..8fe2fd5 Binary files /dev/null and b/static/img/assets/edit-alert.png differ diff --git a/static/img/assets/edit-button-secrets.png b/static/img/assets/edit-button-secrets.png new file mode 100644 index 0000000..262c8f7 Binary files /dev/null and b/static/img/assets/edit-button-secrets.png differ diff --git a/static/img/assets/edit-config.png b/static/img/assets/edit-config.png new file mode 100644 index 0000000..d45083b Binary files /dev/null and b/static/img/assets/edit-config.png differ diff --git a/static/img/assets/edit-outgoing-webhook.png b/static/img/assets/edit-outgoing-webhook.png new file mode 100644 index 0000000..b6c1d6d Binary files /dev/null and b/static/img/assets/edit-outgoing-webhook.png differ diff --git a/static/img/assets/edit-trigger.png b/static/img/assets/edit-trigger.png new file mode 100644 index 0000000..2d7fff9 Binary files /dev/null and b/static/img/assets/edit-trigger.png differ diff --git a/static/img/assets/edit-webhook.svg b/static/img/assets/edit-webhook.svg new file mode 100644 index 0000000..562cb50 --- /dev/null +++ b/static/img/assets/edit-webhook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/assets/editscope-quarantine.png b/static/img/assets/editscope-quarantine.png new file mode 100644 index 0000000..f44bd38 Binary files /dev/null and b/static/img/assets/editscope-quarantine.png differ diff --git a/static/img/assets/enforce_saml.png b/static/img/assets/enforce_saml.png new file mode 100644 index 0000000..2b80fdc Binary files /dev/null and b/static/img/assets/enforce_saml.png differ diff --git a/static/img/assets/existing-alert.png b/static/img/assets/existing-alert.png new file mode 100644 index 0000000..ae8f521 Binary files /dev/null and b/static/img/assets/existing-alert.png differ diff --git a/static/img/assets/explore-builds-example.png b/static/img/assets/explore-builds-example.png new file mode 100644 index 0000000..deefc66 Binary files /dev/null and b/static/img/assets/explore-builds-example.png differ diff --git a/static/img/assets/failed-build-history.png b/static/img/assets/failed-build-history.png new file mode 100644 index 0000000..6b4593d Binary files /dev/null and b/static/img/assets/failed-build-history.png differ diff --git a/static/img/assets/failure-rate-tab.png b/static/img/assets/failure-rate-tab.png new file mode 100644 index 0000000..a1cd596 Binary files /dev/null and b/static/img/assets/failure-rate-tab.png differ diff --git a/static/img/assets/filter-by-workflow.png b/static/img/assets/filter-by-workflow.png new file mode 100644 index 0000000..d1c6984 Binary files /dev/null and b/static/img/assets/filter-by-workflow.png differ diff --git a/static/img/assets/filter-test-suite.png b/static/img/assets/filter-test-suite.png new file mode 100644 index 0000000..4b7c675 Binary files /dev/null and b/static/img/assets/filter-test-suite.png differ diff --git a/static/img/assets/flakiest-app.png b/static/img/assets/flakiest-app.png new file mode 100644 index 0000000..db7e5d3 Binary files /dev/null and b/static/img/assets/flakiest-app.png differ diff --git a/static/img/assets/flakiest-test-suite.png b/static/img/assets/flakiest-test-suite.png new file mode 100644 index 0000000..9566085 Binary files /dev/null and b/static/img/assets/flakiest-test-suite.png differ diff --git a/static/img/assets/flakiness-bottlenecks.png b/static/img/assets/flakiness-bottlenecks.png new file mode 100644 index 0000000..f451f20 Binary files /dev/null and b/static/img/assets/flakiness-bottlenecks.png differ diff --git a/static/img/assets/flaky-runs-tab.png b/static/img/assets/flaky-runs-tab.png new file mode 100644 index 0000000..b7f3631 Binary files /dev/null and b/static/img/assets/flaky-runs-tab.png differ diff --git a/static/img/assets/flutter-build-ios-config.png b/static/img/assets/flutter-build-ios-config.png new file mode 100644 index 0000000..757fefd Binary files /dev/null and b/static/img/assets/flutter-build-ios-config.png differ diff --git a/static/img/assets/general_settings_okta.png b/static/img/assets/general_settings_okta.png new file mode 100644 index 0000000..05c1467 Binary files /dev/null and b/static/img/assets/general_settings_okta.png differ diff --git a/static/img/assets/get-started-ci-page.png b/static/img/assets/get-started-ci-page.png new file mode 100644 index 0000000..c071bbb Binary files /dev/null and b/static/img/assets/get-started-ci-page.png differ diff --git a/static/img/assets/get_started_bitrise.png b/static/img/assets/get_started_bitrise.png new file mode 100644 index 0000000..d90014e Binary files /dev/null and b/static/img/assets/get_started_bitrise.png differ diff --git a/static/img/assets/getting-to-workflows.png b/static/img/assets/getting-to-workflows.png new file mode 100644 index 0000000..09f936b Binary files /dev/null and b/static/img/assets/getting-to-workflows.png differ diff --git a/static/img/assets/gettingstarted.png b/static/img/assets/gettingstarted.png new file mode 100644 index 0000000..e620eef Binary files /dev/null and b/static/img/assets/gettingstarted.png differ diff --git a/static/img/assets/git-repo-source.png b/static/img/assets/git-repo-source.png new file mode 100644 index 0000000..cd76f34 Binary files /dev/null and b/static/img/assets/git-repo-source.png differ diff --git a/static/img/assets/github-account-connection.png b/static/img/assets/github-account-connection.png new file mode 100644 index 0000000..c2caee2 Binary files /dev/null and b/static/img/assets/github-account-connection.png differ diff --git a/static/img/assets/github-fine-grained-token-permissions.png b/static/img/assets/github-fine-grained-token-permissions.png new file mode 100644 index 0000000..300f116 Binary files /dev/null and b/static/img/assets/github-fine-grained-token-permissions.png differ diff --git a/static/img/assets/github-webhook-permissions.png b/static/img/assets/github-webhook-permissions.png new file mode 100644 index 0000000..8cb2c4d Binary files /dev/null and b/static/img/assets/github-webhook-permissions.png differ diff --git a/static/img/assets/github_checks_install.png b/static/img/assets/github_checks_install.png new file mode 100644 index 0000000..0f2bbad Binary files /dev/null and b/static/img/assets/github_checks_install.png differ diff --git a/static/img/assets/gitlab-webhook-settings.png b/static/img/assets/gitlab-webhook-settings.png new file mode 100644 index 0000000..f6e4c55 Binary files /dev/null and b/static/img/assets/gitlab-webhook-settings.png differ diff --git a/static/img/assets/google-play-ready-to-upload.png b/static/img/assets/google-play-ready-to-upload.png new file mode 100644 index 0000000..3e1d29d Binary files /dev/null and b/static/img/assets/google-play-ready-to-upload.png differ diff --git a/static/img/assets/gradle-runner.png b/static/img/assets/gradle-runner.png new file mode 100644 index 0000000..61d2985 Binary files /dev/null and b/static/img/assets/gradle-runner.png differ diff --git a/static/img/assets/iOS_example_2.png b/static/img/assets/iOS_example_2.png new file mode 100644 index 0000000..aa8196f Binary files /dev/null and b/static/img/assets/iOS_example_2.png differ diff --git a/static/img/assets/iOS_example_modified.png b/static/img/assets/iOS_example_modified.png new file mode 100644 index 0000000..4187883 Binary files /dev/null and b/static/img/assets/iOS_example_modified.png differ diff --git a/static/img/assets/insights-quarantine.png b/static/img/assets/insights-quarantine.png new file mode 100644 index 0000000..9b1c5a3 Binary files /dev/null and b/static/img/assets/insights-quarantine.png differ diff --git a/static/img/assets/install-the-app.png b/static/img/assets/install-the-app.png new file mode 100644 index 0000000..9361780 Binary files /dev/null and b/static/img/assets/install-the-app.png differ diff --git a/static/img/assets/invocations-significant.png b/static/img/assets/invocations-significant.png new file mode 100644 index 0000000..e93dce3 Binary files /dev/null and b/static/img/assets/invocations-significant.png differ diff --git a/static/img/assets/ios-certificate-dialog.png b/static/img/assets/ios-certificate-dialog.png new file mode 100644 index 0000000..7d047c7 Binary files /dev/null and b/static/img/assets/ios-certificate-dialog.png differ diff --git a/static/img/assets/ios-device-testing.png b/static/img/assets/ios-device-testing.png new file mode 100644 index 0000000..4be6e19 Binary files /dev/null and b/static/img/assets/ios-device-testing.png differ diff --git a/static/img/assets/ios-simulator-destination.png b/static/img/assets/ios-simulator-destination.png new file mode 100644 index 0000000..565d830 Binary files /dev/null and b/static/img/assets/ios-simulator-destination.png differ diff --git a/static/img/assets/iosdevicetesting-flakytests.png b/static/img/assets/iosdevicetesting-flakytests.png new file mode 100644 index 0000000..64c34b6 Binary files /dev/null and b/static/img/assets/iosdevicetesting-flakytests.png differ diff --git a/static/img/assets/ipafile.png b/static/img/assets/ipafile.png new file mode 100644 index 0000000..5401cc2 Binary files /dev/null and b/static/img/assets/ipafile.png differ diff --git a/static/img/assets/issues-list.png b/static/img/assets/issues-list.png new file mode 100644 index 0000000..2fc5e7c Binary files /dev/null and b/static/img/assets/issues-list.png differ diff --git a/static/img/assets/keystore-alias.png b/static/img/assets/keystore-alias.png new file mode 100644 index 0000000..64fae96 Binary files /dev/null and b/static/img/assets/keystore-alias.png differ diff --git a/static/img/assets/last-commit.png b/static/img/assets/last-commit.png new file mode 100644 index 0000000..fed67f7 Binary files /dev/null and b/static/img/assets/last-commit.png differ diff --git a/static/img/assets/license-wfe.png b/static/img/assets/license-wfe.png new file mode 100644 index 0000000..97778cb Binary files /dev/null and b/static/img/assets/license-wfe.png differ diff --git a/static/img/assets/license_pools.png b/static/img/assets/license_pools.png new file mode 100644 index 0000000..66e2d17 Binary files /dev/null and b/static/img/assets/license_pools.png differ diff --git a/static/img/assets/linkGroup.png b/static/img/assets/linkGroup.png new file mode 100644 index 0000000..39d51c5 Binary files /dev/null and b/static/img/assets/linkGroup.png differ diff --git a/static/img/assets/linkadditionalrepositories.png b/static/img/assets/linkadditionalrepositories.png new file mode 100644 index 0000000..fce3688 Binary files /dev/null and b/static/img/assets/linkadditionalrepositories.png differ diff --git a/static/img/assets/macOS_export_method.png b/static/img/assets/macOS_export_method.png new file mode 100644 index 0000000..bd494cb Binary files /dev/null and b/static/img/assets/macOS_export_method.png differ diff --git a/static/img/assets/machine-type-selector.png b/static/img/assets/machine-type-selector.png new file mode 100644 index 0000000..0b18c32 Binary files /dev/null and b/static/img/assets/machine-type-selector.png differ diff --git a/static/img/assets/manage-ios-code-1.png b/static/img/assets/manage-ios-code-1.png new file mode 100644 index 0000000..545f1bf Binary files /dev/null and b/static/img/assets/manage-ios-code-1.png differ diff --git a/static/img/assets/manage-ios-code.png b/static/img/assets/manage-ios-code.png new file mode 100644 index 0000000..545f1bf Binary files /dev/null and b/static/img/assets/manage-ios-code.png differ diff --git a/static/img/assets/managingquarantinedtests.png b/static/img/assets/managingquarantinedtests.png new file mode 100644 index 0000000..33faaa6 Binary files /dev/null and b/static/img/assets/managingquarantinedtests.png differ diff --git a/static/img/assets/manual-build-priority.png b/static/img/assets/manual-build-priority.png new file mode 100644 index 0000000..12fffa1 Binary files /dev/null and b/static/img/assets/manual-build-priority.png differ diff --git a/static/img/assets/manual-webhooks.png b/static/img/assets/manual-webhooks.png new file mode 100644 index 0000000..c9a61cc Binary files /dev/null and b/static/img/assets/manual-webhooks.png differ diff --git a/static/img/assets/metric-type.png b/static/img/assets/metric-type.png new file mode 100644 index 0000000..e561242 Binary files /dev/null and b/static/img/assets/metric-type.png differ diff --git a/static/img/assets/most-failing-app-test.png b/static/img/assets/most-failing-app-test.png new file mode 100644 index 0000000..0aab2ea Binary files /dev/null and b/static/img/assets/most-failing-app-test.png differ diff --git a/static/img/assets/most-failing-app.png b/static/img/assets/most-failing-app.png new file mode 100644 index 0000000..0b3670d Binary files /dev/null and b/static/img/assets/most-failing-app.png differ diff --git a/static/img/assets/move-project-button.png b/static/img/assets/move-project-button.png new file mode 100644 index 0000000..17545b0 Binary files /dev/null and b/static/img/assets/move-project-button.png differ diff --git a/static/img/assets/move-project-dialog.png b/static/img/assets/move-project-dialog.png new file mode 100644 index 0000000..1fd5c9a Binary files /dev/null and b/static/img/assets/move-project-dialog.png differ diff --git a/static/img/assets/move-project.png b/static/img/assets/move-project.png new file mode 100644 index 0000000..5b2f0d2 Binary files /dev/null and b/static/img/assets/move-project.png differ diff --git a/static/img/assets/multipleGithuborgs.png b/static/img/assets/multipleGithuborgs.png new file mode 100644 index 0000000..c22525b Binary files /dev/null and b/static/img/assets/multipleGithuborgs.png differ diff --git a/static/img/assets/okta_2.png b/static/img/assets/okta_2.png new file mode 100644 index 0000000..e1ae276 Binary files /dev/null and b/static/img/assets/okta_2.png differ diff --git a/static/img/assets/overview-credits.png b/static/img/assets/overview-credits.png new file mode 100644 index 0000000..723ce7c Binary files /dev/null and b/static/img/assets/overview-credits.png differ diff --git a/static/img/assets/p90-uploads.png b/static/img/assets/p90-uploads.png new file mode 100644 index 0000000..592d39f Binary files /dev/null and b/static/img/assets/p90-uploads.png differ diff --git a/static/img/assets/pic1.jpg b/static/img/assets/pic1.jpg new file mode 100644 index 0000000..adfff45 Binary files /dev/null and b/static/img/assets/pic1.jpg differ diff --git a/static/img/assets/pic2.jpg b/static/img/assets/pic2.jpg new file mode 100644 index 0000000..7ffd74d Binary files /dev/null and b/static/img/assets/pic2.jpg differ diff --git a/static/img/assets/pic3.jpg b/static/img/assets/pic3.jpg new file mode 100644 index 0000000..780fce0 Binary files /dev/null and b/static/img/assets/pic3.jpg differ diff --git a/static/img/assets/pic4.png b/static/img/assets/pic4.png new file mode 100644 index 0000000..4c4d72c Binary files /dev/null and b/static/img/assets/pic4.png differ diff --git a/static/img/assets/pipeline-intermediate.png b/static/img/assets/pipeline-intermediate.png new file mode 100644 index 0000000..c644051 Binary files /dev/null and b/static/img/assets/pipeline-intermediate.png differ diff --git a/static/img/assets/pipeline-priority.png b/static/img/assets/pipeline-priority.png new file mode 100644 index 0000000..6830166 Binary files /dev/null and b/static/img/assets/pipeline-priority.png differ diff --git a/static/img/assets/pipelinebuild-quarantine.png b/static/img/assets/pipelinebuild-quarantine.png new file mode 100644 index 0000000..87951b6 Binary files /dev/null and b/static/img/assets/pipelinebuild-quarantine.png differ diff --git a/static/img/assets/plan-select.png b/static/img/assets/plan-select.png new file mode 100644 index 0000000..ce0a57c Binary files /dev/null and b/static/img/assets/plan-select.png differ diff --git a/static/img/assets/platform-engineer-role.png b/static/img/assets/platform-engineer-role.png new file mode 100644 index 0000000..5c13507 Binary files /dev/null and b/static/img/assets/platform-engineer-role.png differ diff --git a/static/img/assets/prev-vers.png b/static/img/assets/prev-vers.png new file mode 100644 index 0000000..963ad60 Binary files /dev/null and b/static/img/assets/prev-vers.png differ diff --git a/static/img/assets/profile-settings-menu.png b/static/img/assets/profile-settings-menu.png new file mode 100644 index 0000000..7bf2b76 Binary files /dev/null and b/static/img/assets/profile-settings-menu.png differ diff --git a/static/img/assets/project-list.png b/static/img/assets/project-list.png new file mode 100644 index 0000000..6a77186 Binary files /dev/null and b/static/img/assets/project-list.png differ diff --git a/static/img/assets/project-settings-button-1.png b/static/img/assets/project-settings-button-1.png new file mode 100644 index 0000000..4011f11 Binary files /dev/null and b/static/img/assets/project-settings-button-1.png differ diff --git a/static/img/assets/project-settings-main-page.png b/static/img/assets/project-settings-main-page.png new file mode 100644 index 0000000..6f0e49e Binary files /dev/null and b/static/img/assets/project-settings-main-page.png differ diff --git a/static/img/assets/project_selector_arrow.png b/static/img/assets/project_selector_arrow.png new file mode 100644 index 0000000..88f552f Binary files /dev/null and b/static/img/assets/project_selector_arrow.png differ diff --git a/static/img/assets/provisioning_settings.png b/static/img/assets/provisioning_settings.png new file mode 100644 index 0000000..c66d3a8 Binary files /dev/null and b/static/img/assets/provisioning_settings.png differ diff --git a/static/img/assets/push-trigger.png b/static/img/assets/push-trigger.png new file mode 100644 index 0000000..a79fc14 Binary files /dev/null and b/static/img/assets/push-trigger.png differ diff --git a/static/img/assets/push_groups.png b/static/img/assets/push_groups.png new file mode 100644 index 0000000..860a9f0 Binary files /dev/null and b/static/img/assets/push_groups.png differ diff --git a/static/img/assets/push_now.png b/static/img/assets/push_now.png new file mode 100644 index 0000000..2b241c4 Binary files /dev/null and b/static/img/assets/push_now.png differ diff --git a/static/img/assets/push_status_active.png b/static/img/assets/push_status_active.png new file mode 100644 index 0000000..d69dde9 Binary files /dev/null and b/static/img/assets/push_status_active.png differ diff --git a/static/img/assets/qr-code-install.png b/static/img/assets/qr-code-install.png new file mode 100644 index 0000000..506cd06 Binary files /dev/null and b/static/img/assets/qr-code-install.png differ diff --git a/static/img/assets/re_run_test.png b/static/img/assets/re_run_test.png new file mode 100644 index 0000000..67d5db6 Binary files /dev/null and b/static/img/assets/re_run_test.png differ diff --git a/static/img/assets/recent-deliveries.svg b/static/img/assets/recent-deliveries.svg new file mode 100644 index 0000000..7370500 --- /dev/null +++ b/static/img/assets/recent-deliveries.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/assets/redeliver.svg b/static/img/assets/redeliver.svg new file mode 100644 index 0000000..0bac144 --- /dev/null +++ b/static/img/assets/redeliver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/assets/regenerate-token.png b/static/img/assets/regenerate-token.png new file mode 100644 index 0000000..955c91f Binary files /dev/null and b/static/img/assets/regenerate-token.png differ diff --git a/static/img/assets/regex-button.png b/static/img/assets/regex-button.png new file mode 100644 index 0000000..9be144c Binary files /dev/null and b/static/img/assets/regex-button.png differ diff --git a/static/img/assets/register-device-button.png b/static/img/assets/register-device-button.png new file mode 100644 index 0000000..46f56b9 Binary files /dev/null and b/static/img/assets/register-device-button.png differ diff --git a/static/img/assets/register-yes.png b/static/img/assets/register-yes.png new file mode 100644 index 0000000..4828de1 Binary files /dev/null and b/static/img/assets/register-yes.png differ diff --git a/static/img/assets/registering-test-devices.png b/static/img/assets/registering-test-devices.png new file mode 100644 index 0000000..9e8228c Binary files /dev/null and b/static/img/assets/registering-test-devices.png differ diff --git a/static/img/assets/related-builds.png b/static/img/assets/related-builds.png new file mode 100644 index 0000000..cd35798 Binary files /dev/null and b/static/img/assets/related-builds.png differ diff --git a/static/img/assets/related-test-cases-runs-tab.png b/static/img/assets/related-test-cases-runs-tab.png new file mode 100644 index 0000000..4dffb80 Binary files /dev/null and b/static/img/assets/related-test-cases-runs-tab.png differ diff --git a/static/img/assets/related-test-cases.png b/static/img/assets/related-test-cases.png new file mode 100644 index 0000000..80a1874 Binary files /dev/null and b/static/img/assets/related-test-cases.png differ diff --git a/static/img/assets/remove-group.png b/static/img/assets/remove-group.png new file mode 100644 index 0000000..26864f0 Binary files /dev/null and b/static/img/assets/remove-group.png differ diff --git a/static/img/assets/remove-people.png b/static/img/assets/remove-people.png new file mode 100644 index 0000000..2b026ab Binary files /dev/null and b/static/img/assets/remove-people.png differ diff --git a/static/img/assets/remove_member_confirm.png b/static/img/assets/remove_member_confirm.png new file mode 100644 index 0000000..798c3a7 Binary files /dev/null and b/static/img/assets/remove_member_confirm.png differ diff --git a/static/img/assets/remove_png.png b/static/img/assets/remove_png.png new file mode 100644 index 0000000..01b9cd2 Binary files /dev/null and b/static/img/assets/remove_png.png differ diff --git a/static/img/assets/repetition.png b/static/img/assets/repetition.png new file mode 100644 index 0000000..3776f71 Binary files /dev/null and b/static/img/assets/repetition.png differ diff --git a/static/img/assets/run_workflow_edit.png b/static/img/assets/run_workflow_edit.png new file mode 100644 index 0000000..05cf01f Binary files /dev/null and b/static/img/assets/run_workflow_edit.png differ diff --git a/static/img/assets/saml_sso_config.png b/static/img/assets/saml_sso_config.png new file mode 100644 index 0000000..a8c53ff Binary files /dev/null and b/static/img/assets/saml_sso_config.png differ diff --git a/static/img/assets/saml_sso_config_samlsso2.png b/static/img/assets/saml_sso_config_samlsso2.png new file mode 100644 index 0000000..b1430f2 Binary files /dev/null and b/static/img/assets/saml_sso_config_samlsso2.png differ diff --git a/static/img/assets/saml_sso_url.png b/static/img/assets/saml_sso_url.png new file mode 100644 index 0000000..ca85b96 Binary files /dev/null and b/static/img/assets/saml_sso_url.png differ diff --git a/static/img/assets/saml_status.png b/static/img/assets/saml_status.png new file mode 100644 index 0000000..f0b5b36 Binary files /dev/null and b/static/img/assets/saml_status.png differ diff --git a/static/img/assets/schedule-basic.png b/static/img/assets/schedule-basic.png new file mode 100644 index 0000000..8a2c24e Binary files /dev/null and b/static/img/assets/schedule-basic.png differ diff --git a/static/img/assets/scheme-input.png b/static/img/assets/scheme-input.png new file mode 100644 index 0000000..e1733c5 Binary files /dev/null and b/static/img/assets/scheme-input.png differ diff --git a/static/img/assets/scim_connection_2.png b/static/img/assets/scim_connection_2.png new file mode 100644 index 0000000..26eb770 Binary files /dev/null and b/static/img/assets/scim_connection_2.png differ diff --git a/static/img/assets/scim_provisioning.png b/static/img/assets/scim_provisioning.png new file mode 100644 index 0000000..8a56833 Binary files /dev/null and b/static/img/assets/scim_provisioning.png differ diff --git a/static/img/assets/scim_setting.png b/static/img/assets/scim_setting.png new file mode 100644 index 0000000..7d5f39f Binary files /dev/null and b/static/img/assets/scim_setting.png differ diff --git a/static/img/assets/select-repository.png b/static/img/assets/select-repository.png new file mode 100644 index 0000000..88c6c5c Binary files /dev/null and b/static/img/assets/select-repository.png differ diff --git a/static/img/assets/select_branch.png b/static/img/assets/select_branch.png new file mode 100644 index 0000000..f24b230 Binary files /dev/null and b/static/img/assets/select_branch.png differ diff --git a/static/img/assets/select_git_repo.png b/static/img/assets/select_git_repo.png new file mode 100644 index 0000000..3f9ecae Binary files /dev/null and b/static/img/assets/select_git_repo.png differ diff --git a/static/img/assets/self-hosted-gitlab.png b/static/img/assets/self-hosted-gitlab.png new file mode 100644 index 0000000..5d6a9b0 Binary files /dev/null and b/static/img/assets/self-hosted-gitlab.png differ diff --git a/static/img/assets/service-credential-user.png b/static/img/assets/service-credential-user.png new file mode 100644 index 0000000..4910c3f Binary files /dev/null and b/static/img/assets/service-credential-user.png differ diff --git a/static/img/assets/shard-calculate-product-path.png b/static/img/assets/shard-calculate-product-path.png new file mode 100644 index 0000000..8cf781f Binary files /dev/null and b/static/img/assets/shard-calculate-product-path.png differ diff --git a/static/img/assets/shards-deploy-to-bitrise.png b/static/img/assets/shards-deploy-to-bitrise.png new file mode 100644 index 0000000..a6e0b18 Binary files /dev/null and b/static/img/assets/shards-deploy-to-bitrise.png differ diff --git a/static/img/assets/shards-pipeline.png b/static/img/assets/shards-pipeline.png new file mode 100644 index 0000000..aa87615 Binary files /dev/null and b/static/img/assets/shards-pipeline.png differ diff --git a/static/img/assets/shared-res.png b/static/img/assets/shared-res.png new file mode 100644 index 0000000..26fc971 Binary files /dev/null and b/static/img/assets/shared-res.png differ diff --git a/static/img/assets/show-config-yaml.png b/static/img/assets/show-config-yaml.png new file mode 100644 index 0000000..4f2da09 Binary files /dev/null and b/static/img/assets/show-config-yaml.png differ diff --git a/static/img/assets/sso-certificate.png b/static/img/assets/sso-certificate.png new file mode 100644 index 0000000..037c449 Binary files /dev/null and b/static/img/assets/sso-certificate.png differ diff --git a/static/img/assets/sso-setup.png b/static/img/assets/sso-setup.png new file mode 100644 index 0000000..ad26008 Binary files /dev/null and b/static/img/assets/sso-setup.png differ diff --git a/static/img/assets/stable-stack.png b/static/img/assets/stable-stack.png new file mode 100644 index 0000000..aef76f6 Binary files /dev/null and b/static/img/assets/stable-stack.png differ diff --git a/static/img/assets/stack-lifecycle.png b/static/img/assets/stack-lifecycle.png new file mode 100644 index 0000000..8b621c4 Binary files /dev/null and b/static/img/assets/stack-lifecycle.png differ diff --git a/static/img/assets/stack-updates-edge-beta.png b/static/img/assets/stack-updates-edge-beta.png new file mode 100644 index 0000000..c9bf427 Binary files /dev/null and b/static/img/assets/stack-updates-edge-beta.png differ diff --git a/static/img/assets/stack-updates-edge-minor.png b/static/img/assets/stack-updates-edge-minor.png new file mode 100644 index 0000000..b0b39d4 Binary files /dev/null and b/static/img/assets/stack-updates-edge-minor.png differ diff --git a/static/img/assets/stack-updates-edge.png b/static/img/assets/stack-updates-edge.png new file mode 100644 index 0000000..353acfa Binary files /dev/null and b/static/img/assets/stack-updates-edge.png differ diff --git a/static/img/assets/stack-updates-stable-xcode-minor.png b/static/img/assets/stack-updates-stable-xcode-minor.png new file mode 100644 index 0000000..d7f5996 Binary files /dev/null and b/static/img/assets/stack-updates-stable-xcode-minor.png differ diff --git a/static/img/assets/start-build-advanced.png b/static/img/assets/start-build-advanced.png new file mode 100644 index 0000000..0434eef Binary files /dev/null and b/static/img/assets/start-build-advanced.png differ diff --git a/static/img/assets/start-build-basic.png b/static/img/assets/start-build-basic.png new file mode 100644 index 0000000..bc81a51 Binary files /dev/null and b/static/img/assets/start-build-basic.png differ diff --git a/static/img/assets/start-build.png b/static/img/assets/start-build.png new file mode 100644 index 0000000..3b38cd1 Binary files /dev/null and b/static/img/assets/start-build.png differ diff --git a/static/img/assets/started-build-cache.png b/static/img/assets/started-build-cache.png new file mode 100644 index 0000000..e41bd43 Binary files /dev/null and b/static/img/assets/started-build-cache.png differ diff --git a/static/img/assets/step-failed-quickly.png b/static/img/assets/step-failed-quickly.png new file mode 100644 index 0000000..efe498c Binary files /dev/null and b/static/img/assets/step-failed-quickly.png differ diff --git a/static/img/assets/step-force-output.png b/static/img/assets/step-force-output.png new file mode 100644 index 0000000..56b39d2 Binary files /dev/null and b/static/img/assets/step-force-output.png differ diff --git a/static/img/assets/step-took-long.png b/static/img/assets/step-took-long.png new file mode 100644 index 0000000..b394a3b Binary files /dev/null and b/static/img/assets/step-took-long.png differ diff --git a/static/img/assets/stopped-using-cache.png b/static/img/assets/stopped-using-cache.png new file mode 100644 index 0000000..314292e Binary files /dev/null and b/static/img/assets/stopped-using-cache.png differ diff --git a/static/img/assets/store-bitrise-yml.png b/static/img/assets/store-bitrise-yml.png new file mode 100644 index 0000000..883a329 Binary files /dev/null and b/static/img/assets/store-bitrise-yml.png differ diff --git a/static/img/assets/task-reason.png b/static/img/assets/task-reason.png new file mode 100644 index 0000000..c00a1bf Binary files /dev/null and b/static/img/assets/task-reason.png differ diff --git a/static/img/assets/teams-sub.png b/static/img/assets/teams-sub.png new file mode 100644 index 0000000..775b3cf Binary files /dev/null and b/static/img/assets/teams-sub.png differ diff --git a/static/img/assets/test-case-history.png b/static/img/assets/test-case-history.png new file mode 100644 index 0000000..93fbca4 Binary files /dev/null and b/static/img/assets/test-case-history.png differ diff --git a/static/img/assets/test-cases-list.png b/static/img/assets/test-cases-list.png new file mode 100644 index 0000000..1cff949 Binary files /dev/null and b/static/img/assets/test-cases-list.png differ diff --git a/static/img/assets/test-devices-menu.png b/static/img/assets/test-devices-menu.png new file mode 100644 index 0000000..ee1657d Binary files /dev/null and b/static/img/assets/test-devices-menu.png differ diff --git a/static/img/assets/test-failure-rate-tab.png b/static/img/assets/test-failure-rate-tab.png new file mode 100644 index 0000000..bfa8335 Binary files /dev/null and b/static/img/assets/test-failure-rate-tab.png differ diff --git a/static/img/assets/test-repetition.png b/static/img/assets/test-repetition.png new file mode 100644 index 0000000..93b78ae Binary files /dev/null and b/static/img/assets/test-repetition.png differ diff --git a/static/img/assets/test-run.png b/static/img/assets/test-run.png new file mode 100644 index 0000000..a7dc220 Binary files /dev/null and b/static/img/assets/test-run.png differ diff --git a/static/img/assets/test_connector.png b/static/img/assets/test_connector.png new file mode 100644 index 0000000..4ead7d4 Binary files /dev/null and b/static/img/assets/test_connector.png differ diff --git a/static/img/assets/test_devices.png b/static/img/assets/test_devices.png new file mode 100644 index 0000000..ef8322a Binary files /dev/null and b/static/img/assets/test_devices.png differ diff --git a/static/img/assets/test_reports.png b/static/img/assets/test_reports.png new file mode 100644 index 0000000..83f7c3a Binary files /dev/null and b/static/img/assets/test_reports.png differ diff --git a/static/img/assets/tester-qa-role.png b/static/img/assets/tester-qa-role.png new file mode 100644 index 0000000..86616dc Binary files /dev/null and b/static/img/assets/tester-qa-role.png differ diff --git a/static/img/assets/testflight-testing-int-ext.png b/static/img/assets/testflight-testing-int-ext.png new file mode 100644 index 0000000..0e7893a Binary files /dev/null and b/static/img/assets/testflight-testing-int-ext.png differ diff --git a/static/img/assets/testflight-upload.png b/static/img/assets/testflight-upload.png new file mode 100644 index 0000000..96454ee Binary files /dev/null and b/static/img/assets/testflight-upload.png differ diff --git a/static/img/assets/testing-google-play-cant-replace.png b/static/img/assets/testing-google-play-cant-replace.png new file mode 100644 index 0000000..5baf43e Binary files /dev/null and b/static/img/assets/testing-google-play-cant-replace.png differ diff --git a/static/img/assets/tick.svg b/static/img/assets/tick.svg new file mode 100644 index 0000000..f8b6a47 --- /dev/null +++ b/static/img/assets/tick.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/assets/timeframe-artifacts.png b/static/img/assets/timeframe-artifacts.png new file mode 100644 index 0000000..6377055 Binary files /dev/null and b/static/img/assets/timeframe-artifacts.png differ diff --git a/static/img/assets/total-duration.png b/static/img/assets/total-duration.png new file mode 100644 index 0000000..a6d5dda Binary files /dev/null and b/static/img/assets/total-duration.png differ diff --git a/static/img/assets/trends.png b/static/img/assets/trends.png new file mode 100644 index 0000000..517dcc6 Binary files /dev/null and b/static/img/assets/trends.png differ diff --git a/static/img/assets/trigger-in-workflow.png b/static/img/assets/trigger-in-workflow.png new file mode 100644 index 0000000..8efe3bc Binary files /dev/null and b/static/img/assets/trigger-in-workflow.png differ diff --git a/static/img/assets/trigger-priority.png b/static/img/assets/trigger-priority.png new file mode 100644 index 0000000..2be4de2 Binary files /dev/null and b/static/img/assets/trigger-priority.png differ diff --git a/static/img/assets/upload-code-signing.png b/static/img/assets/upload-code-signing.png new file mode 100644 index 0000000..cabfc4b Binary files /dev/null and b/static/img/assets/upload-code-signing.png differ diff --git a/static/img/assets/upload-complete.png b/static/img/assets/upload-complete.png new file mode 100644 index 0000000..5fdad71 Binary files /dev/null and b/static/img/assets/upload-complete.png differ diff --git a/static/img/assets/view-details-token.png b/static/img/assets/view-details-token.png new file mode 100644 index 0000000..59bb9f6 Binary files /dev/null and b/static/img/assets/view-details-token.png differ diff --git a/static/img/assets/vscode.png b/static/img/assets/vscode.png new file mode 100644 index 0000000..b867104 Binary files /dev/null and b/static/img/assets/vscode.png differ diff --git a/static/img/assets/webhooks-redeliver.png b/static/img/assets/webhooks-redeliver.png new file mode 100644 index 0000000..0434a52 Binary files /dev/null and b/static/img/assets/webhooks-redeliver.png differ diff --git a/static/img/assets/webhooks-tab.png b/static/img/assets/webhooks-tab.png new file mode 100644 index 0000000..7f882de Binary files /dev/null and b/static/img/assets/webhooks-tab.png differ diff --git a/static/img/assets/weekly-view.png b/static/img/assets/weekly-view.png new file mode 100644 index 0000000..bf7d0de Binary files /dev/null and b/static/img/assets/weekly-view.png differ diff --git a/static/img/assets/workflow-breakdown-chart.png b/static/img/assets/workflow-breakdown-chart.png new file mode 100644 index 0000000..4460850 Binary files /dev/null and b/static/img/assets/workflow-breakdown-chart.png differ diff --git a/static/img/assets/workflow-chain-options.png b/static/img/assets/workflow-chain-options.png new file mode 100644 index 0000000..f411ae3 Binary files /dev/null and b/static/img/assets/workflow-chain-options.png differ diff --git a/static/img/assets/workflow-level-status-report.png b/static/img/assets/workflow-level-status-report.png new file mode 100644 index 0000000..ea2db41 Binary files /dev/null and b/static/img/assets/workflow-level-status-report.png differ diff --git a/static/img/assets/workflow-priority.png b/static/img/assets/workflow-priority.png new file mode 100644 index 0000000..5b5a8fb Binary files /dev/null and b/static/img/assets/workflow-priority.png differ diff --git a/static/img/assets/workflow-properties-ellipsis.png b/static/img/assets/workflow-properties-ellipsis.png new file mode 100644 index 0000000..0ed4133 Binary files /dev/null and b/static/img/assets/workflow-properties-ellipsis.png differ diff --git a/static/img/assets/workflow-properties.png b/static/img/assets/workflow-properties.png new file mode 100644 index 0000000..35b3516 Binary files /dev/null and b/static/img/assets/workflow-properties.png differ diff --git a/static/img/assets/workspace-api-token.svg b/static/img/assets/workspace-api-token.svg new file mode 100644 index 0000000..421491d --- /dev/null +++ b/static/img/assets/workspace-api-token.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/assets/ws-secrets.png b/static/img/assets/ws-secrets.png new file mode 100644 index 0000000..6ef4205 Binary files /dev/null and b/static/img/assets/ws-secrets.png differ diff --git a/static/img/assets/xcode-archive.png b/static/img/assets/xcode-archive.png new file mode 100644 index 0000000..1583802 Binary files /dev/null and b/static/img/assets/xcode-archive.png differ diff --git a/static/img/assets/yaml-source-switchback-dialog.png b/static/img/assets/yaml-source-switchback-dialog.png new file mode 100644 index 0000000..f562aa5 Binary files /dev/null and b/static/img/assets/yaml-source-switchback-dialog.png differ diff --git a/static/img/authorize-bitbucket.png b/static/img/authorize-bitbucket.png new file mode 100644 index 0000000..cd3b22d Binary files /dev/null and b/static/img/authorize-bitbucket.png differ diff --git a/static/img/authorize-gitlab.png b/static/img/authorize-gitlab.png new file mode 100644 index 0000000..9b6b2ab Binary files /dev/null and b/static/img/authorize-gitlab.png differ diff --git a/static/img/authzero_addappname2.png b/static/img/authzero_addappname2.png new file mode 100644 index 0000000..4ecd692 Binary files /dev/null and b/static/img/authzero_addappname2.png differ diff --git a/static/img/authzero_addon4.png b/static/img/authzero_addon4.png new file mode 100644 index 0000000..4527ad5 Binary files /dev/null and b/static/img/authzero_addon4.png differ diff --git a/static/img/authzero_createapp1.png b/static/img/authzero_createapp1.png new file mode 100644 index 0000000..e5e3640 Binary files /dev/null and b/static/img/authzero_createapp1.png differ diff --git a/static/img/authzero_downloadcertificateusage9.png b/static/img/authzero_downloadcertificateusage9.png new file mode 100644 index 0000000..a8ada32 Binary files /dev/null and b/static/img/authzero_downloadcertificateusage9.png differ diff --git a/static/img/authzero_samlappenabled8.png b/static/img/authzero_samlappenabled8.png new file mode 100644 index 0000000..7b759cb Binary files /dev/null and b/static/img/authzero_samlappenabled8.png differ diff --git a/static/img/authzero_settingsapplicationurl6.png b/static/img/authzero_settingsapplicationurl6.png new file mode 100644 index 0000000..bc77fb9 Binary files /dev/null and b/static/img/authzero_settingsapplicationurl6.png differ diff --git a/static/img/autocomplete.png b/static/img/autocomplete.png new file mode 100644 index 0000000..861acca Binary files /dev/null and b/static/img/autocomplete.png differ diff --git a/static/img/azureactivedirstep2-1.jpg b/static/img/azureactivedirstep2-1.jpg new file mode 100644 index 0000000..555e6d7 Binary files /dev/null and b/static/img/azureactivedirstep2-1.jpg differ diff --git a/static/img/azureuser1-1.jpg b/static/img/azureuser1-1.jpg new file mode 100644 index 0000000..a841827 Binary files /dev/null and b/static/img/azureuser1-1.jpg differ diff --git a/static/img/azureuser2-1.jpg b/static/img/azureuser2-1.jpg new file mode 100644 index 0000000..6438e59 Binary files /dev/null and b/static/img/azureuser2-1.jpg differ diff --git a/static/img/azureuser3b-1.jpg b/static/img/azureuser3b-1.jpg new file mode 100644 index 0000000..687c66d Binary files /dev/null and b/static/img/azureuser3b-1.jpg differ diff --git a/static/img/baseencoded.jpg b/static/img/baseencoded.jpg new file mode 100644 index 0000000..d534bee Binary files /dev/null and b/static/img/baseencoded.jpg differ diff --git a/static/img/brand/adding-app.svg b/static/img/brand/adding-app.svg new file mode 100644 index 0000000..9bd8dd7 --- /dev/null +++ b/static/img/brand/adding-app.svg @@ -0,0 +1 @@ +icon \ No newline at end of file diff --git a/static/img/brand/bitrise-docs-logo.svg b/static/img/brand/bitrise-docs-logo.svg new file mode 100644 index 0000000..c6bfe87 --- /dev/null +++ b/static/img/brand/bitrise-docs-logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/brand/deploy.svg b/static/img/brand/deploy.svg new file mode 100644 index 0000000..8b9f123 --- /dev/null +++ b/static/img/brand/deploy.svg @@ -0,0 +1,25 @@ + + + + deploy-to-bitrise-io-stepicon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/brand/getting-started.svg b/static/img/brand/getting-started.svg new file mode 100644 index 0000000..d7d4434 --- /dev/null +++ b/static/img/brand/getting-started.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/static/img/brand/icon-build-cache-24px.svg b/static/img/brand/icon-build-cache-24px.svg new file mode 100644 index 0000000..4b7d10c --- /dev/null +++ b/static/img/brand/icon-build-cache-24px.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/static/img/brand/icon-chevron-down-16px.svg b/static/img/brand/icon-chevron-down-16px.svg new file mode 100644 index 0000000..61089ff --- /dev/null +++ b/static/img/brand/icon-chevron-down-16px.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/brand/icon-chevron-up-16px.svg b/static/img/brand/icon-chevron-up-16px.svg new file mode 100644 index 0000000..3fb3101 --- /dev/null +++ b/static/img/brand/icon-chevron-up-16px.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/brand/icon-ci-24px.svg b/static/img/brand/icon-ci-24px.svg new file mode 100644 index 0000000..cbc1996 --- /dev/null +++ b/static/img/brand/icon-ci-24px.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/static/img/brand/icon-cpu-24px.svg b/static/img/brand/icon-cpu-24px.svg new file mode 100644 index 0000000..91b92a7 --- /dev/null +++ b/static/img/brand/icon-cpu-24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/static/img/brand/icon-dashboard-24px.svg b/static/img/brand/icon-dashboard-24px.svg new file mode 100644 index 0000000..813b1ae --- /dev/null +++ b/static/img/brand/icon-dashboard-24px.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/static/img/brand/icon-error-circle-filled-24px.svg b/static/img/brand/icon-error-circle-filled-24px.svg new file mode 100644 index 0000000..7205dcb --- /dev/null +++ b/static/img/brand/icon-error-circle-filled-24px.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/brand/icon-info-circle-24px.svg b/static/img/brand/icon-info-circle-24px.svg new file mode 100644 index 0000000..81a7181 --- /dev/null +++ b/static/img/brand/icon-info-circle-24px.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/static/img/brand/icon-insights-24px.svg b/static/img/brand/icon-insights-24px.svg new file mode 100644 index 0000000..17a58c2 --- /dev/null +++ b/static/img/brand/icon-insights-24px.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/static/img/brand/icon-lightbulb-24px.svg b/static/img/brand/icon-lightbulb-24px.svg new file mode 100644 index 0000000..bb34db9 --- /dev/null +++ b/static/img/brand/icon-lightbulb-24px.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/static/img/brand/icon-magnifier-24px.svg b/static/img/brand/icon-magnifier-24px.svg new file mode 100644 index 0000000..11d6dfc --- /dev/null +++ b/static/img/brand/icon-magnifier-24px.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/brand/icon-release-24px.svg b/static/img/brand/icon-release-24px.svg new file mode 100644 index 0000000..1455f8a --- /dev/null +++ b/static/img/brand/icon-release-24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/static/img/brand/icon-warning-24px.svg b/static/img/brand/icon-warning-24px.svg new file mode 100644 index 0000000..951b65a --- /dev/null +++ b/static/img/brand/icon-warning-24px.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/static/img/brand/ios-deploy.svg b/static/img/brand/ios-deploy.svg new file mode 100644 index 0000000..b4a8809 --- /dev/null +++ b/static/img/brand/ios-deploy.svg @@ -0,0 +1,37 @@ + + + + deploy-to-itunes-Connect + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/brand/navicons/anchor.svg b/static/img/brand/navicons/anchor.svg new file mode 100644 index 0000000..732fcd2 --- /dev/null +++ b/static/img/brand/navicons/anchor.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/brand/navicons/app.svg b/static/img/brand/navicons/app.svg new file mode 100644 index 0000000..4065e17 --- /dev/null +++ b/static/img/brand/navicons/app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/book.svg b/static/img/brand/navicons/book.svg new file mode 100644 index 0000000..8bcde49 --- /dev/null +++ b/static/img/brand/navicons/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/bug.svg b/static/img/brand/navicons/bug.svg new file mode 100644 index 0000000..c26c2ca --- /dev/null +++ b/static/img/brand/navicons/bug.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/build.svg b/static/img/brand/navicons/build.svg new file mode 100644 index 0000000..2278802 --- /dev/null +++ b/static/img/brand/navicons/build.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/cache.svg b/static/img/brand/navicons/cache.svg new file mode 100644 index 0000000..c8bfe16 --- /dev/null +++ b/static/img/brand/navicons/cache.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/caching.svg b/static/img/brand/navicons/caching.svg new file mode 100644 index 0000000..6ead981 --- /dev/null +++ b/static/img/brand/navicons/caching.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/chat-message.svg b/static/img/brand/navicons/chat-message.svg new file mode 100644 index 0000000..27524f9 --- /dev/null +++ b/static/img/brand/navicons/chat-message.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/close-small-focus.svg b/static/img/brand/navicons/close-small-focus.svg new file mode 100644 index 0000000..341093a --- /dev/null +++ b/static/img/brand/navicons/close-small-focus.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/close-small.svg b/static/img/brand/navicons/close-small.svg new file mode 100644 index 0000000..91f4f71 --- /dev/null +++ b/static/img/brand/navicons/close-small.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/code-index-focus.svg b/static/img/brand/navicons/code-index-focus.svg new file mode 100644 index 0000000..040de69 --- /dev/null +++ b/static/img/brand/navicons/code-index-focus.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/code-index.svg b/static/img/brand/navicons/code-index.svg new file mode 100644 index 0000000..7ad06e1 --- /dev/null +++ b/static/img/brand/navicons/code-index.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/code-signing-index-focus.svg b/static/img/brand/navicons/code-signing-index-focus.svg new file mode 100644 index 0000000..e4ef0ac --- /dev/null +++ b/static/img/brand/navicons/code-signing-index-focus.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/code-signing-index.svg b/static/img/brand/navicons/code-signing-index.svg new file mode 100644 index 0000000..b8a3d23 --- /dev/null +++ b/static/img/brand/navicons/code-signing-index.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/code-signing.svg b/static/img/brand/navicons/code-signing.svg new file mode 100644 index 0000000..016b9c7 --- /dev/null +++ b/static/img/brand/navicons/code-signing.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/code.svg b/static/img/brand/navicons/code.svg new file mode 100644 index 0000000..c11557f --- /dev/null +++ b/static/img/brand/navicons/code.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/connectivity.svg b/static/img/brand/navicons/connectivity.svg new file mode 100644 index 0000000..cb70376 --- /dev/null +++ b/static/img/brand/navicons/connectivity.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/brand/navicons/cpu-active.svg b/static/img/brand/navicons/cpu-active.svg new file mode 100644 index 0000000..faddd37 --- /dev/null +++ b/static/img/brand/navicons/cpu-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/cpu-focus.svg b/static/img/brand/navicons/cpu-focus.svg new file mode 100644 index 0000000..faddd37 --- /dev/null +++ b/static/img/brand/navicons/cpu-focus.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/cpu.svg b/static/img/brand/navicons/cpu.svg new file mode 100644 index 0000000..68b24ea --- /dev/null +++ b/static/img/brand/navicons/cpu.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/dependencies.svg b/static/img/brand/navicons/dependencies.svg new file mode 100644 index 0000000..53002e9 --- /dev/null +++ b/static/img/brand/navicons/dependencies.svg @@ -0,0 +1,8 @@ + + + icons / steps + Created with Sketch. + + + + \ No newline at end of file diff --git a/static/img/brand/navicons/deployment.svg b/static/img/brand/navicons/deployment.svg new file mode 100644 index 0000000..aef0e1d --- /dev/null +++ b/static/img/brand/navicons/deployment.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/devops.svg b/static/img/brand/navicons/devops.svg new file mode 100644 index 0000000..01dd37a --- /dev/null +++ b/static/img/brand/navicons/devops.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/brand/navicons/doc-nav-active.svg b/static/img/brand/navicons/doc-nav-active.svg new file mode 100644 index 0000000..d21b5a2 --- /dev/null +++ b/static/img/brand/navicons/doc-nav-active.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/doc-nav.svg b/static/img/brand/navicons/doc-nav.svg new file mode 100644 index 0000000..d005dc6 --- /dev/null +++ b/static/img/brand/navicons/doc-nav.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/doc.svg b/static/img/brand/navicons/doc.svg new file mode 100644 index 0000000..3b4e5b4 --- /dev/null +++ b/static/img/brand/navicons/doc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/dudes.svg b/static/img/brand/navicons/dudes.svg new file mode 100644 index 0000000..9acd88f --- /dev/null +++ b/static/img/brand/navicons/dudes.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/getting-started-index.svg b/static/img/brand/navicons/getting-started-index.svg new file mode 100644 index 0000000..cf3aa73 --- /dev/null +++ b/static/img/brand/navicons/getting-started-index.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/getting-started.svg b/static/img/brand/navicons/getting-started.svg new file mode 100644 index 0000000..d11a071 --- /dev/null +++ b/static/img/brand/navicons/getting-started.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/github.svg b/static/img/brand/navicons/github.svg new file mode 100644 index 0000000..aa68730 --- /dev/null +++ b/static/img/brand/navicons/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/globe.svg b/static/img/brand/navicons/globe.svg new file mode 100644 index 0000000..2dc66eb --- /dev/null +++ b/static/img/brand/navicons/globe.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/info.svg b/static/img/brand/navicons/info.svg new file mode 100644 index 0000000..c5cf3d2 --- /dev/null +++ b/static/img/brand/navicons/info.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/info_main-focus.svg b/static/img/brand/navicons/info_main-focus.svg new file mode 100644 index 0000000..fb0bbff --- /dev/null +++ b/static/img/brand/navicons/info_main-focus.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/info_main.svg b/static/img/brand/navicons/info_main.svg new file mode 100644 index 0000000..ff0c096 --- /dev/null +++ b/static/img/brand/navicons/info_main.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/insights.svg b/static/img/brand/navicons/insights.svg new file mode 100644 index 0000000..363cc6b --- /dev/null +++ b/static/img/brand/navicons/insights.svg @@ -0,0 +1 @@ +> \ No newline at end of file diff --git a/static/img/brand/navicons/laptop-active.svg b/static/img/brand/navicons/laptop-active.svg new file mode 100644 index 0000000..d806378 --- /dev/null +++ b/static/img/brand/navicons/laptop-active.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/laptop.svg b/static/img/brand/navicons/laptop.svg new file mode 100644 index 0000000..50e15a8 --- /dev/null +++ b/static/img/brand/navicons/laptop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/last_updated.svg b/static/img/brand/navicons/last_updated.svg new file mode 100644 index 0000000..52cb5b7 --- /dev/null +++ b/static/img/brand/navicons/last_updated.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/brand/navicons/lightbulb.svg b/static/img/brand/navicons/lightbulb.svg new file mode 100644 index 0000000..0e21b70 --- /dev/null +++ b/static/img/brand/navicons/lightbulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/lightbulb_main.svg b/static/img/brand/navicons/lightbulb_main.svg new file mode 100644 index 0000000..9fdb6ce --- /dev/null +++ b/static/img/brand/navicons/lightbulb_main.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/linktarget-blue.svg b/static/img/brand/navicons/linktarget-blue.svg new file mode 100644 index 0000000..f0ec71b --- /dev/null +++ b/static/img/brand/navicons/linktarget-blue.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/linktarget-green.svg b/static/img/brand/navicons/linktarget-green.svg new file mode 100644 index 0000000..f28c55d --- /dev/null +++ b/static/img/brand/navicons/linktarget-green.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/linktarget.svg b/static/img/brand/navicons/linktarget.svg new file mode 100644 index 0000000..c51f37f --- /dev/null +++ b/static/img/brand/navicons/linktarget.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/magnifier.svg b/static/img/brand/navicons/magnifier.svg new file mode 100644 index 0000000..0485bb6 --- /dev/null +++ b/static/img/brand/navicons/magnifier.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/menu-hamburger.svg b/static/img/brand/navicons/menu-hamburger.svg new file mode 100644 index 0000000..b9a7deb --- /dev/null +++ b/static/img/brand/navicons/menu-hamburger.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/minus-close.svg b/static/img/brand/navicons/minus-close.svg new file mode 100644 index 0000000..398003c --- /dev/null +++ b/static/img/brand/navicons/minus-close.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/monitoring.svg b/static/img/brand/navicons/monitoring.svg new file mode 100644 index 0000000..12f10a9 --- /dev/null +++ b/static/img/brand/navicons/monitoring.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/moon.svg b/static/img/brand/navicons/moon.svg new file mode 100644 index 0000000..6adbe70 --- /dev/null +++ b/static/img/brand/navicons/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/office.svg b/static/img/brand/navicons/office.svg new file mode 100644 index 0000000..c8da43a --- /dev/null +++ b/static/img/brand/navicons/office.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/brand/navicons/pencil.svg b/static/img/brand/navicons/pencil.svg new file mode 100644 index 0000000..66a8c97 --- /dev/null +++ b/static/img/brand/navicons/pencil.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/pencil_edit.svg b/static/img/brand/navicons/pencil_edit.svg new file mode 100644 index 0000000..2a08a43 --- /dev/null +++ b/static/img/brand/navicons/pencil_edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/plus-open.svg b/static/img/brand/navicons/plus-open.svg new file mode 100644 index 0000000..7972436 --- /dev/null +++ b/static/img/brand/navicons/plus-open.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/release-mgt.svg b/static/img/brand/navicons/release-mgt.svg new file mode 100644 index 0000000..b6630d0 --- /dev/null +++ b/static/img/brand/navicons/release-mgt.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/img/brand/navicons/ship-index.svg b/static/img/brand/navicons/ship-index.svg new file mode 100644 index 0000000..d0f4189 --- /dev/null +++ b/static/img/brand/navicons/ship-index.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/sun.svg b/static/img/brand/navicons/sun.svg new file mode 100644 index 0000000..53a9a75 --- /dev/null +++ b/static/img/brand/navicons/sun.svg @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/static/img/brand/navicons/support.svg b/static/img/brand/navicons/support.svg new file mode 100644 index 0000000..975d2b9 --- /dev/null +++ b/static/img/brand/navicons/support.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/testing-active.svg b/static/img/brand/navicons/testing-active.svg new file mode 100644 index 0000000..5205e65 --- /dev/null +++ b/static/img/brand/navicons/testing-active.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/testing-index.svg b/static/img/brand/navicons/testing-index.svg new file mode 100644 index 0000000..6de7718 --- /dev/null +++ b/static/img/brand/navicons/testing-index.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/testing.svg b/static/img/brand/navicons/testing.svg new file mode 100644 index 0000000..00d7e11 --- /dev/null +++ b/static/img/brand/navicons/testing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/brand/navicons/tick.svg b/static/img/brand/navicons/tick.svg new file mode 100644 index 0000000..f8b6a47 --- /dev/null +++ b/static/img/brand/navicons/tick.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/trigger-active.svg b/static/img/brand/navicons/trigger-active.svg new file mode 100644 index 0000000..86cfca1 --- /dev/null +++ b/static/img/brand/navicons/trigger-active.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/trigger-index.svg b/static/img/brand/navicons/trigger-index.svg new file mode 100644 index 0000000..08ac091 --- /dev/null +++ b/static/img/brand/navicons/trigger-index.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/static/img/brand/navicons/trigger.svg b/static/img/brand/navicons/trigger.svg new file mode 100644 index 0000000..54dde6d --- /dev/null +++ b/static/img/brand/navicons/trigger.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/warning.svg b/static/img/brand/navicons/warning.svg new file mode 100644 index 0000000..7f38d34 --- /dev/null +++ b/static/img/brand/navicons/warning.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/webhooks-active.svg b/static/img/brand/navicons/webhooks-active.svg new file mode 100644 index 0000000..4af1ac0 --- /dev/null +++ b/static/img/brand/navicons/webhooks-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/webhooks.svg b/static/img/brand/navicons/webhooks.svg new file mode 100644 index 0000000..2c0264d --- /dev/null +++ b/static/img/brand/navicons/webhooks.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/window-active.svg b/static/img/brand/navicons/window-active.svg new file mode 100644 index 0000000..4926200 --- /dev/null +++ b/static/img/brand/navicons/window-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/window-focus.svg b/static/img/brand/navicons/window-focus.svg new file mode 100644 index 0000000..4926200 --- /dev/null +++ b/static/img/brand/navicons/window-focus.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/brand/navicons/window.svg b/static/img/brand/navicons/window.svg new file mode 100644 index 0000000..dff2e2e --- /dev/null +++ b/static/img/brand/navicons/window.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/static/img/brand/navicons/workflow-active.svg b/static/img/brand/navicons/workflow-active.svg new file mode 100644 index 0000000..8737217 --- /dev/null +++ b/static/img/brand/navicons/workflow-active.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/brand/navicons/workflow-index.svg b/static/img/brand/navicons/workflow-index.svg new file mode 100644 index 0000000..fc44a11 --- /dev/null +++ b/static/img/brand/navicons/workflow-index.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/navicons/workflow.svg b/static/img/brand/navicons/workflow.svg new file mode 100644 index 0000000..9b33b40 --- /dev/null +++ b/static/img/brand/navicons/workflow.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/brand/paligo-logo.png b/static/img/brand/paligo-logo.png new file mode 100644 index 0000000..d084ada Binary files /dev/null and b/static/img/brand/paligo-logo.png differ diff --git a/static/img/brand/portal-header-illustration.png b/static/img/brand/portal-header-illustration.png new file mode 100644 index 0000000..da995dc Binary files /dev/null and b/static/img/brand/portal-header-illustration.png differ diff --git a/static/img/brand/release.svg b/static/img/brand/release.svg new file mode 100644 index 0000000..9508eb2 --- /dev/null +++ b/static/img/brand/release.svg @@ -0,0 +1 @@ +icon \ No newline at end of file diff --git a/static/img/brand/starting-builds.svg b/static/img/brand/starting-builds.svg new file mode 100644 index 0000000..2fd5944 --- /dev/null +++ b/static/img/brand/starting-builds.svg @@ -0,0 +1,27 @@ + + + + bitrise-start-workflow-stepicon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/brand/step-icon.svg b/static/img/brand/step-icon.svg new file mode 100644 index 0000000..d659e4c --- /dev/null +++ b/static/img/brand/step-icon.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + diff --git a/static/img/certificate-1.jpg b/static/img/certificate-1.jpg new file mode 100644 index 0000000..1ab1bd2 Binary files /dev/null and b/static/img/certificate-1.jpg differ diff --git a/static/img/certtoken-1.jpg b/static/img/certtoken-1.jpg new file mode 100644 index 0000000..4223ab3 Binary files /dev/null and b/static/img/certtoken-1.jpg differ diff --git a/static/img/certwizard.jpg b/static/img/certwizard.jpg new file mode 100644 index 0000000..fc40c9a Binary files /dev/null and b/static/img/certwizard.jpg differ diff --git a/static/img/checkyourinbox.png b/static/img/checkyourinbox.png new file mode 100644 index 0000000..3d487e5 Binary files /dev/null and b/static/img/checkyourinbox.png differ diff --git a/static/img/chooseruletype.jpg b/static/img/chooseruletype.jpg new file mode 100644 index 0000000..1b94c20 Binary files /dev/null and b/static/img/chooseruletype.jpg differ diff --git a/static/img/claimsaware.jpg b/static/img/claimsaware.jpg new file mode 100644 index 0000000..3465841 Binary files /dev/null and b/static/img/claimsaware.jpg differ diff --git a/static/img/code-signing/ios-code-signing/certificate_assistant.png b/static/img/code-signing/ios-code-signing/certificate_assistant.png new file mode 100644 index 0000000..e69d921 Binary files /dev/null and b/static/img/code-signing/ios-code-signing/certificate_assistant.png differ diff --git a/static/img/completewizard.jpg b/static/img/completewizard.jpg new file mode 100644 index 0000000..dcc67d5 Binary files /dev/null and b/static/img/completewizard.jpg differ diff --git a/static/img/configure-bitrise-okta-1.jpg b/static/img/configure-bitrise-okta-1.jpg new file mode 100644 index 0000000..b6b66fc Binary files /dev/null and b/static/img/configure-bitrise-okta-1.jpg differ diff --git a/static/img/configureclaimrule.jpg b/static/img/configureclaimrule.jpg new file mode 100644 index 0000000..a35da61 Binary files /dev/null and b/static/img/configureclaimrule.jpg differ diff --git a/static/img/configureurl-1.jpg b/static/img/configureurl-1.jpg new file mode 100644 index 0000000..45ebf36 Binary files /dev/null and b/static/img/configureurl-1.jpg differ diff --git a/static/img/createyourownapp-1.jpg b/static/img/createyourownapp-1.jpg new file mode 100644 index 0000000..407f637 Binary files /dev/null and b/static/img/createyourownapp-1.jpg differ diff --git a/static/img/editclaims.jpg b/static/img/editclaims.jpg new file mode 100644 index 0000000..44e56cd Binary files /dev/null and b/static/img/editclaims.jpg differ diff --git a/static/img/enterpriseapps-1.jpg b/static/img/enterpriseapps-1.jpg new file mode 100644 index 0000000..9384881 Binary files /dev/null and b/static/img/enterpriseapps-1.jpg differ diff --git a/static/img/filenamesave.jpg b/static/img/filenamesave.jpg new file mode 100644 index 0000000..669afa8 Binary files /dev/null and b/static/img/filenamesave.jpg differ diff --git a/static/img/finish.jpg b/static/img/finish.jpg new file mode 100644 index 0000000..f6b1249 Binary files /dev/null and b/static/img/finish.jpg differ diff --git a/static/img/googleadmin-apps.jpg b/static/img/googleadmin-apps.jpg new file mode 100644 index 0000000..2cc9c9a Binary files /dev/null and b/static/img/googleadmin-apps.jpg differ diff --git a/static/img/identityproviderdetails.jpg b/static/img/identityproviderdetails.jpg new file mode 100644 index 0000000..02f9813 Binary files /dev/null and b/static/img/identityproviderdetails.jpg differ diff --git a/static/img/newapplication-jpg.jpg b/static/img/newapplication-jpg.jpg new file mode 100644 index 0000000..94578a2 Binary files /dev/null and b/static/img/newapplication-jpg.jpg differ diff --git a/static/img/optionalconfigure.jpg b/static/img/optionalconfigure.jpg new file mode 100644 index 0000000..2bc4dca Binary files /dev/null and b/static/img/optionalconfigure.jpg differ diff --git a/static/img/permiteveryone.jpg b/static/img/permiteveryone.jpg new file mode 100644 index 0000000..d7f17c9 Binary files /dev/null and b/static/img/permiteveryone.jpg differ diff --git a/static/img/readytoaddtrust.jpg b/static/img/readytoaddtrust.jpg new file mode 100644 index 0000000..f70c974 Binary files /dev/null and b/static/img/readytoaddtrust.jpg differ diff --git a/static/img/replyingidentifiers2.jpg b/static/img/replyingidentifiers2.jpg new file mode 100644 index 0000000..872760d Binary files /dev/null and b/static/img/replyingidentifiers2.jpg differ diff --git a/static/img/selectdatasource.jpg b/static/img/selectdatasource.jpg new file mode 100644 index 0000000..92ac4ce Binary files /dev/null and b/static/img/selectdatasource.jpg differ diff --git a/static/img/serviceproviderdetails.jpg b/static/img/serviceproviderdetails.jpg new file mode 100644 index 0000000..dcea81f Binary files /dev/null and b/static/img/serviceproviderdetails.jpg differ diff --git a/static/img/singlesignonazuread.png b/static/img/singlesignonazuread.png new file mode 100644 index 0000000..a596dc1 Binary files /dev/null and b/static/img/singlesignonazuread.png differ diff --git a/static/img/singlesignonsummary.jpg b/static/img/singlesignonsummary.jpg new file mode 100644 index 0000000..0c31401 Binary files /dev/null and b/static/img/singlesignonsummary.jpg differ diff --git a/static/img/specifydisplayname.jpg b/static/img/specifydisplayname.jpg new file mode 100644 index 0000000..6034e98 Binary files /dev/null and b/static/img/specifydisplayname.jpg differ diff --git a/static/img/sso2-1.jpg b/static/img/sso2-1.jpg new file mode 100644 index 0000000..d5a6fe8 Binary files /dev/null and b/static/img/sso2-1.jpg differ diff --git a/static/img/sso2a-1.jpg b/static/img/sso2a-1.jpg new file mode 100644 index 0000000..5137176 Binary files /dev/null and b/static/img/sso2a-1.jpg differ diff --git a/static/img/sso3-2.jpg b/static/img/sso3-2.jpg new file mode 100644 index 0000000..8f3998b Binary files /dev/null and b/static/img/sso3-2.jpg differ diff --git a/static/img/useraccess.jpg b/static/img/useraccess.jpg new file mode 100644 index 0000000..d608744 Binary files /dev/null and b/static/img/useraccess.jpg differ diff --git a/static/img/uuid-0022d0d2-8794-bad9-bf5d-a7413b7bb473.png b/static/img/uuid-0022d0d2-8794-bad9-bf5d-a7413b7bb473.png new file mode 100644 index 0000000..a9655d0 Binary files /dev/null and b/static/img/uuid-0022d0d2-8794-bad9-bf5d-a7413b7bb473.png differ diff --git a/static/img/uuid-00d7e0d5-df77-2b41-222b-c7ff05829144.png b/static/img/uuid-00d7e0d5-df77-2b41-222b-c7ff05829144.png new file mode 100644 index 0000000..7f882de Binary files /dev/null and b/static/img/uuid-00d7e0d5-df77-2b41-222b-c7ff05829144.png differ diff --git a/static/img/uuid-01568ffa-736b-b7a0-a692-03cf3784fd65.png b/static/img/uuid-01568ffa-736b-b7a0-a692-03cf3784fd65.png new file mode 100644 index 0000000..f44bd38 Binary files /dev/null and b/static/img/uuid-01568ffa-736b-b7a0-a692-03cf3784fd65.png differ diff --git a/static/img/uuid-019f250f-8d48-a51c-738b-db46d0829339.png b/static/img/uuid-019f250f-8d48-a51c-738b-db46d0829339.png new file mode 100644 index 0000000..de2192e Binary files /dev/null and b/static/img/uuid-019f250f-8d48-a51c-738b-db46d0829339.png differ diff --git a/static/img/uuid-021a140f-5b4c-697c-a5ac-4b5429ce1bab.png b/static/img/uuid-021a140f-5b4c-697c-a5ac-4b5429ce1bab.png new file mode 100644 index 0000000..b1d7203 Binary files /dev/null and b/static/img/uuid-021a140f-5b4c-697c-a5ac-4b5429ce1bab.png differ diff --git a/static/img/uuid-0242fdf7-4025-4aca-215a-ffbecf5e62b9.png b/static/img/uuid-0242fdf7-4025-4aca-215a-ffbecf5e62b9.png new file mode 100644 index 0000000..cac1092 Binary files /dev/null and b/static/img/uuid-0242fdf7-4025-4aca-215a-ffbecf5e62b9.png differ diff --git a/static/img/uuid-0247679e-247c-dd61-77eb-340600f634c9.png b/static/img/uuid-0247679e-247c-dd61-77eb-340600f634c9.png new file mode 100644 index 0000000..ce3e1f5 Binary files /dev/null and b/static/img/uuid-0247679e-247c-dd61-77eb-340600f634c9.png differ diff --git a/static/img/uuid-0268c55e-cc52-4a65-4f01-f1db5f281a4e.jpg b/static/img/uuid-0268c55e-cc52-4a65-4f01-f1db5f281a4e.jpg new file mode 100644 index 0000000..381f8cc Binary files /dev/null and b/static/img/uuid-0268c55e-cc52-4a65-4f01-f1db5f281a4e.jpg differ diff --git a/static/img/uuid-02de5b3a-d9bd-5890-cfc3-52462a3c8ff2.png b/static/img/uuid-02de5b3a-d9bd-5890-cfc3-52462a3c8ff2.png new file mode 100644 index 0000000..2be4de2 Binary files /dev/null and b/static/img/uuid-02de5b3a-d9bd-5890-cfc3-52462a3c8ff2.png differ diff --git a/static/img/uuid-035193f8-4a3b-65de-4c0b-8054d2e63586.png b/static/img/uuid-035193f8-4a3b-65de-4c0b-8054d2e63586.png new file mode 100644 index 0000000..cc059dc Binary files /dev/null and b/static/img/uuid-035193f8-4a3b-65de-4c0b-8054d2e63586.png differ diff --git a/static/img/uuid-0356f699-7e6f-0169-7fb3-82576e470b62.png b/static/img/uuid-0356f699-7e6f-0169-7fb3-82576e470b62.png new file mode 100644 index 0000000..21b6b7e Binary files /dev/null and b/static/img/uuid-0356f699-7e6f-0169-7fb3-82576e470b62.png differ diff --git a/static/img/uuid-044617c9-e24c-068d-1978-df721db2a9f8.png b/static/img/uuid-044617c9-e24c-068d-1978-df721db2a9f8.png new file mode 100644 index 0000000..797a2ba Binary files /dev/null and b/static/img/uuid-044617c9-e24c-068d-1978-df721db2a9f8.png differ diff --git a/static/img/uuid-04948b79-fd8e-253c-85c5-3c0e66f9dbd9.png b/static/img/uuid-04948b79-fd8e-253c-85c5-3c0e66f9dbd9.png new file mode 100644 index 0000000..2ea4539 Binary files /dev/null and b/static/img/uuid-04948b79-fd8e-253c-85c5-3c0e66f9dbd9.png differ diff --git a/static/img/uuid-04f62e3f-a98e-7b0f-4b1f-7d592e42db65.png b/static/img/uuid-04f62e3f-a98e-7b0f-4b1f-7d592e42db65.png new file mode 100644 index 0000000..45c641f Binary files /dev/null and b/static/img/uuid-04f62e3f-a98e-7b0f-4b1f-7d592e42db65.png differ diff --git a/static/img/uuid-05179598-b31c-84ba-3b1d-03720f842acc.png b/static/img/uuid-05179598-b31c-84ba-3b1d-03720f842acc.png new file mode 100644 index 0000000..e051d4d Binary files /dev/null and b/static/img/uuid-05179598-b31c-84ba-3b1d-03720f842acc.png differ diff --git a/static/img/uuid-05ba3ed0-0f1c-c4be-e46f-cc500b21041c.png b/static/img/uuid-05ba3ed0-0f1c-c4be-e46f-cc500b21041c.png new file mode 100644 index 0000000..cb13a37 Binary files /dev/null and b/static/img/uuid-05ba3ed0-0f1c-c4be-e46f-cc500b21041c.png differ diff --git a/static/img/uuid-06a9ef1f-701a-678b-cc0c-8aad5c078cd2.png b/static/img/uuid-06a9ef1f-701a-678b-cc0c-8aad5c078cd2.png new file mode 100644 index 0000000..3d487e5 Binary files /dev/null and b/static/img/uuid-06a9ef1f-701a-678b-cc0c-8aad5c078cd2.png differ diff --git a/static/img/uuid-06b2413b-0794-39ff-c8b0-176c85c8e1e1.png b/static/img/uuid-06b2413b-0794-39ff-c8b0-176c85c8e1e1.png new file mode 100644 index 0000000..88f552f Binary files /dev/null and b/static/img/uuid-06b2413b-0794-39ff-c8b0-176c85c8e1e1.png differ diff --git a/static/img/uuid-06ef3d25-d255-8ba0-18d6-be2ca01c356c.png b/static/img/uuid-06ef3d25-d255-8ba0-18d6-be2ca01c356c.png new file mode 100644 index 0000000..06f626b Binary files /dev/null and b/static/img/uuid-06ef3d25-d255-8ba0-18d6-be2ca01c356c.png differ diff --git a/static/img/uuid-0876f906-f150-c883-a882-3d1da1ae42dc.png b/static/img/uuid-0876f906-f150-c883-a882-3d1da1ae42dc.png new file mode 100644 index 0000000..6f764bf Binary files /dev/null and b/static/img/uuid-0876f906-f150-c883-a882-3d1da1ae42dc.png differ diff --git a/static/img/uuid-088fa6df-9163-1518-308d-87ad0916c60f.jpg b/static/img/uuid-088fa6df-9163-1518-308d-87ad0916c60f.jpg new file mode 100644 index 0000000..7d2b3c7 Binary files /dev/null and b/static/img/uuid-088fa6df-9163-1518-308d-87ad0916c60f.jpg differ diff --git a/static/img/uuid-09615e71-c7e5-0a43-b41d-b611e25b0c29.png b/static/img/uuid-09615e71-c7e5-0a43-b41d-b611e25b0c29.png new file mode 100644 index 0000000..83f837f Binary files /dev/null and b/static/img/uuid-09615e71-c7e5-0a43-b41d-b611e25b0c29.png differ diff --git a/static/img/uuid-09bb51b3-e156-8f2e-4141-e71b46951f5c.png b/static/img/uuid-09bb51b3-e156-8f2e-4141-e71b46951f5c.png new file mode 100644 index 0000000..08b9a25 Binary files /dev/null and b/static/img/uuid-09bb51b3-e156-8f2e-4141-e71b46951f5c.png differ diff --git a/static/img/uuid-0a57f576-6cbd-5055-e09e-078920e410ce.jpg b/static/img/uuid-0a57f576-6cbd-5055-e09e-078920e410ce.jpg new file mode 100644 index 0000000..44e56cd Binary files /dev/null and b/static/img/uuid-0a57f576-6cbd-5055-e09e-078920e410ce.jpg differ diff --git a/static/img/uuid-0b5537ea-42ab-780f-cd11-05072d508a72.png b/static/img/uuid-0b5537ea-42ab-780f-cd11-05072d508a72.png new file mode 100644 index 0000000..59b76ca Binary files /dev/null and b/static/img/uuid-0b5537ea-42ab-780f-cd11-05072d508a72.png differ diff --git a/static/img/uuid-0b79fc48-3861-0744-0f53-53a6c65ffc2c.png b/static/img/uuid-0b79fc48-3861-0744-0f53-53a6c65ffc2c.png new file mode 100644 index 0000000..64fae96 Binary files /dev/null and b/static/img/uuid-0b79fc48-3861-0744-0f53-53a6c65ffc2c.png differ diff --git a/static/img/uuid-0ba8034b-4784-e042-02b9-32087bcde8d4.jpg b/static/img/uuid-0ba8034b-4784-e042-02b9-32087bcde8d4.jpg new file mode 100644 index 0000000..fc40c9a Binary files /dev/null and b/static/img/uuid-0ba8034b-4784-e042-02b9-32087bcde8d4.jpg differ diff --git a/static/img/uuid-0c1048ad-a593-b587-4dad-63c8cb4ddfc1.png b/static/img/uuid-0c1048ad-a593-b587-4dad-63c8cb4ddfc1.png new file mode 100644 index 0000000..bf7d0de Binary files /dev/null and b/static/img/uuid-0c1048ad-a593-b587-4dad-63c8cb4ddfc1.png differ diff --git a/static/img/uuid-0c7ca206-84bb-e034-9ff5-3fb28c9a165d.png b/static/img/uuid-0c7ca206-84bb-e034-9ff5-3fb28c9a165d.png new file mode 100644 index 0000000..5a1847a Binary files /dev/null and b/static/img/uuid-0c7ca206-84bb-e034-9ff5-3fb28c9a165d.png differ diff --git a/static/img/uuid-0d1616e8-82d6-9de7-f192-1aab7058880b.png b/static/img/uuid-0d1616e8-82d6-9de7-f192-1aab7058880b.png new file mode 100644 index 0000000..6ef4205 Binary files /dev/null and b/static/img/uuid-0d1616e8-82d6-9de7-f192-1aab7058880b.png differ diff --git a/static/img/uuid-0d2d2b23-f9a9-d57d-3b14-44f085bfcc5f.png b/static/img/uuid-0d2d2b23-f9a9-d57d-3b14-44f085bfcc5f.png new file mode 100644 index 0000000..4ead7d4 Binary files /dev/null and b/static/img/uuid-0d2d2b23-f9a9-d57d-3b14-44f085bfcc5f.png differ diff --git a/static/img/uuid-0d392a7d-4fcd-13cb-e67a-7326e954c87a.png b/static/img/uuid-0d392a7d-4fcd-13cb-e67a-7326e954c87a.png new file mode 100644 index 0000000..aef76f6 Binary files /dev/null and b/static/img/uuid-0d392a7d-4fcd-13cb-e67a-7326e954c87a.png differ diff --git a/static/img/uuid-0d8102bf-6e48-8787-cfe2-d24617d96950.png b/static/img/uuid-0d8102bf-6e48-8787-cfe2-d24617d96950.png new file mode 100644 index 0000000..3e7942d Binary files /dev/null and b/static/img/uuid-0d8102bf-6e48-8787-cfe2-d24617d96950.png differ diff --git a/static/img/uuid-0db12ced-a7df-99c7-2c04-4818d5c52832.png b/static/img/uuid-0db12ced-a7df-99c7-2c04-4818d5c52832.png new file mode 100644 index 0000000..5c13507 Binary files /dev/null and b/static/img/uuid-0db12ced-a7df-99c7-2c04-4818d5c52832.png differ diff --git a/static/img/uuid-0ea2f6c9-aea8-8ba8-cad7-303666747894.png b/static/img/uuid-0ea2f6c9-aea8-8ba8-cad7-303666747894.png new file mode 100644 index 0000000..6112eb5 Binary files /dev/null and b/static/img/uuid-0ea2f6c9-aea8-8ba8-cad7-303666747894.png differ diff --git a/static/img/uuid-0edf6398-0b97-f558-978e-f7d8bae394e0.png b/static/img/uuid-0edf6398-0b97-f558-978e-f7d8bae394e0.png new file mode 100644 index 0000000..bd494cb Binary files /dev/null and b/static/img/uuid-0edf6398-0b97-f558-978e-f7d8bae394e0.png differ diff --git a/static/img/uuid-0ef22e95-4303-25ce-b8e9-69884bbe7cf7.jpg b/static/img/uuid-0ef22e95-4303-25ce-b8e9-69884bbe7cf7.jpg new file mode 100644 index 0000000..1b94c20 Binary files /dev/null and b/static/img/uuid-0ef22e95-4303-25ce-b8e9-69884bbe7cf7.jpg differ diff --git a/static/img/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg b/static/img/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg new file mode 100644 index 0000000..3bf6166 Binary files /dev/null and b/static/img/uuid-0f079f8c-ae86-fcff-2b7b-978d7545e551.jpg differ diff --git a/static/img/uuid-0fffb4e5-f4e4-037e-3378-fde21e261acb.png b/static/img/uuid-0fffb4e5-f4e4-037e-3378-fde21e261acb.png new file mode 100644 index 0000000..4b7c675 Binary files /dev/null and b/static/img/uuid-0fffb4e5-f4e4-037e-3378-fde21e261acb.png differ diff --git a/static/img/uuid-1042aa27-f21e-16e5-4065-4088112ae116.jpg b/static/img/uuid-1042aa27-f21e-16e5-4065-4088112ae116.jpg new file mode 100644 index 0000000..2bc4dca Binary files /dev/null and b/static/img/uuid-1042aa27-f21e-16e5-4065-4088112ae116.jpg differ diff --git a/static/img/uuid-1045ef58-753d-f496-2c8a-4e4c9542ad63.png b/static/img/uuid-1045ef58-753d-f496-2c8a-4e4c9542ad63.png new file mode 100644 index 0000000..b0b39d4 Binary files /dev/null and b/static/img/uuid-1045ef58-753d-f496-2c8a-4e4c9542ad63.png differ diff --git a/static/img/uuid-10b69d2d-9cf7-8577-04a4-d035a5f06ad9.png b/static/img/uuid-10b69d2d-9cf7-8577-04a4-d035a5f06ad9.png new file mode 100644 index 0000000..ce3b09b Binary files /dev/null and b/static/img/uuid-10b69d2d-9cf7-8577-04a4-d035a5f06ad9.png differ diff --git a/static/img/uuid-111feaf8-6180-9531-fae4-51424aeb75dc.png b/static/img/uuid-111feaf8-6180-9531-fae4-51424aeb75dc.png new file mode 100644 index 0000000..3b38cd1 Binary files /dev/null and b/static/img/uuid-111feaf8-6180-9531-fae4-51424aeb75dc.png differ diff --git a/static/img/uuid-113925d0-226c-da20-a0ea-41eec556f750.png b/static/img/uuid-113925d0-226c-da20-a0ea-41eec556f750.png new file mode 100644 index 0000000..4828de1 Binary files /dev/null and b/static/img/uuid-113925d0-226c-da20-a0ea-41eec556f750.png differ diff --git a/static/img/uuid-11509388-3538-06e7-23f3-7ef27a956386.png b/static/img/uuid-11509388-3538-06e7-23f3-7ef27a956386.png new file mode 100644 index 0000000..2286cf3 Binary files /dev/null and b/static/img/uuid-11509388-3538-06e7-23f3-7ef27a956386.png differ diff --git a/static/img/uuid-115c121e-082e-a3b6-6741-f53cdab5d89e.png b/static/img/uuid-115c121e-082e-a3b6-6741-f53cdab5d89e.png new file mode 100644 index 0000000..1a7663d Binary files /dev/null and b/static/img/uuid-115c121e-082e-a3b6-6741-f53cdab5d89e.png differ diff --git a/static/img/uuid-122c50be-0438-4aad-87f8-cc148ee26d49.png b/static/img/uuid-122c50be-0438-4aad-87f8-cc148ee26d49.png new file mode 100644 index 0000000..67cf39c Binary files /dev/null and b/static/img/uuid-122c50be-0438-4aad-87f8-cc148ee26d49.png differ diff --git a/static/img/uuid-12b52688-9137-1a9a-47d8-2944653f1d74.png b/static/img/uuid-12b52688-9137-1a9a-47d8-2944653f1d74.png new file mode 100644 index 0000000..f02cd69 Binary files /dev/null and b/static/img/uuid-12b52688-9137-1a9a-47d8-2944653f1d74.png differ diff --git a/static/img/uuid-130fe737-4629-1dfa-3234-9c03ad22f5dc.png b/static/img/uuid-130fe737-4629-1dfa-3234-9c03ad22f5dc.png new file mode 100644 index 0000000..f6e4c55 Binary files /dev/null and b/static/img/uuid-130fe737-4629-1dfa-3234-9c03ad22f5dc.png differ diff --git a/static/img/uuid-139f4940-4762-210c-2a4d-59bc4e2b561d.png b/static/img/uuid-139f4940-4762-210c-2a4d-59bc4e2b561d.png new file mode 100644 index 0000000..9e8228c Binary files /dev/null and b/static/img/uuid-139f4940-4762-210c-2a4d-59bc4e2b561d.png differ diff --git a/static/img/uuid-13e965a3-cef3-17c5-970b-b4308460ae26.png b/static/img/uuid-13e965a3-cef3-17c5-970b-b4308460ae26.png new file mode 100644 index 0000000..a775961 Binary files /dev/null and b/static/img/uuid-13e965a3-cef3-17c5-970b-b4308460ae26.png differ diff --git a/static/img/uuid-14a7856e-16ca-8a64-04fa-acf92ba93cc2.png b/static/img/uuid-14a7856e-16ca-8a64-04fa-acf92ba93cc2.png new file mode 100644 index 0000000..eafdd5a Binary files /dev/null and b/static/img/uuid-14a7856e-16ca-8a64-04fa-acf92ba93cc2.png differ diff --git a/static/img/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png b/static/img/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png new file mode 100644 index 0000000..4011f11 Binary files /dev/null and b/static/img/uuid-14defaa4-472c-2d09-84df-145dc3aef4f5.png differ diff --git a/static/img/uuid-1610488e-2548-99b4-8386-9f2f66bb7f03.svg b/static/img/uuid-1610488e-2548-99b4-8386-9f2f66bb7f03.svg new file mode 100644 index 0000000..c44d4ac --- /dev/null +++ b/static/img/uuid-1610488e-2548-99b4-8386-9f2f66bb7f03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/uuid-1640f128-3b4d-356a-f7d0-5d40e60fa6b3.png b/static/img/uuid-1640f128-3b4d-356a-f7d0-5d40e60fa6b3.png new file mode 100644 index 0000000..e1ae276 Binary files /dev/null and b/static/img/uuid-1640f128-3b4d-356a-f7d0-5d40e60fa6b3.png differ diff --git a/static/img/uuid-166098b3-ad6e-d65e-fe83-e0819fcf52a3.png b/static/img/uuid-166098b3-ad6e-d65e-fe83-e0819fcf52a3.png new file mode 100644 index 0000000..d7f5996 Binary files /dev/null and b/static/img/uuid-166098b3-ad6e-d65e-fe83-e0819fcf52a3.png differ diff --git a/static/img/uuid-175bfd17-e0a5-d198-a2f9-36dc24735c28.jpg b/static/img/uuid-175bfd17-e0a5-d198-a2f9-36dc24735c28.jpg new file mode 100644 index 0000000..b348e56 Binary files /dev/null and b/static/img/uuid-175bfd17-e0a5-d198-a2f9-36dc24735c28.jpg differ diff --git a/static/img/uuid-1789f853-23db-4863-8ecc-70e6a837ad2f.png b/static/img/uuid-1789f853-23db-4863-8ecc-70e6a837ad2f.png new file mode 100644 index 0000000..deefc66 Binary files /dev/null and b/static/img/uuid-1789f853-23db-4863-8ecc-70e6a837ad2f.png differ diff --git a/static/img/uuid-187924e0-afdb-8c78-53fe-809168944982.png b/static/img/uuid-187924e0-afdb-8c78-53fe-809168944982.png new file mode 100644 index 0000000..9cfd391 Binary files /dev/null and b/static/img/uuid-187924e0-afdb-8c78-53fe-809168944982.png differ diff --git a/static/img/uuid-193b49ae-3ccd-9f68-5288-55ed12c9edb1.png b/static/img/uuid-193b49ae-3ccd-9f68-5288-55ed12c9edb1.png new file mode 100644 index 0000000..bc77fb9 Binary files /dev/null and b/static/img/uuid-193b49ae-3ccd-9f68-5288-55ed12c9edb1.png differ diff --git a/static/img/uuid-195577ac-fbba-5fe4-810b-3749e614682c.png b/static/img/uuid-195577ac-fbba-5fe4-810b-3749e614682c.png new file mode 100644 index 0000000..1ae54b1 Binary files /dev/null and b/static/img/uuid-195577ac-fbba-5fe4-810b-3749e614682c.png differ diff --git a/static/img/uuid-19da748e-432f-46b4-353f-a426a92cdd75.png b/static/img/uuid-19da748e-432f-46b4-353f-a426a92cdd75.png new file mode 100644 index 0000000..5b5a8fb Binary files /dev/null and b/static/img/uuid-19da748e-432f-46b4-353f-a426a92cdd75.png differ diff --git a/static/img/uuid-1a730b40-ecbe-d3dd-58a4-c46a0854f63a.jpg b/static/img/uuid-1a730b40-ecbe-d3dd-58a4-c46a0854f63a.jpg new file mode 100644 index 0000000..3670ebf Binary files /dev/null and b/static/img/uuid-1a730b40-ecbe-d3dd-58a4-c46a0854f63a.jpg differ diff --git a/static/img/uuid-1aecaab6-06d6-4a03-4d67-f6e4e5efaf7e.png b/static/img/uuid-1aecaab6-06d6-4a03-4d67-f6e4e5efaf7e.png new file mode 100644 index 0000000..353acfa Binary files /dev/null and b/static/img/uuid-1aecaab6-06d6-4a03-4d67-f6e4e5efaf7e.png differ diff --git a/static/img/uuid-1afefa9a-7cc1-db41-6186-0ee56293458c.png b/static/img/uuid-1afefa9a-7cc1-db41-6186-0ee56293458c.png new file mode 100644 index 0000000..f40ac46 Binary files /dev/null and b/static/img/uuid-1afefa9a-7cc1-db41-6186-0ee56293458c.png differ diff --git a/static/img/uuid-1b49695a-ea36-fe03-f9a1-48a6bfc9a737.png b/static/img/uuid-1b49695a-ea36-fe03-f9a1-48a6bfc9a737.png new file mode 100644 index 0000000..c2caee2 Binary files /dev/null and b/static/img/uuid-1b49695a-ea36-fe03-f9a1-48a6bfc9a737.png differ diff --git a/static/img/uuid-1b7bc413-da80-4910-5b25-f2a057bbf4d0.png b/static/img/uuid-1b7bc413-da80-4910-5b25-f2a057bbf4d0.png new file mode 100644 index 0000000..545f1bf Binary files /dev/null and b/static/img/uuid-1b7bc413-da80-4910-5b25-f2a057bbf4d0.png differ diff --git a/static/img/uuid-1bbd8347-eb11-4439-9ece-315d004d74fe.png b/static/img/uuid-1bbd8347-eb11-4439-9ece-315d004d74fe.png new file mode 100644 index 0000000..2ae4ded Binary files /dev/null and b/static/img/uuid-1bbd8347-eb11-4439-9ece-315d004d74fe.png differ diff --git a/static/img/uuid-1bc3b149-c8cd-82d2-2d94-62bbc35b89df.png b/static/img/uuid-1bc3b149-c8cd-82d2-2d94-62bbc35b89df.png new file mode 100644 index 0000000..c3f51bf Binary files /dev/null and b/static/img/uuid-1bc3b149-c8cd-82d2-2d94-62bbc35b89df.png differ diff --git a/static/img/uuid-1c68a37c-df87-a7ef-90e6-37ca83ac1ba2.jpg b/static/img/uuid-1c68a37c-df87-a7ef-90e6-37ca83ac1ba2.jpg new file mode 100644 index 0000000..18eaa8f Binary files /dev/null and b/static/img/uuid-1c68a37c-df87-a7ef-90e6-37ca83ac1ba2.jpg differ diff --git a/static/img/uuid-1c93dfa7-c82d-5694-1717-62b9239fe667.png b/static/img/uuid-1c93dfa7-c82d-5694-1717-62b9239fe667.png new file mode 100644 index 0000000..934c54c Binary files /dev/null and b/static/img/uuid-1c93dfa7-c82d-5694-1717-62b9239fe667.png differ diff --git a/static/img/uuid-1cc790d0-1d08-d98c-7fdf-2cafa999984d.png b/static/img/uuid-1cc790d0-1d08-d98c-7fdf-2cafa999984d.png new file mode 100644 index 0000000..96454ee Binary files /dev/null and b/static/img/uuid-1cc790d0-1d08-d98c-7fdf-2cafa999984d.png differ diff --git a/static/img/uuid-1e2babf9-a88c-0bd8-653d-9b5c7e8217a5.png b/static/img/uuid-1e2babf9-a88c-0bd8-653d-9b5c7e8217a5.png new file mode 100644 index 0000000..1769b52 Binary files /dev/null and b/static/img/uuid-1e2babf9-a88c-0bd8-653d-9b5c7e8217a5.png differ diff --git a/static/img/uuid-1e81f309-27a2-8904-b36b-676b27000dfe.png b/static/img/uuid-1e81f309-27a2-8904-b36b-676b27000dfe.png new file mode 100644 index 0000000..81b5ad0 Binary files /dev/null and b/static/img/uuid-1e81f309-27a2-8904-b36b-676b27000dfe.png differ diff --git a/static/img/uuid-1ec5901d-3577-8321-6e4f-faa9fa366c21.png b/static/img/uuid-1ec5901d-3577-8321-6e4f-faa9fa366c21.png new file mode 100644 index 0000000..855dc7f Binary files /dev/null and b/static/img/uuid-1ec5901d-3577-8321-6e4f-faa9fa366c21.png differ diff --git a/static/img/uuid-1ed505cf-f524-a74a-9a5e-d56161782c4c.png b/static/img/uuid-1ed505cf-f524-a74a-9a5e-d56161782c4c.png new file mode 100644 index 0000000..bf43234 Binary files /dev/null and b/static/img/uuid-1ed505cf-f524-a74a-9a5e-d56161782c4c.png differ diff --git a/static/img/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png b/static/img/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png new file mode 100644 index 0000000..64f212f Binary files /dev/null and b/static/img/uuid-1f797261-860a-f2b2-42c0-a7817b7e07f5.png differ diff --git a/static/img/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png b/static/img/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png new file mode 100644 index 0000000..308f6af Binary files /dev/null and b/static/img/uuid-20c79dca-f52e-e046-e9f2-3fce1c6019ba.png differ diff --git a/static/img/uuid-2106af45-7e79-2a1c-5974-9a8f0bb78ffe.png b/static/img/uuid-2106af45-7e79-2a1c-5974-9a8f0bb78ffe.png new file mode 100644 index 0000000..9be144c Binary files /dev/null and b/static/img/uuid-2106af45-7e79-2a1c-5974-9a8f0bb78ffe.png differ diff --git a/static/img/uuid-211085d7-b298-e040-1432-189aa06bca6c.png b/static/img/uuid-211085d7-b298-e040-1432-189aa06bca6c.png new file mode 100644 index 0000000..4460850 Binary files /dev/null and b/static/img/uuid-211085d7-b298-e040-1432-189aa06bca6c.png differ diff --git a/static/img/uuid-21e11866-5b32-ba61-b232-0336d27e75e9.jpg b/static/img/uuid-21e11866-5b32-ba61-b232-0336d27e75e9.jpg new file mode 100644 index 0000000..02f9813 Binary files /dev/null and b/static/img/uuid-21e11866-5b32-ba61-b232-0336d27e75e9.jpg differ diff --git a/static/img/uuid-223b519e-cddd-6157-de92-bfdf36d7ba2d.png b/static/img/uuid-223b519e-cddd-6157-de92-bfdf36d7ba2d.png new file mode 100644 index 0000000..5fdad71 Binary files /dev/null and b/static/img/uuid-223b519e-cddd-6157-de92-bfdf36d7ba2d.png differ diff --git a/static/img/uuid-22736f46-339f-3986-05c1-cbbcf7eb57f6.png b/static/img/uuid-22736f46-339f-3986-05c1-cbbcf7eb57f6.png new file mode 100644 index 0000000..b1430f2 Binary files /dev/null and b/static/img/uuid-22736f46-339f-3986-05c1-cbbcf7eb57f6.png differ diff --git a/static/img/uuid-22b5a6f5-fedb-0cc6-b685-1bb5406d1e12.png b/static/img/uuid-22b5a6f5-fedb-0cc6-b685-1bb5406d1e12.png new file mode 100644 index 0000000..23b3dc7 Binary files /dev/null and b/static/img/uuid-22b5a6f5-fedb-0cc6-b685-1bb5406d1e12.png differ diff --git a/static/img/uuid-22e6048e-7f47-9480-fea3-958eb9a0348b.png b/static/img/uuid-22e6048e-7f47-9480-fea3-958eb9a0348b.png new file mode 100644 index 0000000..fb7316f Binary files /dev/null and b/static/img/uuid-22e6048e-7f47-9480-fea3-958eb9a0348b.png differ diff --git a/static/img/uuid-23a8ca33-3d33-1a67-07d4-273f1c69e194.png b/static/img/uuid-23a8ca33-3d33-1a67-07d4-273f1c69e194.png new file mode 100644 index 0000000..5b6feef Binary files /dev/null and b/static/img/uuid-23a8ca33-3d33-1a67-07d4-273f1c69e194.png differ diff --git a/static/img/uuid-23aa2f50-cde3-e87d-c8bd-0c2b1d512540.png b/static/img/uuid-23aa2f50-cde3-e87d-c8bd-0c2b1d512540.png new file mode 100644 index 0000000..b76d71c Binary files /dev/null and b/static/img/uuid-23aa2f50-cde3-e87d-c8bd-0c2b1d512540.png differ diff --git a/static/img/uuid-23eca453-8f3c-1bbf-e189-eae6a638e144.png b/static/img/uuid-23eca453-8f3c-1bbf-e189-eae6a638e144.png new file mode 100644 index 0000000..012bda3 Binary files /dev/null and b/static/img/uuid-23eca453-8f3c-1bbf-e189-eae6a638e144.png differ diff --git a/static/img/uuid-243b3111-76a9-8f92-b5aa-e345cf67e363.png b/static/img/uuid-243b3111-76a9-8f92-b5aa-e345cf67e363.png new file mode 100644 index 0000000..6377055 Binary files /dev/null and b/static/img/uuid-243b3111-76a9-8f92-b5aa-e345cf67e363.png differ diff --git a/static/img/uuid-245d62ac-c277-cae8-0f6d-6d60ae23bb70.png b/static/img/uuid-245d62ac-c277-cae8-0f6d-6d60ae23bb70.png new file mode 100644 index 0000000..3efa3ee Binary files /dev/null and b/static/img/uuid-245d62ac-c277-cae8-0f6d-6d60ae23bb70.png differ diff --git a/static/img/uuid-260b6d8c-c6ae-d008-a72a-8b0552a1e348.png b/static/img/uuid-260b6d8c-c6ae-d008-a72a-8b0552a1e348.png new file mode 100644 index 0000000..66e2d17 Binary files /dev/null and b/static/img/uuid-260b6d8c-c6ae-d008-a72a-8b0552a1e348.png differ diff --git a/static/img/uuid-26832e7b-a5be-8098-d683-cd04a9d2cc04.png b/static/img/uuid-26832e7b-a5be-8098-d683-cd04a9d2cc04.png new file mode 100644 index 0000000..f20adfa Binary files /dev/null and b/static/img/uuid-26832e7b-a5be-8098-d683-cd04a9d2cc04.png differ diff --git a/static/img/uuid-26903c72-7c1d-66a1-37d7-15be1fbd6379.png b/static/img/uuid-26903c72-7c1d-66a1-37d7-15be1fbd6379.png new file mode 100644 index 0000000..a8c53ff Binary files /dev/null and b/static/img/uuid-26903c72-7c1d-66a1-37d7-15be1fbd6379.png differ diff --git a/static/img/uuid-26a387b3-ea77-211f-b2f8-09325e1cc44a.png b/static/img/uuid-26a387b3-ea77-211f-b2f8-09325e1cc44a.png new file mode 100644 index 0000000..46b3720 Binary files /dev/null and b/static/img/uuid-26a387b3-ea77-211f-b2f8-09325e1cc44a.png differ diff --git a/static/img/uuid-26ad84be-65c7-1916-f079-6b553b4c436d.png b/static/img/uuid-26ad84be-65c7-1916-f079-6b553b4c436d.png new file mode 100644 index 0000000..d32af95 Binary files /dev/null and b/static/img/uuid-26ad84be-65c7-1916-f079-6b553b4c436d.png differ diff --git a/static/img/uuid-2700f022-4822-82fe-77e4-1a0995b41ab6.png b/static/img/uuid-2700f022-4822-82fe-77e4-1a0995b41ab6.png new file mode 100644 index 0000000..e1733c5 Binary files /dev/null and b/static/img/uuid-2700f022-4822-82fe-77e4-1a0995b41ab6.png differ diff --git a/static/img/uuid-27ceb4dd-22a3-a162-b569-73261ba2fef7.jpg b/static/img/uuid-27ceb4dd-22a3-a162-b569-73261ba2fef7.jpg new file mode 100644 index 0000000..9b344d1 Binary files /dev/null and b/static/img/uuid-27ceb4dd-22a3-a162-b569-73261ba2fef7.jpg differ diff --git a/static/img/uuid-27ec3df6-bdce-7f78-95be-647668661e56.png b/static/img/uuid-27ec3df6-bdce-7f78-95be-647668661e56.png new file mode 100644 index 0000000..293f905 Binary files /dev/null and b/static/img/uuid-27ec3df6-bdce-7f78-95be-647668661e56.png differ diff --git a/static/img/uuid-286c4817-1c22-6e11-06ec-26a34ce81273.png b/static/img/uuid-286c4817-1c22-6e11-06ec-26a34ce81273.png new file mode 100644 index 0000000..c5ea57d Binary files /dev/null and b/static/img/uuid-286c4817-1c22-6e11-06ec-26a34ce81273.png differ diff --git a/static/img/uuid-28812c0e-a307-6879-8d90-d0d516765519.png b/static/img/uuid-28812c0e-a307-6879-8d90-d0d516765519.png new file mode 100644 index 0000000..a45951c Binary files /dev/null and b/static/img/uuid-28812c0e-a307-6879-8d90-d0d516765519.png differ diff --git a/static/img/uuid-28b052ba-a18f-12ee-7a9a-04720bb6fdd1.png b/static/img/uuid-28b052ba-a18f-12ee-7a9a-04720bb6fdd1.png new file mode 100644 index 0000000..f18ca6a Binary files /dev/null and b/static/img/uuid-28b052ba-a18f-12ee-7a9a-04720bb6fdd1.png differ diff --git a/static/img/uuid-28f245c4-7eb3-89b2-1e4d-18d922bbc0a5.png b/static/img/uuid-28f245c4-7eb3-89b2-1e4d-18d922bbc0a5.png new file mode 100644 index 0000000..d69dde9 Binary files /dev/null and b/static/img/uuid-28f245c4-7eb3-89b2-1e4d-18d922bbc0a5.png differ diff --git a/static/img/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png b/static/img/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png new file mode 100644 index 0000000..11826d3 Binary files /dev/null and b/static/img/uuid-2970ac6b-3d97-8318-0863-aff6e1f106da.png differ diff --git a/static/img/uuid-299959e9-b519-88a2-05a2-ee89fa6963cd.png b/static/img/uuid-299959e9-b519-88a2-05a2-ee89fa6963cd.png new file mode 100644 index 0000000..ca36e89 Binary files /dev/null and b/static/img/uuid-299959e9-b519-88a2-05a2-ee89fa6963cd.png differ diff --git a/static/img/uuid-29b1db0e-2fa8-8f7e-ba48-da85ed4db64b.png b/static/img/uuid-29b1db0e-2fa8-8f7e-ba48-da85ed4db64b.png new file mode 100644 index 0000000..0a85c23 Binary files /dev/null and b/static/img/uuid-29b1db0e-2fa8-8f7e-ba48-da85ed4db64b.png differ diff --git a/static/img/uuid-29b363bc-ce14-f6a3-f310-62543138452e.png b/static/img/uuid-29b363bc-ce14-f6a3-f310-62543138452e.png new file mode 100644 index 0000000..92e2792 Binary files /dev/null and b/static/img/uuid-29b363bc-ce14-f6a3-f310-62543138452e.png differ diff --git a/static/img/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg b/static/img/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg new file mode 100644 index 0000000..a5f8dda Binary files /dev/null and b/static/img/uuid-29d5ecf3-28a9-e914-1ffa-e8f8ffa9c744.jpg differ diff --git a/static/img/uuid-2a0854ff-b62a-6215-5c2e-09cf6b244786.png b/static/img/uuid-2a0854ff-b62a-6215-5c2e-09cf6b244786.png new file mode 100644 index 0000000..dc8237b Binary files /dev/null and b/static/img/uuid-2a0854ff-b62a-6215-5c2e-09cf6b244786.png differ diff --git a/static/img/uuid-2a3bef35-3d78-72e7-102b-8aa11def397f.png b/static/img/uuid-2a3bef35-3d78-72e7-102b-8aa11def397f.png new file mode 100644 index 0000000..1d5e140 Binary files /dev/null and b/static/img/uuid-2a3bef35-3d78-72e7-102b-8aa11def397f.png differ diff --git a/static/img/uuid-2aed5814-692a-476b-f993-617cdb2c338f.png b/static/img/uuid-2aed5814-692a-476b-f993-617cdb2c338f.png new file mode 100644 index 0000000..9d4d31a Binary files /dev/null and b/static/img/uuid-2aed5814-692a-476b-f993-617cdb2c338f.png differ diff --git a/static/img/uuid-2b040c7d-cbee-1050-4c6e-731d228fb547.png b/static/img/uuid-2b040c7d-cbee-1050-4c6e-731d228fb547.png new file mode 100644 index 0000000..a6e0b18 Binary files /dev/null and b/static/img/uuid-2b040c7d-cbee-1050-4c6e-731d228fb547.png differ diff --git a/static/img/uuid-2b06167e-f54e-eb64-2314-315d36a5d17f.png b/static/img/uuid-2b06167e-f54e-eb64-2314-315d36a5d17f.png new file mode 100644 index 0000000..48f9da6 Binary files /dev/null and b/static/img/uuid-2b06167e-f54e-eb64-2314-315d36a5d17f.png differ diff --git a/static/img/uuid-2b430e36-ee56-c8ce-3599-f267c550062a.png b/static/img/uuid-2b430e36-ee56-c8ce-3599-f267c550062a.png new file mode 100644 index 0000000..d6ad4d4 Binary files /dev/null and b/static/img/uuid-2b430e36-ee56-c8ce-3599-f267c550062a.png differ diff --git a/static/img/uuid-2b51312c-d04b-29f9-c83a-14dcfa9306d2.png b/static/img/uuid-2b51312c-d04b-29f9-c83a-14dcfa9306d2.png new file mode 100644 index 0000000..cd3b22d Binary files /dev/null and b/static/img/uuid-2b51312c-d04b-29f9-c83a-14dcfa9306d2.png differ diff --git a/static/img/uuid-2b97d7ef-4512-cf79-868f-bc66e728b509.png b/static/img/uuid-2b97d7ef-4512-cf79-868f-bc66e728b509.png new file mode 100644 index 0000000..cd77353 Binary files /dev/null and b/static/img/uuid-2b97d7ef-4512-cf79-868f-bc66e728b509.png differ diff --git a/static/img/uuid-2bda7822-cd88-2b01-ff4d-8f5eec392c66.png b/static/img/uuid-2bda7822-cd88-2b01-ff4d-8f5eec392c66.png new file mode 100644 index 0000000..cd76f34 Binary files /dev/null and b/static/img/uuid-2bda7822-cd88-2b01-ff4d-8f5eec392c66.png differ diff --git a/static/img/uuid-2c2a82f9-5bea-aa62-cd49-339aa061c265.png b/static/img/uuid-2c2a82f9-5bea-aa62-cd49-339aa061c265.png new file mode 100644 index 0000000..a198249 Binary files /dev/null and b/static/img/uuid-2c2a82f9-5bea-aa62-cd49-339aa061c265.png differ diff --git a/static/img/uuid-2ce0bbbd-d455-1840-7b19-0bcfc6da8e12.png b/static/img/uuid-2ce0bbbd-d455-1840-7b19-0bcfc6da8e12.png new file mode 100644 index 0000000..17545b0 Binary files /dev/null and b/static/img/uuid-2ce0bbbd-d455-1840-7b19-0bcfc6da8e12.png differ diff --git a/static/img/uuid-2d246b3d-6d4f-d215-8ee7-7d628492f7aa.png b/static/img/uuid-2d246b3d-6d4f-d215-8ee7-7d628492f7aa.png new file mode 100644 index 0000000..e3b97d2 Binary files /dev/null and b/static/img/uuid-2d246b3d-6d4f-d215-8ee7-7d628492f7aa.png differ diff --git a/static/img/uuid-2d349c93-c464-218d-ac79-de7b3da38089.jpg b/static/img/uuid-2d349c93-c464-218d-ac79-de7b3da38089.jpg new file mode 100644 index 0000000..ab59be8 Binary files /dev/null and b/static/img/uuid-2d349c93-c464-218d-ac79-de7b3da38089.jpg differ diff --git a/static/img/uuid-2da28206-9def-429e-3b2f-d3d769b15c3b.png b/static/img/uuid-2da28206-9def-429e-3b2f-d3d769b15c3b.png new file mode 100644 index 0000000..c9ce766 Binary files /dev/null and b/static/img/uuid-2da28206-9def-429e-3b2f-d3d769b15c3b.png differ diff --git a/static/img/uuid-2de8b6b8-3fc0-5da9-9f45-1b22546e1bb2.png b/static/img/uuid-2de8b6b8-3fc0-5da9-9f45-1b22546e1bb2.png new file mode 100644 index 0000000..262c8f7 Binary files /dev/null and b/static/img/uuid-2de8b6b8-3fc0-5da9-9f45-1b22546e1bb2.png differ diff --git a/static/img/uuid-2e0224cb-0d48-8c50-3bb4-c5a126fff586.png b/static/img/uuid-2e0224cb-0d48-8c50-3bb4-c5a126fff586.png new file mode 100644 index 0000000..6fee25b Binary files /dev/null and b/static/img/uuid-2e0224cb-0d48-8c50-3bb4-c5a126fff586.png differ diff --git a/static/img/uuid-2e8a2cfc-6fe9-cf2b-9b4a-b4ec2f051568.jpg b/static/img/uuid-2e8a2cfc-6fe9-cf2b-9b4a-b4ec2f051568.jpg new file mode 100644 index 0000000..6cd5d25 Binary files /dev/null and b/static/img/uuid-2e8a2cfc-6fe9-cf2b-9b4a-b4ec2f051568.jpg differ diff --git a/static/img/uuid-2fe105a3-6faa-4394-35fd-41fd3ed5cc42.png b/static/img/uuid-2fe105a3-6faa-4394-35fd-41fd3ed5cc42.png new file mode 100644 index 0000000..bc81a51 Binary files /dev/null and b/static/img/uuid-2fe105a3-6faa-4394-35fd-41fd3ed5cc42.png differ diff --git a/static/img/uuid-311c03e1-c104-9bed-9744-f751497444a1.png b/static/img/uuid-311c03e1-c104-9bed-9744-f751497444a1.png new file mode 100644 index 0000000..b00c635 Binary files /dev/null and b/static/img/uuid-311c03e1-c104-9bed-9744-f751497444a1.png differ diff --git a/static/img/uuid-3138c36f-fad8-3630-46b8-dfd9910807cc.png b/static/img/uuid-3138c36f-fad8-3630-46b8-dfd9910807cc.png new file mode 100644 index 0000000..b22ea0c Binary files /dev/null and b/static/img/uuid-3138c36f-fad8-3630-46b8-dfd9910807cc.png differ diff --git a/static/img/uuid-31ba9329-7c53-4411-103e-df47df050799.png b/static/img/uuid-31ba9329-7c53-4411-103e-df47df050799.png new file mode 100644 index 0000000..fed67f7 Binary files /dev/null and b/static/img/uuid-31ba9329-7c53-4411-103e-df47df050799.png differ diff --git a/static/img/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg b/static/img/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg new file mode 100644 index 0000000..ea38b94 Binary files /dev/null and b/static/img/uuid-324132c7-6f52-185f-1d59-917938fd4174.jpg differ diff --git a/static/img/uuid-324a0ec5-3e09-e10f-9e9e-7ae1359ffdc2.png b/static/img/uuid-324a0ec5-3e09-e10f-9e9e-7ae1359ffdc2.png new file mode 100644 index 0000000..f6c4d70 Binary files /dev/null and b/static/img/uuid-324a0ec5-3e09-e10f-9e9e-7ae1359ffdc2.png differ diff --git a/static/img/uuid-32b5ff3d-8431-8fe3-9971-89d8aca076f4.png b/static/img/uuid-32b5ff3d-8431-8fe3-9971-89d8aca076f4.png new file mode 100644 index 0000000..09f936b Binary files /dev/null and b/static/img/uuid-32b5ff3d-8431-8fe3-9971-89d8aca076f4.png differ diff --git a/static/img/uuid-32cdcf4a-27ea-2a5c-a439-3828a31fec7c.png b/static/img/uuid-32cdcf4a-27ea-2a5c-a439-3828a31fec7c.png new file mode 100644 index 0000000..6f521d1 Binary files /dev/null and b/static/img/uuid-32cdcf4a-27ea-2a5c-a439-3828a31fec7c.png differ diff --git a/static/img/uuid-33016129-6c3c-5427-c4ac-8dca1c01770d.png b/static/img/uuid-33016129-6c3c-5427-c4ac-8dca1c01770d.png new file mode 100644 index 0000000..b859897 Binary files /dev/null and b/static/img/uuid-33016129-6c3c-5427-c4ac-8dca1c01770d.png differ diff --git a/static/img/uuid-3305dee6-a952-5073-e44b-02fd8c3925c1.png b/static/img/uuid-3305dee6-a952-5073-e44b-02fd8c3925c1.png new file mode 100644 index 0000000..fb09d89 Binary files /dev/null and b/static/img/uuid-3305dee6-a952-5073-e44b-02fd8c3925c1.png differ diff --git a/static/img/uuid-33093867-a2c4-50e5-79ca-cf8fba179e41.png b/static/img/uuid-33093867-a2c4-50e5-79ca-cf8fba179e41.png new file mode 100644 index 0000000..23e4960 Binary files /dev/null and b/static/img/uuid-33093867-a2c4-50e5-79ca-cf8fba179e41.png differ diff --git a/static/img/uuid-336544f8-0f74-08ad-8a5d-616f33d62736.png b/static/img/uuid-336544f8-0f74-08ad-8a5d-616f33d62736.png new file mode 100644 index 0000000..8167661 Binary files /dev/null and b/static/img/uuid-336544f8-0f74-08ad-8a5d-616f33d62736.png differ diff --git a/static/img/uuid-33ad7b4b-fc7e-c184-895e-b8b81463b2ee.png b/static/img/uuid-33ad7b4b-fc7e-c184-895e-b8b81463b2ee.png new file mode 100644 index 0000000..3108626 Binary files /dev/null and b/static/img/uuid-33ad7b4b-fc7e-c184-895e-b8b81463b2ee.png differ diff --git a/static/img/uuid-33deefaf-a687-276f-ff84-cb0b6e45e885.png b/static/img/uuid-33deefaf-a687-276f-ff84-cb0b6e45e885.png new file mode 100644 index 0000000..22ffcfb Binary files /dev/null and b/static/img/uuid-33deefaf-a687-276f-ff84-cb0b6e45e885.png differ diff --git a/static/img/uuid-3424f770-b6c1-749a-b936-6d073bab7469.png b/static/img/uuid-3424f770-b6c1-749a-b936-6d073bab7469.png new file mode 100644 index 0000000..90a7b7f Binary files /dev/null and b/static/img/uuid-3424f770-b6c1-749a-b936-6d073bab7469.png differ diff --git a/static/img/uuid-3452d29c-7dd3-8a00-dbc3-c69620063c48.png b/static/img/uuid-3452d29c-7dd3-8a00-dbc3-c69620063c48.png new file mode 100644 index 0000000..eafcbdb Binary files /dev/null and b/static/img/uuid-3452d29c-7dd3-8a00-dbc3-c69620063c48.png differ diff --git a/static/img/uuid-3474472d-9f45-e08c-37a0-82dcc3516481.png b/static/img/uuid-3474472d-9f45-e08c-37a0-82dcc3516481.png new file mode 100644 index 0000000..8cf781f Binary files /dev/null and b/static/img/uuid-3474472d-9f45-e08c-37a0-82dcc3516481.png differ diff --git a/static/img/uuid-3541a0b4-b1d8-6530-46f1-0e3badfff2b3.png b/static/img/uuid-3541a0b4-b1d8-6530-46f1-0e3badfff2b3.png new file mode 100644 index 0000000..0b18c32 Binary files /dev/null and b/static/img/uuid-3541a0b4-b1d8-6530-46f1-0e3badfff2b3.png differ diff --git a/static/img/uuid-35998534-7cfb-c0c6-7277-bb12dd6bc345.png b/static/img/uuid-35998534-7cfb-c0c6-7277-bb12dd6bc345.png new file mode 100644 index 0000000..7946e06 Binary files /dev/null and b/static/img/uuid-35998534-7cfb-c0c6-7277-bb12dd6bc345.png differ diff --git a/static/img/uuid-35a66242-8cc5-8b66-380d-a996c3012825.png b/static/img/uuid-35a66242-8cc5-8b66-380d-a996c3012825.png new file mode 100644 index 0000000..4ab73b2 Binary files /dev/null and b/static/img/uuid-35a66242-8cc5-8b66-380d-a996c3012825.png differ diff --git a/static/img/uuid-35da65f6-1384-de64-328a-42f8232d2574.png b/static/img/uuid-35da65f6-1384-de64-328a-42f8232d2574.png new file mode 100644 index 0000000..9f8ab59 Binary files /dev/null and b/static/img/uuid-35da65f6-1384-de64-328a-42f8232d2574.png differ diff --git a/static/img/uuid-3850ebd0-6ab7-934f-c232-4305ccffe249.png b/static/img/uuid-3850ebd0-6ab7-934f-c232-4305ccffe249.png new file mode 100644 index 0000000..955c91f Binary files /dev/null and b/static/img/uuid-3850ebd0-6ab7-934f-c232-4305ccffe249.png differ diff --git a/static/img/uuid-3861bf61-778c-af22-dad4-28d5b52cf1f0.png b/static/img/uuid-3861bf61-778c-af22-dad4-28d5b52cf1f0.png new file mode 100644 index 0000000..89a68c1 Binary files /dev/null and b/static/img/uuid-3861bf61-778c-af22-dad4-28d5b52cf1f0.png differ diff --git a/static/img/uuid-387f919f-49c9-14ae-cb62-1bc4f47cda1e.png b/static/img/uuid-387f919f-49c9-14ae-cb62-1bc4f47cda1e.png new file mode 100644 index 0000000..ae8f521 Binary files /dev/null and b/static/img/uuid-387f919f-49c9-14ae-cb62-1bc4f47cda1e.png differ diff --git a/static/img/uuid-38cefb5d-2dc6-7a86-98cd-d1dac6484ded.png b/static/img/uuid-38cefb5d-2dc6-7a86-98cd-d1dac6484ded.png new file mode 100644 index 0000000..f0b5b36 Binary files /dev/null and b/static/img/uuid-38cefb5d-2dc6-7a86-98cd-d1dac6484ded.png differ diff --git a/static/img/uuid-39c02a1a-b3f2-3922-a9d1-fac312c98f92.jpg b/static/img/uuid-39c02a1a-b3f2-3922-a9d1-fac312c98f92.jpg new file mode 100644 index 0000000..8f3998b Binary files /dev/null and b/static/img/uuid-39c02a1a-b3f2-3922-a9d1-fac312c98f92.jpg differ diff --git a/static/img/uuid-39f030dd-13a5-7302-6200-44aa39114f17.jpg b/static/img/uuid-39f030dd-13a5-7302-6200-44aa39114f17.jpg new file mode 100644 index 0000000..9384881 Binary files /dev/null and b/static/img/uuid-39f030dd-13a5-7302-6200-44aa39114f17.jpg differ diff --git a/static/img/uuid-3a2a9de6-726f-577c-175c-a3022d1cc2c0.png b/static/img/uuid-3a2a9de6-726f-577c-175c-a3022d1cc2c0.png new file mode 100644 index 0000000..40a0f5a Binary files /dev/null and b/static/img/uuid-3a2a9de6-726f-577c-175c-a3022d1cc2c0.png differ diff --git a/static/img/uuid-3a873c33-52fb-926c-64d7-faeb23df7e64.png b/static/img/uuid-3a873c33-52fb-926c-64d7-faeb23df7e64.png new file mode 100644 index 0000000..c460cad Binary files /dev/null and b/static/img/uuid-3a873c33-52fb-926c-64d7-faeb23df7e64.png differ diff --git a/static/img/uuid-3ab9024b-207a-0b06-c099-714f8c053ecd.png b/static/img/uuid-3ab9024b-207a-0b06-c099-714f8c053ecd.png new file mode 100644 index 0000000..0ed4133 Binary files /dev/null and b/static/img/uuid-3ab9024b-207a-0b06-c099-714f8c053ecd.png differ diff --git a/static/img/uuid-3b1378b0-3006-c0d1-a710-7c4a51821841.png b/static/img/uuid-3b1378b0-3006-c0d1-a710-7c4a51821841.png new file mode 100644 index 0000000..79e96d8 Binary files /dev/null and b/static/img/uuid-3b1378b0-3006-c0d1-a710-7c4a51821841.png differ diff --git a/static/img/uuid-3b5d8be9-8f71-2547-1c6c-7c41113bf6b9.png b/static/img/uuid-3b5d8be9-8f71-2547-1c6c-7c41113bf6b9.png new file mode 100644 index 0000000..46f56b9 Binary files /dev/null and b/static/img/uuid-3b5d8be9-8f71-2547-1c6c-7c41113bf6b9.png differ diff --git a/static/img/uuid-3bb43658-43d6-234e-9788-d71d49d5c1db.png b/static/img/uuid-3bb43658-43d6-234e-9788-d71d49d5c1db.png new file mode 100644 index 0000000..d697d7b Binary files /dev/null and b/static/img/uuid-3bb43658-43d6-234e-9788-d71d49d5c1db.png differ diff --git a/static/img/uuid-3bbc4214-3819-7b12-200a-d211bc965b7e.png b/static/img/uuid-3bbc4214-3819-7b12-200a-d211bc965b7e.png new file mode 100644 index 0000000..b7f3631 Binary files /dev/null and b/static/img/uuid-3bbc4214-3819-7b12-200a-d211bc965b7e.png differ diff --git a/static/img/uuid-3c75e562-bf1f-266f-ec68-910589ed408e.png b/static/img/uuid-3c75e562-bf1f-266f-ec68-910589ed408e.png new file mode 100644 index 0000000..c575e5d Binary files /dev/null and b/static/img/uuid-3c75e562-bf1f-266f-ec68-910589ed408e.png differ diff --git a/static/img/uuid-3c8c65d8-1de1-0a50-62cf-acf76dc76bf9.png b/static/img/uuid-3c8c65d8-1de1-0a50-62cf-acf76dc76bf9.png new file mode 100644 index 0000000..2c26dc8 Binary files /dev/null and b/static/img/uuid-3c8c65d8-1de1-0a50-62cf-acf76dc76bf9.png differ diff --git a/static/img/uuid-3ca810bc-4569-859b-f0be-784644322a22.png b/static/img/uuid-3ca810bc-4569-859b-f0be-784644322a22.png new file mode 100644 index 0000000..c945e14 Binary files /dev/null and b/static/img/uuid-3ca810bc-4569-859b-f0be-784644322a22.png differ diff --git a/static/img/uuid-3cab36a0-7c43-5fb3-40cb-d7c03cd8ab00.png b/static/img/uuid-3cab36a0-7c43-5fb3-40cb-d7c03cd8ab00.png new file mode 100644 index 0000000..e561242 Binary files /dev/null and b/static/img/uuid-3cab36a0-7c43-5fb3-40cb-d7c03cd8ab00.png differ diff --git a/static/img/uuid-3de8dcba-e678-997e-20f0-3055cd889bb0.png b/static/img/uuid-3de8dcba-e678-997e-20f0-3055cd889bb0.png new file mode 100644 index 0000000..9692a63 Binary files /dev/null and b/static/img/uuid-3de8dcba-e678-997e-20f0-3055cd889bb0.png differ diff --git a/static/img/uuid-3edf7fb2-6a3c-9e72-52c2-a5ec796816e7.png b/static/img/uuid-3edf7fb2-6a3c-9e72-52c2-a5ec796816e7.png new file mode 100644 index 0000000..5b7f340 Binary files /dev/null and b/static/img/uuid-3edf7fb2-6a3c-9e72-52c2-a5ec796816e7.png differ diff --git a/static/img/uuid-4023a0e5-a889-7041-05ab-f31969f8e898.png b/static/img/uuid-4023a0e5-a889-7041-05ab-f31969f8e898.png new file mode 100644 index 0000000..5ca0270 Binary files /dev/null and b/static/img/uuid-4023a0e5-a889-7041-05ab-f31969f8e898.png differ diff --git a/static/img/uuid-4033d0af-df38-8e77-9963-4812d259f9ad.jpg b/static/img/uuid-4033d0af-df38-8e77-9963-4812d259f9ad.jpg new file mode 100644 index 0000000..f70c974 Binary files /dev/null and b/static/img/uuid-4033d0af-df38-8e77-9963-4812d259f9ad.jpg differ diff --git a/static/img/uuid-40c38dac-74da-dcc2-0e07-64366c2732dc.png b/static/img/uuid-40c38dac-74da-dcc2-0e07-64366c2732dc.png new file mode 100644 index 0000000..935e781 Binary files /dev/null and b/static/img/uuid-40c38dac-74da-dcc2-0e07-64366c2732dc.png differ diff --git a/static/img/uuid-41d604b4-d929-893c-2ac9-aa44b3e01e85.png b/static/img/uuid-41d604b4-d929-893c-2ac9-aa44b3e01e85.png new file mode 100644 index 0000000..47f69ac Binary files /dev/null and b/static/img/uuid-41d604b4-d929-893c-2ac9-aa44b3e01e85.png differ diff --git a/static/img/uuid-426d42b4-ca6f-d5de-d91a-b9e8a4fd8ba1.png b/static/img/uuid-426d42b4-ca6f-d5de-d91a-b9e8a4fd8ba1.png new file mode 100644 index 0000000..0dd970e Binary files /dev/null and b/static/img/uuid-426d42b4-ca6f-d5de-d91a-b9e8a4fd8ba1.png differ diff --git a/static/img/uuid-42c797d6-13f2-d5b3-c183-c48546d78983.png b/static/img/uuid-42c797d6-13f2-d5b3-c183-c48546d78983.png new file mode 100644 index 0000000..835f9d7 Binary files /dev/null and b/static/img/uuid-42c797d6-13f2-d5b3-c183-c48546d78983.png differ diff --git a/static/img/uuid-435d30ce-97a4-4f6a-995c-b48fea89bad9.png b/static/img/uuid-435d30ce-97a4-4f6a-995c-b48fea89bad9.png new file mode 100644 index 0000000..e3daa83 Binary files /dev/null and b/static/img/uuid-435d30ce-97a4-4f6a-995c-b48fea89bad9.png differ diff --git a/static/img/uuid-43ba1d01-1168-f540-9414-ace775c44ac5.png b/static/img/uuid-43ba1d01-1168-f540-9414-ace775c44ac5.png new file mode 100644 index 0000000..01279be Binary files /dev/null and b/static/img/uuid-43ba1d01-1168-f540-9414-ace775c44ac5.png differ diff --git a/static/img/uuid-447a76c6-96e0-a493-214d-484d92a36dc8.png b/static/img/uuid-447a76c6-96e0-a493-214d-484d92a36dc8.png new file mode 100644 index 0000000..38f0a1c Binary files /dev/null and b/static/img/uuid-447a76c6-96e0-a493-214d-484d92a36dc8.png differ diff --git a/static/img/uuid-4504890a-1b65-20b5-d16c-548bf94a890e.png b/static/img/uuid-4504890a-1b65-20b5-d16c-548bf94a890e.png new file mode 100644 index 0000000..0a86d5d Binary files /dev/null and b/static/img/uuid-4504890a-1b65-20b5-d16c-548bf94a890e.png differ diff --git a/static/img/uuid-4510e204-8973-1a9a-0c2e-7ffc0c073aad.jpg b/static/img/uuid-4510e204-8973-1a9a-0c2e-7ffc0c073aad.jpg new file mode 100644 index 0000000..669afa8 Binary files /dev/null and b/static/img/uuid-4510e204-8973-1a9a-0c2e-7ffc0c073aad.jpg differ diff --git a/static/img/uuid-464e4d9f-1911-a722-1008-2b9f67b6bc5c.png b/static/img/uuid-464e4d9f-1911-a722-1008-2b9f67b6bc5c.png new file mode 100644 index 0000000..26864f0 Binary files /dev/null and b/static/img/uuid-464e4d9f-1911-a722-1008-2b9f67b6bc5c.png differ diff --git a/static/img/uuid-46cdbdfc-b373-9709-b953-2ae3887f1543.png b/static/img/uuid-46cdbdfc-b373-9709-b953-2ae3887f1543.png new file mode 100644 index 0000000..57b59c1 Binary files /dev/null and b/static/img/uuid-46cdbdfc-b373-9709-b953-2ae3887f1543.png differ diff --git a/static/img/uuid-4775415f-854a-3e11-430a-34c233f7fc5f.png b/static/img/uuid-4775415f-854a-3e11-430a-34c233f7fc5f.png new file mode 100644 index 0000000..1cff949 Binary files /dev/null and b/static/img/uuid-4775415f-854a-3e11-430a-34c233f7fc5f.png differ diff --git a/static/img/uuid-47aacb1a-a7a9-f93e-8130-83ad51654298.png b/static/img/uuid-47aacb1a-a7a9-f93e-8130-83ad51654298.png new file mode 100644 index 0000000..e5e3640 Binary files /dev/null and b/static/img/uuid-47aacb1a-a7a9-f93e-8130-83ad51654298.png differ diff --git a/static/img/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png b/static/img/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png new file mode 100644 index 0000000..e4bccfb Binary files /dev/null and b/static/img/uuid-480a1aea-dba2-c5e7-ad91-f05c9d144541.png differ diff --git a/static/img/uuid-4822cd7c-0379-35e2-9ab3-d483dc8c6355.jpg b/static/img/uuid-4822cd7c-0379-35e2-9ab3-d483dc8c6355.jpg new file mode 100644 index 0000000..407f637 Binary files /dev/null and b/static/img/uuid-4822cd7c-0379-35e2-9ab3-d483dc8c6355.jpg differ diff --git a/static/img/uuid-48a9ebfc-c07d-81f3-7b87-09f6fdcc1794.png b/static/img/uuid-48a9ebfc-c07d-81f3-7b87-09f6fdcc1794.png new file mode 100644 index 0000000..e8d5931 Binary files /dev/null and b/static/img/uuid-48a9ebfc-c07d-81f3-7b87-09f6fdcc1794.png differ diff --git a/static/img/uuid-48b2ff90-e029-0d70-f0d7-f0b05e989540.png b/static/img/uuid-48b2ff90-e029-0d70-f0d7-f0b05e989540.png new file mode 100644 index 0000000..7e6817f Binary files /dev/null and b/static/img/uuid-48b2ff90-e029-0d70-f0d7-f0b05e989540.png differ diff --git a/static/img/uuid-4908f90e-3721-b82f-2d79-937d6a9b14f3.png b/static/img/uuid-4908f90e-3721-b82f-2d79-937d6a9b14f3.png new file mode 100644 index 0000000..a8b09aa Binary files /dev/null and b/static/img/uuid-4908f90e-3721-b82f-2d79-937d6a9b14f3.png differ diff --git a/static/img/uuid-4955154b-d553-bb34-5b96-c1779bfecbed.png b/static/img/uuid-4955154b-d553-bb34-5b96-c1779bfecbed.png new file mode 100644 index 0000000..25cd6ce Binary files /dev/null and b/static/img/uuid-4955154b-d553-bb34-5b96-c1779bfecbed.png differ diff --git a/static/img/uuid-49707b16-e6a3-6f4e-ea0a-869f23923758.png b/static/img/uuid-49707b16-e6a3-6f4e-ea0a-869f23923758.png new file mode 100644 index 0000000..3188c76 Binary files /dev/null and b/static/img/uuid-49707b16-e6a3-6f4e-ea0a-869f23923758.png differ diff --git a/static/img/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png b/static/img/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png new file mode 100644 index 0000000..b6deb18 Binary files /dev/null and b/static/img/uuid-49a6993c-5bb1-9295-d85d-6608aff04419.png differ diff --git a/static/img/uuid-4ababac0-1bb5-1f86-165a-f31d14fa9f28.png b/static/img/uuid-4ababac0-1bb5-1f86-165a-f31d14fa9f28.png new file mode 100644 index 0000000..531a6ca Binary files /dev/null and b/static/img/uuid-4ababac0-1bb5-1f86-165a-f31d14fa9f28.png differ diff --git a/static/img/uuid-4c68fb66-ab5a-75a7-bb14-ab0f2617444f.png b/static/img/uuid-4c68fb66-ab5a-75a7-bb14-ab0f2617444f.png new file mode 100644 index 0000000..1fd5c9a Binary files /dev/null and b/static/img/uuid-4c68fb66-ab5a-75a7-bb14-ab0f2617444f.png differ diff --git a/static/img/uuid-4d8bea06-abe3-0ad5-9a37-d840ad2c0875.png b/static/img/uuid-4d8bea06-abe3-0ad5-9a37-d840ad2c0875.png new file mode 100644 index 0000000..bffc224 Binary files /dev/null and b/static/img/uuid-4d8bea06-abe3-0ad5-9a37-d840ad2c0875.png differ diff --git a/static/img/uuid-4defa7e8-2933-8118-8b32-414f4a4994d2.png b/static/img/uuid-4defa7e8-2933-8118-8b32-414f4a4994d2.png new file mode 100644 index 0000000..7468bb7 Binary files /dev/null and b/static/img/uuid-4defa7e8-2933-8118-8b32-414f4a4994d2.png differ diff --git a/static/img/uuid-4e5bd057-700c-f047-f6ae-498ebd98f1a2.png b/static/img/uuid-4e5bd057-700c-f047-f6ae-498ebd98f1a2.png new file mode 100644 index 0000000..84d3a96 Binary files /dev/null and b/static/img/uuid-4e5bd057-700c-f047-f6ae-498ebd98f1a2.png differ diff --git a/static/img/uuid-4f7e400b-3a64-eb42-5b85-c51a3f41da03.png b/static/img/uuid-4f7e400b-3a64-eb42-5b85-c51a3f41da03.png new file mode 100644 index 0000000..9bfbd5e Binary files /dev/null and b/static/img/uuid-4f7e400b-3a64-eb42-5b85-c51a3f41da03.png differ diff --git a/static/img/uuid-4f8203e0-c79b-b9ec-7537-53e96b0f1924.png b/static/img/uuid-4f8203e0-c79b-b9ec-7537-53e96b0f1924.png new file mode 100644 index 0000000..e620eef Binary files /dev/null and b/static/img/uuid-4f8203e0-c79b-b9ec-7537-53e96b0f1924.png differ diff --git a/static/img/uuid-5169df38-e851-52da-fb4f-d37c3f98e8d8.svg b/static/img/uuid-5169df38-e851-52da-fb4f-d37c3f98e8d8.svg new file mode 100644 index 0000000..9c2b7b8 --- /dev/null +++ b/static/img/uuid-5169df38-e851-52da-fb4f-d37c3f98e8d8.svg @@ -0,0 +1 @@ +
Not updated
Builds cannot be launched on it
Not updated...
Removed
Removed
Tooling changes
Experimental features
Tooling changes...
Edge
Edge
Update frequency: often
Update frequency: often
Reliable with rarely changing tools
Reliable with rarely changing t...
Stable
Stable
Update frequency: only critical and required updates
Update frequency: only critical...
w
Soon to be removed
Consider migrating to a newer stack
Soon to be removed...
Frozen
Frozen
Update frequency: not receiving updates
Update frequency: not re...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/uuid-518781ac-bb0f-7bec-d0ec-26047fb2b16d.png b/static/img/uuid-518781ac-bb0f-7bec-d0ec-26047fb2b16d.png new file mode 100644 index 0000000..f24b230 Binary files /dev/null and b/static/img/uuid-518781ac-bb0f-7bec-d0ec-26047fb2b16d.png differ diff --git a/static/img/uuid-527aa0a4-a647-f9e9-7a56-ea38c1366f33.png b/static/img/uuid-527aa0a4-a647-f9e9-7a56-ea38c1366f33.png new file mode 100644 index 0000000..3218271 Binary files /dev/null and b/static/img/uuid-527aa0a4-a647-f9e9-7a56-ea38c1366f33.png differ diff --git a/static/img/uuid-52def735-231b-d0ea-e01e-b8b12cfbe86a.png b/static/img/uuid-52def735-231b-d0ea-e01e-b8b12cfbe86a.png new file mode 100644 index 0000000..a29cbf1 Binary files /dev/null and b/static/img/uuid-52def735-231b-d0ea-e01e-b8b12cfbe86a.png differ diff --git a/static/img/uuid-53eba539-6b4d-b4cf-c33d-6168fca79640.png b/static/img/uuid-53eba539-6b4d-b4cf-c33d-6168fca79640.png new file mode 100644 index 0000000..a7dc220 Binary files /dev/null and b/static/img/uuid-53eba539-6b4d-b4cf-c33d-6168fca79640.png differ diff --git a/static/img/uuid-541a72f2-6396-7422-0446-823ce23549a0.png b/static/img/uuid-541a72f2-6396-7422-0446-823ce23549a0.png new file mode 100644 index 0000000..3658f79 Binary files /dev/null and b/static/img/uuid-541a72f2-6396-7422-0446-823ce23549a0.png differ diff --git a/static/img/uuid-5447e1bd-56ac-3503-4473-18f9784a64bf.png b/static/img/uuid-5447e1bd-56ac-3503-4473-18f9784a64bf.png new file mode 100644 index 0000000..65a9373 Binary files /dev/null and b/static/img/uuid-5447e1bd-56ac-3503-4473-18f9784a64bf.png differ diff --git a/static/img/uuid-54d3257f-0147-d101-0dde-c0296dcb798a.png b/static/img/uuid-54d3257f-0147-d101-0dde-c0296dcb798a.png new file mode 100644 index 0000000..834ec53 Binary files /dev/null and b/static/img/uuid-54d3257f-0147-d101-0dde-c0296dcb798a.png differ diff --git a/static/img/uuid-55c4990e-7f00-98a4-fa17-c3a9d0e3ba76.png b/static/img/uuid-55c4990e-7f00-98a4-fa17-c3a9d0e3ba76.png new file mode 100644 index 0000000..522d28a Binary files /dev/null and b/static/img/uuid-55c4990e-7f00-98a4-fa17-c3a9d0e3ba76.png differ diff --git a/static/img/uuid-55dc2023-f61b-5331-f1af-94924727ff25.png b/static/img/uuid-55dc2023-f61b-5331-f1af-94924727ff25.png new file mode 100644 index 0000000..d9e478a Binary files /dev/null and b/static/img/uuid-55dc2023-f61b-5331-f1af-94924727ff25.png differ diff --git a/static/img/uuid-563e93b4-6feb-8322-27f7-7b86d6957992.png b/static/img/uuid-563e93b4-6feb-8322-27f7-7b86d6957992.png new file mode 100644 index 0000000..b44c6f9 Binary files /dev/null and b/static/img/uuid-563e93b4-6feb-8322-27f7-7b86d6957992.png differ diff --git a/static/img/uuid-56915efe-d16d-4ab6-6535-f2b18d6ee6af.png b/static/img/uuid-56915efe-d16d-4ab6-6535-f2b18d6ee6af.png new file mode 100644 index 0000000..79c8b26 Binary files /dev/null and b/static/img/uuid-56915efe-d16d-4ab6-6535-f2b18d6ee6af.png differ diff --git a/static/img/uuid-56c193b1-5aaf-9bc1-63f3-61739dfcd68d.png b/static/img/uuid-56c193b1-5aaf-9bc1-63f3-61739dfcd68d.png new file mode 100644 index 0000000..4011f11 Binary files /dev/null and b/static/img/uuid-56c193b1-5aaf-9bc1-63f3-61739dfcd68d.png differ diff --git a/static/img/uuid-573f2524-97b7-94ea-38d4-c76306fafa29.png b/static/img/uuid-573f2524-97b7-94ea-38d4-c76306fafa29.png new file mode 100644 index 0000000..f258db8 Binary files /dev/null and b/static/img/uuid-573f2524-97b7-94ea-38d4-c76306fafa29.png differ diff --git a/static/img/uuid-58597c24-04b0-d59c-c007-abd9c802360a.png b/static/img/uuid-58597c24-04b0-d59c-c007-abd9c802360a.png new file mode 100644 index 0000000..29bfbe2 Binary files /dev/null and b/static/img/uuid-58597c24-04b0-d59c-c007-abd9c802360a.png differ diff --git a/static/img/uuid-588d950a-8b3c-1984-18f6-d251651222a2.png b/static/img/uuid-588d950a-8b3c-1984-18f6-d251651222a2.png new file mode 100644 index 0000000..0435722 Binary files /dev/null and b/static/img/uuid-588d950a-8b3c-1984-18f6-d251651222a2.png differ diff --git a/static/img/uuid-58a8bc7f-8220-32ed-3cc3-193aa78e8cf4.png b/static/img/uuid-58a8bc7f-8220-32ed-3cc3-193aa78e8cf4.png new file mode 100644 index 0000000..923f739 Binary files /dev/null and b/static/img/uuid-58a8bc7f-8220-32ed-3cc3-193aa78e8cf4.png differ diff --git a/static/img/uuid-58be0b4a-94fa-0a4b-1bac-91d7f81078a1.png b/static/img/uuid-58be0b4a-94fa-0a4b-1bac-91d7f81078a1.png new file mode 100644 index 0000000..7db18ff Binary files /dev/null and b/static/img/uuid-58be0b4a-94fa-0a4b-1bac-91d7f81078a1.png differ diff --git a/static/img/uuid-594370f7-8b76-f5b1-3042-d09c9f06bfe7.png b/static/img/uuid-594370f7-8b76-f5b1-3042-d09c9f06bfe7.png new file mode 100644 index 0000000..1cf55c1 Binary files /dev/null and b/static/img/uuid-594370f7-8b76-f5b1-3042-d09c9f06bfe7.png differ diff --git a/static/img/uuid-59d1dcd7-7e29-7221-cbfb-b648ab73102b.png b/static/img/uuid-59d1dcd7-7e29-7221-cbfb-b648ab73102b.png new file mode 100644 index 0000000..0732114 Binary files /dev/null and b/static/img/uuid-59d1dcd7-7e29-7221-cbfb-b648ab73102b.png differ diff --git a/static/img/uuid-5aa8c4c0-1851-b6c3-810b-11ca0c3dda28.png b/static/img/uuid-5aa8c4c0-1851-b6c3-810b-11ca0c3dda28.png new file mode 100644 index 0000000..5b2f0d2 Binary files /dev/null and b/static/img/uuid-5aa8c4c0-1851-b6c3-810b-11ca0c3dda28.png differ diff --git a/static/img/uuid-5b243f17-057e-1324-1fd8-31305be6c08c.png b/static/img/uuid-5b243f17-057e-1324-1fd8-31305be6c08c.png new file mode 100644 index 0000000..0f028d1 Binary files /dev/null and b/static/img/uuid-5b243f17-057e-1324-1fd8-31305be6c08c.png differ diff --git a/static/img/uuid-5b325bb0-a98a-bd3d-943f-c7d26897e362.png b/static/img/uuid-5b325bb0-a98a-bd3d-943f-c7d26897e362.png new file mode 100644 index 0000000..4187883 Binary files /dev/null and b/static/img/uuid-5b325bb0-a98a-bd3d-943f-c7d26897e362.png differ diff --git a/static/img/uuid-5b529235-9f88-8b16-64c4-9438f3cc9498.jpg b/static/img/uuid-5b529235-9f88-8b16-64c4-9438f3cc9498.jpg new file mode 100644 index 0000000..9bed6f0 Binary files /dev/null and b/static/img/uuid-5b529235-9f88-8b16-64c4-9438f3cc9498.jpg differ diff --git a/static/img/uuid-5b7fd557-dadc-4d73-eaa5-39119cd3b63f.png b/static/img/uuid-5b7fd557-dadc-4d73-eaa5-39119cd3b63f.png new file mode 100644 index 0000000..7525e7d Binary files /dev/null and b/static/img/uuid-5b7fd557-dadc-4d73-eaa5-39119cd3b63f.png differ diff --git a/static/img/uuid-5be9939f-1e31-2a9d-6c18-016f86734943.png b/static/img/uuid-5be9939f-1e31-2a9d-6c18-016f86734943.png new file mode 100644 index 0000000..ddf179c Binary files /dev/null and b/static/img/uuid-5be9939f-1e31-2a9d-6c18-016f86734943.png differ diff --git a/static/img/uuid-5d4f1f7c-0ca9-93fb-251c-4b63c26f1f4b.png b/static/img/uuid-5d4f1f7c-0ca9-93fb-251c-4b63c26f1f4b.png new file mode 100644 index 0000000..517dcc6 Binary files /dev/null and b/static/img/uuid-5d4f1f7c-0ca9-93fb-251c-4b63c26f1f4b.png differ diff --git a/static/img/uuid-5d668c02-0f6c-cbcb-3206-b2e5a711979f.png b/static/img/uuid-5d668c02-0f6c-cbcb-3206-b2e5a711979f.png new file mode 100644 index 0000000..3b08afd Binary files /dev/null and b/static/img/uuid-5d668c02-0f6c-cbcb-3206-b2e5a711979f.png differ diff --git a/static/img/uuid-5d9fd00b-0507-1ae7-80a2-b42a4377343e.png b/static/img/uuid-5d9fd00b-0507-1ae7-80a2-b42a4377343e.png new file mode 100644 index 0000000..c644051 Binary files /dev/null and b/static/img/uuid-5d9fd00b-0507-1ae7-80a2-b42a4377343e.png differ diff --git a/static/img/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg b/static/img/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg new file mode 100644 index 0000000..9fa0b2f --- /dev/null +++ b/static/img/uuid-5de915cb-051d-9584-d965-a36295c3f83c.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/static/img/uuid-5e41d5a0-b686-edc7-44a5-42c09bf1b12b.png b/static/img/uuid-5e41d5a0-b686-edc7-44a5-42c09bf1b12b.png new file mode 100644 index 0000000..1416f43 Binary files /dev/null and b/static/img/uuid-5e41d5a0-b686-edc7-44a5-42c09bf1b12b.png differ diff --git a/static/img/uuid-5e4c921b-80ff-3392-c91f-22e7389ce5e3.png b/static/img/uuid-5e4c921b-80ff-3392-c91f-22e7389ce5e3.png new file mode 100644 index 0000000..ea2db41 Binary files /dev/null and b/static/img/uuid-5e4c921b-80ff-3392-c91f-22e7389ce5e3.png differ diff --git a/static/img/uuid-5e506f8a-6c68-cbef-ee53-8e97df232093.png b/static/img/uuid-5e506f8a-6c68-cbef-ee53-8e97df232093.png new file mode 100644 index 0000000..4312901 Binary files /dev/null and b/static/img/uuid-5e506f8a-6c68-cbef-ee53-8e97df232093.png differ diff --git a/static/img/uuid-5f7b1066-7b97-56e9-54c2-cd2094b7e2d5.png b/static/img/uuid-5f7b1066-7b97-56e9-54c2-cd2094b7e2d5.png new file mode 100644 index 0000000..42df8bb Binary files /dev/null and b/static/img/uuid-5f7b1066-7b97-56e9-54c2-cd2094b7e2d5.png differ diff --git a/static/img/uuid-5fa460a4-aa40-627b-9ccd-d820ef1af5db.png b/static/img/uuid-5fa460a4-aa40-627b-9ccd-d820ef1af5db.png new file mode 100644 index 0000000..88c6c5c Binary files /dev/null and b/static/img/uuid-5fa460a4-aa40-627b-9ccd-d820ef1af5db.png differ diff --git a/static/img/uuid-603588f5-3a76-1594-bd18-53063a966a21.png b/static/img/uuid-603588f5-3a76-1594-bd18-53063a966a21.png new file mode 100644 index 0000000..1ae1273 Binary files /dev/null and b/static/img/uuid-603588f5-3a76-1594-bd18-53063a966a21.png differ diff --git a/static/img/uuid-605f48bd-0c0c-9003-4605-0b682c26dc57.png b/static/img/uuid-605f48bd-0c0c-9003-4605-0b682c26dc57.png new file mode 100644 index 0000000..a1cd596 Binary files /dev/null and b/static/img/uuid-605f48bd-0c0c-9003-4605-0b682c26dc57.png differ diff --git a/static/img/uuid-60a84ba2-ab5d-e077-877b-a2be85014efc.png b/static/img/uuid-60a84ba2-ab5d-e077-877b-a2be85014efc.png new file mode 100644 index 0000000..a2cb476 Binary files /dev/null and b/static/img/uuid-60a84ba2-ab5d-e077-877b-a2be85014efc.png differ diff --git a/static/img/uuid-60ec20cb-92a4-2e4d-c084-55988b170c60.png b/static/img/uuid-60ec20cb-92a4-2e4d-c084-55988b170c60.png new file mode 100644 index 0000000..c00a1bf Binary files /dev/null and b/static/img/uuid-60ec20cb-92a4-2e4d-c084-55988b170c60.png differ diff --git a/static/img/uuid-6186a9bb-4a81-f79c-3200-1e65de613b47.png b/static/img/uuid-6186a9bb-4a81-f79c-3200-1e65de613b47.png new file mode 100644 index 0000000..fc5ad25 Binary files /dev/null and b/static/img/uuid-6186a9bb-4a81-f79c-3200-1e65de613b47.png differ diff --git a/static/img/uuid-61cf9962-6cb6-6c24-74d4-132f9a1c066d.png b/static/img/uuid-61cf9962-6cb6-6c24-74d4-132f9a1c066d.png new file mode 100644 index 0000000..7d5f39f Binary files /dev/null and b/static/img/uuid-61cf9962-6cb6-6c24-74d4-132f9a1c066d.png differ diff --git a/static/img/uuid-623c579f-869c-110a-da28-346d2a574ac0.png b/static/img/uuid-623c579f-869c-110a-da28-346d2a574ac0.png new file mode 100644 index 0000000..f8b4978 Binary files /dev/null and b/static/img/uuid-623c579f-869c-110a-da28-346d2a574ac0.png differ diff --git a/static/img/uuid-624b318c-ddc6-58e7-4c58-e426c2f3db50.png b/static/img/uuid-624b318c-ddc6-58e7-4c58-e426c2f3db50.png new file mode 100644 index 0000000..dfb9275 Binary files /dev/null and b/static/img/uuid-624b318c-ddc6-58e7-4c58-e426c2f3db50.png differ diff --git a/static/img/uuid-624fc88e-8389-faf0-8638-465d3a7978ee.png b/static/img/uuid-624fc88e-8389-faf0-8638-465d3a7978ee.png new file mode 100644 index 0000000..6a77186 Binary files /dev/null and b/static/img/uuid-624fc88e-8389-faf0-8638-465d3a7978ee.png differ diff --git a/static/img/uuid-62976d61-b5fa-6258-5880-7f55090b5881.png b/static/img/uuid-62976d61-b5fa-6258-5880-7f55090b5881.png new file mode 100644 index 0000000..581771b Binary files /dev/null and b/static/img/uuid-62976d61-b5fa-6258-5880-7f55090b5881.png differ diff --git a/static/img/uuid-634355b9-8f8d-e62c-1bd2-1a36cb7921b5.png b/static/img/uuid-634355b9-8f8d-e62c-1bd2-1a36cb7921b5.png new file mode 100644 index 0000000..883a329 Binary files /dev/null and b/static/img/uuid-634355b9-8f8d-e62c-1bd2-1a36cb7921b5.png differ diff --git a/static/img/uuid-635b3416-2294-9063-b841-674935c2f4ab.jpg b/static/img/uuid-635b3416-2294-9063-b841-674935c2f4ab.jpg new file mode 100644 index 0000000..0129e0f Binary files /dev/null and b/static/img/uuid-635b3416-2294-9063-b841-674935c2f4ab.jpg differ diff --git a/static/img/uuid-636d0224-45fb-307d-a1d5-69a7d8e84d9f.png b/static/img/uuid-636d0224-45fb-307d-a1d5-69a7d8e84d9f.png new file mode 100644 index 0000000..644248e Binary files /dev/null and b/static/img/uuid-636d0224-45fb-307d-a1d5-69a7d8e84d9f.png differ diff --git a/static/img/uuid-639ad75f-9b32-7eb3-a08a-0f0a1c5035bf.png b/static/img/uuid-639ad75f-9b32-7eb3-a08a-0f0a1c5035bf.png new file mode 100644 index 0000000..42da41a Binary files /dev/null and b/static/img/uuid-639ad75f-9b32-7eb3-a08a-0f0a1c5035bf.png differ diff --git a/static/img/uuid-63ec803d-7551-ebbb-ca47-b3915c746ea2.png b/static/img/uuid-63ec803d-7551-ebbb-ca47-b3915c746ea2.png new file mode 100644 index 0000000..797b318 Binary files /dev/null and b/static/img/uuid-63ec803d-7551-ebbb-ca47-b3915c746ea2.png differ diff --git a/static/img/uuid-642c1745-3bb7-c296-bd5a-35a2368a3945.png b/static/img/uuid-642c1745-3bb7-c296-bd5a-35a2368a3945.png new file mode 100644 index 0000000..2b80fdc Binary files /dev/null and b/static/img/uuid-642c1745-3bb7-c296-bd5a-35a2368a3945.png differ diff --git a/static/img/uuid-642e1898-479a-7590-b0ae-3d3a5cc6b9c7.png b/static/img/uuid-642e1898-479a-7590-b0ae-3d3a5cc6b9c7.png new file mode 100644 index 0000000..5a608f6 Binary files /dev/null and b/static/img/uuid-642e1898-479a-7590-b0ae-3d3a5cc6b9c7.png differ diff --git a/static/img/uuid-6466da39-be6a-66e4-fc28-662201fbb0b2.png b/static/img/uuid-6466da39-be6a-66e4-fc28-662201fbb0b2.png new file mode 100644 index 0000000..74aca9d Binary files /dev/null and b/static/img/uuid-6466da39-be6a-66e4-fc28-662201fbb0b2.png differ diff --git a/static/img/uuid-64d8fb90-4d9e-e19e-6a2c-754caca6b060.png b/static/img/uuid-64d8fb90-4d9e-e19e-6a2c-754caca6b060.png new file mode 100644 index 0000000..ae738c5 Binary files /dev/null and b/static/img/uuid-64d8fb90-4d9e-e19e-6a2c-754caca6b060.png differ diff --git a/static/img/uuid-6507d4b6-e17c-fe9a-7fcf-286e99bf5447.png b/static/img/uuid-6507d4b6-e17c-fe9a-7fcf-286e99bf5447.png new file mode 100644 index 0000000..6b4593d Binary files /dev/null and b/static/img/uuid-6507d4b6-e17c-fe9a-7fcf-286e99bf5447.png differ diff --git a/static/img/uuid-6519a945-1fd2-97fd-da4a-fdab48705503.png b/static/img/uuid-6519a945-1fd2-97fd-da4a-fdab48705503.png new file mode 100644 index 0000000..4910c3f Binary files /dev/null and b/static/img/uuid-6519a945-1fd2-97fd-da4a-fdab48705503.png differ diff --git a/static/img/uuid-6556fa37-6a3c-7358-f031-137d1ca1d26c.jpg b/static/img/uuid-6556fa37-6a3c-7358-f031-137d1ca1d26c.jpg new file mode 100644 index 0000000..2f24a5d Binary files /dev/null and b/static/img/uuid-6556fa37-6a3c-7358-f031-137d1ca1d26c.jpg differ diff --git a/static/img/uuid-6657cf32-779e-915b-aaea-453f88b28ec8.png b/static/img/uuid-6657cf32-779e-915b-aaea-453f88b28ec8.png new file mode 100644 index 0000000..1bfb9c0 Binary files /dev/null and b/static/img/uuid-6657cf32-779e-915b-aaea-453f88b28ec8.png differ diff --git a/static/img/uuid-66a9dd86-282a-8695-d1c9-aa89bb61ef49.png b/static/img/uuid-66a9dd86-282a-8695-d1c9-aa89bb61ef49.png new file mode 100644 index 0000000..5baf43e Binary files /dev/null and b/static/img/uuid-66a9dd86-282a-8695-d1c9-aa89bb61ef49.png differ diff --git a/static/img/uuid-676b848d-85db-ff48-883e-6ca489d799d3.png b/static/img/uuid-676b848d-85db-ff48-883e-6ca489d799d3.png new file mode 100644 index 0000000..f2d7a68 Binary files /dev/null and b/static/img/uuid-676b848d-85db-ff48-883e-6ca489d799d3.png differ diff --git a/static/img/uuid-67f3a4f0-9315-bec3-0ea7-cca80d77b103.png b/static/img/uuid-67f3a4f0-9315-bec3-0ea7-cca80d77b103.png new file mode 100644 index 0000000..0434eef Binary files /dev/null and b/static/img/uuid-67f3a4f0-9315-bec3-0ea7-cca80d77b103.png differ diff --git a/static/img/uuid-67fb8500-b869-116e-8e97-2b1427eec451.png b/static/img/uuid-67fb8500-b869-116e-8e97-2b1427eec451.png new file mode 100644 index 0000000..0dd970e Binary files /dev/null and b/static/img/uuid-67fb8500-b869-116e-8e97-2b1427eec451.png differ diff --git a/static/img/uuid-681bee8c-6be9-b47f-06fa-72a587e7add7.jpg b/static/img/uuid-681bee8c-6be9-b47f-06fa-72a587e7add7.jpg new file mode 100644 index 0000000..238651c Binary files /dev/null and b/static/img/uuid-681bee8c-6be9-b47f-06fa-72a587e7add7.jpg differ diff --git a/static/img/uuid-683647fc-3131-1c5a-8667-2fa719d617cd.png b/static/img/uuid-683647fc-3131-1c5a-8667-2fa719d617cd.png new file mode 100644 index 0000000..dee58b8 Binary files /dev/null and b/static/img/uuid-683647fc-3131-1c5a-8667-2fa719d617cd.png differ diff --git a/static/img/uuid-68837c3f-707c-19aa-86e2-bbac732be5a5.png b/static/img/uuid-68837c3f-707c-19aa-86e2-bbac732be5a5.png new file mode 100644 index 0000000..1bebbbc Binary files /dev/null and b/static/img/uuid-68837c3f-707c-19aa-86e2-bbac732be5a5.png differ diff --git a/static/img/uuid-68c17140-7ed7-eae8-4101-12d403bee8e4.png b/static/img/uuid-68c17140-7ed7-eae8-4101-12d403bee8e4.png new file mode 100644 index 0000000..7844075 Binary files /dev/null and b/static/img/uuid-68c17140-7ed7-eae8-4101-12d403bee8e4.png differ diff --git a/static/img/uuid-68fb84b2-a10a-f7b9-f1e3-7ab0accbae3a.png b/static/img/uuid-68fb84b2-a10a-f7b9-f1e3-7ab0accbae3a.png new file mode 100644 index 0000000..9278060 Binary files /dev/null and b/static/img/uuid-68fb84b2-a10a-f7b9-f1e3-7ab0accbae3a.png differ diff --git a/static/img/uuid-6986251f-485b-cef8-01b9-c6110f4e4e4f.png b/static/img/uuid-6986251f-485b-cef8-01b9-c6110f4e4e4f.png new file mode 100644 index 0000000..c22525b Binary files /dev/null and b/static/img/uuid-6986251f-485b-cef8-01b9-c6110f4e4e4f.png differ diff --git a/static/img/uuid-69955083-387a-53a2-2da4-ba67c85ef5bb.png b/static/img/uuid-69955083-387a-53a2-2da4-ba67c85ef5bb.png new file mode 100644 index 0000000..59350bb Binary files /dev/null and b/static/img/uuid-69955083-387a-53a2-2da4-ba67c85ef5bb.png differ diff --git a/static/img/uuid-69aa514f-9623-9dde-f80f-340c81d06044.png b/static/img/uuid-69aa514f-9623-9dde-f80f-340c81d06044.png new file mode 100644 index 0000000..aba73e0 Binary files /dev/null and b/static/img/uuid-69aa514f-9623-9dde-f80f-340c81d06044.png differ diff --git a/static/img/uuid-69f86006-5ed4-0af7-716e-220d09da2165.png b/static/img/uuid-69f86006-5ed4-0af7-716e-220d09da2165.png new file mode 100644 index 0000000..f9c4ae4 Binary files /dev/null and b/static/img/uuid-69f86006-5ed4-0af7-716e-220d09da2165.png differ diff --git a/static/img/uuid-6a389697-3c42-fd18-6bfb-c5c854e695d3.png b/static/img/uuid-6a389697-3c42-fd18-6bfb-c5c854e695d3.png new file mode 100644 index 0000000..506cd06 Binary files /dev/null and b/static/img/uuid-6a389697-3c42-fd18-6bfb-c5c854e695d3.png differ diff --git a/static/img/uuid-6affd72d-61b9-8755-539a-5b26f62516a5.png b/static/img/uuid-6affd72d-61b9-8755-539a-5b26f62516a5.png new file mode 100644 index 0000000..2b098fa Binary files /dev/null and b/static/img/uuid-6affd72d-61b9-8755-539a-5b26f62516a5.png differ diff --git a/static/img/uuid-6b2fbeca-bd57-7bfa-2ba6-7bb84f9036b4.png b/static/img/uuid-6b2fbeca-bd57-7bfa-2ba6-7bb84f9036b4.png new file mode 100644 index 0000000..cceac2f Binary files /dev/null and b/static/img/uuid-6b2fbeca-bd57-7bfa-2ba6-7bb84f9036b4.png differ diff --git a/static/img/uuid-6b6e5440-9a6c-5fec-0970-63b75c992d1a.png b/static/img/uuid-6b6e5440-9a6c-5fec-0970-63b75c992d1a.png new file mode 100644 index 0000000..ea019e4 Binary files /dev/null and b/static/img/uuid-6b6e5440-9a6c-5fec-0970-63b75c992d1a.png differ diff --git a/static/img/uuid-6b74d41d-4d91-adb5-0d73-17380c293ab9.jpg b/static/img/uuid-6b74d41d-4d91-adb5-0d73-17380c293ab9.jpg new file mode 100644 index 0000000..d5a6fe8 Binary files /dev/null and b/static/img/uuid-6b74d41d-4d91-adb5-0d73-17380c293ab9.jpg differ diff --git a/static/img/uuid-6c73acd6-91b0-2cf7-80bb-b0ef7e8b6618.png b/static/img/uuid-6c73acd6-91b0-2cf7-80bb-b0ef7e8b6618.png new file mode 100644 index 0000000..7e57e69 Binary files /dev/null and b/static/img/uuid-6c73acd6-91b0-2cf7-80bb-b0ef7e8b6618.png differ diff --git a/static/img/uuid-6ca09ed8-f6fb-b286-2327-e41d25cdf10a.png b/static/img/uuid-6ca09ed8-f6fb-b286-2327-e41d25cdf10a.png new file mode 100644 index 0000000..5f6cf5c Binary files /dev/null and b/static/img/uuid-6ca09ed8-f6fb-b286-2327-e41d25cdf10a.png differ diff --git a/static/img/uuid-6cf46631-6ee5-1108-8957-9da55ebd564b.jpg b/static/img/uuid-6cf46631-6ee5-1108-8957-9da55ebd564b.jpg new file mode 100644 index 0000000..400188f Binary files /dev/null and b/static/img/uuid-6cf46631-6ee5-1108-8957-9da55ebd564b.jpg differ diff --git a/static/img/uuid-6da7408c-facc-9a1a-b494-b9acdf47accb.png b/static/img/uuid-6da7408c-facc-9a1a-b494-b9acdf47accb.png new file mode 100644 index 0000000..1662abf Binary files /dev/null and b/static/img/uuid-6da7408c-facc-9a1a-b494-b9acdf47accb.png differ diff --git a/static/img/uuid-6df6ae6a-869d-58a9-dbea-2fa93fba24e2.png b/static/img/uuid-6df6ae6a-869d-58a9-dbea-2fa93fba24e2.png new file mode 100644 index 0000000..83dac16 Binary files /dev/null and b/static/img/uuid-6df6ae6a-869d-58a9-dbea-2fa93fba24e2.png differ diff --git a/static/img/uuid-6ebb926e-6275-81b7-fdb8-559128c87944.jpg b/static/img/uuid-6ebb926e-6275-81b7-fdb8-559128c87944.jpg new file mode 100644 index 0000000..e0b7782 Binary files /dev/null and b/static/img/uuid-6ebb926e-6275-81b7-fdb8-559128c87944.jpg differ diff --git a/static/img/uuid-6f5bdb24-c8e6-3923-723f-07a33eae84bc.png b/static/img/uuid-6f5bdb24-c8e6-3923-723f-07a33eae84bc.png new file mode 100644 index 0000000..1a5e866 Binary files /dev/null and b/static/img/uuid-6f5bdb24-c8e6-3923-723f-07a33eae84bc.png differ diff --git a/static/img/uuid-6fb2370d-7bd0-a531-147b-deeb7a89c996.png b/static/img/uuid-6fb2370d-7bd0-a531-147b-deeb7a89c996.png new file mode 100644 index 0000000..83f7c3a Binary files /dev/null and b/static/img/uuid-6fb2370d-7bd0-a531-147b-deeb7a89c996.png differ diff --git a/static/img/uuid-70109545-5b55-93cb-dfa6-20a62c0cccdb.png b/static/img/uuid-70109545-5b55-93cb-dfa6-20a62c0cccdb.png new file mode 100644 index 0000000..bf77e6c Binary files /dev/null and b/static/img/uuid-70109545-5b55-93cb-dfa6-20a62c0cccdb.png differ diff --git a/static/img/uuid-704db8ad-4a9b-ce01-8631-97ca9682edcc.png b/static/img/uuid-704db8ad-4a9b-ce01-8631-97ca9682edcc.png new file mode 100644 index 0000000..93fbca4 Binary files /dev/null and b/static/img/uuid-704db8ad-4a9b-ce01-8631-97ca9682edcc.png differ diff --git a/static/img/uuid-71015c65-9c35-e1b8-e5fc-9bf9d1833731.png b/static/img/uuid-71015c65-9c35-e1b8-e5fc-9bf9d1833731.png new file mode 100644 index 0000000..1919ec6 Binary files /dev/null and b/static/img/uuid-71015c65-9c35-e1b8-e5fc-9bf9d1833731.png differ diff --git a/static/img/uuid-71148b6a-fbf8-6a5f-5423-a5ac2817e866.png b/static/img/uuid-71148b6a-fbf8-6a5f-5423-a5ac2817e866.png new file mode 100644 index 0000000..04bbd2a Binary files /dev/null and b/static/img/uuid-71148b6a-fbf8-6a5f-5423-a5ac2817e866.png differ diff --git a/static/img/uuid-71166a22-3341-0ee5-6599-6b190f83e717.png b/static/img/uuid-71166a22-3341-0ee5-6599-6b190f83e717.png new file mode 100644 index 0000000..2b241c4 Binary files /dev/null and b/static/img/uuid-71166a22-3341-0ee5-6599-6b190f83e717.png differ diff --git a/static/img/uuid-712cfa80-b11d-3b99-d09a-158ea80f051b.png b/static/img/uuid-712cfa80-b11d-3b99-d09a-158ea80f051b.png new file mode 100644 index 0000000..81443ce Binary files /dev/null and b/static/img/uuid-712cfa80-b11d-3b99-d09a-158ea80f051b.png differ diff --git a/static/img/uuid-71e4b862-efd1-ece7-3627-d970b41f2d43.png b/static/img/uuid-71e4b862-efd1-ece7-3627-d970b41f2d43.png new file mode 100644 index 0000000..ff4b601 Binary files /dev/null and b/static/img/uuid-71e4b862-efd1-ece7-3627-d970b41f2d43.png differ diff --git a/static/img/uuid-7225cae0-64cd-a1cf-b878-270a054e58da.png b/static/img/uuid-7225cae0-64cd-a1cf-b878-270a054e58da.png new file mode 100644 index 0000000..f6f332e Binary files /dev/null and b/static/img/uuid-7225cae0-64cd-a1cf-b878-270a054e58da.png differ diff --git a/static/img/uuid-722f22f9-7a85-48f3-69b6-78a16b9df4f0.png b/static/img/uuid-722f22f9-7a85-48f3-69b6-78a16b9df4f0.png new file mode 100644 index 0000000..9b1c5a3 Binary files /dev/null and b/static/img/uuid-722f22f9-7a85-48f3-69b6-78a16b9df4f0.png differ diff --git a/static/img/uuid-7235d345-4190-c1be-6ee3-fc25e1eb183e.png b/static/img/uuid-7235d345-4190-c1be-6ee3-fc25e1eb183e.png new file mode 100644 index 0000000..565d830 Binary files /dev/null and b/static/img/uuid-7235d345-4190-c1be-6ee3-fc25e1eb183e.png differ diff --git a/static/img/uuid-733ce0c0-f282-d8fc-a96e-6f3652aac049.png b/static/img/uuid-733ce0c0-f282-d8fc-a96e-6f3652aac049.png new file mode 100644 index 0000000..e69d921 Binary files /dev/null and b/static/img/uuid-733ce0c0-f282-d8fc-a96e-6f3652aac049.png differ diff --git a/static/img/uuid-734ff7ef-99f2-2ad4-e962-6fb90c3f936a.png b/static/img/uuid-734ff7ef-99f2-2ad4-e962-6fb90c3f936a.png new file mode 100644 index 0000000..7daf772 Binary files /dev/null and b/static/img/uuid-734ff7ef-99f2-2ad4-e962-6fb90c3f936a.png differ diff --git a/static/img/uuid-7389987f-3a26-24d3-6298-787eb51002e0.png b/static/img/uuid-7389987f-3a26-24d3-6298-787eb51002e0.png new file mode 100644 index 0000000..17b5d06 Binary files /dev/null and b/static/img/uuid-7389987f-3a26-24d3-6298-787eb51002e0.png differ diff --git a/static/img/uuid-73afe848-4767-6771-43fb-4675ecc1a189.jpg b/static/img/uuid-73afe848-4767-6771-43fb-4675ecc1a189.jpg new file mode 100644 index 0000000..a35da61 Binary files /dev/null and b/static/img/uuid-73afe848-4767-6771-43fb-4675ecc1a189.jpg differ diff --git a/static/img/uuid-73d46a9a-1191-00d2-578e-184d0bb3cb3d.png b/static/img/uuid-73d46a9a-1191-00d2-578e-184d0bb3cb3d.png new file mode 100644 index 0000000..b6c1d6d Binary files /dev/null and b/static/img/uuid-73d46a9a-1191-00d2-578e-184d0bb3cb3d.png differ diff --git a/static/img/uuid-73f89e6b-1f74-1d1d-8947-e06b996648ba.png b/static/img/uuid-73f89e6b-1f74-1d1d-8947-e06b996648ba.png new file mode 100644 index 0000000..2c9bc0a Binary files /dev/null and b/static/img/uuid-73f89e6b-1f74-1d1d-8947-e06b996648ba.png differ diff --git a/static/img/uuid-74153d13-4c04-d223-7389-268265192245.png b/static/img/uuid-74153d13-4c04-d223-7389-268265192245.png new file mode 100644 index 0000000..07c5271 Binary files /dev/null and b/static/img/uuid-74153d13-4c04-d223-7389-268265192245.png differ diff --git a/static/img/uuid-74995bb5-af37-b70b-03e0-218fc8e978f7.png b/static/img/uuid-74995bb5-af37-b70b-03e0-218fc8e978f7.png new file mode 100644 index 0000000..9b2d2e4 Binary files /dev/null and b/static/img/uuid-74995bb5-af37-b70b-03e0-218fc8e978f7.png differ diff --git a/static/img/uuid-74f65dc6-6662-db11-e97a-9ba3d039cea9.jpg b/static/img/uuid-74f65dc6-6662-db11-e97a-9ba3d039cea9.jpg new file mode 100644 index 0000000..21ced7e Binary files /dev/null and b/static/img/uuid-74f65dc6-6662-db11-e97a-9ba3d039cea9.jpg differ diff --git a/static/img/uuid-76fec79f-6b16-d420-3d74-53967ecf4d31.png b/static/img/uuid-76fec79f-6b16-d420-3d74-53967ecf4d31.png new file mode 100644 index 0000000..3e1d29d Binary files /dev/null and b/static/img/uuid-76fec79f-6b16-d420-3d74-53967ecf4d31.png differ diff --git a/static/img/uuid-774a69fb-d5b9-333d-f373-eab6cab793cb.png b/static/img/uuid-774a69fb-d5b9-333d-f373-eab6cab793cb.png new file mode 100644 index 0000000..28035fa Binary files /dev/null and b/static/img/uuid-774a69fb-d5b9-333d-f373-eab6cab793cb.png differ diff --git a/static/img/uuid-77517798-21b7-dd6d-6df8-5fdf12758e59.png b/static/img/uuid-77517798-21b7-dd6d-6df8-5fdf12758e59.png new file mode 100644 index 0000000..a5e43ce Binary files /dev/null and b/static/img/uuid-77517798-21b7-dd6d-6df8-5fdf12758e59.png differ diff --git a/static/img/uuid-7755ec1f-eb8f-5036-05b3-be1b330f2143.png b/static/img/uuid-7755ec1f-eb8f-5036-05b3-be1b330f2143.png new file mode 100644 index 0000000..35b3516 Binary files /dev/null and b/static/img/uuid-7755ec1f-eb8f-5036-05b3-be1b330f2143.png differ diff --git a/static/img/uuid-77ae83b9-c3d4-60a7-9997-ad0a27832d58.png b/static/img/uuid-77ae83b9-c3d4-60a7-9997-ad0a27832d58.png new file mode 100644 index 0000000..a2270f9 Binary files /dev/null and b/static/img/uuid-77ae83b9-c3d4-60a7-9997-ad0a27832d58.png differ diff --git a/static/img/uuid-78124fdc-5f54-e675-590c-e3b54a083649.svg b/static/img/uuid-78124fdc-5f54-e675-590c-e3b54a083649.svg new file mode 100644 index 0000000..7370500 --- /dev/null +++ b/static/img/uuid-78124fdc-5f54-e675-590c-e3b54a083649.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/uuid-789ed335-aeab-b87c-6045-270c5e87a641.png b/static/img/uuid-789ed335-aeab-b87c-6045-270c5e87a641.png new file mode 100644 index 0000000..aa8196f Binary files /dev/null and b/static/img/uuid-789ed335-aeab-b87c-6045-270c5e87a641.png differ diff --git a/static/img/uuid-78feab6d-8731-8d33-b453-bbf6b14a781c.png b/static/img/uuid-78feab6d-8731-8d33-b453-bbf6b14a781c.png new file mode 100644 index 0000000..9b6b2ab Binary files /dev/null and b/static/img/uuid-78feab6d-8731-8d33-b453-bbf6b14a781c.png differ diff --git a/static/img/uuid-7902ae23-26f7-bcf3-ffee-11dd4e08a183.png b/static/img/uuid-7902ae23-26f7-bcf3-ffee-11dd4e08a183.png new file mode 100644 index 0000000..f68f179 Binary files /dev/null and b/static/img/uuid-7902ae23-26f7-bcf3-ffee-11dd4e08a183.png differ diff --git a/static/img/uuid-794fef65-3c3b-12e1-e60f-f01f02802b37.png b/static/img/uuid-794fef65-3c3b-12e1-e60f-f01f02802b37.png new file mode 100644 index 0000000..892badb Binary files /dev/null and b/static/img/uuid-794fef65-3c3b-12e1-e60f-f01f02802b37.png differ diff --git a/static/img/uuid-79a85107-1f7e-60a6-6934-cbec5be94c28.png b/static/img/uuid-79a85107-1f7e-60a6-6934-cbec5be94c28.png new file mode 100644 index 0000000..f55b5c6 Binary files /dev/null and b/static/img/uuid-79a85107-1f7e-60a6-6934-cbec5be94c28.png differ diff --git a/static/img/uuid-7a681d2b-732b-b061-0eb1-ecd158c0a9b9.png b/static/img/uuid-7a681d2b-732b-b061-0eb1-ecd158c0a9b9.png new file mode 100644 index 0000000..8cb2c4d Binary files /dev/null and b/static/img/uuid-7a681d2b-732b-b061-0eb1-ecd158c0a9b9.png differ diff --git a/static/img/uuid-7b4d08a4-23ee-c089-5e7a-a8f2ea99abda.png b/static/img/uuid-7b4d08a4-23ee-c089-5e7a-a8f2ea99abda.png new file mode 100644 index 0000000..af0d308 Binary files /dev/null and b/static/img/uuid-7b4d08a4-23ee-c089-5e7a-a8f2ea99abda.png differ diff --git a/static/img/uuid-7b6b432c-fb4f-61cd-a7cf-db6fd7cbe746.png b/static/img/uuid-7b6b432c-fb4f-61cd-a7cf-db6fd7cbe746.png new file mode 100644 index 0000000..cedabbe Binary files /dev/null and b/static/img/uuid-7b6b432c-fb4f-61cd-a7cf-db6fd7cbe746.png differ diff --git a/static/img/uuid-7bb467f5-6ccc-d11e-73f9-f54d550668a8.png b/static/img/uuid-7bb467f5-6ccc-d11e-73f9-f54d550668a8.png new file mode 100644 index 0000000..86616dc Binary files /dev/null and b/static/img/uuid-7bb467f5-6ccc-d11e-73f9-f54d550668a8.png differ diff --git a/static/img/uuid-7bf083ec-108e-2c84-cb3e-b47a85b69a48.png b/static/img/uuid-7bf083ec-108e-2c84-cb3e-b47a85b69a48.png new file mode 100644 index 0000000..2bf09c5 Binary files /dev/null and b/static/img/uuid-7bf083ec-108e-2c84-cb3e-b47a85b69a48.png differ diff --git a/static/img/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png b/static/img/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png new file mode 100644 index 0000000..343c728 Binary files /dev/null and b/static/img/uuid-7c480e99-66d6-8197-a63a-e9275e127d78.png differ diff --git a/static/img/uuid-7c7f36d3-3226-2a6c-3549-cd3321895ef1.png b/static/img/uuid-7c7f36d3-3226-2a6c-3549-cd3321895ef1.png new file mode 100644 index 0000000..9566085 Binary files /dev/null and b/static/img/uuid-7c7f36d3-3226-2a6c-3549-cd3321895ef1.png differ diff --git a/static/img/uuid-7d34c319-a1a2-05a1-90b0-ded10c048482.png b/static/img/uuid-7d34c319-a1a2-05a1-90b0-ded10c048482.png new file mode 100644 index 0000000..8f10f4c Binary files /dev/null and b/static/img/uuid-7d34c319-a1a2-05a1-90b0-ded10c048482.png differ diff --git a/static/img/uuid-7d6dc7a5-d2ad-0a24-e940-6ce654e08db4.png b/static/img/uuid-7d6dc7a5-d2ad-0a24-e940-6ce654e08db4.png new file mode 100644 index 0000000..2fc5e7c Binary files /dev/null and b/static/img/uuid-7d6dc7a5-d2ad-0a24-e940-6ce654e08db4.png differ diff --git a/static/img/uuid-7d85c0ea-4806-d797-750e-ef3b092eb2db.png b/static/img/uuid-7d85c0ea-4806-d797-750e-ef3b092eb2db.png new file mode 100644 index 0000000..80a1874 Binary files /dev/null and b/static/img/uuid-7d85c0ea-4806-d797-750e-ef3b092eb2db.png differ diff --git a/static/img/uuid-7dc1ff71-7abf-8c37-8117-a2f7abb13861.png b/static/img/uuid-7dc1ff71-7abf-8c37-8117-a2f7abb13861.png new file mode 100644 index 0000000..33e6e17 Binary files /dev/null and b/static/img/uuid-7dc1ff71-7abf-8c37-8117-a2f7abb13861.png differ diff --git a/static/img/uuid-7e1fea02-d6ed-650a-043c-d8bb81c5f98e.png b/static/img/uuid-7e1fea02-d6ed-650a-043c-d8bb81c5f98e.png new file mode 100644 index 0000000..2d7fff9 Binary files /dev/null and b/static/img/uuid-7e1fea02-d6ed-650a-043c-d8bb81c5f98e.png differ diff --git a/static/img/uuid-7e451b81-22e3-0f16-af91-380ad8026de1.jpg b/static/img/uuid-7e451b81-22e3-0f16-af91-380ad8026de1.jpg new file mode 100644 index 0000000..92ac4ce Binary files /dev/null and b/static/img/uuid-7e451b81-22e3-0f16-af91-380ad8026de1.jpg differ diff --git a/static/img/uuid-7fb72644-6457-f137-c769-10345e5cb120.png b/static/img/uuid-7fb72644-6457-f137-c769-10345e5cb120.png new file mode 100644 index 0000000..ee1657d Binary files /dev/null and b/static/img/uuid-7fb72644-6457-f137-c769-10345e5cb120.png differ diff --git a/static/img/uuid-8051df2c-f4c0-70ff-b957-0f15c737b323.png b/static/img/uuid-8051df2c-f4c0-70ff-b957-0f15c737b323.png new file mode 100644 index 0000000..d8ef97b Binary files /dev/null and b/static/img/uuid-8051df2c-f4c0-70ff-b957-0f15c737b323.png differ diff --git a/static/img/uuid-80961ec0-a95b-8cce-6af1-263d07fcc5a4.png b/static/img/uuid-80961ec0-a95b-8cce-6af1-263d07fcc5a4.png new file mode 100644 index 0000000..0b3670d Binary files /dev/null and b/static/img/uuid-80961ec0-a95b-8cce-6af1-263d07fcc5a4.png differ diff --git a/static/img/uuid-80fbbf58-d67b-34af-96aa-4b5124ef844e.png b/static/img/uuid-80fbbf58-d67b-34af-96aa-4b5124ef844e.png new file mode 100644 index 0000000..78a8dd9 Binary files /dev/null and b/static/img/uuid-80fbbf58-d67b-34af-96aa-4b5124ef844e.png differ diff --git a/static/img/uuid-811a202d-1f3a-d7eb-932f-555b5eeed51e.png b/static/img/uuid-811a202d-1f3a-d7eb-932f-555b5eeed51e.png new file mode 100644 index 0000000..22472d5 Binary files /dev/null and b/static/img/uuid-811a202d-1f3a-d7eb-932f-555b5eeed51e.png differ diff --git a/static/img/uuid-81638e95-5198-7da7-ecb8-f2d9835f64be.jpg b/static/img/uuid-81638e95-5198-7da7-ecb8-f2d9835f64be.jpg new file mode 100644 index 0000000..6742ce5 Binary files /dev/null and b/static/img/uuid-81638e95-5198-7da7-ecb8-f2d9835f64be.jpg differ diff --git a/static/img/uuid-81bb90b8-85ea-ae9e-7349-3783f7af230e.png b/static/img/uuid-81bb90b8-85ea-ae9e-7349-3783f7af230e.png new file mode 100644 index 0000000..477f472 Binary files /dev/null and b/static/img/uuid-81bb90b8-85ea-ae9e-7349-3783f7af230e.png differ diff --git a/static/img/uuid-820b4fbc-df87-77b2-04c1-8f688d9f6433.png b/static/img/uuid-820b4fbc-df87-77b2-04c1-8f688d9f6433.png new file mode 100644 index 0000000..e8d4bf6 Binary files /dev/null and b/static/img/uuid-820b4fbc-df87-77b2-04c1-8f688d9f6433.png differ diff --git a/static/img/uuid-82197654-17c3-6b98-320e-cf408f16c8c9.png b/static/img/uuid-82197654-17c3-6b98-320e-cf408f16c8c9.png new file mode 100644 index 0000000..f562aa5 Binary files /dev/null and b/static/img/uuid-82197654-17c3-6b98-320e-cf408f16c8c9.png differ diff --git a/static/img/uuid-821c4edf-e9a6-a85e-a6e5-8cce61ab5f42.png b/static/img/uuid-821c4edf-e9a6-a85e-a6e5-8cce61ab5f42.png new file mode 100644 index 0000000..757fefd Binary files /dev/null and b/static/img/uuid-821c4edf-e9a6-a85e-a6e5-8cce61ab5f42.png differ diff --git a/static/img/uuid-822f879a-7f22-981d-d28f-55c91311b281.png b/static/img/uuid-822f879a-7f22-981d-d28f-55c91311b281.png new file mode 100644 index 0000000..99c4368 Binary files /dev/null and b/static/img/uuid-822f879a-7f22-981d-d28f-55c91311b281.png differ diff --git a/static/img/uuid-823c9a6f-187a-6778-36eb-130492487193.png b/static/img/uuid-823c9a6f-187a-6778-36eb-130492487193.png new file mode 100644 index 0000000..06af380 Binary files /dev/null and b/static/img/uuid-823c9a6f-187a-6778-36eb-130492487193.png differ diff --git a/static/img/uuid-841839d9-140d-afa4-254a-5587922a594b.png b/static/img/uuid-841839d9-140d-afa4-254a-5587922a594b.png new file mode 100644 index 0000000..e27eb24 Binary files /dev/null and b/static/img/uuid-841839d9-140d-afa4-254a-5587922a594b.png differ diff --git a/static/img/uuid-84805be3-7557-14df-e78e-44edaea87777.png b/static/img/uuid-84805be3-7557-14df-e78e-44edaea87777.png new file mode 100644 index 0000000..2b026ab Binary files /dev/null and b/static/img/uuid-84805be3-7557-14df-e78e-44edaea87777.png differ diff --git a/static/img/uuid-84db9e9c-38a7-4d55-1911-7671964db062.png b/static/img/uuid-84db9e9c-38a7-4d55-1911-7671964db062.png new file mode 100644 index 0000000..3848099 Binary files /dev/null and b/static/img/uuid-84db9e9c-38a7-4d55-1911-7671964db062.png differ diff --git a/static/img/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png b/static/img/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png new file mode 100644 index 0000000..ee753d7 Binary files /dev/null and b/static/img/uuid-85d4125e-c0ef-ea64-d916-d04725b00581.png differ diff --git a/static/img/uuid-85ec7e12-6811-a14d-5388-d5502f87fc22.png b/static/img/uuid-85ec7e12-6811-a14d-5388-d5502f87fc22.png new file mode 100644 index 0000000..bd19f94 Binary files /dev/null and b/static/img/uuid-85ec7e12-6811-a14d-5388-d5502f87fc22.png differ diff --git a/static/img/uuid-86871cee-ac96-75d5-d63b-bc5daa5b56c2.png b/static/img/uuid-86871cee-ac96-75d5-d63b-bc5daa5b56c2.png new file mode 100644 index 0000000..efe498c Binary files /dev/null and b/static/img/uuid-86871cee-ac96-75d5-d63b-bc5daa5b56c2.png differ diff --git a/static/img/uuid-86def2f6-adbf-52b0-1bf9-dbe7ca05c08f.png b/static/img/uuid-86def2f6-adbf-52b0-1bf9-dbe7ca05c08f.png new file mode 100644 index 0000000..cd35798 Binary files /dev/null and b/static/img/uuid-86def2f6-adbf-52b0-1bf9-dbe7ca05c08f.png differ diff --git a/static/img/uuid-86e5dd1c-f147-0a08-49bb-da4f53b9a960.png b/static/img/uuid-86e5dd1c-f147-0a08-49bb-da4f53b9a960.png new file mode 100644 index 0000000..127317a Binary files /dev/null and b/static/img/uuid-86e5dd1c-f147-0a08-49bb-da4f53b9a960.png differ diff --git a/static/img/uuid-87908768-bac5-5e86-6412-826381a0b8a4.png b/static/img/uuid-87908768-bac5-5e86-6412-826381a0b8a4.png new file mode 100644 index 0000000..1f7ebd7 Binary files /dev/null and b/static/img/uuid-87908768-bac5-5e86-6412-826381a0b8a4.png differ diff --git a/static/img/uuid-87a6ec99-9380-826b-9176-13034fefa22a.png b/static/img/uuid-87a6ec99-9380-826b-9176-13034fefa22a.png new file mode 100644 index 0000000..8a56833 Binary files /dev/null and b/static/img/uuid-87a6ec99-9380-826b-9176-13034fefa22a.png differ diff --git a/static/img/uuid-8821de29-e79d-0932-c3dd-f5deea8eba32.png b/static/img/uuid-8821de29-e79d-0932-c3dd-f5deea8eba32.png new file mode 100644 index 0000000..dcaedf1 Binary files /dev/null and b/static/img/uuid-8821de29-e79d-0932-c3dd-f5deea8eba32.png differ diff --git a/static/img/uuid-88a3d6bf-be6f-1811-a908-9072b4b88a9a.png b/static/img/uuid-88a3d6bf-be6f-1811-a908-9072b4b88a9a.png new file mode 100644 index 0000000..cabfc4b Binary files /dev/null and b/static/img/uuid-88a3d6bf-be6f-1811-a908-9072b4b88a9a.png differ diff --git a/static/img/uuid-8a1664ba-48bd-f04b-5453-60cd9641e2ca.png b/static/img/uuid-8a1664ba-48bd-f04b-5453-60cd9641e2ca.png new file mode 100644 index 0000000..bf8fdba Binary files /dev/null and b/static/img/uuid-8a1664ba-48bd-f04b-5453-60cd9641e2ca.png differ diff --git a/static/img/uuid-8b24a99b-a80b-f23a-7708-af1136ffbedb.jpg b/static/img/uuid-8b24a99b-a80b-f23a-7708-af1136ffbedb.jpg new file mode 100644 index 0000000..50e8198 Binary files /dev/null and b/static/img/uuid-8b24a99b-a80b-f23a-7708-af1136ffbedb.jpg differ diff --git a/static/img/uuid-8b262205-594a-d6ae-9985-3c47a3df5175.png b/static/img/uuid-8b262205-594a-d6ae-9985-3c47a3df5175.png new file mode 100644 index 0000000..26fc971 Binary files /dev/null and b/static/img/uuid-8b262205-594a-d6ae-9985-3c47a3df5175.png differ diff --git a/static/img/uuid-8b6d8a17-8028-3064-a48d-9a43b0328391.png b/static/img/uuid-8b6d8a17-8028-3064-a48d-9a43b0328391.png new file mode 100644 index 0000000..821870a Binary files /dev/null and b/static/img/uuid-8b6d8a17-8028-3064-a48d-9a43b0328391.png differ diff --git a/static/img/uuid-8ca5abc9-91d0-2f49-c804-dd8b60f92c39.png b/static/img/uuid-8ca5abc9-91d0-2f49-c804-dd8b60f92c39.png new file mode 100644 index 0000000..a78e3b9 Binary files /dev/null and b/static/img/uuid-8ca5abc9-91d0-2f49-c804-dd8b60f92c39.png differ diff --git a/static/img/uuid-8dad9adf-f9a7-fe6b-e598-972b45ecca27.png b/static/img/uuid-8dad9adf-f9a7-fe6b-e598-972b45ecca27.png new file mode 100644 index 0000000..d16fe30 Binary files /dev/null and b/static/img/uuid-8dad9adf-f9a7-fe6b-e598-972b45ecca27.png differ diff --git a/static/img/uuid-8e971849-b560-9393-f308-ed2587195b2c.png b/static/img/uuid-8e971849-b560-9393-f308-ed2587195b2c.png new file mode 100644 index 0000000..86c0a35 Binary files /dev/null and b/static/img/uuid-8e971849-b560-9393-f308-ed2587195b2c.png differ diff --git a/static/img/uuid-8f7bf7cb-1d82-dacf-ecc0-b3e98438c118.png b/static/img/uuid-8f7bf7cb-1d82-dacf-ecc0-b3e98438c118.png new file mode 100644 index 0000000..314292e Binary files /dev/null and b/static/img/uuid-8f7bf7cb-1d82-dacf-ecc0-b3e98438c118.png differ diff --git a/static/img/uuid-8fc9a70b-c1a9-6ce2-4369-8701e891f0d5.png b/static/img/uuid-8fc9a70b-c1a9-6ce2-4369-8701e891f0d5.png new file mode 100644 index 0000000..7295e12 Binary files /dev/null and b/static/img/uuid-8fc9a70b-c1a9-6ce2-4369-8701e891f0d5.png differ diff --git a/static/img/uuid-904a51d4-081b-8a05-0b56-3522007e3a46.jpg b/static/img/uuid-904a51d4-081b-8a05-0b56-3522007e3a46.jpg new file mode 100644 index 0000000..5b9712f Binary files /dev/null and b/static/img/uuid-904a51d4-081b-8a05-0b56-3522007e3a46.jpg differ diff --git a/static/img/uuid-9073242e-afd9-262e-25cf-395ab1881ea6.png b/static/img/uuid-9073242e-afd9-262e-25cf-395ab1881ea6.png new file mode 100644 index 0000000..c2f4123 Binary files /dev/null and b/static/img/uuid-9073242e-afd9-262e-25cf-395ab1881ea6.png differ diff --git a/static/img/uuid-909bb98f-3195-8726-8b09-a60a33209ccb.png b/static/img/uuid-909bb98f-3195-8726-8b09-a60a33209ccb.png new file mode 100644 index 0000000..3f9ecae Binary files /dev/null and b/static/img/uuid-909bb98f-3195-8726-8b09-a60a33209ccb.png differ diff --git a/static/img/uuid-90d0f8f9-8de5-2c9c-f8e7-2279dc5d48ef.png b/static/img/uuid-90d0f8f9-8de5-2c9c-f8e7-2279dc5d48ef.png new file mode 100644 index 0000000..ceb41ef Binary files /dev/null and b/static/img/uuid-90d0f8f9-8de5-2c9c-f8e7-2279dc5d48ef.png differ diff --git a/static/img/uuid-913fb5c6-4636-158b-0e87-8458323e0987.png b/static/img/uuid-913fb5c6-4636-158b-0e87-8458323e0987.png new file mode 100644 index 0000000..b275fbb Binary files /dev/null and b/static/img/uuid-913fb5c6-4636-158b-0e87-8458323e0987.png differ diff --git a/static/img/uuid-917bf276-d9f8-706a-9bb8-6b9e4d1bba39.png b/static/img/uuid-917bf276-d9f8-706a-9bb8-6b9e4d1bba39.png new file mode 100644 index 0000000..87951b6 Binary files /dev/null and b/static/img/uuid-917bf276-d9f8-706a-9bb8-6b9e4d1bba39.png differ diff --git a/static/img/uuid-918b42a8-4b92-3f05-5514-1b137c85e283.png b/static/img/uuid-918b42a8-4b92-3f05-5514-1b137c85e283.png new file mode 100644 index 0000000..ea467bd Binary files /dev/null and b/static/img/uuid-918b42a8-4b92-3f05-5514-1b137c85e283.png differ diff --git a/static/img/uuid-91fa95b8-0325-7201-68ee-ddb01087718a.png b/static/img/uuid-91fa95b8-0325-7201-68ee-ddb01087718a.png new file mode 100644 index 0000000..6fddf5d Binary files /dev/null and b/static/img/uuid-91fa95b8-0325-7201-68ee-ddb01087718a.png differ diff --git a/static/img/uuid-92405804-e42c-f788-4026-7339492f1113.png b/static/img/uuid-92405804-e42c-f788-4026-7339492f1113.png new file mode 100644 index 0000000..e132eef Binary files /dev/null and b/static/img/uuid-92405804-e42c-f788-4026-7339492f1113.png differ diff --git a/static/img/uuid-941f46db-0d8e-cfd4-0f29-7e89b30471a1.png b/static/img/uuid-941f46db-0d8e-cfd4-0f29-7e89b30471a1.png new file mode 100644 index 0000000..ef8322a Binary files /dev/null and b/static/img/uuid-941f46db-0d8e-cfd4-0f29-7e89b30471a1.png differ diff --git a/static/img/uuid-949123a0-1356-b913-0a17-cd7270ba78c3.png b/static/img/uuid-949123a0-1356-b913-0a17-cd7270ba78c3.png new file mode 100644 index 0000000..861acca Binary files /dev/null and b/static/img/uuid-949123a0-1356-b913-0a17-cd7270ba78c3.png differ diff --git a/static/img/uuid-94e2570d-ce4b-720a-db91-52b46de0a96a.png b/static/img/uuid-94e2570d-ce4b-720a-db91-52b46de0a96a.png new file mode 100644 index 0000000..973cf3a Binary files /dev/null and b/static/img/uuid-94e2570d-ce4b-720a-db91-52b46de0a96a.png differ diff --git a/static/img/uuid-9502548e-c9ec-985e-7224-7e06aa0dfbda.png b/static/img/uuid-9502548e-c9ec-985e-7224-7e06aa0dfbda.png new file mode 100644 index 0000000..64c8314 Binary files /dev/null and b/static/img/uuid-9502548e-c9ec-985e-7224-7e06aa0dfbda.png differ diff --git a/static/img/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png b/static/img/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png new file mode 100644 index 0000000..b5a807a Binary files /dev/null and b/static/img/uuid-95236863-449a-87ff-2713-11f9a7f3cfdd.png differ diff --git a/static/img/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png b/static/img/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png new file mode 100644 index 0000000..54bbe08 Binary files /dev/null and b/static/img/uuid-952a4ad0-8b1d-4707-2062-f4683aaa854d.png differ diff --git a/static/img/uuid-954473da-632b-0628-2a76-9ff4471fcc9d.jpg b/static/img/uuid-954473da-632b-0628-2a76-9ff4471fcc9d.jpg new file mode 100644 index 0000000..5137176 Binary files /dev/null and b/static/img/uuid-954473da-632b-0628-2a76-9ff4471fcc9d.jpg differ diff --git a/static/img/uuid-9547e14a-19b8-4d74-9d5a-6558fdc1f8ea.png b/static/img/uuid-9547e14a-19b8-4d74-9d5a-6558fdc1f8ea.png new file mode 100644 index 0000000..580bb1c Binary files /dev/null and b/static/img/uuid-9547e14a-19b8-4d74-9d5a-6558fdc1f8ea.png differ diff --git a/static/img/uuid-955d7e00-c03b-fa26-f239-dcf2f2b2708a.png b/static/img/uuid-955d7e00-c03b-fa26-f239-dcf2f2b2708a.png new file mode 100644 index 0000000..1a40685 Binary files /dev/null and b/static/img/uuid-955d7e00-c03b-fa26-f239-dcf2f2b2708a.png differ diff --git a/static/img/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png b/static/img/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png new file mode 100644 index 0000000..fb0778e Binary files /dev/null and b/static/img/uuid-95a678d3-4251-c9b6-555a-6a1a0b48ae24.png differ diff --git a/static/img/uuid-95e5fcc6-46bd-1efe-69a0-538ef9c8c8cb.png b/static/img/uuid-95e5fcc6-46bd-1efe-69a0-538ef9c8c8cb.png new file mode 100644 index 0000000..4f23f11 Binary files /dev/null and b/static/img/uuid-95e5fcc6-46bd-1efe-69a0-538ef9c8c8cb.png differ diff --git a/static/img/uuid-95fcc51e-94c6-ec28-5d06-5578439cf173.png b/static/img/uuid-95fcc51e-94c6-ec28-5d06-5578439cf173.png new file mode 100644 index 0000000..061f59e Binary files /dev/null and b/static/img/uuid-95fcc51e-94c6-ec28-5d06-5578439cf173.png differ diff --git a/static/img/uuid-96dabdf1-1006-5bdc-4457-92dfb91b8c70.png b/static/img/uuid-96dabdf1-1006-5bdc-4457-92dfb91b8c70.png new file mode 100644 index 0000000..26eb770 Binary files /dev/null and b/static/img/uuid-96dabdf1-1006-5bdc-4457-92dfb91b8c70.png differ diff --git a/static/img/uuid-97037eee-6e35-4a1f-1e4e-a252c78b2317.jpg b/static/img/uuid-97037eee-6e35-4a1f-1e4e-a252c78b2317.jpg new file mode 100644 index 0000000..02ae58c Binary files /dev/null and b/static/img/uuid-97037eee-6e35-4a1f-1e4e-a252c78b2317.jpg differ diff --git a/static/img/uuid-974582cb-d9c3-a954-0909-c78a76915d55.png b/static/img/uuid-974582cb-d9c3-a954-0909-c78a76915d55.png new file mode 100644 index 0000000..784da2f Binary files /dev/null and b/static/img/uuid-974582cb-d9c3-a954-0909-c78a76915d55.png differ diff --git a/static/img/uuid-974f5427-db6a-201d-a112-9bb8fee4ae7f.jpg b/static/img/uuid-974f5427-db6a-201d-a112-9bb8fee4ae7f.jpg new file mode 100644 index 0000000..f6b1249 Binary files /dev/null and b/static/img/uuid-974f5427-db6a-201d-a112-9bb8fee4ae7f.jpg differ diff --git a/static/img/uuid-97ca8e78-eae6-ff2b-f6b5-523718161a8e.jpg b/static/img/uuid-97ca8e78-eae6-ff2b-f6b5-523718161a8e.jpg new file mode 100644 index 0000000..7d1313c Binary files /dev/null and b/static/img/uuid-97ca8e78-eae6-ff2b-f6b5-523718161a8e.jpg differ diff --git a/static/img/uuid-97e3fccd-f3f6-fdc8-5f55-75f85a525e95.png b/static/img/uuid-97e3fccd-f3f6-fdc8-5f55-75f85a525e95.png new file mode 100644 index 0000000..0ab95d1 Binary files /dev/null and b/static/img/uuid-97e3fccd-f3f6-fdc8-5f55-75f85a525e95.png differ diff --git a/static/img/uuid-987a7495-6bb7-2c5e-0a19-6871b2ca8f1f.png b/static/img/uuid-987a7495-6bb7-2c5e-0a19-6871b2ca8f1f.png new file mode 100644 index 0000000..bac16b2 Binary files /dev/null and b/static/img/uuid-987a7495-6bb7-2c5e-0a19-6871b2ca8f1f.png differ diff --git a/static/img/uuid-98bd1fcb-463a-c828-a627-5d3adaf78d32.png b/static/img/uuid-98bd1fcb-463a-c828-a627-5d3adaf78d32.png new file mode 100644 index 0000000..53eda29 Binary files /dev/null and b/static/img/uuid-98bd1fcb-463a-c828-a627-5d3adaf78d32.png differ diff --git a/static/img/uuid-99b0eb76-b2f2-4c0c-ae11-abdce5177774.png b/static/img/uuid-99b0eb76-b2f2-4c0c-ae11-abdce5177774.png new file mode 100644 index 0000000..7bf2b76 Binary files /dev/null and b/static/img/uuid-99b0eb76-b2f2-4c0c-ae11-abdce5177774.png differ diff --git a/static/img/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png b/static/img/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png new file mode 100644 index 0000000..4711f3e Binary files /dev/null and b/static/img/uuid-99bb894c-3e79-91c8-9e62-7e475573495d.png differ diff --git a/static/img/uuid-9a20bdb0-2c68-3ce5-1f41-ac710e25b7be.png b/static/img/uuid-9a20bdb0-2c68-3ce5-1f41-ac710e25b7be.png new file mode 100644 index 0000000..a596dc1 Binary files /dev/null and b/static/img/uuid-9a20bdb0-2c68-3ce5-1f41-ac710e25b7be.png differ diff --git a/static/img/uuid-9a300011-7818-826c-5874-c7ba6ade8176.jpg b/static/img/uuid-9a300011-7818-826c-5874-c7ba6ade8176.jpg new file mode 100644 index 0000000..d534bee Binary files /dev/null and b/static/img/uuid-9a300011-7818-826c-5874-c7ba6ade8176.jpg differ diff --git a/static/img/uuid-9b533252-b690-2350-8a3d-5929fcd79ffb.jpg b/static/img/uuid-9b533252-b690-2350-8a3d-5929fcd79ffb.jpg new file mode 100644 index 0000000..63ecd1d Binary files /dev/null and b/static/img/uuid-9b533252-b690-2350-8a3d-5929fcd79ffb.jpg differ diff --git a/static/img/uuid-9b72d008-6924-060b-2efc-96f96390b627.png b/static/img/uuid-9b72d008-6924-060b-2efc-96f96390b627.png new file mode 100644 index 0000000..db7e5d3 Binary files /dev/null and b/static/img/uuid-9b72d008-6924-060b-2efc-96f96390b627.png differ diff --git a/static/img/uuid-9bc938b1-ce78-a66a-d1d8-aa18ee948134.png b/static/img/uuid-9bc938b1-ce78-a66a-d1d8-aa18ee948134.png new file mode 100644 index 0000000..66957d2 Binary files /dev/null and b/static/img/uuid-9bc938b1-ce78-a66a-d1d8-aa18ee948134.png differ diff --git a/static/img/uuid-9cf7ca34-d643-d13c-d241-42cefd6dc847.png b/static/img/uuid-9cf7ca34-d643-d13c-d241-42cefd6dc847.png new file mode 100644 index 0000000..7141ffc Binary files /dev/null and b/static/img/uuid-9cf7ca34-d643-d13c-d241-42cefd6dc847.png differ diff --git a/static/img/uuid-9d5b8607-e8f3-2fa7-aa78-8891c184533e.png b/static/img/uuid-9d5b8607-e8f3-2fa7-aa78-8891c184533e.png new file mode 100644 index 0000000..76a5d64 Binary files /dev/null and b/static/img/uuid-9d5b8607-e8f3-2fa7-aa78-8891c184533e.png differ diff --git a/static/img/uuid-9d7fd7fc-e125-4f45-d011-f5ddcabe0106.png b/static/img/uuid-9d7fd7fc-e125-4f45-d011-f5ddcabe0106.png new file mode 100644 index 0000000..3c015a6 Binary files /dev/null and b/static/img/uuid-9d7fd7fc-e125-4f45-d011-f5ddcabe0106.png differ diff --git a/static/img/uuid-9de8c3bc-abac-16bb-8a19-be18a97ac998.png b/static/img/uuid-9de8c3bc-abac-16bb-8a19-be18a97ac998.png new file mode 100644 index 0000000..e11c39d Binary files /dev/null and b/static/img/uuid-9de8c3bc-abac-16bb-8a19-be18a97ac998.png differ diff --git a/static/img/uuid-9def1cb2-5111-b6a3-58af-ade8becde4e4.png b/static/img/uuid-9def1cb2-5111-b6a3-58af-ade8becde4e4.png new file mode 100644 index 0000000..300f116 Binary files /dev/null and b/static/img/uuid-9def1cb2-5111-b6a3-58af-ade8becde4e4.png differ diff --git a/static/img/uuid-9e21a75a-a3ed-54f2-9b07-53a46d9a3d2d.png b/static/img/uuid-9e21a75a-a3ed-54f2-9b07-53a46d9a3d2d.png new file mode 100644 index 0000000..8a2c24e Binary files /dev/null and b/static/img/uuid-9e21a75a-a3ed-54f2-9b07-53a46d9a3d2d.png differ diff --git a/static/img/uuid-9e8845d9-aa8e-6c98-642a-4e13fddf93ea.png b/static/img/uuid-9e8845d9-aa8e-6c98-642a-4e13fddf93ea.png new file mode 100644 index 0000000..c367f2a Binary files /dev/null and b/static/img/uuid-9e8845d9-aa8e-6c98-642a-4e13fddf93ea.png differ diff --git a/static/img/uuid-9e8a91b7-c03a-f513-62a7-0e91426f1676.png b/static/img/uuid-9e8a91b7-c03a-f513-62a7-0e91426f1676.png new file mode 100644 index 0000000..5e10b77 Binary files /dev/null and b/static/img/uuid-9e8a91b7-c03a-f513-62a7-0e91426f1676.png differ diff --git a/static/img/uuid-9e94e830-280a-4137-e869-f662722473df.png b/static/img/uuid-9e94e830-280a-4137-e869-f662722473df.png new file mode 100644 index 0000000..f0a6229 Binary files /dev/null and b/static/img/uuid-9e94e830-280a-4137-e869-f662722473df.png differ diff --git a/static/img/uuid-9f07fdaf-fccd-365f-c732-7e489e246580.png b/static/img/uuid-9f07fdaf-fccd-365f-c732-7e489e246580.png new file mode 100644 index 0000000..67d5db6 Binary files /dev/null and b/static/img/uuid-9f07fdaf-fccd-365f-c732-7e489e246580.png differ diff --git a/static/img/uuid-9fdfc68c-9744-f7ae-fee6-b4cc984bdf3e.png b/static/img/uuid-9fdfc68c-9744-f7ae-fee6-b4cc984bdf3e.png new file mode 100644 index 0000000..12fffa1 Binary files /dev/null and b/static/img/uuid-9fdfc68c-9744-f7ae-fee6-b4cc984bdf3e.png differ diff --git a/static/img/uuid-a01cfa75-834c-9ffe-57bc-0a097a6df676.jpg b/static/img/uuid-a01cfa75-834c-9ffe-57bc-0a097a6df676.jpg new file mode 100644 index 0000000..b6b66fc Binary files /dev/null and b/static/img/uuid-a01cfa75-834c-9ffe-57bc-0a097a6df676.jpg differ diff --git a/static/img/uuid-a0f5c42f-1f2c-8d2b-a381-5c37bb4fe37c.jpg b/static/img/uuid-a0f5c42f-1f2c-8d2b-a381-5c37bb4fe37c.jpg new file mode 100644 index 0000000..7ffd74d Binary files /dev/null and b/static/img/uuid-a0f5c42f-1f2c-8d2b-a381-5c37bb4fe37c.jpg differ diff --git a/static/img/uuid-a25560d9-ce2a-4181-2dc6-59cc4318c577.png b/static/img/uuid-a25560d9-ce2a-4181-2dc6-59cc4318c577.png new file mode 100644 index 0000000..69ff4ba Binary files /dev/null and b/static/img/uuid-a25560d9-ce2a-4181-2dc6-59cc4318c577.png differ diff --git a/static/img/uuid-a286382b-396d-e852-1b7e-7aa8006f29ef.png b/static/img/uuid-a286382b-396d-e852-1b7e-7aa8006f29ef.png new file mode 100644 index 0000000..c071bbb Binary files /dev/null and b/static/img/uuid-a286382b-396d-e852-1b7e-7aa8006f29ef.png differ diff --git a/static/img/uuid-a2ef477b-91fa-fd15-a651-76faeb65a665.png b/static/img/uuid-a2ef477b-91fa-fd15-a651-76faeb65a665.png new file mode 100644 index 0000000..5e9805d Binary files /dev/null and b/static/img/uuid-a2ef477b-91fa-fd15-a651-76faeb65a665.png differ diff --git a/static/img/uuid-a30a61ec-5dea-3792-44ea-3e6d9c96b19d.png b/static/img/uuid-a30a61ec-5dea-3792-44ea-3e6d9c96b19d.png new file mode 100644 index 0000000..5d8cff6 Binary files /dev/null and b/static/img/uuid-a30a61ec-5dea-3792-44ea-3e6d9c96b19d.png differ diff --git a/static/img/uuid-a3ebc86e-b8db-eedf-bcff-64947885e344.png b/static/img/uuid-a3ebc86e-b8db-eedf-bcff-64947885e344.png new file mode 100644 index 0000000..c112182 Binary files /dev/null and b/static/img/uuid-a3ebc86e-b8db-eedf-bcff-64947885e344.png differ diff --git a/static/img/uuid-a40d7228-e976-458e-0508-99ded152069c.jpg b/static/img/uuid-a40d7228-e976-458e-0508-99ded152069c.jpg new file mode 100644 index 0000000..45ebf36 Binary files /dev/null and b/static/img/uuid-a40d7228-e976-458e-0508-99ded152069c.jpg differ diff --git a/static/img/uuid-a41c4d89-eb5f-0913-ac80-a0af31f99b54.png b/static/img/uuid-a41c4d89-eb5f-0913-ac80-a0af31f99b54.png new file mode 100644 index 0000000..8bd3038 Binary files /dev/null and b/static/img/uuid-a41c4d89-eb5f-0913-ac80-a0af31f99b54.png differ diff --git a/static/img/uuid-a4204c31-4165-2af9-290e-e3116ef784a3.png b/static/img/uuid-a4204c31-4165-2af9-290e-e3116ef784a3.png new file mode 100644 index 0000000..ca864ee Binary files /dev/null and b/static/img/uuid-a4204c31-4165-2af9-290e-e3116ef784a3.png differ diff --git a/static/img/uuid-a493c03e-ab64-9b02-748d-556fdd1c1b1a.png b/static/img/uuid-a493c03e-ab64-9b02-748d-556fdd1c1b1a.png new file mode 100644 index 0000000..8fe2fd5 Binary files /dev/null and b/static/img/uuid-a493c03e-ab64-9b02-748d-556fdd1c1b1a.png differ diff --git a/static/img/uuid-a52e93de-ff50-544e-c914-5aa20dbdeadd.png b/static/img/uuid-a52e93de-ff50-544e-c914-5aa20dbdeadd.png new file mode 100644 index 0000000..4bb327e Binary files /dev/null and b/static/img/uuid-a52e93de-ff50-544e-c914-5aa20dbdeadd.png differ diff --git a/static/img/uuid-a5864e82-1efc-0191-b37c-a162cfcb8f42.png b/static/img/uuid-a5864e82-1efc-0191-b37c-a162cfcb8f42.png new file mode 100644 index 0000000..27c2d15 Binary files /dev/null and b/static/img/uuid-a5864e82-1efc-0191-b37c-a162cfcb8f42.png differ diff --git a/static/img/uuid-a5b75043-f9b0-b1c3-51ac-dc1be80e1034.png b/static/img/uuid-a5b75043-f9b0-b1c3-51ac-dc1be80e1034.png new file mode 100644 index 0000000..f14dfc8 Binary files /dev/null and b/static/img/uuid-a5b75043-f9b0-b1c3-51ac-dc1be80e1034.png differ diff --git a/static/img/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg b/static/img/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg new file mode 100644 index 0000000..a57208b Binary files /dev/null and b/static/img/uuid-a660119f-d305-200d-a30b-8dbf66e6a054.jpg differ diff --git a/static/img/uuid-a6c8e931-615c-8697-8cf6-ab8d5269420b.png b/static/img/uuid-a6c8e931-615c-8697-8cf6-ab8d5269420b.png new file mode 100644 index 0000000..0a8c17f Binary files /dev/null and b/static/img/uuid-a6c8e931-615c-8697-8cf6-ab8d5269420b.png differ diff --git a/static/img/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png b/static/img/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png new file mode 100644 index 0000000..a193992 Binary files /dev/null and b/static/img/uuid-a747ddb7-7aea-2ad2-8934-7540228c4ad8.png differ diff --git a/static/img/uuid-a7bfa471-3a28-7bb4-0335-cffbacb0bd8a.png b/static/img/uuid-a7bfa471-3a28-7bb4-0335-cffbacb0bd8a.png new file mode 100644 index 0000000..d440302 Binary files /dev/null and b/static/img/uuid-a7bfa471-3a28-7bb4-0335-cffbacb0bd8a.png differ diff --git a/static/img/uuid-a8509ed5-9cc9-8851-c8df-9d298c5ae3bc.jpg b/static/img/uuid-a8509ed5-9cc9-8851-c8df-9d298c5ae3bc.jpg new file mode 100644 index 0000000..6034e98 Binary files /dev/null and b/static/img/uuid-a8509ed5-9cc9-8851-c8df-9d298c5ae3bc.jpg differ diff --git a/static/img/uuid-a87ac3d9-b1bf-89bc-8d33-84e7edc358c9.png b/static/img/uuid-a87ac3d9-b1bf-89bc-8d33-84e7edc358c9.png new file mode 100644 index 0000000..2dcd2db Binary files /dev/null and b/static/img/uuid-a87ac3d9-b1bf-89bc-8d33-84e7edc358c9.png differ diff --git a/static/img/uuid-a8e8da8b-6759-e159-5aa4-6a97f83896dc.png b/static/img/uuid-a8e8da8b-6759-e159-5aa4-6a97f83896dc.png new file mode 100644 index 0000000..621ddd9 Binary files /dev/null and b/static/img/uuid-a8e8da8b-6759-e159-5aa4-6a97f83896dc.png differ diff --git a/static/img/uuid-a928eed7-d498-758b-6a6c-5a8ef7b202d1.png b/static/img/uuid-a928eed7-d498-758b-6a6c-5a8ef7b202d1.png new file mode 100644 index 0000000..32e3ad8 Binary files /dev/null and b/static/img/uuid-a928eed7-d498-758b-6a6c-5a8ef7b202d1.png differ diff --git a/static/img/uuid-aa579855-a0d6-a545-6a4f-24f543dd36ab.png b/static/img/uuid-aa579855-a0d6-a545-6a4f-24f543dd36ab.png new file mode 100644 index 0000000..6c0a1b0 Binary files /dev/null and b/static/img/uuid-aa579855-a0d6-a545-6a4f-24f543dd36ab.png differ diff --git a/static/img/uuid-aac41e7c-0756-9d0b-d3a3-9fdf2db628dc.png b/static/img/uuid-aac41e7c-0756-9d0b-d3a3-9fdf2db628dc.png new file mode 100644 index 0000000..ce3ed92 Binary files /dev/null and b/static/img/uuid-aac41e7c-0756-9d0b-d3a3-9fdf2db628dc.png differ diff --git a/static/img/uuid-aad02a5a-3899-01eb-0842-76bfcc14b1d4.png b/static/img/uuid-aad02a5a-3899-01eb-0842-76bfcc14b1d4.png new file mode 100644 index 0000000..c885ab9 Binary files /dev/null and b/static/img/uuid-aad02a5a-3899-01eb-0842-76bfcc14b1d4.png differ diff --git a/static/img/uuid-ab2808a9-e648-a309-8e76-6aa126e8047c.gif b/static/img/uuid-ab2808a9-e648-a309-8e76-6aa126e8047c.gif new file mode 100644 index 0000000..c17dd84 Binary files /dev/null and b/static/img/uuid-ab2808a9-e648-a309-8e76-6aa126e8047c.gif differ diff --git a/static/img/uuid-ab2b08b0-8e9c-decb-e628-df8893aecb94.png b/static/img/uuid-ab2b08b0-8e9c-decb-e628-df8893aecb94.png new file mode 100644 index 0000000..efab0d7 Binary files /dev/null and b/static/img/uuid-ab2b08b0-8e9c-decb-e628-df8893aecb94.png differ diff --git a/static/img/uuid-ab9cf08d-eb9e-d46d-7bb2-740827ec96b9.png b/static/img/uuid-ab9cf08d-eb9e-d46d-7bb2-740827ec96b9.png new file mode 100644 index 0000000..85e9161 Binary files /dev/null and b/static/img/uuid-ab9cf08d-eb9e-d46d-7bb2-740827ec96b9.png differ diff --git a/static/img/uuid-abd6b335-ae55-f91a-4cea-4a9df270ce2b.png b/static/img/uuid-abd6b335-ae55-f91a-4cea-4a9df270ce2b.png new file mode 100644 index 0000000..aa87615 Binary files /dev/null and b/static/img/uuid-abd6b335-ae55-f91a-4cea-4a9df270ce2b.png differ diff --git a/static/img/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png b/static/img/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png new file mode 100644 index 0000000..01b9cd2 Binary files /dev/null and b/static/img/uuid-ac29f14a-dd0f-9360-8e51-6bc1c83f724d.png differ diff --git a/static/img/uuid-ac4d6375-b153-bb6a-d78d-f0bd9bebf824.png b/static/img/uuid-ac4d6375-b153-bb6a-d78d-f0bd9bebf824.png new file mode 100644 index 0000000..7300959 Binary files /dev/null and b/static/img/uuid-ac4d6375-b153-bb6a-d78d-f0bd9bebf824.png differ diff --git a/static/img/uuid-ac92de93-beb4-8a7d-d28c-0fe5cc8296b8.png b/static/img/uuid-ac92de93-beb4-8a7d-d28c-0fe5cc8296b8.png new file mode 100644 index 0000000..d110692 Binary files /dev/null and b/static/img/uuid-ac92de93-beb4-8a7d-d28c-0fe5cc8296b8.png differ diff --git a/static/img/uuid-acd14919-6069-8806-9834-df5d53a539a5.png b/static/img/uuid-acd14919-6069-8806-9834-df5d53a539a5.png new file mode 100644 index 0000000..64c34b6 Binary files /dev/null and b/static/img/uuid-acd14919-6069-8806-9834-df5d53a539a5.png differ diff --git a/static/img/uuid-ad094f49-47bd-4ee0-a1f3-899a5d2a61a4.png b/static/img/uuid-ad094f49-47bd-4ee0-a1f3-899a5d2a61a4.png new file mode 100644 index 0000000..0248aa2 Binary files /dev/null and b/static/img/uuid-ad094f49-47bd-4ee0-a1f3-899a5d2a61a4.png differ diff --git a/static/img/uuid-af9f1f82-169a-eb0c-6c50-1d23315691dc.png b/static/img/uuid-af9f1f82-169a-eb0c-6c50-1d23315691dc.png new file mode 100644 index 0000000..25eeeb0 Binary files /dev/null and b/static/img/uuid-af9f1f82-169a-eb0c-6c50-1d23315691dc.png differ diff --git a/static/img/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png b/static/img/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png new file mode 100644 index 0000000..201a492 Binary files /dev/null and b/static/img/uuid-b08c42b9-affd-b40d-3c6e-87410001d2fb.png differ diff --git a/static/img/uuid-b09fdf6d-9e83-e454-23c7-005f1344b4aa.png b/static/img/uuid-b09fdf6d-9e83-e454-23c7-005f1344b4aa.png new file mode 100644 index 0000000..0434a52 Binary files /dev/null and b/static/img/uuid-b09fdf6d-9e83-e454-23c7-005f1344b4aa.png differ diff --git a/static/img/uuid-b0a21607-f817-bdff-5480-e82a6f9a0152.jpg b/static/img/uuid-b0a21607-f817-bdff-5480-e82a6f9a0152.jpg new file mode 100644 index 0000000..0c2e0dd Binary files /dev/null and b/static/img/uuid-b0a21607-f817-bdff-5480-e82a6f9a0152.jpg differ diff --git a/static/img/uuid-b104fac1-d553-69d3-ebcb-b8260e8a3595.png b/static/img/uuid-b104fac1-d553-69d3-ebcb-b8260e8a3595.png new file mode 100644 index 0000000..82b2b07 Binary files /dev/null and b/static/img/uuid-b104fac1-d553-69d3-ebcb-b8260e8a3595.png differ diff --git a/static/img/uuid-b13100e0-e250-6f21-1b90-31ba26ae8486.png b/static/img/uuid-b13100e0-e250-6f21-1b90-31ba26ae8486.png new file mode 100644 index 0000000..e2de69e Binary files /dev/null and b/static/img/uuid-b13100e0-e250-6f21-1b90-31ba26ae8486.png differ diff --git a/static/img/uuid-b15d9482-748d-bb6a-1aaa-c1153ed8392b.png b/static/img/uuid-b15d9482-748d-bb6a-1aaa-c1153ed8392b.png new file mode 100644 index 0000000..e1ee2ed Binary files /dev/null and b/static/img/uuid-b15d9482-748d-bb6a-1aaa-c1153ed8392b.png differ diff --git a/static/img/uuid-b1dd1c66-369b-691d-8842-752bd6f33919.png b/static/img/uuid-b1dd1c66-369b-691d-8842-752bd6f33919.png new file mode 100644 index 0000000..fbdf49d Binary files /dev/null and b/static/img/uuid-b1dd1c66-369b-691d-8842-752bd6f33919.png differ diff --git a/static/img/uuid-b2225b17-758e-9676-2e0a-615aebd28335.png b/static/img/uuid-b2225b17-758e-9676-2e0a-615aebd28335.png new file mode 100644 index 0000000..1df57ec Binary files /dev/null and b/static/img/uuid-b2225b17-758e-9676-2e0a-615aebd28335.png differ diff --git a/static/img/uuid-b269a597-65ef-34a5-1828-ad1ab954437d.png b/static/img/uuid-b269a597-65ef-34a5-1828-ad1ab954437d.png new file mode 100644 index 0000000..69299c1 Binary files /dev/null and b/static/img/uuid-b269a597-65ef-34a5-1828-ad1ab954437d.png differ diff --git a/static/img/uuid-b2fabd61-e0f2-af2c-3074-70940d45d4cc.png b/static/img/uuid-b2fabd61-e0f2-af2c-3074-70940d45d4cc.png new file mode 100644 index 0000000..de54211 Binary files /dev/null and b/static/img/uuid-b2fabd61-e0f2-af2c-3074-70940d45d4cc.png differ diff --git a/static/img/uuid-b309f819-a995-58ae-e686-2e98ac27a1c3.png b/static/img/uuid-b309f819-a995-58ae-e686-2e98ac27a1c3.png new file mode 100644 index 0000000..56ba246 Binary files /dev/null and b/static/img/uuid-b309f819-a995-58ae-e686-2e98ac27a1c3.png differ diff --git a/static/img/uuid-b3349767-289a-0a77-f7d6-0ae2c4752ef2.png b/static/img/uuid-b3349767-289a-0a77-f7d6-0ae2c4752ef2.png new file mode 100644 index 0000000..61d2985 Binary files /dev/null and b/static/img/uuid-b3349767-289a-0a77-f7d6-0ae2c4752ef2.png differ diff --git a/static/img/uuid-b3f12826-15e7-22c6-5688-9f3be3f519fd.jpg b/static/img/uuid-b3f12826-15e7-22c6-5688-9f3be3f519fd.jpg new file mode 100644 index 0000000..571cfde Binary files /dev/null and b/static/img/uuid-b3f12826-15e7-22c6-5688-9f3be3f519fd.jpg differ diff --git a/static/img/uuid-b4d1eb0b-3222-87c7-f672-82695ed71e87.png b/static/img/uuid-b4d1eb0b-3222-87c7-f672-82695ed71e87.png new file mode 100644 index 0000000..4f2da09 Binary files /dev/null and b/static/img/uuid-b4d1eb0b-3222-87c7-f672-82695ed71e87.png differ diff --git a/static/img/uuid-b51f2636-2f9d-89c2-595e-db6ab80d5416.png b/static/img/uuid-b51f2636-2f9d-89c2-595e-db6ab80d5416.png new file mode 100644 index 0000000..9ee2981 Binary files /dev/null and b/static/img/uuid-b51f2636-2f9d-89c2-595e-db6ab80d5416.png differ diff --git a/static/img/uuid-b53b6a0d-3e15-8891-131e-9c1b5637f0bc.png b/static/img/uuid-b53b6a0d-3e15-8891-131e-9c1b5637f0bc.png new file mode 100644 index 0000000..4dffb80 Binary files /dev/null and b/static/img/uuid-b53b6a0d-3e15-8891-131e-9c1b5637f0bc.png differ diff --git a/static/img/uuid-b69592cf-9d58-0267-7327-c3265b1e4462.png b/static/img/uuid-b69592cf-9d58-0267-7327-c3265b1e4462.png new file mode 100644 index 0000000..ef157dc Binary files /dev/null and b/static/img/uuid-b69592cf-9d58-0267-7327-c3265b1e4462.png differ diff --git a/static/img/uuid-b702773a-d24b-62a5-fa83-208936e116a3.jpg b/static/img/uuid-b702773a-d24b-62a5-fa83-208936e116a3.jpg new file mode 100644 index 0000000..8b84068 Binary files /dev/null and b/static/img/uuid-b702773a-d24b-62a5-fa83-208936e116a3.jpg differ diff --git a/static/img/uuid-b72c807f-04d5-72e5-9c85-670efa9bb40a.gif b/static/img/uuid-b72c807f-04d5-72e5-9c85-670efa9bb40a.gif new file mode 100644 index 0000000..5935736 Binary files /dev/null and b/static/img/uuid-b72c807f-04d5-72e5-9c85-670efa9bb40a.gif differ diff --git a/static/img/uuid-b744552e-6efc-a532-0dd6-142bc77a1fcb.png b/static/img/uuid-b744552e-6efc-a532-0dd6-142bc77a1fcb.png new file mode 100644 index 0000000..c0bb1b2 Binary files /dev/null and b/static/img/uuid-b744552e-6efc-a532-0dd6-142bc77a1fcb.png differ diff --git a/static/img/uuid-b76a80c6-dd43-0542-65aa-98a4f8e44407.png b/static/img/uuid-b76a80c6-dd43-0542-65aa-98a4f8e44407.png new file mode 100644 index 0000000..6f0e49e Binary files /dev/null and b/static/img/uuid-b76a80c6-dd43-0542-65aa-98a4f8e44407.png differ diff --git a/static/img/uuid-b793f623-9381-97af-5a8b-72719a0223fa.png b/static/img/uuid-b793f623-9381-97af-5a8b-72719a0223fa.png new file mode 100644 index 0000000..e9ed098 Binary files /dev/null and b/static/img/uuid-b793f623-9381-97af-5a8b-72719a0223fa.png differ diff --git a/static/img/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg b/static/img/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg new file mode 100644 index 0000000..7f24736 Binary files /dev/null and b/static/img/uuid-b7e8b6d7-ad45-1950-e950-e6c37907d0d0.jpg differ diff --git a/static/img/uuid-b80417cb-80b7-3d51-5609-11f078c68a79.png b/static/img/uuid-b80417cb-80b7-3d51-5609-11f078c68a79.png new file mode 100644 index 0000000..3dc8d8b Binary files /dev/null and b/static/img/uuid-b80417cb-80b7-3d51-5609-11f078c68a79.png differ diff --git a/static/img/uuid-b81a2b79-c62d-b113-a36a-e91351cc2d41.png b/static/img/uuid-b81a2b79-c62d-b113-a36a-e91351cc2d41.png new file mode 100644 index 0000000..e8e577d Binary files /dev/null and b/static/img/uuid-b81a2b79-c62d-b113-a36a-e91351cc2d41.png differ diff --git a/static/img/uuid-b94ebc99-20bb-22e8-f056-568f725fff85.png b/static/img/uuid-b94ebc99-20bb-22e8-f056-568f725fff85.png new file mode 100644 index 0000000..a019964 Binary files /dev/null and b/static/img/uuid-b94ebc99-20bb-22e8-f056-568f725fff85.png differ diff --git a/static/img/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png b/static/img/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png new file mode 100644 index 0000000..c223dc5 Binary files /dev/null and b/static/img/uuid-b9660c7d-79af-481d-c05a-17356619dd07.png differ diff --git a/static/img/uuid-ba20e7c6-49cf-1ec0-ca6a-5630eb89c357.jpg b/static/img/uuid-ba20e7c6-49cf-1ec0-ca6a-5630eb89c357.jpg new file mode 100644 index 0000000..bf273d9 Binary files /dev/null and b/static/img/uuid-ba20e7c6-49cf-1ec0-ca6a-5630eb89c357.jpg differ diff --git a/static/img/uuid-ba3b2ff2-116c-1ae2-0e8d-72c0e73826ee.jpg b/static/img/uuid-ba3b2ff2-116c-1ae2-0e8d-72c0e73826ee.jpg new file mode 100644 index 0000000..3c820a7 Binary files /dev/null and b/static/img/uuid-ba3b2ff2-116c-1ae2-0e8d-72c0e73826ee.jpg differ diff --git a/static/img/uuid-baadaff0-fbae-febb-cca3-077a707b1676.png b/static/img/uuid-baadaff0-fbae-febb-cca3-077a707b1676.png new file mode 100644 index 0000000..ad26008 Binary files /dev/null and b/static/img/uuid-baadaff0-fbae-febb-cca3-077a707b1676.png differ diff --git a/static/img/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg b/static/img/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg new file mode 100644 index 0000000..81a7cb4 Binary files /dev/null and b/static/img/uuid-bb823f44-e4f5-b338-c82f-e2175f034f30.jpg differ diff --git a/static/img/uuid-bba07440-4913-8b44-0391-1dd275534500.png b/static/img/uuid-bba07440-4913-8b44-0391-1dd275534500.png new file mode 100644 index 0000000..023daae Binary files /dev/null and b/static/img/uuid-bba07440-4913-8b44-0391-1dd275534500.png differ diff --git a/static/img/uuid-bbcc5c35-f82c-f026-b5a7-92bb3040d6da.png b/static/img/uuid-bbcc5c35-f82c-f026-b5a7-92bb3040d6da.png new file mode 100644 index 0000000..b2c3535 Binary files /dev/null and b/static/img/uuid-bbcc5c35-f82c-f026-b5a7-92bb3040d6da.png differ diff --git a/static/img/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png b/static/img/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png new file mode 100644 index 0000000..5545b3b Binary files /dev/null and b/static/img/uuid-bc068222-9d71-6b17-2d07-9bdca30fa368.png differ diff --git a/static/img/uuid-bc4b9514-6399-0d7d-1f0f-0308aa637c5c.png b/static/img/uuid-bc4b9514-6399-0d7d-1f0f-0308aa637c5c.png new file mode 100644 index 0000000..a0ed2e7 Binary files /dev/null and b/static/img/uuid-bc4b9514-6399-0d7d-1f0f-0308aa637c5c.png differ diff --git a/static/img/uuid-bcc68f5e-feec-8292-2e57-1bfb0dd9d9b9.svg b/static/img/uuid-bcc68f5e-feec-8292-2e57-1bfb0dd9d9b9.svg new file mode 100644 index 0000000..4970342 --- /dev/null +++ b/static/img/uuid-bcc68f5e-feec-8292-2e57-1bfb0dd9d9b9.svg @@ -0,0 +1,2 @@ +


Ubuntu Jammy - 2025 Edition

Ubuntu Jammy - 2025 Edition


2024
2024
2025
2025
2026
2026
2027
2027
2028
2028
2029
2029

Ubuntu Noble - 2025 Edition

Ubuntu Noble - 202...




Ubuntu 26.04 - 2026 Edition

Ubuntu 26.04 - 2026 E...


Removed
Remov...
Stable
Stab...
Frozen
Froz...
Edge
Edge

Ubuntu Focal - Bitrise Edition 

Ubuntu Focal - Bitrise...

Ubuntu 26.04 - 2027 Edition

Ubuntu 26.04 - 2027 E...


Ubuntu 28.04 - 2027 Edition

Ubuntu 28.04 -...

Ubuntu 26.04 LTS release*

Ubuntu 26.04 LT...

Ubuntu 28.04 LTS release*

Ubuntu 28.04 LT...
 Stack uses Ubuntu Focal 20.04
 Stack uses Ubuntu Focal 20.04
 Stack uses Ubuntu Jammy 22.04
 Stack uses Ubuntu Jammy 22.04
 Stack uses Ubuntu Noble 24.04
 Stack uses Ubuntu Noble 24.04
 Stack uses Ubuntu 26.04
 Stack uses Ubuntu 26.04
 Stack uses Ubuntu 28.04
 Stack uses Ubuntu 28.04
*estimate based on previous years
*estimate based on previ...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/uuid-bce20b25-c8cc-fed6-c43c-627647f4c5a4.png b/static/img/uuid-bce20b25-c8cc-fed6-c43c-627647f4c5a4.png new file mode 100644 index 0000000..ca85b96 Binary files /dev/null and b/static/img/uuid-bce20b25-c8cc-fed6-c43c-627647f4c5a4.png differ diff --git a/static/img/uuid-bcfdf2cb-0157-100c-44ed-25e040d82e6b.jpg b/static/img/uuid-bcfdf2cb-0157-100c-44ed-25e040d82e6b.jpg new file mode 100644 index 0000000..257739d Binary files /dev/null and b/static/img/uuid-bcfdf2cb-0157-100c-44ed-25e040d82e6b.jpg differ diff --git a/static/img/uuid-bd209862-be8e-f0b7-c8c6-23b6f23d2329.png b/static/img/uuid-bd209862-be8e-f0b7-c8c6-23b6f23d2329.png new file mode 100644 index 0000000..8b39ebb Binary files /dev/null and b/static/img/uuid-bd209862-be8e-f0b7-c8c6-23b6f23d2329.png differ diff --git a/static/img/uuid-bdbb02c7-b8e7-bf04-fb52-7cacd2231760.png b/static/img/uuid-bdbb02c7-b8e7-bf04-fb52-7cacd2231760.png new file mode 100644 index 0000000..3ee0255 Binary files /dev/null and b/static/img/uuid-bdbb02c7-b8e7-bf04-fb52-7cacd2231760.png differ diff --git a/static/img/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png b/static/img/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png new file mode 100644 index 0000000..9b17170 Binary files /dev/null and b/static/img/uuid-bf243542-7a52-3b3e-e6d5-26d0248c3951.png differ diff --git a/static/img/uuid-bf544047-689a-3954-029d-58b65a35c540.png b/static/img/uuid-bf544047-689a-3954-029d-58b65a35c540.png new file mode 100644 index 0000000..4527ad5 Binary files /dev/null and b/static/img/uuid-bf544047-689a-3954-029d-58b65a35c540.png differ diff --git a/static/img/uuid-bf85c17c-277e-088a-13b0-3fe96e79cc7d.png b/static/img/uuid-bf85c17c-277e-088a-13b0-3fe96e79cc7d.png new file mode 100644 index 0000000..302210b Binary files /dev/null and b/static/img/uuid-bf85c17c-277e-088a-13b0-3fe96e79cc7d.png differ diff --git a/static/img/uuid-bf8ba810-c8e2-5323-8d6b-30b9a030b59d.jpg b/static/img/uuid-bf8ba810-c8e2-5323-8d6b-30b9a030b59d.jpg new file mode 100644 index 0000000..555e6d7 Binary files /dev/null and b/static/img/uuid-bf8ba810-c8e2-5323-8d6b-30b9a030b59d.jpg differ diff --git a/static/img/uuid-bf8f3c0e-81c1-d175-92da-bcbabe18bb3a.png b/static/img/uuid-bf8f3c0e-81c1-d175-92da-bcbabe18bb3a.png new file mode 100644 index 0000000..568438c Binary files /dev/null and b/static/img/uuid-bf8f3c0e-81c1-d175-92da-bcbabe18bb3a.png differ diff --git a/static/img/uuid-bfadf366-bdfc-4440-d2db-5e9f68843f9f.png b/static/img/uuid-bfadf366-bdfc-4440-d2db-5e9f68843f9f.png new file mode 100644 index 0000000..3665596 Binary files /dev/null and b/static/img/uuid-bfadf366-bdfc-4440-d2db-5e9f68843f9f.png differ diff --git a/static/img/uuid-bfc425a6-84a8-0672-31bb-d3d7b07b56ce.png b/static/img/uuid-bfc425a6-84a8-0672-31bb-d3d7b07b56ce.png new file mode 100644 index 0000000..fce3688 Binary files /dev/null and b/static/img/uuid-bfc425a6-84a8-0672-31bb-d3d7b07b56ce.png differ diff --git a/static/img/uuid-bfc830a8-c22d-2fc3-1dab-16fba07460fa.png b/static/img/uuid-bfc830a8-c22d-2fc3-1dab-16fba07460fa.png new file mode 100644 index 0000000..97778cb Binary files /dev/null and b/static/img/uuid-bfc830a8-c22d-2fc3-1dab-16fba07460fa.png differ diff --git a/static/img/uuid-bff97bcb-df0b-c062-3f8b-e446d171d6e9.png b/static/img/uuid-bff97bcb-df0b-c062-3f8b-e446d171d6e9.png new file mode 100644 index 0000000..afbdc60 Binary files /dev/null and b/static/img/uuid-bff97bcb-df0b-c062-3f8b-e446d171d6e9.png differ diff --git a/static/img/uuid-c09d6420-4a98-85f8-8bdc-c96e59c07779.png b/static/img/uuid-c09d6420-4a98-85f8-8bdc-c96e59c07779.png new file mode 100644 index 0000000..0a79546 Binary files /dev/null and b/static/img/uuid-c09d6420-4a98-85f8-8bdc-c96e59c07779.png differ diff --git a/static/img/uuid-c0daa517-7b8f-10d5-c390-511c68829d40.png b/static/img/uuid-c0daa517-7b8f-10d5-c390-511c68829d40.png new file mode 100644 index 0000000..723ce7c Binary files /dev/null and b/static/img/uuid-c0daa517-7b8f-10d5-c390-511c68829d40.png differ diff --git a/static/img/uuid-c139a2c3-3f9a-980e-41f0-a85bc3ea6bbb.png b/static/img/uuid-c139a2c3-3f9a-980e-41f0-a85bc3ea6bbb.png new file mode 100644 index 0000000..f3f14a4 Binary files /dev/null and b/static/img/uuid-c139a2c3-3f9a-980e-41f0-a85bc3ea6bbb.png differ diff --git a/static/img/uuid-c1bacf0c-d211-9674-a2d6-625665e9b381.png b/static/img/uuid-c1bacf0c-d211-9674-a2d6-625665e9b381.png new file mode 100644 index 0000000..0f1f153 Binary files /dev/null and b/static/img/uuid-c1bacf0c-d211-9674-a2d6-625665e9b381.png differ diff --git a/static/img/uuid-c1dec9c9-49a4-90c6-40b3-c3d69088567b.png b/static/img/uuid-c1dec9c9-49a4-90c6-40b3-c3d69088567b.png new file mode 100644 index 0000000..c9a61cc Binary files /dev/null and b/static/img/uuid-c1dec9c9-49a4-90c6-40b3-c3d69088567b.png differ diff --git a/static/img/uuid-c26b5123-a015-a06f-1e80-0845b40a2895.png b/static/img/uuid-c26b5123-a015-a06f-1e80-0845b40a2895.png new file mode 100644 index 0000000..f3f6314 Binary files /dev/null and b/static/img/uuid-c26b5123-a015-a06f-1e80-0845b40a2895.png differ diff --git a/static/img/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png b/static/img/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png new file mode 100644 index 0000000..26b4527 Binary files /dev/null and b/static/img/uuid-c446a6a9-f922-2641-53ad-49099a7921fe.png differ diff --git a/static/img/uuid-c46c2c36-ef48-dd8e-7fd4-d025a8c1403d.png b/static/img/uuid-c46c2c36-ef48-dd8e-7fd4-d025a8c1403d.png new file mode 100644 index 0000000..0aab2ea Binary files /dev/null and b/static/img/uuid-c46c2c36-ef48-dd8e-7fd4-d025a8c1403d.png differ diff --git a/static/img/uuid-c56aac7c-384f-7b63-c38e-216a32143c86.png b/static/img/uuid-c56aac7c-384f-7b63-c38e-216a32143c86.png new file mode 100644 index 0000000..b793ed4 Binary files /dev/null and b/static/img/uuid-c56aac7c-384f-7b63-c38e-216a32143c86.png differ diff --git a/static/img/uuid-c73e996d-b1f3-422a-f317-5ec31fedcd68.png b/static/img/uuid-c73e996d-b1f3-422a-f317-5ec31fedcd68.png new file mode 100644 index 0000000..d0bcc67 Binary files /dev/null and b/static/img/uuid-c73e996d-b1f3-422a-f317-5ec31fedcd68.png differ diff --git a/static/img/uuid-c79c0bb4-943a-7604-d40b-f8478be408bd.png b/static/img/uuid-c79c0bb4-943a-7604-d40b-f8478be408bd.png new file mode 100644 index 0000000..7b759cb Binary files /dev/null and b/static/img/uuid-c79c0bb4-943a-7604-d40b-f8478be408bd.png differ diff --git a/static/img/uuid-c81ac3ec-31ee-45b9-3be1-497feae7a780.png b/static/img/uuid-c81ac3ec-31ee-45b9-3be1-497feae7a780.png new file mode 100644 index 0000000..4be6e19 Binary files /dev/null and b/static/img/uuid-c81ac3ec-31ee-45b9-3be1-497feae7a780.png differ diff --git a/static/img/uuid-c82d552a-8d31-148f-82e4-bb4ec929c183.png b/static/img/uuid-c82d552a-8d31-148f-82e4-bb4ec929c183.png new file mode 100644 index 0000000..783ce5c Binary files /dev/null and b/static/img/uuid-c82d552a-8d31-148f-82e4-bb4ec929c183.png differ diff --git a/static/img/uuid-c8804850-f923-c194-e029-59d1d39e50d7.jpg b/static/img/uuid-c8804850-f923-c194-e029-59d1d39e50d7.jpg new file mode 100644 index 0000000..adfff45 Binary files /dev/null and b/static/img/uuid-c8804850-f923-c194-e029-59d1d39e50d7.jpg differ diff --git a/static/img/uuid-c88d4641-9945-2d84-dd14-ef30fdd68fc4.png b/static/img/uuid-c88d4641-9945-2d84-dd14-ef30fdd68fc4.png new file mode 100644 index 0000000..0732114 Binary files /dev/null and b/static/img/uuid-c88d4641-9945-2d84-dd14-ef30fdd68fc4.png differ diff --git a/static/img/uuid-c8b3be87-8669-d4d7-d100-ad03c3055645.png b/static/img/uuid-c8b3be87-8669-d4d7-d100-ad03c3055645.png new file mode 100644 index 0000000..e629f5e Binary files /dev/null and b/static/img/uuid-c8b3be87-8669-d4d7-d100-ad03c3055645.png differ diff --git a/static/img/uuid-c920feb2-3a96-88d7-710a-27d3d4fcba1c.jpg b/static/img/uuid-c920feb2-3a96-88d7-710a-27d3d4fcba1c.jpg new file mode 100644 index 0000000..872760d Binary files /dev/null and b/static/img/uuid-c920feb2-3a96-88d7-710a-27d3d4fcba1c.jpg differ diff --git a/static/img/uuid-c92d5036-7f13-9541-6a80-0614d27e928d.png b/static/img/uuid-c92d5036-7f13-9541-6a80-0614d27e928d.png new file mode 100644 index 0000000..b394a3b Binary files /dev/null and b/static/img/uuid-c92d5036-7f13-9541-6a80-0614d27e928d.png differ diff --git a/static/img/uuid-c92f6dbc-0dee-4ec9-3680-53b83a30f2a2.png b/static/img/uuid-c92f6dbc-0dee-4ec9-3680-53b83a30f2a2.png new file mode 100644 index 0000000..6830166 Binary files /dev/null and b/static/img/uuid-c92f6dbc-0dee-4ec9-3680-53b83a30f2a2.png differ diff --git a/static/img/uuid-c93bbd2a-6d87-97d3-11ee-ca32475064af.png b/static/img/uuid-c93bbd2a-6d87-97d3-11ee-ca32475064af.png new file mode 100644 index 0000000..01ddeda Binary files /dev/null and b/static/img/uuid-c93bbd2a-6d87-97d3-11ee-ca32475064af.png differ diff --git a/static/img/uuid-c9c66545-e909-2236-e073-d55e134d6548.png b/static/img/uuid-c9c66545-e909-2236-e073-d55e134d6548.png new file mode 100644 index 0000000..af655e3 Binary files /dev/null and b/static/img/uuid-c9c66545-e909-2236-e073-d55e134d6548.png differ diff --git a/static/img/uuid-c9f67a4a-32c5-6ea8-fd0a-e1da4dccebf2.png b/static/img/uuid-c9f67a4a-32c5-6ea8-fd0a-e1da4dccebf2.png new file mode 100644 index 0000000..36cb441 Binary files /dev/null and b/static/img/uuid-c9f67a4a-32c5-6ea8-fd0a-e1da4dccebf2.png differ diff --git a/static/img/uuid-ca5383f8-2b6e-a07a-1876-35ad58894b5f.png b/static/img/uuid-ca5383f8-2b6e-a07a-1876-35ad58894b5f.png new file mode 100644 index 0000000..ad31818 Binary files /dev/null and b/static/img/uuid-ca5383f8-2b6e-a07a-1876-35ad58894b5f.png differ diff --git a/static/img/uuid-ca83e0fe-3980-65b0-809c-86ab6bd95b36.png b/static/img/uuid-ca83e0fe-3980-65b0-809c-86ab6bd95b36.png new file mode 100644 index 0000000..1b225bb Binary files /dev/null and b/static/img/uuid-ca83e0fe-3980-65b0-809c-86ab6bd95b36.png differ diff --git a/static/img/uuid-ca915855-de3e-21af-a1d7-539b1020af65.png b/static/img/uuid-ca915855-de3e-21af-a1d7-539b1020af65.png new file mode 100644 index 0000000..489e384 Binary files /dev/null and b/static/img/uuid-ca915855-de3e-21af-a1d7-539b1020af65.png differ diff --git a/static/img/uuid-caac5c40-bb61-c1fd-af8b-5e454a9680da.png b/static/img/uuid-caac5c40-bb61-c1fd-af8b-5e454a9680da.png new file mode 100644 index 0000000..5401cc2 Binary files /dev/null and b/static/img/uuid-caac5c40-bb61-c1fd-af8b-5e454a9680da.png differ diff --git a/static/img/uuid-cac01df1-7cc0-598f-62b5-87a237ecc669.png b/static/img/uuid-cac01df1-7cc0-598f-62b5-87a237ecc669.png new file mode 100644 index 0000000..41ea52c Binary files /dev/null and b/static/img/uuid-cac01df1-7cc0-598f-62b5-87a237ecc669.png differ diff --git a/static/img/uuid-cae7939a-c5e3-917f-5121-e7ef852362d5.png b/static/img/uuid-cae7939a-c5e3-917f-5121-e7ef852362d5.png new file mode 100644 index 0000000..fb324e9 Binary files /dev/null and b/static/img/uuid-cae7939a-c5e3-917f-5121-e7ef852362d5.png differ diff --git a/static/img/uuid-cae94617-17e3-33ce-8cf7-99205e85bd22.png b/static/img/uuid-cae94617-17e3-33ce-8cf7-99205e85bd22.png new file mode 100644 index 0000000..9361780 Binary files /dev/null and b/static/img/uuid-cae94617-17e3-33ce-8cf7-99205e85bd22.png differ diff --git a/static/img/uuid-cb123ebc-f548-8e87-615f-aab39fefa078.svg b/static/img/uuid-cb123ebc-f548-8e87-615f-aab39fefa078.svg new file mode 100644 index 0000000..421491d --- /dev/null +++ b/static/img/uuid-cb123ebc-f548-8e87-615f-aab39fefa078.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/uuid-cb1811cf-42dd-3707-9288-42d1291a9780.png b/static/img/uuid-cb1811cf-42dd-3707-9288-42d1291a9780.png new file mode 100644 index 0000000..592d39f Binary files /dev/null and b/static/img/uuid-cb1811cf-42dd-3707-9288-42d1291a9780.png differ diff --git a/static/img/uuid-cc676406-6eb6-010a-1daa-9a687d3902ea.png b/static/img/uuid-cc676406-6eb6-010a-1daa-9a687d3902ea.png new file mode 100644 index 0000000..33b9ca4 Binary files /dev/null and b/static/img/uuid-cc676406-6eb6-010a-1daa-9a687d3902ea.png differ diff --git a/static/img/uuid-cc9dfa1f-9277-fe9e-7d4a-92d5fb04d5d6.jpg b/static/img/uuid-cc9dfa1f-9277-fe9e-7d4a-92d5fb04d5d6.jpg new file mode 100644 index 0000000..780fce0 Binary files /dev/null and b/static/img/uuid-cc9dfa1f-9277-fe9e-7d4a-92d5fb04d5d6.jpg differ diff --git a/static/img/uuid-ccdbd639-8424-98d8-f569-ddf58f73cbec.png b/static/img/uuid-ccdbd639-8424-98d8-f569-ddf58f73cbec.png new file mode 100644 index 0000000..d8735f7 Binary files /dev/null and b/static/img/uuid-ccdbd639-8424-98d8-f569-ddf58f73cbec.png differ diff --git a/static/img/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png b/static/img/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png new file mode 100644 index 0000000..8080bcb Binary files /dev/null and b/static/img/uuid-cd752575-c17c-0ccd-25b3-a2c97daadd57.png differ diff --git a/static/img/uuid-ce7f8183-941b-0b73-92c2-185e235442ee.jpg b/static/img/uuid-ce7f8183-941b-0b73-92c2-185e235442ee.jpg new file mode 100644 index 0000000..f994232 Binary files /dev/null and b/static/img/uuid-ce7f8183-941b-0b73-92c2-185e235442ee.jpg differ diff --git a/static/img/uuid-ce8ef015-6c7d-9b31-d3ce-69669a18b4ac.png b/static/img/uuid-ce8ef015-6c7d-9b31-d3ce-69669a18b4ac.png new file mode 100644 index 0000000..c5d5343 Binary files /dev/null and b/static/img/uuid-ce8ef015-6c7d-9b31-d3ce-69669a18b4ac.png differ diff --git a/static/img/uuid-cf02074e-b629-4880-6b9c-92ee73910849.png b/static/img/uuid-cf02074e-b629-4880-6b9c-92ee73910849.png new file mode 100644 index 0000000..cdd428f Binary files /dev/null and b/static/img/uuid-cf02074e-b629-4880-6b9c-92ee73910849.png differ diff --git a/static/img/uuid-cf217fec-a57c-6c47-f625-d7b47d74e9d5.png b/static/img/uuid-cf217fec-a57c-6c47-f625-d7b47d74e9d5.png new file mode 100644 index 0000000..a79fc14 Binary files /dev/null and b/static/img/uuid-cf217fec-a57c-6c47-f625-d7b47d74e9d5.png differ diff --git a/static/img/uuid-cf53d41b-4a10-c359-3816-2f847f107db4.png b/static/img/uuid-cf53d41b-4a10-c359-3816-2f847f107db4.png new file mode 100644 index 0000000..35ee03a Binary files /dev/null and b/static/img/uuid-cf53d41b-4a10-c359-3816-2f847f107db4.png differ diff --git a/static/img/uuid-cf5db37b-0d3a-2292-c706-28a35c9c342e.png b/static/img/uuid-cf5db37b-0d3a-2292-c706-28a35c9c342e.png new file mode 100644 index 0000000..2bdf4c5 Binary files /dev/null and b/static/img/uuid-cf5db37b-0d3a-2292-c706-28a35c9c342e.png differ diff --git a/static/img/uuid-cf875ee5-ad50-e67e-eeb9-059ac158285d.png b/static/img/uuid-cf875ee5-ad50-e67e-eeb9-059ac158285d.png new file mode 100644 index 0000000..5cb9855 Binary files /dev/null and b/static/img/uuid-cf875ee5-ad50-e67e-eeb9-059ac158285d.png differ diff --git a/static/img/uuid-cfafb8d7-1a0e-d967-5609-385cc5db90e2.jpg b/static/img/uuid-cfafb8d7-1a0e-d967-5609-385cc5db90e2.jpg new file mode 100644 index 0000000..cff313c Binary files /dev/null and b/static/img/uuid-cfafb8d7-1a0e-d967-5609-385cc5db90e2.jpg differ diff --git a/static/img/uuid-cfb7fa41-a106-26b8-af03-a12058f5639f.png b/static/img/uuid-cfb7fa41-a106-26b8-af03-a12058f5639f.png new file mode 100644 index 0000000..d90014e Binary files /dev/null and b/static/img/uuid-cfb7fa41-a106-26b8-af03-a12058f5639f.png differ diff --git a/static/img/uuid-cfe05e2a-2027-50fb-e4a8-56ef4164907f.jpg b/static/img/uuid-cfe05e2a-2027-50fb-e4a8-56ef4164907f.jpg new file mode 100644 index 0000000..4223ab3 Binary files /dev/null and b/static/img/uuid-cfe05e2a-2027-50fb-e4a8-56ef4164907f.jpg differ diff --git a/static/img/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg b/static/img/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg new file mode 100644 index 0000000..f8b6a47 --- /dev/null +++ b/static/img/uuid-cff0066a-5a70-e7b4-5140-5dabde7188c2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/uuid-d00d79a9-94d7-7bf0-fa17-b6e3adab0619.jpg b/static/img/uuid-d00d79a9-94d7-7bf0-fa17-b6e3adab0619.jpg new file mode 100644 index 0000000..2cc9c9a Binary files /dev/null and b/static/img/uuid-d00d79a9-94d7-7bf0-fa17-b6e3adab0619.jpg differ diff --git a/static/img/uuid-d0da76d5-0ec1-fd85-9ebd-b8d529c150be.png b/static/img/uuid-d0da76d5-0ec1-fd85-9ebd-b8d529c150be.png new file mode 100644 index 0000000..9ec1e5c Binary files /dev/null and b/static/img/uuid-d0da76d5-0ec1-fd85-9ebd-b8d529c150be.png differ diff --git a/static/img/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png b/static/img/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png new file mode 100644 index 0000000..069fbfd Binary files /dev/null and b/static/img/uuid-d1d45e63-f66b-fd5d-f4af-4d893ff388fb.png differ diff --git a/static/img/uuid-d1f6b886-e707-4116-3eb6-331b765507ba.png b/static/img/uuid-d1f6b886-e707-4116-3eb6-331b765507ba.png new file mode 100644 index 0000000..e3a0d42 Binary files /dev/null and b/static/img/uuid-d1f6b886-e707-4116-3eb6-331b765507ba.png differ diff --git a/static/img/uuid-d21f2840-9772-4870-9818-a3fd1162be1f.png b/static/img/uuid-d21f2840-9772-4870-9818-a3fd1162be1f.png new file mode 100644 index 0000000..d5e8901 Binary files /dev/null and b/static/img/uuid-d21f2840-9772-4870-9818-a3fd1162be1f.png differ diff --git a/static/img/uuid-d24fc560-4da7-49d1-f0b4-e14e365fba68.png b/static/img/uuid-d24fc560-4da7-49d1-f0b4-e14e365fba68.png new file mode 100644 index 0000000..b070e10 Binary files /dev/null and b/static/img/uuid-d24fc560-4da7-49d1-f0b4-e14e365fba68.png differ diff --git a/static/img/uuid-d2661447-265a-5f94-41dc-40c36c7acad6.png b/static/img/uuid-d2661447-265a-5f94-41dc-40c36c7acad6.png new file mode 100644 index 0000000..e41bd43 Binary files /dev/null and b/static/img/uuid-d2661447-265a-5f94-41dc-40c36c7acad6.png differ diff --git a/static/img/uuid-d2e802df-0b0d-afba-f36c-ad6a9af244bb.png b/static/img/uuid-d2e802df-0b0d-afba-f36c-ad6a9af244bb.png new file mode 100644 index 0000000..ff49911 Binary files /dev/null and b/static/img/uuid-d2e802df-0b0d-afba-f36c-ad6a9af244bb.png differ diff --git a/static/img/uuid-d2ee7fd1-7743-7720-d114-5f38632cd2e1.png b/static/img/uuid-d2ee7fd1-7743-7720-d114-5f38632cd2e1.png new file mode 100644 index 0000000..93b78ae Binary files /dev/null and b/static/img/uuid-d2ee7fd1-7743-7720-d114-5f38632cd2e1.png differ diff --git a/static/img/uuid-d36425af-6967-473f-d8d7-07fdaed7ebc1.png b/static/img/uuid-d36425af-6967-473f-d8d7-07fdaed7ebc1.png new file mode 100644 index 0000000..e632fbb Binary files /dev/null and b/static/img/uuid-d36425af-6967-473f-d8d7-07fdaed7ebc1.png differ diff --git a/static/img/uuid-d39167fc-7bd0-258f-a6c6-01eb7ca58268.png b/static/img/uuid-d39167fc-7bd0-258f-a6c6-01eb7ca58268.png new file mode 100644 index 0000000..01e4f0a Binary files /dev/null and b/static/img/uuid-d39167fc-7bd0-258f-a6c6-01eb7ca58268.png differ diff --git a/static/img/uuid-d3db0692-cdd1-86cb-615a-955fd97587e9.png b/static/img/uuid-d3db0692-cdd1-86cb-615a-955fd97587e9.png new file mode 100644 index 0000000..a2a32f4 Binary files /dev/null and b/static/img/uuid-d3db0692-cdd1-86cb-615a-955fd97587e9.png differ diff --git a/static/img/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg b/static/img/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg new file mode 100644 index 0000000..4448eb3 Binary files /dev/null and b/static/img/uuid-d443aa9e-a514-c8ab-eb2c-3ffb05847a9d.jpg differ diff --git a/static/img/uuid-d50cbc2f-3b77-a344-44dc-2a45449893e1.png b/static/img/uuid-d50cbc2f-3b77-a344-44dc-2a45449893e1.png new file mode 100644 index 0000000..53d5a44 Binary files /dev/null and b/static/img/uuid-d50cbc2f-3b77-a344-44dc-2a45449893e1.png differ diff --git a/static/img/uuid-d5bbba7f-b660-6c42-3745-ce80f0c72abf.png b/static/img/uuid-d5bbba7f-b660-6c42-3745-ce80f0c72abf.png new file mode 100644 index 0000000..7e95c6d Binary files /dev/null and b/static/img/uuid-d5bbba7f-b660-6c42-3745-ce80f0c72abf.png differ diff --git a/static/img/uuid-d5eac9a8-1c74-efd6-459a-aaa24af4877a.jpg b/static/img/uuid-d5eac9a8-1c74-efd6-459a-aaa24af4877a.jpg new file mode 100644 index 0000000..3465841 Binary files /dev/null and b/static/img/uuid-d5eac9a8-1c74-efd6-459a-aaa24af4877a.jpg differ diff --git a/static/img/uuid-d626ceb8-0cf3-d459-5cd7-9e59e0fef81a.jpg b/static/img/uuid-d626ceb8-0cf3-d459-5cd7-9e59e0fef81a.jpg new file mode 100644 index 0000000..bb507c2 Binary files /dev/null and b/static/img/uuid-d626ceb8-0cf3-d459-5cd7-9e59e0fef81a.jpg differ diff --git a/static/img/uuid-d6541f5d-351c-81f9-7a8b-41cfa8c1a21d.png b/static/img/uuid-d6541f5d-351c-81f9-7a8b-41cfa8c1a21d.png new file mode 100644 index 0000000..30a5bd3 Binary files /dev/null and b/static/img/uuid-d6541f5d-351c-81f9-7a8b-41cfa8c1a21d.png differ diff --git a/static/img/uuid-d6600b5b-3ad8-aee2-a28b-62f4ca2b1394.jpg b/static/img/uuid-d6600b5b-3ad8-aee2-a28b-62f4ca2b1394.jpg new file mode 100644 index 0000000..d7f17c9 Binary files /dev/null and b/static/img/uuid-d6600b5b-3ad8-aee2-a28b-62f4ca2b1394.jpg differ diff --git a/static/img/uuid-d696a899-d634-978b-1d7d-037f0a01ee5b.png b/static/img/uuid-d696a899-d634-978b-1d7d-037f0a01ee5b.png new file mode 100644 index 0000000..57f6175 Binary files /dev/null and b/static/img/uuid-d696a899-d634-978b-1d7d-037f0a01ee5b.png differ diff --git a/static/img/uuid-d6dbb0ec-3447-10ab-ba08-1bf5731153be.png b/static/img/uuid-d6dbb0ec-3447-10ab-ba08-1bf5731153be.png new file mode 100644 index 0000000..1594dc6 Binary files /dev/null and b/static/img/uuid-d6dbb0ec-3447-10ab-ba08-1bf5731153be.png differ diff --git a/static/img/uuid-d7118397-afd2-fcec-a464-e6537b882068.png b/static/img/uuid-d7118397-afd2-fcec-a464-e6537b882068.png new file mode 100644 index 0000000..933a942 Binary files /dev/null and b/static/img/uuid-d7118397-afd2-fcec-a464-e6537b882068.png differ diff --git a/static/img/uuid-d7b270fb-8c64-ce2d-c083-c1dbcfdde87f.png b/static/img/uuid-d7b270fb-8c64-ce2d-c083-c1dbcfdde87f.png new file mode 100644 index 0000000..d6aad97 Binary files /dev/null and b/static/img/uuid-d7b270fb-8c64-ce2d-c083-c1dbcfdde87f.png differ diff --git a/static/img/uuid-d83ea44a-429d-83ab-21eb-531ce6ce8416.png b/static/img/uuid-d83ea44a-429d-83ab-21eb-531ce6ce8416.png new file mode 100644 index 0000000..85d5c9c Binary files /dev/null and b/static/img/uuid-d83ea44a-429d-83ab-21eb-531ce6ce8416.png differ diff --git a/static/img/uuid-d84d9f1d-68d7-2706-a7cb-b2023ffe96a5.png b/static/img/uuid-d84d9f1d-68d7-2706-a7cb-b2023ffe96a5.png new file mode 100644 index 0000000..844fd7e Binary files /dev/null and b/static/img/uuid-d84d9f1d-68d7-2706-a7cb-b2023ffe96a5.png differ diff --git a/static/img/uuid-d85ee7fd-2f40-5ae8-34ce-c79f638f3879.png b/static/img/uuid-d85ee7fd-2f40-5ae8-34ce-c79f638f3879.png new file mode 100644 index 0000000..2c16e67 Binary files /dev/null and b/static/img/uuid-d85ee7fd-2f40-5ae8-34ce-c79f638f3879.png differ diff --git a/static/img/uuid-d8a157ed-518f-ad9c-67bb-e66a50263ab7.png b/static/img/uuid-d8a157ed-518f-ad9c-67bb-e66a50263ab7.png new file mode 100644 index 0000000..c66d3a8 Binary files /dev/null and b/static/img/uuid-d8a157ed-518f-ad9c-67bb-e66a50263ab7.png differ diff --git a/static/img/uuid-d981eb34-fe27-6796-ff24-0e9206369758.png b/static/img/uuid-d981eb34-fe27-6796-ff24-0e9206369758.png new file mode 100644 index 0000000..4c4d72c Binary files /dev/null and b/static/img/uuid-d981eb34-fe27-6796-ff24-0e9206369758.png differ diff --git a/static/img/uuid-d9ad5624-810e-4fbf-507a-f900e03620e5.png b/static/img/uuid-d9ad5624-810e-4fbf-507a-f900e03620e5.png new file mode 100644 index 0000000..ff191a3 Binary files /dev/null and b/static/img/uuid-d9ad5624-810e-4fbf-507a-f900e03620e5.png differ diff --git a/static/img/uuid-da7593a8-e6df-1d97-e903-d375dc504b05.jpg b/static/img/uuid-da7593a8-e6df-1d97-e903-d375dc504b05.jpg new file mode 100644 index 0000000..0c31401 Binary files /dev/null and b/static/img/uuid-da7593a8-e6df-1d97-e903-d375dc504b05.jpg differ diff --git a/static/img/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png b/static/img/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png new file mode 100644 index 0000000..bb3a09f Binary files /dev/null and b/static/img/uuid-da8e56db-115d-1bff-d80e-d69e8fa5c1b6.png differ diff --git a/static/img/uuid-da9ac0ed-a8fe-0d52-3e66-a8195414d1fa.png b/static/img/uuid-da9ac0ed-a8fe-0d52-3e66-a8195414d1fa.png new file mode 100644 index 0000000..860a9f0 Binary files /dev/null and b/static/img/uuid-da9ac0ed-a8fe-0d52-3e66-a8195414d1fa.png differ diff --git a/static/img/uuid-dada2b23-2bc7-5796-3d98-9131dbaa2a87.png b/static/img/uuid-dada2b23-2bc7-5796-3d98-9131dbaa2a87.png new file mode 100644 index 0000000..95d97b3 Binary files /dev/null and b/static/img/uuid-dada2b23-2bc7-5796-3d98-9131dbaa2a87.png differ diff --git a/static/img/uuid-dbb181a9-053e-bed3-133f-11e485313efa.gif b/static/img/uuid-dbb181a9-053e-bed3-133f-11e485313efa.gif new file mode 100644 index 0000000..f394724 Binary files /dev/null and b/static/img/uuid-dbb181a9-053e-bed3-133f-11e485313efa.gif differ diff --git a/static/img/uuid-dbe3dd32-b361-1fe0-2883-cf93cd64102d.png b/static/img/uuid-dbe3dd32-b361-1fe0-2883-cf93cd64102d.png new file mode 100644 index 0000000..775b3cf Binary files /dev/null and b/static/img/uuid-dbe3dd32-b361-1fe0-2883-cf93cd64102d.png differ diff --git a/static/img/uuid-dbf18dae-38c9-f32a-fb61-6afbb08edb2f.png b/static/img/uuid-dbf18dae-38c9-f32a-fb61-6afbb08edb2f.png new file mode 100644 index 0000000..ce0b13f Binary files /dev/null and b/static/img/uuid-dbf18dae-38c9-f32a-fb61-6afbb08edb2f.png differ diff --git a/static/img/uuid-dc3bfafa-9720-8935-557a-97c317a8a624.png b/static/img/uuid-dc3bfafa-9720-8935-557a-97c317a8a624.png new file mode 100644 index 0000000..56b39d2 Binary files /dev/null and b/static/img/uuid-dc3bfafa-9720-8935-557a-97c317a8a624.png differ diff --git a/static/img/uuid-dca4e3b0-8c11-d444-23c9-b5ae0f21990d.jpg b/static/img/uuid-dca4e3b0-8c11-d444-23c9-b5ae0f21990d.jpg new file mode 100644 index 0000000..dcea81f Binary files /dev/null and b/static/img/uuid-dca4e3b0-8c11-d444-23c9-b5ae0f21990d.jpg differ diff --git a/static/img/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg b/static/img/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg new file mode 100644 index 0000000..085bac8 Binary files /dev/null and b/static/img/uuid-dd095ae4-b0b8-5e20-70db-91b30bf9b6eb.jpg differ diff --git a/static/img/uuid-dd9a98bf-41aa-d933-c06f-34d69bb56148.png b/static/img/uuid-dd9a98bf-41aa-d933-c06f-34d69bb56148.png new file mode 100644 index 0000000..cd1acf9 Binary files /dev/null and b/static/img/uuid-dd9a98bf-41aa-d933-c06f-34d69bb56148.png differ diff --git a/static/img/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg b/static/img/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg new file mode 100644 index 0000000..50ba665 Binary files /dev/null and b/static/img/uuid-de20be05-7f66-9b1d-fb5d-042d92b0af3c.jpg differ diff --git a/static/img/uuid-de743a8c-7a79-dda4-b9de-e3c71f2ac32a.png b/static/img/uuid-de743a8c-7a79-dda4-b9de-e3c71f2ac32a.png new file mode 100644 index 0000000..545f1bf Binary files /dev/null and b/static/img/uuid-de743a8c-7a79-dda4-b9de-e3c71f2ac32a.png differ diff --git a/static/img/uuid-df55cc4e-3e1f-2b08-c111-6e0a231065fd.png b/static/img/uuid-df55cc4e-3e1f-2b08-c111-6e0a231065fd.png new file mode 100644 index 0000000..0c4730b Binary files /dev/null and b/static/img/uuid-df55cc4e-3e1f-2b08-c111-6e0a231065fd.png differ diff --git a/static/img/uuid-e05bd9fd-2b96-f6dd-9d2b-b3ad8ba5510e.png b/static/img/uuid-e05bd9fd-2b96-f6dd-9d2b-b3ad8ba5510e.png new file mode 100644 index 0000000..10d3a8f Binary files /dev/null and b/static/img/uuid-e05bd9fd-2b96-f6dd-9d2b-b3ad8ba5510e.png differ diff --git a/static/img/uuid-e09272e9-48fe-2dba-c52c-24b79391c293.png b/static/img/uuid-e09272e9-48fe-2dba-c52c-24b79391c293.png new file mode 100644 index 0000000..ce0a57c Binary files /dev/null and b/static/img/uuid-e09272e9-48fe-2dba-c52c-24b79391c293.png differ diff --git a/static/img/uuid-e09eda1b-3f0e-58ce-ab3f-979d05e557e6.png b/static/img/uuid-e09eda1b-3f0e-58ce-ab3f-979d05e557e6.png new file mode 100644 index 0000000..a3d19e2 Binary files /dev/null and b/static/img/uuid-e09eda1b-3f0e-58ce-ab3f-979d05e557e6.png differ diff --git a/static/img/uuid-e0c8a32c-f635-adb8-8380-03c13b38026d.png b/static/img/uuid-e0c8a32c-f635-adb8-8380-03c13b38026d.png new file mode 100644 index 0000000..352eb31 Binary files /dev/null and b/static/img/uuid-e0c8a32c-f635-adb8-8380-03c13b38026d.png differ diff --git a/static/img/uuid-e0ec0de8-1ae0-a3e9-ea57-fb0fa50b58df.png b/static/img/uuid-e0ec0de8-1ae0-a3e9-ea57-fb0fa50b58df.png new file mode 100644 index 0000000..05c1467 Binary files /dev/null and b/static/img/uuid-e0ec0de8-1ae0-a3e9-ea57-fb0fa50b58df.png differ diff --git a/static/img/uuid-e1c9e6b8-a0cf-6513-8b88-7ad65a2df1fe.png b/static/img/uuid-e1c9e6b8-a0cf-6513-8b88-7ad65a2df1fe.png new file mode 100644 index 0000000..551673e Binary files /dev/null and b/static/img/uuid-e1c9e6b8-a0cf-6513-8b88-7ad65a2df1fe.png differ diff --git a/static/img/uuid-e1e79927-bba9-65ca-01a5-24ef83efe442.png b/static/img/uuid-e1e79927-bba9-65ca-01a5-24ef83efe442.png new file mode 100644 index 0000000..037c449 Binary files /dev/null and b/static/img/uuid-e1e79927-bba9-65ca-01a5-24ef83efe442.png differ diff --git a/static/img/uuid-e3205cde-6fb9-f316-9666-a22617129183.png b/static/img/uuid-e3205cde-6fb9-f316-9666-a22617129183.png new file mode 100644 index 0000000..944d366 Binary files /dev/null and b/static/img/uuid-e3205cde-6fb9-f316-9666-a22617129183.png differ diff --git a/static/img/uuid-e39aa886-e484-fe54-2563-8d5295796112.png b/static/img/uuid-e39aa886-e484-fe54-2563-8d5295796112.png new file mode 100644 index 0000000..f969761 Binary files /dev/null and b/static/img/uuid-e39aa886-e484-fe54-2563-8d5295796112.png differ diff --git a/static/img/uuid-e444bc09-0aed-9c9d-6ebb-8531a391fb75.png b/static/img/uuid-e444bc09-0aed-9c9d-6ebb-8531a391fb75.png new file mode 100644 index 0000000..4ba283a Binary files /dev/null and b/static/img/uuid-e444bc09-0aed-9c9d-6ebb-8531a391fb75.png differ diff --git a/static/img/uuid-e4db471e-3219-872f-8c6f-7aa194b7f156.png b/static/img/uuid-e4db471e-3219-872f-8c6f-7aa194b7f156.png new file mode 100644 index 0000000..9a592bd Binary files /dev/null and b/static/img/uuid-e4db471e-3219-872f-8c6f-7aa194b7f156.png differ diff --git a/static/img/uuid-e5013e56-2f65-12a8-c6c7-ba34733cde57.png b/static/img/uuid-e5013e56-2f65-12a8-c6c7-ba34733cde57.png new file mode 100644 index 0000000..3776f71 Binary files /dev/null and b/static/img/uuid-e5013e56-2f65-12a8-c6c7-ba34733cde57.png differ diff --git a/static/img/uuid-e51ea807-fef9-bfc9-8666-2092740c7a52.png b/static/img/uuid-e51ea807-fef9-bfc9-8666-2092740c7a52.png new file mode 100644 index 0000000..daaec37 Binary files /dev/null and b/static/img/uuid-e51ea807-fef9-bfc9-8666-2092740c7a52.png differ diff --git a/static/img/uuid-e5387f19-bcbb-472b-a2fa-9c9d9aeb1c6d.png b/static/img/uuid-e5387f19-bcbb-472b-a2fa-9c9d9aeb1c6d.png new file mode 100644 index 0000000..70ac0f6 Binary files /dev/null and b/static/img/uuid-e5387f19-bcbb-472b-a2fa-9c9d9aeb1c6d.png differ diff --git a/static/img/uuid-e5531ad0-351f-de58-e68e-320c039ab434.png b/static/img/uuid-e5531ad0-351f-de58-e68e-320c039ab434.png new file mode 100644 index 0000000..c2d9651 Binary files /dev/null and b/static/img/uuid-e5531ad0-351f-de58-e68e-320c039ab434.png differ diff --git a/static/img/uuid-e6cb3a32-c73c-f0cb-e7fe-9eab8e908679.png b/static/img/uuid-e6cb3a32-c73c-f0cb-e7fe-9eab8e908679.png new file mode 100644 index 0000000..a8ada32 Binary files /dev/null and b/static/img/uuid-e6cb3a32-c73c-f0cb-e7fe-9eab8e908679.png differ diff --git a/static/img/uuid-e786c907-9370-70be-0d2f-7c9c6f028ac7.jpg b/static/img/uuid-e786c907-9370-70be-0d2f-7c9c6f028ac7.jpg new file mode 100644 index 0000000..a49e844 Binary files /dev/null and b/static/img/uuid-e786c907-9370-70be-0d2f-7c9c6f028ac7.jpg differ diff --git a/static/img/uuid-e85b689a-0101-6664-7f58-6e9ae5c851a7.png b/static/img/uuid-e85b689a-0101-6664-7f58-6e9ae5c851a7.png new file mode 100644 index 0000000..be454ed Binary files /dev/null and b/static/img/uuid-e85b689a-0101-6664-7f58-6e9ae5c851a7.png differ diff --git a/static/img/uuid-e94688f6-c068-8c29-201a-bba3c7373dca.png b/static/img/uuid-e94688f6-c068-8c29-201a-bba3c7373dca.png new file mode 100644 index 0000000..39d51c5 Binary files /dev/null and b/static/img/uuid-e94688f6-c068-8c29-201a-bba3c7373dca.png differ diff --git a/static/img/uuid-e960a587-dfa0-3b5d-aad8-6d03208a3ad6.jpg b/static/img/uuid-e960a587-dfa0-3b5d-aad8-6d03208a3ad6.jpg new file mode 100644 index 0000000..1ab1bd2 Binary files /dev/null and b/static/img/uuid-e960a587-dfa0-3b5d-aad8-6d03208a3ad6.jpg differ diff --git a/static/img/uuid-ea11f723-edcb-2e88-0d83-c4c60f1cb794.png b/static/img/uuid-ea11f723-edcb-2e88-0d83-c4c60f1cb794.png new file mode 100644 index 0000000..1dd0928 Binary files /dev/null and b/static/img/uuid-ea11f723-edcb-2e88-0d83-c4c60f1cb794.png differ diff --git a/static/img/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png b/static/img/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png new file mode 100644 index 0000000..9126ccc Binary files /dev/null and b/static/img/uuid-ea158f34-25dc-4585-c7a3-0961c5ef5472.png differ diff --git a/static/img/uuid-ea47d90b-0ff0-7cd5-2f80-4013e10f7fb3.png b/static/img/uuid-ea47d90b-0ff0-7cd5-2f80-4013e10f7fb3.png new file mode 100644 index 0000000..69f7d18 Binary files /dev/null and b/static/img/uuid-ea47d90b-0ff0-7cd5-2f80-4013e10f7fb3.png differ diff --git a/static/img/uuid-ea5d2cad-6d99-e1e7-e389-6cb1c2170256.jpg b/static/img/uuid-ea5d2cad-6d99-e1e7-e389-6cb1c2170256.jpg new file mode 100644 index 0000000..6438e59 Binary files /dev/null and b/static/img/uuid-ea5d2cad-6d99-e1e7-e389-6cb1c2170256.jpg differ diff --git a/static/img/uuid-eaa066c4-99be-c8a5-9990-fe4a08a4154c.jpg b/static/img/uuid-eaa066c4-99be-c8a5-9990-fe4a08a4154c.jpg new file mode 100644 index 0000000..dcc67d5 Binary files /dev/null and b/static/img/uuid-eaa066c4-99be-c8a5-9990-fe4a08a4154c.jpg differ diff --git a/static/img/uuid-ec4d7f8f-0f68-0f4f-806f-64114da6716f.png b/static/img/uuid-ec4d7f8f-0f68-0f4f-806f-64114da6716f.png new file mode 100644 index 0000000..05cf01f Binary files /dev/null and b/static/img/uuid-ec4d7f8f-0f68-0f4f-806f-64114da6716f.png differ diff --git a/static/img/uuid-ecd84027-5433-4ce8-cfbe-bbd61a77c095.png b/static/img/uuid-ecd84027-5433-4ce8-cfbe-bbd61a77c095.png new file mode 100644 index 0000000..798c3a7 Binary files /dev/null and b/static/img/uuid-ecd84027-5433-4ce8-cfbe-bbd61a77c095.png differ diff --git a/static/img/uuid-ed1aa9a4-7926-3cfe-bf98-ac0f98a44237.jpg b/static/img/uuid-ed1aa9a4-7926-3cfe-bf98-ac0f98a44237.jpg new file mode 100644 index 0000000..d608744 Binary files /dev/null and b/static/img/uuid-ed1aa9a4-7926-3cfe-bf98-ac0f98a44237.jpg differ diff --git a/static/img/uuid-ed3b91d2-8138-ca73-f9f2-048ab808f5ca.png b/static/img/uuid-ed3b91d2-8138-ca73-f9f2-048ab808f5ca.png new file mode 100644 index 0000000..86db8f9 Binary files /dev/null and b/static/img/uuid-ed3b91d2-8138-ca73-f9f2-048ab808f5ca.png differ diff --git a/static/img/uuid-ed66ae06-8ebc-cb93-e3e3-ce6c2e94b1de.png b/static/img/uuid-ed66ae06-8ebc-cb93-e3e3-ce6c2e94b1de.png new file mode 100644 index 0000000..a04c63a Binary files /dev/null and b/static/img/uuid-ed66ae06-8ebc-cb93-e3e3-ce6c2e94b1de.png differ diff --git a/static/img/uuid-ee309b75-e71d-aaea-5b0f-2477d3c77231.png b/static/img/uuid-ee309b75-e71d-aaea-5b0f-2477d3c77231.png new file mode 100644 index 0000000..0e7893a Binary files /dev/null and b/static/img/uuid-ee309b75-e71d-aaea-5b0f-2477d3c77231.png differ diff --git a/static/img/uuid-ee43070a-a23d-02a4-3860-9899749044e2.png b/static/img/uuid-ee43070a-a23d-02a4-3860-9899749044e2.png new file mode 100644 index 0000000..5d6a9b0 Binary files /dev/null and b/static/img/uuid-ee43070a-a23d-02a4-3860-9899749044e2.png differ diff --git a/static/img/uuid-ee6c9c9d-82a3-5470-9e0d-f5dd4f971414.jpg b/static/img/uuid-ee6c9c9d-82a3-5470-9e0d-f5dd4f971414.jpg new file mode 100644 index 0000000..687c66d Binary files /dev/null and b/static/img/uuid-ee6c9c9d-82a3-5470-9e0d-f5dd4f971414.jpg differ diff --git a/static/img/uuid-eebfeceb-3b6a-7e5d-3f3e-4431b4c200ba.png b/static/img/uuid-eebfeceb-3b6a-7e5d-3f3e-4431b4c200ba.png new file mode 100644 index 0000000..f411ae3 Binary files /dev/null and b/static/img/uuid-eebfeceb-3b6a-7e5d-3f3e-4431b4c200ba.png differ diff --git a/static/img/uuid-eec007b7-1459-0f25-5112-9c312f47a189.png b/static/img/uuid-eec007b7-1459-0f25-5112-9c312f47a189.png new file mode 100644 index 0000000..74ac18a Binary files /dev/null and b/static/img/uuid-eec007b7-1459-0f25-5112-9c312f47a189.png differ diff --git a/static/img/uuid-eeea6d87-30fd-8069-c988-d71da65580db.png b/static/img/uuid-eeea6d87-30fd-8069-c988-d71da65580db.png new file mode 100644 index 0000000..5588901 Binary files /dev/null and b/static/img/uuid-eeea6d87-30fd-8069-c988-d71da65580db.png differ diff --git a/static/img/uuid-eefe9d3d-ab41-f2c3-9657-97994dab1f73.png b/static/img/uuid-eefe9d3d-ab41-f2c3-9657-97994dab1f73.png new file mode 100644 index 0000000..963ad60 Binary files /dev/null and b/static/img/uuid-eefe9d3d-ab41-f2c3-9657-97994dab1f73.png differ diff --git a/static/img/uuid-ef391d65-8868-242c-c6b6-380d117676b7.png b/static/img/uuid-ef391d65-8868-242c-c6b6-380d117676b7.png new file mode 100644 index 0000000..5ba0850 Binary files /dev/null and b/static/img/uuid-ef391d65-8868-242c-c6b6-380d117676b7.png differ diff --git a/static/img/uuid-efe62dac-0331-a3e4-6bf8-57318826bcd3.png b/static/img/uuid-efe62dac-0331-a3e4-6bf8-57318826bcd3.png new file mode 100644 index 0000000..59bb9f6 Binary files /dev/null and b/static/img/uuid-efe62dac-0331-a3e4-6bf8-57318826bcd3.png differ diff --git a/static/img/uuid-f021126a-47d0-41a9-56f7-79b9c8461a0e.png b/static/img/uuid-f021126a-47d0-41a9-56f7-79b9c8461a0e.png new file mode 100644 index 0000000..aca2804 Binary files /dev/null and b/static/img/uuid-f021126a-47d0-41a9-56f7-79b9c8461a0e.png differ diff --git a/static/img/uuid-f06634d9-f49d-0cc1-0c09-3d660920c3ba.png b/static/img/uuid-f06634d9-f49d-0cc1-0c09-3d660920c3ba.png new file mode 100644 index 0000000..852f7d4 Binary files /dev/null and b/static/img/uuid-f06634d9-f49d-0cc1-0c09-3d660920c3ba.png differ diff --git a/static/img/uuid-f06ef542-d72d-5bed-0c22-4d729b330691.png b/static/img/uuid-f06ef542-d72d-5bed-0c22-4d729b330691.png new file mode 100644 index 0000000..33faaa6 Binary files /dev/null and b/static/img/uuid-f06ef542-d72d-5bed-0c22-4d729b330691.png differ diff --git a/static/img/uuid-f07c26d9-ec9e-bcab-3f8e-184408ae7fc2.png b/static/img/uuid-f07c26d9-ec9e-bcab-3f8e-184408ae7fc2.png new file mode 100644 index 0000000..0f2bbad Binary files /dev/null and b/static/img/uuid-f07c26d9-ec9e-bcab-3f8e-184408ae7fc2.png differ diff --git a/static/img/uuid-f0843f8b-8b7d-e417-cbee-54224507d25a.png b/static/img/uuid-f0843f8b-8b7d-e417-cbee-54224507d25a.png new file mode 100644 index 0000000..48bc365 Binary files /dev/null and b/static/img/uuid-f0843f8b-8b7d-e417-cbee-54224507d25a.png differ diff --git a/static/img/uuid-f0d69f0f-dab5-e9e9-b142-a9a5d584d1a6.png b/static/img/uuid-f0d69f0f-dab5-e9e9-b142-a9a5d584d1a6.png new file mode 100644 index 0000000..b867104 Binary files /dev/null and b/static/img/uuid-f0d69f0f-dab5-e9e9-b142-a9a5d584d1a6.png differ diff --git a/static/img/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg b/static/img/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg new file mode 100644 index 0000000..4da8090 Binary files /dev/null and b/static/img/uuid-f13c2746-f8bf-10d2-0284-1090f23c47e0.jpg differ diff --git a/static/img/uuid-f1483521-2b52-d69c-9cbb-ae0eff053094.png b/static/img/uuid-f1483521-2b52-d69c-9cbb-ae0eff053094.png new file mode 100644 index 0000000..d1c6984 Binary files /dev/null and b/static/img/uuid-f1483521-2b52-d69c-9cbb-ae0eff053094.png differ diff --git a/static/img/uuid-f1bdccd2-c501-e9ae-ace8-61c3c7e82a9b.png b/static/img/uuid-f1bdccd2-c501-e9ae-ace8-61c3c7e82a9b.png new file mode 100644 index 0000000..bfde7e0 Binary files /dev/null and b/static/img/uuid-f1bdccd2-c501-e9ae-ace8-61c3c7e82a9b.png differ diff --git a/static/img/uuid-f20ee280-d116-8015-6f87-2fd8b74da9a2.png b/static/img/uuid-f20ee280-d116-8015-6f87-2fd8b74da9a2.png new file mode 100644 index 0000000..a6d5dda Binary files /dev/null and b/static/img/uuid-f20ee280-d116-8015-6f87-2fd8b74da9a2.png differ diff --git a/static/img/uuid-f2b44f50-8b8a-8c8e-48dd-c12a800692d0.png b/static/img/uuid-f2b44f50-8b8a-8c8e-48dd-c12a800692d0.png new file mode 100644 index 0000000..a880a00 Binary files /dev/null and b/static/img/uuid-f2b44f50-8b8a-8c8e-48dd-c12a800692d0.png differ diff --git a/static/img/uuid-f2b9bb79-63bb-0c15-7e8d-4304c3fa2a51.png b/static/img/uuid-f2b9bb79-63bb-0c15-7e8d-4304c3fa2a51.png new file mode 100644 index 0000000..26e68c9 Binary files /dev/null and b/static/img/uuid-f2b9bb79-63bb-0c15-7e8d-4304c3fa2a51.png differ diff --git a/static/img/uuid-f316a946-dc82-c3b9-9e73-a65f9f12349c.png b/static/img/uuid-f316a946-dc82-c3b9-9e73-a65f9f12349c.png new file mode 100644 index 0000000..7accdf3 Binary files /dev/null and b/static/img/uuid-f316a946-dc82-c3b9-9e73-a65f9f12349c.png differ diff --git a/static/img/uuid-f52635e0-c0c6-f09a-042a-4d8e785fb35c.png b/static/img/uuid-f52635e0-c0c6-f09a-042a-4d8e785fb35c.png new file mode 100644 index 0000000..09fad49 Binary files /dev/null and b/static/img/uuid-f52635e0-c0c6-f09a-042a-4d8e785fb35c.png differ diff --git a/static/img/uuid-f545c6a6-701f-485f-c852-70ed2222392a.png b/static/img/uuid-f545c6a6-701f-485f-c852-70ed2222392a.png new file mode 100644 index 0000000..55fa770 Binary files /dev/null and b/static/img/uuid-f545c6a6-701f-485f-c852-70ed2222392a.png differ diff --git a/static/img/uuid-f5c2904f-3e0b-71ae-b96a-b6059f61bed2.svg b/static/img/uuid-f5c2904f-3e0b-71ae-b96a-b6059f61bed2.svg new file mode 100644 index 0000000..0bac144 --- /dev/null +++ b/static/img/uuid-f5c2904f-3e0b-71ae-b96a-b6059f61bed2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/uuid-f5f86a6c-d609-1970-a451-0de6d5b4edb3.png b/static/img/uuid-f5f86a6c-d609-1970-a451-0de6d5b4edb3.png new file mode 100644 index 0000000..d4458f2 Binary files /dev/null and b/static/img/uuid-f5f86a6c-d609-1970-a451-0de6d5b4edb3.png differ diff --git a/static/img/uuid-f63b2a01-2f9d-fb91-dc1d-a94aa4d3e386.png b/static/img/uuid-f63b2a01-2f9d-fb91-dc1d-a94aa4d3e386.png new file mode 100644 index 0000000..e93dce3 Binary files /dev/null and b/static/img/uuid-f63b2a01-2f9d-fb91-dc1d-a94aa4d3e386.png differ diff --git a/static/img/uuid-f6505a6f-5c4e-7cf1-8a81-f8325898b1be.jpg b/static/img/uuid-f6505a6f-5c4e-7cf1-8a81-f8325898b1be.jpg new file mode 100644 index 0000000..60a4a28 Binary files /dev/null and b/static/img/uuid-f6505a6f-5c4e-7cf1-8a81-f8325898b1be.jpg differ diff --git a/static/img/uuid-f655a8a5-c151-d103-6de5-55a0b3355322.jpg b/static/img/uuid-f655a8a5-c151-d103-6de5-55a0b3355322.jpg new file mode 100644 index 0000000..1b6ed96 Binary files /dev/null and b/static/img/uuid-f655a8a5-c151-d103-6de5-55a0b3355322.jpg differ diff --git a/static/img/uuid-f87af39b-bb44-1167-0051-389e3b38c612.png b/static/img/uuid-f87af39b-bb44-1167-0051-389e3b38c612.png new file mode 100644 index 0000000..9ee9fc3 Binary files /dev/null and b/static/img/uuid-f87af39b-bb44-1167-0051-389e3b38c612.png differ diff --git a/static/img/uuid-f8d70389-5398-fa2c-3a98-db70ffa63853.png b/static/img/uuid-f8d70389-5398-fa2c-3a98-db70ffa63853.png new file mode 100644 index 0000000..4d5540a Binary files /dev/null and b/static/img/uuid-f8d70389-5398-fa2c-3a98-db70ffa63853.png differ diff --git a/static/img/uuid-f90189a9-c8f8-0720-69f3-b02983eb74f3.jpg b/static/img/uuid-f90189a9-c8f8-0720-69f3-b02983eb74f3.jpg new file mode 100644 index 0000000..a841827 Binary files /dev/null and b/static/img/uuid-f90189a9-c8f8-0720-69f3-b02983eb74f3.jpg differ diff --git a/static/img/uuid-f91e8132-cff5-b5c3-142e-2184b4883382.png b/static/img/uuid-f91e8132-cff5-b5c3-142e-2184b4883382.png new file mode 100644 index 0000000..c9bf427 Binary files /dev/null and b/static/img/uuid-f91e8132-cff5-b5c3-142e-2184b4883382.png differ diff --git a/static/img/uuid-f98768da-d01e-4c46-d399-7e1d614a023e.png b/static/img/uuid-f98768da-d01e-4c46-d399-7e1d614a023e.png new file mode 100644 index 0000000..07149c9 Binary files /dev/null and b/static/img/uuid-f98768da-d01e-4c46-d399-7e1d614a023e.png differ diff --git a/static/img/uuid-f995aafc-a3ef-b1d1-5d31-751c5507e60a.png b/static/img/uuid-f995aafc-a3ef-b1d1-5d31-751c5507e60a.png new file mode 100644 index 0000000..f451f20 Binary files /dev/null and b/static/img/uuid-f995aafc-a3ef-b1d1-5d31-751c5507e60a.png differ diff --git a/static/img/uuid-f9d557bf-8cd0-2856-4555-61352d73ca56.png b/static/img/uuid-f9d557bf-8cd0-2856-4555-61352d73ca56.png new file mode 100644 index 0000000..9ca66e9 Binary files /dev/null and b/static/img/uuid-f9d557bf-8cd0-2856-4555-61352d73ca56.png differ diff --git a/static/img/uuid-f9f9d575-5b1f-73c1-53ae-94ae13e0da3f.png b/static/img/uuid-f9f9d575-5b1f-73c1-53ae-94ae13e0da3f.png new file mode 100644 index 0000000..1787010 Binary files /dev/null and b/static/img/uuid-f9f9d575-5b1f-73c1-53ae-94ae13e0da3f.png differ diff --git a/static/img/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png b/static/img/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png new file mode 100644 index 0000000..d81dd4c Binary files /dev/null and b/static/img/uuid-fa95efd5-ff6f-a7a3-2dc3-7ccc5878cd47.png differ diff --git a/static/img/uuid-faa7bf60-0cae-0042-f910-e8e6240fc647.png b/static/img/uuid-faa7bf60-0cae-0042-f910-e8e6240fc647.png new file mode 100644 index 0000000..8b621c4 Binary files /dev/null and b/static/img/uuid-faa7bf60-0cae-0042-f910-e8e6240fc647.png differ diff --git a/static/img/uuid-fad00841-d167-7313-ac2b-413697d749d6.png b/static/img/uuid-fad00841-d167-7313-ac2b-413697d749d6.png new file mode 100644 index 0000000..cb4213b Binary files /dev/null and b/static/img/uuid-fad00841-d167-7313-ac2b-413697d749d6.png differ diff --git a/static/img/uuid-fafa8157-e6f0-6495-1da6-7112515830d8.png b/static/img/uuid-fafa8157-e6f0-6495-1da6-7112515830d8.png new file mode 100644 index 0000000..f7e4073 Binary files /dev/null and b/static/img/uuid-fafa8157-e6f0-6495-1da6-7112515830d8.png differ diff --git a/static/img/uuid-fb66f7d5-2c56-4480-4a54-4d79a29c6c67.png b/static/img/uuid-fb66f7d5-2c56-4480-4a54-4d79a29c6c67.png new file mode 100644 index 0000000..ea9ee16 Binary files /dev/null and b/static/img/uuid-fb66f7d5-2c56-4480-4a54-4d79a29c6c67.png differ diff --git a/static/img/uuid-fb6f7300-1ac4-523d-0a04-b6c2850e5621.png b/static/img/uuid-fb6f7300-1ac4-523d-0a04-b6c2850e5621.png new file mode 100644 index 0000000..fb2b3d2 Binary files /dev/null and b/static/img/uuid-fb6f7300-1ac4-523d-0a04-b6c2850e5621.png differ diff --git a/static/img/uuid-fb7fb260-5679-1832-9448-228a048e2b80.png b/static/img/uuid-fb7fb260-5679-1832-9448-228a048e2b80.png new file mode 100644 index 0000000..aed71c9 Binary files /dev/null and b/static/img/uuid-fb7fb260-5679-1832-9448-228a048e2b80.png differ diff --git a/static/img/uuid-fb91dae2-cdfe-d531-2559-c02a58915ce3.png b/static/img/uuid-fb91dae2-cdfe-d531-2559-c02a58915ce3.png new file mode 100644 index 0000000..4783ddf Binary files /dev/null and b/static/img/uuid-fb91dae2-cdfe-d531-2559-c02a58915ce3.png differ diff --git a/static/img/uuid-fbaea845-8f7c-7470-248b-b10caf86a078.png b/static/img/uuid-fbaea845-8f7c-7470-248b-b10caf86a078.png new file mode 100644 index 0000000..ea7e3fa Binary files /dev/null and b/static/img/uuid-fbaea845-8f7c-7470-248b-b10caf86a078.png differ diff --git a/static/img/uuid-fc4a47cb-98f9-e217-042d-73780f712eb2.png b/static/img/uuid-fc4a47cb-98f9-e217-042d-73780f712eb2.png new file mode 100644 index 0000000..4ecd692 Binary files /dev/null and b/static/img/uuid-fc4a47cb-98f9-e217-042d-73780f712eb2.png differ diff --git a/static/img/uuid-fc53715a-add5-8c4c-d4a6-9a04f5da6d3b.png b/static/img/uuid-fc53715a-add5-8c4c-d4a6-9a04f5da6d3b.png new file mode 100644 index 0000000..406aea3 Binary files /dev/null and b/static/img/uuid-fc53715a-add5-8c4c-d4a6-9a04f5da6d3b.png differ diff --git a/static/img/uuid-fc575279-c87c-1046-a747-4ea6a59fae5f.png b/static/img/uuid-fc575279-c87c-1046-a747-4ea6a59fae5f.png new file mode 100644 index 0000000..fae17c0 Binary files /dev/null and b/static/img/uuid-fc575279-c87c-1046-a747-4ea6a59fae5f.png differ diff --git a/static/img/uuid-fcb0bba9-a8a5-e874-c5ba-a5e0f08d8a80.png b/static/img/uuid-fcb0bba9-a8a5-e874-c5ba-a5e0f08d8a80.png new file mode 100644 index 0000000..8efe3bc Binary files /dev/null and b/static/img/uuid-fcb0bba9-a8a5-e874-c5ba-a5e0f08d8a80.png differ diff --git a/static/img/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png b/static/img/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png new file mode 100644 index 0000000..1583802 Binary files /dev/null and b/static/img/uuid-fced107c-9b69-e5af-1472-4d96fbada364.png differ diff --git a/static/img/uuid-fd13332e-571f-e706-88ed-a20a29db7aea.png b/static/img/uuid-fd13332e-571f-e706-88ed-a20a29db7aea.png new file mode 100644 index 0000000..68d7589 Binary files /dev/null and b/static/img/uuid-fd13332e-571f-e706-88ed-a20a29db7aea.png differ diff --git a/static/img/uuid-fd3ff35c-c57e-151a-20ad-8170daf832dd.png b/static/img/uuid-fd3ff35c-c57e-151a-20ad-8170daf832dd.png new file mode 100644 index 0000000..bfa8335 Binary files /dev/null and b/static/img/uuid-fd3ff35c-c57e-151a-20ad-8170daf832dd.png differ diff --git a/static/img/uuid-fd63cf77-e2f7-bfce-3000-4a80b87f158f.png b/static/img/uuid-fd63cf77-e2f7-bfce-3000-4a80b87f158f.png new file mode 100644 index 0000000..5e648bb Binary files /dev/null and b/static/img/uuid-fd63cf77-e2f7-bfce-3000-4a80b87f158f.png differ diff --git a/static/img/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png b/static/img/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png new file mode 100644 index 0000000..d45083b Binary files /dev/null and b/static/img/uuid-fd64fe74-fbea-b6f4-8445-406398a41ead.png differ diff --git a/static/img/uuid-fd697193-d536-bade-12f6-341e9ecb2df9.jpg b/static/img/uuid-fd697193-d536-bade-12f6-341e9ecb2df9.jpg new file mode 100644 index 0000000..94578a2 Binary files /dev/null and b/static/img/uuid-fd697193-d536-bade-12f6-341e9ecb2df9.jpg differ diff --git a/static/img/uuid-fd923003-5828-07e5-376b-b1d9e05c9652.png b/static/img/uuid-fd923003-5828-07e5-376b-b1d9e05c9652.png new file mode 100644 index 0000000..8a90c66 Binary files /dev/null and b/static/img/uuid-fd923003-5828-07e5-376b-b1d9e05c9652.png differ diff --git a/static/img/uuid-fda915ec-d2ed-00a0-707c-b8a120221095.png b/static/img/uuid-fda915ec-d2ed-00a0-707c-b8a120221095.png new file mode 100644 index 0000000..5cf2df0 Binary files /dev/null and b/static/img/uuid-fda915ec-d2ed-00a0-707c-b8a120221095.png differ diff --git a/static/img/uuid-fe3755f8-efba-2923-17e8-fa4ffd1ef16e.svg b/static/img/uuid-fe3755f8-efba-2923-17e8-fa4ffd1ef16e.svg new file mode 100644 index 0000000..562cb50 --- /dev/null +++ b/static/img/uuid-fe3755f8-efba-2923-17e8-fa4ffd1ef16e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/uuid-ff754b01-bc60-0109-5a45-4c21b65d9855.png b/static/img/uuid-ff754b01-bc60-0109-5a45-4c21b65d9855.png new file mode 100644 index 0000000..7af5dc8 Binary files /dev/null and b/static/img/uuid-ff754b01-bc60-0109-5a45-4c21b65d9855.png differ diff --git a/static/img/uuid-ff9689fa-fa0b-d8d1-afef-4649ccfcccc8.png b/static/img/uuid-ff9689fa-fa0b-d8d1-afef-4649ccfcccc8.png new file mode 100644 index 0000000..7d047c7 Binary files /dev/null and b/static/img/uuid-ff9689fa-fa0b-d8d1-afef-4649ccfcccc8.png differ diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 0000000..144adf9 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.bitrise.io/sitemap.xml \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d250afa --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + } +}