Перейти к основному содержимому

Установка Nginx Proxy Manager

· 1 мин. чтения
Дмитрий Киверин
Дикий программист

1. Разрешить порты 80, 81, 443, 22

sudo ufw allow 80,81,443,22/tcp

2. Включить брандмауэр и добавить его в автозагрузку

sudo ufw enable
sudo systemctl enable ufw

3. Обновить систему

sudo apt update && sudo apt upgrade -y

4. Установить Docker

sudo apt install docker-compose -y

5. Создать файл docker-compose.yml

Переключиться на пользователя root

sudo -i

Создать директорию npm

mkdir npm

Перейти в директорию

cd /root/npm

Открыть файл для редактирования

nano docker-compose.yml

Вставить в файл следующее содержимое


version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./dаta:/data
- ./letsencrypt:/etc/letsencrypt

6. Запустить контейнер

docker-compose up -d

Nginx Proxy Manager находится по адресу: ip машины: 81

email:

admin@example.com

password:

changeme

Установка GitLab на Ubuntu 22.04

· 2 мин. чтения
Дмитрий Киверин
Дикий программист

Установить зависимости

1. Обновить пакеты

sudo apt upgrade

2. Установить зависимости

sudo apt-get install -y curl openssh-server ca-certificates tzdata perl

3. Установить сервер Postfix

sudo apt-get install -y postfix

Во время инсталляции программы в открывшемся окне необходимо выбрать «Интернет-сайт», как показано на рисунке ниже.

Настройка Postfix

Если окно не появляется удалить Postfix

apt-get --purge remove postfix postfix-mysql dovecot-core dovecot-common dovecot-imapd dovecot-pop3d

повторить установку

Установить GitLab

1. Загрузить необходимый скрипт

cd ../../tmp
curl -LO https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh

Для просмотра скрипта использовать команду

sudo nano /tmp/script.deb.sh

2. Запустить скрипт

sudo bash /tmp/script.deb.sh

3. Установить GitLab

sudo apt install gitlab-ce

Настрить брандмауэр

1. Чтобы просмотреть список установленных профилей, выполнить команду

sudo ufw app list

2. Включить SSH

sudo ufw allow OpenSSH

3. Включить порт 80

sudo ufw allow http

4. Включить порт 443

sudo ufw allow https

3. Активировать брандмауэр

sudo ufw enable

Настроить конфигурацию

sudo nano /etc/gitlab/gitlab.rb

В строке external_url ввести реальное имя домена **external_url 'https://wildmemo.ru'**

Раскоментировать строку letsencrypt['contact_emails'] = ['admin@mail.com'] и добавить реальный адрес почты

Переконфигурировать приложение

sudo gitlab-ctl reconfigure
Внимание !

Логин: **root**

Пароль администратора для первого входа можно посмотреть в файле

/etc/gitlab/initial_root_password

После первого входа в приложение следует:

  1. изменить пароль для пользователя root

  2. запретить регистрацию пользователей

  3. включить сборщик мусора для container registry

открыть файл

sudo nano /etc/cron.d/registry-garbage-collect

Добавить

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin


# Run every Sunday at 04:05am
4 * * 0 root gitlab-ctl registry-garbage-collect

Установка Nextcloud на Ubuntu 24.04

· 4 мин. чтения
Дмитрий Киверин
Дикий программист

В этой инструкции приведено пошаговое руководство по установке и настройке Nextcloud на Ubuntu 22.04, включая настройку MariaDB, Apache и обеспечение безопасности сервера с помощью SSL-сертификата.

Для установки и настройки Nextcloud на Ubuntu 22.04 вам понадобится:

сервер Ubuntu 22.04 с корневым доступом; доменное имя, указывающее на IP-адрес вашего сервера; базовые знания командной строки Linux. Что такое Nextcloud? Nextcloud — это платформа для хостинга файлов и совместной работы с открытым исходным кодом. Nextcloud позволяет хранить, синхронизировать и обмениваться файлами и данными между различными устройствами и пользователями. Платформа представляет собой альтернативу коммерческим облачным сервисам хранения данных, позволяя контролировать данные и управлять собственным частным облачным сервером.

Установка и настройка Nextcloud Шаг 1: Обновление и модернизация

Войдите на сервер Ubuntu, обновите списки пакетов и существующие пакеты, выполнив следующие команды:

sudo apt update

sudo apt upgrade

Шаг 2: Установка Apache

Установите веб-сервер Apache, выполнив следующую команду:

sudo apt install apache2

Шаг 3: Установить MariaDB

Установите систему управления реляционными базами данных MariaDB, выполнив следующую команду:

sudo apt install mariadb-server

В процессе установки вам будет предложено задать пароль root. Обязательно выберите надежный пароль и запомните его на будущее.

Шаг 4: Защита MariaDB

Для защиты установки MariaDB выполните следующую команду:

sudo mysql_secure_installation

Вам будет предложено ввести пароль root, заданный во время установки. Следуйте подсказкам на экране.

Шаг 5: Установка PHP и необходимых расширений.

Установите PHP и необходимые расширения для Nextcloud, выполнив команду:

sudo apt install php libapache2-mod-php php-mysql php-curl php-gd php-xml php-mbstring php-zip php-intl php-ldap php-apcu

Шаг 6: Настройка Apache.

Включите необходимые модули Apache и настройте параметры конфигурации:

sudo a2enmod rewrite

sudo a2enmod headers

sudo a2enmod env

sudo a2enmod dir

sudo a2enmod mime

sudo systemctl restart apache2

Шаг 7: Создание базы данных для Nextcloud.

Войдите в MariaDB от имени пользователя root:

sudo mysql -u root -p

Создайте новую базу данных для Nextcloud:

CREATE DATABASE nextcloud;

Создайте нового пользователя и предоставьте привилегии базе данных Nextcloud:

CREATE USER ‘nextclouduser’@’localhost’ IDENTIFIED BY ‘your_password’;

GRANT ALL PRIVILEGES ON nextcloud.* TO ‘nextclouduser’@’localhost’;

FLUSH PRIVILEGES;

EXIT;

Обязательно замените “your_password” на надежный пароль.

Шаг 8: Загрузка и установка Nextcloud.

Перейдите в корневой каталог веб-сервера Apache:

cd /var/www/html

Загрузите последнюю стабильную версию Nextcloud с помощью wget:

sudo wget https://download.nextcloud.com/server/releases/latest.tar.bz2

Распакуйте загруженный архив:

sudo tar -xvf latest.tar.bz2

Смените права собственности на извлеченные файлы на права пользователя Apache:

sudo chown -R www-data:www-data nextcloud

Шаг 9: Настройка виртуального хоста Apache.

Создайте новый конфигурационный файл Apache для Nextcloud:

sudo nano /etc/apache2/sites-available/nextcloud.conf

Добавьте в файл следующее содержимое:

<VirtualHost *:80>

ServerAdmin admin@example.com

DocumentRoot /var/www/html/nextcloud/

ServerName your_domain

Alias /nextcloud «/var/www/html/nextcloud/»

<Directory /var/www/html/nextcloud/>

Options +FollowSymlinks

AllowOverride All

Require all granted

Satisfy Any

</Directory>

<IfModule mod_headers.c>

Заголовок всегда устанавливается Strict-Transport-Security «max-age=15552000; includeSubDomains»

</IfModule>

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Замените “admin@example.com” на ваш адрес электронной почты, “your_domain” — на ваше реальное доменное имя.

Включите виртуальный хост:

sudo a2ensite nextcloud.conf

Отключите виртуальный хост Apache по умолчанию:

sudo a2dissite 000-default.conf

Перезапустите Apache, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Шаг 10: Доступ к Nextcloud и завершение установки.

Откройте веб-браузер и введите доменное имя вашего сервера (например, http://your_domain/nextcloud). Должна появиться страница установки Nextcloud.

Следуйте инструкциям на экране для завершения установки. При появлении запроса введите данные базы данных MariaDB:

Пользователь базы данных: nextclouduser.

Пароль базы данных, заданный на шаге 7.

Имя базы данных: nextcloud

Хост базы данных: localhost.

Продолжите оставшиеся шаги установки, включая создание учетной записи администратора и указание местоположения папки с данными. Теперь вы можете начать использовать Nextcloud для хранения и управления своими файлами.

Настройка Ubuntu Server 22.04

· 2 мин. чтения
Дмитрий Киверин
Дикий программист

После создания нового сервера Ubuntu 22.04 необходимо выполнить несколько важных шагов для его начальной настройки.

Настройка OpenSSH

Для удобства работы с сервером следует установить и настроить OpenSSH server.

1. Обновить систему

sudo apt update

2. Установить SSH

sudo apt-get install ssh

3. Установить OpenSSH

sudo apt install openssh-server

4. Добавить пакет SSH-сервера в автозагрузку

sudo systemctl enable ssh

5. Отредактировать конфигурационный

Так пользователей, кроме root еще нет, следует разрешить ему доступ SSH по паролю

Открыть конфигурационный файл

nano /etc/ssh/sshd_config

Раскоментировать строку PermitRootLogin ..... и изменить на PermitRootLogin yes

6. Запустить или перезапустить службу sshd

sudo systemctl start sshd

или

sudo systemctl restart sshd

7. Проверить статус

sudo sytemctl status sshd

Создать нового пользователя

1. Создать пользователя

sudo adduser webuser

При выполнении команды дважды ввести пароль.

Остальные вопросы являются дополнительной информацией и на них можно не отвечать

2. Предоставить временные административные привилегии

usermod -aG sudo webuser

3. Отключить доступ по SSH пользователю root

Открыть конфигурационный файл

nano /etc/ssh/sshd_config

Закоментировать PermitRootLogin yes

Перезапустить службу sshd

sudo systemctl start sshd

Настрить брандмауэр

1. Чтобы просмотреть список установленных профилей, выполнить команду

sudo ufw app list

2. Включить SSH

sudo ufw allow OpenSSH

3. Активировать брандмауэр

sudo ufw enable

Настроить время на сервере

1. Проверить текущее время на сервере

date

2. Посмотреть доступные часовые пояса

timedatectl list-timezones

3. Установить часовой пояс

sudo timedatectl set-timezone Europe/Moscow

4. Установить NTP

sudo apt install ntp

добавить его в загрузку

sudo systemctl enable ntp

Настройка CI/CD в GitLab

· 3 мин. чтения
Дмитрий Киверин
Дикий программист

Для выполнения каких-либо заданий в рамках пайплайна CI/CD GitLab’у требуется раннер, на котором он будет выполнять работу. Подойдёт вариант с отдельной ВМ, на которой будут выполняться все работы. Характеристика машины:

  • 2 ядра CPU
  • 4 ГБ RAM
  • 40 ГБ свободного места
  • ОС Ubuntu 22.04 LTS.

На машине должны быть установлены:

  • Bash
  • Git версии 2.18.0 или выше
  • GPG
  • Docker Engine

Подготовка программного окружения на машине

1. Установить Git

sudo apt install git

2. Установить GPG

sudo apt install gpg

3. Установить Docker Engine

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

Добавить GPG-ключ для проверки подписей устанавливаемых пакетов

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Подключить новый репозиторий:

  echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновить патекы

sudo apt-get update

Установить Docker Engine

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Проверить работу

sudo docker run hello-world

Установить Node.js, yarn

1. Установить curl

sudo apt install curl

2. Загрузить скрипт

curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash

3. Перезагрузить оболочку

source ~/.bashrc

4. Получить список доступных версий

nvm list-remote

5. Установить нужную версию

nvm install [version.number]

6. Проверить установленные версии

node -v && npm -v

7. Импортировать ключ репозитория

 curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -

8. Обновить список пакетов

sudo apt update

9. Установить yarn

sudo apt install yarn

Установка, настройка и подключение GitLab Runner

  1. Создать новый проект или выбрать созданный на сервере GitLab
  2. Перейти в меню Settings -> CI/CD. Открыть Runners и нажать Create project runner
  3. На открывшейся странице добавить tag и нажать Crate runner
  4. На странице регистрации скопировать команду Регистрация руннера
  5. Перейти на виртуальную машину и выполнить скопированную команду
  6. Для проверки регистрации выполнить команду
gitlab-runner run

SSH подключение к удаленному серверу

  1. Создать ключи.

    ssh-keygen -t ed25519 -C "комментарий к ключу"
  2. Создать на удаленном сервере файл с ключом.

  • На удаленном сервере перейти в домашний каталог нужного пользователя: cd /home/user (замените user на имя пользователя).
  • Если файла ~/.ssh/authorized_keys нет, создайть его: mkdir -p ~/.ssh/ && touch ~/.ssh/authorized_keys.
  • Записать содержимое открытого ключа (например, из файла ~/.ssh/user_key_name.pub) в файл ~/.ssh/authorized_keys. Для этого можно использовать команду: echo "$(cat ~/.ssh/user_key_name.pub)" >> ~/.ssh/authorized_keys.
  • Убедится, что файл ~/.ssh/authorized_keys имеет правильные права доступа: chmod 600 ~/.ssh/authorized_keys. Убедитесь, что каталог .ssh имеет правильные права доступа: chmod 700 ~/.ssh.

Установить rsync

sudo apt install rsync

Проверить копирование директории на удаленный сервер

touch test.txt
rsync -a test.txt <логин_пользователя>@<IP_адрес_сервера>:/<каталог_на_сервере>

Создать Pipeline

Добавить в проект GitLab файл .gitlab.ci.yml с содержимым:

image: node:18-alpine3.20

stages:
- test
- deploy

test:
stage: test
script:
- yarn install
- yarn build
rules:
- if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH

create-pages:
stage: deploy
script:
- yarn install
- yarn build
- cp -r ./build /home/runuser/public/
- rsync -zr /home/runuser/public/ gitlab-runner@192.168.1.159:/www/wwwroot/wildnotes.ru
- rm -r /home/runuser/public/
pages: true
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH

Установка Proxmox

· 3 мин. чтения
Дмитрий Киверин
Дикий программист

Создание загрузочного диска

Скачать программу Ventoy из официального репозитория

Распаковать архив и запустить файл Ventoy2disk

В меню Option -> Partition Style выбрать GPT

В строке Device выбрать диск и нажать Install

После создания загрузочного диска скопировать на него образ iso c Proxmox, скачанный с официального сайта

Установка Proxmox VE

Выбрать в BIOS созданный диск в качестве загрузочного

После установки Proxmox его следует настроить

Настройка Proxmox

Информация

Для быстрой настройки Proxmox можно использовать готовые скрипты, которые находятся по адресу:

https://community-scripts.github.io/ProxmoxVE/

Редактирование списка источников

Открыть файл со списком репозиториев

nano /etc/apt/sources.list

Добавить внизу строки:

# Proxmox VE pve-no-subscription repository provided by proxmox.com
# NOT recommended for production use
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
# Security updates
deb http://security.debian.org/debian-security bookworm-security main contrib

Сохранить изменения и закрыть файл

ctrl+S
ctrl+X

Отключение производственного репозитория

Открыть файл pve-enterprise.list:

nano /etc/apt/sources.list.d/pve-enterprise.list

Закомментировать строку:

#deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise
ctrl+S 
ctrl+X

Настройка Ceph для работы без подписки

Открыть файл репозитория Ceph:

nano /etc/apt/sources.list.d/ceph.list

Закомментировать корпоративный репозиторий, добавив символ # перед строкой

#deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise**

Добавить репозиторий без подписки:

deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription
ctrl+S 
ctrl+X

Обновить систему

sudo apt-get update && apt-get upgrade -y

Перезагрузить машину.

reboot

Настройка гипервизора для виртуализации

Если используется загрузчик GRUB, отредактировать файл конфигурации:

nano /etc/default/grub

Для процессоров Intel добавить следующую строку:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pt=on"

Для процессоров AMD добавить:

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on pt=on"

Обновить GRUB.

update-grub

Если загрузчик cmdline, то отредактировать файл конфигурации

nano /etc/kernel/cmdline

вставить в конец строки quiet amd_iommu=on iommu=pt

Обновить загрузчик.

proxmox-boot-tool refresh

Перезагрузить машину.

reboot

Добавление модулей

Открыть файл с модулями

nano /etc/modules

Вставить

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd #not necessary if kernel 6.2

Обновить модули

update-initramfs -u -k all

Перезагрузить машину

reboot

Проверить настройки

dmesg | grep -e DMAR -e IOMMU

или

dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

Отключить всплывающее окно «Нет подписки»

Для отключения всплывающего окна ввести команду:

sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

Шпаргалка по Pipelines Gitlab

· 12 мин. чтения
Дмитрий Киверин
Дикий программист

Шаблоны

В данном разделе напишем несколько готовых шаблонов, которые можно взять за основы при написании своего сценария.

Минимальный сценарий

Для небольших заданий, состоящих из пары заданий:

stages:
- build

TASK_NAME:
stage: build
script:
- ./build_script.sh

где:

stages — описание стадий нашего пайплайна. В данном примере, всего одна. TASK_NAME — имя нашей задачи. stage — стадия, к которой относится наше задание. script — набор скриптов для выполнения.

Стандартный цикл при сборке

Обычно, процесс CI/CD включает следующие шаги:

  • Сборка пакета.
  • Тестирование.
  • Доставка.
  • Развертывание.

Для написания такого сценария за основу можно взять шаблон:

stages:
- build
- test
- delivery
- deploy

build-job:
stage: build
script:
- echo "Start build job"
- build-script.sh

test-job:
stage: test
script:
- echo "Start test job"
- test-script.sh

delivery-job:
stage: delivery
script:
- echo "Start delivery job"
- delivery-script.sh

deploy-job:
stage: deploy
script:
- echo "Start deploy job"
- deploy-script.sh

Задания

Опции, которые могут применяться при описании задания. Общий синтаксис:

<TASK_NAME>:
<OPTION1>: ...
<OPTION2>: ...

Мы перечислим лишь часто встречаемые опции. Полный список можно найти в официальной документации.

Stage

https://docs.gitlab.com/ee/ci/yaml/#stages

Опция указывает, к какой стадии относится задание. Например:

stages:
- build
- test

TASK_NAME:
...
stage: build

TASK_NAME:
...
stage: test

Сами же стадии описываются в общей директиве stages.

Также есть две стадии, которые не требуют предварительного определения в stages:

.pre — запускает до выполнения основных заданий конвейера.

.post — выполняется в конце, после выполнения основных заданий нашего пайплайна.

Например:

stages:
- build
- test

getVersion:
stage: .pre
script:
- VERSION=$(cat VERSION_FILE")
- echo "VERSION=${VERSION}" > variables.env
artifacts:
reports:
dotenv: variables.env

в данном примере мы до того, как начнем проходить по всем заданиям сборки, определим переменную с версией, прочивав ее из файла, и передадим артефактом в качестве системной переменной VERSION.

Image

https://docs.gitlab.com/ee/ci/yaml/#image

Задаем имя образа, если наше задание выполняется в контейнере docker:

TASK_NAME:
...
image: debian:11

Services

https://docs.gitlab.com/ci/services/

Позволяет поднять дополнительный контейнер, который будет доступен первому (указанному в Image):

TASK_NAME:
...
image: debian:12
services:
- name: postgres:15
alias: pgdb

в данном примере сборка будет выполняться в контейнере debian. Но дополнительно будет поднят контейнер postgres, который будет доступен по значению директивы alias. Таким образом, если для нашей процедуры CI/CD нужна база данных, к ней можно обратиться по имени pgdb.

Before_script

https://docs.gitlab.com/ee/ci/yaml/#before_script

Данная опция определяет список команд, которые должны выполняться перед опцией script и после получения артефактов.

TASK_NAME:
...
before_script:
- echo "Run before_script"

Script

https://docs.gitlab.com/ee/ci/yaml/#script

Основная часть, где выполняются задания сценария, описана в опции script. Рассмотрим ее подробнее.

1. Описание массива команд. Мы просто перечисляем списком те команды, которые необходимо последовательно выполнить нашему сценарию в конкретной задаче

TASK_NAME:
...
script:
- command1
- command2

2. Длинные команды, разбитые на несколько строк. Нам может потребоваться выполнить команды в виде скрипта (с операторами сравнения, например). В этом случае будет удобна многострочная запись. Ее можно указать разными способами

  • Индикатор | :
TASK_NAME:
...
script:
- |
command_line1
command_line2

для него каждая новая строка является переходом к новой команде или части оператора. По сути, это близко к логике скрипта shell.

  • Индикатор > :
TASK_NAME:
...
script:
- >
command_line1
command_line1_continue

command_line2
command_line2_continue

данный индикатор интерпретирует новую команду после пустой строки.

After_script

https://docs.gitlab.com/ee/ci/yaml/#after_script

Набор команд, которые запускаются после scripts, даже, при неудачном завершении последнего.

TASK_NAME:
...
script:
...
after_script:
- command1
- command2

Artifacts

https://docs.gitlab.com/ee/ci/yaml/#artifacts

Артефакты представляют из себя промежуточные сборки или файлы, которые могут передаваться от одного этапа — другому.

1. Например, мы можем передать системные переменные, которые были нами переданы в файл

TASK_NAME:
...
script:
- echo -e "VERSION=1.1.1" > variables.env
...
artifacts:
reports:
dotenv: variables.env

в данном примере мы передадим системную переменную VERSION со значением 1.1.1 через файл variables.env.

3. При необходимости, мы можем исключить из списка определенные файлы по названию или маске

TASK_NAME:
...
artifacts:
paths:
...
exclude:
- ./.git/**/*

в данном примере мы исключаем каталог .git, в котором, как правило, хранятся метаданные репозитория.

Внимание!

Обратите внимание, что в отличие от paths, exclude не берет файлы и каталоги рекурсивно и нужно явно указывать объекты.

Extends

https://docs.gitlab.com/ee/ci/yaml/#extends.

Позволяет вынести часть сценария в отдельный блок и объединить его с заданием. Чтобы это лучше понять, рассмотрим конкретный пример:

.my_extend:
stage: build
variables:
USERNAME: my_user
script:
- extend script

TASK_NAME:
extends: .my_extend
variables:
VERSION: 123
PASSWORD: my_pwd
script:
- task script

И так, в нашем задании TASK_NAME мы используем extends. В результате, задание примет такой вид:

TASK_NAME:
stage: build
variables:
VERSION: 123
PASSWORD: my_pwd
USERNAME: my_user
script:
- task script

Что произошло:

stage: build попало в задание из my_extend. произошло объединение variables, итого в задание попали VERSION, PASSWORD и USERNAME. script используется из задания (значения ключей не объединяются, приоритет за значением основного задания).

Timeout

https://docs.gitlab.com/ee/ci/runners/configure_runners.html#set-script-and-after_script-timeouts.

Позволяет ограничить время выполнения задания, или увеличить время, заложенное по умолчанию (1 час).

Можно применить глобально для задания:

TASK_NAME:
...
timeout: 2h

Дополнительно можно задать лимит для скриптов и/или постскриптов с помощью переменных:

TASK_NAME:
variables:
RUNNER_SCRIPT_TIMEOUT: 30m
RUNNER_AFTER_SCRIPT_TIMEOUT: 5m

Если мы, описывая задачу, применяем и timeout и переменные RUNNER_SCRIPT_TIMEOUT/RUNNER_AFTER_SCRIPT_TIMEOUT, то значение последних не должны превышать значения timeout.

Release

https://docs.gitlab.com/ee/ci/yaml/#release.

Публикует релиз на портале Gitlab для нашего проекта.

TASK_NAME:
...
release:
name: 'Release $CI_COMMIT_TAG'
tag_name: '$CI_COMMIT_TAG'
description: 'Created using the release-cli'
assets:
links:
- name: "myprogram-${VERSION}"
url: "https://gitlab.com/master.dmosk/project/-/jobs/${CI_JOB_ID}/artifacts/raw/myprogram-${VERSION}.tar.gz"
rules:
- if: $CI_COMMIT_TAG
Внимание!

Обратите внимание, что мы применяем правило if (о нем ниже).

Директивы правил и ограничений

Для управления поведением выполнения задач могут использоваться директивы с правилами и условиями. Подробнее мы их рассмотрим ниже, а в данном разделе просто перечислим их.

  • Rules

https://docs.gitlab.com/ee/ci/yaml/#rules.

Правила, при соблюдении которых наше задание может быть запущено. Примеры работы с директивой rules приведены ниже.

  • When

https://docs.gitlab.com/ee/ci/yaml/#when.

Определяет условия запуска задания, например, только ручной запуск или через определенный интервал времени. Примеры работы приведены ниже.

  • Needs

https://docs.gitlab.com/ee/ci/yaml/#needs.

Тоже набор правил, требующий определенных условий для запуска задачи. Все директивы условий и правил описаны ниже.

  • Мартицы (параллельная сборка)

https://docs.gitlab.com/ee/ci/yaml/#parallelmatrix

Позволяет запустить несколько сборок для одного задания, подставляя разные значения переменных.

buildApp:
stage: build
image: ${IMAGE}
...
script:
- build command 1
- build command 2
- build command with args pg_ver=${POSTGRESQL_VERSION}
...
parallel:
matrix:
- IMAGE: ['ubuntu22.04']
POSTGRESQL_VERSION: ['13','14']
- IMAGE: ['rocky9']
POSTGRESQL_VERSION: ['15']

в результате такого описания, данное задание запустит 3 сборки — две для ubuntu22.04 + postgresql версий 13 и 14, а также одна сборка на rocky9 + postgresql 15.

Внимание!

В matrix мы задаем переменные, которые используются нами при описании задачи сборки.

Правила и условия

Мы можем выполнять или пропускать задания, в зависимости от выполнения определенных условий. Для этого существует несколько полезных директив, которые мы рассмотрим в данном разделе.

Регламентирует различные правила, определенные с помощью:

if

changes

exists

allow_failure

variables

1. Оператор if позволяет проверить условие, например, равенство определенному значению

TASK_NAME:
...
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'

в данном примере коммит должен быть выполнен в бранче по умолчанию.

2. Изменения затронули определенные файлы. Проверка выполняется с помощью опции changes

В данном примере, файл script.sql:

TASK_NAME:
...
rules:
- changes:
- script.sql

3. Несколько условий. Условий для начала выполнения задания может быть несколько. Рассмотрим несколько примеров

а) При условии, что коммит выполнен в бранче по умолчанию И изменения затронули файл script.sql:

TASK_NAME:
...
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
changes:
- script.sql

б) При условии, что коммит выполнен в бранче по умолчанию ИЛИ изменения затронули файл script.sql

TASK_NAME:
...
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
- changes:
- script.sql

4. Проверка на существование файла. Определяется с помощью exists

TASK_NAME:
...
rules:
- exists:
- script.sql

задание будет выполняться только в случае присутствия файла script.sql.

5. Разрешить сбой задания. Задается с помощью allow_failure

TASK_NAME:
...
rules:
- allow_failure: true

в данном примере наш конвейер продолжит работу, если задание TASK_NAME будет выполнено с ошибкой.

6. Определение переменной в зависимости от условия. Для этого используются вместе if и variables

TASK_NAME:
...
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
variables:
DEPLOY_VARIABLE: "production"
- if: '$CI_COMMIT_BRANCH =~ demo'
variables:
DEPLOY_VARIABLE: "demo"

When

определяет условия запуска задания. Возможные значения:

  • on_success (по умолчанию) — если все задания на более ранних этапах завершились успешно или имеют allow_failure: true.
  • manual — запуск вручную (в панели pipeline появится кнопка запуска).
  • always — запускать всегда, независимо от предыдущих результатов.
  • on_failure — только в случае сбоя, хотя бы, одного задания на более раннем этапе.
  • delayed — отложить запуск задания. Контролировать срок можно с помощью директивы start_in.
  • never — никогда не запускать задание.

Разберем примеры.

1. Manual

TASK_NAME:
...
when: manual

задание не начнет выполняться, пока мы не нажмем кнопку запуска в GitLab CI/CD.

2. Always

TASK_NAME:
...
when: always

задание будет выполняться всегда. Удобно, например, если нужно сформировать отчетный файл, независимо от результатов сборки.

3. On_failure

TASK_NAME:
...
on_failure: always

задание будет выполняться при наличии ошибки на ранних этапах. Можно использовать для отправки уведомления.

4. Delayed

TASK_NAME:
...
when: delayed
start_in: 30 minutes

запуск задания будет отложен на 30 минут.

5. Never

TASK_NAME:
...
when: never

задание не будет выполняться.

6. Использование вместе с if

TASK_NAME:
...
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: manual

в данном примере задание будет выполняться, если коммит прошел в основной ветке и если администратор подтвердил запуск.

Needs

Позволяет задавать условия выполнения заданий только при наличии определенного артефакта или выполненного задания. С помощью правил данного типа можно контролировать порядок выполнения задач.

Рассмотрим примеры.

1. Artifacts. Принимает значение true (по умолчанию) и false. Для запуска задания нужно, чтобы на предыдущих этапах были загружены артефакты. Запись

TASK_NAME:
...
needs:
- artifacts: false

позволяет начать выполнение задания без этого.

2. Job. Позволяет начать выполнение задачи только после завершения другого задания

TASK_NAME:
...
needs:
- job: createBuild

в нашем примере задача начнет выполняться не раньше завершения задачи с названием createBuild.

Переменные

В данном разделе будут рассмотрены пользовательские переменные, которые мы можем использовать в сценарии на свое усмотрение, а также некоторые встроенные переменные, которые могут менять процесс работы конвейера.

Пользовательские переменные

Задаются с помощью директивы variables.

Можно определить глобально для всех заданий:

variables:
PKG_VER: "1.1.1"

Или для конкретного задания:

TASK_NAME:
...
variables:
PKG_VER: "1.1.1"

Теперь можно использовать нашу переменную в сценарии. Для этого ставим перед ее названием знак доллара, а также стоит заключить его в фигурные скобки, например:

  script:
- echo ${PKG_VER}

Переменные Gitlab

Данный тип переменных поможет нам управлять процессом сборки. Перечислим данные переменные с описанием их свойств:

  • LOG_LEVEL Определяет уровень журнала. Варианты: debug, info, warn, error, fatal, и panic. Имеет более низкий приоритет, по сравнению с аргументами командной строки --debug, --log-level. LOG_LEVEL: warning CI_DEBUG_TRACE Включение или отключение ведения журнала отладки. Принимает значения true или false. CI_DEBUG_TRACE: true CONCURRENT Ограничивает количество заданий, которые могут выполняться одновременно. CONCURRENT: 5 GIT_STRATEGY Способ загрузки файлов из репозитория. Возможны варианты: clone, fetch, и none (не загружать). GIT_STRATEGY: none FF_ENABLE_JOB_CLEANUP Определяет будет ли каталог проекта очищен в конце сборки. FF_ENABLE_JOB_CLEANUP: true

Дополнительные параметры

В данном разделе мы рассмотрим различные опции, которые не вошли в другие разделы.

  1. Workflow. Позволяем задать общие правила запуска для всего конвейера. Рассмотрим пример с официального сайта:
workflow:
rules:
- if: $CI_COMMIT_TITLE =~ /-draft$/
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_PIPELINE_SOURCE == "web"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

В данном примере конвейер:

Не будет запущен, если название коммита содержит текст draft. Будет запущен, если пайплайн сработал после merge request. Будет запущен, если пайплайн запускается вручную из веб-интерфейса gitlab. Будет запущен, если изменения внесены в основную ветку репозитория.

2. Значения по умолчанию. Задаются в директиве default. Опции с данными значениями будут использоваться во всех заданиях или могут быть переопределены на уровне конкретного задания

Пример:

default:
image: centos:7
tags:
- ci-test

мы определили опцию с именем образа (например, образа docker) и тег (теги могут быть необходимы для запуска некоторых runner).

3. Импорт конфигурации из другого файла yml. Может быть полезным, например, для написания общей части сценария, которую мы захотим применять ко всем pipeline или для разделения громоздкого сценария на составные части. Выполняется с помощью опции include. Имеет различные варианты подгрузки файлов. Рассмотрим их подробнее

а) подключение локального файла (local):

include:
- local: .gitlab/ci/build.yml

б) коллекции шаблонов (template):

include:
- template: Custom/.gitlab-ci.yml

в данном примере мы подключим к нашему сценарию содержимое файла Custom/.gitlab-ci.yml.

в) внешний файл доступный по HTTP (remote):

include:
- remote: 'https://gitlab.dmosk.ru/main/build.yml'

г) другой проект:

include:
- project: 'public-project'
ref: main
file: 'build.yml'

д) несколько файлов:

include:
- project: 'public-project'
ref: master
file:
- 'build.yml'
- 'include/main.yml'

4. !reference tags. Позволяет описать сценарий и повторно его использовать для разных стадий и задач нашего CI/CD

Например:

.apt-cache:
script:
- apt update
after_script:
- apt clean all

install:
stage: install
script:
- !reference [.apt-cache, script]
- apt install nginx

update:
stage: update
script:
- !reference [.apt-cache, script]
- apt upgrade
- !reference [.apt-cache, after_script]

давайте разберемся, что происходит в нашем примере.

Мы создали задачу apt-cache. Точка в начале названия говорит системе, что данную задачу не нужно стартовать автоматически при запуске pipeline. Созданная задача состоит из двух секций script и after_script. Секций может быть больше. Мы выполняем стадию install. В одной из строк выполнения мы вызываем apt-cache (только команды из раздела script). При выполнении стадии update мы вызываем apt-cache два раза — первый выполняет команды раздела script, второй — after_script. Примеры действий Рассмотрим некоторые готовые наборы команд для выполнения конкретных задач.

Подключение к хосту по SSH с использованием ключа Предположим, что у нас в переменной SSH_REMHOST_KEY записан приватный ключ, который мы будем использовать для подключения по SSH к хосту remote_host. В этом случае, сценарий будет выглядеть так:

  ...
script:
- mkdir -p ~/.ssh
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_REMHOST_KEY")
- ssh-keyscan -H remote_host >> ~/.ssh/known_hosts
- ssh root@remote_host "ls -la /var/"