• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

采用-jenkins-pipeline-实现自动构建并部署至-k8s

linux 搞代码 3年前 (2022-03-03) 3次浏览 已收录 0个评论
文章目录[隐藏]

前言

在日常开发中,常常会有公布的需要,而且常常会碰到各种环境,比方:开发环境、测试环境、生产环境。尽管能够应用手动构建、上传服务器部署的形式,但在微服务架构下一个我的项目常常蕴含多个微服务的部署,如果用手动形式就会十分繁琐而且容易出错。应用jenkins联合SCM能够实现代码的整个自动化构建部署过程。

本文中主动构建部署过程大抵实现了以下步骤:

  • 提交spring boot我的项目代码并打上git tag,上传代码及tag至gitlab
  • gitlab通过webhook主动触发jenkins执行工作
  • jenkins获取代码,执行代码编译、构建docker镜像、上传docker镜像至harbor镜像仓库、执行kubectl命令部署至k8s。

本文中采纳jenkins pipeline执行整个jenkins的构建过程,在pipeline中应用docker执行maven构建。文中构建的docker镜像的tag间接采纳git中的tag。

上面的示例中,jenkins版本为2.121.3,gitlab版本为10.0.2-ce,如果应用的版本不统一可能会有局部设置差别。

部署Jenkins

这里采纳docker的形式部署jenkins。

  1. 在终端中运行docker命令,应用jenkinsci/blueocean镜像运行容器。
docker run 
  -d 
  -u root 
  -p 8080:8080 
  -v jenkins_home:/var/jenkins_home 
  -v /var/run/docker.sock:/var/run/docker.sock 
  jenkinsci/blueocean
  1. 拜访 http://localhost:8080 地址,期待呈现上面解锁界面。
  1. 应用docker logs 命令从日志信息中 复制主动生成的明码(在两组星号之间)。
  1. 在 解锁Jenkins 页面, 粘贴明码并持续。
  2. 解锁jenkins后,在界面中抉择“装置倡议的插件”。
  3. 最初,jenkins要求创立管理员用户。创立新用户或应用admin用户,依照步骤实现后即可登录应用jenkis了。

注:因为前面jenkins pipeline工作会上传docker镜像至harbor仓库,如果harbor应用http须要在/etc/docker/daemon.json中将地址配置到insecure-registries;如果harbor应用自签名https证书,须要将ca证书放入/etc/docker/certs.d/目录下。设置完须要重启docker服务。

筹备java示例工程

上面新建spring boot示例工程,示例工程的代码地址为:https://gitee.com/tinylk/pipe…

创立spring boot示例工程

1.通过 https://start.spring.io/ 生成spring boot根底工程,增加一个示例Controller类。package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
    @GetMapping("")
    public String hello() {
        return "Hello!";
    }
}

2.批改application配置文件,设置端口。

spring.application.name=pipeline-demo
server.port=40080

3.编译运行,拜访 http://localhost:40080 地址能够看到示例运行后果。

增加Dockerfile

在工程根目录创立Dockerfile,用来构建docker镜像。其中${JAR_FILE}参数在pipeline执行docker build时,通过build-arg参数传入。

FROM openjdk:8-jdk-alpine
#构建参数
ARG JAR_FILE
ARG WORK_PATH="/opt/demo"
# 环境变量
ENV JAVA_OPTS="" 
    JAR_FILE=${JAR_FILE}
#设置时区
RUN apk update && apk add ca-certificates && 
    apk add tzdata && 
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && 
    echo "Asia/Shanghai" > /etc/timezone
COPY target/$JAR_FILE $WORK_PATH/
WORKDIR $WORK_PATH
ENTRYPOINT exec java $JAVA_OPTS -jar $JAR_FILE

增加k8s的Deployment配置

在工程根目录创立k8s-deployment.tpl文件,此文件用来作为k8s的yaml文件模板。在jenkens pipeline执行时,会先将tpl文件中{}括起来的自定义参数用sed命令替换为理论的内容。(因为对k8s的理解无限,不晓得有没有更好的形式来实现)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {APP_NAME}-deployment
  labels:
    app: {APP_NAME}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {APP_NAME}
  template:
    metadata:
      labels:
        app: {APP_NAME}
    spec:
      containers:
      - name: {APP_NAME}
        image: {IMAGE_URL}:{IMAGE_TAG}
        ports:
        - containerPort: 40080
        env:
          - name: SPRING_PROFILES_ACTIVE
            value: {SPRING_PROFILE}

增加Jenkinsfile

在工程根目录创立Jenkinsfile,用来执行jenkins pipeline工作。Jenkinsfile文件的大略内容形容如下:

  • environment中变量阐明,environment的文档阐明参见:https://jenkins.io/zh/doc/boo… 。
  • HARBOR_CREDS为harbor镜像仓库的用户明码,数据保留为jenkins的“username and password”类型的凭据,用credentials办法从凭据中获取。应用时通过HARBOR_CREDS_USR获取用户名,HARBOR_CREDS_PSW获取明码。
  • K8S_CONFIG为k8s中kubectl命令的yaml配置文件内容,数据保留为jenkins的“Secret Text”类型的凭据,用credentials办法从凭据中获取。这里保留的yaml配置文件内容以base64编码格局保留,在设置凭据时先要进行base64编码。(此base64编码是非必须的,如果间接保留原文,上面Jenkinsfile中须要去掉base64 -d 解码)
  • GIT_TAG变量通过执行sh命令获取以后git的tag值。因为前面构建docker镜像时应用git的tag作为镜像的标签,所以这个变量也不能为空。
  • parameters中变量阐明
HARBOR_HOST:harbor镜像仓库地址。
DOCKER_IMAGE:docker镜像名,蕴含harbor项目名称。
APP_NAME:k8s中的标签名称,对应k8s的yaml模板中的{APP_NAME}。
K8S_NAMESPACE:k8s中的namespace名称,执行kubectl命令会部署至此命名空间。
  • stages阐明:
  • Maven Build:应用docker的形式执行maven命令,args参数中将.m2目录映射进去,防止执行时反复从远端获取依赖;stash步骤中将jar文件保留下来,供前面的stage应用。
  • Docker Build:unstash获取jar文件。通过sh顺次执行docker命令登录harbor、构建镜像、上传镜像、移除本地镜像。构建镜像时,会获取jar文件名传入JAR_FILE参数。
  • Deploy:应用docker的形式执行kubectl命令。在执行前先将K8S_CONFIG中的内容进行base64解密并存为~/.kube/config配置文件,而后执行sed命令将k8s-deployment.tpl文件中“{参数名}”形式参数替换为理论的参数值,最初执行kubectl命令部署至k8s。

parameters中的参数在pipeline工作执行一次后,第二次执行时能够在界面上批改参数值。

这里的stage都是一个接一个主动执行,如果须要手动执行能够应用input指令实现。参见:https://jenkins.io/zh/doc/boo…

// 须要在jenkins的Credentials设置中配置jenkins-harbor-creds、jenkins-k8s-config参数
pipeline {
    agent any
    environment {
        HARBOR_CREDS = credentials('jenkins-harbor-creds')
        K8S_CONFIG = credentials('jenkins-k8s-config')
        GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
    }
    parameters {
        string(name: 'HARBOR_HOST', defaultValue: '172.23.101.66', description: 'harbor仓库地址')
        string(name: 'DOCKER_IMAGE', defaultValue: 'tssp/pipeline-demo', description: 'docker镜像名')
        string(name: 'APP_NAME', defaultValue: 'pipeline-demo', description: 'k8s中标签名')
        string(name: 'K8S_NAMESPACE', defaultValue: 'demo', description: 'k8s的namespace名称')
    }
    stages {
        stage('Maven Build') {
            when { expression { env.GIT_TAG != null } }
            agent {
                docker {
                    image 'maven:3-jdk-8-alpine'
                    args '-v $HOME/.m2:/root/.m2'
                }
            }
            steps {
                sh 'mvn clean package -Dfile.encoding=UTF-8 -DskipTests=true'
                stash includes: 'target/*.jar', name: 'app'
            }
        }
        stage('Docker Build') {
            when { 
                allOf {
                    expression { env.GIT_TAG != null }
                }
            }
            agent any
            steps {
                unstash 'app'
                sh "docker login -u ${HARBOR_CREDS_USR} -p ${HARBOR_CREDS_PSW} ${params.HARBOR_HOST}"
                sh "docker build --build-arg JAR_FILE=`ls target/*.jar |cut -d '/' -f2` -t ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG} ."
                sh "docker push ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
                sh "docker rmi ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
            }
            
        }
        stage('Deploy') {
            when { 
                allOf {
                    expression { env.GIT_TAG != null }
                }
            }
            agent {
                docker {
                    image 'lwolf/helm-kubectl-docker'
                }
            }
            steps {
                sh "mkdir -p ~/.kube"
                sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
                sh "sed -e 's#{IMAGE_URL}#${params.HARBOR_HOST}/${params.DOCKER_IMAGE}#g;s#{IMAGE_TAG}#${GIT_TAG}#g;s#{APP_NAME}#${params.APP_NAME}#g;s#{SPRING_PROFILE}#k8s-test#g' k8s-deployment.tpl > k8s-deployment.yml"
                sh "kubectl apply -f k8s-deployment.yml --namespace=${params.K8S_NAMESPACE}"
            }
            
        }
        
    }
}

配置jenkins pipeline工作

创立jenkins pipeline工作,并设置须要的参数。

新建pipeline工作

点击“新建工作”,输出名称并抉择“流水线”(pipeline),而后点击确定。

配置 pipeline工作

进入工作的配置界面,在流水线(pipeline)设置局部,抉择“Pipeline script from SCM”。SCM选项选为“Git”,配置好工程的git地址以及获取代码的凭证信息。而后在“Additional Behaviours”中增加“Clean before checkout”。

配置harbor账号与明码

抉择“凭据”,而后在下图所示地位点击“增加凭据”。在新凭据设置界面,类型抉择为“Username with password”,ID设置为“jenkins-harbor-creds”(此处的ID必须与Jenkinsfile中的保持一致)。Username与Password别离设置为harbor镜像私库的用户名和明码。

增加凭证


设置habor账号密码

配置k8s的kube.config配置信息

k8s中应用kubectl命令时须要yaml格局的服务器及受权信息配置文件。这里将kubectl的yaml配置文件的内容以base64编码后保留在jenkins的凭据中。pipeline工作执行时,先从jenkins凭据中获取内容,进行base64解码后将配置保留为~/.kube/config文件。kubectl的配置文件的内容如下:

apiVersion: v1
kind: Config
clusters:
- name: "test"
  cluster:
    server: "https://xxxxx"
    api-version: v1
    certificate-authority-data: "xxxxxx"
users:
- name: "user1"
  user:
    token: "xxxx"
contexts:
- name: "test"
  context:
    user: "user1"
    cluster: "test"
current-context: "test"

能够在linux中采纳上面命令将kubectl的yaml配置文件进行base64编码。

base64 kube-config.yml > kube-config.txt

而后相似上一步,在jenkins凭据中减少配置文件内容。在凭据设置界面,类型抉择为“Secret text”,ID设置为“jenkins-k8s-config”(此处的ID必须与Jenkinsfile中的保持一致),Secret设置为下面通过base64编码后的配置文件内容。

测试pipeline工作

在创立的pipeline工作中,点击“立刻构建”即可立刻执行pipeline工作。

在jenkins中存在一个名为Blue Ocean的新界面,在新界面中也能够执行pipeline工作,而且新的界面中查看工作的执行后果更加清晰,所以执行后果日志倡议在新界面中查看。点击“Open Blue Ocean”菜单进入新界面。

在Blue Ocean新界面中,能够点击“运行”执行pipeline工作。

在执行pipeline工作,执行“git describe –tags”命令出错,这是因为下面示例的Jenkinsfile中要求必须有git的tag。在git中减少tag,并提交上传至gitlab后即可解决。

在git中减少tag,并提交上传至gitlab后从新执行pipeline工作,所有步骤都执行胜利。

执行胜利后,查看harbor镜像仓库,docker镜像胜利上传至harbor。

执行胜利后,查看k8s中pod运行日志,服务启动胜利。

设置gitlab主动触发jenkins

后面的步骤中曾经实现了手动执行jenkins执行pipeline工作实现构建部署工作,上面阐明如何在代码提交后让gitlab主动触发jenkins执行pipeline工作。

jenkins中装置gitlab插件

要实现gitlab主动触发jenkins工作,须要在jenkins中装置gitlab插件。从jenkins的“系统管理”-“治理插件”中找到gitlab插件并下载安装,重启jenkins后失效。

在gitlab中创立拜访token

装置的gitlab插件在配置时,须要gitlab的拜访token,先要在gitlab中创立拜访的token。点击“用户设置”-“Access Tokens”菜单,进入拜访token设置界面。而后输出“Name”,并在“Scopes”中勾选“api”,点击“Create …”按钮即可创立拜访token。创立胜利后,肯定要将生成的token保留下来,前面将无奈再查看生成的token,如果未保留前面只能从新生成。

jenkins中配置gitlab插件

在jenkins中,进入“系统管理”-“零碎设置”-“Gitlab”配置。

输出“Connection name”、“Gitlab host URL”,在“Credentials”中点击“Add”增加gitlab的受权token。

点击增加后,会进入增加凭据界面。在增加界面,抉择类型为“GitLab API token”,API token设置为后面在gitlab中创立的token值。而后点击“增加”按钮创立凭据。

增加完gitlab api token,在Gitlab设置界面“Credentials”中抉择后面增加的token,而后点击“Test Connection”测试是否胜利。测试胜利后保留。

配置pipeline工作,启用触发器

进入jenkins的工作设置界面,在“构建触发器”中,勾上“Build when a change pushed to Gitlab.Gitlab webhook URL …”(这里的webhook URL在前面配置gitlab时须要),依据本人的须要设置其它的选项。点击“高级”按钮,而后点击“Generate”按钮生成Secret token(这里的token前面配置gitlab时须要)。

gitlab配置webhook

在gitlab的我的项目设置中抉择“Integrations”,而后在URL和Secret token中填入上一步jenkins设置中的到的内容。因为本文中是在git上打了tag后才触发jenkins执行工作,所以这里勾选“Tag push events”,而后去掉“Enable SSL verification”的勾选项,并点击“Add webhook”按钮增加。如果须要每次提交代码都触发则应该选“Push events”(留神:这里抉择Push events后,Jenkinsfile中也须要做相应的批改,去掉git的tag相干内容,否则执行时会出错)。

webhook测试

增加实现后,在上面能够看到方才增加的webhook,点击“Test”按钮在弹出的菜单中选择“Tag push events”发送测试申请,发送胜利后会显示“Hook executed successfully”信息。

Tag push Test


push胜利

webhook发送胜利后,到jenkins中能够看到正在执行触发的工作。配置胜利后,前面只有有git的tag提交到gitlab即可间接触发jenkins执行pipline工作。

webhook触发执行

作者:tinylk
原文:www.gaodaima.com/p/2d89fd1b4403


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:采用-jenkins-pipeline-实现自动构建并部署至-k8s

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址