一.jenkins簡介
jenkins是一款由java編寫的軟件
CI/CD :持續集成,持續交付,持續部署,持續開發
開發部(編寫代碼)-->交付給測試部-->測試部反饋給開發部-->沒問題后交付給運維部
程序語言:
解釋型語言:python/shell/php
編譯型語言:C/C++ /Java 不能直接運行需要編譯(gcc)
程序員上傳到-->gitlab--->運維人員在jenkins下載gitlab上的代碼--->批量部署代碼
2.安裝jenkins並啟動服務
yum -y install jenkins-2.190.1-1.1.noarch.rpm #這個包可以在網上下,也可以在本地傳過來,華為雲家目錄下有
yum -y install java-1.0.8-openjdk #這一步必須做,不然jenkins啟動不起來
systemctl enable jenkins
systemctl restart jenkins
3.訪問jenkins圖形化界面
瀏覽器輸入:192.168.1.30:8080 #默認8080端口
復制紅色部分到終端,cat一下將密碼粘貼在上面位置.點擊確定出現下面的頁面
4.安裝jenkins插件
第一步: 點擊選擇插件來安裝(選擇推薦的插件比較慢)-->選擇無后安裝 -->創建第一個管理員,選右下角的admin繼續登錄-->保存並完成-->開始使用
第二步:修改管理員密碼 admin -->configure->password-->save--admin和新修改的用戶密碼來登錄
第三步:安裝插件,將插件的地址改為國內鏡像站點,點擊老頭頭像-->Manage jenkins-->advance-->Update site :使用清華大學鏡像站點https://mirrors.tuna.tsinghua.edu.cn/jenkins/
avilable -->搜索 Localization:Chinse(simplified) 和Git Parameter --> Install without start --> restart jenkins when installation complete and no jobs are running
第四步: 安裝過程中可能會超時,刷新一下就好,登錄進去
5.CI/CD流程
1.程序員在自己的電腦上編寫代碼(客戶端操作)
[root@client ~]# git init website #創建初始化website目錄
初始化空的 Git 版本庫於 /root/website/.git/
[root@client ~]# ls
website
[root@client ~]# cd website/
[root@client website]# echo "this is my site " > idnex.html #在目錄里新建一個文件,上傳到倉庫
[root@client website]# git add .
[root@client website]# git commit -m "mysite 1.0"
[root@client website]# git tag 1.0 #打標簽,也就是版本號
[root@client website]# echo "this is my site 2.0" >> idnex..html #追加一行代碼
[root@client website]# git add .
[root@client website]# git commit -m "my site 2.0" #
[root@client website]# git tag 2.0
2.管理員在gitlab上創建名為website的項目,類型為公開,為組創建,添加昨天創建的普通用戶為該項目的主程序員.
3.程序員上傳代碼到gitlab服務器
[root@client website]# git remote add origin git@192.168.1.20:devops/website.git
[root@client website]# git push -u origin --all
[root@client website]# git push -u origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To git@192.168.1.20:devops/website.git
* [new tag] 1.0 -> 1.0
* [new tag] 2.0 -> 2.0
4.配置jenkins下載代碼
首先在jenkins服務器上安裝git
yum -y install git
jenkins主頁面點擊創建一個新項目-->任務名稱 website -->選擇 free style -->勾選 this project is parameterized-->git parameter-->
name:webver/parameter type:tag -->源碼管理:Git -->Repository URL:http://192.168.1.20/devops/website.git
Branches to build :$ webver-->保存
構建:
點擊 bulid with parameter --> 選擇相關的tag進行構建,構建完成的內容自動放到了jenkis主機的/var/libjenkins/workspace目錄下
[root@jenkins ~]# cd /var/lib/jenkins/workspace/
[root@jenkins workspace]# ls
website
[root@jenkins workspace]# cd website/
[root@jenkins website]# ls
idnex.html
5.修改工程,將程序下載到子目錄中.配置->源碼管理->addtional behaviours->checkout to a sub-directory(檢出到子目錄):web-$webserver-> 保存后構建測試
點擊開始構建夠,在jenkins服務器目錄上查看
[root@jenkins ~]# cd /var/lib/jenkins/workspace/
[root@jenkins workspace]# ls
website
[root@jenkins workspace]# cd website/
[root@jenkins website]# ls
website-1.0 website-2.0
6.進一步修改工程:
1.將軟件目錄拷貝到/var/www/html/deploy/.pkgs
2.將軟件目錄下的.git隱藏目錄刪除
3.將軟件目錄打包,便於下載
4.刪除軟件目錄
5.計算壓縮包的md5值
6.生成/var/www/html/deploy/{last_ver,live_ver}兩個文件,分別記錄前一版本號和當前版本號
第一步
將軟件目錄拷貝到/var/www/html/deploy/.pkgs
[root@jenkins website]# systemctl restart httpd
[root@jenkins website]# systemctl enable httpd
[root@jenkins website]# mkdir -p /var/www/html/deploy/pkgs
[root@jenkins website]# chown -R jenkins.jenkins /var/www/html/deploy/ #注意別寫錯路徑
excecute shell中添寫的腳本代碼:
deploy_dir=/var/www/html/deploy/pkgs # 定義變量 cp -r website-$webver $deploy_dir # 拷貝軟件目錄到web目錄 cd $deploy_dir # 切換到web目錄 rm -rf website-$webver/.git # 刪除版本庫文件 tar czf website-$webver.tar.gz website-$webver # 打包壓縮 rm -rf website-$webver # 刪除軟件目錄,只保留壓縮包 # 計算壓縮包的md5值 md5sum website-$webver.tar.gz | awk '{print $1}' > website-$webver.tar.gz.md5 # 生成last_ver和live_ver文件 cd .. [ -f live_ver ] && cat live_ver > last_ver echo $webver > live_ver
開始構建
點擊 build with parameter->工程1.0開始構建-->jenkins機器上 cd /var/www/html/deploy,查看一下代碼是都創建並打包
[root@jenkins html]# cd deploy/
[root@jenkins deploy]# ls
last_ver live_ver pkgs
[root@jenkins deploy]# cd pkgs/
[root@jenkins pkgs]# ls
website-1.0.tar.gz website-2.0.tar.gz
website-1.0.tar.gz.md5 website-2.0.tar.gz.md5
自動部署代碼
/var/www/download 保存下載軟件包
/var/www/deploy 保存live_ver文件的解壓目錄
/var/www/html/nsd1906
回滾思路
取出last_ver版本號
構建本地目錄'/var/www/deploy/website-%s' % ver
把 /var/www/html/nsd1906 刪除
創建軟連接
import wget import os import requests import hashlib import tarfile def has_new_ver(ver_url, ver_fname): '有新版本返回True,否則返回False' # 如果本地沒有版本文件,則為True if not os.path.isfile(ver_fname): return True # 取出本地版本 with open(ver_fname) as fobj: local_ver = fobj.read() # 本地版本與網上版本比較,如果不一致返回True r = requests.get(ver_url) if local_ver != r.text: return True else: return False def file_ok(md5_url, fname): '如果文件已損壞返回False,否則返回True' # 計算本地文件的md5值 m = hashlib.md5() with open(fname, 'rb') as fobj: while 1: data = fobj.read(4096) if not data: break m.update(data) # 取出網上的md5值,進行比較 r = requests.get(md5_url) if m.hexdigest() == r.text.strip(): return True else: return False def deploy(app_fname): '部署軟件' deploy_dir = '/var/www/deploy' dest = '/var/www/html/nsd1906' # 解壓 tar = tarfile.open(app_fname) tar.extractall(path=deploy_dir) tar.close() # 取出軟件目錄名 app_dir = app_fname.split('/')[-1] app_dir = app_dir.replace('.tar.gz', '') app_dir = os.path.join(deploy_dir, app_dir) # 如果目標鏈接文件已存在,先刪除 if os.path.exists(dest): os.remove(dest) # 創建軟鏈接 os.symlink(app_dir, dest) if __name__ == '__main__': # 判斷是否有新版本,沒有則退出 ver_url = 'http://192.168.4.6/deploy/live_ver' ver_fname = '/var/www/deploy/live_ver' if not has_new_ver(ver_url, ver_fname): print('未發現新版本。') exit(1) # 下載新版本軟件 r = requests.get(ver_url) ver = r.text.strip() # 把額外的\n刪除,得到版本 app_url = 'http://192.168.4.6/deploy/pkgs/website-%s.tar.gz' % ver down_dir = '/var/www/download' wget.download(app_url, down_dir) # 校驗。如果下載的文件已損壞,刪除它 md5_url = app_url + '.md5' app_fname = app_url.split('/')[-1] app_fname = os.path.join(down_dir, app_fname) if not file_ok(md5_url, app_fname): os.remove(app_fname) print('文件已損壞。') exit(2) # 部署軟件 deploy(app_fname) # 更新live_ver文件的版本 if os.path.exists(ver_fname):