如何使用 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

虽然您可以想象 branchnamejobname 是什么,但 projectid 有点比较难找。

它作为 projectid 包含在 webhook 的正文中,但是如果您不想拦截 hook,可以转到项目的设置,触发器部分,并且有 APIs 调用的示例:您可以从那里确定项目 ID。