文章目录
背景
在上一篇文章中,经过了 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
查看 服务器是否自动完成代码拉取