zoukankan      html  css  js  c++  java
  • 第八节:DevOps开发模式详解和基于Jenkins实现项目的自动化部署

    一. DevOps开发模式

    1. 传统模式

      在传统的开发模式中,开发的整个过程是按部就班就行:

    但是这种模式存在很大的弊端:

     * 工作的不协调:开发人员在开发阶段,测试和运维人员其实是处于等待的状态。等到测试阶段,开发人员等待测试反馈bug,也会处于等待状态。

     * 线上bug的隐患:项目准备交付时,突然出现了bug,所有人员需要加班、等待问题的处理;

    2. DevOps模式

      DevOps是Development和Operations两个词的结合,将开发和运维结合起来的模式:

    3. CI/CD

    伴随着DevOps一起出现的两个词就是持续集成和持续交付(部署):

    • CI是Continuous Integration(持续集成);

    • CD是两种翻译:Continuous Delivery(持续交付)或Continuous Deployment(持续部署)

    (1). 持续集成CI

     

    (2). 持续部署CD

     

    二. 自动化部署目标和流程

    1. 目标

      将一个 Vue3 项目提交到gitee后,可以实现自动部署到服务器上,即 随时提交,每隔30min中自动部署。

    2. 环境准备

     服务器:centos8.1 (虚拟机)

     项目:基于VueCli创建的Vue3项目

     代码仓库:gitee

     服务器环境:

      (1). git环境 

      (2). git1.8

      (3). jenkins环境 (需要安装node插件)

      (4). nginx服务器

    3. 流程图

      

    三. 基于Jenkins自动化部署详细步骤

    1. 安装Java环境

    (jenkins依赖于java环境) 

    (1). 先通过dnf工具搜索一下java安装包 【dnf search java-1.8】

    (2). 安装java环境 【dnf install java-1.8.0-openjdk.x86_64】 

     PS: centos8.x版本,默认就含有dnf了,用它来安装各种包.(类似于npm, centos7版本用的是yum)

    (3) 通过指令 【java -version】查看java版本 

    2. 安装git环境

     服务器上需要安装git环境, 用于jenkins和gitee进行资源的同步

     运行指令【dnf install git -y】,-y表示直接进行安装,不需要在确认了

    3. 安装/配置nginx

    (1). 通过指令 【dnf install nginx -y】进行nginx的安装

    (2). 启动nginx →  查看nginx状态 → 设置开机自动启动nginx

    【systemctl start nginx】
    【systemctl status nginx】
    【systemctl enable nginx】

    nginx默认监听80端口,输入:【 http://192.168.137.201 】,出现如下页面,表示nginx启动成功

    (3).  在root目录下的publish文件夹下创建一个 vue3_test1文件夹,用来存放项目发布包;然后创建一个 index.html页面,用来测试使用。

    【 mkdir /root/publish/vue3_test1 】

    【touch index.html】

    然后编辑 index.html页面,随意输入内容即可,比如 

    (4). 修改nginx配置文件,使其映射到上述(3)中创建的index.html上   【vi /etc/nginx/nginx.conf】

    默认配置文件:

    # For more information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    
    # Settings for a TLS enabled server.
    #
    #    server {
    #        listen       443 ssl http2 default_server;
    #        listen       [::]:443 ssl http2 default_server;
    #        server_name  _;
    #        root         /usr/share/nginx/html;
    #
    #        ssl_certificate "/etc/pki/nginx/server.crt";
    #        ssl_certificate_key "/etc/pki/nginx/private/server.key";
    #        ssl_session_cache shared:SSL:1m;
    #        ssl_session_timeout  10m;
    #        ssl_ciphers PROFILE=SYSTEM;
    #        ssl_prefer_server_ciphers on;
    #
    #        # Load configuration files for the default server block.
    #        include /etc/nginx/default.d/*.conf;
    #
    #        location / {
    #        }
    #
    #        error_page 404 /404.html;
    #            location = /40x.html {
    #        }
    #
    #        error_page 500 502 503 504 /50x.html;
    #            location = /50x.html {
    #        }
    #    }
    
    }
    View Code

    修改后的配置文件

     

    # For more information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user root;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
            #root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
                root /root/publish/vue3_test1;
                index index.html;
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    
    # Settings for a TLS enabled server.
    #
    #    server {
    #        listen       443 ssl http2 default_server;
    #        listen       [::]:443 ssl http2 default_server;
    #        server_name  _;
    #        root         /usr/share/nginx/html;
    #
    #        ssl_certificate "/etc/pki/nginx/server.crt";
    #        ssl_certificate_key "/etc/pki/nginx/private/server.key";
    #        ssl_session_cache shared:SSL:1m;
    #        ssl_session_timeout  10m;
    #        ssl_ciphers PROFILE=SYSTEM;
    #        ssl_prefer_server_ciphers on;
    #
    #        # Load configuration files for the default server block.
    #        include /etc/nginx/default.d/*.conf;
    #
    #        location / {
    #        }
    #
    #        error_page 404 /404.html;
    #            location = /40x.html {
    #        }
    #
    #        error_page 500 502 503 504 /50x.html;
    #            location = /50x.html {
    #        }
    #    }
    
    }
    View Code

    (5). 重启nginx   【systemctl restart nginx】, 继续访问 【 http://192.168.137.201 】,发现出现403禁止访问了

    (6). 设置整个文件夹内容的权限:【chmod -R 777 /root/publish/vue3_test1】,发现还是403禁止访问

     (7) 关闭SELinux, 通过 【vi /etc/selinux/config】把SELINUX改为disabled,然后 reboot重启。  最后再次访问:【 http://192.168.137.201 】大功告成。

    4. 创建gitee代码仓库

    (1). 先通过vuecli创建一个项目vue3_test1

    (2). 在gitee 创建一个私有仓库,仓库地址为:https://gitee.com/ypf0806/vue3_test1.git

    (3). 运行下面指令,将本地的vue3_test1项目推送到远程仓库

    【git remote add origin https://gitee.com/ypf0806/vue3_test1.git】
    【git push -u origin "master"】

    5. 安装Jenkins

    (1).  进入目录 【cd /etc/yum.repos.d/ 】,然后运行指令 【wget http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo】进行下载

    PS:因为Jenkins本身是没有在dnf的软件仓库包中的,所以我们需要连接Jenkins仓库

    • wget是Linux中下载文件的一个工具,-O表示输出到某个文件夹并且命名为什么文件;

    • rpm:全称为The RPM Package Manage,是Linux下一个软件包管理器;

    (2). 导入GPG密钥以确保您的软件合法

    【rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key】 或 【rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key】

    (3). 编辑 【vi /etc/yum.repos.d/jenkins.repo】, 改为下面代码

    [jenkins]
    name=Jenkins-stable
    baseurl=http://pkg.jenkins.io/redhat
    gpgcheck=1

    (4). 运行指令进行安装 【dnf install jenkins --nobest -y】

     

    (5) 启动jenkins → 查看状态 → 设置开机自动启动

    【systemctl start jenkins】
    【systemctl status jenkins】
    【systemctl enable jenkins】

    (6). Jenkins默认使用8080端口提供服务, 访问:【 http://192.168.137.201:8080 】, 云服务器需要配置安全组, 虚拟机需要通过防火墙开辟端口运行。运行上述地址,还是无法访问。

      运行了下面指令,发现8080端口没有监听到, 见鬼了。

    【ps -ef|grep jenkins】 

    【netstat -ntap|grep 8080】

    (7). 重启虚拟机,重新启动jenkins 【systemctl start jenkins】,访问地址 【 http://192.168.137.201:8080 】发现成功了,至此大功告成。

    (8). 查看密码 【cat /var/lib/jenkins/secrets/initialAdminPassword】,复制到上述页面,进入下面页面, 选择安装推荐插件。

    (9). 创建管理员账号和密码,账号 root  密码123456,最后进入主页面,至此安装彻底完成。

    6. Jenkins任务配置

    (1).  新建Item → 输入任务名称 testJenkins1→ 选择 Freestyle project

    (2). 填写描述 → 源码管理,输入Url地址 → 添加访问权限

     

    (3). 输入用户名 和 密码,这里是gitee的用户名和密码如果密码不好用,需要去gitee生成token赋值到密码的位置,保存后,退回到上一个页面,红色的报错已经没了

     

    (4). 配置触发器,选择 Build periodically(定时构建) → 输入 【H/5 * * * *】,表示每隔5分钟拉取一下代码, 保存

     ps:补充触发器的规则 ,定时字符串从左往右分别是:分 时 日 月 周

    #每半小时构建一次OR每半小时检查一次远程代码分支,有更新则构建
    H/30 * * * *
    
    #每两小时构建一次OR每两小时检查一次远程代码分支,有更新则构建
    H H/2 * * *
    
    #每天凌晨两点定时构建
    H 2 * * *
    
    #每月15号执行构建
    H H 15 * *
    
    #工作日,上午9点整执行
    H 9 * * 1-5
    
    #每周1,3,5,从8:30开始,截止19:30,每4小时30分构建一次
    H/30 8-20/4 * * 1,3,5
    View Code

    (5). 配置到此处,已经可以实现 jenkins从 gitee上 定时抓取代码了,通过查看控制台记录,知道下载在如下图目录下

    运行指令【cd /var/lib/jenkins/workspace/testJenkins1】,进入该目录进行查看,确实拉取成功了 

    截至此处,Jenkins定时拉取代码已经大功告成了,下面就是制作发布包了!!!!

    (5). 退回主面板,选择 Manage Jenkins → ① 先 Manage Plugins( 安装node插件的位置)② 然后 Global Tool Configuration (配置node环境的位置) 

     A. 安装node插件

     

     

     B. nodejs安装,并配置环境

     

    C. 再回到jenkins任务中,选择构建环境,选择刚才的nodejs, 上面的命名为:node16.10,执行任务的时候,就会安装,这个安装过程有点慢

    (6). 构建执行任务

    构建执行的任务:

    * 查看Node的版本等是否有问题;

    * 执行 `npm install` 安装项目的依赖;

    * 移除原来vue3_test1文件的所有内容;

    * 将打包的dist文件夹内容移动到vue3_test1文件夹;(下面的脚本可以分两步来测试)

    #第一步
    pwd
    node -v
    npm -v
    
    npm install 
    npm run build
    
    pwd
    echo '构建成功'
    ls
    
    #第二步
    # 删除/root/publish/vue3_test1文件夹里所有的内容
    rm -rf /root/publish/vue3_test1/* 
    
    # 将生成发布包复制到vue3_test1文件夹下
    cp -rf ./dist/* /root/publish/vue3_test1/

    第一步:光构建

    第二步,执行删除和迁移

    继续运行指令,发现rm删除权限不够,参考:https://www.cnblogs.com/zhangjianchao/p/15364286.html

    主要是修改一下:【vi /etc/sysconfig/jenkins】

    重新执行Jenkins任务,发现执行成功

    查看vue3_test1文件夹下的内容,发现已经复制进去了。

    (7).  本地修改代码,提交到gitee上,jenkins会自动拉取发布,访问niginx服务器 【 http://192.168.137.201】,发现是修改后的内容,至此大功告成

     

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    真情感动看上海新闻娱乐频道“百家心”
    Treeview Navigation Web Part for SharePoint with SmartPart v1.0
    轻松玩转Typed DataSet, Part III
    微软Avalon和WinForms的发展蓝图
    Proxy Pattern using C#
    System.Threading.Timer类的TimerCallback 委托
    SmartPart v1.0 for SharePoint [Free Web Part]
    分布式应用架构中的数据传输对象(DTO)
    定制SharePoint Portal Server 2003站点的向导
    Bridge Pattern using C#
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/15773719.html
Copyright © 2011-2022 走看看