Jenkins安装

参考前一篇文章我们安装好Jenkins的master节点: K8S结合Jenkins实现持续集成(一)

安装是的插件我们可以选择推荐安装即可,后面单独安装需要的插件。

Jenkins配置

系统管理 –> 插件管理 –> available,安装需要的插件,有的插件下载不下来可以去官网下载之后上传安装。

  • Kubernetes
  • pipeline
  • Git Parameter
配置Kubernetes云信息

在系统管理 –> 系统设置 ,最后面有个Cloud设置,Add a new cloud

添加具体的Kubernetes信息,K8S服务器可以是Jenkins本身所在的服务器,也可以是其他集群(需要配置证书),这里以本身所在集群为例。

  • 名称 :用于pipeline调用云名称
  • Kubernetes地址:可以通过kubectl cluster-info命令获取
  • Kubernetes 服务证书 key:本身所在的集群因为我们通过sa所以不需要
  • Kubernetes 命名空间:Jenkins的nodePod节点启动的namespace
  • Jenkins 地址:主节点8080端口通过nodeport暴露出来的,地址:端口
  • Jenkins 通道:主节点50000端口通过nodeport暴露出来的,地址:端口

创建pipeline任务

选择新建任务,构建流水线。

安装了Git Parameter插件之后,可以进行分支的选择,需要进行参数化构建,这个可以在页面设置,也可以放到pipeline里面,这边直接在页面配置参数。

其中Use repository如果不设置,后面的Pipeline from SCRM的时候,就会取不到分支;

指定pipeline地址,可以直接在页面写,做好是通过Git的方式管理。

Git管理Pipeline的Jenkinsfile文件,需要提供证书拉取

编写Jenkinsfile文件
#定义参数label,K8S启动的pod名称通过这个来制定
def label = "JenkinsPOD-${UUID.randomUUID().toString()}"
#定义jenkins的工作目录
def jenworkspace="/home/jenkins/workspace/${params.PROJECT}"
#maven项目缓存,提供编译速度
def mvnrepo="/tmp/repository"
#kubectl和docker执行文件,这个可以打到镜像里面,这边直接共享的方式提供
def sharefile="/tmp/sharefile"
#deployment等K8S的yaml文件目录
def k8srepo='/tmp/k8s_repos'

#cloud为我们前面提供的云名称,nodeSelector是K8S运行pod的节点选择
podTemplate(label: label, cloud: 'kubernetes-hiningmeng',nodeSelector: 'devops.k8s.icjl/jenkins=jnlp',
    containers: [
        containerTemplate(
            name: 'jnlp',
            image: 'registry-vpc.cn-hangzhou.aliyuncs.com/hiningmeng/jnlp:v1',
            ttyEnabled: true,
            alwaysPullImage: false),
        containerTemplate(
            name: 'jnlp-maven',
            image: 'jenkins/jnlp-agent-maven',
            //image:'ungerts/jnlp-agent-maven',
            ttyEnabled: true,
            alwaysPullImage: false,
            command: 'cat')
    ],
    volumes: [
        hostPathVolume(hostPath: '/var/run/docker.sock', mountPath:'/var/run/docker.sock'),
        persistentVolumeClaim(mountPath: "$mvnrepo", claimName: 'maven-repo-pvc', readOnly: false),
        persistentVolumeClaim(mountPath: "$sharefile", claimName: 'sharefile-repo-pvc', readOnly: false),
    ]
)
{

    node (label) {
        stage('Hello World'){
            container('jnlp'){
                echo "hello, world"
                sh "ln -s $sharefile/kubectl  /usr/bin/kubectl"
                sh "ln -s $sharefile/docker /usr/bin/docker"

            }
        }
        stage('Git Pull'){
            dir("$jenworkspace"){
                git branch: "${params.BRANCH}", changelog: false, credentialsId: 'jenkins-pull-key', poll: false, url: "${params.CODE_URL}"
            }
        }
        stage('Mvn Package'){
            container('jnlp-maven'){
                dir("$jenworkspace"){
                    sh "mvn clean install -Dmaven.test.skip=true  -U  -s  $sharefile/settings.xml"
                }
            }
        }
        stage('Docker build'){
            ...
        }
        stage('K8S Deploy'){
            ...
        }
    }
}


具体的脚本还是自己摸索一下,不同的项目定制即可,大体的架子如上面的实例

构建项目

任务一次都没构建的时候会出现报错,构建一次就没问题了;

如果一切正常的话,在K8S的devops命名空间会创建出新的POD

至此,简单的可伸缩的基于K8S的Jenkins就完成了,如有问题欢迎交流。