項目案例之Pipeline流水線及流水線發佈PHP項目(二)

項目案例之Pipeline流水線及流水線發佈PHP項目(二)

連接:https://pan.baidu.com/s/1NZZbocZuNwtQS0eGkkglXQ
提取碼:z7gj
複製這段內容後打開百度網盤手機App,操做更方便哦php

4.Jenkins的Pipeline流水線

主機名 IP地址 備註
Git 192.168.200.61 Git服務器
Jenkins 192.168.200.62 Jenkins服務器
[root@Git ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@Git ~]# uname -r
3.10.0-862.3.3.el7.x86_64
[root@Git ~]# systemctl stop firewalld
[root@Git ~]# systemctl disable firewalld
[root@Git ~]# systemctl stop NetworkManager
[root@Git ~]# systemctl disable NetworkManager

4.1 建立一個基於Pipeline流水線的項目

image.png-87.9kB

4.2 添加項目Git參數化構建

image.png-166.1kB

image.png-28.4kB

4.3 Pipeline腳本語法架構介紹

#Pipeline腳本語法架構
node ('slave節點名') {          #被操控的節點服務器
    def 變量    #def能夠進行變量聲明
    stage('階段名A'){     #流水線階段一
        執行步驟A
        執行步驟B
        執行步驟C
    }
    stage('階段名B'){     #流水線階段二
        執行步驟A
        執行步驟B
        執行步驟C
    }
    stage('階段名C'){     #流水線階段三
        執行步驟A
        執行步驟B
        執行步驟C
    }
}

image.png-37.1kB

#流水線模板腳本
node {
   def mvnHome
   stage('Preparation') { // for display purposes
      // Get some code from a GitHub repository
      git 'https://github.com/jglick/simple-maven-project-with-tests.git'
      // Get the Maven tool.
      // ** NOTE: This 'M3' Maven tool must be configured
      // **       in the global configuration.           
      mvnHome = tool 'M3'
   }
   stage('Build') {
      // Run the maven build
      if (isUnix()) {
         sh "'${mvnHome}/bin/mvn' -Dmaven.test.failure.ignore clean package"
      } else {
         bat(/"${mvnHome}\bin\mvn" -Dmaven.test.failure.ignore clean package/)
      }
   }
   stage('Results') {
      junit '**/target/surefire-reports/TEST-*.xml'
      archive 'target/*.jar'
   }
}

4.4利用Pipeline Syntax,編寫Pipeline Script並構建

(1)進入Pipeline Syntaxhtml

image.png-41.2kB

(2)經過腳本代碼生成器,生成Pipeline腳本代碼java

image.png-95.8kB

image.png-66.3kB

(3)將生成的代碼複製到流水線腳本相應步驟的stage函數裏node

image.png-254kB

(4)開始構建Pipeline項目mysql

image.png-37.6kB

image.png-37.3kB

4.5 從遠程倉庫下載Pipeline Script,並構建

(1)在Git服務器上建立一個存放Pipeline腳本的倉庫linux

[root@Git ~]# su - git
上一次登陸:二 10月 23 18:59:42 CST 2018pts/0 上
[git@Git ~]$ cd /home/git/repos/
[git@Git repos]$ ls
app.git
[git@Git repos]$ mkdir jenkinsfile        #建立存放Pipeline腳本的倉庫
[git@Git repos]$ cd jenkinsfile/
[git@Git jenkinsfile]$ git --bare init    #初始化倉庫
初始化空的 Git 版本庫於 /home/git/repos/jenkinsfile/

(2)在jenkins服務器上,往遠程倉庫提交一個Pipeline腳本。nginx

[root@Jenkins ~]# mkdir /test
[root@Jenkins ~]# cd /test/
[root@Jenkins test]# git clone git@192.168.200.61:/home/git/repos/jenkinsfile
正克隆到 'jenkinsfile'...
warning: 您彷佛克隆了一個空版本庫。
[root@Jenkins test]# ls
jenkinsfile


[root@Jenkins test]# cd jenkinsfile/
[root@Jenkins jenkinsfile]# mkdir itemA
[root@Jenkins jenkinsfile]# vim itemA/jenkinsfile
[root@Jenkins jenkinsfile]# cat itemA/jenkinsfile
node {
   def mvnHome
   stage('Preparation') {
   checkout([$class: 'GitSCM', branches: [[name: '${branch}']], 
   doGenerateSubmoduleConfigurations: false, extensions: [], 
   submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'f58165e3-e5a7-408a-a57d-a4b643b14308', 
   url: 'git@192.168.200.61:/home/git/repos/app.git']]])
   }
   stage('maven Build') {
    echo "maven build..."  
   }
   stage('deploy') {
    echo "deploy..."
   }
   stage('test') {
    echo "test..."
   }
}
#將腳本推送到遠程倉庫的master分支
[root@Jenkins jenkinsfile]# git add *
[root@Jenkins jenkinsfile]# git commit -m "第一次提交"
[master(根提交) 10fb59e] 第一次提交
 1 file changed, 18 insertions(+)
 create mode 100644 itemA/jenkinsfile

[root@Jenkins jenkinsfile]# git push -u origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 563 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/jenkinsfile
 * [new branch]      master -> master
分支 master 設置爲跟蹤來自 origin 的遠程分支 master。

(3)利用遠程倉庫裏的Pipeline腳本,進行流水線的構建
image.png-91.6kBgit

image.png-68.4kB

image.png-14.9kB

image.png-59.8kB

image.png-34.4kB

image.png-22.9kB

5. 項目案例一:Jenkins+Pipeline+Git+PHP博客項目流水線自動發佈

主機名 IP地址 備註
Git 192.168.200.61 Git服務器
Jenkins 192.168.200.62 Jenkins服務器
Web01 192.168.200.64 Web服務器
#全部服務器進行以下操做
[root@Git ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@Git ~]# uname -r
3.10.0-862.3.3.el7.x86_64
[root@Git ~]# systemctl stop firewalld
[root@Git ~]# systemctl disable firewalld
[root@Git ~]# systemctl stop NetworkManager
[root@Git ~]# systemctl disable NetworkManager

image.png-141.8kB

5.1 建立一個Pipeline流水線項目並進行參數化構建

image.png-89.9kB

image.png-53.2kB

因爲咱們仍舊打算將pipeline腳本放在遠程Git倉庫裏,所以咱們須要從遠程Git倉庫拉取Pipeline腳本,因此,參數化構建不支持Git的參數化。咱們只能使用字符結構的參數化構建。github

image.png-60.3kB

5.2 下載用於自動化發佈的PHP源碼wordpress源碼包,並上傳遠程git倉庫

#在Git服務器上建立用於存放源碼的Git倉庫
[root@Git ~]# hostname -I
192.168.200.61 
[root@Git ~]# cd /home/git/repos/
[root@Git repos]# ls
app.git  jenkinsfile
[root@Git repos]# mkdir wordpress
[root@Git repos]# cd wordpress/
[root@Git wordpress]# git --bare init
初始化空的 Git 版本庫於 /home/git/repos/wordpress/

[root@Git wordpress]# cd ..
[root@Git repos]# ll -d wordpress
drwxr-xr-x 7 root root 119 10月 23 20:12 wordpress
[root@Git repos]# chown -R git.git wordpress
[root@Git repos]# ll -d wordpress
drwxr-xr-x 7 git git 119 10月 23 20:12 wordpress
#在jenkins服務器上,克隆建立好的遠程Git倉庫
[root@Jenkins ~]# mkdir /php-app
[root@Jenkins ~]# cd /php-app
[root@Jenkins php-app]# git clone git@192.168.200.61:/home/git/repos/wordpress
正克隆到 'wordpress'...
warning: 您彷佛克隆了一個空版本庫。
[root@Jenkins php-app]# ls
wordpress
[root@Jenkins php-app]# cd wordpress/
[root@Jenkins wordpress]# ls
[root@Jenkins wordpress]#


#下載wordpres源代碼
[root@Jenkins wordpress]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@Jenkins wordpress]# ls
wordpress-4.9.4-zh_CN.tar.gz
[root@Jenkins wordpress]# tar xf wordpress-4.9.4-zh_CN.tar.gz
[root@Jenkins wordpress]# ls
wordpress  wordpress-4.9.4-zh_CN.tar.gz
[root@Jenkins wordpress]# mv wordpress-4.9.4-zh_CN.tar.gz /tmp/
[root@Jenkins wordpress]# ls
wordpress
[root@Jenkins wordpress]# mv wordpress/* .
[root@Jenkins wordpress]# ls
index.php    wp-activate.php       wp-config-sample.php  wp-links-opml.php  wp-settings.php
license.txt  wp-admin              wp-content            wp-load.php        wp-signup.php
readme.html  wp-blog-header.php    wp-cron.php           wp-login.php       wp-trackback.php
wordpress    wp-comments-post.php  wp-includes           wp-mail.php        xmlrpc.php
[root@Jenkins wordpress]# rm -rf wordpress/
#在jenkins上提交代碼到遠程Git倉庫
[root@Jenkins wordpress]# git add *
[root@Jenkins wordpress]# git commit -m "第一次提交"
[root@Jenkins wordpress]# git push -u origin master
Counting objects: 1660, done.
Compressing objects: 100% (1635/1635), done.
Writing objects: 100% (1660/1660), 8.86 MiB | 4.73 MiB/s, done.
Total 1660 (delta 173), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/wordpress
 * [new branch]      master -> master
分支 master 設置爲跟蹤來自 origin 的遠程分支 master。

5.3 設置分佈式構建的slave管理節點

咱們計劃利用分佈式構建的方式,啓動pipeline的流水線項目發佈
slave管理節點就設置爲須要用於發佈項目的Web服務器web

5.3.1 添加用於鏈接slave代理節點的SSH證書

image.png-29.7kB

5.3.2 添加並設置slave管理從節點

image.png-33kB

image.png-59.6kB

image.png-12.7kB

5.3.3 slave從節點安裝java環境,並啓動jenkins的slave管理節點

#解壓安裝jdk
[root@Web01 ~]# ls
anaconda-ks.cfg  jdk-8u171-linux-x64.tar.gz
[root@Web01 ~]# tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local
[root@Web01 ~]# cd /usr/local/
[root@Web01 local]# mv jdk1.8.0_171 jdk
[root@Web01 local]# /usr/local/jdk/bin/java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
#配置java環境
[root@Web01 ~]# sed -i.org '$a export JAVA_HOME=/usr/local/jdk/' /etc/profile
[root@Web01 ~]# sed -i.org '$a export PATH=$PATH:$JAVA_HOME/bin' /etc/profile
[root@Web01 ~]# sed -i.org '$a export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@Web01 ~]# tail -3 /etc/profile
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[root@Web01 ~]# source /etc/profile
[root@Web01 ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

image.png-13.7kB

5.4 Web服務器安裝LNMP環境,並手動拉取代碼模擬訪問

[root@Web01 ~]# yum -y install epel-release nginx php-fpm php-mysql
[root@Web01 ~]# rpm -qa epel-release nginx php-fpm php-mysql
php-fpm-5.4.16-45.el7.x86_64
nginx-1.12.2-2.el7.x86_64
php-mysql-5.4.16-45.el7.x86_64
epel-release-7-11.noarch
[root@Web01 ~]# cd /etc/nginx/
[root@Web01 nginx]# ls
conf.d                fastcgi_params          mime.types          scgi_params           win-utf
default.d             fastcgi_params.default  mime.types.default  scgi_params.default
fastcgi.conf          koi-utf                 nginx.conf          uwsgi_params
fastcgi.conf.default  koi-win                 nginx.conf.default  uwsgi_params.default
[root@Web01 nginx]# cp nginx.conf{,.bak}
[root@Web01 nginx]# egrep -v "#|^$" nginx.conf.bak > nginx.conf
[root@Web01 nginx]# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
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;
    include /etc/nginx/conf.d/*.conf;       #include了一個配置文件目錄
    server {
        listen       80 default_server;        #默認的server配置(若是用IP訪問就進入這個server)
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;    #默認的網頁目錄
        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 {
        }
    }
}
#因爲默認的配置文件include了/etc/nginx/conf.d/*.conf所以咱們增長一個server配置文件便可
[root@Web01 nginx]# cat /etc/nginx/conf.d/wp.conf
server {
    listen 80;
    server_name www.yunjisuan.com;
    root    /usr/share/nginx/html/www.yunjisuan.com;
    location / {
        index index.php index.html;
    }
    location ~\.php {
        fastcgi_index index.php;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi.conf;
    }
}
#建立網頁目錄
[root@Web01 ~]# cd /usr/share/nginx/html/
[root@Web01 html]# ls
404.html  50x.html  index.html  nginx-logo.png  poweredby.png
[root@Web01 html]# mkdir www.yunjisuan.com
[root@Web01 html]# cd www.yunjisuan.com/

#克隆Git倉庫代碼到本地網頁目錄
[root@Web01 www.yunjisuan.com]# yum -y install git
[root@Web01 www.yunjisuan.com]# rpm -qa git
git-1.8.3.1-14.el7_5.x86_64

[root@Web01 www.yunjisuan.com]# git clone git@192.168.200.61:/home/git/repos/wordpress
正克隆到 'wordpress'...
git@192.168.200.61's password: yangwenbo
remote: Counting objects: 1660, done.
remote: Compressing objects: 100% (1462/1462), done.
remote: Total 1660 (delta 173), reused 1660 (delta 173)
接收對象中: 100% (1660/1660), 8.86 MiB | 12.12 MiB/s, done.
處理 delta 中: 100% (173/173), done.

[root@Web01 www.yunjisuan.com]# ls
wordpress
[root@Web01 www.yunjisuan.com]# mv wordpress/* .
[root@Web01 www.yunjisuan.com]# ls
index.php    wp-activate.php       wp-config-sample.php  wp-links-opml.php  wp-settings.php
license.txt  wp-admin              wp-content            wp-load.php        wp-signup.php
readme.html  wp-blog-header.php    wp-cron.php           wp-login.php       wp-trackback.php
wordpress    wp-comments-post.php  wp-includes           wp-mail.php        xmlrpc.php
[root@Web01 www.yunjisuan.com]# rm -rf wordpress/
將網頁目錄權限受權給apache程序用戶
[root@Web01 www.yunjisuan.com]# cd ..
[root@Web01 html]# ll -d www.yunjisuan.com/
drwxr-xr-x 5 root root 4096 10月 24 10:01 www.yunjisuan.com/
[root@Web01 html]# id apache
uid=48(apache) gid=48(apache) 組=48(apache)
[root@Web01 html]# chown -R apache.apache /usr/share/nginx/html/www.yunjisuan.com
[root@Web01 html]# ll -d www.yunjisuan.com/
drwxr-xr-x 5 apache apache 4096 10月 24 10:01 www.yunjisuan.com/
#啓動nginx服務和php-fpm服務
[root@Web01 ~]# systemctl start nginx
[root@Web01 ~]# systemctl start php-fpm
[root@Web01 ~]# ss -antup | egrep "80|9000"
tcp    LISTEN     0      128    127.0.0.1:9000                  *:*                   users:(("php-fpm",pid=16195,fd=0),("php-fpm",pid=16194,fd=0),("php-fpm",pid=16193,fd=0),("php-fpm",pid=16192,fd=0),("php-fpm",pid=16191,fd=0),("php-fpm",pid=16189,fd=6))
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=16182,fd=6),("nginx",pid=16181,fd=6))
tcp    LISTEN     0      128      :::80                   :::*                   users:(("nginx",pid=16182,fd=7),("nginx",pid=16181,fd=7))

作好宿主機的域名映射後,瀏覽器訪問測試http://www.yunjisuan.com

image.png-65.1kB

5.5 在遠程Git倉庫中建立一個用於構建的Pipeline腳本

#在jenkins服務器上進行以下操做
[root@Jenkins ~]# rm -rf /test
[root@Jenkins ~]# mkdir /test
[root@Jenkins ~]# cd /test/
[root@Jenkins test]# git clone git@192.168.200.61:/home/git/repos/jenkinsfile
正克隆到 'jenkinsfile'...
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 8 (delta 1), reused 0 (delta 0)
接收對象中: 100% (8/8), done.
處理 delta 中: 100% (1/1), done.
[root@Jenkins test]# ls
jenkinsfile
[root@Jenkins test]# cd jenkinsfile/
[root@Jenkins jenkinsfile]# ls
itemA  itemB
[root@Jenkins jenkinsfile]# ls itemA/
jenkinsfile

經過流水線腳本生成器生成的階段代碼示例:

image.png-55.3kB

image.png-33.3kB

image.png-15.3kB

image.png-49.5kB

#經過流水線腳本生成器生成以下腳本內容
[root@Jenkins jenkinsfile]# vim itemA/jenkinsfile-php-wp
[root@Jenkins jenkinsfile]# cat itemA/jenkinsfile-php-wp
node ("PHP-slave-192.168.200.64") {
   stage('git checkout') {
       checkout([$class: 'GitSCM', branches: [[name: '${branch}']], 
       doGenerateSubmoduleConfigurations: false, extensions: [], 
       submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'f58165e3-e5a7-408a-a57d-a4b643b14308', 
       url: 'git@192.168.200.61:/home/git/repos/wordpress']]])
 }
   stage('code copy') {
       sh '''rm -rf ${WORKSPACE}/git
             [ -d /data/backup ] || mkdir -p /data/backup
             mv /usr/share/nginx/html/www.yunjisuan.com /data/backup/www.yunjisuan.com -$(data +%F_%T)
       cp -rf ${WORKSPACE} /usr/share/nginx/html/www.yunjisuan.com'''
 }
   stage('test') {
        sh 'curl http://www.yunjisuan.com/status.html'
 }
}
#推送到Git遠程倉庫
[root@Jenkins jenkinsfile]# git add *
[root@Jenkins jenkinsfile]# git commit -m "xxxx"
[master 91d20a5] xxxx
 1 file changed, 17 insertions(+)
 create mode 100644 itemA/jenkinsfile-php-wp
[root@Jenkins jenkinsfile]# git push -u origin master
Counting objects: 6, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 736 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/jenkinsfile
   cd4f8f3..91d20a5  master -> master
分支 master 設置爲跟蹤來自 origin 的遠程分支 master。

5.6 在PHP項目代碼裏增長Pipeline驗證用的測試頁面

#在項目代碼里加入一個健康檢查測試頁面,並推送到遠程Git倉庫
#在Web服務器上進行以下操做
[root@Web01 /]# mkdir /test
[root@Web01 /]# cd /test/
[root@Web01 test]# git clone git@192.168.200.61:/home/git/repos/wordpress
正克隆到 'wordpress'...
git@192.168.200.61's password: yangwenbo
remote: Counting objects: 1660, done.
remote: Compressing objects: 100% (1462/1462), done.
remote: Total 1660 (delta 173), reused 1660 (delta 173)
接收對象中: 100% (1660/1660), 8.86 MiB | 11.49 MiB/s, done.
處理 delta 中: 100% (173/173), done.


[root@Web01 test]# ls
wordpress
[root@Web01 test]# cd wordpress/
[root@Web01 wordpress]# ls
index.php        wp-admin              wp-content         wp-load.php      wp-signup.php
license.txt      wp-blog-header.php    wp-cron.php        wp-login.php     wp-trackback.php
readme.html      wp-comments-post.php  wp-includes        wp-mail.php      xmlrpc.php
wp-activate.php  wp-config-sample.php  wp-links-opml.php  wp-settings.php
[root@Web01 wordpress]# echo "OK-version V2.0" >> status.html
#配置git全局配置
[root@Web01 wordpress]# git config --global user.email "1773464408@qq.com"
[root@Web01 wordpress]# git config --global user.name "Mr.yang"

#將測試用頁面提交到遠程Git倉庫
[root@Web01 wordpress]# git add *
[root@Web01 wordpress]# git commit -m "version V2.0"
[master fc1c4fd] version V2.0
 1 file changed, 1 insertion(+)
 create mode 100644 status.html
[root@Web01 wordpress]# git push -u origin master
git@192.168.200.61's password: yangwenbo
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 284 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/wordpress
   b33992b..fc1c4fd  master -> master
分支 master 設置爲跟蹤來自 origin 的遠程分支 master。

#在web服務器作域名映射(由於要進行curl驗證)
[root@Web01 wordpress]# echo `hostname -I` www.yunjisuan.com >> /etc/hosts
[root@Web01 wordpress]# tail -1 /etc/hosts
192.168.200.64 www.yunjisuan.com

5.7 瀏覽器訪問jenkins進行PHP項目流水線發佈構建

image.png-29.7kB

image.png-97.1kB

相關文章
相關標籤/搜索