Jenkins概念
Jenkins是一個功能強大的應用程序,允許持續集成和持續交付項目,無論用的是什么平台。這是一個免費的源代碼,可以處理任何類型的構建或持續集成。集成Jenkins可以用於一些測試和部署技術。Jenkins是一種軟件允許持續集成。
Jenkins目的
1、持續、自動地構建/測試軟件項目。
2、監控軟件開放流程,快速問題定位及處理,提示開放效率。
特性
開源的java語言開發持續集成工具,支持CI,CD。
易於安裝部署配置:可通過yum安裝,或下載war包以及通過docker容器等快速實現安裝部署,可方便web界面配置管理。
消息通知及測試報告:集成RSS/E-mail通過RSS發布構建結果或當構建完成時通過e-mail通知,生成JUnit/TestNG測試報告。
分布式構建:支持Jenkins能夠讓多台計算機一起構建/測試。
文件識別:Jenkins能夠跟蹤哪次構建生成哪些jar,哪次構建使用哪個版本的jar等。
豐富的插件支持:支持擴展插件,你可以開發適合自己團隊使用的工具,如git,svn,maven,docker等。
產品發布流程
產品設計成型 -> 開發人員開發代碼 -> 測試人員測試功能 -> 運維人員發布上線
持續集成 (Continuous integration,簡稱CI)
持續交付(Continuous delivery)
持續部署(continuous deployment)
持續集成:多名開發者在開發不同功能代碼的過程中,可以頻繁的將代碼進行合並到一起不相互影響工作。
持續部署:是基於某種工具或平台實現代碼自動化的構建、測試和部署到線上環境以實現交付高質量的產品,持續部署在某種程度上代表了一個開發團隊的更新迭代速率。
上線方案
開發自己上傳 --最原始的方案 開發給運維手動上傳 --運維自己手動部署 運維使用腳本復制 --半自動化 結合web界面一鍵部署 --自動化
版本控制系統
在公司的服務器安裝某種程序,該程序用於按照特定格式和方式記錄和保存公司多名開發人員不定期提交的源代碼,且后期可以按照某種標記及方式對用戶提交的數據進行還原。
CVS--早期的集中式控制系統 SVN--集中式版本控制系統
--集中式管理,依賴於網絡,一台服務器集中管理 Gitlib--分布式版本控制系統 --2002年由Linux內核作者linus使用C語言開發
--分布式版本控制系統,不依賴於服務器,離線依然可以工作
網站:https://github.com
集中式版本控制系統
任何的提交和回滾都依賴於連接服務器
SVN服務器是單點
分布式版本控制系統
Git在每個用戶都有一個完整的服務器,然后在有一個中央服務器,用戶可以先將代碼提交到本地,沒有網絡也可以先提交到本地,然后在有網絡的時候再提交到中央服務器,這樣就大大方便了開發者,而相比CVS和SVN都是集中式的版本控制系統,工作的時候需要先從中央服務器獲取最新的代碼,改完之后需要提交,如果是一個比較大的文件則需要足夠快的網絡才能快速提交完成,而使用分布式的版本控制系統,每個用戶都是一個完整的版本庫,即使沒有中央服務器也可以提交代碼或者回滾,最終再把改好的代碼提交至中央服務器進行合並即可。
系統環境准備
最小化服務器安裝,配置如下:
# yum install vim gcc gcc-c++ wget net-tools lrzsz iotop lsof iotop bash-completion -y # yum install curl policycoreutils openssh-server openssh-clients postfix -y # wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # systemctl disable firewalld # sed -i '/SELINUX/s/enforcing/disabled/' /etc/sysconfig/selinux # hostnamectl set-hostname xxx.com.cn # yum update –y && reboot
Gitlib安裝
# vim /etc/yum.repos.d/gitlib.repo [gitlab-ce] name=gitlab-ce baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 repo_gpgcheck=0 gpgcheck=0 enabled=1 gpgkey=https://packages.gitlab.com/gpg.key # yum install gitlab-ce
Gitlib配置
Rpm包下載地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
[root@gitlib-server ~]#vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.10.130'
external_url ‘http://192.168.10.130‘ #服務器IP地址
gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.163.com" gitlab_rails['smtp_port'] = 25 gitlab_rails['smtp_user_name'] = "rooroot@163.com" gitlab_rails['smtp_password'] = "zhang@123" gitlab_rails['smtp_domain'] = "163.com" gitlab_rails['smtp_authentication'] = :login gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = false gitlab_rails['gitlab_email_from'] = "rooroot@163.com" user["git_user_email"] = "rooroot@163.com"
Gitlib服務器初始化
執行配置並啟動服務: # gitlab-ctl reconfigure #修改完配置文件要執行此操作 # gitlab-ctl start # gitlab-ctl stop # gitlab-ctl restar
Gitlib驗證啟動
#ss -ntl
驗證端口及狀態 80端口和8080端口是在初始化gitlib的時候啟動的,因此如果之前的有程序占用會導致初始化失敗或無法訪問!
登陸web頁面
登錄web頁面並設置密碼,最少8位: http://192.168.130.8
登錄Gitlib
登陸,默認用戶weiroot
默認頁面
注冊賬號
默認情況下可以直接注冊賬號,因此,一般都關閉此功能
關閉賬號注冊功能
取消賬戶注冊功能之后點save
驗證賬號注冊功能是否關閉
添加賬號
添加一個賬號
設置新賬戶密碼
使用第一次的新賬號登錄要設置密碼
發送設置密碼郵件
設置密碼
在收件箱打開郵件設置密碼
設置密碼
創建項目
使用管理員創建項目
創建組
組里可以有多個項目分支,可以將開發添加到組里面進行設置權限,不同的組就是公司不同的開發項目或者業務模塊,不同的組添加不同的開發即可實現對開發設置權限的管理
將用戶添加到組
為項目創建一個index頁面
找到項目界面
添加一個頁面
安裝git客戶端
# yum install git –y # mkdir /source # cd /source/ # git clone http://192.168.10.130/myweb/myweb1.git
驗證index.html文件是否存在
編輯文件並提交
# git config --global user.name "jack“ # git config --global user.email 2973707860@qq.com # cd myweb1 # vim index.html # git add index.html # git commit -m "333“ # git push -u origin
Git常用命令總結
git config --global user.name “name“ #設置全局用戶名,可以非真實賬戶 git config --global user.email xxx@xx.com #設置全局郵箱,可以非真實郵箱 git config --global –list #列出用戶全局設置 git add index.html #添加文件到暫存區 git commit -m “11“ #提交文件到工作區 git status #查看工作區的狀態 git push #提交代碼到服務器 git pull #獲取代碼到本地 git log #查看操作日志 vim .gitignore #定義忽略文件 git reset --hard HEAD^ #git版本回滾, HEAD為當前版本,加一個^為上一個,^^為上上一個版本 git reflog # #獲取每次提交的ID,可以使用--hard根據提交的ID進行版本回退 git reset --hard 5ae4b06 #回退到指定id的版本 # git branch #查看當前所處的分支 git checkout -- file #從服務器更新某個那文件覆蓋本地的文件
部署tomcat服務器
各web服務器准備tomcat運行環境
# useradd www -u 2000 # mkdir /apps && cd /apps # tar xvf jdk-7u79-linux-x64.tar.gz # ln -sv /apps/jdk1.7.0_79 /apps/jdk # vim /etc/profile export export LANG="en_US.utf-8" export JAVA_HOME=/apps/jdk export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin # source /etc/profile && java -version # tar xvf apache-tomcat-7.0.59.tar.gz # ln -sv /apps/apache-tomcat-7.0.59 /apps/tomcat
准備tomcat啟動腳本
# cp /root/tomcatd /etc/init.d/
部署app
確認各web服務器訪問正常
# mkdir /data/tomcat_appdir #保存web壓縮包 # mkdir /data/tomcat_webdir #保存解壓后的web目錄 # cd tomcat_webdir # mkdir myapp # echo tomcatX > /apps/tomcat_webdir/myapp/index.html
確認各web服務器訪問正常
部署haproxy
部署haproxy
# tar xvf haproxy-1.5.18.tar.gz # cd haproxy-1.5.18 # make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.5.18 # make install PREFIX=/usr/local/haproxy-1.5.18 # ln -sv /usr/local/haproxy-1.5.18/ /usr/local/haproxy # cp examples/haproxy.init /etc/init.d/haproxy #啟動腳本 # chmod a+x /etc/init.d/haproxy # chkconfig --add haproxy && chkconfig haproxy on # ln -sv /usr/local/haproxy/sbin/haproxy /usr/sbin/ # mkdir /etc/haproxy # cp examples/haproxy.cfg /etc/haproxy/
編輯本機hosts文件,將myapp.web.com解析到對應的IP負載IP
C:\Windows\System32\drivers\etc\hosts 192.168.10.132 myapp.web.com
記錄haproxy日志
# vim /etc/rsyslog.conf: 14 # Provides UDP syslog reception 15 $ModLoad imudp #去掉注釋 16 $UDPServerRun 514 #去掉注釋 18 # Provides TCP syslog reception 19 $ModLoad imtcp #去掉注釋 20 $InputTCPServerRun 514 #去掉注釋 # systemctl restart rsyslog log 127.0.0.1 local0 info #global部分 frontend web_port #監聽端口 bind 0.0.0.0:80 mode http option httplog log global option forwardfor
重啟rsyslog和haproxy服務,驗證/var/log/haproxy.log可以記錄日志:
訪問負載狀態頁面
驗證反向代理功能
安裝jenkins
可以將數據保存在單獨的磁盤
mkfs.xfs /dev/sdb mount /dev/sdb /data/ chown jenkins.jenkins /data/ -R
jenkins安裝及啟動
通過rpm包安裝jenkins
rpm –ivh jdk-8u111-linux-x64.rpm rpm –ivh https://pkg.jenkins.io/redhat/jenkins-2.27-1.1.noarch.rpm /etc/init.d/jenkins start chkconfig jenkins on
日志顯示啟動並運行
jenkins啟動報錯
無法正常啟動jenkins
沒有java環境
配置java環境
使用官方倉庫安裝:
# 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 install java jenkins
直接下載二進制安裝包:
# tar xvf jdk-8u111-linux-x64.tar.gz -C /usr/local/src/ # ln -sv /usr/local/src/jdk1.8.0_111 /usr/local/jdk # vim /etc/profile export JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar # source /etc/profile && java –version
使用rpm安裝包安裝java並啟動jenkins:
#rpm –ivh jdk-8u111-linux-x64.rpm
配置jenkins
# vim /etc/sysconfig/Jenkins JENKINS_HOME=“/data“ #數據目錄,使用高IO大容量磁盤 JENKINS_USER=“jenkins“ #啟動用戶 JENKINS_PORT=“8080“ #啟動端口
訪問web界面
如果虛擬及配置較低,則啟動頁面可能需要很長的時間,因此推薦4G或更多內存,4C或更多CPU
重新完成的日志
# tail /var/log/jenkins/jenkins.log -f
安裝密碼
輸入安裝的下一步
Jenkins插件安裝
插件安裝過程中,如果由安裝失敗沒關系,可以后期安裝
如果自動安裝失敗,可以減壓准備好的插件
#cd /var/lib/jenkins/plugins #tar xvf jenkins_plugin.tar.gz #chown jenkins.jenkins ./* -R #/etc/init.d/jenkins start
插件下載地址
http://updates.jenkins-ci.org/download/plugins/
注:未安裝成功的插件最好重新安裝下
創建用戶
創建登錄用戶
賬號創建完成
登錄成功
郵件配置
設置管理員郵件地址
發送郵件設置
從git獲取代碼
gitLab
gitlab Hook Plugin
安裝查件中
插件安裝界面,會額外安裝一些依賴關系的插件,jenkins插件有的基於ruby開發,所以會安裝ruby環境
添加git用戶
在gitlab管理界面將用戶添加到一個項目,下一步要用此用戶拉取項目代碼
權限確認
確認用戶對項目有提交的權限
添加部署key
部署key可以用於獲取代碼
測試部署key
測試可以不使用用戶名密碼,直接獲取代碼
Jenkins添加git用戶
添加一個認證用戶,拉取git代碼的時候使用
http://192.168.10.131:8080/credentials/store/system/domain/_/newCredentials
Jenkins創建項目
創建項目
配置適用git源
配置git項目地址和用戶
使用Jenkins構建項目
點擊立即構建
代碼測試sonar
官網:hrttp://www.sonarqube.org/
Sonar 是一個用於代碼質量管理的開放平台,通過插件機制,Sonar 可以集成不同的測試工具,代碼分析工具,以及持續集成工具。與持續集成工具(例如 Hudson/Jenkins 等)不同,Sonar 並不是簡單地把不同的代碼檢查工具結果(例如FindBugs,PMD等)直接顯示在Web頁面上,而是通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼質量的變化,從而可以方便地對不同規模和種類的工程進行代碼質量管理。在對其他工具的支持方面,Sonar 不僅提供了對 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 這些工具里聯機查看結果;同時Sonar還對大量的持續集成工具提供了接口支持,可以很方便地在持續集成中使用 Sonar,此外,Sonar 的插件還可以對 Java 以外的其他編程語言提供支持,對國際化以及報告文檔化也有良好的支持。
安裝數據庫
數據庫不支持5.5的版本,支持5.6以后的版本。
# yum -y install autoconf && tar xvf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz #ln -sv /usr/local/src/mysql-5.6.34-linux-glibc2.5-x86_64 /usr/local/mysql #cd /usr/local/mysql/ # useradd mysql -s /sbin/nologin # chown -R mysql.mysql ./* -R # mkdir /data && chown mysql.mysql /data/ -R # /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/ --basedir=/usr/local/mysql/ #cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql #cp /usr/local/mysql/my.cnf /etc/my.cnf # vim /etc/my.cnf basedir = /usr/local/mysql datadir = /data port = 3306 #/etc/init.d/mysql start #ln -sv /usr/local/mysql/bin/mysql /usr/bin/
mysql數據庫創建及授權
# /usr/local/mysql/bin/mysql CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL ON sonar.* TO sonar@"jenkins-server.example.com" IDENTIFIED BY "123456"; GRANT ALL ON sonar.* TO sonar@"192.168.100.%" IDENTIFIED BY "123456"; FLUSH PRIVILEGES; /usr/local/mysql/bin/mysql -usonar -p123456 -h192.168.10.131
部署sonar
sonar依賴於java環境,而且java版本必須是1.8版本或更高,否則sonar啟動失敗
# unzip sonarqube-5.6.zip #ln -sv /usr/local/src/sonarqube-5.6 /usr/local/sonar [root@jenkins-server ~]# grep "^[za-Z]" /usr/local/sonar/conf/sonar.properties sonar.jdbc.username=sonar sonar.jdbc.password=123456 sonar.jdbc.url=jdbc:mysql://192.168.10.131:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance sonar.web.port=8800 # /usr/local/sonar/bin/linux-x86-64/sonar.sh start
點擊右上角login登錄,默認用戶名密碼都是admin
sonar安裝中文支持
#/usr/local/sonar/extensions/plugins/ #插件本地路徑 安裝中文插件: administration-system-update center-available,在后面的搜索框搜索插件名稱,然后點install安裝: 或在插件目錄/usr/local/sonar/extensions/plugins執行wget https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.11/sonar-l10n-zh-plugin-1.11.jar然后重啟服務: # /usr/local/sonarqube-5.6/bin/linux-x86-64/sonar.sh restart
部署掃描器
Sonar通過掃描器進行代碼質量分析,即掃描器的具體工作就是掃描代碼
下載地址:
http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
# unzip sonar-scanner-2.6.1.zip # ln -sv /usr/local/src/sonar-scanner-2.6.1 /usr/local/sonar-scanner # cd /usr/local/sonar-scanner/ # grep "^[a-Z]" conf/sonar-scanner.properties sonar.host.url=http://localhost:8800 sonar.sourceEncoding=UTF-8 sonar.jdbc.username=sonar sonar.jdbc.password=123456 sonar.jdbc.url=jdbc:mysql://192.168.10.131:3306/sonar?useUnicode=true&characterEncoding=utf8
准備測試代碼
# cd /home/jack/ # unzip sonar-examples-master.zip # cd sonar-examples-master # cat projects/languages/php/php-sonar-runner/sonar-project.properties #以下是默認配置 # Required metadata sonar.projectKey=org.sonarqube:php-simple-sq-scanner #key sonar.projectName=PHP :: Simple Project :: SonarQube Scanner #項目名稱,會顯示在儀表盤 sonar.projectVersion=1.0 #版本 # Comma-separated paths to directories with sources (required) sonar.sources=src #代碼目錄 # Language sonar.language=php #語言格式為php # Encoding of the source files sonar.sourceEncoding=UTF-8 #編碼格式
執行掃描
#pwd /home/jack/sonar-examples-master/projects/languages/php/php-sonar-runner #/usr/local/sonar-scanner/bin/sonar-scanner #手動在當前目錄執行掃描,以下是掃描過程的提示信息
掃描的配置文件可以在每個項目都放一個,或在Jenkins界面做配置
讓jenkins關聯到sonar scanner
在jenkins插件安裝界面安裝sonar插件sonarqube plugin
系統管理—系統設置
添加掃描器
系統管理-Global Tool Configuration
配置掃描
選擇自己的項目(demo)-->-構建觸發器-- >構建-->execute
sonarqube scanner,將配置文件的內容修改成如下格式填寫完成后點保存
sonar.projectKey=test-demo sonar.projectName=test-demo sonar.projectVersion=1.0 sonar.sources=./ sonar.language=php sonar.sourceEncoding=UTF-8
點擊項目的立即構建,下圖是執行成功的信息
構建歷史
查看項目的構建歷史
構建失敗郵件通知
構建失敗后會發送郵件通知管理員
部署代碼
將代碼部署到web服務器
創建項目
新建一個項目叫test-deploy用於代碼發布,上一個項目test-demo可用於代碼測試,當測試階段出現問題的時候也不會立即進行發布,只有當測試通過后才執行發布的項目。
如何將代發布到web服務器上?
可以通過執行命令或腳本的方式進行代碼發布,在各web服務器包括Jenkins服務器創建一個www用戶,保持id一致,用於啟動web服務並進行代碼發布
# useradd www # echo "123456" | passwd --stdin www # su - www $ ssh-keygen
添加key
添加jenkins服務器www用戶的公鑰到git服務器項目當中
確認key
確認www用戶的key可以拉取代碼
Shell腳本
關於權限
一般使用非root用戶啟動web服務及完成代碼發布,默認Jenkins運行使用的是Jenkins用戶,因此需要賦予Jenkins用戶一定的權限,另外發布的腳本可以在本機也可以不在本機,需要使用Jenkins用戶ssh到發布服務器執行shell腳本。 將腳本放在/home/www用戶家目錄,git代碼也放在家目錄,因此需要jenkins服務器遠程到代碼發布服務器執行遠程命令,需要做免登陸認證,將jenkins服務器root和www用戶的公鑰放在代碼部署服務器的www用戶家目錄.ss/authorized_keys文件中: # su - www $ vim /home/www/.ssh/authorized_keys
$ chmod 600 authorized_keys
驗證ssh
在root用戶和www用戶下ssh到本機的www用戶,確認可以免密碼登錄,以便讓部署服務器將用戶的key添加到know_keys,否則報錯Host key verification failed:
配置jenkins用戶sudo權限
# vim /etc/sudoers 56 # Defaults requiretty #不需要tty 99 jenkins ALL=(ALL) NOPASSWD: /usr/bin/ssh #不需要使用密碼即可執行ssh
腳本內容
$ cd /home/www/ $ vim deploy.sh #!/bin/bash echo $USER cd /home/www/myweb1 git pull scp -r ./* www@192.168.10.133:/apps/tomcat/webapps/myapp scp -r ./* www@192.168.10.134:/apps/tomcat/webapps/myapp
測試執行命令
在test-deploy項目的構建步驟調用,項目—配制—構建
執行結果
Web服務器免密碼登錄
復制www用戶公鑰到各web服務器的www用戶
$ ssh-copy-id www@192.168.10.133 $ ssh-copy-id www@192.168.10.134
提交代碼
在另外一台服務器編輯代碼后重新提交: # git clone http://192.168.10.130/web/myweb1.git # echo “xxx” >> index.html # git add index.html # git commit index.html # git push 在jenkins執行項目構建 構建項目之前要在www用下的xxx項目里面進行git pull命令。否則第一次更新提示輸入yes會導致部署失敗 再次提交代碼
項目關聯
配置項目test-demo的構建后操作,demo構建完成后自動構建demp-deploy項目
添加構造后操作
構建關聯成功
定義視圖
安裝pipeline插
添加試圖
定義名稱
配置視圖
在pipeline進行構建
自動構建
GitLab觸發jenkins構建項目
目的為在公司的測試環境當中一旦開發向gitlab倉庫提交成功代碼,gitlab通知jenkins進行構建項目、代碼質量測試然后部署至測試環境,注意這只是測試環境,而生產環境依然需要手動部署代碼
安裝插件
安裝Gitlab Hook Plugin插件:
#系統管理-管理插件-可選插件-Gitlab Hook Plugin和Build Authorization Token Root Plugin
Token
# openssl rand -hex 12 f7d0ead5398bd808ee139067
配置觸發器
配置gitlib觸發
#插件使用介紹,https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin #選擇項目-設置-webhooks: http://192.168.10.131:8080/buildByToken/build?job=test-demo&token=f7d0ead5398bd808ee139067 格式如下: http://X.X.X.X:8080/buildByToken/build?job=項目名&token=隨機數
保存后進行測試
測試成功
測試git觸發Jenkins自動部署
在另一台向git服務器提交代碼,驗證是否自動化部署
# echo "ccc" >> index.html # git add index.html # git commit -m "ccc“ # git push
驗證成功構建
實現在haproxy動態增減服務器
在Jenkins服務器復制www用戶的公鑰到haproxy服務器: $ ssh-copy-id root@192.168.10.132 # ssh-copy-id root@192.168.10.132 Haproxy服務器編輯# vim /etc/sudoers必須要tty # vim /etc/sudoers root ALL=(ALL) ALL jenkins ALL=(ALL) NOPASSWD: /usr/bin/ssh www ALL=(ALL) ALL
測試www和root用戶的ssh功能
動態增減haproxy后端服務器
開啟功能 # vim /etc/haproxy/haproxy.cfg stats socket /usr/local/haproxy/stats mode 600 level admin 安裝命令並測試 yum install socat #echo "help"| socat stdio /usr/local/haproxy/stats # echo "show info"| socat stdio /usr/local/haproxy/stats #echo "show stat"| socat stdio /usr/local/haproxy/stats # echo "disable server myapp_host/web2"|socat stdio /usr/local/haproxy/stats
echo "enable server myapp_host/web2"|socat stdio /usr/local/haproxy/stats
分組是為了在代碼分批次上線的時候對后端服務器的一種篩選方法