雲端計算之gitlab+jenkins持續整合持續開發
開發運維一體化,網站軟體等都在不斷的更新升級,沒個新版本的出現就意味著要部署新的環境,替換老的環境,如果這一步不能實現自動化,那麼工作會非常繁忙,在此,結合公司需求,搭建了gitlab+jenkins實現持續開發持續整合。
步驟1:部署開發人員寫的程式碼到程式碼管理伺服器
程式碼管理平臺還是比較多的,如github,gitlab 和 svn,github是儲存在國外網站平臺上,上傳下載都需要頻寬,每天都要上傳下載,使用不划算,所以可以選擇gitlab或者svn,此處使用gitlab做原生代碼管理伺服器。
1) 配置git
yum -y install git
git –version #檢視版本
git config --global user.name "MX-Steve"
git config --global user.email "[email protected]"
git config --global core.editor vim
mkdir /devops
cd devops/
echo 'print("hello world!")' > hello.py
git init #初始化本地倉庫資訊
git status #檢視倉庫裡檔案狀態
git add hello.py
git commit -m "hello.py"
2) 自建gitlab伺服器
網上下載gitlab中文版軟體包,此處將gitlab搭建在docker上
docker load < /path/to/gitlab_zh.tar
docker run -d -h gitlab --name gitlab -p 443:443 -p 80:80 -p 22:22 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data gitlab_zh:latest
注意:物理機的443,80和22埠供docker容器gitlab使用,物理機地址為192.168.1.200
瀏覽器開啟http://192.168.1.200,建立工作組devops,根據開發人員名稱建立使用者,建立專案,並將使用者加入到專案中,此處管理員root,密碼12345678
將gitlab容器中生成的祕鑰匯入到gitlab網頁中
git remote add origin [email protected]::devops/core_py.git
git push origin master # 可以將本地git與gitlab程式碼管理伺服器管理上傳即成功
步驟2:安裝配置使用jenkins,伺服器ip地址為192.168.1.201,jenkins預設啟動8080埠
yum -y install jenkins
systemctl start jenkins
systemctl enable jenkins
瀏覽器開啟http://192.168.1.201:8080
cat /var/lib/Jenkins/secrets/initialAdminPassword
登入輸入管理員祕鑰
選擇外掛git安裝,使用admin賬戶繼續操作,在管理員->設定裡面可以修改管理員密碼
因為此處為非工作環境,因此使用wordpress作為開發人員寫的軟體,下載wordpress-4.8和wordpress-5.0兩個版本,模擬專案開發過程中的軟體升級操作
unzip wordpress-4.8-zh_CN.zip
cd wordpress/
git init
git add .
git commit -m "wordpress-1.0"
git tag v1.0
git push
第一個開發版本上傳到gitlab中
cd ..
unzip wordpress-5.0-zh_CN.zip #將第一個版本覆蓋掉
git add .
git commit -m "wordpress-2.0"
git tag v2.0
git push
第二個開發版本上傳到gitlab中
在gitlab上建立遠端倉庫wordpress
步驟3:構建工程
新建任務=>選擇自由風格=>新增Git Parameter引數=>原始碼管理採用git
1)原始碼採用git
2)將原始碼checkout到子目錄
構建工程,構建tag為v1.0的原始碼
1)構建工程
2)選擇指定的標籤
檢驗結果
1)選擇指定標籤
2)檢視日誌輸出
3)檢視本地結果,構建好的專案出現在/var/lib/jinkens目錄下
修改構建工程,編寫插入shell腳步,實現自動部署
建立版本檔案,便於區分當前版本與上一個版本,有利於版本回滾
步驟4:釋出應用
vim deploy_web.py
import requests
import os
import hashlib
import tarfile
from urllib import request
#使用url進行get請求,獲取網站文字資訊,獲取當前版本
def get_webdata(url):
r = requests.get(url)
return r.text
#將網址內容下載到fname檔案中
def download(url, fname):
html = request.urlopen(url)
with open(fname, 'wb') as fobj:
while True:
data = html.read(1024)
if not data:
break
fobj.write(data)
#檢查檔案MD5值
def check_md5(fname):
m = hashlib.md5()
with open(fname, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
return m.hexdigest()
#部署版本,應用釋出程式碼
def deploy(app): # /var/www/packages/myproject_2.0.tar.gz
#切換路徑到/var/www/packages路徑下
os.chdir('/var/www/packages')
#解壓縮myproject_2.0.tar.gz檔案
tar = tarfile.open(app, 'r:gz')
tar.extractall()
tar.close()
#將.tar.gz替換成空字串
src = app.replace('.tar.gz', '')
#建立/var/www/html/mysite軟連結
dst = '/var/www/html/mysite'
if os.path.exists(dst): #如果檔案存在
os.unlink(dst) #刪除
os.symlink(src, dst) #否則建立軟連結
if __name__ == '__main__':
#呼叫get_webdata()函式,目的是以釋出伺服器'http://192.168.1.201/live_version'網址為引數獲取當前版本,ver結果為2.0
ver = get_webdata('http://192.168.1.201/live_version').strip()
app_name = 'myproject_%s.tar.gz' % ver
#app_url為下載myproject_2.0.tar.gz檔案網址
app_url = 'http://192.168.1.201/packages/' + app_name
#目標檔案
app_path = os.path.join('/var/www/packages', app_name)
#呼叫download()函式,目的是從app_url網址讀取資料存入目標檔案
download(app_url, app_path)
#呼叫check_md5()函式,目的是計算目標檔案MD5值
local_md5 = check_md5(app_path)
#呼叫get_webdata()函式,目的從釋出伺服器網址獲取md5值
remote_md5 = get_webdata(app_url + '.md5').strip()
#如果目標檔案md5值和釋出伺服器提供的md5值相等,確認下載的檔案無誤,呼叫deploy()函式,以目標檔案作為引數進行部署
if local_md5 == remote_md5:
deploy(app_path)
步驟5:配合週期性計劃任務實現自動運維