Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
d2f4295270
commit
03cd4f8da4
43 changed files with 851 additions and 444 deletions
1
Gemfile
1
Gemfile
|
@ -186,6 +186,7 @@ gem 'rack-timeout', '~> 0.5.1', require: 'rack/timeout/base'
|
||||||
group :puma do
|
group :puma do
|
||||||
gem 'puma', '~> 5.3.1', require: false
|
gem 'puma', '~> 5.3.1', require: false
|
||||||
gem 'puma_worker_killer', '~> 0.3.1', require: false
|
gem 'puma_worker_killer', '~> 0.3.1', require: false
|
||||||
|
gem 'sd_notify', '~> 0.1.0', require: false
|
||||||
end
|
end
|
||||||
|
|
||||||
# State machine
|
# State machine
|
||||||
|
|
|
@ -1153,6 +1153,7 @@ GEM
|
||||||
addressable (>= 2.3.5)
|
addressable (>= 2.3.5)
|
||||||
faraday (> 0.8, < 2.0)
|
faraday (> 0.8, < 2.0)
|
||||||
scientist (1.6.0)
|
scientist (1.6.0)
|
||||||
|
sd_notify (0.1.0)
|
||||||
securecompare (1.0.0)
|
securecompare (1.0.0)
|
||||||
seed-fu (2.3.7)
|
seed-fu (2.3.7)
|
||||||
activerecord (>= 3.1)
|
activerecord (>= 3.1)
|
||||||
|
@ -1605,6 +1606,7 @@ DEPENDENCIES
|
||||||
rugged (~> 1.1)
|
rugged (~> 1.1)
|
||||||
sanitize (~> 5.2.1)
|
sanitize (~> 5.2.1)
|
||||||
sassc-rails (~> 2.1.0)
|
sassc-rails (~> 2.1.0)
|
||||||
|
sd_notify (~> 0.1.0)
|
||||||
seed-fu (~> 2.3.7)
|
seed-fu (~> 2.3.7)
|
||||||
selenium-webdriver (~> 3.142)
|
selenium-webdriver (~> 3.142)
|
||||||
sentry-raven (~> 3.1)
|
sentry-raven (~> 3.1)
|
||||||
|
|
|
@ -20,7 +20,12 @@ export default () => {
|
||||||
} = domEl.dataset;
|
} = domEl.dataset;
|
||||||
|
|
||||||
const apolloProvider = new VueApollo({
|
const apolloProvider = new VueApollo({
|
||||||
defaultClient: createDefaultClient(),
|
defaultClient: createDefaultClient(
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
assumeImmutableResults: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
// eslint-disable-next-line no-new
|
// eslint-disable-next-line no-new
|
||||||
|
|
|
@ -557,6 +557,14 @@ export default {
|
||||||
v-if="shouldShowMergeControls"
|
v-if="shouldShowMergeControls"
|
||||||
class="gl-display-flex gl-align-items-center gl-flex-wrap"
|
class="gl-display-flex gl-align-items-center gl-flex-wrap"
|
||||||
>
|
>
|
||||||
|
<merge-train-helper-icon
|
||||||
|
v-if="shouldRenderMergeTrainHelperIcon"
|
||||||
|
:merge-train-when-pipeline-succeeds-docs-path="
|
||||||
|
mr.mergeTrainWhenPipelineSucceedsDocsPath
|
||||||
|
"
|
||||||
|
class="gl-mx-3"
|
||||||
|
/>
|
||||||
|
|
||||||
<gl-form-checkbox
|
<gl-form-checkbox
|
||||||
v-if="canRemoveSourceBranch"
|
v-if="canRemoveSourceBranch"
|
||||||
id="remove-source-branch-input"
|
id="remove-source-branch-input"
|
||||||
|
@ -575,13 +583,6 @@ export default {
|
||||||
:is-disabled="isSquashReadOnly"
|
:is-disabled="isSquashReadOnly"
|
||||||
class="gl-mx-3"
|
class="gl-mx-3"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<merge-train-helper-icon
|
|
||||||
v-if="shouldRenderMergeTrainHelperIcon"
|
|
||||||
:merge-train-when-pipeline-succeeds-docs-path="
|
|
||||||
mr.mergeTrainWhenPipelineSucceedsDocsPath
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="bold js-resolve-mr-widget-items-message gl-ml-3">
|
<div class="bold js-resolve-mr-widget-items-message gl-ml-3">
|
||||||
|
|
|
@ -146,13 +146,6 @@
|
||||||
* Blame file
|
* Blame file
|
||||||
*/
|
*/
|
||||||
&.blame {
|
&.blame {
|
||||||
//
|
|
||||||
// IMPORTANT PERFORMANCE OPTIMIZATION
|
|
||||||
//
|
|
||||||
// When viewinng a blame with many commits a lot of content is rendered on the page.
|
|
||||||
// The line below ensures that we only render what is visible to the user, thus reducing TBT in the browser.
|
|
||||||
content-visibility: auto;
|
|
||||||
|
|
||||||
table {
|
table {
|
||||||
border: 0;
|
border: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
@ -167,12 +160,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
td {
|
td {
|
||||||
//
|
|
||||||
// IMPORTANT PERFORMANCE OPTIMIZATION
|
|
||||||
//
|
|
||||||
// When viewinng a blame with many commits a lot of content is rendered on the page.
|
|
||||||
// The line below ensures that we only render what is visible to the user, thus reducing TBT in the browser.
|
|
||||||
content-visibility: auto;
|
|
||||||
border-top: 0;
|
border-top: 0;
|
||||||
border-bottom: 0;
|
border-bottom: 0;
|
||||||
|
|
||||||
|
@ -235,6 +222,21 @@
|
||||||
color: $gray-900;
|
color: $gray-900;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// IMPORTANT PERFORMANCE OPTIMIZATION
|
||||||
|
//
|
||||||
|
// When viewinng a blame with many commits a lot of content is rendered on the page.
|
||||||
|
// Two selectors below ensure that we only render what is visible to the user, thus reducing TBT in the browser.
|
||||||
|
.commit {
|
||||||
|
content-visibility: auto;
|
||||||
|
contain-intrinsic-size: 1px 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
code .line {
|
||||||
|
content-visibility: auto;
|
||||||
|
contain-intrinsic-size: 1px 1.1875rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.logs {
|
&.logs {
|
||||||
|
|
|
@ -15,7 +15,7 @@ module UpdateHighestRole
|
||||||
# Schedule a Sidekiq job to update the highest role for a User
|
# Schedule a Sidekiq job to update the highest role for a User
|
||||||
#
|
#
|
||||||
# The job will be called outside of a transaction in order to ensure the changes
|
# The job will be called outside of a transaction in order to ensure the changes
|
||||||
# to be commited before attempting to update the highest role.
|
# to be committed before attempting to update the highest role.
|
||||||
# The exlusive lease will not be released after completion to prevent multiple jobs
|
# The exlusive lease will not be released after completion to prevent multiple jobs
|
||||||
# being executed during the defined timeout.
|
# being executed during the defined timeout.
|
||||||
def update_highest_role
|
def update_highest_role
|
||||||
|
|
|
@ -155,6 +155,50 @@ Reply by email should now be working.
|
||||||
1. Find the `incoming_email` section in `config/gitlab.yml`, enable the feature
|
1. Find the `incoming_email` section in `config/gitlab.yml`, enable the feature
|
||||||
and fill in the details for your specific IMAP server and email account (see [examples](#configuration-examples) below).
|
and fill in the details for your specific IMAP server and email account (see [examples](#configuration-examples) below).
|
||||||
|
|
||||||
|
If you use systemd units to manage GitLab:
|
||||||
|
|
||||||
|
1. Add `gitlab-mailroom.service` as a dependency to `gitlab.target`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl edit gitlab.target
|
||||||
|
```
|
||||||
|
|
||||||
|
In the editor that opens, add the following and save the file:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
[Unit]
|
||||||
|
Wants=gitlab-mailroom.service
|
||||||
|
```
|
||||||
|
|
||||||
|
1. If you run Redis and PostgreSQL on the same machine, you should add a
|
||||||
|
dependency on Redis. Run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl edit gitlab-mailroom.service
|
||||||
|
```
|
||||||
|
|
||||||
|
In the editor that opens, add the following and save the file:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
[Unit]
|
||||||
|
Wants=redis-server.service
|
||||||
|
After=redis-server.service
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Start `gitlab-mailroom.service`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl start gitlab-mailroom.service
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Verify that everything is configured correctly:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo -u git -H bundle exec rake gitlab:incoming_email:check RAILS_ENV=production
|
||||||
|
```
|
||||||
|
|
||||||
|
If you use the SysV init script to manage GitLab:
|
||||||
|
|
||||||
1. Enable `mail_room` in the init script at `/etc/default/gitlab`:
|
1. Enable `mail_room` in the init script at `/etc/default/gitlab`:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
|
|
@ -132,11 +132,11 @@ The Pages daemon doesn't listen to the outside world.
|
||||||
https: false
|
https: false
|
||||||
artifacts_server: false
|
artifacts_server: false
|
||||||
external_http: ["127.0.0.1:8090"]
|
external_http: ["127.0.0.1:8090"]
|
||||||
secret_file: /home/git/gitlab/gitlab-pages/gitlab-pages-secret
|
secret_file: /home/git/gitlab/gitlab-pages-secret
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Add the following configuration file to
|
1. Add the following configuration file to
|
||||||
`/home/git/gitlab/gitlab-pages/gitlab-pages.conf`, and be sure to change
|
`/home/git/gitlab-pages/gitlab-pages.conf`, and be sure to change
|
||||||
`example.io` to the FQDN from which you want to serve GitLab Pages and
|
`example.io` to the FQDN from which you want to serve GitLab Pages and
|
||||||
`gitlab.example.com` to the URL of your GitLab instance:
|
`gitlab.example.com` to the URL of your GitLab instance:
|
||||||
|
|
||||||
|
@ -159,8 +159,23 @@ The Pages daemon doesn't listen to the outside world.
|
||||||
sudo -u git -H openssl rand -base64 32 > /home/git/gitlab/gitlab-pages-secret
|
sudo -u git -H openssl rand -base64 32 > /home/git/gitlab/gitlab-pages-secret
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Edit `/etc/default/gitlab` and set `gitlab_pages_enabled` to `true` in
|
1. To enable the pages daemon:
|
||||||
order to enable the pages daemon:
|
|
||||||
|
- If your system uses systemd as init, run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl edit gitlab.target
|
||||||
|
```
|
||||||
|
|
||||||
|
In the editor that opens, add the following and save the file:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
[Unit]
|
||||||
|
Wants=gitlab-pages.service
|
||||||
|
```
|
||||||
|
|
||||||
|
- If your system uses SysV init instead, edit `/etc/default/gitlab` and set
|
||||||
|
`gitlab_pages_enabled` to `true`:
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
gitlab_pages_enabled=true
|
gitlab_pages_enabled=true
|
||||||
|
|
|
@ -103,39 +103,15 @@ If you have followed the official installation guide to [install GitLab from
|
||||||
source](../install/installation.md), run the following command to restart GitLab:
|
source](../install/installation.md), run the following command to restart GitLab:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
# For systems running systemd
|
||||||
|
sudo systemctl restart gitlab.target
|
||||||
|
|
||||||
|
# For systems running SysV init
|
||||||
sudo service gitlab restart
|
sudo service gitlab restart
|
||||||
```
|
```
|
||||||
|
|
||||||
The output should be similar to this:
|
|
||||||
|
|
||||||
```plaintext
|
|
||||||
Shutting down GitLab Puma
|
|
||||||
Shutting down GitLab Sidekiq
|
|
||||||
Shutting down GitLab Workhorse
|
|
||||||
Shutting down GitLab MailRoom
|
|
||||||
...
|
|
||||||
GitLab is not running.
|
|
||||||
Starting GitLab Puma
|
|
||||||
Starting GitLab Sidekiq
|
|
||||||
Starting GitLab Workhorse
|
|
||||||
Starting GitLab MailRoom
|
|
||||||
...
|
|
||||||
The GitLab Puma web server with pid 28059 is running.
|
|
||||||
The GitLab Sidekiq job dispatcher with pid 28176 is running.
|
|
||||||
The GitLab Workhorse with pid 28122 is running.
|
|
||||||
The GitLab MailRoom email processor with pid 28114 is running.
|
|
||||||
GitLab and all its components are up and running.
|
|
||||||
```
|
|
||||||
|
|
||||||
This should restart Puma, Sidekiq, GitLab Workhorse, and [Mailroom](reply_by_email.md)
|
This should restart Puma, Sidekiq, GitLab Workhorse, and [Mailroom](reply_by_email.md)
|
||||||
(if enabled). The init service file that does all the magic can be found on
|
(if enabled).
|
||||||
your server in `/etc/init.d/gitlab`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
If you are using other init systems, like `systemd`, you can check the
|
|
||||||
[GitLab Recipes](https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/init) repository for some unofficial services. These are
|
|
||||||
**not** officially supported so use them at your own risk.
|
|
||||||
|
|
||||||
## Helm chart installations
|
## Helm chart installations
|
||||||
|
|
||||||
|
|
|
@ -185,7 +185,7 @@ POST /projects/:id/repository/files/:file_path
|
||||||
```shell
|
```shell
|
||||||
curl --request POST --header 'PRIVATE-TOKEN: <your_access_token>' \
|
curl --request POST --header 'PRIVATE-TOKEN: <your_access_token>' \
|
||||||
--header "Content-Type: application/json" \
|
--header "Content-Type: application/json" \
|
||||||
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname", \
|
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname",
|
||||||
"content": "some content", "commit_message": "create a new file"}' \
|
"content": "some content", "commit_message": "create a new file"}' \
|
||||||
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
|
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
|
||||||
```
|
```
|
||||||
|
@ -221,7 +221,7 @@ PUT /projects/:id/repository/files/:file_path
|
||||||
```shell
|
```shell
|
||||||
curl --request PUT --header 'PRIVATE-TOKEN: <your_access_token>' \
|
curl --request PUT --header 'PRIVATE-TOKEN: <your_access_token>' \
|
||||||
--header "Content-Type: application/json" \
|
--header "Content-Type: application/json" \
|
||||||
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname", \
|
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname",
|
||||||
"content": "some content", "commit_message": "update file"}' \
|
"content": "some content", "commit_message": "update file"}' \
|
||||||
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
|
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
|
||||||
```
|
```
|
||||||
|
@ -268,7 +268,7 @@ DELETE /projects/:id/repository/files/:file_path
|
||||||
```shell
|
```shell
|
||||||
curl --request DELETE --header 'PRIVATE-TOKEN: <your_access_token>' \
|
curl --request DELETE --header 'PRIVATE-TOKEN: <your_access_token>' \
|
||||||
--header "Content-Type: application/json" \
|
--header "Content-Type: application/json" \
|
||||||
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname", \
|
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname",
|
||||||
"commit_message": "delete file"}' \
|
"commit_message": "delete file"}' \
|
||||||
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
|
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
|
||||||
```
|
```
|
||||||
|
|
|
@ -81,7 +81,8 @@ microservice_a:
|
||||||
trigger:
|
trigger:
|
||||||
include:
|
include:
|
||||||
- project: 'my-group/my-pipeline-library'
|
- project: 'my-group/my-pipeline-library'
|
||||||
file: 'path/to/ci-config.yml'
|
ref: 'main'
|
||||||
|
file: '/path/to/child-pipeline.yml'
|
||||||
```
|
```
|
||||||
|
|
||||||
The maximum number of entries that are accepted for `trigger:include:` is three.
|
The maximum number of entries that are accepted for `trigger:include:` is three.
|
||||||
|
@ -98,7 +99,7 @@ microservice_a:
|
||||||
strategy: depend
|
strategy: depend
|
||||||
```
|
```
|
||||||
|
|
||||||
## Merge Request child pipelines
|
## Merge request child pipelines
|
||||||
|
|
||||||
To trigger a child pipeline as a [Merge Request Pipeline](merge_request_pipelines.md) we need to:
|
To trigger a child pipeline as a [Merge Request Pipeline](merge_request_pipelines.md) we need to:
|
||||||
|
|
||||||
|
@ -149,7 +150,7 @@ microservice_a:
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
|
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
|
||||||
|
|
||||||
Instead of running a child pipeline from a static YAML file, you can define a job that runs
|
Instead of running a child pipeline from a static YAML file, you can define a job that runs
|
||||||
your own script to generate a YAML file, which is then [used to trigger a child pipeline](../yaml/index.md#trigger-child-pipeline-with-generated-configuration-file).
|
your own script to generate a YAML file, which is then used to trigger a child pipeline.
|
||||||
|
|
||||||
This technique can be very powerful in generating pipelines targeting content that changed or to
|
This technique can be very powerful in generating pipelines targeting content that changed or to
|
||||||
build a matrix of targets and architectures.
|
build a matrix of targets and architectures.
|
||||||
|
@ -171,6 +172,31 @@ configuration for jobs, like scripts, that use the Windows runner would use `\`.
|
||||||
In GitLab 12.9, the child pipeline could fail to be created in certain cases, causing the parent pipeline to fail.
|
In GitLab 12.9, the child pipeline could fail to be created in certain cases, causing the parent pipeline to fail.
|
||||||
This is [resolved](https://gitlab.com/gitlab-org/gitlab/-/issues/209070) in GitLab 12.10.
|
This is [resolved](https://gitlab.com/gitlab-org/gitlab/-/issues/209070) in GitLab 12.10.
|
||||||
|
|
||||||
|
### Dynamic child pipeline example
|
||||||
|
|
||||||
|
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
|
||||||
|
|
||||||
|
You can trigger a child pipeline from a [dynamically generated configuration file](../pipelines/parent_child_pipelines.md#dynamic-child-pipelines):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
generate-config:
|
||||||
|
stage: build
|
||||||
|
script: generate-ci-config > generated-config.yml
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- generated-config.yml
|
||||||
|
|
||||||
|
child-pipeline:
|
||||||
|
stage: test
|
||||||
|
trigger:
|
||||||
|
include:
|
||||||
|
- artifact: generated-config.yml
|
||||||
|
job: generate-config
|
||||||
|
```
|
||||||
|
|
||||||
|
The `generated-config.yml` is extracted from the artifacts and used as the configuration
|
||||||
|
for triggering the child pipeline.
|
||||||
|
|
||||||
## Nested child pipelines
|
## Nested child pipelines
|
||||||
|
|
||||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29651) in GitLab 13.4.
|
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29651) in GitLab 13.4.
|
||||||
|
|
|
@ -177,7 +177,7 @@ deploy:
|
||||||
```
|
```
|
||||||
|
|
||||||
In a parent pipeline, it runs the `test` job that subsequently runs a child pipeline,
|
In a parent pipeline, it runs the `test` job that subsequently runs a child pipeline,
|
||||||
and the [`strategy: depend` option](../yaml/index.md#linking-pipelines-with-triggerstrategy) makes the `test` job wait until the child pipeline has finished.
|
and the [`strategy: depend` option](../yaml/index.md#triggerstrategy) makes the `test` job wait until the child pipeline has finished.
|
||||||
The parent pipeline runs the `deploy` job in the next stage, that requires a resource from the `production` resource group.
|
The parent pipeline runs the `deploy` job in the next stage, that requires a resource from the `production` resource group.
|
||||||
If the process mode is `oldest_first`, it executes the jobs from the oldest pipelines, meaning the `deploy` job is going to be executed next.
|
If the process mode is `oldest_first`, it executes the jobs from the oldest pipelines, meaning the `deploy` job is going to be executed next.
|
||||||
|
|
||||||
|
|
|
@ -113,6 +113,9 @@ This means that whenever a new tag is pushed on project A, the job runs and the
|
||||||
`stage: deploy` ensures that this job runs only after all jobs with
|
`stage: deploy` ensures that this job runs only after all jobs with
|
||||||
`stage: test` complete successfully.
|
`stage: test` complete successfully.
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
You [cannot use the API to start `when:manual` trigger jobs](https://gitlab.com/gitlab-org/gitlab/-/issues/284086).
|
||||||
|
|
||||||
## Triggering a pipeline from a webhook
|
## Triggering a pipeline from a webhook
|
||||||
|
|
||||||
To trigger a job from a webhook of another project you need to add the following
|
To trigger a job from a webhook of another project you need to add the following
|
||||||
|
|
|
@ -3802,31 +3802,19 @@ deploystacks:
|
||||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8997) in GitLab Premium 11.8.
|
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8997) in GitLab Premium 11.8.
|
||||||
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
|
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
|
||||||
|
|
||||||
Use `trigger` to define a downstream pipeline trigger. When GitLab starts a `trigger` job,
|
Use `trigger` to start a downstream pipeline that is either:
|
||||||
a downstream pipeline is created.
|
|
||||||
|
|
||||||
Jobs with `trigger` can only use a [limited set of keywords](../pipelines/multi_project_pipelines.md#define-multi-project-pipelines-in-your-gitlab-ciyml-file).
|
- [A multi-project pipeline](../pipelines/multi_project_pipelines.md).
|
||||||
For example, you can't run commands with [`script`](#script), [`before_script`](#before_script),
|
- [A child pipeline](../pipelines/parent_child_pipelines.md).
|
||||||
or [`after_script`](#after_script).
|
|
||||||
|
|
||||||
You can use this keyword to create two different types of downstream pipelines:
|
**Keyword type**: Job keyword. You can use it only as part of a job.
|
||||||
|
|
||||||
- [Multi-project pipelines](../pipelines/multi_project_pipelines.md#define-multi-project-pipelines-in-your-gitlab-ciyml-file)
|
**Possible inputs**:
|
||||||
- [Child pipelines](../pipelines/parent_child_pipelines.md)
|
|
||||||
|
|
||||||
In [GitLab 13.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/197140/), you can
|
- For multi-project pipelines, path to the downstream project.
|
||||||
view which job triggered a downstream pipeline. In the [pipeline graph](../pipelines/index.md#visualize-pipelines),
|
- For child pipelines, path to the child pipeline CI/CD configuration file.
|
||||||
hover over the downstream pipeline job.
|
|
||||||
|
|
||||||
In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/201938), you
|
**Example of `trigger` for multi-project pipeline**:
|
||||||
can use [`when:manual`](#when) in the same job as `trigger`. In GitLab 13.4 and
|
|
||||||
earlier, using them together causes the error `jobs:#{job-name} when should be on_success, on_failure or always`.
|
|
||||||
You [cannot start `manual` trigger jobs with the API](https://gitlab.com/gitlab-org/gitlab/-/issues/284086).
|
|
||||||
|
|
||||||
#### Basic `trigger` syntax for multi-project pipelines
|
|
||||||
|
|
||||||
You can configure a downstream trigger by using the `trigger` keyword
|
|
||||||
with a full path to a downstream project:
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
rspec:
|
rspec:
|
||||||
|
@ -3838,47 +3826,7 @@ staging:
|
||||||
trigger: my/deployment
|
trigger: my/deployment
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Complex `trigger` syntax for multi-project pipelines
|
**Example of `trigger` for child pipelines**:
|
||||||
|
|
||||||
You can configure a branch name that GitLab uses to create
|
|
||||||
a downstream pipeline with:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
rspec:
|
|
||||||
stage: test
|
|
||||||
script: bundle exec rspec
|
|
||||||
|
|
||||||
staging:
|
|
||||||
stage: deploy
|
|
||||||
trigger:
|
|
||||||
project: my/deployment
|
|
||||||
branch: stable
|
|
||||||
```
|
|
||||||
|
|
||||||
To mirror the status from a triggered pipeline:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
trigger_job:
|
|
||||||
trigger:
|
|
||||||
project: my/project
|
|
||||||
strategy: depend
|
|
||||||
```
|
|
||||||
|
|
||||||
To mirror the status from an upstream pipeline:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
upstream_bridge:
|
|
||||||
stage: test
|
|
||||||
needs:
|
|
||||||
pipeline: other/project
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `trigger` syntax for child pipeline
|
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16094) in GitLab 12.7.
|
|
||||||
|
|
||||||
To create a [child pipeline](../pipelines/parent_child_pipelines.md), specify the path to the
|
|
||||||
YAML file that contains the configuration of the child pipeline:
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
trigger_job:
|
trigger_job:
|
||||||
|
@ -3886,71 +3834,36 @@ trigger_job:
|
||||||
include: path/to/child-pipeline.yml
|
include: path/to/child-pipeline.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
Similar to [multi-project pipelines](../pipelines/multi_project_pipelines.md#mirror-status-of-a-triggered-pipeline-in-the-trigger-job),
|
**Additional details**:
|
||||||
it's possible to mirror the status from a triggered pipeline:
|
|
||||||
|
|
||||||
```yaml
|
- Jobs with `trigger` can only use a [limited set of keywords](../pipelines/multi_project_pipelines.md#define-multi-project-pipelines-in-your-gitlab-ciyml-file).
|
||||||
trigger_job:
|
For example, you can't run commands with [`script`](#script), [`before_script`](#before_script),
|
||||||
trigger:
|
or [`after_script`](#after_script).
|
||||||
include:
|
- In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/201938), you
|
||||||
- local: path/to/child-pipeline.yml
|
can use [`when:manual`](#when) in the same job as `trigger`. In GitLab 13.4 and
|
||||||
strategy: depend
|
earlier, using them together causes the error `jobs:#{job-name} when should be on_success, on_failure or always`.
|
||||||
```
|
- In [GitLab 13.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/197140/), you can
|
||||||
|
view which job triggered a downstream pipeline in the [pipeline graph](../pipelines/index.md#visualize-pipelines).
|
||||||
|
|
||||||
##### Trigger child pipeline with generated configuration file
|
**Related topics**:
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
|
- [Multi-project pipeline configuration examples](../pipelines/multi_project_pipelines.md#define-multi-project-pipelines-in-your-gitlab-ciyml-file).
|
||||||
|
- [Child pipeline configuration examples](../pipelines/parent_child_pipelines.md#examples).
|
||||||
|
- To force a rebuild of a specific branch, tag, or commit, you can
|
||||||
|
[use an API call with a trigger token](../triggers/index.md).
|
||||||
|
The trigger token is different than the `trigger` keyword.
|
||||||
|
|
||||||
You can also trigger a child pipeline from a [dynamically generated configuration file](../pipelines/parent_child_pipelines.md#dynamic-child-pipelines):
|
#### `trigger:strategy`
|
||||||
|
|
||||||
```yaml
|
Use `trigger:strategy` to force the `trigger` job to wait for the downstream pipeline to complete
|
||||||
generate-config:
|
before it is marked as **success**.
|
||||||
stage: build
|
|
||||||
script: generate-ci-config > generated-config.yml
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- generated-config.yml
|
|
||||||
|
|
||||||
child-pipeline:
|
This behavior is different than the default, which is for the `trigger` job to be marked as
|
||||||
stage: test
|
**success** as soon as the downstream pipeline is created.
|
||||||
trigger:
|
|
||||||
include:
|
|
||||||
- artifact: generated-config.yml
|
|
||||||
job: generate-config
|
|
||||||
```
|
|
||||||
|
|
||||||
The `generated-config.yml` is extracted from the artifacts and used as the configuration
|
This setting makes your pipeline execution linear rather than parallel.
|
||||||
for triggering the child pipeline.
|
|
||||||
|
|
||||||
##### Trigger child pipeline with files from another project
|
**Example of `trigger:strategy`**:
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/205157) in GitLab 13.5.
|
|
||||||
|
|
||||||
To trigger child pipelines with files from another private project under the same
|
|
||||||
GitLab instance, use [`include:file`](#includefile):
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
child-pipeline:
|
|
||||||
trigger:
|
|
||||||
include:
|
|
||||||
- project: 'my-group/my-pipeline-library'
|
|
||||||
ref: 'main'
|
|
||||||
file: '/path/to/child-pipeline.yml'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Linking pipelines with `trigger:strategy`
|
|
||||||
|
|
||||||
By default, the `trigger` job completes with the `success` status
|
|
||||||
as soon as the downstream pipeline is created.
|
|
||||||
|
|
||||||
To force the `trigger` job to wait for the downstream (multi-project or child) pipeline to complete, use
|
|
||||||
`strategy: depend`. This setting makes the trigger job wait with a "running" status until the triggered
|
|
||||||
pipeline completes. At that point, the `trigger` job completes and displays the same status as
|
|
||||||
the downstream job.
|
|
||||||
|
|
||||||
This setting can help keep your pipeline execution linear. In the following example, jobs from
|
|
||||||
subsequent stages wait for the triggered pipeline to successfully complete before
|
|
||||||
starting, which reduces parallelization.
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
trigger_job:
|
trigger_job:
|
||||||
|
@ -3959,14 +3872,8 @@ trigger_job:
|
||||||
strategy: depend
|
strategy: depend
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Trigger a pipeline by API call
|
In this example, jobs from subsequent stages wait for the triggered pipeline to
|
||||||
|
successfully complete before starting.
|
||||||
To force a rebuild of a specific branch, tag, or commit, you can use an API call
|
|
||||||
with a trigger token.
|
|
||||||
|
|
||||||
The trigger token is different than the [`trigger`](#trigger) keyword.
|
|
||||||
|
|
||||||
[Read more in the triggers documentation.](../triggers/index.md)
|
|
||||||
|
|
||||||
### `interruptible`
|
### `interruptible`
|
||||||
|
|
||||||
|
@ -4109,7 +4016,7 @@ deployment:
|
||||||
script: echo "Deploying..."
|
script: echo "Deploying..."
|
||||||
```
|
```
|
||||||
|
|
||||||
You must define [`strategy: depend`](#linking-pipelines-with-triggerstrategy)
|
You must define [`strategy: depend`](#triggerstrategy)
|
||||||
with the `trigger` keyword. This ensures that the lock isn't released until the downstream pipeline
|
with the `trigger` keyword. This ensures that the lock isn't released until the downstream pipeline
|
||||||
finishes.
|
finishes.
|
||||||
|
|
||||||
|
|
|
@ -234,53 +234,64 @@ Migration tests depend on what the migration does exactly, the most common types
|
||||||
#### Example of a data migration test
|
#### Example of a data migration test
|
||||||
|
|
||||||
This spec tests the
|
This spec tests the
|
||||||
[`db/post_migrate/20170526185842_migrate_pipeline_stages.rb`](https://gitlab.com/gitlab-org/gitlab-foss/blob/v11.6.5/db/post_migrate/20170526185842_migrate_pipeline_stages.rb)
|
[`db/post_migrate/20200723040950_migrate_incident_issues_to_incident_type.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/db/post_migrate/20200723040950_migrate_incident_issues_to_incident_type.rb)
|
||||||
migration. You can find the complete spec in
|
migration. You can find the complete spec in
|
||||||
[`spec/migrations/migrate_pipeline_stages_spec.rb`](https://gitlab.com/gitlab-org/gitlab-foss/blob/v11.6.5/spec/migrations/migrate_pipeline_stages_spec.rb).
|
[`spec/migrations/migrate_incident_issues_to_incident_type_spec.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/migrations/migrate_incident_issues_to_incident_type_spec.rb).
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
require 'spec_helper'
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
require_migration!
|
require_migration!
|
||||||
|
|
||||||
RSpec.describe MigratePipelineStages do
|
RSpec.describe MigrateIncidentIssuesToIncidentType do
|
||||||
# Create test data - pipeline and CI/CD jobs.
|
let(:migration) { described_class.new }
|
||||||
let(:jobs) { table(:ci_builds) }
|
|
||||||
let(:stages) { table(:ci_stages) }
|
|
||||||
let(:pipelines) { table(:ci_pipelines) }
|
|
||||||
let(:projects) { table(:projects) }
|
let(:projects) { table(:projects) }
|
||||||
|
let(:namespaces) { table(:namespaces) }
|
||||||
|
let(:labels) { table(:labels) }
|
||||||
|
let(:issues) { table(:issues) }
|
||||||
|
let(:label_links) { table(:label_links) }
|
||||||
|
let(:label_props) { IncidentManagement::CreateIncidentLabelService::LABEL_PROPERTIES }
|
||||||
|
|
||||||
|
let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') }
|
||||||
|
let!(:project) { projects.create!(namespace_id: namespace.id) }
|
||||||
|
let(:label) { labels.create!(project_id: project.id, **label_props) }
|
||||||
|
let!(:incident_issue) { issues.create!(project_id: project.id) }
|
||||||
|
let!(:other_issue) { issues.create!(project_id: project.id) }
|
||||||
|
|
||||||
|
# Issue issue_type enum
|
||||||
|
let(:issue_type) { 0 }
|
||||||
|
let(:incident_type) { 1 }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1')
|
label_links.create!(target_id: incident_issue.id, label_id: label.id, target_type: 'Issue')
|
||||||
pipelines.create!(id: 1, project_id: 123, ref: 'master', sha: 'adf43c3a')
|
|
||||||
jobs.create!(id: 1, commit_id: 1, project_id: 123, stage_idx: 2, stage: 'build')
|
|
||||||
jobs.create!(id: 2, commit_id: 1, project_id: 123, stage_idx: 1, stage: 'test')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Test just the up migration.
|
describe '#up' do
|
||||||
it 'correctly migrates pipeline stages' do
|
it 'updates the incident issue type' do
|
||||||
expect(stages.count).to be_zero
|
expect { migrate! }
|
||||||
|
.to change { incident_issue.reload.issue_type }
|
||||||
|
.from(issue_type)
|
||||||
|
.to(incident_type)
|
||||||
|
|
||||||
migrate!
|
expect(other_issue.reload.issue_type).to eql(issue_type)
|
||||||
|
end
|
||||||
expect(stages.count).to eq 2
|
|
||||||
expect(stages.all.pluck(:name)).to match_array %w[test build]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Test a reversible migration.
|
describe '#down' do
|
||||||
it 'correctly migrates up and down pipeline stages' do
|
let!(:incident_issue) { issues.create!(project_id: project.id, issue_type: issue_type) }
|
||||||
reversible_migration do |migration|
|
|
||||||
# Expectations will run before the up migration,
|
|
||||||
# and then again after the down migration
|
|
||||||
migration.before -> {
|
|
||||||
expect(stages.count).to be_zero
|
|
||||||
}
|
|
||||||
|
|
||||||
# Expectations will run after the up migration.
|
it 'updates the incident issue type' do
|
||||||
migration.after -> {
|
migration.up
|
||||||
expect(stages.count).to eq 2
|
|
||||||
expect(stages.all.pluck(:name)).to match_array %w[test build]
|
expect { migration.down }
|
||||||
}
|
.to change { incident_issue.reload.issue_type }
|
||||||
|
.from(incident_type)
|
||||||
|
.to(issue_type)
|
||||||
|
|
||||||
|
expect(other_issue.reload.issue_type).to eql(issue_type)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
@ -357,41 +368,62 @@ end
|
||||||
### Example background migration test
|
### Example background migration test
|
||||||
|
|
||||||
This spec tests the
|
This spec tests the
|
||||||
[`lib/gitlab/background_migration/archive_legacy_traces.rb`](https://gitlab.com/gitlab-org/gitlab-foss/blob/v11.6.5/lib/gitlab/background_migration/archive_legacy_traces.rb)
|
[`lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb)
|
||||||
background migration. You can find the complete spec on
|
background migration. You can find the complete spec on
|
||||||
[`spec/lib/gitlab/background_migration/archive_legacy_traces_spec.rb`](https://gitlab.com/gitlab-org/gitlab-foss/blob/v11.6.5/spec/lib/gitlab/background_migration/archive_legacy_traces_spec.rb)
|
[`spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb)
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Gitlab::BackgroundMigration::ArchiveLegacyTraces, schema: 20180529152628 do
|
RSpec.describe Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequests do
|
||||||
include TraceHelpers
|
|
||||||
|
|
||||||
let(:namespaces) { table(:namespaces) }
|
let(:namespaces) { table(:namespaces) }
|
||||||
let(:projects) { table(:projects) }
|
let(:projects) { table(:projects) }
|
||||||
let(:builds) { table(:ci_builds) }
|
let(:merge_requests) { table(:merge_requests) }
|
||||||
let(:job_artifacts) { table(:ci_job_artifacts) }
|
|
||||||
|
|
||||||
before do
|
let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') }
|
||||||
namespaces.create!(id: 123, name: 'gitlab1', path: 'gitlab1')
|
let(:project) { projects.create!(namespace_id: group.id) }
|
||||||
projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1', namespace_id: 123)
|
|
||||||
@build = builds.create!(id: 1, project_id: 123, status: 'success', type: 'Ci::Build')
|
let(:draft_prefixes) { ["[Draft]", "(Draft)", "Draft:", "Draft", "[WIP]", "WIP:", "WIP"] }
|
||||||
|
|
||||||
|
def create_merge_request(params)
|
||||||
|
common_params = {
|
||||||
|
target_project_id: project.id,
|
||||||
|
target_branch: 'feature1',
|
||||||
|
source_branch: 'master'
|
||||||
|
}
|
||||||
|
|
||||||
|
merge_requests.create!(common_params.merge(params))
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when trace file exists at the right place' do
|
context "for MRs with #draft? == true titles but draft attribute false" do
|
||||||
|
let(:mr_ids) { merge_requests.all.collect(&:id) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
create_legacy_trace(@build, 'trace in file')
|
draft_prefixes.each do |prefix|
|
||||||
|
(1..4).each do |n|
|
||||||
|
create_merge_request(
|
||||||
|
title: "#{prefix} This is a title",
|
||||||
|
draft: false,
|
||||||
|
state_id: n
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'correctly archive legacy traces' do
|
it "updates all open draft merge request's draft field to true" do
|
||||||
expect(job_artifacts.count).to eq(0)
|
mr_count = merge_requests.all.count
|
||||||
expect(File.exist?(legacy_trace_path(@build))).to be_truthy
|
|
||||||
|
|
||||||
described_class.new.perform(1, 1)
|
expect { subject.perform(mr_ids.first, mr_ids.last) }
|
||||||
|
.to change { MergeRequest.where(draft: false).count }
|
||||||
|
.from(mr_count).to(mr_count - draft_prefixes.length)
|
||||||
|
end
|
||||||
|
|
||||||
expect(job_artifacts.count).to eq(1)
|
it "marks successful slices as completed" do
|
||||||
expect(File.exist?(legacy_trace_path(@build))).to be_falsy
|
expect(subject).to receive(:mark_job_as_succeeded).with(mr_ids.first, mr_ids.last)
|
||||||
expect(File.read(archived_trace_path(job_artifacts.first))).to eq('trace in file')
|
|
||||||
|
subject.perform(mr_ids.first, mr_ids.last)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -423,6 +423,49 @@ echo 'unixsocket /var/run/redis/redis.sock' | sudo tee -a /etc/redis/redis.conf
|
||||||
# Grant permission to the socket to all members of the redis group
|
# Grant permission to the socket to all members of the redis group
|
||||||
echo 'unixsocketperm 770' | sudo tee -a /etc/redis/redis.conf
|
echo 'unixsocketperm 770' | sudo tee -a /etc/redis/redis.conf
|
||||||
|
|
||||||
|
# Add git to the redis group
|
||||||
|
sudo usermod -aG redis git
|
||||||
|
```
|
||||||
|
|
||||||
|
### Supervise Redis with systemd
|
||||||
|
|
||||||
|
If your distribution uses systemd init and the output of the following command is `notify`,
|
||||||
|
you do not need to make any changes:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
systemctl show --value --property=Type redis-server.service
|
||||||
|
```
|
||||||
|
|
||||||
|
If the output is **not** `notify`, run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# Configure Redis to not daemonize, but be supervised by systemd instead and disable the pidfile
|
||||||
|
sudo sed -i \
|
||||||
|
-e 's/^daemonize yes$/daemonize no/' \
|
||||||
|
-e 's/^supervised no$/supervised systemd/' \
|
||||||
|
-e 's/^pidfile/# pidfile/' /etc/redis/redis.conf
|
||||||
|
sudo chown redis:redis /etc/redis/redis.conf
|
||||||
|
|
||||||
|
# Make the same changes to the systemd unit file
|
||||||
|
sudo mkdir -p /etc/systemd/system/redis-server.service.d
|
||||||
|
sudo tee /etc/systemd/system/redis-server.service.d/10fix_type.conf <<EOF
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
PIDFile=
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Reload the redis service
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
# Activate the changes to redis.conf
|
||||||
|
sudo systemctl restart redis-server.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### Leave Redis unsupervised
|
||||||
|
|
||||||
|
If your system uses SysV init, run these commands:
|
||||||
|
|
||||||
|
```shell
|
||||||
# Create the directory which contains the socket
|
# Create the directory which contains the socket
|
||||||
sudo mkdir -p /var/run/redis
|
sudo mkdir -p /var/run/redis
|
||||||
sudo chown redis:redis /var/run/redis
|
sudo chown redis:redis /var/run/redis
|
||||||
|
@ -435,9 +478,6 @@ fi
|
||||||
|
|
||||||
# Activate the changes to redis.conf
|
# Activate the changes to redis.conf
|
||||||
sudo service redis-server restart
|
sudo service redis-server restart
|
||||||
|
|
||||||
# Add git to the redis group
|
|
||||||
sudo usermod -aG redis git
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 8. GitLab
|
## 8. GitLab
|
||||||
|
@ -687,10 +727,117 @@ sudo -u git -H editor config.toml
|
||||||
For more information about configuring Gitaly see
|
For more information about configuring Gitaly see
|
||||||
[the Gitaly documentation](../administration/gitaly/index.md).
|
[the Gitaly documentation](../administration/gitaly/index.md).
|
||||||
|
|
||||||
|
### Install the service
|
||||||
|
|
||||||
|
GitLab has always supported SysV init scripts, which are widely supported and portable, but now systemd is the standard for service supervision and is used by all major Linux distributions. You should use native systemd services if you can to benefit from automatic restarts, better sandboxing and resource control.
|
||||||
|
|
||||||
|
#### Install systemd units
|
||||||
|
|
||||||
|
Use these steps if you use systemd as init. Otherwise, follow the [SysV init script steps](#install-sysv-init-script).
|
||||||
|
|
||||||
|
Copy the services and run `systemctl daemon-reload` so that systemd picks them up:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd /home/git/gitlab
|
||||||
|
sudo mkdir -p /usr/local/lib/systemd/system
|
||||||
|
sudo cp lib/support/systemd/* /usr/local/lib/systemd/system/
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
```
|
||||||
|
|
||||||
|
The units provided by GitLab make very little assumptions about where you are running Redis and PostgreSQL.
|
||||||
|
|
||||||
|
If you installed GitLab in another directory or as a user other than the default, you need to change these values in the units as well.
|
||||||
|
|
||||||
|
For example, if you're running Redis and PostgreSQL on the same machine as GitLab, you should:
|
||||||
|
|
||||||
|
- Edit the Puma service:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl edit gitlab-puma.service
|
||||||
|
```
|
||||||
|
|
||||||
|
In the editor that opens, add the following and save the file:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
[Unit]
|
||||||
|
Wants=redis-server.service postgresql.service
|
||||||
|
After=redis-server.service postgresql.service
|
||||||
|
```
|
||||||
|
|
||||||
|
- Edit the Sidekiq service:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl edit gitlab-sidekiq.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Add the following and save the file:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
[Unit]
|
||||||
|
Wants=redis-server.service postgresql.service
|
||||||
|
After=redis-server.service postgresql.service
|
||||||
|
```
|
||||||
|
|
||||||
|
`systemctl edit` installs drop-in configuration files at `/etc/systemd/system/<name of the unit>.d/override.conf`, so your local configuration is not overwritten when updating the unit files later. To split up your drop-in configuration files, you can add the above snippets to `.conf` files under `/etc/systemd/system/<name of the unit>.d/`.
|
||||||
|
|
||||||
|
If you manually made changes to the unit files or added drop-in configuration files (without using `systemctl edit`), run the following command for them to take effect:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
```
|
||||||
|
|
||||||
|
Make GitLab start on boot:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl enable gitlab.target
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Install SysV init script
|
||||||
|
|
||||||
|
Use these steps if you use the SysV init script. If you use systemd, follow the [systemd unit steps](#install-systemd-units).
|
||||||
|
|
||||||
|
Download the init script (is `/etc/init.d/gitlab`):
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd /home/git/gitlab
|
||||||
|
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
|
||||||
|
```
|
||||||
|
|
||||||
|
And if you are installing with a non-default folder or user, copy and edit the defaults file:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab
|
||||||
|
```
|
||||||
|
|
||||||
|
If you installed GitLab in another directory or as a user other than the default, you should change these settings in `/etc/default/gitlab`. Do not edit `/etc/init.d/gitlab` as it is changed on upgrade.
|
||||||
|
|
||||||
|
Make GitLab start on boot:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo update-rc.d gitlab defaults 21
|
||||||
|
# or if running this on a machine running systemd
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable gitlab.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### Set up Logrotate
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab
|
||||||
|
```
|
||||||
|
|
||||||
### Start Gitaly
|
### Start Gitaly
|
||||||
|
|
||||||
Gitaly must be running for the next section.
|
Gitaly must be running for the next section.
|
||||||
|
|
||||||
|
- To start Gitaly using systemd:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl start gitlab-gitaly.service
|
||||||
|
```
|
||||||
|
|
||||||
|
- To manually start Gitaly for SysV:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
gitlab_path=/home/git/gitlab
|
gitlab_path=/home/git/gitlab
|
||||||
gitaly_path=/home/git/gitaly
|
gitaly_path=/home/git/gitaly
|
||||||
|
@ -724,34 +871,6 @@ The `secrets.yml` file stores encryption keys for sessions and secure variables.
|
||||||
Backup `secrets.yml` someplace safe, but don't store it in the same place as your database backups.
|
Backup `secrets.yml` someplace safe, but don't store it in the same place as your database backups.
|
||||||
Otherwise, your secrets are exposed if one of your backups is compromised.
|
Otherwise, your secrets are exposed if one of your backups is compromised.
|
||||||
|
|
||||||
### Install Init Script
|
|
||||||
|
|
||||||
Download the init script (is `/etc/init.d/gitlab`):
|
|
||||||
|
|
||||||
```shell
|
|
||||||
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
|
|
||||||
```
|
|
||||||
|
|
||||||
And if you are installing with a non-default folder or user, copy and edit the defaults file:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab
|
|
||||||
```
|
|
||||||
|
|
||||||
If you installed GitLab in another directory or as a user other than the default, you should change these settings in `/etc/default/gitlab`. Do not edit `/etc/init.d/gitlab` as it is changed on upgrade.
|
|
||||||
|
|
||||||
Make GitLab start on boot:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
sudo update-rc.d gitlab defaults 21
|
|
||||||
```
|
|
||||||
|
|
||||||
### Set up Logrotate
|
|
||||||
|
|
||||||
```shell
|
|
||||||
sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab
|
|
||||||
```
|
|
||||||
|
|
||||||
### Check Application Status
|
### Check Application Status
|
||||||
|
|
||||||
Check if GitLab and its environment are configured correctly:
|
Check if GitLab and its environment are configured correctly:
|
||||||
|
@ -782,9 +901,11 @@ sudo -u git -H bundle exec rake gitlab:assets:compile RAILS_ENV=production NODE_
|
||||||
### Start Your GitLab Instance
|
### Start Your GitLab Instance
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
# For systems running systemd
|
||||||
|
sudo systemctl start gitlab.target
|
||||||
|
|
||||||
|
# For systems running SysV init
|
||||||
sudo service gitlab start
|
sudo service gitlab start
|
||||||
# or
|
|
||||||
sudo /etc/init.d/gitlab restart
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 9. NGINX
|
## 9. NGINX
|
||||||
|
@ -857,6 +978,10 @@ nginx: configuration file /etc/nginx/nginx.conf test failed
|
||||||
### Restart
|
### Restart
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
# For systems running systemd
|
||||||
|
sudo systemctl restart nginx.service
|
||||||
|
|
||||||
|
# For systems running SysV init
|
||||||
sudo service nginx restart
|
sudo service nginx restart
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -889,7 +1014,10 @@ earlier and login. After login, you can change the username if you wish.
|
||||||
|
|
||||||
**Enjoy!**
|
**Enjoy!**
|
||||||
|
|
||||||
You can use `sudo service gitlab start` and `sudo service gitlab stop` to start and stop GitLab.
|
To start and stop GitLab when using:
|
||||||
|
|
||||||
|
- systemd units: use `sudo systemctl start gitlab.target` or `sudo systemctl stop gitlab.target`.
|
||||||
|
- The SysV init script: use `sudo service gitlab start` or `sudo service gitlab stop`.
|
||||||
|
|
||||||
## Advanced Setup Tips
|
## Advanced Setup Tips
|
||||||
|
|
||||||
|
|
|
@ -101,8 +101,9 @@ Make sure to follow all steps below:
|
||||||
gitlab_url: http://127.0.0.1/gitlab
|
gitlab_url: http://127.0.0.1/gitlab
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Make sure you have copied the supplied init script and the defaults file
|
1. Make sure you have copied either the supplied systemd services, or the init
|
||||||
as stated in the [installation guide](installation.md#install-init-script).
|
script and the defaults file, as stated in the
|
||||||
|
[installation guide](installation.md#install-the-service).
|
||||||
Then, edit `/etc/default/gitlab` and set in `gitlab_workhorse_options` the
|
Then, edit `/etc/default/gitlab` and set in `gitlab_workhorse_options` the
|
||||||
`-authBackend` setting to read like:
|
`-authBackend` setting to read like:
|
||||||
|
|
||||||
|
|
|
@ -306,8 +306,8 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
|
||||||
### 14.5.0
|
### 14.5.0
|
||||||
|
|
||||||
When `make` is run, Gitaly builds are now created in `_build/bin` and no longer in the root directory of the source directory. If you
|
When `make` is run, Gitaly builds are now created in `_build/bin` and no longer in the root directory of the source directory. If you
|
||||||
are using a source install, update paths to these binaries in your init scripts by
|
are using a source install, update paths to these binaries in your [systemd unit files](upgrading_from_source.md#configure-systemd-units)
|
||||||
[following the documentation](upgrading_from_source.md#init-script).
|
or [init scripts](upgrading_from_source.md#configure-sysv-init-script) by [following the documentation](upgrading_from_source.md).
|
||||||
|
|
||||||
### 14.4.0
|
### 14.4.0
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,10 @@ It's useful to make a backup just in case things go south. Depending on the inst
|
||||||
### 1. Stop server
|
### 1. Stop server
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
# For systems running systemd
|
||||||
|
sudo systemctl stop gitlab.target
|
||||||
|
|
||||||
|
# For systems running SysV init
|
||||||
sudo service gitlab stop
|
sudo service gitlab stop
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -108,6 +112,11 @@ Please follow the [install instruction](../integration/elasticsearch.md#install-
|
||||||
### 9. Start application
|
### 9. Start application
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
# For systems running systemd
|
||||||
|
sudo systemctl start gitlab.target
|
||||||
|
sudo systemctl restart nginx.service
|
||||||
|
|
||||||
|
# For systems running SysV init
|
||||||
sudo service gitlab start
|
sudo service gitlab start
|
||||||
sudo service nginx restart
|
sudo service nginx restart
|
||||||
```
|
```
|
||||||
|
|
|
@ -54,6 +54,10 @@ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
|
||||||
### 2. Stop server
|
### 2. Stop server
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
# For systems running systemd
|
||||||
|
sudo systemctl stop gitlab.target
|
||||||
|
|
||||||
|
# For systems running SysV init
|
||||||
sudo service gitlab stop
|
sudo service gitlab stop
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -230,7 +234,29 @@ ActionMailer::Base.delivery_method = :smtp
|
||||||
|
|
||||||
See [`smtp_settings.rb.sample`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/initializers/smtp_settings.rb.sample#L13) as an example.
|
See [`smtp_settings.rb.sample`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/initializers/smtp_settings.rb.sample#L13) as an example.
|
||||||
|
|
||||||
#### Init script
|
#### Configure systemd units
|
||||||
|
|
||||||
|
If using the SysV init script, see [Configure SysV init script](#configure-sysv-init-script).
|
||||||
|
|
||||||
|
Check if the systemd units have been updated:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd /home/git/gitlab
|
||||||
|
|
||||||
|
git diff origin/PREVIOUS_BRANCH:lib/support/systemd origin/BRANCH:lib/support/systemd
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy them over:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo mkdir -p /usr/local/lib/systemd/system
|
||||||
|
sudo cp lib/support/systemd/* /usr/local/lib/systemd/system/
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Configure SysV init script
|
||||||
|
|
||||||
|
If using systemd units, see [Configure systemd units](#configure-systemd-units).
|
||||||
|
|
||||||
There might be new configuration options available for
|
There might be new configuration options available for
|
||||||
[`gitlab.default.example`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/support/init.d/gitlab.default.example).
|
[`gitlab.default.example`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/support/init.d/gitlab.default.example).
|
||||||
|
@ -250,7 +276,7 @@ cd /home/git/gitlab
|
||||||
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
|
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
|
||||||
```
|
```
|
||||||
|
|
||||||
For Ubuntu 16.04.1 LTS:
|
If you are using the init script on a system running systemd as init, because you have not switched to native systemd units yet, run:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
|
@ -342,6 +368,11 @@ sudo -u git -H make
|
||||||
### 15. Start application
|
### 15. Start application
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
# For systems running systemd
|
||||||
|
sudo systemctl start gitlab.target
|
||||||
|
sudo systemctl restart nginx.service
|
||||||
|
|
||||||
|
# For systems running SysV init
|
||||||
sudo service gitlab start
|
sudo service gitlab start
|
||||||
sudo service nginx restart
|
sudo service nginx restart
|
||||||
```
|
```
|
||||||
|
|
|
@ -125,8 +125,6 @@ You can also use [Kroki](https://kroki.io) to create a wide variety of diagrams.
|
||||||
|
|
||||||
#### Mermaid
|
#### Mermaid
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/15107) in GitLab 10.3.
|
|
||||||
|
|
||||||
Visit the [official page](https://mermaidjs.github.io/) for more details. The
|
Visit the [official page](https://mermaidjs.github.io/) for more details. The
|
||||||
[Mermaid Live Editor](https://mermaid-js.github.io/mermaid-live-editor/) helps you
|
[Mermaid Live Editor](https://mermaid-js.github.io/mermaid-live-editor/) helps you
|
||||||
learn Mermaid and debug issues in your Mermaid code. Use it to identify and resolve
|
learn Mermaid and debug issues in your Mermaid code. Use it to identify and resolve
|
||||||
|
@ -211,7 +209,7 @@ Sometimes you want to :monkey: around a bit and add some :star2: to your :speech
|
||||||
|
|
||||||
You can use it to point out a :bug: or warn about :speak_no_evil: patches. And if someone improves your really :snail: code, send them some :birthday:. People :heart: you for that.
|
You can use it to point out a :bug: or warn about :speak_no_evil: patches. And if someone improves your really :snail: code, send them some :birthday:. People :heart: you for that.
|
||||||
|
|
||||||
If you're new to this, don't be :fearful:. You can join the emoji :family:. All you need to do is to look up one of the supported codes.
|
If you're new to this, don't be :fearful:. You can join the emoji :family:. Just look up one of the supported codes.
|
||||||
|
|
||||||
Consult the [Emoji Cheat Sheet](https://www.emojicopy.com) for a list of all supported emoji codes. :thumbsup:
|
Consult the [Emoji Cheat Sheet](https://www.emojicopy.com) for a list of all supported emoji codes. :thumbsup:
|
||||||
```
|
```
|
||||||
|
@ -222,7 +220,7 @@ Sometimes you want to <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/ma
|
||||||
|
|
||||||
You can use it to point out a<img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/bug.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> or warn about <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/speak_no_evil.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> patches. If someone improves your really <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/snail.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> code, send them some <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/birthday.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. People <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/heart.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> you for that.
|
You can use it to point out a<img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/bug.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> or warn about <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/speak_no_evil.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> patches. If someone improves your really <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/snail.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> code, send them some <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/birthday.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. People <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/heart.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> you for that.
|
||||||
|
|
||||||
If you're new to this, don't be <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/fearful.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. You can join the emoji <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/family.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. All you need to do is to look up one of the supported codes.
|
If you're new to this, don't be <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/fearful.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. You can join the emoji <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/family.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. Just look up one of the supported codes.
|
||||||
|
|
||||||
Consult the [Emoji Cheat Sheet](https://www.webfx.com/tools/emoji-cheat-sheet/) for a list of all supported emoji codes. <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/thumbsup.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">
|
Consult the [Emoji Cheat Sheet](https://www.webfx.com/tools/emoji-cheat-sheet/) for a list of all supported emoji codes. <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/thumbsup.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">
|
||||||
|
|
||||||
|
@ -244,8 +242,6 @@ this font installed by default.
|
||||||
|
|
||||||
### Front matter
|
### Front matter
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23331) in GitLab 11.6.
|
|
||||||
|
|
||||||
Front matter is metadata included at the beginning of a Markdown document, preceding
|
Front matter is metadata included at the beginning of a Markdown document, preceding
|
||||||
the content. This data can be used by static site generators like [Jekyll](https://jekyllrb.com/docs/front-matter/),
|
the content. This data can be used by static site generators like [Jekyll](https://jekyllrb.com/docs/front-matter/),
|
||||||
[Hugo](https://gohugo.io/content-management/front-matter/), and many other applications.
|
[Hugo](https://gohugo.io/content-management/front-matter/), and many other applications.
|
||||||
|
@ -356,18 +352,18 @@ in a [code block](#code-spans-and-blocks) with the language declared as `math` i
|
||||||
on a separate line:
|
on a separate line:
|
||||||
|
|
||||||
````markdown
|
````markdown
|
||||||
This math is inline $`a^2+b^2=c^2`$.
|
This math is inline: $`a^2+b^2=c^2`$.
|
||||||
|
|
||||||
This is on a separate line:
|
This math is on a separate line:
|
||||||
|
|
||||||
```math
|
```math
|
||||||
a^2+b^2=c^2
|
a^2+b^2=c^2
|
||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
|
||||||
This math is inline $`a^2+b^2=c^2`$.
|
This math is inline: $`a^2+b^2=c^2`$.
|
||||||
|
|
||||||
This is on a separate line
|
This math is on a separate line:
|
||||||
|
|
||||||
```math
|
```math
|
||||||
a^2+b^2=c^2
|
a^2+b^2=c^2
|
||||||
|
@ -408,16 +404,17 @@ To create a task list, follow the format of an ordered or unordered list:
|
||||||
### Table of contents
|
### Table of contents
|
||||||
|
|
||||||
A table of contents is an unordered list that links to subheadings in the document.
|
A table of contents is an unordered list that links to subheadings in the document.
|
||||||
|
|
||||||
To add a table of contents to a Markdown file, wiki page, issue request, or merge request
|
|
||||||
description, add either the `[[_TOC_]]` or `[TOC]` tag on its own line.
|
|
||||||
|
|
||||||
NOTE:
|
|
||||||
You can add a table of contents to issues and merge requests, but you can't add one
|
You can add a table of contents to issues and merge requests, but you can't add one
|
||||||
to notes or comments.
|
to notes or comments. Add either the `[[_TOC_]]` or `[TOC]` tag on its own line
|
||||||
|
to the **Description** field of any of the supported content types:
|
||||||
|
|
||||||
|
- Markdown files.
|
||||||
|
- Wiki pages.
|
||||||
|
- Issues.
|
||||||
|
- Merge requests.
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
This is an intro sentence to my Wiki page.
|
This sentence introduces my wiki page.
|
||||||
|
|
||||||
[[_TOC_]]
|
[[_TOC_]]
|
||||||
|
|
||||||
|
@ -579,7 +576,7 @@ by starting the lines of the blockquote with `>`:
|
||||||
|
|
||||||
Quote break.
|
Quote break.
|
||||||
|
|
||||||
> This is a very long line that is still quoted properly when it wraps. Keep writing to make sure this line is long enough to actually wrap for everyone. You can also *add* **Markdown** into a blockquote.
|
> This very long line is still quoted properly when it wraps. Keep writing to make sure this line is long enough to actually wrap for everyone. You can also *add* **Markdown** into a blockquote.
|
||||||
```
|
```
|
||||||
|
|
||||||
> Blockquotes help you emulate reply text.
|
> Blockquotes help you emulate reply text.
|
||||||
|
@ -587,7 +584,7 @@ Quote break.
|
||||||
|
|
||||||
Quote break.
|
Quote break.
|
||||||
|
|
||||||
> This is a very long line that is still quoted properly when it wraps. Keep writing to make sure this line is long enough to actually wrap for everyone. You can also *add* **Markdown** into a blockquote.
|
> This very long line is still quoted properly when it wraps. Keep writing to make sure this line is long enough to actually wrap for everyone. You can also *add* **Markdown** into a blockquote.
|
||||||
|
|
||||||
#### Multiline blockquote
|
#### Multiline blockquote
|
||||||
|
|
||||||
|
@ -706,7 +703,7 @@ puts markdown.to_html
|
||||||
|
|
||||||
```
|
```
|
||||||
No language indicated, so no syntax highlighting.
|
No language indicated, so no syntax highlighting.
|
||||||
s = "There is no highlighting for this."
|
s = "No highlighting is shown for this line."
|
||||||
But let's throw in a <b>tag</b>.
|
But let's throw in a <b>tag</b>.
|
||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
@ -733,13 +730,13 @@ puts markdown.to_html
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
No language indicated, so no syntax highlighting.
|
No language indicated, so no syntax highlighting.
|
||||||
s = "There is no highlighting for this."
|
s = "No highlighting is shown for this line."
|
||||||
But let's throw in a <b>tag</b>.
|
But let's throw in a <b>tag</b>.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Emphasis
|
### Emphasis
|
||||||
|
|
||||||
There are multiple ways to emphasize text in Markdown. You can italicize, bold, strikethrough,
|
In Markdown, you can emphasize text in multiple ways. You can italicize, bold, strikethrough,
|
||||||
and combine these emphasis styles together.
|
and combine these emphasis styles together.
|
||||||
Strikethrough is not part of the core Markdown standard, but is part of GitLab Flavored Markdown.
|
Strikethrough is not part of the core Markdown standard, but is part of GitLab Flavored Markdown.
|
||||||
|
|
||||||
|
@ -819,9 +816,9 @@ Do not edit the following codeblock. It uses HTML to skip the Vale ReferenceLink
|
||||||
|
|
||||||
This reference tag is a mix of letters and numbers. [^footnote-42]
|
This reference tag is a mix of letters and numbers. [^footnote-42]
|
||||||
|
|
||||||
[^1]: This is the text inside a footnote.
|
[^1]: This text is inside a footnote.
|
||||||
|
|
||||||
[^footnote-42]: This is another footnote.
|
[^footnote-42]: This text is another footnote.
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
||||||
A footnote reference tag looks like this:[^1]
|
A footnote reference tag looks like this:[^1]
|
||||||
|
@ -833,9 +830,9 @@ Do not delete the single space before the [^1] and [^footnotes] references below
|
||||||
These are used to force the Vale ReferenceLinks check to skip these examples.
|
These are used to force the Vale ReferenceLinks check to skip these examples.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
[^1]: This is the text inside a footnote.
|
[^1]: This text is inside a footnote.
|
||||||
|
|
||||||
[^footnote-42]: This is another footnote.
|
[^footnote-42]: This text is another footnote.
|
||||||
|
|
||||||
### Headers
|
### Headers
|
||||||
|
|
||||||
|
@ -893,8 +890,8 @@ Would generate the following link IDs:
|
||||||
1. `this-header-has-spaces-in-it-2`
|
1. `this-header-has-spaces-in-it-2`
|
||||||
1. `this-header-has-3-5-in-it-and-parentheses`
|
1. `this-header-has-3-5-in-it-and-parentheses`
|
||||||
|
|
||||||
Note that the emoji processing happens before the header IDs are generated, so the
|
Emoji processing happens before the header IDs are generated. The
|
||||||
emoji is converted to an image which is then removed from the ID.
|
emoji is converted to an image, which is then removed from the ID.
|
||||||
|
|
||||||
### Horizontal Rule
|
### Horizontal Rule
|
||||||
|
|
||||||
|
@ -934,7 +931,7 @@ Reference-style (hover to see title text):
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
DO NOT change the name of markdown_logo.png. This is used for a test in
|
DO NOT change the name of markdown_logo.png. This file is used for a test in
|
||||||
spec/controllers/help_controller_spec.rb.
|
spec/controllers/help_controller_spec.rb.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
@ -951,7 +948,7 @@ Do not change to a reference style link.
|
||||||
|
|
||||||
![alt text](img/markdown_logo.png "Title Text")
|
![alt text](img/markdown_logo.png "Title Text")
|
||||||
|
|
||||||
In the rare case where you need to set a specific height or width for an image,
|
In the rare case where you must set a specific height or width for an image,
|
||||||
you can use the `img` HTML tag instead of Markdown and set its `height` and
|
you can use the `img` HTML tag instead of Markdown and set its `height` and
|
||||||
`width` parameters.
|
`width` parameters.
|
||||||
|
|
||||||
|
@ -1129,8 +1126,8 @@ These details <em>remain</em> <b>hidden</b> until expanded.
|
||||||
### Line breaks
|
### Line breaks
|
||||||
|
|
||||||
A line break is inserted (a new paragraph starts) if the previous text is
|
A line break is inserted (a new paragraph starts) if the previous text is
|
||||||
ended with two newlines, like when you hit <kbd>Enter</kbd> twice in a row. If you only
|
ended with two newlines, like when you press <kbd>Enter</kbd> twice in a row. If you only
|
||||||
use one newline (hit <kbd>Enter</kbd> once), the next sentence remains part of the
|
use one newline (select <kbd>Enter</kbd> once), the next sentence remains part of the
|
||||||
same paragraph. Use this approach if you want to keep long lines from wrapping, and keep
|
same paragraph. Use this approach if you want to keep long lines from wrapping, and keep
|
||||||
them editable:
|
them editable:
|
||||||
|
|
||||||
|
@ -1156,7 +1153,8 @@ in the *same paragraph*.
|
||||||
|
|
||||||
#### Newlines
|
#### Newlines
|
||||||
|
|
||||||
GitLab Flavored Markdown adheres to the Markdown specification in how [paragraphs and line breaks are handled](https://spec.commonmark.org/current/).
|
GitLab Flavored Markdown adheres to the Markdown specification for handling
|
||||||
|
[paragraphs and line breaks](https://spec.commonmark.org/current/).
|
||||||
|
|
||||||
A paragraph is one or more consecutive lines of text, separated by one or
|
A paragraph is one or more consecutive lines of text, separated by one or
|
||||||
more blank lines (two newlines at the end of the first paragraph), as [explained above](#line-breaks).
|
more blank lines (two newlines at the end of the first paragraph), as [explained above](#line-breaks).
|
||||||
|
@ -1178,25 +1176,25 @@ A new line due to the previous backslash.
|
||||||
|
|
||||||
### Links
|
### Links
|
||||||
|
|
||||||
There are two ways to create links, inline-style and reference-style:
|
You can create links two ways: inline-style and reference-style. For example:
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Do not edit the following codeblock. It uses HTML to skip the Vale ReferenceLinks test.
|
Do not edit the following codeblock. It uses HTML to skip the Vale ReferenceLinks test.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<pre class="highlight"><code>- This is an [inline-style link](https://www.google.com)
|
<pre class="highlight"><code>- This line shows an [inline-style link](https://www.google.com)
|
||||||
- This is a [link to a repository file in the same directory](index.md)
|
- This line shows a [link to a repository file in the same directory](index.md)
|
||||||
- This is a [relative link to a readme one directory higher](../index.md)
|
- This line shows a [relative link to a readme one directory higher](../index.md)
|
||||||
- This is a [link that also has title text](https://www.google.com "This link takes you to Google!")
|
- This line shows a [link that also has title text](https://www.google.com "This link takes you to Google!")
|
||||||
|
|
||||||
Using header ID anchors:
|
Using header ID anchors:
|
||||||
|
|
||||||
- This links to [a section on a different Markdown page, using a "#" and the header ID](index.md#overview)
|
- This line links to [a section on a different Markdown page, using a "#" and the header ID](index.md#overview)
|
||||||
- This links to [a different section on the same page, using a "#" and the header ID](#header-ids-and-links)
|
- This line links to [a different section on the same page, using a "#" and the header ID](#header-ids-and-links)
|
||||||
|
|
||||||
Using references:
|
Using references:
|
||||||
|
|
||||||
- This is a [reference-style link, see below][Arbitrary case-insensitive reference text]
|
- This line shows a [reference-style link, see below][Arbitrary case-insensitive reference text]
|
||||||
- You can [use numbers for reference-style link definitions, see below][1]
|
- You can [use numbers for reference-style link definitions, see below][1]
|
||||||
- Or leave it empty and use the [link text itself][], see below.
|
- Or leave it empty and use the [link text itself][], see below.
|
||||||
|
|
||||||
|
@ -1207,15 +1205,15 @@ Some text to show that the reference links can follow later.
|
||||||
[link text itself]: https://www.reddit.com
|
[link text itself]: https://www.reddit.com
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
||||||
- This is an [inline-style link](https://www.google.com)
|
- This line shows an [inline-style link](https://www.google.com)
|
||||||
- This is a [link to a repository file in the same directory](index.md)
|
- This line shows a [link to a repository file in the same directory](index.md)
|
||||||
- This is a [relative link to a README one directory higher](../index.md)
|
- This line shows a [relative link to a README one directory higher](../index.md)
|
||||||
- This is a [link that also has title text](https://www.google.com "This link takes you to Google!")
|
- This line shows a [link that also has title text](https://www.google.com "This link takes you to Google!")
|
||||||
|
|
||||||
Using header ID anchors:
|
Using header ID anchors:
|
||||||
|
|
||||||
- This links to [a section on a different Markdown page, using a "#" and the header ID](index.md#overview)
|
- This line links to [a section on a different Markdown page, using a "#" and the header ID](index.md#overview)
|
||||||
- This links to [a different section on the same page, using a "#" and the header ID](#header-ids-and-links)
|
- This line links to [a different section on the same page, using a "#" and the header ID](#header-ids-and-links)
|
||||||
|
|
||||||
Using references:
|
Using references:
|
||||||
|
|
||||||
|
@ -1224,7 +1222,7 @@ The example below uses in-line links to pass the Vale ReferenceLinks test.
|
||||||
Do not change to reference style links.
|
Do not change to reference style links.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
- This is a [reference-style link, see below](https://www.mozilla.org/en-US/)
|
- This line is a [reference-style link, see below](https://www.mozilla.org/en-US/)
|
||||||
- You can [use numbers for reference-style link definitions, see below](https://slashdot.org)
|
- You can [use numbers for reference-style link definitions, see below](https://slashdot.org)
|
||||||
- Or leave it empty and use the [link text itself](https://www.reddit.com), see below.
|
- Or leave it empty and use the [link text itself](https://www.reddit.com), see below.
|
||||||
|
|
||||||
|
@ -1232,7 +1230,7 @@ Some text to show that the reference links can follow later.
|
||||||
|
|
||||||
NOTE:
|
NOTE:
|
||||||
Relative links do not allow the referencing of project files in a wiki
|
Relative links do not allow the referencing of project files in a wiki
|
||||||
page, or a wiki page in a project file. The reason for this is that a wiki is always
|
page, or a wiki page in a project file. The reason: a wiki is always
|
||||||
in a separate Git repository in GitLab. For example, `[I'm a reference-style link](style)`
|
in a separate Git repository in GitLab. For example, `[I'm a reference-style link](style)`
|
||||||
points the link to `wikis/style` only when the link is inside of a wiki Markdown file.
|
points the link to `wikis/style` only when the link is inside of a wiki Markdown file.
|
||||||
|
|
||||||
|
@ -1261,14 +1259,14 @@ GitLab Flavored Markdown auto-links almost any URL you put into your text:
|
||||||
<!-- vale gitlab.Spelling = YES -->
|
<!-- vale gitlab.Spelling = YES -->
|
||||||
### Lists
|
### Lists
|
||||||
|
|
||||||
Ordered and unordered lists can be created.
|
You can create ordered and unordered lists.
|
||||||
|
|
||||||
For an ordered list, add the number you want the list
|
For an ordered list, add the number you want the list
|
||||||
to start with, like `1.`, followed by a space, at the start of each line for ordered lists.
|
to start with, like `1.`, followed by a space, at the start of each line for ordered lists.
|
||||||
After the first number, it does not matter what number you use, ordered lists are
|
After the first number, it does not matter what number you use. Ordered lists are
|
||||||
numbered automatically by vertical order, so repeating `1.` for all items in the
|
numbered automatically by vertical order, so repeating `1.` for all items in the
|
||||||
same list is common. If you start with a number other than `1.`, it uses that as the first
|
same list is common. If you start with a number other than `1.`, it uses that as the first
|
||||||
number, and count up from there.
|
number, and counts up from there.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
|
@ -1360,10 +1358,9 @@ Example:
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
If the paragraph of the first item is not indented with the proper number of spaces,
|
If the first item's paragraph isn't indented with the proper number of spaces,
|
||||||
the paragraph appears outside the list, instead of properly indented under the list item.
|
the paragraph appears outside the list, instead of properly indented under the list item.
|
||||||
|
For example:
|
||||||
Example:
|
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
1. First ordered list item
|
1. First ordered list item
|
||||||
|
@ -1455,13 +1452,13 @@ use `<br>` tags to force a cell to have multiple lines:
|
||||||
```markdown
|
```markdown
|
||||||
| Name | Details |
|
| Name | Details |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| Item1 | This is on one line |
|
| Item1 | This text is on one line |
|
||||||
| Item2 | This item has:<br>- Multiple items<br>- That we want listed separately |
|
| Item2 | This item has:<br>- Multiple items<br>- That we want listed separately |
|
||||||
```
|
```
|
||||||
|
|
||||||
| Name | Details |
|
| Name | Details |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| Item1 | This is on one line |
|
| Item1 | This text is on one line |
|
||||||
| Item2 | This item has:<br>- Multiple items<br>- That we want listed separately |
|
| Item2 | This item has:<br>- Multiple items<br>- That we want listed separately |
|
||||||
|
|
||||||
You can use HTML formatting in GitLab itself to add [task lists](#task-lists) with checkboxes,
|
You can use HTML formatting in GitLab itself to add [task lists](#task-lists) with checkboxes,
|
||||||
|
|
17
lib/support/systemd/gitlab-gitaly.service
Normal file
17
lib/support/systemd/gitlab-gitaly.service
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
[Unit]
|
||||||
|
Description=GitLab Gitaly
|
||||||
|
ReloadPropagatedFrom=gitlab.target
|
||||||
|
PartOf=gitlab.target
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=git
|
||||||
|
WorkingDirectory=/home/git/gitlab
|
||||||
|
ExecStart=/home/git/gitaly/_build/bin/gitaly /home/git/gitaly/config.toml
|
||||||
|
Restart=on-failure
|
||||||
|
SyslogIdentifier=gitlab-gitaly
|
||||||
|
Slice=gitlab.slice
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=gitlab.target
|
19
lib/support/systemd/gitlab-mailroom.service
Normal file
19
lib/support/systemd/gitlab-mailroom.service
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[Unit]
|
||||||
|
Description=GitLab Mailroom
|
||||||
|
PartOf=gitlab.target
|
||||||
|
After=network.target
|
||||||
|
StartLimitIntervalSec=100s
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=git
|
||||||
|
WorkingDirectory=/home/git/gitlab
|
||||||
|
Environment=RAILS_ENV=production
|
||||||
|
ExecStart=/usr/local/bin/bundle exec mail_room --log-exit-as json --quiet --config /home/git/gitlab/config/mail_room.yml
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=1
|
||||||
|
SyslogIdentifier=gitlab-mailroom
|
||||||
|
Slice=gitlab.slice
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=gitlab.target
|
19
lib/support/systemd/gitlab-pages.service
Normal file
19
lib/support/systemd/gitlab-pages.service
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[Unit]
|
||||||
|
Description=GitLab Pages
|
||||||
|
ReloadPropagatedFrom=gitlab.target
|
||||||
|
PartOf=gitlab.target
|
||||||
|
After=network.target gitlab-puma.service
|
||||||
|
Wants=gitlab-puma.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=git
|
||||||
|
WorkingDirectory=/home/git/gitlab
|
||||||
|
ExecStart=/home/git/gitlab-pages/gitlab-pages -config /home/git/gitlab-pages/gitlab-pages.conf
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=1
|
||||||
|
SyslogIdentifier=gitlab-pages
|
||||||
|
Slice=gitlab.slice
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=gitlab.target
|
26
lib/support/systemd/gitlab-puma.service
Normal file
26
lib/support/systemd/gitlab-puma.service
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
[Unit]
|
||||||
|
Description=GitLab
|
||||||
|
Conflicts=gitlab.service
|
||||||
|
ReloadPropagatedFrom=gitlab.target
|
||||||
|
PartOf=gitlab.target
|
||||||
|
After=network.target
|
||||||
|
StartLimitIntervalSec=100s
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
User=git
|
||||||
|
WorkingDirectory=/home/git/gitlab
|
||||||
|
Environment=RAILS_ENV=production
|
||||||
|
ExecStart=/usr/local/bin/bundle exec puma --config /home/git/gitlab/config/puma.rb --environment production --pidfile /home/git/gitlab/tmp/pids/puma.pid
|
||||||
|
ExecReload=/usr/bin/kill -USR2 $MAINPID
|
||||||
|
PIDFile=/home/git/gitlab/tmp/pids/puma.pid
|
||||||
|
# puma can be slow to start
|
||||||
|
TimeoutStartSec=120
|
||||||
|
WatchdogSec=10
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=1
|
||||||
|
SyslogIdentifier=gitlab-puma
|
||||||
|
Slice=gitlab.slice
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=gitlab.target
|
22
lib/support/systemd/gitlab-sidekiq.service
Normal file
22
lib/support/systemd/gitlab-sidekiq.service
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
[Unit]
|
||||||
|
Description=GitLab Sidekiq
|
||||||
|
ReloadPropagatedFrom=gitlab.target
|
||||||
|
PartOf=gitlab.target
|
||||||
|
After=network.target
|
||||||
|
JoinsNamespaceOf=gitlab-puma.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=git
|
||||||
|
WorkingDirectory=/home/git/gitlab
|
||||||
|
Environment=RAILS_ENV=production
|
||||||
|
ExecStart=/usr/local/bin/bundle exec sidekiq --config /home/git/gitlab/config/sidekiq_queues.yml --environment production
|
||||||
|
ExecStop=/usr/local/bin/bundle exec sidekiqctl stop /run/gitlab/sidekiq.pid
|
||||||
|
PIDFile=/home/git/gitlab/tmp/pids/sidekiq.pid
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=1
|
||||||
|
SyslogIdentifier=gitlab-sidekiq
|
||||||
|
Slice=gitlab.slice
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=gitlab.target
|
21
lib/support/systemd/gitlab-workhorse.service
Normal file
21
lib/support/systemd/gitlab-workhorse.service
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[Unit]
|
||||||
|
Description=GitLab Workhorse
|
||||||
|
ReloadPropagatedFrom=gitlab.target
|
||||||
|
PartOf=gitlab.target
|
||||||
|
After=network.target gitlab-puma.service
|
||||||
|
Wants=gitlab-puma.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=git
|
||||||
|
WorkingDirectory=/home/git/gitlab
|
||||||
|
Environment=PATH=/home/git/gitlab-workhorse:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
|
ExecStart=/home/git/gitlab-workhorse/gitlab-workhorse -listenUmask 0 -listenNetwork unix -listenAddr /home/git/gitlab/tmp/sockets/gitlab-workhorse.socket -authBackend http://127.0.0.1:8080 -authSocket /home/git/gitlab/tmp/sockets/gitlab.socket -documentRoot /home/git/gitlab/public -secretPath /home/git/gitlab/.gitlab_workhorse_secret
|
||||||
|
ExecReload=/usr/bin/kill -USR2 $MAINPID
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=1
|
||||||
|
SyslogIdentifier=gitlab-workhorse
|
||||||
|
Slice=gitlab.slice
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=gitlab.target
|
8
lib/support/systemd/gitlab.slice
Normal file
8
lib/support/systemd/gitlab.slice
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Slice to bundle all GitLab services
|
||||||
|
Before=slices.target
|
||||||
|
|
||||||
|
[Slice]
|
||||||
|
MemoryAccounting=true
|
||||||
|
IOAccounting=true
|
||||||
|
CPUAccounting=true
|
6
lib/support/systemd/gitlab.target
Normal file
6
lib/support/systemd/gitlab.target
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[Unit]
|
||||||
|
Description=GitLab
|
||||||
|
Wants=gitlab-gitaly.service gitlab-puma.service gitlab-sidekiq.service gitlab-workhorse.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -1,29 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module SystemCheck
|
|
||||||
module App
|
|
||||||
class InitScriptExistsCheck < SystemCheck::BaseCheck
|
|
||||||
set_name 'Init script exists?'
|
|
||||||
set_skip_reason 'skipped (omnibus-gitlab has no init script)'
|
|
||||||
|
|
||||||
def skip?
|
|
||||||
omnibus_gitlab?
|
|
||||||
end
|
|
||||||
|
|
||||||
def check?
|
|
||||||
script_path = '/etc/init.d/gitlab'
|
|
||||||
File.exist?(script_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_error
|
|
||||||
try_fixing_it(
|
|
||||||
'Install the init script'
|
|
||||||
)
|
|
||||||
for_more_information(
|
|
||||||
see_installation_guide_section('Install Init Script')
|
|
||||||
)
|
|
||||||
fix_and_rerun
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,47 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module SystemCheck
|
|
||||||
module App
|
|
||||||
class InitScriptUpToDateCheck < SystemCheck::BaseCheck
|
|
||||||
SCRIPT_PATH = '/etc/init.d/gitlab'
|
|
||||||
|
|
||||||
set_name 'Init script up-to-date?'
|
|
||||||
set_skip_reason 'skipped (omnibus-gitlab has no init script)'
|
|
||||||
|
|
||||||
def skip?
|
|
||||||
return true if omnibus_gitlab?
|
|
||||||
|
|
||||||
unless init_file_exists?
|
|
||||||
self.skip_reason = "can't check because of previous errors"
|
|
||||||
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def check?
|
|
||||||
recipe_path = Rails.root.join('lib/support/init.d/', 'gitlab')
|
|
||||||
|
|
||||||
recipe_content = File.read(recipe_path)
|
|
||||||
script_content = File.read(SCRIPT_PATH)
|
|
||||||
|
|
||||||
recipe_content == script_content
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_error
|
|
||||||
try_fixing_it(
|
|
||||||
'Re-download the init script'
|
|
||||||
)
|
|
||||||
for_more_information(
|
|
||||||
see_installation_guide_section('Install Init Script')
|
|
||||||
)
|
|
||||||
fix_and_rerun
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def init_file_exists?
|
|
||||||
File.exist?(SCRIPT_PATH)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module SystemCheck
|
||||||
|
module App
|
||||||
|
class SystemdUnitFilesOrInitScriptExistCheck < SystemCheck::BaseCheck
|
||||||
|
set_name 'Systemd unit files or init script exist?'
|
||||||
|
set_skip_reason 'skipped (omnibus-gitlab has neither init script nor systemd units)'
|
||||||
|
|
||||||
|
def skip?
|
||||||
|
omnibus_gitlab?
|
||||||
|
end
|
||||||
|
|
||||||
|
def check?
|
||||||
|
unit_paths = [
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-gitaly.service',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-mailroom.service',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-puma.service',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-sidekiq.service',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab.slice',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab.target',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-workhorse.service'
|
||||||
|
]
|
||||||
|
script_path = '/etc/init.d/gitlab'
|
||||||
|
|
||||||
|
unit_paths.all? { |s| File.exist?(s) } || File.exist?(script_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_error
|
||||||
|
try_fixing_it(
|
||||||
|
'Install the Service'
|
||||||
|
)
|
||||||
|
for_more_information(
|
||||||
|
see_installation_guide_section('Install the Service')
|
||||||
|
)
|
||||||
|
fix_and_rerun
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,80 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module SystemCheck
|
||||||
|
module App
|
||||||
|
class SystemdUnitFilesOrInitScriptUpToDateCheck < SystemCheck::BaseCheck
|
||||||
|
SCRIPT_PATH = '/etc/init.d/gitlab'
|
||||||
|
UNIT_PATHS = [
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-gitaly.service',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-mailroom.service',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-puma.service',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-sidekiq.service',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab.slice',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab.target',
|
||||||
|
'/usr/local/lib/systemd/system/gitlab-workhorse.service'
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
set_name 'Systemd unit files or init script up-to-date?'
|
||||||
|
set_skip_reason 'skipped (omnibus-gitlab has neither init script nor systemd units)'
|
||||||
|
|
||||||
|
def skip?
|
||||||
|
return true if omnibus_gitlab?
|
||||||
|
|
||||||
|
unless unit_files_exist? || init_file_exists?
|
||||||
|
self.skip_reason = "can't check because of previous errors"
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def check?
|
||||||
|
if unit_files_exist?
|
||||||
|
return unit_files_up_to_date?
|
||||||
|
end
|
||||||
|
|
||||||
|
init_file_up_to_date?
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_error
|
||||||
|
try_fixing_it(
|
||||||
|
'Install the Service'
|
||||||
|
)
|
||||||
|
for_more_information(
|
||||||
|
see_installation_guide_section('Install the Service')
|
||||||
|
)
|
||||||
|
fix_and_rerun
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def init_file_exists?
|
||||||
|
File.exist?(SCRIPT_PATH)
|
||||||
|
end
|
||||||
|
|
||||||
|
def unit_files_exist?
|
||||||
|
UNIT_PATHS.all? { |s| File.exist?(s) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def init_file_up_to_date?
|
||||||
|
recipe_path = Rails.root.join('lib/support/init.d/', 'gitlab')
|
||||||
|
|
||||||
|
recipe_content = File.read(recipe_path)
|
||||||
|
script_content = File.read(SCRIPT_PATH)
|
||||||
|
|
||||||
|
recipe_content == script_content
|
||||||
|
end
|
||||||
|
|
||||||
|
def unit_files_up_to_date?
|
||||||
|
UNIT_PATHS.all? do |unit|
|
||||||
|
unit_name = File.basename(unit)
|
||||||
|
recipe_path = Rails.root.join('lib/support/systemd/', unit_name)
|
||||||
|
|
||||||
|
recipe_content = File.read(recipe_path)
|
||||||
|
unit_content = File.read(unit)
|
||||||
|
|
||||||
|
recipe_content == unit_content
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,20 +2,21 @@
|
||||||
|
|
||||||
module SystemCheck
|
module SystemCheck
|
||||||
module IncomingEmail
|
module IncomingEmail
|
||||||
class InitdConfiguredCheck < SystemCheck::BaseCheck
|
class MailRoomEnabledCheck < SystemCheck::BaseCheck
|
||||||
set_name 'Init.d configured correctly?'
|
include ::SystemCheck::InitHelpers
|
||||||
|
set_name 'Mailroom enabled?'
|
||||||
|
|
||||||
def skip?
|
def skip?
|
||||||
omnibus_gitlab?
|
omnibus_gitlab?
|
||||||
end
|
end
|
||||||
|
|
||||||
def check?
|
def check?
|
||||||
mail_room_configured?
|
mail_room_enabled? || mail_room_configured?
|
||||||
end
|
end
|
||||||
|
|
||||||
def show_error
|
def show_error
|
||||||
try_fixing_it(
|
try_fixing_it(
|
||||||
'Enable mail_room in the init.d configuration.'
|
'Enable mail_room'
|
||||||
)
|
)
|
||||||
for_more_information(
|
for_more_information(
|
||||||
'doc/administration/reply_by_email.md'
|
'doc/administration/reply_by_email.md'
|
||||||
|
@ -25,6 +26,13 @@ module SystemCheck
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def mail_room_enabled?
|
||||||
|
target = '/usr/local/lib/systemd/system/gitlab.target'
|
||||||
|
service = '/usr/local/lib/systemd/system/gitlab-mailroom.service'
|
||||||
|
|
||||||
|
File.exist?(target) && File.exist?(service) && systemd_get_wants('gitlab.target').include?("gitlab-mailroom.service")
|
||||||
|
end
|
||||||
|
|
||||||
def mail_room_configured?
|
def mail_room_configured?
|
||||||
path = '/etc/default/gitlab'
|
path = '/etc/default/gitlab'
|
||||||
File.exist?(path) && File.read(path).include?('mail_room_enabled=true')
|
File.exist?(path) && File.read(path).include?('mail_room_enabled=true')
|
|
@ -3,12 +3,13 @@
|
||||||
module SystemCheck
|
module SystemCheck
|
||||||
module IncomingEmail
|
module IncomingEmail
|
||||||
class MailRoomRunningCheck < SystemCheck::BaseCheck
|
class MailRoomRunningCheck < SystemCheck::BaseCheck
|
||||||
|
include ::SystemCheck::InitHelpers
|
||||||
set_name 'MailRoom running?'
|
set_name 'MailRoom running?'
|
||||||
|
|
||||||
def skip?
|
def skip?
|
||||||
return true if omnibus_gitlab?
|
return true if omnibus_gitlab?
|
||||||
|
|
||||||
unless mail_room_configured?
|
unless mail_room_enabled? || mail_room_configured?
|
||||||
self.skip_reason = "can't check because of previous errors"
|
self.skip_reason = "can't check because of previous errors"
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
@ -20,10 +21,10 @@ module SystemCheck
|
||||||
|
|
||||||
def show_error
|
def show_error
|
||||||
try_fixing_it(
|
try_fixing_it(
|
||||||
sudo_gitlab('RAILS_ENV=production bin/mail_room start')
|
'Start mail_room'
|
||||||
)
|
)
|
||||||
for_more_information(
|
for_more_information(
|
||||||
see_installation_guide_section('Install Init Script'),
|
'doc/administration/incoming_email.md',
|
||||||
'see log/mail_room.log for possible errors'
|
'see log/mail_room.log for possible errors'
|
||||||
)
|
)
|
||||||
fix_and_rerun
|
fix_and_rerun
|
||||||
|
@ -31,6 +32,13 @@ module SystemCheck
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def mail_room_enabled?
|
||||||
|
target = '/usr/local/lib/systemd/system/gitlab.target'
|
||||||
|
service = '/usr/local/lib/systemd/system/gitlab-mailroom.service'
|
||||||
|
|
||||||
|
File.exist?(target) && File.exist?(service) && systemd_get_wants('gitlab.target').include?("gitlab-mailroom.service")
|
||||||
|
end
|
||||||
|
|
||||||
def mail_room_configured?
|
def mail_room_configured?
|
||||||
path = '/etc/default/gitlab'
|
path = '/etc/default/gitlab'
|
||||||
File.exist?(path) && File.read(path).include?('mail_room_enabled=true')
|
File.exist?(path) && File.read(path).include?('mail_room_enabled=true')
|
||||||
|
|
|
@ -14,7 +14,7 @@ module SystemCheck
|
||||||
end
|
end
|
||||||
|
|
||||||
if Rails.env.production?
|
if Rails.env.production?
|
||||||
checks << SystemCheck::IncomingEmail::InitdConfiguredCheck
|
checks << SystemCheck::IncomingEmail::MailRoomEnabledCheck
|
||||||
checks << SystemCheck::IncomingEmail::MailRoomRunningCheck
|
checks << SystemCheck::IncomingEmail::MailRoomRunningCheck
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
24
lib/system_check/init_helpers.rb
Normal file
24
lib/system_check/init_helpers.rb
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'open3'
|
||||||
|
|
||||||
|
module SystemCheck
|
||||||
|
module InitHelpers
|
||||||
|
# Return the Wants= of a unit, empty if the unit doesn't exist
|
||||||
|
def systemd_get_wants(unitname)
|
||||||
|
stdout, _stderr, status = Open3.capture3("systemctl", "--no-pager", "show", unitname)
|
||||||
|
|
||||||
|
unless status
|
||||||
|
return []
|
||||||
|
end
|
||||||
|
|
||||||
|
wantsline = stdout.lines.find { |line| line.start_with?("Wants=") }
|
||||||
|
|
||||||
|
unless wantsline
|
||||||
|
return []
|
||||||
|
end
|
||||||
|
|
||||||
|
wantsline.delete_prefix("Wants=").strip.split
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -23,8 +23,8 @@ module SystemCheck
|
||||||
SystemCheck::App::UploadsDirectoryExistsCheck,
|
SystemCheck::App::UploadsDirectoryExistsCheck,
|
||||||
SystemCheck::App::UploadsPathPermissionCheck,
|
SystemCheck::App::UploadsPathPermissionCheck,
|
||||||
SystemCheck::App::UploadsPathTmpPermissionCheck,
|
SystemCheck::App::UploadsPathTmpPermissionCheck,
|
||||||
SystemCheck::App::InitScriptExistsCheck,
|
SystemCheck::App::SystemdUnitFilesOrInitScriptExistCheck,
|
||||||
SystemCheck::App::InitScriptUpToDateCheck,
|
SystemCheck::App::SystemdUnitFilesOrInitScriptUpToDateCheck,
|
||||||
SystemCheck::App::ProjectsHaveNamespaceCheck,
|
SystemCheck::App::ProjectsHaveNamespaceCheck,
|
||||||
SystemCheck::App::RedisVersionCheck,
|
SystemCheck::App::RedisVersionCheck,
|
||||||
SystemCheck::App::RubyVersionCheck,
|
SystemCheck::App::RubyVersionCheck,
|
||||||
|
|
|
@ -39,6 +39,12 @@ module SystemCheck
|
||||||
|
|
||||||
if (cluster_count == 1 && worker_count > 0) || (cluster_count == 0 && worker_count == 1)
|
if (cluster_count == 1 && worker_count > 0) || (cluster_count == 0 && worker_count == 1)
|
||||||
$stdout.puts "#{cluster_count}/#{worker_count}".color(:green)
|
$stdout.puts "#{cluster_count}/#{worker_count}".color(:green)
|
||||||
|
elsif File.symlink?('/run/systemd/units/invocation:gitlab-sidekiq.service')
|
||||||
|
$stdout.puts "#{cluster_count}/#{worker_count}".color(:red)
|
||||||
|
try_fixing_it(
|
||||||
|
'sudo systemctl restart gitlab-sidekiq.service'
|
||||||
|
)
|
||||||
|
fix_and_rerun
|
||||||
else
|
else
|
||||||
$stdout.puts "#{cluster_count}/#{worker_count}".color(:red)
|
$stdout.puts "#{cluster_count}/#{worker_count}".color(:red)
|
||||||
try_fixing_it(
|
try_fixing_it(
|
||||||
|
|
|
@ -126,7 +126,7 @@ class SchemaRegenerator
|
||||||
# In order to properly reset the database and re-run migrations
|
# In order to properly reset the database and re-run migrations
|
||||||
# the schema migrations for new migrations must be removed.
|
# the schema migrations for new migrations must be removed.
|
||||||
def remove_schema_migration_files
|
def remove_schema_migration_files
|
||||||
(untracked_schema_migrations + commited_schema_migrations).each do |schema_migration|
|
(untracked_schema_migrations + committed_schema_migrations).each do |schema_migration|
|
||||||
FileUtils.rm(schema_migration)
|
FileUtils.rm(schema_migration)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -144,7 +144,7 @@ class SchemaRegenerator
|
||||||
# List of untracked schema migrations
|
# List of untracked schema migrations
|
||||||
#
|
#
|
||||||
# Get a list of schema migrations that have been committed since the last
|
# Get a list of schema migrations that have been committed since the last
|
||||||
def commited_schema_migrations
|
def committed_schema_migrations
|
||||||
git_command = "git diff --name-only --diff-filter=A #{merge_base} -- #{SCHEMA_MIGRATIONS_DIR}"
|
git_command = "git diff --name-only --diff-filter=A #{merge_base} -- #{SCHEMA_MIGRATIONS_DIR}"
|
||||||
run(git_command).chomp.split("\n")
|
run(git_command).chomp.split("\n")
|
||||||
end
|
end
|
||||||
|
|
|
@ -86,12 +86,12 @@ describe('Multi-file store mutations', () => {
|
||||||
mutations.SET_EMPTY_STATE_SVGS(localState, {
|
mutations.SET_EMPTY_STATE_SVGS(localState, {
|
||||||
emptyStateSvgPath: 'emptyState',
|
emptyStateSvgPath: 'emptyState',
|
||||||
noChangesStateSvgPath: 'noChanges',
|
noChangesStateSvgPath: 'noChanges',
|
||||||
committedStateSvgPath: 'commited',
|
committedStateSvgPath: 'committed',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(localState.emptyStateSvgPath).toBe('emptyState');
|
expect(localState.emptyStateSvgPath).toBe('emptyState');
|
||||||
expect(localState.noChangesStateSvgPath).toBe('noChanges');
|
expect(localState.noChangesStateSvgPath).toBe('noChanges');
|
||||||
expect(localState.committedStateSvgPath).toBe('commited');
|
expect(localState.committedStateSvgPath).toBe('committed');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -408,7 +408,7 @@ describe('Dashboard', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when all requests have been commited by the store', () => {
|
describe('when all requests have been committed by the store', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
|
store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
|
||||||
currentEnvironmentName: 'production',
|
currentEnvironmentName: 'production',
|
||||||
|
|
|
@ -28,7 +28,7 @@ RSpec.describe SystemCheck::IncomingEmailCheck do
|
||||||
it 'runs IMAP and mailroom checks' do
|
it 'runs IMAP and mailroom checks' do
|
||||||
expect(SystemCheck).to receive(:run).with('Reply by email', [
|
expect(SystemCheck).to receive(:run).with('Reply by email', [
|
||||||
SystemCheck::IncomingEmail::ImapAuthenticationCheck,
|
SystemCheck::IncomingEmail::ImapAuthenticationCheck,
|
||||||
SystemCheck::IncomingEmail::InitdConfiguredCheck,
|
SystemCheck::IncomingEmail::MailRoomEnabledCheck,
|
||||||
SystemCheck::IncomingEmail::MailRoomRunningCheck
|
SystemCheck::IncomingEmail::MailRoomRunningCheck
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ RSpec.describe SystemCheck::IncomingEmailCheck do
|
||||||
|
|
||||||
it 'runs mailroom checks' do
|
it 'runs mailroom checks' do
|
||||||
expect(SystemCheck).to receive(:run).with('Reply by email', [
|
expect(SystemCheck).to receive(:run).with('Reply by email', [
|
||||||
SystemCheck::IncomingEmail::InitdConfiguredCheck,
|
SystemCheck::IncomingEmail::MailRoomEnabledCheck,
|
||||||
SystemCheck::IncomingEmail::MailRoomRunningCheck
|
SystemCheck::IncomingEmail::MailRoomRunningCheck
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue