本節(jié)通過jenkins來進(jìn)行簡(jiǎn)單的服務(wù)部署到k8s演示。
進(jìn)入gitlab,點(diǎn)擊用戶中心,找到Settings,在左側(cè)找到SSH Keystab
$ cat ~/.ssh/id_rsa.pub
$ ssh-keygen -t rsa -b 2048 -C "email@example.com"
"email@example.com" 可以替換為自己的郵箱
完成生成后,重復(fù)第一步操作
新建工程go-zero-demo并上傳代碼,這里不做細(xì)節(jié)描述。
$ cat id_rsa
進(jìn)入Manage Jenkins->Configure System,滑動(dòng)到全局屬性條目,添加docker私有倉(cāng)庫(kù)相關(guān)信息,如圖為docker用戶名、docker用戶密碼、docker私有倉(cāng)庫(kù)地址
- docker_user 修改為你的docker用戶名
- docker_pass 修改為你的docker用戶密碼
- docker_server 修改為你的docker服務(wù)器地址
- 這里我使用的私有倉(cāng)庫(kù),如果沒有云廠商提供的私有倉(cāng)庫(kù)使用,可以自行搭建一個(gè)私有倉(cāng)庫(kù),這里就不贅述了。
進(jìn)入Manage Jenkins->Global Tool Configureation,找到Git條目,填寫jenkins所在機(jī)器git可執(zhí)行文件所在path,如果沒有的話,需要在jenkins插件管理中下載Git插件。
pipeline用于構(gòu)建項(xiàng)目,從gitlab拉取代碼->生成Dockerfile->部署到k8s均在這個(gè)步驟去做,這里是演示環(huán)境,為了保證部署流程順利, 需要將jenkins安裝在和k8s集群的其中過一個(gè)節(jié)點(diǎn)所在機(jī)器上,我這里安裝在master上的。
pipeline {
agent any
parameters {
gitParameter name: 'branch',
type: 'PT_BRANCH',
branchFilter: 'origin/(.*)',
defaultValue: 'master',
selectedValue: 'DEFAULT',
sortMode: 'ASCENDING_SMART',
description: '選擇需要構(gòu)建的分支'
}
stages {
stage('服務(wù)信息') {
steps {
sh 'echo 分支:$branch'
sh 'echo 構(gòu)建服務(wù)類型:${JOB_NAME}-$type'
}
}
stage('check out') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: '$branch']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '${credentialsId}', url: '${gitUrl}']]])
}
}
stage('獲取commit_id') {
steps {
echo '獲取commit_id'
git credentialsId: '${credentialsId}', url: '${gitUrl}'
script {
env.commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
}
}
}
stage('goctl版本檢測(cè)') {
steps{
sh '/usr/local/bin/goctl -v'
}
}
stage('Dockerfile Build') {
steps{
sh '/usr/local/bin/goctl docker -go service/${JOB_NAME}/${type}/${JOB_NAME}.go'
script{
env.image = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}:${commit_id}').trim()
}
sh 'echo 鏡像名稱:${image}'
sh 'docker build -t ${image} .'
}
}
stage('上傳到鏡像倉(cāng)庫(kù)') {
steps{
sh '/root/dockerlogin.sh'
sh 'docker tag ${image} ${dockerServer}/${image}'
sh 'docker push ${dockerServer}/${image}'
}
}
stage('部署到k8s') {
steps{
script{
env.deployYaml = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}-deploy.yaml').trim()
env.port=sh(returnStdout: true, script: '/root/port.sh ${JOB_NAME}-${type}').trim()
}
sh 'echo ${port}'
sh 'rm -f ${deployYaml}'
sh '/usr/local/bin/goctl kube deploy -secret dockersecret -replicas 2 -nodePort 3${port} -requestCpu 200 -requestMem 50 -limitCpu 300 -limitMem 100 -name ${JOB_NAME}-${type} -namespace hey-go-zero -image ${dockerServer}/${image} -o ${deployYaml} -port ${port}'
sh '/usr/bin/kubectl apply -f ${deployYaml}'
}
}
stage('Clean') {
steps{
sh 'docker rmi -f ${image}'
sh 'docker rmi -f ${dockerServer}/${image}'
cleanWs notFailBuild: true
}
}
}
}
${credentialsId}要替換為你的具體憑據(jù)值,即【添加憑據(jù)】模塊中的一串字符串,${gitUrl}需要替換為你代碼的git倉(cāng)庫(kù)地址,其他的${xxx}形式的變量無需修改,保持原樣即可。
case $1 in
"user-api") echo 1000
;;
"user-rpc") echo 1001
;;
"course-api") echo 1002
;;
"course-rpc") echo 1003
;;
"selection-api") echo 1004
esac
其中dockerlogin.sh內(nèi)容
#!/bin/bash
docker login --username=$docker-user --password=$docker-pass $docker-server
更多建議: