第八節: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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM