Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'doc/ci/components/index.md')
-rw-r--r--doc/ci/components/index.md499
1 files changed, 259 insertions, 240 deletions
diff --git a/doc/ci/components/index.md b/doc/ci/components/index.md
index 3d46ec5bbd5..e7c286a507b 100644
--- a/doc/ci/components/index.md
+++ b/doc/ci/components/index.md
@@ -1,7 +1,7 @@
---
stage: Verify
group: Pipeline Authoring
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
# CI/CD components **(FREE ALL BETA)**
@@ -11,31 +11,36 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Feature flag `ci_namespace_catalog_experimental` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/394772) in GitLab 16.3.
> - [Moved](https://gitlab.com/gitlab-com/www-gitlab-com/-/merge_requests/130824) to [Beta status](../../policy/experiment-beta-support.md) in GitLab 16.6.
-A CI/CD component is a reusable single pipeline configuration unit. Use them to compose an entire pipeline configuration or a small part of a larger pipeline.
+A CI/CD component is a reusable single pipeline configuration unit. Use components
+to create a small part of a larger pipeline, or even to compose a complete pipeline configuration.
-A component can optionally take [input parameters](../yaml/inputs.md).
+A component can be configured with [input parameters](../yaml/inputs.md) for more
+dynamic behavior.
-CI/CD components are similar to the other kinds of [configuration added with the `include` keyword](../yaml/includes.md), but have several advantages:
+CI/CD components are similar to the other kinds of [configuration added with the `include` keyword](../yaml/includes.md),
+but have several advantages:
+- Components can be listed in the [CI/CD Catalog](#cicd-catalog).
- Components can be released and used with a specific version.
-- Multiple components can be combined in the same project and released with a single tag.
-- Components are discoverable in the [CI/CD Catalog](catalog.md).
+- Multiple components can be defined in the same project and versioned together.
-## Components repository
+Instead of creating your own components, you can also search for published components
+that have the functionality you need in the [CI/CD Catalog](#cicd-catalog).
-A components repository is a GitLab project with a repository that hosts one or more pipeline components. All components in the project are versioned and released together.
+## Component project
-If a component requires different versioning from other components, the component should be migrated to its own components repository.
+A component project is a GitLab project with a repository that hosts one or more components.
+All components in the project are versioned together, with a maximum of 10 components per project.
-One component repository can have a maximum of 10 components.
+If a component requires different versioning from other components, the component should be moved
+to a dedicated component project.
-## Create a components repository
+### Create a component project
-To create a components repository, you must:
+To create a component project, you must:
1. [Create a new project](../../user/project/index.md#create-a-blank-project) with a `README.md` file.
1. Add a YAML configuration file for each component, following the [required directory structure](#directory-structure).
-
For example:
```yaml
@@ -49,210 +54,256 @@ To create a components repository, you must:
stage: $[[ inputs.stage ]]
```
+You can [use the component](#use-a-component) immediately, but you might want to consider
+publishing the component to the [CI/CD catalog](#cicd-catalog).
+
### Directory structure
-A components repository can host one or more components, and must follow a mandatory file structure.
+The repository must contain:
-Component configurations can be saved through the following directory structure, containing:
+- A `README.md` Markdown file documenting the details of all the components in the repository.
+- A top level `templates/` directory that contains all the component configurations.
+ You can define components in this directory:
+ - In single files ending in `.yml` for each component, like `templates/secret-detection.yml`.
+ - In sub-directories containing `template.yml` files as entry points, for components
+ that bundle together multiple related files. For example, `templates/secret-detection/template.yml`.
-- A `templates` directory at the top level of your components repository. All component configuration files
- should be saved under this directory.
-- Files ending in `.yml` containing the component configurations, one file per component.
-- A Markdown `README.md` file explaining the details of all the components in the repository.
+You should also:
-For example, if the project contains a single component and a pipeline to test the component,
-the file structure should be similar to:
+- Configure the project's `.gitlab-ci.yml` to [test the components](#test-the-component)
+ and [release new versions](#publish-a-new-release).
+- Add a `LICENSE.md` file with a license of your choice that covers the usage of your component.
+ For example the [MIT](https://opensource.org/license/mit/) or [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0#apply)
+ open source licenses.
-```plaintext
-├── templates/
-│ └── secret-detection.yml
-├── README.md
-└── .gitlab-ci.yml
-```
+For example:
-This example component could be referenced with a path similar to `gitlab.com/my-namespace/my-project/secret-detection@<version>`,
-if the project is:
+- If the project contains a single component, the directory structure should be similar to:
-- On GitLab.com
-- Named `my-project`
-- In a personal namespace or group named `my-namespace`
+ ```plaintext
+ ├── templates/
+ │ └── my-component.yml
+ ├── LICENSE.md
+ ├── README.md
+ └── .gitlab-ci.yml
+ ```
-The templates directory and the suffix of the configuration file should be excluded from the referenced path.
+- If the project contains multiple components, then the directory structure should be similar to:
-If the project contains multiple components, then the file structure should be similar to:
+ ```plaintext
+ ├── templates/
+ │ ├── my-simple-component.yml
+ │ └── my-complex-component/
+ │ ├── template.yml
+ │ ├── Dockerfile
+ │ └── test.sh
+ ├── LICENSE.md
+ ├── README.md
+ └── .gitlab-ci.yml
+ ```
-```plaintext
-├── README.md
-├── .gitlab-ci.yml
-└── templates/
- ├── all-scans.yml
- └── secret-detection.yml
+ In this example:
+
+ - The `my-simple-component` component's configuration is defined in a single file.
+ - The `my-complex-component` component's configuration contains multiple files in a directory.
+
+## Use a component
+
+To add a component to a project's CI/CD configuration, use the [`include: component`](../yaml/index.md#includecomponent)
+keyword. The component reference is formatted as `<fully-qualified-domain-name>/<project-path>/<component-name>@<specific-version>`,
+for example:
+
+```yaml
+include:
+ - component: gitlab.example.com/my-org/security-components/secret-detection@1.0
+ inputs:
+ stage: build
```
-These components would be referenced with these paths:
+In this example:
-- `gitlab.com/my-namespace/my-project/all-scans@<version>`
-- `gitlab.com/my-namespace/my-project/secret-detection@<version>`
+- `gitlab.example.com` is the Fully Qualified Domain Name (FQDN) matching the GitLab host.
+ You can only reference components in the same GitLab instance as your project.
+- `my-org/security-components` is the full path of the project containing the component.
+- `secret-detection` is the component name that is defined as either a single file `templates/secret-detection.yml`
+ or as a directory `templates/secret-detection/` containing a `template.yml`.
+- `1.0` is the [version](#component-versions) of the component.
-You can also have components defined as a directory if you want to bundle together multiple related files.
-In this case GitLab expects a `template.yml` file to be present:
+When GitLab creates a new pipeline, the component's configuration is fetched and added to
+the pipeline's configuration.
-For example:
+### Component versions
-```plaintext
-├── README.md
-├── .gitlab-ci.yml
-└── templates/
- └── dast
- ├── docs.md
- ├── Dockerfile
- └── template.yml
-```
+In order of highest priority first, the component version can be:
-In this example, the component could be referenced with `gitlab.com/my-namespace/my-project/dast@<version>`.
+- A commit SHA, for example `e3262fdd0914fa823210cdb79a8c421e2cef79d8`.
+- A tag, for example: `1.0`. If a tag and commit SHA exist with the same name,
+ the commit SHA takes precedence over the tag.
+- A branch name, for example `main`. If a branch and tag exist with the same name,
+ the tag takes precedence over the branch.
+- `~latest`, which is a special version that always points to the most recent
+ [release published in the CI/CD Catalog](#publish-a-new-release).
-#### Component configurations saved in any directory (deprecated)
+NOTE:
+The `~latest` version keyword always returns the most recent published release, not the release with
+the latest semantic version. For example, if you first release `2.0.0`, and later release
+a patch fix like `1.5.1`, then `~latest` returns the `1.5.1` release.
+[Issue #427286](https://gitlab.com/gitlab-org/gitlab/-/issues/427286) proposes to
+change this behavior.
-WARNING:
-Saving component configurations through this directory structure is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/415855) and should be avoided.
+## CI/CD Catalog **(FREE ALL BETA)**
-Components configurations can be saved through the following directory structure, containing:
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/407249) in GitLab 16.1 as an [experiment](../../policy/experiment-beta-support.md#experiment).
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/432045) to [beta](../../policy/experiment-beta-support.md#beta) in GitLab 16.7.
-- `template.yml`: The component configuration, one file per component. If there is
- only one component, this file can be in the root of the project. If there are multiple
- components, each file must be in a separate subdirectory.
-- `README.md`: A documentation file explaining the details of all the components in the repository.
+The CI/CD Catalog is a list of projects with published CI/CD components you can use
+to extend your CI/CD workflow.
-For example, if the project is on GitLab.com, named `my-project`, and in a personal
-namespace named `my-namespace`:
+Anyone can [create a component project](#create-a-component-project) and add it to
+the CI/CD Catalog, or contribute to an existing project to improve the available components.
-- Containing a single component and a simple pipeline to test the component, then
- the file structure might be:
+### View the CI/CD Catalog
- ```plaintext
- ├── template.yml
- ├── README.md
- └── .gitlab-ci.yml
- ```
+To access the CI/CD Catalog and view the published components that are available to you:
- The `.gitlab-ci.yml` file is not required for a CI/CD component to work, but
- [testing the component](#test-the-component) in a pipeline in the project is recommended.
+1. On the left sidebar, select **Search or go to**.
+1. Select **Explore**.
+1. Select **CI/CD Catalog**.
- This component is referenced with the path `gitlab.com/my-namespace/my-project@<version>`.
+Alternatively, if you are already in the [pipeline editor](../pipeline_editor/index.md)
+in your project, you can select **Browse CI/CD Catalog**.
-- Containing one default component and multiple sub-components, then the file structure
- might be:
+NOTE:
+Only public and internal projects are discoverable in the CI/CD Catalog.
- ```plaintext
- ├── template.yml
- ├── README.md
- ├── .gitlab-ci.yml
- ├── unit/
- │ └── template.yml
- └── integration/
- └── template.yml
- ```
+### Publish a component project
- These components are identified by these paths:
+To publish a component project in the CI/CD catalog, you must:
- - `gitlab.com/my-namespace/my-project`
- - `gitlab.com/my-namespace/my-project/unit`
- - `gitlab.com/my-namespace/my-project/integration`
+1. Set the project as a catalog resource.
+1. Publish a new release.
-It is possible to have a components repository with no default component, by having
-no `template.yml` in the root directory.
+#### Set a component project as a catalog resource
-**Additional notes:**
+To make published versions of a component project visible in the CI/CD catalog,
+you must set the project as a catalog resource.
-Nesting of components is not possible. For example:
+Prerequisites:
-```plaintext
-├── unit/
-│ └── template.yml
-│ └── another_folder/
-│ └── nested_template.yml
-```
+- You must have the Owner role in the project.
-## Release a component
+To set the project as a catalog resource:
-To create a release for a CI/CD component, use the [`release`](../yaml/index.md#release)
-keyword in a CI/CD pipeline.
+1. On the left sidebar, select **Search or go to** and find your project.
+1. Select **Settings > General**.
+1. Expand **Visibility, project features, permissions**.
+1. Turn on the **CI/CD Catalog resource** toggle.
-For example:
+The project only becomes findable in the catalog after you publish a new release.
-```yaml
-create-release:
- stage: deploy
- image: registry.gitlab.com/gitlab-org/release-cli:latest
- rules:
- - if: $CI_COMMIT_TAG =~ /^v\d+/
- script: echo "Creating release $CI_COMMIT_TAG"
- release:
- tag_name: $CI_COMMIT_TAG
- description: "Release $CI_COMMIT_TAG of components repository $CI_PROJECT_PATH"
-```
+#### Publish a new release
-In this example, the job runs only for tags formatted as `v` + version number.
-If all previous jobs succeed, the release is created.
+CI/CD components can be [used](#use-a-component) without being listed in the CI/CD catalog.
+However, publishing a component's releases in the catalog makes it discoverable to other users.
-Like in the [component testing example](#test-the-component), you can set a component to automatically
-be released after all tests pass in pipelines for new tags.
+Prerequisites:
-All released versions of the components repositories are displayed in the [CI/CD Catalog](catalog.md),
-providing users with information about official releases.
+- The project must:
+ - Be set as a [catalog resource](#set-a-component-project-as-a-catalog-resource).
+ - Have a [project description](../../user/project/working_with_projects.md#edit-project-name-and-description) defined.
+ - Have a `README.md` file in the root directory for the commit SHA of the tag being released.
+ - Have at least one [CI/CD component in the `templates/` directory](#directory-structure)
+ for the commit SHA of the tag being released.
-Components [can be used](#use-a-component-in-a-cicd-configuration) without being released,
-by using the commit SHA or ref. However, the `~latest` version keyword can only be used with released tags.
+To publish a new version of the component to the catalog:
-NOTE:
-The `~latest` keyword always returns the most recent release, not the release with
-the latest semantic version. For example, if you first release `v2.0.0`, and later release
-a patch fix like `v1.5.1`, then `~latest` returns the `v1.5.1` release.
-[Issue #427286](https://gitlab.com/gitlab-org/gitlab/-/issues/427286) proposes to
-change this behavior.
+1. Add a job to the project's `.gitlab-ci.yml` file that uses the [`release`](../yaml/index.md#release)
+ keyword to create the new release. For example:
+
+ ```yaml
+ create-release:
+ stage: deploy
+ image: registry.gitlab.com/gitlab-org/release-cli:latest
+ script: echo "Creating release $CI_COMMIT_TAG"
+ rules:
+ - if: $CI_COMMIT_TAG
+ release:
+ tag_name: $CI_COMMIT_TAG
+ description: "Release $CI_COMMIT_TAG of components in $CI_PROJECT_PATH"
+ ```
+
+1. Create a [new tag](../../user/project/repository/tags/index.md#create-a-tag) for the release,
+ which should trigger a tag pipeline that contains the job responsible for creating the release.
+ You should configure the tag pipeline to [test the components](#test-the-component) before
+ running the release job.
-## Use a component in a CI/CD configuration
+After the release job completes successfully, the release is created and the new version
+is published to the CI/CD catalog.
+
+### Unpublish a component project
+
+To remove a component project from the catalog, turn off the [**CI/CD Catalog resource**](#set-a-component-project-as-a-catalog-resource)
+toggle in the project settings.
+
+WARNING:
+This action destroys the metadata about the component project and its versions published
+in the catalog. The project and its repository still exist, but are not visible in the catalog.
+
+To publish the component project in the catalog again, you need to [publish a new release](#publish-a-new-release).
+
+## Best practices
+
+This section describes some best practices for creating high quality component projects.
+
+### Test the component
+
+Testing CI/CD components as part of the development workflow is strongly recommended
+and helps ensure consistent behavior.
+
+Test changes in a CI/CD pipeline (like any other project) by creating a `.gitlab-ci.yml`
+in the root directory. Make sure to test both the behavior and potential side-effects
+of the component. You can use the [GitLab API](../../api/rest/index.md) if needed.
-You can add a component to a CI/CD configuration with the `include: component` keyword.
For example:
```yaml
include:
- - component: gitlab.example.com/my-namespace/my-project@1.0
+ # include the component located in the current project from the current SHA
+ - component: gitlab.com/$CI_PROJECT_PATH/my-component@$CI_COMMIT_SHA
inputs:
stage: build
-```
-The component is identified by a unique address in the form `<fully-qualified-domain-name>/<component-path>@<specific-version>`,
-where:
-
-- `<fully-qualified-domain-name>` matches the GitLab host. You can only reference components
- in the same GitLab instance as your project.
-- `<component-path>` is the component project's full path and directory where the
- component YAML file is located.
-- `<specific-version>` is the version of the component. In order of highest priority first,
- the version can be:
- - A branch name, for example `main`.
- - A commit SHA, for example `e3262fdd0914fa823210cdb79a8c421e2cef79d8`.
- - A tag, for example: `1.0`. If a tag and branch exist with the same name, the tag
- takes precedence over the branch. If a tag and commit SHA exist with the same name,
- the commit SHA takes precedence over the tag.
- - `~latest`, which is a special version that always points to the most recent released tag.
- Available only if the component has been [released](#release-a-component).
-
-For example, for a component repository located at `gitlab-org/dast` on `gitlab.com`,
-the path:
-
-- `gitlab.com/gitlab-org/dast@main` targets the `template.yml` in the root directory
- on the `main` branch.
-- `gitlab.com/gitlab-org/dast@e3262fdd0914fa823210cdb79a8c421e2cef79d8` targets the same file
- for the specified commit SHA.
-- `gitlab.com/gitlab-org/dast@1.0` targets the same file for the `1.0` tag.
-- `gitlab.com/gitlab-org/dast@~latest` targets the same file for the latest release.
-- `gitlab.com/gitlab-org/dast/api-scan@main` targets a different file, the `template.yml`
- in the `/api-scan` directory in the component repository, for the `main` branch.
+stages: [build, test, release]
+
+# Check if `component-job` is added.
+# This example job could also test that the included component works as expected.
+# You can inspect data generated by the component, use GitLab API endpoints, or third-party tools.
+ensure-job-added:
+ stage: test
+ image: badouralix/curl-jq
+ script:
+ - |
+ route="https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs"
+ count=`curl --silent --header "PRIVATE-TOKEN: $API_TOKEN" $route | jq 'map(select(.name | contains("component-job"))) | length'`
+ if [ "$count" != "1" ]; then
+ exit 1
+ fi
-## Best practices
+# If the pipeline is for a new tag with a semantic version, and all previous jobs succeed,
+# create the release.
+create-release:
+ stage: release
+ image: registry.gitlab.com/gitlab-org/release-cli:latest
+ rules:
+ - if: $CI_COMMIT_TAG =~ /\d+/
+ script: echo "Creating release $CI_COMMIT_TAG"
+ release:
+ tag_name: $CI_COMMIT_TAG
+ description: "Release $CI_COMMIT_TAG of components repository $CI_PROJECT_PATH"
+```
+
+After committing and pushing changes, the pipeline tests the component, then creates
+a release if the earlier jobs pass.
### Avoid using global keywords
@@ -260,13 +311,15 @@ Avoid using [global keywords](../yaml/index.md#global-keywords) in a component.
Using these keywords in a component affects all jobs in a pipeline, including jobs
directly defined in the main `.gitlab-ci.yml` or in other included components.
-As an alternative to global keywords, instead:
+As an alternative to global keywords:
- Add the configuration directly to each job, even if it creates some duplication
in the component configuration.
-- Use the [`extends`](../yaml/index.md#extends) keyword in the component.
+- Use the [`extends`](../yaml/index.md#extends) keyword in the component, but use
+ unique names that reduce the risk of naming conflicts when the component is merged
+ into the configuration.
-For example, using the `default` keyword is not recommended:
+For example, avoid using the `default` global keyword:
```yaml
# Not recommended
@@ -282,7 +335,7 @@ rspec-2:
Instead, you can:
-- Add the configuration to each job:
+- Add the configuration to each job explicitly:
```yaml
rspec-1:
@@ -311,21 +364,21 @@ Instead, you can:
script: bundle exec rspec dir2/
```
-### Replace hard-coded values with inputs
+### Replace hardcoded values with inputs
-Avoid hard-coding values in CI/CD components. Hard-coded values might force
+Avoid using hardcoded values in CI/CD components. Hardcoded values might force
component users to need to review the component's internal details and adapt their pipeline
to work with the component.
A common keyword with problematic hard-coded values is `stage`. If a component job's
-stage is set to a specific value, the pipeline using the component **must** define
-the exact same stage. Additionally, if the component user wants to use a different stage,
-they must [override](../yaml/includes.md#override-included-configuration-values) the configuration.
+stage is hardcoded, all pipelines using the component **must** either define
+the exact same stage, or [override](../yaml/includes.md#override-included-configuration-values)
+the configuration.
-The preferred method is to use the [`input` keyword](../yaml/inputs.md).
-The component user can specify the exact value they need.
+The preferred method is to use the [`input` keyword](../yaml/inputs.md) for dynamic
+component configuration. The component user can specify the exact value they need.
-For example:
+For example, to create a component with `stage` configuration that can be defined by users:
- In the component configuration:
@@ -344,28 +397,28 @@ For example:
script: echo integration tests
```
-- In the project using the component:
+- In a project using the component:
```yaml
+ stages: [verify, deploy]
+
include:
- component: gitlab.com/gitlab-org/ruby-test@1.0
inputs:
stage: verify
-
- stages: [verify, deploy]
```
### Replace custom CI/CD variables with inputs
When using CI/CD variables in a component, evaluate if the `inputs` keyword
-should be used instead. Avoid requiring a user to define custom variables to change a component's
-behavior. You should try to use `inputs` for any component customization.
+should be used instead. Avoid asking users to define custom variables to configure
+components when `inputs` is a better solution.
-Inputs are explicitly defined in the component's specs, and are better validated than variables.
+Inputs are explicitly defined in the component's specs, and have better validation than variables.
For example, if a required input is not passed to the component, GitLab returns a pipeline error.
By contrast, if a variable is not defined, its value is empty, and there is no error.
-For example, use `inputs` instead of variables to let users change a scanner's output format:
+For example, use `inputs` instead of variables to configure a scanner's output format:
- In the component configuration:
@@ -388,17 +441,17 @@ For example, use `inputs` instead of variables to let users change a scanner's o
scanner-output: yaml
```
-In other cases, CI/CD variables are still preferred, including:
+In other cases, CI/CD variables might still be preferred. For example:
-- Using [predefined variables](../variables/predefined_variables.md) to automatically configure
+- Use [predefined variables](../variables/predefined_variables.md) to automatically configure
a component to match a user's project.
-- Requiring tokens or other sensitive values to be stored as [masked or protected variables in project settings](../variables/index.md#define-a-cicd-variable-in-the-ui).
+- Ask users to store sensitive values as [masked or protected CI/CD variables in project settings](../variables/index.md#define-a-cicd-variable-in-the-ui).
### Use semantic versioning
-When tagging and releasing new versions of components, you should use [semantic versioning](https://semver.org).
-Semantic versioning is the standard for communicating that a change is a major, minor, patch,
-or other kind of change.
+When tagging and [releasing new versions](#publish-a-new-release) of components,
+you should use [semantic versioning](https://semver.org). Semantic versioning is the standard
+for communicating that a change is a major, minor, patch, or other kind of change.
You should use at least the `major.minor` format, as this is widely understood. For example,
`2.0` or `2.1`.
@@ -410,66 +463,32 @@ Other examples of semantic versioning:
- `1.0.0-alpha`
- `3.0.0-rc1`
-### Test the component
-
-Testing CI/CD components as part of the development workflow is strongly recommended
-and helps ensure consistent behavior.
-
-Test changes in a CI/CD pipeline (like any other project) by creating a `.gitlab-ci.yml`
-in the root directory.
-
-For example:
-
-```yaml
-include:
- # include the component located in the current project from the current SHA
- - component: gitlab.com/$CI_PROJECT_PATH/my-project@$CI_COMMIT_SHA
- inputs:
- stage: build
-
-stages: [build, test, release]
-
-# Expect `component-job` is added.
-# This example tests that the included component works as expected.
-# You can inspect data generated by the component, use GitLab API endpoints or third-party tools.
-ensure-job-added:
- stage: test
- image: badouralix/curl-jq
- script:
- - |
- route="https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs"
- count=`curl --silent --header "PRIVATE-TOKEN: $API_TOKEN" $route | jq 'map(select(.name | contains("component-job"))) | length'`
- if [ "$count" != "1" ]; then
- exit 1
- fi
-
-# If we are tagging a release with a specific convention ("v" + number) and all
-# previous checks succeeded, we proceed with creating a release automatically.
-create-release:
- stage: release
- image: registry.gitlab.com/gitlab-org/release-cli:latest
- rules:
- - if: $CI_COMMIT_TAG =~ /^v\d+/
- script: echo "Creating release $CI_COMMIT_TAG"
- release:
- tag_name: $CI_COMMIT_TAG
- description: "Release $CI_COMMIT_TAG of components repository $CI_PROJECT_PATH"
-```
-
-After committing and pushing changes, the pipeline tests the component, then releases it if the test passes.
-
## Convert a CI/CD template to a component
Any existing CI/CD template that you use in projects by using the `include:` syntax
can be converted to a CI/CD component:
-1. Decide if you want the component to be part of an existing [components repository](index.md#components-repository)
- to be grouped with other components, or create and set up a new components repository.
-1. Create a YAML file in the components repository according to the expected [directory structure](index.md#directory-structure).
+1. Decide if you want the component to be grouped with other components as part of
+ an existing [component project](index.md#component-project), or [create a new component project](#create-a-component-project).
+1. Create a YAML file in the component project according to the [directory structure](index.md#directory-structure).
1. Copy the content of the original template YAML file into the new component YAML file.
1. Refactor the new component's configuration to:
- Follow the [best practices](index.md#best-practices) for components.
- Improve the configuration, for example by enabling [merge request pipelines](../pipelines/merge_request_pipelines.md)
or making it [more efficient](../pipelines/pipeline_efficiency.md).
1. Leverage the `.gitlab-ci.yml` in the components repository to [test changes to the component](index.md#test-the-component).
-1. Tag and [release the component](index.md#release-a-component).
+1. Tag and [release the component](#publish-a-new-release).
+
+## Troubleshooting
+
+### `content not found` message
+
+You might receive an error message similar to the following when using the `~latest`
+version qualifier to reference a component hosted by a [catalog resource](#set-a-component-project-as-a-catalog-resource):
+
+```plaintext
+This GitLab CI configuration is invalid: component 'gitlab.com/my-namespace/my-project/my-component@~latest' - content not found`
+```
+
+The `~latest` behavior [was updated](https://gitlab.com/gitlab-org/gitlab/-/issues/429707)
+in GitLab 16.7. It now refers to the latest published version of the catalog resource. To resolve this issue, [create a new release](#publish-a-new-release).