自动部署、持续构建CI/CD
     分类:集群自动化环境搭建     有: 0 条评论

自动部署、持续构建CI/CD

     分类:集群自动化环境搭建     有: 0 条评论

关于自动部署、持续构建有很多种方式,另外考虑到Docker的便捷性,可以方便的快速发布,看业务情况选择合适的方案,下面简单说说几种。


常用剧本

根据提交分支在不同环境中构建

注意:git fetch不适用于脚本等要权限的项目;此命令会改变项目权限和覆盖本地文件更改!!!

# .gitlab-ci.yml文件

stages:
  - test
  - live

job_01:
  stage: test
  script:
    - cd /www/wwwroot/XXXX && git checkout dev
    - git fetch --all && git reset --hard origin/dev
    - sudo pip3 install -r requirements.txt
    - /bin/bash build.sh test
    - echo "done..."
  tags:
      - test
  only:
    - dev
    - tags


job_02:
  stage: live
  script:
    - cd /www/wwwroot/XXXX && git checkout master
    - git fetch --all && git reset --hard origin/master
    - sudo pip3 install -r requirements.txt
    - echo "OK..."
  tags:
    - live
  only:
    - master
    - tags


## build.sh文件
# 注意:在python中使用了定时器,所以脚本比较特殊.

#!/bin/bash

if [ "$1" = 'test' ]
    then
        python3 /www/wwwroot/XXXX/run_test.py &
        run_test_pid=$!
        echo '120秒后程序讲终止!'
        sleep 120
        kill -s SIGTERM $run_test_pid
elif [ "$1" = 'live' ]
    then
                #sudo pkill -9 python3
        #sleep 2
        #python3 /www/wwwroot/XXXX/run.py &
        echo -e "\n"
    fi

git(含gitlab、svn)+真机/Docker

参考:https://www.leolan.top/index.php/posts/86.html
真机或者Docker原理是一样的,只是git提交代码后运行的命令不同,真机是登录到服务器pull代码;Docker是登录服务器构建镜像或者是pull远程镜像(pull远程镜像肯定会先构建,看实际情况)。


git(含gitlab、svn)+Jenkins+真机

Jenkins+Maven+Svn实现代码自动打包与发布:https://mp.weixin.qq.com/s/ghawFfO36GbeRH5vrTohSA


git(含gitlab、svn)+Jenkins+Docker

Jenkins与Docker的自动化CI/CD实战:https://mp.weixin.qq.com/s/gZl9nQuPtMsekjNBcdfE8g

此种方式和上一个部署到真机有一点点不一样,考虑到docker集群等还需要额外操作,还要注意权限问题


syncd批量自动部署(审核上线)

syncd是一款开源的代码部署工具,它具有简单、高效、易用等特点,可以提高团队的工作效率.
Githu:https://github.com/dreamans/syncd

此处部署是在安装有宝塔面板的基础上进行的;如果不是宝塔面板则Nginx配置有一点点不一样,参考Github说明

环境要求:
Centos 7
Go1.10以上版本, 用来编译源代码
git >=2.20版本
Mysql 5.7 推荐
Nginx

以下步骤都是在一台部署的主机上操作。使用root用户执行!!!

# 初始环境配置
# 安装依赖
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install  gcc perl-ExtUtils-MakeMaker

# 安装go(centos 7默认go版本就是1.10.X)
yum install go -y

# 自带git版本过低,重新安装
yum remove git -y
cd ~
wget --no-check-certificate https://www.kernel.org/pub/software/scm/git/git-2.8.4.tar.gz
tar -zxf git-2.8.4.tar.gz
cd git-2.8.4
mkdir -p  /usr/local/git
make prefix=/usr/local/git all
make prefix=/usr/local/git install

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

# 宝塔面板安装Nginx和Mysql5.7
新建web站点,新建数据库


#################################################################
# 安装syncd
cd ~
curl https://raw.githubusercontent.com/dreamans/syncd/master/install.sh |bash
此时会在当前目前生成两个目录,go目录是clone下来的代码,syncd-deploy文件夹是编译好的文件。

# 移动文件到网站目录下(可以只拷贝public静态文件过去)
mv syncd-deploy/ /www/wwwroot/www.xxxx.com/
# 导入数据库
mysql -uroot -p [dbname] < go/src/github.com/dreamans/syncd/syncd.sql
# 修改配置
cd /www/wwwroot/www.xxxx.com/syncd-deploy/
vim etc/syncd.ini

# 启动服务
./bin/syncd -c ./etc/syncd.ini
此时浏览器访问,IP:Port,会返回以下信息,说明接口启动了。
{
"code": 1005,
"message": "no login"
}


# 配置网站
修改Nginx的配置为(作者的配置有点问题,在宝塔中无法正常使用):
# 以下配置是Nginx的动静分离配置,动态内容从api中获取,修改域名或IP。

upstream syncdServer {
    server [IP]:8868;
}

server
{
    listen 80;
    server_name [域名或IP];
    
    location / {
        # 网站根目录(注意这个路径是刚刚复制文件过去的)
        root /www/wwwroot/www.xxxx.com/syncd-deploy/public;
        index index.html index.htm;
    }
    
    location ^~ /api/ {
        proxy_pass         http://syncdServer;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
   
    access_log  /www/wwwlogs/www.xxxx.com.log;
    error_log  /www/wwwlogs/www.xxxx.com.error.log;
}

保存,重启Nginx,浏览器访问域名或者IP,登录修改密码
初始账号:
用户名: syncd
邮箱: syncd@syncd.cc
密码: syncd.cc


#################################################################
# 后续步骤
# 关闭公钥摘要的显示提示,防止后台脚本运行失败
vim /etc/ssh/ssh_config
Host *
    StrictHostKeyChecking no

# 免密登录配置(下发公钥)
ssh-copy-id root@[目标主机IP]
完成之后就可以在集群中创建集群了。

Tekton

谷歌开源 Kubernetes 原生 CI/CD 构建框架
详情说明:https://cloud.google.com/tekton

GitHub:https://github.com/tektoncd


宝塔面板WebHooks

使用GitLab,阿里云Code、Coding等代码托管平台都有提供WebHooks,可以检测代码提交行为,并向指定的URL发送GET/POST请求。


注意:

# 两种形式,https即使是自签证书(请求会报错),但不影响结果,一样可以执行成功。
https://[IP或域名]:8888/hook?access_key=[密钥]

# 传参数在脚本中使用$1获取参数的值
https://[IP或域名]:8888/hook?access_key=[密钥]&param=[参数]

使用Gitlab、阿里云Code、Coding等:
都是写成一行的形式!!!
在Web钩子中添加时在地址栏填写:https://[IP或域名]:8888/hook?access_key=[密钥];下面密钥栏不要填;取消勾选SSL证书检测


自己写WebHooks服务端:https://jerryzou.com/posts/webhook-practice/

宝塔面板中有一个WebHooks插件,新增任务之后可以查看请求地址(含密钥),可以编写shell脚本(目前只限shell脚本的部分功能)

# 示例脚本(无通知)
# 不要使用if判断,无法执行!!!

#!/bin/bash
echo "--------------------------------------------"
echo `date +%Y%m%d-%H:%M:%S`
echo "Start Update Code!"
cd /www/wwwroot/xxxx    # 进入项目目录
#ls -alh
git pull
# 不要使用fetch,会改变权限和本地文件变动,且无法通知
# 如果因本地更改新于仓库版本,每次pull都会提示merge信息,可以加参数忽略--no-edit,不加也没影响。
# git pull --no-edit
echo "Update Finish!"
echo "--------------------------------------------"


# 示例脚本(有通知)
#!/bin/bash
echo "--------------------------------------------"
echo `date +%Y%m%d-%H:%M:%S`
echo "Start Update Code!"
cd /www/wwwroot/xxxx    # 进入项目目录
git pull
push_msg=`git log --pretty=oneline |head -n 1 |awk {'print $2'}`
# 如果因本地更改新于仓库版本,每次pull都会提示merge信息,可以加参数忽略--no-edit,不加也没影响。
# git pull --no-edit
/www/wwwroot/xxxx/wechat_msg.py '部署项目名' $push_msg
echo "Update Finish!"
echo "--------------------------------------------"

# 消息通知脚本见:https://www.leolan.top/index.php/posts/263.html#directory0151010726006796772
(●゚ω゚●)