前言
之前自己在阿里雲ECS上面安裝了Jekins(安裝jenkins的文章),最近因為伺服器中了挖礦木馬於是準備重新安裝一下,但是想到每次安裝jenkins都要手動安裝jdk、maven、docker、kubectl,感覺好麻煩,於是使用官方推薦的blue ocean docker映象來安裝並使用,在安裝和使用的過程中遇到一些問題記錄下來分享給大家。
使用blue ocean映象來安裝jkenkins
首先我們開啟jenkins官方安裝文章看看如何安裝的。
1、在Docker中下載並執行Jenkins
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
2、訪問Jenkins / Blue Ocean Docker容器
docker exec -it jenkins-blueocean bash
3、安裝後設定嚮導-解鎖 Jenkins
要想檢視jenkins金鑰,必須使用下面命令獲取並填入。
docker exec -it jenkins-blueocean bash
docker logs <docker-container-name>
這樣就完成了Jenkins的安裝,下面我們通過兩個示例來使用jenkins釋出next.js和spring專案。
構建nodejs專案
這是官網提供的安裝方式
操作過程:
- 0、新建git服務商(gitlab、github等等)ssh憑證和k8s conifg ~/.kube/config憑證(沒有這個kubectl認證會失敗)
- 1、首先新建一個流水線任務
- 2、流水線選擇Pipline Script或者Pipline Script from SCM
- 3、將Jenkins指令碼放入其中
- 4、點選立即構建
下面是完整的Jenkinsfile檔案
pipeline {
agent any
environment {
GIT_REPOSITORY="xxx"
K8S_YAML="k8s/test-xxx-webapp.yaml"
POD_NAME="test-xxx-webapp"
DOCKER_USERNAME="xxx"
DOCKER_PWD="xxx
ALIYUN_DOCKER_HOST = 'xxx'
ALIYUN_DOCKER_NAMESPACE="com-xxx"
ALIYUN_DOCKER_REPOSITORY_NAME="webapp-test"
K8S_CONFIG = credentials('test-xxx-k8s-config-text')
}
stages {
stage("Clone") {
agent any
steps {
echo "1.Clone Stage"
// 刪除資料夾
deleteDir()
git branch: 'test', credentialsId: 'xxx', url: "${GIT_REPOSITORY}"
script {
// 獲取git程式碼tag為docker倉庫tag
// GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
// 獲取git提交hash做為docker倉庫tag
GIT_TAG = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
DOCKER_REPOSITORY = "${ALIYUN_DOCKER_HOST}/${ALIYUN_DOCKER_NAMESPACE}/${ALIYUN_DOCKER_REPOSITORY_NAME}"
// docker 阿里映象倉庫
DOCKER_REPOSITORY_TAG = "${DOCKER_REPOSITORY}:${GIT_TAG}"
}
}
}
stage("Test") {
agent any
steps {
echo "2.Test Stage"
}
}
stage("Build") {
agent any
steps {
echo "3.Build Docker Image Stage"
sh "docker build -t ${DOCKER_REPOSITORY_TAG} -f docker/Dockerfile ."
}
}
stage("Push") {
agent any
steps {
echo "4.Push Docker Image Stage"
//推送Docker映象,username 跟 password 為 阿里雲容器映象服務的賬號密碼
sh "docker login --username=${DOCKER_USERNAME} --password=${DOCKER_PWD} ${ALIYUN_DOCKER_HOST}"
// 開始推送映象
sh "docker push ${DOCKER_REPOSITORY_TAG}"
// 刪除生成的image
//sh "docker rmi ${DOCKER_IMG_HOST}/${DOCKER_IMG_PATH}:${GIT_TAG}"
// 刪除jenkins生成的image
sh '''
docker images | grep seaurl | awk '{print $3}' | xargs docker rmi -f
'''
}
}
stage("Deploy") {
agent {
docker {
image 'lwolf/helm-kubectl-docker'
}
}
steps {
echo "5.釋出映象"
sh "mkdir -p ~/.kube"
sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
sh "sed -i 's#<imagename>#${DOCKER_REPOSITORY_TAG}#g;s#<podname>#${POD_NAME}#g' ${K8S_YAML}"
sh "kubectl apply -f ${K8S_YAML} -n xxx"
}
}
}
}
構建java專案
這是官網提供的安裝方式
操作過程:
0、新建git服務商(gitlab、github等等)ssh憑證和k8s conifg ~/.kube/config憑證(沒有這個kubectl認證會失敗)
1、首先新建一個流水線任務
2、流水線選擇Pipline Script或者Pipline Script from SCM
3、將Jenkins指令碼放入其中
4、點選立即構建
下面是完整的Jenkinsfile檔案
pipeline {
agent any
environment {
GIT_REPOSITORY="xxx"
K8S_YAML="k8s/test-xxx-webapp.yaml"
POD_NAME="test-xxx-webapp"
DOCKER_USERNAME="xxx"
DOCKER_PWD="xxx
ALIYUN_DOCKER_HOST = 'xxx'
ALIYUN_DOCKER_NAMESPACE="com-xxx"
ALIYUN_DOCKER_REPOSITORY_NAME="webapp-test"
K8S_CONFIG = credentials('test-xxx-k8s-config-text')
}
stages {
stage("Clone") {
agent any
steps {
echo "1.Clone Stage"
// 刪除資料夾
deleteDir()
git branch: 'test', credentialsId: 'xxx', url: "${GIT_REPOSITORY}"
script {
// 獲取git程式碼tag為docker倉庫tag
// GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
// 獲取git提交hash做為docker倉庫tag
GIT_TAG = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
DOCKER_REPOSITORY = "${ALIYUN_DOCKER_HOST}/${ALIYUN_DOCKER_NAMESPACE}/${ALIYUN_DOCKER_REPOSITORY_NAME}"
// docker 阿里映象倉庫
DOCKER_REPOSITORY_TAG = "${DOCKER_REPOSITORY}:${GIT_TAG}"
}
}
}
stage("Test") {
agent any
steps {
echo "2.Test Stage"
}
}
stage("Build") {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
steps {
echo "3.Build Server"
sh "mvn -e -U -pl ${MODULE_NAME} -am clean package -Dmaven.test.skip=true dockerfile:build -Ddockerfile.tag=${GIT_TAG} -Ddockerfile.repository=${DOCKER_REPOSITORY}"
}
}
stage("Push") {
agent any
steps {
echo "4.Push Docker Image Stage"
//推送Docker映象,username 跟 password 為 阿里雲容器映象服務的賬號密碼
sh "docker login --username=${DOCKER_USERNAME} --password=${DOCKER_PWD} ${ALIYUN_DOCKER_HOST}"
// 開始推送映象
sh "docker push ${DOCKER_REPOSITORY_TAG}"
// 刪除生成的image
//sh "docker rmi ${DOCKER_IMG_HOST}/${DOCKER_IMG_PATH}:${GIT_TAG}"
// 刪除jenkins生成的image
sh '''
docker images | grep seaurl | awk '{print $3}' | xargs docker rmi -f
'''
}
}
stage("Deploy") {
agent {
docker {
image 'lwolf/helm-kubectl-docker'
}
}
steps {
echo "5.釋出映象"
sh "mkdir -p ~/.kube"
sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
sh "sed -i 's#<imagename>#${DOCKER_REPOSITORY_TAG}#g;s#<podname>#${POD_NAME}#g' ${K8S_YAML}"
sh "kubectl apply -f ${K8S_YAML} -n xxx"
}
}
}
}
總結
1、因為使用了docker安裝的jenkins,所以在外掛上面nodejs專案和java專案分別可以使用下面這樣的agent,不用再去安裝jdk或者nodejs、maven再去配置了,非常方便。
kubectl agent
agent {
docker {
image 'lwolf/helm-kubectl-docker'
}
}
maven agent
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
注意:
如果你想配置自己的私有倉庫maven地址(如:阿里雲效maven倉庫),首先進入宿主機目錄(不是docker容器裡面)/root/.m2
,然後建立 setting.xml
檔案(setting.xml檔案就是你自己的私有maven setting.xml檔案)
2、k8s 配置檔案~/.kube/config檔案做為jenkins憑證的時候一定要用base64轉碼,否則構建失敗。
base64轉換~/.kube/config檔案命令
base64 ~/.kube/config > kube-config.txt
Jenkinsfile中執行命令
sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
3、每個stage底下都加個否則構建失敗
agent any
4、新建流水線任務的時候如果是選擇的是Pipline Script from SCM,那麼選用的就是專案中存在的Jenkinsfile檔案。
5、最後非常感謝簡書的 @tinylk
大佬寫的文章幫助了我很多,下面第一和第二的引用就是他的文章和示例程式碼。
引用
採用jenkins pipeline實現自動構建並部署至k8s
pipeline-demo gitee
在 Linux 系統中安裝並設定 kubectl
jenkins-to-docker-image issue
基於 Jenkins 的 CI/CD (二)
K8S+Jenkins實現SpringBoot專案的CI/CD
CICD Pipeline To Deploy To Kubernetes Cluster Using Jenkins | Jenkins Kubernetes Integration
Jenkins在Pod中實現Docker in Docker並用kubectl進行部署
Jenkins+k8s實現自動化部署
Jenkins連線k8s的多種姿勢
Jenkins master位於k8s叢集外,實現jenkins slave的動態構建
jenkins連線K8S叢集