jenkins部署

一.jenkins简介

jenkins是一款由java编写的软件

CI/CD :持续集成,持续交付,持续部署,持续开发

开发部(编写代码)-->交付给测试部-->测试部反馈给开发部-->没问题后交付给运维部

程序语言:

解释型语言:python/shell/php

编译型语言:C/C++ /Java          不能直接运行需要编译(gcc)

程序员上传到-->gitlab--->运维人员在jenkins下载gitlab上的代码--->批量部署代码

2.安装jenkins并启动服务

yum -y install  jenkins-2.190.1-1.1.noarch.rpm       #这个包可以在网上下,也可以在本地传过来,华为云家目录下有

yum -y install java-1.0.8-openjdk    #这一步必须做,不然jenkins启动不起来

systemctl enable jenkins

systemctl restart jenkins

3.访问jenkins图形化界面

浏览器输入:192.168.1.30:8080     #默认8080端口

 

复制红色部分到终端,cat一下将密码粘贴在上面位置.点击确定出现下面的页面

 

 

4.安装jenkins插件

第一步: 点击选择插件来安装(选择推荐的插件比较慢)-->选择无后安装  -->创建第一个管理员,选右下角的admin继续登录-->保存并完成-->开始使用

第二步:修改管理员密码   admin -->configure->password-->save--admin和新修改的用户密码来登录

第三步:安装插件,将插件的地址改为国内镜像站点,点击老头头像-->Manage jenkins-->advance-->Update site :使用清华大学镜像站点https://mirrors.tuna.tsinghua.edu.cn/jenkins/

avilable -->搜索 Localization:Chinse(simplified) 和Git Parameter --> Install without start --> restart jenkins when installation complete and no jobs are running

第四步: 安装过程中可能会超时,刷新一下就好,登录进去

5.CI/CD流程

 

 

1.程序员在自己的电脑上编写代码(客户端操作)

 [root@client ~]# git init website   #创建初始化website目录
初始化空的 Git 版本库于 /root/website/.git/
[root@client ~]# ls
website
[root@client ~]# cd website/
[root@client website]# echo "this is my site " > idnex.html   #在目录里新建一个文件,上传到仓库
[root@client website]# git add .
[root@client website]# git commit -m "mysite 1.0"    
[root@client website]# git tag 1.0    #打标签,也就是版本号
[root@client website]# echo "this is my site 2.0" >> idnex..html  #追加一行代码
[root@client website]# git add .
[root@client website]# git commit -m "my site 2.0"   #
[root@client website]# git tag 2.0

2.管理员在gitlab上创建名为website的项目,类型为公开,为组创建,添加昨天创建的普通用户为该项目的主程序员.

 

 3.程序员上传代码到gitlab服务器

[root@client website]# git remote add origin git@192.168.1.20:devops/website.git
[root@client website]# git push -u origin --all
[root@client website]# git push -u origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To git@192.168.1.20:devops/website.git
 * [new tag]         1.0 -> 1.0
 * [new tag]         2.0 -> 2.0

4.配置jenkins下载代码

    首先在jenkins服务器上安装git

     yum -y install git

    jenkins主页面点击创建一个新项目-->任务名称 website -->选择 free style -->勾选 this project is parameterized-->git parameter-->

    name:webver/parameter type:tag -->源码管理:Git -->Repository URL:http://192.168.1.20/devops/website.git  

    Branches to build  :$ webver-->保存

构建:

 点击 bulid with parameter --> 选择相关的tag进行构建,构建完成的内容自动放到了jenkis主机的/var/libjenkins/workspace目录下

 [root@jenkins ~]# cd /var/lib/jenkins/workspace/
 [root@jenkins workspace]# ls
 website
 [root@jenkins workspace]# cd website/
 [root@jenkins website]# ls
 idnex.html
5.修改工程,将程序下载到子目录中.配置->源码管理->addtional behaviours->checkout to a sub-directory(检出到子目录):web-$webserver-> 保存后构建测试
 

 

 

 

 

 

 点击开始构建够,在jenkins服务器目录上查看

[root@jenkins ~]# cd /var/lib/jenkins/workspace/
[root@jenkins workspace]# ls
website
[root@jenkins workspace]# cd website/
[root@jenkins website]# ls
website-1.0  website-2.0

6.进一步修改工程:

  1.将软件目录拷贝到/var/www/html/deploy/.pkgs

  2.将软件目录下的.git隐藏目录删除

  3.将软件目录打包,便于下载

  4.删除软件目录

  5.计算压缩包的md5值

  6.生成/var/www/html/deploy/{last_ver,live_ver}两个文件,分别记录前一版本号和当前版本号
第一步 

 

将软件目录拷贝到/var/www/html/deploy/.pkgs

[root@jenkins website]# systemctl restart httpd
[root@jenkins website]# systemctl enable httpd
[root@jenkins website]# mkdir -p /var/www/html/deploy/pkgs
[root@jenkins website]# chown -R jenkins.jenkins /var/www/html/deploy/   #注意别写错路径

 

 excecute shell中添写的脚本代码:

复制代码
deploy_dir=/var/www/html/deploy/pkgs  # 定义变量
cp -r website-$webver $deploy_dir  # 拷贝软件目录到web目录
cd $deploy_dir   # 切换到web目录
rm -rf website-$webver/.git  # 删除版本库文件
tar czf website-$webver.tar.gz website-$webver   # 打包压缩
rm -rf website-$webver   # 删除软件目录,只保留压缩包
# 计算压缩包的md5值
md5sum website-$webver.tar.gz | awk '{print $1}' > website-$webver.tar.gz.md5
# 生成last_ver和live_ver文件
cd ..
[ -f live_ver ] && cat live_ver > last_ver
echo $webver > live_ver
复制代码

 

 

 开始构建

点击 build with parameter->工程1.0开始构建-->jenkins机器上 cd  /var/www/html/deploy,查看一下代码是都创建并打包

 [root@jenkins html]# cd deploy/
[root@jenkins deploy]# ls
last_ver  live_ver  pkgs
[root@jenkins deploy]# cd pkgs/
[root@jenkins pkgs]# ls
website-1.0.tar.gz      website-2.0.tar.gz
website-1.0.tar.gz.md5  website-2.0.tar.gz.md5

 自动部署代码

/var/www/download  保存下载软件包

/var/www/deploy  保存live_ver文件的解压目录

/var/www/html/nsd1906   

 回滚思路

取出last_ver版本号

构建本地目录'/var/www/deploy/website-%s' % ver

把 /var/www/html/nsd1906 删除

创建软连接

复制代码
import wget
import os
import requests
import hashlib
import tarfile

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

    # 取出本地版本
    with open(ver_fname) as fobj:
        local_ver = fobj.read()

    # 本地版本与网上版本比较,如果不一致返回True
    r = requests.get(ver_url)
    if local_ver != r.text:
        return True
    else:
        return False

def file_ok(md5_url, fname):
    '如果文件已损坏返回False,否则返回True'
    # 计算本地文件的md5值
    m = hashlib.md5()
    with open(fname, 'rb') as fobj:
        while 1:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)

    # 取出网上的md5值,进行比较
    r = requests.get(md5_url)
    if m.hexdigest() == r.text.strip():
        return True
    else:
        return False

def deploy(app_fname):
    '部署软件'
    deploy_dir = '/var/www/deploy'
    dest = '/var/www/html/nsd1906'
    # 解压
    tar = tarfile.open(app_fname)
    tar.extractall(path=deploy_dir)
    tar.close()

    # 取出软件目录名
    app_dir = app_fname.split('/')[-1]
    app_dir = app_dir.replace('.tar.gz', '')
    app_dir = os.path.join(deploy_dir, app_dir)

    # 如果目标链接文件已存在,先删除
    if os.path.exists(dest):
        os.remove(dest)

    # 创建软链接
    os.symlink(app_dir, dest)


if __name__ == '__main__':
    # 判断是否有新版本,没有则退出
    ver_url = 'http://192.168.4.6/deploy/live_ver'
    ver_fname = '/var/www/deploy/live_ver'
    if not has_new_ver(ver_url, ver_fname):
        print('未发现新版本。')
        exit(1)

    # 下载新版本软件
    r = requests.get(ver_url)
    ver = r.text.strip()  # 把额外的\n删除,得到版本
    app_url = 'http://192.168.4.6/deploy/pkgs/website-%s.tar.gz' % ver
    down_dir = '/var/www/download'
    wget.download(app_url, down_dir)

    # 校验。如果下载的文件已损坏,删除它
    md5_url = app_url + '.md5'
    app_fname = app_url.split('/')[-1]
    app_fname = os.path.join(down_dir, app_fname)
    if not file_ok(md5_url, app_fname):
        os.remove(app_fname)
        print('文件已损坏。')
        exit(2)

    # 部署软件
    deploy(app_fname)

    # 更新live_ver文件的版本
    if os.path.exists(ver_fname):

 

posted @ 2020-01-13 20:08  mkdirhaha  阅读(411)  评论(0编辑  收藏  举报