Как автоматически развертывать выпуски в gitlab с помощью ci

В настоящее время я пытаюсь понять, как автоматически развернуть проект gitlab с помощью ci. Мне удалось успешно запустить этап сборки, но я не знаю, как получить и отправить эти сборки в выпуски.

Насколько мне известно, для получения сборки можно использовать rsync или webhooks (например, Git-Auto-Deploy). Однако мне не удалось успешно применить эти параметры.

Для публикации выпусков я прочитал https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/api/tags.md#create-a-new-release, но я не уверен, правильно понимать требуемую схему пути.

Есть ли какой-нибудь простой полный пример, чтобы опробовать этот процесс?


person Community    schedule 11.05.2017    source источник


Ответы (1)


Действительно, можно использовать веб-перехватчики:

Для этого существует множество различных решений. Я бы пошел с сценарием sh, который запускается с помощью крючка.

Как перехватить ваш веб-перехватчик зависит от конфигурации вашего сервера, если у вас установлен php-fpm, вы можете использовать скрипт PHP.

Когда вы создаете веб-перехватчик в своем проекте Gitlab (Настройки-> Веб-перехватчики), вы можете указать, для какого типа событий вы хотите перехватить перехватчик (в нашем случае это новая сборка), и секретный токен, чтобы вы могли проверить, что скрипт был вызван. пользователя Gitlab.

webhook

Скрипт PHP может быть примерно таким:

<?php
// Check token
$security_file = parse_ini_file("../token.ini");
$gitlab_token = $_SERVER["HTTP_X_GITLAB_TOKEN"];

if ($gitlab_token !== $security_file["token"]) {
    echo "error 403";
    exit(0);
}

// Get data
$json = file_get_contents('php://input');
$data = json_decode($json, true);

// We want only success build on master
if ($data["ref"] !== "master" ||
    $data["build_stage"] !== "deploy" ||
    $data["build_status"] !== "success") {
  exit(0);
}

// Execute the deploy script:
shell_exec("/usr/share/nginx/html/deploy.sh 2>&1");

Я создал файл token.ini вне корневого веб-каталога, это всего лишь одна строка:

token = supersecrettoken

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

Кроме того, сценарий развертывания очень прост, но есть несколько интересных моментов:

#!/bin/bash
# See 'Authentication' section here: http://docs.gitlab.com/ce/api/
SECRET_TOKEN=$PERSONAL_TOKEN

# The path where to put the static files
DEST="/usr/share/nginx/html/"

# The path to use as temporary working directory
TMP="/tmp/"

# Where to save the downloaded file
DOWNLOAD_FILE="site.zip";

cd $TMP;
wget --header="PRIVATE-TOKEN: $SECRET_TOKEN" "https://gitlab.com/api/v3/projects/774560/builds/artifacts/master/download?job=deploy_site" -O $DOWNLOAD_FILE;
ls;
unzip $DOWNLOAD_FILE;

# Whatever, do not do this in a real environment without any other check
rm -rf $DEST;
cp -r _site/ $DEST;
rm -rf _site/;
rm $DOWNLOAD_FILE;

Прежде всего, сценарий должен быть исполняемым (chown +x deploy.sh) и принадлежать пользователю веб-сервера (обычно www-data).

У сценария должен быть токен доступа (который вы можете создать здесь) для доступа к данным. Я вставил его как переменную окружения:

sudo vi /etc/environment

в файл нужно добавить что-то вроде:

PERSONAL_TOKEN="supersecrettoken"

а затем не забудьте перезагрузить файл:

source /etc/environment

Вы можете проверить, все ли в порядке, выполнив sudo -u www-data echo PERSONAL_TOKEN, и убедиться, что токен напечатан в терминале.

Теперь другая интересная часть сценария - это то, где находится артефакт. Последняя доступная сборка ветки доступна только через API; они работают над внедрением API в веб-интерфейс, чтобы вы всегда могли загрузить последнюю версию из Интернета.

URL-адрес API:

https://gitlab.example.com/api/v3/projects/ < strong> projectid / builds / artifacts / branchname / download? job = jobname

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

Он включен в тело веб-перехватчика как projectid, но если вы не хотите перехватывать перехватчик, вы можете перейти в настройки своего проекта, раздел Триггеры, и там есть примеры вызовов API. : оттуда вы можете определить идентификатор проекта.

person rpadovani    schedule 11.05.2017
comment
Я разместил php-скрипт на своем локальном хосте с помощью XAMPP / Apache, но когда я тестирую крючок, я продолжаю получать сбой выполнения крючка: срок выполнения истек, в чем может быть причина этого? Я предполагаю, что gitlab не может получить доступ к серверу, но я не знаю, как это отладить. - person ; 11.05.2017
comment
@aabbcccc есть ли у вашего ПК общедоступный IP-адрес? Если да, проверьте, можно ли добраться до него из-за пределов своей подсети, возможно, там какой-то брандмауэр ... - person rpadovani; 12.05.2017
comment
@ rpadovani, PHP не может работать shell_exec, какое-либо другое решение? - person kittygirl; 22.11.2018