【DevOps 实践之路】(三) git + gitlab + webhook 自动化托管与代码同步

背景


在上一篇文章中,经过了 Tmux 和 Tmuxp 组合的实践,我可以通过描述文件(yaml)的方式,仅仅有条的把各个程序运行在服务器上,解决了以下几个问题:

1、可以记录启动了哪些程序,每个程序的启动步骤;
2、关掉终端后,程序也不会关闭
3、通过 tmux ls,很容器查看有哪些会话,每个会话里各个程序的运行情况,非常适合脚本类任务的运行;

但是随着业务的不断开展,代码变更越来越频繁,每次变更代码后,我都要把代码托到服务器上,然后重启程序,如果是爬虫这种需要分布部署的程序,则需要打开多个 XSHELL 和 XFTP ,分别拖动,过程既麻烦,又浪费时间,还容易出错;

多地开发的场景也很常见,比如在家和公司都会进行开发,且代码都要上传到服务器进行部署;

今天,我们引入 Git 、Gitlab 、Webhook 等技术,完成代码的托管与自动同步到服务器。

Git


认识 Git

Git 是一个开源的分布式版本控制系统;

最早为了管理 Linux系统的源码;

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,因此工作的时候无需联网,只需要在推送变更时联网即可;

由于每个人的电脑都有完整的版本库,因此安全性很高;

工作流程

工作区:一般是电脑上放置代码的目录;

暂存区(索引):又叫 stage 或 index,存放在 .git 目录下的 index 文件;

版本库:工作区的一个隐藏目录 .git ,由暂存区、分支 和 objects (git 对象库)组成;

git init => 编辑代码(工作区)=> git add(暂存区)=> git commit(本地master分支) => git push origin master(远程master分支)

1、新建git仓库 或 克隆 Git 资源作为工作目录(即工作区)

git clone
git init

2、编辑代码,并提交到暂存区

git add

3、从暂存区提交到当前分支(默认是 master)

git commit

4、同步本地分支到远程分支

git push <远程主机名> <本地分支名>:(<远程分支名>)
git push origin master

Webhook


Webhook 是一个 API 概念,是微服务 API 的使用范式之一,也被成为反向 API;

一般的 API 是 客户端向服务器发送请求,而 Webhook 范式 是 服务器接收到请求后,将更新情况发送给客户端;

应用场景:服务器推送 APP 更新,git webhook 等;

git webhook:我们可以在远程git仓库配置 git webhook,当向远程 git 仓库上传代码时,自动触发git webhook,调用配置好的接口,推送变更情况;

Git 安装与使用


安装

1、Windows环境

从以下地址下载安装包并安装

https://npm.taobao.org/mirrors/git-for-windows/

2、CentOS 环境

方法1:

whereis git

sudo yum install -y wget
sudo yum install -y gcc-c++
sudo yum install -y zlib-devel perl-ExtUtils-MakeMaker
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-develperl-devel

yum remove git

cd /usr/software
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.30.1.tar.gz

tar -zxvf cd git-2.30.1.tar.gz 

cd git-2.30.1

yum install install autoconf automake libtool

make configure

sudo make prefix=/usr/local/git install

echo 'export PATH=/usr/local/git/bin:$PATH' >> /etc/profile
source  /etc/profile

git --version

方法2

cat <<EOF > /etc/yum.repos.d/wandisco-git.repo
[wandisco-git]
name=Wandisco GIT Repository
baseurl=http://opensource.wandisco.com/centos/7/git/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
EOF

rpm --import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco

yum -y install git

git --version

3、ubuntu 环境

sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev

sudo apt-get install git

git --version

配置

1、开发者个人信息

git config --global user.name "ezrealer"
git config --global user.email ezrealer@qq.com
git config --list

2、创建公钥

ssh-keygen -t rsa -C "ezrealer@qq.com"
Enter > Enter > Enter 
# 输出
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
# 查看公钥
cat /root/.ssh/id_rsa.pub # Linux
C:\Users\Ezrealer/.ssh/id_rsa.pub # Windows

Gitlab 安装与使用


安装

sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix

systemctl enable postfix && systemctl start postfix

cat <<EOF > /etc/yum.repos.d/gitlab_tsinghua.repo
[gitlab-ce]
name=gitlab-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
Repo_gpgcheck=0
Enabled=1
Gpgcheck=0
EOF

yum makecache

yum install -y gitlab-ce-14.0.3

配置

参考轻量化配置 https://zhuanlan.zhihu.com/p/389717047

vim /etc/gitlab/gitlab.rb

external_url 'http://120.xxx.xx.xxx:10818'
gitlab_rails['time_zone'] = 'Asia/Shanghai'

# 轻量化配置方案
prometheus['enable'] = false 
prometheus_monitoring['enable'] = false
grafana['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
pgbouncer_exporter['enable'] = false
gitlab_exporter['enable'] = false

gitlab_rails['usage_ping_enabled'] = false
gitlab_rails['sentry_enabled'] = false

gitlab_rails['smtp_enable'] = false
gitlab_rails['gitlab_email_enabled'] = false
gitlab_rails['incoming_email_enabled'] = false

# 保存

# 重载配置文件 并 重启 gitlab
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

升级版本

Gitlab 不能跨太多版本升级,因此建议每次升级都更新

# 查看当前版本号
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION  # 13.10.0
yum list | grep gitlab-ce

# 停止 gitlab 的几个相关服务
gitlab-ctl service-list # 带 * 的是已启动的服务

gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
gitlab-ctl stop nginx

# unicorn 配置在14版本已被弃用,所以要注释掉 unicorn['worker_processes'] = 2
vim /etc/gitlab/gitlab.rb
# unicorn['worker_processes'] = 2
# 保存

# 备份 gitlab数据,默认存储在 /var/opt/gitlab/backups
# 备份文件名格式为:1565056437_gitlab_backup.tar,其中1565056437即为此次备份都版本号
# 可以修改备份存放位置 vim /etc/gitlab/gitlab.rb
# gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"

gitlab-rake gitlab:backup:create
# 最好再手动备份一下 /etc/gitlab 这个文件夹

# 如果升级失败,可以恢复备份
gitlab-rake gitlab:backup:restore BACKUP=备份版本号

# 开始升级
cat <<EOF > /etc/yum.repos.d/gitlab_tsinghua.repo
[gitlab-ce]
name=gitlab-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
Repo_gpgcheck=0
Enabled=1
Gpgcheck=0
EOF

yum makecache
yum install -y gitlab-ce-13.12.7
yum install -y gitlab-ce-14.0.3

gitlab-ctl reconfigure
gitlab-ctl restart

简约版

# 查看当前版本
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION  # 13.10.0
# 最新版本
yum list | grep gitlab-ce

cat << EOF > /etc/yum.repos.d/gitlab-ce.repo
> [gitlab-ce]
> name=gitlab-ce
> baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
> repo_gpgcheck=0
> gpgcheck=0
> enable=1
> gpgkey=https://packages.gitlab.com/gpg.key
> EOF

yum install -y gitlab-ce-最新版本
# 查看当前版本
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

创建与激活用户

1、输入 配置文件里的 external_url

2、创建新用户,并激活

gitlab-rails console -e production
# 修改密码
user = User.where(id: 1).first    
user=User.where(email:'jenkins@domian.com').first    # 根据邮箱修改密码
user.password = 'secret_pass'
user.password_confirmation = 'secret_pass'
# 激活并保存用户
user.state = "active"
user.save!
exit

完整实现


Gitlab 注册新用户

浏览器输入 external_url 

登录管理员账户

Menu => Admin => 用户 => 新用户 => 输入信息 => 用户名 => 密码

浏览器输入 external_url,并登录新建的用户

右上角头像 => preferences => Localization => 选择中文

本机安装 Git 并配置 开发者信息

1、 windows 安装git

https://npm.taobao.org/mirrors/git-for-windows/

2、打开命令行窗口,配置开发者信息与默认分支(main)

git config --global user.name "ezrealer"
git config --global user.email ezrealer@qq.com
# 由于政治问题,默认分支由 master 改为 main
git config --global init.defaultBranch main 
git config --list (-l)

3、生成密钥

ssh-keygen -t rsa -C "Ezrealer@qq.com"
enter > enter > enter
# Your identification has been saved in C:\Users\Ezreal/.ssh/id_rsa.
# Your public key has been saved in C:\Users\Ezreal/.ssh/id_rsa.pub.

本机创建项目并提交到 Gitlab

1、在 Gitlab 主页创建项目

新建项目 => 创建空白项目,输入项目名 DevOpsLab => 确定

2、在 E:\EzrealerGitRepo 下建一个文件夹 DevOpsLab,当作项目文件夹;

3、在 DevOpsLab 文件夹内新建一个 GitLab 文件夹,并在文件夹内新建 gitlab_demo.py 文件

print("hello gitlab")

4、在 DevOpsLab 文件夹下新建 .gitignore 文件,过滤不提交的文件或文件夹

*.log
*.pyc
Temp/
.idea/
.idea
venv/
__pycache__/
.xls
.xlsx
.txt
.doc
.ppt

注:项目中如果有空文件夹,不会上传,需要在空文件夹下建一个 .gitkeep 文件,做占位;

5、将项目文件夹初始化为 git 项目,并上传到索引,提交到本地分支 main,最后提交到 Gitlab 分支 main(默认)

# 在TestCICD 文件夹中,打开命令行窗口
git init
# 或者设置该项目的默认分支名称
git init --initial-branch=main

git remote add origin external_url/DevOpsLab/devopslab.git

git status # Untracked files test.py
git add .
git status # Changes to be committed  new file:   test.py
git commit -m "Commit Gitlab"
git status #On branch master nothing to commit, working tree clean
git push -u origin main

然后查看 Gitlab 页面,是否提交成功;

PS:如果需要,可以在项目中打开终端,单独设置该项目的开发者信息

git config user.name "Ezrealer"
git config user.email "ezrealer@qq.com"

gitlab + webhook + flask 代码自动同步到服务器思路

上传代码到 Gitlab 后,我们可以通过在服务器上配置 git,并执行 git pull ,将更新后的代码拉取到服务器上;

但是每次更新都做拉取,而且如果要部署在多台服务器,需要登录每台服务器进行拉取操作,比较繁琐;

我们可以在 gitlab 上配置 webhook,然后用 flask 编写一个接口;每次上传变更的代码后,自动触发 webhook,调用我们的接口,推送变更信息,然后在接口中完成后续的操作,比如执行 git pull命令完成自动拉取到服务器,从而完成同步代码变更到服务器的工作;

服务器安装Git 并配置

1、首先需要在需要部署的服务器都安装 Git

Centos7.9 安装 Git

whereis git

sudo yum install -y wget
sudo yum install -y gcc-c++
sudo yum install -y zlib-devel perl-ExtUtils-MakeMaker
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-develperl-devel

yum remove git

cd /usr/software
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.30.1.tar.gz

tar -zxvf cd git-2.30.1.tar.gz 

cd git-2.30.1

yum install install autoconf automake libtool

make configure

sudo make prefix=/usr/local/git install

echo 'export PATH=/usr/local/git/bin:$PATH' >> /etc/profile
source  /etc/profile

git --version

2、配置 服务器的 Git

git config --global user.name "ezrealer"
git config --global user.email ezrealer@qq.com
# 由于政治问题,默认分支由 master 改为 main
git config --global init.defaultBranch main 
git config --list (-l)

3、生成密钥

ssh-keygen -t rsa -C "Ezrealer@qq.com"

Enter > Enter > Enter 

# 输出
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.

# 查看公钥
cat /root/.ssh/id_rsa.pub

# 避免每次 git pull 都输用户名和密码
git config --global credential.helper store

拉取 GitLab的代码到服务器

1、打开 GitLab => 登录 DevOpsLab 账户 => 右上角点击 Edit profile => 左菜单点击 ssh密钥,输入服务器上 cat /root/.ssh/id_rsa.pub 的值 => 输入 ssh密钥标题(服务器IP地址)

2、克隆代码到服务器

mkdir -p /usr/DevOpsLab
cd /usr/DevOpsLab
git clone http://120.133.17.189:10818/DevOpsLab/devopslab.git  
# 输入 Gitlab 的用户名和密码

3、拉取变更到服务器

git pull origin main

# 强行拉取(当服务器代码发生变更时,git pull会报错,此时可以强行覆盖服务器变更)
git fetch --all
git reset --hard origin/main

用 flask 写一个 push后被请求的接口,并在接口中完成 git pull 同步 Gitlab 代码 到服务器

1、在本机 DevOpsLab 新建 webhook_api.py

from flask import Flask,request
import json
from git import Repo
import datetime

app = Flask(__name__)


def gitlab_pull():

    repo = Repo("./")  # git文件的路径
    git = repo.git

    print("当前未跟踪文件:", repo.untracked_files)
    print("当前本地git仓库状态:", git.status())
    print("当前本地git仓库是否有文件更新:", repo.is_dirty())
    print("当前本地分支:", git.branch())
    print("当前远程仓库:", git.remote())

    remote_name = "origin"
    print("正在 git pull {0} main".format(remote_name))
    git.pull(remote_name,"main")
    print("拉取修改 {0} 成功!".format(remote_name))

@app.route('/gitlab/webhook',methods=["POST"])
def get_tasks():
    print(request.method)
    if request.method=='POST':
        print("请求地址:",request.url)
        print("=" * 50)
        print("请求方法:",request.method)
        print("=" * 50)
        print("请求内容:")
        request_dict = json.loads(str(request.data, encoding = "utf-8"))
        print(request_dict)
        print("请求头:")
        print(request.headers)

        print("=" * 50)
        if request.headers.get("X-Gitlab-Token") == "123":
            print("密码验证通过,开始拉取...")
            gitlab_pull()
            print("拉取成功!",str(datetime.datetime.now())[:19])
            return "success"
        else:
            print("密码验证失败...",request_dict.get("password"))
            return "password is error"


app.run(host="0.0.0.0", port=8001, debug=False)

2、上传到代码仓库

git add.
git commit -m "add webhook_api"
git push -u origin main

3、服务器拉取代码变更

git pull origin main

在 Gitlab 配置 Webhook

1、Gitlab 主页 => 进入 DevOpsLab 代码仓库 => 设置 => webhooks

网址 http://webhook_api所在IP:8001/gitlab/webhook
Secret token 123
触发来源 勾选推送事件  

2、在本机执行

git add.
git commit -- "test webhook"
git push origin main

查看 服务器是否自动完成代码拉取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值