DEVOPS05 - Git仓库、Jenkins搭建、应用Jenkins、管理应用服务器

一、Jenkins基础

1.1 Jenkins简介

1.1.1 什么是Jenkins

Jenkins是一款非常流行的CI(持续集成)软件,用于构建和测试各种项目。

1.1.2 Jenkins特点

  1. 可以选择安装多种插件,支持各种SCM(软件配置管理)工具(如SVN、GIT、CVS等)
  2. 能够构建各种风格的项目
  3. 安装简单,用户界面友好

1.2 安装Jenkins

1.2.1 rpm安装Jenkins

rpm -ivh jenkins-2.121-1.1.noarch.rpm
systemctl star jenkins
systemctl enable jenkins

1.2.2 yum安装Jenkins

yum install -y java-1.8.0-openjdk
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
yum clean all
yum -y install jenkins
systemctl start jenkines

1.2.2 初始化Jenkins

1. Jenkins默认运行在8080端口

2.如果网速较快,选择推荐插件,否则选择自定义,只选中GIT即可

3.直接使用admin管理用户登录

4.安装成功如下图所示:

5.修改管理员密码:admin->设置

二、准备git仓库

2.1 初始化wordpress项目

1.解压wordpress 4.8版本

[root@localhost    ~]#    unzip    wordpress-4.8-zh_CN.zip

2.初始化git仓库

[root@localhost    ~]#    cd    wordpress/    
[root@localhost    wordpress]#    git    init    
[root@localhost    wordpress]#    git    add    .    
[root@localhost    wordpress]#    git    commit    -m    "wordpress    init"    
[root@localhost    wordpress]#    git    status    
#    位于分支 master    
无文件要提交,干净的工作区

2.2 tag标签

1. 如果达到一个重要的阶段,并希望永远记住那个特别
的提交快照,可以使用 git tag 给它打上标签
2.  将初始化完毕的wordpress打标签v1.0

[root@localhost    wordpress]#    git    tag    v1.0

2.3 升级wordpress

1. 将wordpress新版本解压到项目中

[root@localhost    wordpress]#    cd    ..    
[root@localhost    ~]#    unzip    wordpress-4.9-zh_CN.zip    
Archive:        wordpress-4.9-zh_CN.zip    
replace    wordpress/wp-mail.php?    [y]es,    [n]o,    [A]ll,    [N]one,    [r]ename:    A

2.4 更新git仓库

1. 检查git状态

[root@localhost    ~]#    cd    wordpress/    
[root@localhost    wordpress]#    git    status    

2. 将更新/增加的文件确认至仓库

[root@localhost    wordpress]#    git    add    .    
[root@localhost    wordpress]#    git    commit    -m    "upgrade    to    new    version"    

2.5 添加标签

1. 确认所有项目已提交

[root@localhost    wordpress]#    git    status    
#    位于分支 master    
无文件要提交,干净的工作区

2. 为升级后的wordpress项目增加v2.0标签

[root@localhost    wordpress]#    git    tag    v2.0

2.6 管理标签

1. 查看所有标签

[root@localhost    wordpress]#    git    tag    
v1.0    
v2.0    

2. 切换至v1.0标签

[root@localhost    wordpress]#    git    checkout    v1.0    
Note:    checking    out    'v1.0'.    

3. 切换到最新状态

[root@localhost    wordpress]#    git    checkout    master    
之前的 HEAD    位置是 50984b1...    wordpress    init    
切换到分支 'master'    

三、gitlab远程服务器的搭建和使用

3.0 gitlab的搭建

配置node1作为gitlab服务器
1、安装docker
[root@node1 docker]# cd docker_pkgs/
[root@node1 docker_pkgs]# yum install -y *.rpm

2、启动服务
[root@node1 docker_pkgs]# systemctl start docker
[root@node1 docker_pkgs]# systemctl enable docker

3、导入镜像
[root@node1 docker]# cd images/
[root@node1 images]# docker load < gitlab_zh.tar

4、将虚拟机的ssh端口改为2222
[root@node1 ~]# vim /etc/ssh/sshd_config 
Port 2222
[root@node1 ~]# systemctl restart sshd
退出ssh,再重新连接
[root@room8pc16 python]# ssh -p2222 192.168.4.1

5、启动gitlab
[root@node1 ~]# docker run -d -h gitlab --name gitlab -p 443:443 -p 80:80 -p 22:22 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab_zh:latest
说明: -h gitlab是设置容器的hostname主机名,--name gitlab是设置容器名字,也就是通过docker ps查看到的名字;--restart always指的是出现问题重启容器

6、gitlab关键概念
群组group:公司中每个团队可以创建一个组
项目project:存储代码的地方,里面还包含问题列表、维基文档以及其他一些Gitlab功能
成员member:添加你的团队成员或其他人员到Gitlab

7、gitlab上创建devops的组,创建core_py的项目,创建用户。将用户设置为项目的主程序员。

3.1 创建一个devops的群组

3.2 创建名为wordpress的项目

3.3 为wrodpress项目创建主程序员用户

3.4 新用户登陆重置密码,然后设置ssh密钥

3.5 上传wordpress代码

1. 因为本地wordpress已经是git版本库了,所以采用以下方式进行上传:

[root@localhost    ~]#    cd    wordpress/    
[root@localhost    wordpress]#    git    remote    rename    origin    old-origin    
error:    不能重命名配置小节 'remote.origin'    到 'remote.old-origin’    
上述错误可忽略    
[root@localhost    wordpress]#    git    remote    add    origin    [email protected]:devops/wordpress.git    
[root@localhost    wordpress]#    git    push    -u    origin    --all    
[root@localhost    wordpress]#    git    push    -u    origin    --tags

3.6 在网页中查看项目

1. 所有的tag可以通过http://192.168.113.139/devops/wordpress/tags访问

四、jenkins的使用

4.1 构建项目

4.1.1 下载git插件

1. 为了使得Jenkins可以使用git的tag,需要下载gitparameter插件
2.  点击“系统管理”->“管理插件”

4.1.2 创建自由风格项目

1. 新建任务

2. 选择自由风格

4.1.3 设置参数

1. 添加Git Parameter参数

2.设置tag的名称

4.1.4 源码管理

1. 源码采用git

2. 将源码checkout到子目录

4.1.5 构建工程

1. 构建工程

2. 选择指定的标签

4.1.6 检验结果

1. 查看控制台日志输出

4.1.7 查看本地结果

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

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

4.2 分发服务器管理

4.2.1 优化构建工程思路

1. 在Jenkins服务器上安装apache,用于分发应用程序
2.  为了方便应用服务器下载,Jenkins构建的工程应该打包成为一个文件
3. 为了应用服务器可以获知下载的程序文件是没有损坏的,应该为其生成md5值

4.2.2 配置分发服务器

1. 通过web服务为应用服务器提供应用程序
2. 下载目录为/var/www/deploy/packages

[root@localhost    ~]#    yum    install    -y    httpd    
[root@localhost    ~]#    mkdir    -pv    /var/www/html/deploy/packages    
[root@localhost    ~]#    chown    -R    jenkins.jenkins    /var/www/html/deploy/    
[root@localhost    ~]#    systemctl    start    httpd    
[root@localhost    ~]#    systemctl    enable    httpd

4.2.3 修改工程配置

1.为下载的应用打包,以及生成md5,可以增加构建步骤(执行shell命令)

2. 打包从gitlab远程服务器上拉取下来的项目文件夹,并计算md5值,把项目文件夹的压缩包放到/var/www/html/deploy共享目录下,方便应用服务器拉取。

deploy_dir=/var/www/html/deploy/packages
cp -r mp_${mptag} $deploy_dir
rm -rf $deploy_dir/mp_${mptag}/.git
cd $deploy_dir
tar czf mp_${mptag}.tar.gz mp_${mptag}
rm -rf mp_${mptag}
md5sum mp_${mptag}.tar.gz | awk '{print $1}' > mp_${mptag}.tar.gz.md5

4.2.4 测试修改后的工程

1. 重新构建工程

2. 检查分发服务器的相关目录

[root@localhost    ~]#    ls    /var/www/html/deploy/packages/    
wpress_v1.0.tar.gz        wpress_v1.0.tar.gz.md5    

[root@localhost    ~]#    cat    /var/www/html/deploy/packages/
wpress_v1.0.tar.gz.md5        
e4taef54a5f580b4e08d5245cc95268

4.2.5 分发服务器版本控制思路

1. 由jenkines创建两个版本文件
–  live_version:记录应用程序当前版本
–  last_version:记录应用程序前一个版本
2.  应用服务器可以查看live_version和本机的最新版本做对比,决定是不是要发布新版本
3.  如果新版本有问题,应用服务器可以根据last_version回滚到前一版本

4.2.6 创建一个版本控制工程

1. 新建一个自由风格的项目

2.参数化构建过程选择添加一个字符类型的参数

3.通过增加构建步骤来创建live_version和last_version文件

附:shell命令如下:

deploy_dir=/var/www/html/deploy    #定义版本文件的路径
cd $deploy_dir
[ -f live_version ] && cat live_version > last_version  #如果有版本文件,就把当前的live_version写入到旧的last_version
echo ${mptag} > live_version     #如果没有版本文件,证明是第一次构建,就把当前的版本写入到live_version 

值得注意的是 : 构建版本控制工程接收的字符串应该来自于wp项目提交的版本号

4.2.7 执行版本控制工程

1. 写入项目的版本号,开始构建。这个版本号取自项目中提交的版本号。

4.2.8 查看构建结果

1. 因为是第一次构建,只会产生一个live_version文件,并且版本号就是传入的字符串参数

[root@localhost    ~]#    ls    /var/www/html/deploy/    
live_version        packages    


[root@localhost    ~]#    cat    /var/www/html/deploy/live_version        
v1.0

五、管理应用服务器

5.1 应用服务器自动部署程序

5.1.1 需求:

当有新版本发布,应用服务器只要执行脚本,就可以把分发服务器(jenkines服务器)的live_version版本的软件包下载

下来,然后发布,最后通过指定的域名访问

5.1.2 实现思路:

1. 将分发服务器的live_version和本地的live_version文件对比。不一致就下载软件包

2.解压下载的最新文件,并给这个文件夹做一个链接,这个链接会一直指向最新版本的文件夹

5.1.3 代码实现

import os,sys,requests,tarfile,hashlib

def check_version(remote_file,local_file):
    if  os.path.exists(local_file):
        remote_Version=requests.get(remote_file).text
        with open(local_file) as fobj:
            local_Version=fobj.read()

        print(remote_Version,local_Version)
        if remote_Version != local_Version:   #本地版本和远程版本不一致返回True
            return True
        else:
            return False
    else:
        return True

#下载远程服务器最新文件
def download(softUrl,dstFileName):
    soft=requests.get(softUrl)
    with open(dstFileName,'wb') as fobj:
        fobj.write(soft.content)   #把下载下来的数据写入到目标文件中去

def check_md5(md5_url,dstFileName):
    '文件没有损坏,返回True,否则返回False'
    r = requests.get(md5_url)
    m = hashlib.md5()
    with open(dstFileName, 'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)
    if m.hexdigest() == r.text.strip():
        return True  # md5相同返回True,否则是False

    return False

def deploy(package,deployDir):  # tarfile 打开,读取,关闭
    os.chdir('/var/www/packages/')
    tar=tarfile.open(package,'r:gz')
    tar.extractall()
    tar.close()
    if os.path.exists('/var/www/html/mysit'):
        os.unlink('/var/www/html/mysite')
    os.symlink(deployDir,'/var/www/html/mysite')

if __name__ == '__main__':
       remote_verFile='http://192.168.5.14/deploy/live_version'
       local_verFile='/var/www/packages/live_version'
       versionResult=check_version(remote_verFile,local_verFile)
       if not versionResult:
           sys.exit(0)

       print('本地版本和服务器端的版本不一致,正在下载...')
       remote_Version=requests.get(remote_verFile).text.strip()
       remote_LeastSoft_url='http://192.168.5.14/deploy/packages/mp_%s.tar.gz' % remote_Version
       local_SoftFile='/var/www/packages/mp_%s.tar.gz' % remote_Version

       download(remote_LeastSoft_url,local_SoftFile)  #下载服务器端最新版的软件到本地
       download(remote_verFile,local_verFile)         #下载服务器端最新版的版本文件到本地
       print('下载完成')
       #md5_url = 'http://192.168.5.14/deploy/packages/mp-%s.tar.gz.md5' % remote_Version
       # file_ok = check_md5(md5_url,local_SoftFile)  #检验本地的版本压缩文件是否和远程对应版本的md5值一致
       # if not file_ok:  # 如果下载的文件是损坏的,程序退出
       # sys.exit(1)
       local_DeployDir='/var/www/packages/mp_%s' % remote_Version
       deploy(local_SoftFile,local_DeployDir)
       print('部署完成,通过 firefox 192.168.5.254/mysite访问最新版网页')

猜你喜欢

转载自blog.csdn.net/qq_36441027/article/details/82996091