gitlab实现代码自动部署(转载自https://segmentfault.com/a/1190000011561808)

阮文武的网络日志 阮文武的网络日志     2022-10-03     675

关键词:

在当下使用 GIT 来管理代码已经是一种非常流行的方式了。使用 GIT 可以很方便的给代码创建分支,撤销不需要的提交,与他人合作共同编写代码。

GitLab 是基于 GIT 实现的现代化的开发者协作平台,它将 issues, code review, CI 和 CD 整合到独立的网站UI,弥补了 GIT 在可视化操作方面的不足。

本文目的

本文的目的是配置实现在 GitLab 平台上的代码自动部署。想要达到的效果是这样子的,当客户端向 GitLab 服务器的特定分支(如:prod)提交代码时,GitLab 服务器会发送通知给线上代码服务器,代码服务器收到通知之后再拉取 GitLab 服务器上该分支的最新代码。

效果图如下:

 

有了 GitLab ,只需要三步就可以实现以上描述的效果了。

步骤一、准备两个脚本

在代码服务器端准备好一份处理 GitLab 服务器通知的脚本和一份拉取代码的脚本。

GitLab 服务器所发出来的通知,其实就是向代码服务器发出一个 http 请求,请求中包含了本次提交中的相关信息,如所提交的分支、谁提交的、本次更新的代码等等信息。

所以在代码服务器中添加一个脚本,专门处理该请求即可。

可以参考一下的 PHP 代码:

<?php 
// 处理 GitLab 请求的脚本

$rowData = file_get_contents('php://input', 'r');;
$rowData = json_decode($rowData,true);

$output    = '';
$type = $_GET['type'];

// 只拉取 prod 分支的代码到服务器
if($rowData['ref'] == 'refs/heads/prod'){
    if('ims' == $type){
        // 触发拉取代码的脚本
        exec('./post-ims',$output);
    }
    logg($type." output:".json_encode($output));
}
logg($type.':'.$rowData['user_name']." commit to branch:".$rowData['ref']);

function logg($data){
    $text    = '['.date('Y-m-d H:i:s').'] '.$data."\n";
    file_put_contents('./log/gitlab'.date('ym').'.log',$text,FILE_APPEND);
}

还有一个就是处理拉取 GitLab 服务器更新到代码服务器的脚本。该脚本可以很简单,只需要将当前工作目录切换到项目的工作目录,然后执行拉取代码的命令即可。

参考以下 shell 脚本:

#!/bin/bash
# 拉取代码的脚本

cd /www/ims/
git pull origin prod
步骤二、配置 webhooks

在项目中配置 webhooks(Web 钩子) 其实就是在项目中注册一个触发器,当项目中的某个事件发生时,该触发器就会被触发。在 GitLab 中的触发器就是一个 http 请求,即一个 http 链接。

在 GitLab 中,要达到我们上面预设的效果,我们需要设置项目的推送事件的 webhook。一个能访问到我们步骤一添加的 PHP 脚本的链接。

配置所在的路径是:

项目主页 > setting > webhooks

在该页面添加一个推送事件的触发器即可,类似这样子的 URL:

http://example.com/gitlab.php?type=ims

保存之后,可以测试下该链接是否正确。它会模拟发送一个推送请求的数据,格式和正常的推送的一样。在代码服务器端就可以根据这个来调试了。

步骤三、添加秘钥

既然是代码自动部署,那当然是完全不需要人为参与的啦,这将包括不需要人为输入密码。

GitLab 提供了让每个账号使用秘钥登录的功能,配置了账号秘钥之后就可以无密码登录账号了。代码自动部署正是需要这样子的功能了。

首先要在代码服务器端生成秘钥:

使用命令 ssh-keygen ,连续按三次回车即可生成一对无密码保护的秘钥,它们的名称分别是 id_rsa 和 id_rsa.pub

然后将 id_rsa.pub 的内容添加到 GitLab 账号:

在 GitLab 账号的 profile setting > SSH keys 粘贴并保存即可

需要注意的地方

通过以上三步,现在已经能够实现代码自动部署了。

如果完成了以上步骤之后,还不能实现代码自动部署,最可能出现问题的是账号的权限问题了。有两个地方可能出现权限的问题。

  1. GitLab 账号的权限

    自动部署所绑定的账号需要有权限访问该项目。
  2. 代码服务器端执行脚本的用户的权限

     
    首先,该用户需要有权限对项目目录进行读写;  
    然后是,该用户的秘钥信息绑定的是正确的 GitLab 账号  
    

 

gitlab+jenkins自动化部署

基于gitlab和jenkins的自动化部署 Gitlab基于Jenkins自动化部署教程:https://blog.csdn.net/aaaaaab_/article/details/82012044https://www.cnblogs.com/dengbingbing/p/10448185.html GitLab是一个代码仓库,用来管理代码。Jenkins是一个自动化服务器,可以运... 查看详情

jenkins实现自动部署

主机A搭建gitlab。gitlab下载:https://www.gitlab.cc/downloads/  (gitlab中文网)主机B搭建jenkinsjenkins下载:https://jenkins.io/index.html (gitlab官网)两端同时下载openssl-servergitlab端建好,创建一个项目。首先需要在gitlab端配置jenkin 查看详情

jenkins+gitlab+ansible自动化部署(代码片段)

...neJob实现Nginix+MySQL+PHP+Wordpress实现自动化部署交付(Jenkins+Gitlab+Ansible自动化部署(五)https://www.cnblogs.com/zd520pyx1314/p/10249094.html)环境准备编写ansibleplaybook脚本实现Wordpress远程部署将wordpress源码与playbook部署脚本提交到gitlab仓库编... 查看详情

gitlab+jenkins实现自动部署

https://carlislebear.blogspot.com/2019/02/gitlab-jenkins-continuous-integration.html  此篇文章写得很详细大体思路如下:一、安装Gitlab+Jenkins(省略)二、配置Gitlab(上传Jenkins服务器的秘钥、捣鼓代码)三、配置Jenkins1、安裝插件ManageJenkins... 查看详情

jenkins结合gitlab实现pipline的自动构建部署(代码片段)

部署jenkins与gitlab服务就在这不演示了,可以参考前面的两篇文章。1、jenkins配置自动构建部署1.1、基于sshkey拉取代码先在jenkins服务器上创建个sshkey,在把公钥配置到gitlab上面,再到jenkinsweb界面配置凭据,使jenkins来拉取代码。roo... 查看详情

centos部署配置gerrit+gitlab实现代码的review与自动同步

...推荐几个:Gerrit代码审核服务器搭建全过程Jenkins+Ansible+Gitlab自动化部署三剑客构建基于Jenkins+Github的持续集成环境环境准备:    mysql 查看详情

使用gitlab实现自动化部署与持续集成

Gitlab-Ci运行原理:由以下两个模块组成gitlab-ciservergitlab-ci-runner其中,gitlab-ciserver负责调度、触发Runner,以及获取返回结果.而gitlab-ci-runner则是主要负责来跑自动化CI(测试,编译,打包等)。基本流程是:用户提交代码->检查是... 查看详情

jenkins+git+gitlab+ansible实现持续集成自动化部署静态网站--技术流ken(代码片段)

 前言 在之前已经写了关于Git,Gitlab以及Ansible的两篇博客《Git+Gitlab+Ansible剧本实现一键部署Nginx--技术流ken》,《Git+Gitlab+Ansible剧本实现一键部署动态网站(二)--技术流ken》,以及关于jenkins的简单使用《Jenkins持续集成介... 查看详情

gitlab+jenkins自动化上线部署持续集成(代码片段)

相信大家开始玩gitlab+jenkins的时候对着两个工具有肯定有一定了解,我就不做详细解释了,下面就跟大家简单的说下gitlab,jenkins之间工作关系:GitLab是一个代码仓库,用来管理代码。Jenkins是一个自动化服务器,可以运行各种自... 查看详情

docker部署gitlab(代码片段)

目录Docker部署GitLab环境1.安装docker环境2.拉取gitlab镜像3.定义配置文件4.创建数据日志挂载目录5.启动容器6.(选配)配置https7.重启服务8.写在最后转载或借鉴文档Docker部署GitLab环境host:CentOS74.14内存docker:18.09.9-cegitlab:最新版本(1.12+版本... 查看详情

gitlab+jenkins通过钩子实现自动部署web项目,图文详细教程(代码片段)

一:基础环境介绍及准备1:Gitlab服务器:ubuntu192.168.152.131—参考搭建:Linux安装gitlab,docker安装gitlab教程2:Jenkins服务器:ubunu192.168.152.130—参考搭建:linux安装Jenkins,或docker安装Jenkins教 查看详情

springcloud+docker+jenkins+gitlab+maven实现自动化构建与部署实战(代码片段)

...景为初心进行实际细讲。本文章主要讲述Docker、Jenkins、GitLab、Git、JDK、SpringBoot、Maven等技术结合实现自动化运维部署 查看详情

springcloud+docker+jenkins+gitlab+maven实现自动化构建与部署实战(代码片段)

...景为初心进行实际细讲。本文章主要讲述Docker、Jenkins、GitLab、Git、JDK、SpringBoot、Maven等技术结合实现自动化运维部署 查看详情

jenkins+git+gitlab+ansible实现持续集成自动化部署动态网站--技术流ken(代码片段)

 项目前言 在上一篇博客《Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)--技术流ken》中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个静态的网站。如果大家可以熟练掌握以上内容,势必... 查看详情

gitlab+jenkins实现一键分布式项目自动化部署(代码片段)

分布式项目的打包部署增加了运维人员的工作量,而且工作是机械重复,极无技术含量的,说白就是打更。我们要把复杂的事情简单化,简单的事情标准化,标准的事情流程化,所以打包部署成了我们流程... 查看详情

gitlab安装部署(代码片段)

Gitlab介绍  GitLab是一个利用RubyonRails开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。GitLab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的... 查看详情

jenkins实现项目自动部署

...脚本2远程执行3配置jenkins任务背景之前给公司搭建过一套gitlab+gerrit+jenkins的持续集成环境,由于操作起来有点繁琐,自己也没太搞清楚该怎么用,所以一直就只用了gitlab来做代码管理。最近要做一个项目自动部署的功能,使用过... 查看详情

docker+harbor+jenkins+gitlab自动化cicd构建

文章大纲1.实现CICD的架构简介2.Gitlab部署和实践3.Docker部署4.Harbor私有仓库部署5.Jenkinspipeline项目持续集成实践6.整体架构参考文献1.实现CICD的架构简介本实践介绍了利用Jenkins和docker技术,如何实现CI/CD的各环节的步骤,包括代码... 查看详情