Jenkins

Jenkins基础

Jenkins概述
  • Jenkins是由java编写的一款开源软件
  • 作为一款非常流行的CI(持续集成)工作,用于构建和测试各种项目
  • Jenkins 的主要功能是监视重复工作的执行,例如软件工程的构建或在cron下设置的jobs
持续集成
  • 持续集成(CI)是当下最为流行的应用程序开发实践方式
  • 程序员在代码仓库中集成了修复bug、新特性开发或是功能革新
  • CI工具通过自动构建和自动测试来验证结果。这可以检测到当前程序代码的问题,迅速提供反馈
Jenkins特点
  • 简单、可扩展、用户界面友好
  • 支持各种SCM(软件配置管理)工具,如SVN、GIT、CVS等
  • 能够构建各种风格的项目
  • 可以选择安装多种插件
  • 跨平台,几乎可以支持所有的平台

安装jenkins

  • 安装软件包,并启服务
[root@node7 ~]# yum install -y jenkins-2.177-1.1.noarch.rpm 
[root@node7 ~]# systemctl start jenkins
[root@node7 ~]# systemctl enable jenkins
  • 访问jenkins的8080端口

  • 注意,在安装插件页面,选择“选择插件来安装”,然后点击“无”。因为此时安装插件将会访问国外站点安装,速度慢。将来改成国内镜像站点安装。

  • “创建第一个管理员用户”页面,点击右下角的“使用admin”

  • 进入页面后,先点击右上角的“admin”三角号的下接菜单选configure。在此页面改密码。

安装插件

  • 在首页上点击manage jenkins -> manage plugins -> advanced -> update site中的url填写:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json -> submit
  • 点击Available选项卡,搜索找到[Localization: Chinese (Simplified),勾选左侧的复选框,该插件用于中文支持。
  • 点击Install without restart
  • 勾选Restart jenkins… …
  • 为了使得Jenkins可以使用git的tag,需要下载git parameter插件
  • 点击“系统管理”->“管理插件
    在这里插入图片描述

CI流程

(一) 程序员编写代码,并推送到服务器

(1) 程序员创建软件项目
root@node5 ~]# git init myweb
(2) 初始化空的 Git 版本库于 /root/myweb/.git/

 [root@node5 ~]# cd myweb
 [root@node5 myweb]# echo '<h1>my web site</h1>' > index.html
 [root@node5 myweb]# git add .
 [root@node5 myweb]# git commit -m "my web 1.0"
 [root@node5 myweb]# git tag 1.0   # 添加标记,标记为1.0版本
 [root@node5 myweb]# git tag    # 查看所有标记
 1.0

(3) 在gitlab上创建名为myweb的项目

  • 通过root用户创建
  • 项目属于devops组
  • 项目是公开的
  • 昨天新建的用户成为该项目的主程序员

(4)程序员将代码上传到gitlab服务器

[root@node5 myweb]# git remote rename origin old-origin
error: 不能重命名配置小节 'remote.origin''remote.old-origin'
[root@node5 myweb]# git remote add origin git@192.168.4.6:devops/myweb.git
[root@node5 myweb]# git push -u origin --all
[root@node5 myweb]# git push -u origin --tags   # 推送标记

(二)jenkins服务器下载代码

(1) 在jenkins服务器上安装git
[root@node7 ~]# yum install -y git

(2)在jenkins上创建一个自由风格的项目

  • Genereral -> This project is parameterized -> 添加参数: git parameter -> name: webver, Parameter Type: Branch or Tag, Default Value: origin/master
  • 源码管理:git -> Repository URL: http://192.168.4.6/devops/myweb.git -> Branch Specifier (blank for ‘any’): $webver
  • 基础构建已经可以完成,点击保存按钮。
  • 构建工程。点击工程左侧的Build with Parameters。默认情况下,软件将会下载到/var/lib/jenkins/workspace目录。 点击1.0版本->开始构建
    在这里插入图片描述
    选择自由风格
    在这里插入图片描述
    设置参数
    • 添加Git Parameter参数
    在这里插入图片描述
    添加Git Parameter参数

在这里插入图片描述
源码管理

  • 源码采用git

在这里插入图片描述

  • 将源码checkout到子目录
    在这里插入图片描述

在这里插入图片描述
构建工程

  • 构建工程

在这里插入图片描述

  • 选择指定的标签
    在这里插入图片描述
    检验结果

  • 选择指定的标签
    在这里插入图片描述

  • 查看日志输出
    在这里插入图片描述
    在这里插入图片描述

  • 构建好的项目出现在/var/lib/jinkens目录下

[root@localhost ~]#	cd	/var/lib/jenkins/workspace/
[root@localhost workspace]#	ls
wpbuild
[root@localhost workspace]#	ls wpbuild/
wpress_v1.0

(3) 为下载的每个版本创建一个子目录

  • 删除jenkins的下载目录
    [root@node7 ~]# rm -rf /var/lib/jenkins/workspace/build_myweb/
  • 修改build_myweb工程。
    Additional Behaviours -> 新增 -> checkout to a sub-directory: myweb-$webver
  • 保存后,重新构建测试

(4) jenkins服务器为了方便最终的应用服务器下载,把软件打包压缩放到web目录下

  • 安装apache
 [root@node7 ~]# yum install -y httpd
 [root@node7 ~]# systemctl start httpd
 [root@node7 ~]# systemctl enable httpd
  • 规划apache web服务器目录和文件
    /var/www/html/deploy/lastver文件: 用于存储上一个版本号
    /var/www/html/deploy/livever文件:用于存储当前版本号
    /var/www/html/deploy/packages目录:用于保存软件的各个版本的压缩包和md5值
    [root@node7 ~]# mkdir -p /var/www/html/deploy/packages
  • 修改jenkins工程
    构建 -> 增加构建步骤 -> execute shell ->
dest=/var/www/html/deploy/packages
cp -r myweb-$webver $dest   # 拷贝版本文件到web目录
cd $dest
rm -rf myweb-$webver/.git   # 删除版本库文件
tar czf myweb-$webver.tar.gz myweb-$webver  # 打包软件
rm -rf myweb-$webver   # 删除软件目录,因为只保留压缩包即可
md5sum myweb-$webver.tar.gz | awk '{print $1}' > myweb-$webver.tar.gz.md5  # 计算压缩包的md5值
cd ..
[ -f livever ] && cat livever > lastver  # 将livever内容写到lastver
echo $webver > livever   # 更新livever

(5)修改/var/www/html/deploy属主属组
[root@node7 ~]# chown -R jenkins.jenkins /var/www/html/deploy/
(6) 构建工程,测试。

应用服务器自动化部署流程

是否有新版本
退出
下载并判断是否损坏
退出
部署

部署应用程序

不要把应用软件直接解压到目标。可以把每个版本的程序都放到deploy目录下,网页主目录是指向某一版本的链接。想要发布哪个版本,只要把链接指向版本目录即可。

/var/www/download: 用于保存下载的软件包

/var/www/deploy:用于保存livever版本文件和解压的软件包

/var/www/html/project:指向某一版本目录的链接文件

Python部署脚本

#-*- coding: utf-8 -*-

import os
import requests
import wget
import hashlib
import tarfile

def has_new_ver(ver_url, ver_fname):
    "用于检查是否有新版本,返回值是True/False"
    # 如果本地没有版本文件或本地版本文件与网上livever不一样,就是有新版本
    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 r.text != local_ver:   # 本地和网上的版本号不一样,有新版本
        return True

    return False


def check_app(app_fname, app_md5_url):
    "用于检查下载的压缩包是否未损坏,完好返回值是True/损坏返回值是False"
    # 计算出本地文件的md5值
    m = hashlib.md5()
    with open(app_fname, 'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)
    result = m.hexdigest()

    r = requests.get(app_md5_url)  # 取出网上的md5值
    if result == r.text.strip():   # 本地和网上的md5值相同,则未损坏
        return True

    return False


def deploy(app_fname, web_root):
    "用于部署应用"
    # 解压软件包到目标
    dest = '/var/www/deploy'
    tar = tarfile.open(app_fname)
    tar.extractall(path=dest)
    tar.close()

    # 拼接出解压目录的绝对路径
    app_dir = app_fname.split('/')[-1]
    app_dir = app_dir.replace('.tar.gz', '')
    app_dir = os.path.join(dest, app_dir)

    # 创建链接。如果链接已存在,先将其删除
    if os.path.exists(web_root):
        os.remove(web_root)

    os.symlink(app_dir, web_root)

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

    # 下载软件
    r = requests.get(ver_url)
    version = r.text.strip()
    app_url = 'http://192.168.1.31/deploy/packages/myweb-%s.tar.gz' % version
    download_dir = '/var/www/download'
    wget.download(app_url, download_dir)

    # 检查压缩包是否损坏
    app_fname = app_url.split('/')[-1]
    app_fname = os.path.join(download_dir, app_fname)
    app_md5_url = app_url + '.md5'
    if not check_app(app_fname, app_md5_url):
        print('压缩包已损坏')
        os.remove(app_fname)  # 删除损坏的压缩包
        exit(2)

    # 更新本地版本文件
    with open(ver_fname, 'w') as fobj:
        fobj.write(version + '\n')

    # 部署软件包
    web_root = '/var/www/html/project'
    deploy(app_fname, web_root)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值