Действительно, можно использовать веб-перехватчики:
Для этого существует множество различных решений. Я бы пошел с сценарием sh, который запускается с помощью крючка.
Как перехватить ваш веб-перехватчик зависит от конфигурации вашего сервера, если у вас установлен php-fpm, вы можете использовать скрипт PHP.
Когда вы создаете веб-перехватчик в своем проекте Gitlab (Настройки-> Веб-перехватчики), вы можете указать, для какого типа событий вы хотите перехватить перехватчик (в нашем случае это новая сборка), и секретный токен, чтобы вы могли проверить, что скрипт был вызван. пользователя Gitlab.
![webhook](https://i.stack.imgur.com/ZvZk3.png)
Скрипт 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