文章目录
- 前言
- 部署jenkins
- 编写docker-compose-jenkins.yaml
- 配置maven源
- 启动jenkins
- 解锁jenkins
- Jenkins默认插件及git、镜像仓库、k8s凭证配置
- host key verification configuration修改为不验证
- Gitee ssh
- 阿里云镜像仓库ssh
- 编写pipeline安装以下常用插件
- 将kubectl命令文件拷贝到jenkins容器
- 将k8s集群配置文件拷贝到jenkins
- 准备java示例工程
- 准备Dockerfile
- 添加k8s的deployment.yaml配置
- 添加Jenkinsfile
- 配置jenkins pipeline任务
- 新建pipeline任务
- 新建pipeline
- 测试pipeline任务
- 查看k8s是否已经部署k8s
- 设置gitee自动触发jenkins
- 插件确认
- 查看jenkins webhook调用路径并生成密匙
- gitee配置webhook
前言
在前面的kubernetes系列博文中我们分享了从创建kubernetes集群到各种中间件的安装,以及从springboot项目的容器化部署到kubernetes外网映射,基本上包含了从0到1的K8S基础实战的整个过程。今天我们再分享一期采用jenkins pipeline实现自动构建并部署至k8s的实战演示,各位大大敬请鉴赏。
本文中采用jenkins pipeline执行整个jenkins的构建过程,在pipeline中使用docker执行maven构建。构建后通过dockerfile将jar包构建为docker镜像,并上传到阿里云仓库。然后执行deployment部署到k8s集群。
部署jenkins
这里采用docker的方式部署jenkins。
编写docker-compose-jenkins.yaml
[root@master app]# mkdir -p jenkins/jenkins_home
[root@master app]# mkdir -p jenkins/jenkins_config
[root@master app]# vim docker-compose-jenkins.yaml
version: '3'
services:
jenkins:
image: registry.cn-hangzhou.aliyuncs.com/senfel/jenkins:2.346.3-2-centos7-jdk8
container_name: jenkins
restart: unless-stopped #指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
volumes:
- "/usr/bin/docker:/usr/bin/docker"
- "/var/run/docker.sock:/var/run/docker.sock"
- "/usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7"
- "./jenkins/jenkins_home:/var/jenkins_home"
- "./jenkins/jenkins_config:/var/jenkins_config"
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
JAVA_OPTS: '-Xmx2048M -Xms2048M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:MaxNewSize=128m -Djava.util.logging.config.file=/var/jenkins_home/log.properties -Duser.timezone=Asia/Shanghai'
user: root
ports:
- "10000:8080"
配置maven源
创建maven配置文件目录
[root@master app]# mkdir -p jenkins/jenkins_home/appconfig/maven
新增settings.xml
[root@master app]# vim jenkins/jenkins_home/appconfig/maven/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<localRepository>/root/.m2</localRepository>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</settings>
启动jenkins
[root@master app]# docker-compose -f docker-compose-jenkins.yaml up -d
访问 http://10.10.22.91:10000地址,等待出现下面解锁界面。
解锁jenkins
[root@master app]# cat jenkins/jenkins_home/secrets/initialAdminPassword
ea87fa2fb6b34e8a8415e6c3c6dc6658
解锁jenkins后,在界面中选择“安装建议的插件”并重启
Jenkins默认插件及git、镜像仓库、k8s凭证配置
host key verification configuration修改为不验证
Gitee ssh
创建用户名密码类型的github代码仓库凭证,ID为git
进入容器创建rsa
[root@master app]# docker exec -it b33560517ea0 bash
$ ssh-keygen -t rsa -C senfel123@sina.cn
后续步骤全部enter
查看公匙并配置在gitee ssh
$ cat /root/.ssh/id_rsa.pub
查看私匙并记住后面jenkins创建流水线配置凭证
$ cat /root/.ssh/id_rsa
ssh username with private key
阿里云镜像仓库ssh
创建用户名密码类型的aliyun registry镜像仓库凭证,ID为aliyun
username with password
编写pipeline安装以下常用插件
确认Pipeline、Docker Pipeline、
Pipeline: GitHub Groovy Libraries、Pipeline: Stage View Plugin (按照了pipeline默认就有)
Gitee plugin(我的git仓库是阿里云的,其他的可以按照GitLab)
是否已经安装
将kubectl命令文件拷贝到jenkins容器
[root@master ~]# find / -name kubectl
[root@master ~]# docker cp /usr/bin/kubectl jenkins:/usr/bin
将k8s集群配置文件拷贝到jenkins
[root@master ~]# docker cp /root/.kube jenkins:/root/.kube
#进入jenkins容器增加config文件执行权限
[root@master ~]# docker exec -it jenkins bash
[root@9c4198ba00e7 .kube]# chmod +x config
准备java示例工程
java工程自行准备一个springboot项目即可,这里重点是在项目根目录下新增Dockerfile、deployment.yaml、Jenkinsfile。
准备Dockerfile
# version 1.0
# 基础镜像
FROM openjdk:8-jre
# 维护人
MAINTAINER senfel<187@sina.cn>
# 创建目录
RUN mkdir -p /home/app
# 拷贝项目jar
COPY ./target/k8s-demo-0.0.1-SNAPSHOT.jar /home/app/app.jar
# 执行命令启动jar
ENTRYPOINT ["java","-jar","/home/app/app.jar"]
# 暴露端口
EXPOSE 8888
添加k8s的deployment.yaml配置
apiVersion: apps/v1
kind: Deployment # 声明一个Deployment资源对象
metadata:
name: deployment-k8s-demo
spec:
replicas: 3 # 通过replicas声明pod个数是3
selector: # 通过标签选择被控制的pod
matchLabels:
app: k8s-demo
template: # 在template中定义pod
metadata:
labels: # 给pod打上标签app=k8s-demo
app: k8s-demo
spec:
containers:
- name: k8s-demo # 声明容器名称,注意不是pod名称,pod名称应该定义在metadata中
image: k8s-demo-image
ports:
- name: http
containerPort: 8888
--- # 在一个yaml文件中通过---分割多个资源对象
apiVersion: v1
kind: Service # 声明一个Service资源对象
metadata:
name: service-k8s-demo
spec:
type: NodePort
selector: # service-k8s-demo将选择标签包含app=k8s-demo的pod
app: k8s-demo
ports:
- name: http
port: 8888 # Service监听端口
targetPort: 8888 # 转发到后端Pod的端口号
protocol: TCP # tcp协议
nodePort: 30888 # 外网访问端口,范围:30000-32767
添加Jenkinsfile
pipeline{
agent any
environment {
WS = "${WORKSPACE}"
REGISTRY= "registry.cn-hangzhou.aliyuncs.com"
IMAGE_NAME = "registry.cn-hangzhou.aliyuncs.com/senfel/k8s-demo:${env.BUILD_ID}"
K8S_NAMESPACE = "default"
}
//定义流水线的加工流程
stages {
//流水线的所有阶段
stage('step1:env check'){
steps {
sh 'pwd && ls -alh'
sh 'printenv'
sh 'docker version'
sh 'java -version'
sh 'git --version'
}
}
stage('step2:compile'){
agent {
docker {
image 'maven:3-alpine'
args '-v maven-repository:/root/.m2'
}
}
steps {
sh 'pwd && ls -alh'
sh 'mvn -v'
sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml" -Dmaven.test.skip=true'
}
}
stage('step3:build image'){
steps {
sh 'pwd && ls -alh'
sh 'docker build -t ${IMAGE_NAME} .'
}
}
stage('step4:push image'){
steps {
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: 'aliyun',
usernameVariable: 'REGISTRY_USERNAME',
passwordVariable: 'REGISTRY_PASSWORD']]) {
sh """
docker login -u ${REGISTRY_USERNAME} -p ${REGISTRY_PASSWORD} ${REGISTRY}
docker push ${IMAGE_NAME}
docker rmi ${IMAGE_NAME}
"""
}
}
}
stage('step5:deployment'){
steps {
sh """
sed -i "s#k8s-demo-image#${IMAGE_NAME}#g" deployment.yaml
kubectl apply --kubeconfig=/root/.kube/config -f deployment.yaml --namespace=${K8S_NAMESPACE}
"""
}
}
}
}
配置jenkins pipeline任务
创建jenkins pipeline任务,并设置需要的参数。
新建pipeline任务
点击“新建任务”,输入名称并选择“流水线”(pipeline),然后点击确定。
新建pipeline
配置 pipeline任务
进入任务的配置界面,在流水线(pipeline)设置部分,选择“Pipeline script from SCM”。SCM选项选为“Git”,配置好工程的git地址以及获取代码的凭证信息。然后在“Additional Behaviours”中添加“Clean before checkout”。
测试pipeline任务
在创建的pipeline任务中,点击“立即构建”即可立即执行pipeline任务。
在项目k8s-demo主页默认会有阶段视图
查看k8s是否已经部署k8s
[root@master k8s]# kubectl get pods,svc | grep k8s-demo
pod/deployment-k8s-demo-694c84bd48-blwjj 1/1 Running 0 12m
pod/deployment-k8s-demo-694c84bd48-nfwqz 1/1 Running 0 12m
pod/deployment-k8s-demo-694c84bd48-tkrv2 1/1 Running 0 12m
service/service-k8s-demo NodePort 10.107.193.30 8888:30888/TCP 14h
至此,Jenkins已经将git 分支部署在k8s集群
设置gitee自动触发jenkins
前面的步骤中已经完成了手动执行jenkins执行pipeline任务完成构建部署任务,下面说明如何在代码提交后让gitlab/gitee自动触发jenkins执行pipeline任务。
插件确认
jenkins中安装gitlab/gitee插件,我们在初始已经安装了gitee并配置了凭证。
以下直接以gitee测试,gitlab也是一样的步骤和操作。
查看jenkins webhook调用路径并生成密匙
webhook调用路径
生成webhook调用密匙
gitee配置webhook
在gitee k8s-demo项目设置中新建一个webhook
必须保证gitee能够调通你的ip,
k8s-demo 代码push测试自动构建即可。