配置 Harbor 授权
导航至Manage Jenkins -- manage credentials

添加凭据

添加 Harbor凭据

配置Gitlab 授权
添加Gitlab 凭据

配置 Kubernetes群集授权
导航至 manage jenkins -- managed file

添加一个新的授权文件

内容填写Master节点的 ~/.kube/config 内容
编写Pipeline脚本
由于只部署了一个Jenkins deployment实例 所有的流水线作业交给它来执行的话 势必会很忙 所以我们这次采用每次需要部署新流水线作业的时候 自动生成一新的jenkins 所有的流水线作业均在新部署的Jenkins实例上运行 流水线运行完毕后 该实例自动被销毁(该Jenkins实例镜像的Dockerfile如下)
FROM centos:7
LABEL maintainer karry
RUN yum install -y java-1.8.0-openjdk maven curl git libtool-ltdl-devel &&
yum clean all &&
rm -rf /var/cache/yum/* &&
mkdir -p /usr/share/jenkins
COPY slave.jar /usr/share/jenkins/slave.jar
COPY jenkins-slave /usr/bin/jenkins-slave
COPY settings.xml /etc/maven/settings.xml
RUN chmod +x /usr/bin/jenkins-slave
COPY kubectl /usr/bin/
chmod 777 /usr/bin/kubectl
ENTRYPOINT ["jenkins-slave"]
Pipeline 语句
前提:
k8s群集里面应有 dev default ops 命名空间
harbor中创建项目 并且在Libary项目中拥有tomcat:v1的镜像
gitlab 目录里面应用deploy.yaml文件
// 公共
def registry = "k8s-harbor.cds.local"
// 项目
def project = "dev"
def app_name = "java-demo"
def image_name = "${registry}/${project}/${app_name}:${BUILD_NUMBER}"
def git_address = "http://172.16.0.11:9999/root/java-demo.git"
// 认证
def secret_name = "registry-pull-secret"
def docker_registry_auth = "260ff818-175d-45c2-8250-c3b08163f8df"
def git_auth = "76ea2dd1-deb3-4e70-b8c0-e11867ccd1b8"
def k8s_auth = "b7d9a1fc-4fa2-4b6c-b98a-14f2272cf0e1"
pipeline {
agent {
kubernetes {
label "jenkins-slave"
yaml """
kind: Pod
metadata:
name: jenkins-slave
spec:
containers:
- name: jnlp
image: "${registry}/library/jenkins-slave-jdk:1.8"
imagePullPolicy: Always
volumeMounts:
- name: docker-cmd
mountPath: /usr/bin/docker
- name: docker-sock
mountPath: /var/run/docker.sock
- name: maven-cache
mountPath: /root/.m2
volumes:
- name: docker-cmd
hostPath:
path: /usr/bin/docker
- name: docker-sock
hostPath:
path: /var/run/docker.sock
- name: maven-cache
hostPath:
path: /tmp/m2
"""
}
}
parameters {
gitParameter branch: '', branchFilter: '.*', defaultValue: 'master', description: '选择发布的分支', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH'
choice (choices: ['1', '3', '5', '7'], description: '副本数', name: 'ReplicaCount')
choice (choices: ['dev','default','ops'], description: '命名空间', name: 'Namespace')
}
stages {
stage('拉取代码'){
steps {
checkout([$class: 'GitSCM',
branches: [[name: "${params.Branch}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]
])
}
}
stage('代码编译'){
steps {
sh """
mvn clean package -Dmaven.test.skip=true
"""
}
}
stage('构建镜像'){
steps {
withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
sh """
echo '
FROM ${registry}/library/tomcat:v1
LABEL maitainer karry
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
' > Dockerfile
docker build -t ${image_name} .
docker login -u ${username} -p '${password}' ${registry}
docker push ${image_name}
"""
}
}
}
stage('部署到K8S平台'){
steps {
configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: "admin.kubeconfig")]){
sh """
sed -i 's#IMAGE_NAME#${image_name}#' deploy.yaml
sed -i 's#SECRET_NAME#${secret_name}#' deploy.yaml
sed -i 's#REPLICAS#${ReplicaCount}#' deploy.yaml
chmod 777 /usr/bin/kubectl
kubectl apply -f deploy.yaml -n ${Namespace} --kubeconfig=admin.kubeconfig
"""
}
}
}
}
}
执行


执行中

打开日志控制台查看输出

成功执行

登录harbor查看dev项目下多出一以流水线编号的tag的Tomcat镜像

namespace下创建出了pod实例

查看 service
[root@k8s-master03 cna-ls]# kubectl get svc -n dev NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis-server ClusterIP 10.99.41.150 <none> 6379/TCP 3m1s yelb-appserver ClusterIP 10.108.152.58 <none> 4567/TCP 3m1s yelb-db ClusterIP 10.103.18.40 <none> 5432/TCP 3m1s yelb-lb-service LoadBalancer 10.111.75.93 <pending> 80:31369/TCP 3m1s yelb-ui ClusterIP 10.104.141.129 <none> 80/TCP 3m1s
通过 NodePort访问也是没有问题
