CICID的搭建

一、CICD的概况

1、CI/CD结构

CICID的搭建_第1张图片

2、 jenkins的介绍

持续集成(CI)是当下最为流行的应用程序开发实施方式
是由java编写的一款开源软件
是一款非常流行的CI(持续集成)工具

3、 Jenkins的安装并启用

1)安装Jenkins包

[root@localhost~]#wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhatstable/jenkins-2.222.1-1.1.noarch.rpm 
[root@localhost ~]# yum install -y java-1.8.0-openjdk 
[root@localhost ~]# rpm -ihv jenkins-2.222.1-1.1.noarch.rpm 
[root@localhost ~]# systemctl start jenkins 
[root@localhost ~]# systemctl enable Jenkins

2)对页面进程初始化
访问http://x.x.x.x:8080进行初始化配置
在/var/lib/jenkins/secrets/initialAdminPassword取出密码 -> 选择插件来安装 -> 点击中间上面的“无”,不安装任 何插件,点击右下角的“安装” -> 点击右下角的“使用admin继续” -> 点击“保存并完成” -> 点击"开始使用jenkins"

3)修改密码
进入jenkins首页后,改admin密码

4)安装国内站点插件

[root@localhost ~]# ls /var/lib/jenkins/updates/default.json 
[root@localhost ~]# sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json 
[root@localhost ~]# systemctl restart jenkins

ps:如果/var/lib/jenkins/updates/default.json不存在,可以 Manage Jenkins -> Manage Plugins -> Advanced 选项卡 -> Update site : https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json -> 点 击submit提交。

5)安装插件
Manage Jenkins -> Manage Plugins -> Available选项卡,按ctrl+f进行搜索并勾选Git Parameter / Localization Chinese(Simplified) / DingTalk / GitLab -> 点击Install without restart -> 勾选Restart Jenkins when installation is complete and no jobs are running

二、构建任务

1、在jenkins服务器上安装git

[root@ecs-9787 ~]# yum -y install git

2、新建项目并设置仓库地址
首页 -> 新建Item -> myweb / Freestyle project -> 确定 -> 源码管理 => git / Repository URL: http://192.168.113.101/devops/myweb.git -> 保存

3、构建项目
点击项目页面左边栏的Build Now(立即构建) -> Build History 下面的#1 -> 左边栏的控制台输出

4、Jenkins上查看代码目录

[root@localhost ~]# ls /var/lib/jenkins/workspace myweb

三、推送代码时自动构建项目

1、jenkins上修改
修改jenkins项目配置 -> 构建触发器 -> 勾选Build when a change is pushed to GitLab. GitLab webhook URL: http://192.168.113.102:8080/project/myweb -> 点击 高级 -> 点击generate生成Secret token并复制它 -> 保存

2、gitlab修改
修改gitlab配置 -> 点击项目,如myweb -> 左边栏 设置 / 集成 -> 链接url http://192.168.113.102:8080/project/myweb / 安全令牌填写jenkins中生成的Secret token -> 点击增加web 钩子。在页面中间部分找到创建的web钩子,点击test -> Push events测试,返回Hook executed successfully: HTTP 200表示成功。

3、测试
程序员推送代码到gitlab服务器后,jenkins项目将会自动构建,并通过机器人发送构建消息。

使用参数git parameter构建某一版本的代码
配置jenkins通过tag标签构建 首页 -> 新建Item -> 名字myweb2 / Freestyle project -> 勾选This project is parameterized参数化构建 => 添加参 数 => Git Parameter (Git参数) => Name: webver / Parameter Type: Branch or Tag / Default Value: origin/master -> 源码管理 => Git => Repositories => Repository url: http://192.168.113.101/devops/myweb.git / Branches to build: $webver -> 保存
构建测试
点击 Build with Parameters -> 选择版本 -> 开始构建 检出代码到子目录

1)在jenkins服务器上删除构建目录

[root@localhost ~]# rm -rf /var/lib/jenkins/workspace/*

2)程序员推送代码给gitlab

[root@localhost ~]# ls /var/lib/jenkins/workspace/ 
myweb 
[root@localhost ~]# ls /var/lib/jenkins/workspace/myweb/
 index.html  issue  login.defs  README.md
[root@localhost ~]# cat /var/lib/jenkins/workspace/myweb/index.html 
<h1>My Test Web Site</h1> <h2>my site 2.0</h2> <p>tedu nsd1911</p>

四、使用参数git parameter构建某一版本的代码

1、配置jenkins通过tag标签构建
首页 -> 新建Item -> 名字myweb2 / Freestyle project -> 勾选This project is parameterized参数化构建 => 添加参 数 => Git Parameter (Git参数) => Name: webver / Parameter Type: Branch or Tag / Default Value: origin/master -> 源码管理 => Git => Repositories => Repository url: http://192.168.113.101/devops/myweb.git / Branches to build: $webver -> 保存

2、构建测试
点击 Build with Parameters -> 选择版本 -> 开始构建

3、测试
删除jenkins服务器上的代码目录

[root@localhost ~]# rm -rf /var/lib/jenkins/workspace/myweb2/

在jenkins的web页面上点击配置 -> 在源码管理下面找到Addtional Behaviours -> 新增 -> Checkout to a subdirectory(检出到子目录): myweb-$webver -> 保存
构建测试:构建两次,每次使用不同版本
点击 Build with Parameters -> 选择版本 -> 开始构建

[root@localhost ~]# ls /var/lib/jenkins/workspace/myweb2/ myweb-1.0  myweb-2.0

五、修改项目,实现代码打包

jenkins服务器通过http协议共享打包后的软件
jenkins服务器发布当前软件版本和前一版本
计算压缩包的md5值

在jenkins服务器上安装httpd

[root@localhost ~]# yum install -y httpd 
[root@localhost ~]# systemctl start httpd 
[root@localhost ~]# systemctl enable httpd 
# /var/www/html/deploy/live_ver:保存当前版本号 
# /var/www/html/deploy/last_ver:保存前一版本的版本号
# /var/www/html/deploy/pkgs:保存软件的压缩包和它的 md5值 
[root@localhost ~]# mkdir -p /var/www/html/deploy/pkgs 
[root@localhost ~]# chown -R jenkins:jenkins /var/www/html/deploy

myweb2项目 -> 配置 -> 构建 -> 增加构建项目 -> Execute shell
 
 pkgs_dir=/var/www/html/deploy/pkgs # 将下载目录拷贝到web服务器目录 
 cp -r myweb-$webver $pkgs_dir 
 cd $pkgs_dir 
 rm -rf myweb-$webver/.git  # 删除不必要的版本库文件
  # 打包 
 tar czf myweb-$webver.tar.gz myweb-$webver 
 rm -rf myweb-$webver  # 删除软件目录
  # 计算压缩包的md5值 
 md5sum myweb-$webver.tar.gz | awk '{print $1}' > myweb-$webver.tar.gz.md5 cd .. # 将live_ver的版本号写到last_ver中 
 [ -f live_ver ] && cat live_ver > last_ver echo -n $webver > live_ver  # 将最新版本号写入live_ver

构建测试
点击 Build with Parameters -> 选择版本 -> 开始构建
访问http://jenkins服务器ip/deploy

六、部署软件到应用服务器 在web服务器上部署代码

在web服务器上部署代码
CICID的搭建_第2张图片

  • 下载相应版本的软件包
  • 校验下载的软件包是否损坏
  • 解压软件包
  • 部署软件包到web服务器的文档目录

1)在web服务器上安装htppd(再第五步时,Jenkins的HTTP服务已经开启)

[root@web1 ~]# yum -y install httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd
[root@web1 ~]# mkdir /var/www/{download,deploy}

2)编写应用服务器自动上线代码

import os
import requests
import wget
import hashlib
import tarfile


def has_new_ver(ver_fname, ver_url):
    "有新版本返回True,没有返回False"
    # 如果本地没有版本文件则有新版本
    if not os.path.isfile(ver_fname):
        return True

    # 比较本地版本文件和远程版本
    r = requests.get(ver_url)
    with open(ver_fname) as fobj:
        local_ver = fobj.read()
    if local_ver != r.text:
        return True
    else:
        return False


def file_ok(fname, md5_url):
    "如果本地与远程md5值一致返回True,否则返回False"
    m = hashlib.md5()
    with open(fname, 'rb') as fobj:
        while 1:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)

    r = requests.get(md5_url)
    if m.hexdigest() != r.text.strip():  # 去除r.text尾部的\n
        return False
    else:
        return True


def deploy(app_fname, deploy_dir, dest):
    "用于部署程序"
    # 解压缩
    tar = tarfile.open(app_fname)
    tar.extractall(deploy_dir)
    tar.close()

    # 拼接出解压目录的绝对路径
    app_dir = os.path.basename(app_fname)
    app_dir = app_dir.replace('.tar.gz', '')
    app_dir = os.path.join(deploy_dir, app_dir)

    # 判断dest是否存在,存在先将其删除
    if os.path.exists(dest):
        os.remove(dest)

    os.symlink(app_dir, dest)


if __name__ == '__main__':
    # 判断是否有新版本,没有则退出
    ver_fname = '/var/www/deploy/live_ver'  #web服务器路径地址
    ver_url = 'http://192.168.113.102/deploy/live_ver'  #Jenkins服务器路径地址
    if not has_new_ver(ver_fname, ver_url):
        print('没有发现新版本。')
        exit(1)

    # 下载新版本程序
    r = requests.get(ver_url)
    pkg_url = 'http://192.168.113.102/deploy/pkgs/myweb-%s.tar.gz' % r.text
    #Jenkins服务器路径地址
    app_fname = '/var/www/download/myweb-%s.tar.gz' % r.text
    #web服务器路径地址
    wget.download(pkg_url, app_fname)

    # 检查程序是否损坏,如果损坏则删除它
    md5_url = pkg_url + '.md5'
    if not file_ok(app_fname, md5_url):
        print('文件已损坏。')
        os.remove(app_fname)
        exit(2)

    # 部署程序
    deploy_dir = '/var/www/deploy'
    dest = '/var/www/html/nsd1911'
    deploy(app_fname, deploy_dir, dest)

    # 更新本地软件版本
    if os.path.exists(ver_fname):
        os.remove(ver_fname)
    wget.download(ver_url, ver_fname)

运行该代码后,web会指向最新的代码

你可能感兴趣的:(Jenkins)