前言
之前本人在阿里云 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 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 集群