基于Docker安装Jenkin并部署项目

一、安装

1.1 安装Docker

点击查看笔记:Docker安装

1.2 安装Docker Compose

# 1、下载文件,使用的是国内镜像
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose# 2、进行授权
chmod +x /usr/local/bin/docker-compose# 3、查看版本
docker-compose version[root@localhost /]# docker-compose version
docker-compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

1.3 安装jenkins

# 拉取最新镜像
docker pull jenkins/jenkins# 创建一个工作目录
cd home
mkdir jenkins
cd jenkins# 创建 docker-compose.yml 文件
vi docker-compose.yml# 输入以下内容
version: "3.1"
services:jenkins:image: jenkins/jenkinscontainer_name: jenkinsports:- 8080:8080- 50000:50000volumes:- ./data/:/var/jenkins_home/# 先在当前文件夹下 data 目录
mkdir data
# 授予权限,否则启动 yml 后会报错
chmod -R a+w data/# 启动:
docker-compose up -d

由于jenkins需要下载大量内容,但是由于默认下载地址下载速度较慢,需要重新设置下载地址为国内镜像站

# 修改数据卷中的hudson.model.UpdateCenter.xml文件
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><url>https://updates.jenkins.io/update-center.json</url></site>
</sites>
# 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url></site>
</sites>

设置完后重启

docker-compose restart

1.4 配置jenkins

然后访问jenkins首页:ip:8080

初始密码通过查看jenkins运行日志可查看

docker-compose logs -f

  • 输入初始化密码

  • 点击选择插件来安装

  • 选择要安装的插件

  • 下载完毕设置信息进入首页(可能会出现下载失败的插件)

进入到首页

二、项目准备

  • 准备一个SpringBoot项目,编写一个测试接口接口

  • 将项目代码上传到Gitlab

三、jenkins配置

3.1 创建任务

  • 在jenkins上创建任务

  • 选择自由风格创建任务

3.2 配置代码拉取

如果仓库是公共的,则不需要配置密码,如果是私有的,点击右侧的添加即可添加当前在Gitlab仓库使用的账号

  • 点击立即构建

  • 点击上图②后,进入下图页面,点击控制台输出,可以根据第三行日志信息,查看jenkins本地拉取到的源码

查看jenkins本地文件中项目文件

3.3 配置maven环境

maven项目打包需要有maven和jdk1.8环境:下载maven压缩包和jdk1.8的压缩包,解压到挂载文件夹下,/home/jenkins/data是我当前服务器中挂载的jenkins的文件夹

修改maven的配置文件settings.xml

<!-- 阿里云镜像地址 -->
<mirror>  <id>alimaven</id>  <name>aliyun maven</name>  <url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror><!-- JDK1.8编译插件 -->
<profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties>
</profile>
  • jenkins配置JDK和maven

回到jenkins首页,系统管理-全局工具配置,配置完下图内容,点击应用、保存

3.4 打包项目

返回到jenkins首页,点击新增的test-job,点击配置

配置当前项目构建操作:点击增加构建操作,选择调用顶层Maven目标,选择配置的maven,目标输入package,点击应用、保存

构建项目:到底test-job首页后,点击立即构建,然后进入到控制台输出查看,首次会进行依赖下载,需要稍微等待一会儿

出现BUILD SUCCESS后,查看本地项目内target文件夹下,jar包已经被正常打包出来

3.5 jenkins容器使用宿主机Docker【后续需要使用】

构建镜像和发布镜像到镜像仓库都需要使用到docker命令,而在jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可。

设置jenkins容器使用宿主机Docker

  • 设置宿主机docker.sock权限:

    sudo chown root:root /var/run/docker.sock
    sudo chmod o+rw /var/run/docker.sock
    
  • 添加数据卷

在jenkins的docker-compose.yml文件中修改,修改后如下

version: "3.1"
services:jenkins:image: jenkins/jenkinscontainer_name: jenkinsports:- 8080:8080- 50000:50000volumes:- ./data/:/var/jenkins_home/- /usr/bin/docker:/usr/bin/docker- /var/run/docker.sock:/var/run/docker.sock- /etc/docker/daemon.json:/etc/docker/daemon.jsonrestart: always

四、配置发布&远程操作

将打包好的jar包发布到测试或正式服务器,此时使用jenkins的Publish Over SSH插件

4.1 配置服务器

  • 从首页点击系统管理-系统配置-然后滑到最底部

  • 如下图所示,点击新增按钮

  • 开始填写参数

  • 配置任务的构建后操作,进入创建的任务-配置-构建后操作

  • 应用并保存后构建项目,查看日志

  • 查看目标服务器指定文件夹,可见文件以及传输完成

4.2 通过打包成Jar包部署项目

4.2.1 目标服务器运行环境准备

test-job
├── bak  # 备份jar包文件夹
├── catalina.out # 运行指定日志文件
├── jenkins-deploy-demo.jar # 需要运行的jar文件
└── new # 发布新的jar包时需要上传到此目录└── start.sh  # 运行项目脚本:会先杀掉旧进程

start.sh 内容如下

# !/bin/bash
cd ../
now=$(date "+%Y%m%d-%H%M%S")
echo "$(date)------- 开始关闭接口服务 --------"
server_pid=$(netstat -anp|grep 8099|awk '{printf $7}'|cut -d/ -f1)
echo "$(date)-pid: $server_pid"
if [ "$server_pid" == "" ]thenecho "$(date)------- 成功关闭接口服务 --------"elseecho "$(date)-TOMCAT PID: $server_pid"kill -9 "$server_pid"echo "$(date)------- 成功关闭接口服务 --------"
fi
# 备份
echo "$(date)------- 备份 jar 包 --------"
mv `pwd`/jenkins-deploy-demo.jar `pwd`/bak/jenkins-deploy-demo.jar.$(date "+%Y%m%d")# 更新
echo "$(date)------- 更新 jar 包 --------"
mv `pwd`/new/jenkins-deploy-demo.jar `pwd`/jenkins-deploy-demo.jar# 启动服务
echo "$(date)------- 启动接口服务 --------"# 此处必须设置目标服务器java的绝对路径,否则会提示 nohup: 无法运行命令'java': 没有那个文件或目录
nohup /usr/lib/jdk1.8.0_321/bin/java -jar jenkins-deploy-demo.jar >>catalina.out 2>&1 &echo "$(date)------- 接口服务成功 --------"

4.2.2 修改jenkins上传文件配置

4.3.3 修改代码、提交、构建

增加新的接口后提交到gitlab

在jenkins对应项目中,点击立即构建,等部署完成访问新的接口即可

4.3 通过打包成Docker镜像部署项目

4.3.1 创建Dockerfile、Docker-compose文件

在项目根目录创建docker文件夹

  • 添加Dockerfile文件

  • 添加docker-compose.yml文件

4.3.2 修改jenkins任务配置

4.3.3 立即构建

构建日志

前往目标服务器查看,docker容器已经在运行,请求接口正常

4.4 基于Git tag构建

4.4.1 确保安装插件Git Parameter

4.4.2 设置任务参数化构建

4.4.3 给项目添加tag版本

4.4.4 设置任务构建时采用Shell方式构建,拉取指定tag版本代码

将原来选择maven环境构建的删除掉,然后重新添加一个执行shell的构建操作

shell命令内容以及描述

# 进入项目根目录
cd /var/jenkins_home/workspace/jenkins-deploy-demo
# 拉取指定分支代码,$release 中 release 是自定义的名称标识
git checkout $release
# 执行mvn clean install,因为是自己安装的maven,需要指定绝对路径
/var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package

保存配置后发现立即构建变成了下图所示,点击后右侧出现版本选择,版本数据来源是Gitlab设置的tag

在Gitlab上再新增一个tab v2.0.0,然后到jenkins刷新上图的页面,可见增加的tag v2.0.0 都已经显示

4.4.5 立即构建

选择版本后点击立即构建即可,然后访问接口测试项目启动是否正常

4.4.6 新tag测试

修改代码接口,提交到Gitlab,并新增一个v3.0.0tag,在jenkins中选择v3.0.0立即构建,构建完成后访问接口测试

五、jenkins流水线

5.1 流水线介绍

之前采用jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。

jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。

所以Pipeline相对自由风格或者其他的项目风格更容易操作。

5.2 构建jenkins流水线任务

5.2.1 创建任务

保存后点击立即构建

5.2.2 Groovy脚本

  • Groovy脚本基础语法
// 所有脚本命令包含在pipeline{}中
pipeline {  // 指定任务在哪个节点执行(jenkins支持分布式)agent any// 配置全局环境,指定变量名=变量值信息environment{host = '192.168.11.11'}// 存放所有任务的合集stages {// 单个任务stage('任务1') {// 实现任务的具体流程steps {echo 'do something'}}// 单个任务stage('任务2') {// 实现任务的具体流程steps {echo 'do something'}}// ……}
}
  • 测试实例
pipeline {agent any// 存放所有任务的合集stages {stage('拉取Git代码') {steps {echo '拉取Git代码'}}stage('构建代码') {steps {echo '构建代码'}}stage('制作自定义镜像并发布') {steps {echo '制作自定义镜像并发布'}}stage('部署工程') {steps {echo '部署工程'}}}
}
  • 配置到jenkins中

  • 立即构建,查看效果

5.2.3 Jenkinsfile实现

Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取项目并且获取项目中Jenkinsfile文件对项目进行构建

  • 配置pipeline如下并保存

  • 配置Jenkinsfile并提交到Gitlab

  • 立即构建

5.3 jenkins流水线任务实现

备注:流水线语法生成

5.3.1 参数化构建-指定tag构建

  • 设置Git参数,名称后续会用到

5.3.2 拉取Git代码

通过流水线语法生成Checkout代码的脚本

复制生成的流水线脚本到项目中的Jenkinsfile中,并将*/master更改为标签**${tag}**,release是设置参数化构建过程的名称

替换后的内容

pipeline {agent any// 存放所有任务的合集stages {// 拉取git代码stage('拉取Git代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab_wx', url: 'https://gitlab.xxx.xxx/wangx/jenkins-deploy-demo.git']]])}}// 构建代码stage('构建代码') {steps {echo '构建代码'}}// 制作自定义镜像并发布stage('制作自定义镜像并发布') {steps {echo '制作自定义镜像并发布'}}// 部署工程stage('部署工程') {steps {echo '部署工程'}}}
}

5.3.3 构建代码

将Jenkinsfile中构建代码代码块替换为如下内容

sh '/var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package -DskipTests'

替换后的内容为

pipeline {agent any// 存放所有任务的合集stages {// 拉取git代码stage('拉取Git代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab_wx', url: 'https://gitlab.hanshang.site/wangx/jenkins-deploy-demo.git']]])}}// 构建代码stage('构建代码') {steps {sh '/var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package -DskipTests'}}// 制作自定义镜像并发布stage('制作自定义镜像并发布') {steps {echo '制作自定义镜像并发布'}}// 部署工程stage('部署工程') {steps {echo '部署工程'}}}
}

5.3.4 制作自定义镜像并发布到阿里云

在往下进行之前,需要先让jenkins容器内部能使用jenkins容器使用宿主机Docker,详见3.5

将Jenkinsfile中制作自定义镜像并发布代码块替换为如下内容,同时增加环境变量

sh '''cp ./target/*.jar ./docker/
cd ./docker
docker build -t ${JOB_NAME}:${tag} ./'''sh '''docker login -u ${aliyunUser} -p ${aliyunPasswd} ${aliyunHost}
docker tag ${JOB_NAME}:${tag} ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}
docker push ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}'''

替换后的内容为

pipeline {agent anyenvironment{// 需要设置为自己的参数aliyunHost = 'xxxx'aliyunRepo = 'xxxx'aliyunUser = 'xxxx'aliyunPasswd = 'xxxx'}// 存放所有任务的合集stages {// 拉取git代码stage('拉取Git代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab_wx', url: 'https://gitlab.hanshang.site/wangx/jenkins-deploy-demo.git']]])}}// 构建代码stage('构建代码') {steps {sh '/var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package -DskipTests'}}// 制作自定义镜像并发布stage('制作自定义镜像并发布') {steps {sh '''cp ./target/*.jar ./docker/cd ./dockerdocker build -t ${JOB_NAME}:${release} ./'''sh '''docker login -u ${aliyunUser} -p ${aliyunPasswd} ${aliyunHost}docker tag ${JOB_NAME}:${tag} ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}docker push ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}'''}}// 部署工程stage('部署工程') {steps {echo '部署工程'}}}
}
  • 提交代码后,新增tag,在jenkins上选择对应tag进行构建

构建成功后可在本地docker查看镜像和到阿里云查看镜像是否上传成功

5.3.5 远程发布

  • 在目标服务器创建 deploy.sh 脚本文件,当前存储在 /home/admin/Downloads/jenkins-deploy-demo 文件夹下
aliyun_url=$1
aliyun_repo=$2
project_name=$3
tag=$4
port=$5imageName=$aliyun_url/$aliyun_repo/$project_name:$tagcontainerId=`docker ps -a | grep ${project_name} | awk '{print $1}'`
if [ "$containerId" != "" ] ; thendocker stop $containerIddocker rm $containerIdecho "Delete Container Success"
fiimageId=`docker images | grep ${project_name} | awk '{print $3}'`if [ "$imageId" != "" ] ; thendocker rmi -f $imageIdecho "Delete Image Success"
fidocker login -u 账号 -p 密码 $aliyun_urldocker pull $imageNamedocker run -d -p $port:$port --name $project_name $imageNameecho "Start Container Success"
echo $project_name

设置文件为可执行文件

chmod a+x deploy.sh
  • 通过流水线语法获取字符串

# 远程服务器部署的脚本:aliyunHost、aliyunRepo 是在Jenkinsfile配置的,tag获取的git parameter,port配置详见下方第二张图片
deploy.sh $aliyunHost $aliyunRepo $JOB_NAME $tag $port

补充了发布脚本后的内容

部署工程中execCommand值中即引用了Jenkinsfile的变量,也引用的jenkins的自定义参数,需用使用英文双引号包裹

deloly.sh 需要使用绝对路径

pipeline {agent anyenvironment{aliyunHost = 'registry.cn-hangzhou.aliyuncs.com'aliyunRepo = 'dtimages'aliyunUser = '浙江道霆信息技术有限公司'aliyunPasswd = 'MoveFast!'}// 存放所有任务的合集stages {// 拉取git代码stage('拉取Git代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab_wx', url: 'https://gitlab.hanshang.site/wangx/jenkins-deploy-demo.git']]])}}// 构建代码stage('构建代码') {steps {sh '/var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package -DskipTests'}}// 制作自定义镜像并发布stage('制作自定义镜像并发布') {steps {sh '''cp ./target/*.jar ./docker/cd ./dockerdocker build -t ${JOB_NAME}:${tag} ./'''sh '''docker login -u ${aliyunUser} -p ${aliyunPasswd} ${aliyunHost}docker tag ${JOB_NAME}:${tag} ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}docker push ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}'''}}// 部署工程stage('部署工程') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.1.200', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/home/admin/Downloads/jenkins-deploy-demo/deploy.sh $aliyunHost $aliyunRepo $JOB_NAME $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}
}

execCommand 需要使用双引号,否则执行命令无效,具体原因未知

  • 配置port参数

  • 立即构建

在目标服务器上查看在运行的容器,可见已经发布成功

六、发布到k8s

6.1 环境准备

k8s的安装:点击查看

6.2 文件准备

6.2.1 在k8s master服务器上创建secret

# aliregistry:可替换为自己的secret名称;registry.cn-hangzhou.aliyuncs.com:阿里云的仓库地址,可替换为自己的私有的;
kubectl create secret docker-registry  --dry-run=client  aliregistry  --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=你的账号 --docker-password=你的密码 --namespace=test-ns  -o yaml > docker-secret.yaml# 执行完上述命令后,会在当前文件夹下创建 docker-secret.yaml 文件,查看内容,其中 dockerconfigjson 是地址、用户名、密码加密后的
cat docker-secret.yaml
apiVersion: v1
data:.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5jbi1oYW5nemhvdS5hbGl5dW5jcy5jb20iOnsidXNlcm5hbWUiOiLmtZnmsZ/pgZPpnIbkv6Hmga/mioDmnK/mnInpmZDlhazlj7giLCJwYXNzd29yZCI6Ik1vdmVGYXN0ISIsImF1dGgiOiI1cldaNXJHZjZZR1Q2WnlHNUwraDVvR3Y1b3FBNXB5djVweUo2Wm1RNVlXczVZKzRPazF2ZG1WR1lYTjBJUT09In19fQ==
kind: Secret
metadata:creationTimestamp: nullname: aliregistrynamespace: test-ns
type: kubernetes.io/dockerconfigjson# 执行文件创建secret
kubectl apply -f docker-secret.yaml# 查看secret
[root@k8smaster k8s]# kubectl get secret -n test-ns
NAME                  TYPE                                  DATA   AGE
aliregistry           kubernetes.io/dockerconfigjson        1      24m
default-token-f9r6q   kubernetes.io/service-account-token   3      17d

6.2.2 创建pipeline.yml

apiVersion: apps/v1
kind: Deployment
metadata:# 指定命名空间namespace: test-ns# 指定工作负载名称name: jenkins-deploy-demo-pipelinelabels:app: jenkins-deploy-demo-pipeline
spec:replicas: 1selector:matchLabels:app: jenkins-deploy-demo-pipelinetemplate:metadata:labels:app: jenkins-deploy-demo-pipeline    spec:containers:- name: jenkins-deploy-demo-pipelineimage: registry.cn-hangzhou.aliyuncs.com/dtimages/jenkins-deploy-demo-pipeline:v5.0.0# 总是重新拉取镜像imagePullPolicy: Alwaysports:- containerPort: 8099# 指定只用自己创建的secret,如果是共有镜像,则不需要配置imagePullSecrets:- name: aliregistry
---
apiVersion: v1
kind: Service
metadata:# 指定命名空间namespace: test-nslabels:# 指定服务名称app: jenkins-deploy-demo-pipelinename: jenkins-deploy-demo-pipeline
spec:selector:# 指定应用app: jenkins-deploy-demo-pipelineports:# 对外端口- port: 8099# 容器内端口targetPort: 8099type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:# 指定命名空间namespace: test-ns# 指定 Ingress 名称name: jenkins-deploy-demo-pipeline
spec:ingressClassName: ingressrules:- host: pipeline.iamwx.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: jenkins-deploy-demo-pipelineport:number: 8099

pipeline.yml 文件创建好后,在k8s中执行测试效果

kubectl apply -f pipeline.yml
# 查看服务端口
kubectl get service -n test-ns
NAME                           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
jenkins-deploy-demo-pipeline   NodePort   10.96.204.60   <none>        8099:30387/TCP   52m

使用 ip:30387/test 即可访问接口

测试完成后,将pipeline.yml放入项目中(此时我讲tag改为5.0.0,方便测试发布效果)

6.2.3 配置k8s master服务器参数

6.2.3 修改Jenkinsfile

  • 在jenkins流水线语法生成脚本

将项目中的pipeline.yml文件上传到目标服务器,在目标服务器准备了空文件夹 /home/k8s/deploy

复制脚本到Jenkinsfile中

当前Jenkinsfile内容

pipeline {agent anyenvironment{aliyunHost = 'registry.cn-hangzhou.aliyuncs.com'aliyunRepo = 'xxx'aliyunUser = 'xxx'aliyunPasswd = 'xxx'}// 存放所有任务的合集stages {// 拉取git代码stage('拉取Git代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab_wx', url: 'https://gitlab.hanshang.site/wangx/jenkins-deploy-demo.git']]])}}// 构建代码stage('构建代码') {steps {sh '/var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package -DskipTests'}}// 制作自定义镜像并发布stage('制作自定义镜像并发布') {steps {sh '''cp ./target/*.jar ./docker/cd ./dockerdocker build -t ${JOB_NAME}:${tag} ./'''sh '''docker login -u ${aliyunUser} -p ${aliyunPasswd} ${aliyunHost}docker tag ${JOB_NAME}:${tag} ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}docker image prune -fdocker push ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}'''}}// 上传pipeline.yml文件stage('上传pipeline.yml文件') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: ' /home/k8s/deploy', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}
}

提交代码到Gitlab,可创建新的tag v4.0.1进行测试

在Jenkins中选择最新的tag进行构建

构建完成后,前往k8s master服务器的 /home/k8s/deploy 文件夹查看

  • 设置Jenkins无密码登录k8s-master
# 需要进入jenkins容器,然后运行之后的命令
docker exec -it jenkins bash
# 查看Jenkins中公钥信息
cd ~/.ssh
# 如果当期文件夹下无id_rsa / id_rsa.pub两个文件,则执行下面的命令生成,直接三次回撤即可
ssh-keygen -t rsa
# 查看生成的文件
ls
id_rsa  id_rsa.pub  known_hosts# 打印公钥内容,复制内容
cat is_rsa.pub# 进入到k8s master服务器,进入到 ~/.ssh/ 文件夹下,如果没有则手动创建
# 在 authorized_keys 文件(如果没有则手动创建 touch authorized_keys )里追加jenkins服务器的公钥,需要换行追加,一个公钥占一行# 验证免密操作
ssh root@192.168.1.100 123
bash: 123: 未找到命令
  • 配置pipeline最后一步,远程执行kubectl命令

在Jenkinsfile中增加远程执行kubectl命令过程,修改后的内容

pipeline {agent anyenvironment{aliyunHost = 'registry.cn-hangzhou.aliyuncs.com'aliyunRepo = 'xxx'aliyunUser = 'xxx'aliyunPasswd = 'xxx'}// 存放所有任务的合集stages {// 拉取git代码stage('拉取Git代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab_wx', url: 'https://gitlab.hanshang.site/wangx/jenkins-deploy-demo.git']]])}}// 构建代码stage('构建代码') {steps {sh '/var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package -DskipTests'}}// 制作自定义镜像并发布stage('制作自定义镜像并发布') {steps {sh '''cp ./target/*.jar ./docker/cd ./dockerdocker build -t ${JOB_NAME}:${tag} ./'''sh '''docker login -u ${aliyunUser} -p ${aliyunPasswd} ${aliyunHost}docker tag ${JOB_NAME}:${tag} ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}docker image prune -fdocker push ${aliyunHost}/${aliyunRepo}/${JOB_NAME}:${tag}'''}}// 上传pipeline.yml文件stage('上传pipeline.yml文件') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: ' /home/k8s/deploy', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}// 远程执行kubectl命令stage('远程执行kubectl命令') {steps {sh 'ssh root@192.168.1.100 kubectl apply -f /home/k8s/deploy/pipeline.yml'}}}
}

提交代码到Gitlab,新增一个tag v5.0.0,在jenkins选择v5.0.0版本进行构建

构建完成后,通过Kuboard控制台查看或通过指令查看 ,如果应用运行成功,访问接口

期间自行测试过程中通过 kubectl delete -f xxx.yml ,再运行后服务对外的端口会改变,需查看最新端口用于访问接口

基于Docker安装Jenkin并部署项目相关推荐

  1. 分布式电商项目——16.基于Docker+Jenkins实现自动化部署

    参考文档:https://blog.csdn.net/ming19951224/article/details/80958761 https://blog.csdn.net/cdszdd8/artic ...

  2. docker 启动容器的时候没-p 后面怎么加-p_基于Docker搭建基础自动化部署

           阅读本文约需要7分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot如何实现全链路调用 ...

  3. 《Kubernetes部署篇:基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》

    文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...

  4. 《Kubernetes部署篇:基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案三)》

    文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...

  5. Centos系统基于Docker安装tensorflow

    要基于Docker安装tensorflow,当然首先要安装Docker了,下面先说安装Docker的步骤 1.  首先卸载电脑上可能存在的老的版本,如果没有安装过可以不执行 $ sudo yum re ...

  6. 基于docker安装zabbix

    基于docker安装zabbix 1.zabbix配置 用途 ip 账户 zabbix服务端 192.168.1.1 账户:Admin 密码:zabbix zabbix-mysql数据库 192.16 ...

  7. 在云服务器上基于docker安装jenkins

    jenkins是老牌的CI/CD工具.下面记录一下在云服务器上的安装过程. 基于docker安装jenkins 下面记录了如何在云服务器上安装jenkins. 新建一个jenkins_docker文件 ...

  8. 基于docker安装部署Zabbix及使用,自动发现、日志监控报警及参照官方文档遇到的问题(图文)

    目录 一.相关原理 (1)概述 (2)Zabbix 功能 (3)Zabbix 概述 (4)zabbix监控架构详解 二.主要步骤 (一)工具/环境准备 (二)docker安装及测试 (三)docker ...

  9. Docker安装 下载镜像 部署容器 备份 创建私服

    Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用应用 ...

最新文章

  1. Android提升篇系列:Android项目代码优化实践
  2. 安装 node_Mac下的Node.js安装教程
  3. wget镜像网站并且下载到指定目录 2012-06-20 19:40:56
  4. java 8 stream()
  5. jset编写测试vue代码_使用 Jest 进行 Vue 单元测试
  6. java获取2017年第39周_java中怎么样取出39周的每周开始时间和每周结束时间?
  7. MyEclipse 2017(英文版)安装教程
  8. 腾讯荣获OSCAR尖峰开源企业奖 参与国内首个开源治理白皮书编写
  9. 开运算和闭运算_OpenCV计算机视觉学习(5)——形态学处理(腐蚀膨胀,开闭运算,礼帽黑帽,边缘检测)...
  10. js获取select标签选中的值
  11. Fiori Launchpad etag retrieve logic - UI5 Repository
  12. FormatJS – 让你的 Web 应用程序国际化
  13. mysql binlog-row-image=minimal_十一:参数binlog_row_image(笔记)
  14. DICM(DICOM), IMA 医学图像 预处理 调窗(window-leveling)
  15. Vue项目--仿大麦网移动端
  16. n维向量,n维向量空间,n维向量空间的维数
  17. Backpressure背压
  18. Android实现蓝牙(BlueTooth)设备检测连接
  19. 半方差(semi-variogram)分析的原理和应用
  20. c加加中print是什么意思_数学中质数和合数是什么意思

热门文章

  1. 产品设计-9.制作产品流程图
  2. 浅谈凝聚态物理的格林函数方法学习心得
  3. 在Mac上如何轻松下载来自浏览器的软件或内容
  4. 【Spring boot】IDEA + Maven + Spring Boot + Mybatis + Druid + PageHelper
  5. android服务程序开发,android 服务(service)开发
  6. IPGuard客户端与应用程序冲突处理方法
  7. 用模板创建Maven显示No archetype found in remote catalog. Defaulting to internal catalog
  8. SQL数据库更改SQL Sever身份认证
  9. 能量山水画家武湲承:搬运时空能量,聚藏山水画中
  10. 快速傅里叶变换FFT和逆变换的python编程