【问题标题】:How to deploy releases automatically to gitlab using ci如何使用 ci 将版本自动部署到 gitlab
【发布时间】:2017-10-10 14:15:12
【问题描述】:

我目前正在尝试弄清楚如何使用 ci 自动部署 gitlab 项目。我成功地运行了构建阶段,但我不确定如何检索这些构建并将其推送到版本。

据我所知,可以使用 rsync 或 webhooks(例如 Git-Auto-Deploy)来获取构建。但是我未能成功应用这些选项。

对于发布版本,我确实阅读了https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/api/tags.md#create-a-new-release,但我不确定我是否正确理解了所需的路径架构。

有没有简单完整的例子来试试这个过程?

【问题讨论】:

    标签: deployment gitlab gitlab-ci


    【解决方案1】:

    一种方法确实是使用 webhook:

    有很多不同的可能解决方案可以做到这一点。我会使用由钩子调用的 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,你可以去你项目的设置,触发器部分,有例子API 调用次数:您可以从那里确定项目 ID。

    【讨论】:

    • 我使用 XAMPP/Apache 在我的本地主机上托管了 php 脚本,但是当我测试钩子时,我不断收到“钩子执行失败:执行过期”,这可能是什么原因?我猜gitlab无法访问服务器,但我不知道如何调试。
    • @aabbcccc 你的电脑有公网IP吗?如果是,请检查您是否可以从子网外部访问它,可能有一些防火墙...
    • @rpadovani,PHP 无法运行shell_exec,还有其他解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2020-09-21
    • 2014-11-13
    • 2016-12-04
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多