前言
之前本人在阿里云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 bashdocker 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 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" } } }}
总结
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' } }
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 的 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集群