在k8s+jenkins+github+dockerhub环境中用pipeline部署应用

用k8s+jenkins+github+dockerhub部署应用:
jenkins有两种方式实现CI/CD
1、自由风格,通过shell代码实现
2、pipeline流水线,通过jenkins代码或者jenkinsfile文件实现
Pipeline 有两种创建方法:
1、可以直接在 Jenkins 的 Web UI 界面中输入jenkins代码;
2、也可以通过创建一个 Jenkinsfile 脚本文件放入项目源码库中

构建一个新项目步骤:
1、在github上新建一个项目
2、在本地将项目克隆下来
3、编写代码,dockerfile,jenkinsfile,部署该应用的yaml文件
4、将项目代码push到github上
5、使用jenkins实现CI/CD
示例:
1、在github上新建一个项目nginx-demo(略)
2、克隆代码到本地192.168.1.244
$ git clone https://github.com/dongyali521521/nginx-demo
除了第一次clone,以后每次clone都要先删除原项目再clone
$ rm -rf nginx-demo
3、修改代码
$ cd nginx-demo/
$ vim index.html
4、将修改后的代码push到github
$ git add .
$ git commit -m "2222"
$ git push #需要输入github的用户名和密码
5、在jenkins中新建任务实现CI/CD

一般情况下,除了应用程序代码之外,dockerfile,jenkinsfile和部署该应用的yaml文件都放在源码中一起管理。
一个项目内至少包括如下文件:都需要在实现CI/CD前准备好
$ cd nginx-demo/
$ ls
Dockerfile Jenkinsfile xxx.yaml index.html README.md

在k8s中使用jenkins实现CI/CD(pipeline方式)又包括如下步骤:
1、从git hub把项目克隆到jenkins slave pod的工作目录/home/jenkins/agent/workspace/pipeline-name
2、测试
3、使用Dockerfile构建镜像
4、把构建的镜像push到docker hub上
5、修改yaml文件中的镜像名为刚才构建的镜像
6、在k8s集群中部署应用
以上步骤的代码可以在jenkins master的任务配置界面输入,也可以写入Jenkinsfile文件在项目源码库中管理
前4步属于CI阶段,最后两步属于CD阶段

Jenkins Pipeline 有几个核心概念:
Node:节点,一个 Node 就是一个 Jenkins 节点,Master 或者 slave
Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作
Step:步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像

用jenkins代码模拟CI/CD步骤
新建任务----名字----流水线
在流水线脚本中输入如下内容----保存立即构建

node(‘dongyali-jnlp‘) {
    stage(‘Clone‘) {
      echo "1.Clone Stage"
    }
    stage(‘Test‘) {
      echo "2.Test Stage"
    }
    stage(‘Build‘) {
      echo "3.Build Docker Image Stage"
    }
    stage(‘Push‘) {
      echo "4.Push Docker Image Stage"
    }
    stage(‘YAML‘) {
      echo "5. Change YAML File Stage"
    }
    stage(‘Deploy‘) {
      echo "6. Deploy Stage"
    }
}

假设项目nginx-demo已经开发完毕,并上传到了git hub上
文件包括:
Dockerkfile k8s.yaml index.html README.md
k8s.yaml是部署该应用的文件
$ cd nginx-demo/
$ cat Dockerfile

FROM docker.io/nginx
MAINTAINER dongyali
ADD index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g","daemon off;"]

$ cat k8s.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-demo
  namespace: default
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - image: dongyali521521/nginx-demo:<BUILD_TAG>
        imagePullPolicy: IfNotPresent
        name: nginx-demo
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-demo
  namespace: default
spec:
  selector:
    app: nginx-demo
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    name: myapp-http

如果不指定namespace,默认会把应用部署到k8s集群的kube-ops空间,因为jenkins slave pod运行在kube-ops空间内。

下面开始在jenkins中部署上述项目:
因为每次git commit之后都要构建镜像重新部署应用,所以采用git commit的记录作为镜像的 tag
为了安全,把构建的镜像push到docker hub上时,需要输入加密的用户名和密码
凭据----Stores scoped to Jenkin下面的Jenkins----全局凭据----添加凭据:
用户名:docker hub的用户名
密码:输入docker hub的用户密码
ID:dockerHub,可以随便写,后面要用
在CD阶段开始之前需要人工干预,以便于部署到用户选择的环境
http://192.168.1.243:30003
新建任务----名字----流水线
在流水线脚本中输入如下内容----保存立即构建

node(‘dongyali-jnlp‘) {
    stage(‘Clone‘) {
        echo "1.Clone Stage"
        git url: "https://github.com/cnych/jenkins-demo.git"
        script {
            build_tag = sh(returnStdout: true, script: ‘git rev-parse --short HEAD‘).trim()
        }
    }
    stage(‘Test‘) {
      echo "2.Test Stage"
    }
    stage(‘Build‘) {
        echo "3.Build Docker Image Stage"
        sh "docker build -t dongyali521521/nginx-demo:${build_tag} ."
    }
    stage(‘Push‘) {
        echo "4.Push Docker Image Stage"
        withCredentials([usernamePassword(credentialsId: ‘dockerHub‘, passwordVariable: ‘dockerHubPassword‘, usernameVariable: ‘dockerHubUser‘)]) {
            sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"
            sh "docker push dongyali521521/nginx-demo:${build_tag}"
        }
    }
    stage(‘Deploy‘) {
        echo "5. Deploy Stage"
        def userInput = input(
            id: ‘userInput‘,
            message: ‘Choose a deploy environment‘,
            parameters: [
                [
                    $class: ‘ChoiceParameterDefinition‘,
                    choices: "Dev\nQA\nProd",
                    name: ‘Env‘
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        sh "sed -i ‘s/<BUILD_TAG>/${build_tag}/‘ k8s.yaml"
        if (userInput == "Dev") {
            // deploy dev stuff
        } else if (userInput == "QA"){
            // deploy qa stuff
        } else {
            // deploy prod stuff
        }
        sh "kubectl apply -f k8s.yaml --record"
    }
}

每次构建,都会启动一个新的jenkins slave pod
查看部署情况:
$ kubectl get pod
nginx-demo-65f6f679c6-5ljvd 1/1 Running 0 34m
nginx-demo-65f6f679c6-p4g6m 1/1 Running 0 34m
nginx-demo-65f6f679c6-xr7mx 1/1 Running 0 34m
$ kubectl get svc
nginx-demo NodePort 10.103.13.141 <none> 80:30185/TCP 18h
http://http://192.168.1.243:30185/

下面再使用jenkinsfile文件来部署应用
在项目目录nginx-demo下增加一个Jenkinsfile文件,并上传到git hub上
$ cd nginx-demo/
$ cat Jenkinsfile

node(‘dongyali-jnlp‘) {
    stage(‘Prepare‘) {
        echo "1.Prepare Stage"
        checkout scm
        script {
            build_tag = sh(returnStdout: true, script: ‘git rev-parse --short HEAD‘).trim()
        }
    }
    stage(‘Test‘) {
      echo "2.Test Stage"
    }
    stage(‘Build‘) {
        echo "3.Build Docker Image Stage"
        sh "docker build -t dongyali521521/nginx-demo:${build_tag} ."
    }
    stage(‘Push‘) {
        echo "4.Push Docker Image Stage"
        withCredentials([usernamePassword(credentialsId: ‘dockerHub‘, passwordVariable: ‘dockerHubPassword‘, usernameVariable: ‘dockerHubUser‘)]) {
            sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"
            sh "docker push dongyali521521/nginx-demo:${build_tag}"
        }
    }
    stage(‘Deploy‘) {
        echo "5. Deploy Stage"
        def userInput = input(
            id: ‘userInput‘,
            message: ‘Choose a deploy environment‘,
            parameters: [
                [
                    $class: ‘ChoiceParameterDefinition‘,
                    choices: "Dev\nQA\nProd",
                    name: ‘Env‘
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        sh "sed -i ‘s/<BUILD_TAG>/${build_tag}/‘ k8s.yaml"
        if (userInput == "Dev") {
            // deploy dev stuff
        } else if (userInput == "QA"){
            // deploy qa stuff
        } else {
            // deploy prod stuff
        }
        sh "kubectl apply -f k8s.yaml --record"
    }
}

由于Jenkinsfile和其他代码都在git hub源码库中,所以第一步就不需要再clone了,改为checkout scm

然后在jenkins配置任务界面选择:
流水线----pipeline脚本from SCM
SCM:git
Repository URL:https://github.com/dongyali521521/nginx-demo
Credentials:无
保存构建即可。

原文地址:https://blog.51cto.com/dongdong/2435877

时间: 2024-08-29 11:10:43

在k8s+jenkins+github+dockerhub环境中用pipeline部署应用的相关文章

jenkins+github 项目环境搭建和发布脚本(二)

Jenkins+gitHub项目搭建配置 项目发布脚本 profilesScript.sh (支持不同环境配置文件) #!/bin/bash ACTIVE=$1 JENKINS_PATH=/var/lib/jenkins/workspace APP_NAME=sb-system APP_PATH=$JENKINS_PATH/$APP_NAME/sb-base/src/main/resources if [ -d $APP_PATH ]; then echo "${APP_PATH}"

jenkins实现生产环境部署文件的回滚操作

由于dotnet项目的生产环境环境部署工具比较少,所以我使用jenkins作为生产环境的自动化部署工具. 既然有回滚操作,那么就会有部署操作:要实现回滚,先要实现部署的操作,我在jenkins搭建了一键从测试环境发布到正式环境的工具,部署的大致思路如下(详细的操作点这里,有详细节点配置和部署配置): 前提:安装jenkins的环境为master,每一个生产环境为slave,slave是实时连接到master的. 1.测试环境上使用了CCNET进行每次的代码变更编译部署,在测试环境上进行编译的版本

Net 项目构建基于Jenkins + Github + Mono 的持续集成环境

Net 项目构建基于Jenkins + Github + Mono 的持续集成环境 阅读目录 1 安装 2 配置 3 测试 在Redhat enterprise 6.5 的服务器上,为在gutub 上的 .net 项目构建一个持续集成环境,用到了Jenkins和mono.因公司的服务器在内网,访问外网时要通过代理,所以在很多步骤都加上了代理,如果你的服务器可以直接访问外网,则可以去掉代理. 回到顶部 1 安装 首先要在Redhat服务器上安装必要的工具. 1.1 安装Java 先检查版本,要求1

Redhat上为java Maven项目构建基于Jenkins + Github的持续集成环境

在Redhat enterprise 6.5 的服务器上,为在gutub 上的 java mvaen项目构建一个持续集成环境,用到了Jenkins.因公司的服务器在内网,访问外网时要通过代理,所以为maven加上了代理,如果你的服务器可以直接访问外网,则可以去掉代理..net 项目可参考 <在Redhat上为.Net 项目构建基于Jenkins + Github + Mono 的持续集成环境> 1. 安装 maven wget -e "http_proxy=http://web-pr

构建基于Jenkins + Github的持续集成环境

搭建持续集成首先要了解什么是持续集成,带着明确的目标去搭建持续集成环境才能让我们少走很多弯路.持续集成(Continuous integration)简称CI,是一种软件开发的实践,可以让团队在持续集成的基础上收到反馈并加以改进,不必等到开发的后期才寻找和修复缺陷.当然要明白的是持续集成环境的搭建也不是一劳永逸的,随着软件项目复杂度的增加,持续集成的环境同样要加以维护以确保集成环境的可靠性. 持续集成的重要要素:1.统一的代码库. 2.CI服务器 3.自动化测试和构建的脚本 4.Slaves 持

Jenkins集群下的pipeline实战

关于Jenkins集群 在<快速搭建Jenkins集群>一文中,我们借助docker快速搭建了Jenkins集群,今天就在这个集群环境中创建pipeline任务,体验Jenkins集群下的并行任务: 环境信息 整个集群环境一共有三台电脑,信息如下: | 主机名 | IP地址 | 作用 | |--|--|--| | master | 192.168.133.131 | Jenkins集群的master节点,提供web服务 | | agent1 | 192.168.133.132 | Jenkin

jenkins+github持续集成中的坑

1.前言 刚开始开发自己的独立博客的时候,每次发布都要手动打包,上传服务器,杀tomcat进程,重启,来回这么重复性工作,很快就有点不耐烦了.如果能自动化的东西,就绝不要手动了,所以自己搭建了个持续集成环境,配好了结合github进行push时自动构建,自动发布的流程,提交代码,泡杯咖啡就发布好了.本以为很简单,但没想到中间细节还是有不少坑,查了很多资料,墙都翻了好几次,把遇到的问题记录在这里. 2.正文 详细安装教程就不复制粘贴了,推荐此文手把手教你搭建Jenkins+Github持续集成环境

centos7搭建ANT+jmeter+jenkins接口测试自动化环境

一.环境准备 因为用到了jmeter和apache-tomcat,centos7必须要有java环境,所以配置jdk和apache-tomcat什么的,就不多说了,自行操作 帮你们偷懒: ant下载地址:http://mirrors.hust.edu.cn/apache//ant/binaries/apache-ant-1.10.3-bin.tar.gz jmeter下载地址:http://mirror.bit.edu.cn/apache//jmeter/binaries/apache-jmet

Jenkins内置环境变量

一.查看Jenkins有哪些环境变量 1.新建任意一个job 2.增加构建步骤:Execute shell 或 Execute Windows batch command 3.点击输入框下方的“可用环境变量” 4.可以看到有如下变量供使用: 变量名 解释 BUILD_NUMBER The current build number, such as "153" BUILD_ID The current build ID, identical to BUILD_NUMBER for bui