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

网友投稿 308 2022-11-10

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

用k8s+jenkins+github+dockerhub部署应用:jenkins有两种方式实现CI/CD1、自由风格,通过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 rm -rf nginx-demo3、修改代码$ cd nginx-demo/$ vim index.html4、将修改后的代码push到github$ git add .$ git commit -m "2222"$ git push #需要输入github的用户名和密码5、在jenkins中新建任务实现CI/CD

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

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

Jenkins Pipeline 有几个核心概念:Node:节点,一个 Node 就是一个 Jenkins 节点,Master 或者 slaveStage:阶段,一个 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.mdk8s.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: 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-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阶段开始之前需要人工干预,以便于部署到用户选择的环境{ stage('Clone') { echo "1.Clone Stage" git url: "https://github.com/dongyali521521/nginx-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}/' 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 podnginx-demo-65f6f679c6-5ljvd 1/1 Running 0 34mnginx-demo-65f6f679c6-p4g6m 1/1 Running 0 34mnginx-demo-65f6f679c6-xr7mx 1/1 Running 0 34m$ kubectl get svcnginx-demo NodePort 10.103.13.141 80:30185/TCP 18hhub上$ 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}/' 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 SCMSCM:gitRepository URL:git clone cd jenkins-demo$ lsDockerfile k8s.yaml main.go README.md$ cat Dockerfile

FROM golang:1.8.0-alpine ADD . /go/src/app WORKDIR /go/src/app RUN GOOS=linux GOARCH=386 go build -v -o /go/src/app/jenkins-app CMD ["./jenkins-app"]

$ cat main.go

package main // Import the fmt for formatting strings // Import os so we can read environment variables from the system import ( "fmt" "os" ) func main() { fmt.Println("Hello, Kubernetes!I'm from Jenkins CI!4444") fmt.Println("BRANCH_NAME:", os.Getenv("branch")) }

$ cat k8s.yaml

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: jenkins-demo namespace: default spec: template: metadata: labels: app: jenkins-demo spec: containers: - image: dongyali521521/jenkins-demo: imagePullPolicy: IfNotPresent name: jenkins-demo env: - name: branch value:

$ git add .$ git commit -m "4444"$ git push新建任务----名字----流水线在流水线脚本中输入如下内容----保存立即构建

node('dongyali-jnlp') { stage('Clone') { echo "1.Clone Stage" git url: "https://github.com/dongyali521521/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/jenkins-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/jenkins-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}/' 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" } }

$ kubectl get podjenkins-demo-67db45cf6c-mjdl4 0/1 CrashLoopBackOff 3 65s$ kubectl logs jenkins-demo-67db45cf6c-mjdl4Hello, Kubernetes!I'm from Jenkins CI!4444BRANCH_NAME:

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:技嘉发布 Vision 系列移动固态,USB 3.2 Gen2 x2 接口
下一篇:基于VMware,GNS3在Centos7上作DHCP中继,DNS解析,WEB服务器的综合实验
相关文章

 发表评论

暂时没有评论,来抢沙发吧~