如何使用 ci 将版本自动部署到 gitlab
How to deploy releases automatically to gitlab using ci
我目前正在尝试弄清楚如何使用 ci 自动部署 gitlab 项目。我成功地 运行 构建阶段,但我不确定如何检索这些构建并将其推送到版本。
据我所知,可以使用 rsync 或 webhooks(例如 Git-Auto-Deploy)来获取构建。但是我未能成功应用这些选项。
对于发布版本,我确实阅读了 https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/api/tags.md#create-a-new-release,但我不确定我是否正确理解了所需的路径模式。
是否有任何简单的完整示例来尝试这个过程?
一种方法确实是使用 webhooks:
有很多不同的解决方案可以做到这一点。我会使用由挂钩调用的 sh 脚本。
如何拦截你的 webhook 取决于你的服务器配置,如果你安装了 php-fpm,你可以使用 PHP 脚本。
当你在你的 Gitlab 项目(设置->Webhooks)中创建一个 webhook 时,你可以指定你想要钩子的事件类型(在我们的例子中,一个新的构建),以及一个秘密令牌,以便你可以验证该脚本已被 Gitlab 调用。
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");
我在webroot外创建了一个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 访问;他们正致力于在 Web 界面中实现 API,以便您始终可以从 Web 下载最新版本。
API的url是
https://gitlab.example.com/api/v3/projects/projectid/builds/artifacts/branchname/download?job=jobname
虽然您可以想象 branchname 和 jobname 是什么,但 projectid 有点比较难找。
它作为 projectid 包含在 webhook 的正文中,但是如果您不想拦截 hook,可以转到项目的设置,触发器部分,并且有 APIs 调用的示例:您可以从那里确定项目 ID。
我目前正在尝试弄清楚如何使用 ci 自动部署 gitlab 项目。我成功地 运行 构建阶段,但我不确定如何检索这些构建并将其推送到版本。
据我所知,可以使用 rsync 或 webhooks(例如 Git-Auto-Deploy)来获取构建。但是我未能成功应用这些选项。
对于发布版本,我确实阅读了 https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/api/tags.md#create-a-new-release,但我不确定我是否正确理解了所需的路径模式。
是否有任何简单的完整示例来尝试这个过程?
一种方法确实是使用 webhooks:
有很多不同的解决方案可以做到这一点。我会使用由挂钩调用的 sh 脚本。
如何拦截你的 webhook 取决于你的服务器配置,如果你安装了 php-fpm,你可以使用 PHP 脚本。
当你在你的 Gitlab 项目(设置->Webhooks)中创建一个 webhook 时,你可以指定你想要钩子的事件类型(在我们的例子中,一个新的构建),以及一个秘密令牌,以便你可以验证该脚本已被 Gitlab 调用。
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");
我在webroot外创建了一个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 访问;他们正致力于在 Web 界面中实现 API,以便您始终可以从 Web 下载最新版本。
API的url是
https://gitlab.example.com/api/v3/projects/projectid/builds/artifacts/branchname/download?job=jobname
虽然您可以想象 branchname 和 jobname 是什么,但 projectid 有点比较难找。
它作为 projectid 包含在 webhook 的正文中,但是如果您不想拦截 hook,可以转到项目的设置,触发器部分,并且有 APIs 调用的示例:您可以从那里确定项目 ID。