1 概述
項(xiàng)目前期部署都是手動部署,所以相關(guān)工具基本都已經(jīng)安裝,主要使用的工具有:
使用Gitlab管理代碼
使用Maven打包
使用Docker構(gòu)建鏡像(已經(jīng)有相關(guān)的DockerFile文件)
在阿里云kubernetes上部署。
所以,在這次自動化部署過程中,需要做的是安裝Jenkins并完成相關(guān)配置,然后通過流水線腳本(Pipeline Script)將整個(gè)部署過程粘合起來。
因此本文不涉及Maven和Docker等工具的安裝部署,僅記錄部署過程中Jenkins相關(guān)配置和流水線腳本設(shè)計(jì)。
2 部署Jenkins
1)安裝包下載:Jenkins下載地址:Download | Jenkins
2)將文件上傳到安裝目錄下,然后路徑切換到該目錄下,進(jìn)行安裝
rpm -ivh jenkins-2.386-1.1.noarch.rpm
3)在/etc/init.d/jenkins文件中配置JDK信息,保證有 $JAVA_HOME/bin/java信息即可
3)啟動程序
systemctl start Jenkins
注意:Jenkins默認(rèn)的端口是8080,如果存在端口沖突,可以在啟動前修改 /etc/sysconfig/jenkins文件中JENKINS_PORT信息
4)在瀏覽器中訪問,可以正常打開即部署成功。然后通過提示信息,查看初始密碼,復(fù)制進(jìn)去即可登錄,然后選擇安裝推薦插件,或者自定義要安裝的插件,或者直接跳過插件安裝均可。本次安裝采用的是安裝推薦插件。
其他說明:
- 注意根據(jù)不同的系統(tǒng)下載不同的版本,Linux版本查看和版本關(guān)系可網(wǎng)上搜索
- 部署Jenkins也可以通過Docker方式,但在 RedHat 系列(RHEL、CentOS、Fedora 等)的 Linux 通過Docker部署Jenkins后,在Jenkins腳本中運(yùn)行 docker命令時(shí)會因?yàn)?SELinux 而報(bào)錯(cuò) docker: not found(有資料說可以通過安裝selinux-dockersock 【GitLab地址】解決,但是我安裝后還是報(bào)錯(cuò),因此就放棄了使用docker部署Jenkins)。另外使用Docker部署Jenkins,因?yàn)槿萜鲀?nèi)無法直接訪問本機(jī)的資源,需要提前規(guī)劃好資源掛載,然后在Docker中做好環(huán)境變量配置,或者在Docker容器內(nèi)重新部署新的工具,如Maven??傊褂肈ocker部署Jenkins會遇到較多問題,建議對Docker不熟悉的話,不要使用Docker進(jìn)行部署。
- 在部署完成后,啟動Jenkins后沒有找到初始密碼文件,于是把Jenkins卸載后,重新進(jìn)行了部署?!究蓞⒖嘉恼隆俊?/li>
- 本文的部署過程較為簡略,不同的環(huán)境部署中可能會遇到不同的問題,可以通過查閱其他的資料解決?!究蓞⒖嘉恼隆?/li>
3 配置Jenkins
3.1 配置Gitlab的免密訪問
1. 首先在Jenkins部署的服務(wù)器上生成密鑰:
因?yàn)閖enkins是使用jenkins用戶運(yùn)行的,使用root用戶生成ssh密鑰的話會可能會導(dǎo)致Jenkins沒有訪問權(quán)限導(dǎo)致出現(xiàn) stderr: Host key verification failed的問題,所以先切換到j(luò)enkins用戶下,生成ssh密鑰
su -s /bin/bash jenkins
ssh-keygen -t rsa
2. 復(fù)制生成的公鑰到Gitlab
使用命令cat .ssh/id_rsa.pub,查看公鑰內(nèi)容,并將內(nèi)容復(fù)制過去,點(diǎn)擊Add key完成新增。
3. 復(fù)制私鑰到Jenkins
使用命令cat .ssh/id_rsa,查看私鑰內(nèi)容,并將內(nèi)容復(fù)制到Jenkins的憑據(jù)中,見下圖。注意復(fù)制私鑰的內(nèi)容要完整,需要包含前后-------的兩行內(nèi)容
ID可手動填寫,也可不填寫,不填寫時(shí)系統(tǒng)會自動生成。
Username即憑據(jù)名稱,可手動填寫,也可不填寫,系統(tǒng)默認(rèn)是登錄用戶名。
4. 以上配置完成后,還需要一個(gè)步驟,避免Jenkins第一次訪問Gitlab失敗。這里有2個(gè)方法可以,選擇其一即可。
- 第一個(gè)方法:
在linux上手動訪問一下Gitlab,使用命令見下
git ls-remote -h git@####.git HEAD
注意:git@####.git為自己倉庫地址,第一次運(yùn)行時(shí)提示yes/no 輸入yes即可*
- 第二個(gè)方法:
修改Jenkins的安全配置,在Manage Jenkins >> Configure Global Security 找到Git Host Key Verification Configuration,修改為No verification。保存
3.2 配置對阿里云k8s的訪問
1. 登錄阿里云,打開對應(yīng)集群詳情頁面,切到【連接信息】,復(fù)制憑證信息。在本地新建一個(gè)空txt文件,粘貼進(jìn)去,保存,修改文件名稱為kubectl.conf。
2. 在Jenkins中配置憑證。選擇上傳剛才的kubectl.conf文件,ID這里自定義了一個(gè)名稱。
3.3 添加Jenkins全局變量
1. 添加JAVA_HOME
2. 添加M2_HOME
3. 添加PATH+EXTRA
3.4 全局工具配置Maven
使用指定的settings.xml文件
4 創(chuàng)建Job和編寫腳本
4.1 創(chuàng)建Job
新建任務(wù)-填寫任務(wù)名稱,選擇流水線-點(diǎn)擊確認(rèn)
4.2 編寫腳本
1)腳本框架構(gòu)建
根據(jù)當(dāng)前項(xiàng)目部署過程,先把腳本基本框架寫好。每一個(gè)具體的項(xiàng)目可能不一樣,根據(jù)實(shí)際的情況寫。
pipeline {
agent any
stages {
stage('0.前置構(gòu)建'){
steps {
script{
echo "前置構(gòu)建"
}
}
}
stage('1.拉取代碼'){
steps {
sh """
echo "拉取代碼"
"""
}
}
stage('2.編譯程序'){
steps {
sh """
echo "編譯程序"
"""
}
}
stage('3.鏡像打包上傳'){
steps {
script{
sh """
echo "鏡像打包上傳"
"""
}
}
}
stage('4.發(fā)布'){
steps {
script{
sh """
echo "部署程序"
"""
}
}
}
}
}
2)前置工作
一般項(xiàng)目設(shè)計(jì)合理,從拉取代碼開始就可以了,我們的這個(gè)項(xiàng)目因?yàn)橐恍┰?,需要有一個(gè)前置構(gòu)建,但是又不是每一次都是必須的,這里需要添加一個(gè)參數(shù),進(jìn)行控制,另外前置構(gòu)建,需要另建一個(gè)Job,完成拉取和編譯代碼工作。這里前置構(gòu)建我起名叫pre-build,依然采用流水線方式構(gòu)建。腳本結(jié)構(gòu)如下:
pipeline {
agent any
stages {
stage('1.拉取代碼'){
steps {
cleanWs()
checkout scmGit(branches: [[name: '*/master']], extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'parentProject']], userRemoteConfigs: [[credentialsId: 'Gitlab', url: 'git@git.***.com.cn:test/parentProject.git']])
checkout scmGit(branches: [[name: '*/dev']], extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'childProject1']], userRemoteConfigs: [[credentialsId: 'Gitlab', url: 'git@git.***.com.cn:test/childProject1.git']])
}
}
stage('2.編譯程序'){
steps {
sh """
cd ${WORKSPACE}/parentProject/
mvn clean install
"""
}
}
}
}
執(zhí)行一下構(gòu)建,成功。
3)stage0中配置的參數(shù)
返回當(dāng)前Job的配置頁面,完成stage0的配置項(xiàng),首選勾選【參數(shù)化構(gòu)建】,選擇布爾值參數(shù),然后填寫名稱,勾選指定默認(rèn)值,并進(jìn)行友好的描述說明,保存。
4)完善stage0的腳本
pipeline {
agent any
parameters {
booleanParam(name:"pre-build", defaultValue:"true", description:"是否進(jìn)行前置構(gòu)建:勾選為是,不勾選為否,默認(rèn)為是")
}
stages {
stage('0.前置構(gòu)建'){
steps {
script{
if (pre-build){
build job: "pre-build"
}
}
}
}
stage('1.拉取代碼'){
steps {
sh """
echo "拉取代碼"
"""
}
}
stage('2.編譯程序'){
steps {
sh """
echo "編譯程序"
"""
}
}
stage('3.鏡像打包上傳'){
steps {
script{
sh """
echo "鏡像打包上傳"
"""
}
}
}
stage('4.發(fā)布'){
steps {
script{
sh """
echo "部署程序"
"""
}
}
}
}
}
構(gòu)建一下,成功。
5)完善stage1的腳本
首先是清空工作空間,然后拉取代碼
stage('1.拉取代碼'){
steps {
cleanWs()
checkout scmGit(branches: [[name: '*/dev']], extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'childProject3']], userRemoteConfigs: [[credentialsId: 'Gitlab', url: 'git@git.***.com.cn:test/childProject3.git']])
}
}
構(gòu)建一下,成功。
6)完善stage2的腳本
進(jìn)行編譯打包。
stage('2.編譯程序'){
steps {
sh '''
cd ${WORKSPACE}/childProject3/
mvn clean install
'''
}
}
7)完善stage3的腳本。
stage('3.鏡像打包上傳'){
steps {
script{
DateTime=sh(returnStdout: true, script: 'date "+%Y%m%d%H%M"').trim()
sh """
chmod 777 ${WORKSPACE}/childProject3/*
./buildAndPush.sh dokerfileName tagName-${DateTime}
"""
}
}
}
其中buildAndPush.sh完成Docker構(gòu)建和鏡像推送,文件內(nèi)容為
# bulid和push
docker build -f Dockerfile-$1 -t $1:$2 .
docker login -u 'robot' -p 'hjsafhjjjdkk' http://harbor.***.com.cn
docker tag $1:$2 harbor.***.com.cn/test/$1:$2
docker push harbor.***.com.cn/test/$1:$2
# 清理本地鏡像
docker rmi $1:$2
docker rmi harbor.***.com.cn/test/$1:$2
因?yàn)楸卷?xiàng)目之前已經(jīng)存在腳本和Dockerfile,所以直接沿用了,其他項(xiàng)目中,如果可以直接使用命令進(jìn)行鏡像打包和上傳,可采用如下命令:
docker build -t harbor***.com.cn/test/imageName: tagName-${DateTime} . && docker push harbor.***.com.cn/test/ imageName: tagName-${DateTime}
8)完善stage4的腳本
stage('4.發(fā)布'){
steps {
script{
withKubeConfig(caCertificate: '', clusterName: '', contextName: '', credentialsId: 'k8s-config', namespace: 'nameSpaceofchildProject3', restrictKubeConfigAccess: false, serverUrl: 'https://***:6443'){
sh """
kubectl set image deployment/childProject3 childProject3=harbor***.com.cn/test/imageName: tagName-${DateTime} -n nameSpaceofchildProject3
kubectl rollout status deployment/childProject3 -n nameSpaceofchildProject3
"""
}
}
}
}
腳本中的 nameSpaceofchildProject3 可以從阿里云上【集群列表】-【應(yīng)用管理】,搜索相呼應(yīng)的名稱,查看命名空間
4.3 優(yōu)化腳本
通過添加一些參數(shù),把腳本變得更為通用一些,可以更為方便的復(fù)用到其他工程上。如文章來源:http://www.zghlxwxcb.cn/news/detail-448520.html
String server_name= env.JOB_NAME.toLowerCase()
String dockerbuild_filename = "###"
String tag_name = "###"
可根據(jù)項(xiàng)目的實(shí)際情況進(jìn)行設(shè)置。文章來源地址http://www.zghlxwxcb.cn/news/detail-448520.html
到了這里,關(guān)于自動化部署實(shí)踐 (Jenkins+Git+Docker+阿里云k8s)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!