docker安装jenkins

50 篇文章 1 订阅
25 篇文章 0 订阅

jenkins的前提是要有10个G的内存,磁盘40GB 否则会报错

如果出现访问不了,或者ssh超时,重启下虚拟机,重启docker,关闭防火墙,配置防火墙端口

docker安装gitlab_我是一只代码狗的博客-CSDN博客

安装maven

cd /usr/local

wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz


tar zxvf apache-maven-3.8.6-bin.tar.gz

mv apache-maven-3.8.6 maven

cd /usr/local/maven/conf

vi settings.xml

配置阿里云

<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>

安装jdk

下载jdk
https://www.oracle.com/java/technologies/downloads/#java8

cd /usr/local

tar zxvf jdk-8u341-linux-x64.tar.gz

mv jdk1.8.0_341 jdk

删除压缩包
rm -f jdk-8u341-linux-x64.tar.gz
rm -f apache-maven-3.8.6-bin.tar.gz

删除之前的jenkins,并且创建新的jenkins授权

rm -rf /var/jenkins/
docker rm -f jenkins
mkdir -p /var/jenkins/
chmod -R 777 /var/jenkins/

挂载jdk,和maven,jenkins的目录,并且启动jenkins

docker run -p 8080:8080 --name jenkins \
--restart=always \
-v /var/jenkins/:/var/jenkins_home/ \
-v /usr/local/jdk:/usr/local/jdk \
-v /usr/local/maven:/usr/local/maven \
-e JENKINS_UC=https://mirrors.cloud.tencent.com/jenkins/ \
-e JENKINS_UC_DOWNLOAD=https://mirrors.cloud.tencent.com/jenkins/ \
-d jenkins/jenkins:lts

浏览器输入

192.168.184.136:8080

查看密码

docker logs -f jenkins

 拿到这个密码

放入这里

 然后选择安装推荐的插件下一步

 用户名密码都是root

 安装插件

 安装这2个插件

选中,重启jenkins

 配置挂载的jdk和maven目录

 

 

 保存,应用

进入系统配置

拉倒最后,找到Ssh Servers ,输入其他服务器的信息

username就是其他服务器的账号,password就是其他服务的密码

在高级选项有密码

新建任务

 git的项目地址,就是一进来你的项目路径,不要.git后缀

 http://192.168.184.136:8090/root/test

 分支选dev

 git这里要注意,分支下面不能有项目名字,否则不能打包

 然后构建 打包命令

sh /usr/local/maven/bin/mvn package

 然后再构建后操作,选择下面的选项

target/*.jar

 先杀掉进程,在后台启动 并退出nohup

ps -ef | grep demo3-0.0.1-SNAPSHOT.jar | grep -v grep |awk '{print $2}' | xargs kill -9
nohup java -jar /usr/local/target/demo3-0.0.1-SNAPSHOT.jar & sleep 1

然后应用 保存

立即构建

 也可以点击,任务选择箭头 选择控制台输出 看详情

 

 出现这样就表示构建成功

我们输入另一台机器的ip端口和接口访问,就可以看到数据了

http://192.168.184.132:9003/aa

我们进入另一台机器,看一下他的目录,有了发版后的数据了

接下来我们在项目中添加Dockerfile文件

FROM openjdk:8-slim
WORKDIR /usr/local
COPY demo3-0.0.1-SNAPSHOT.jar .
CMD java -jar demo3-0.0.1-SNAPSHOT.jar

 

 然后在jenkins项目中重新配置

在构建后操作,这里重新配置,使得target目录下的jar和docker目录下的Dockerfile文件

在同一个目录,并且删除调target和docker文件夹,以前配置的target的exec command里面的数据要删除掉

 我们在docker下面的exec command输入,docker构建删除并且启动的命令

docker build -t mydemo3:0.1 /usr/local
docker rm  -f demo3
docker run -d -p 9003:9003 --name demo3 mydemo3:0.1

前提是在另一台服务器要安装好docker

然后点击应用 保存

之前的普通项目要先删除掉进程。然后点击立即构建

 然后我们在另一台服务器看下,他们2个处于同一个目录了,这样我们的docker命令就好使了

 

 再次访问

http://192.168.184.132:9003/aa

接下来我们先安装下harbor

docker安装harbor

安装好之后,我们先保证public 下的镜像仓库是空的

 还要确保,我们的192.168.184.132的机器上配置过harbor仓库的地址

 然后我们在jenkins的配置 修改,构建后操作

先推送到harbor,在从harbor的镜像启动

docker build -t 192.168.184.136:80/public/mydemo3:0.1 /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:0.1 
docker rm  -f demo3
docker run -d -p 9003:9003 --name demo3 192.168.184.136:80/public/mydemo3:0.1

点击应用 保存 立即构建

然后访问,我们的微服务的接口

http://192.168.184.132:9003/aa

我们在看下harbor,已经有了数据

接下来我们在gitlab中打下标签

选择分支,写入标签名称

 接下来我们在回到jenkins的配置里面

在参数化构建过程,选择Git参数

名称:tag

参数类型:标签

默认值:origin/dev

在构建这里,切换分支

git checkout $tag
sh /usr/local/maven/bin/mvn package

然后在构建后操作,将版本号都改成我们的标签

docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag
docker rm  -f demo3
docker run -d -p 9003:9003 --name demo3 192.168.184.136:80/public/mydemo3:$tag

应用 保存

选中箭头指向的位置

 这里就会显示不同的版本,你可以选中最新的构建,也可以选择历史的进行回退

 这个时候我们的harbor就有了新的数据了

 访问我们的微服务接口,也变成新的数据了

http://192.168.184.132:9003/aa

接下来我们看下流水线的操作

新建任务,选择流水线

选择参数化构建过程

名称:tag

参数类型:标签

默认值:origin/dev

 在流水线这里选择hello world

 点击流水线语法

 选择这里的步骤

输入仓库地址:http://192.168.184.136:8090/root/test

指定分支:$tag

 然后点击生成流水线脚本,复制,然后粘贴到流水线 拉取源代码这里

 然后再次选择流水线语法

选择步骤为shell script,输入打包的命令,生成流水线脚本

 然后复制粘贴,到流水线的打包这里

然后再次选择流水线语法

选择步骤为sshPublisher,先连接到另一台机器上,输入发布镜像,启动容器的命令,生成流水线脚本

这里输入的内容 和我们之前的构建后操作一样

 然后把流水线脚本,复制粘贴到,发布镜像,启动容器这里

 完整的脚本如下

pipeline {
    agent any

    stages {
        stage('拉取源代码') {
            steps {
               checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.184.136:8090/root/test']]])
            }
        }
        
         stage('打包') {
            steps {
                sh '/usr/local/maven/bin/mvn package'
            }
        }
        
        stage('发布镜像,启动容器') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'target-132', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag
docker rm  -f demo3
docker run -d -p 9003:9003 --name demo3 192.168.184.136:80/public/mydemo3:$tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/docker', sourceFiles: 'docker/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
       
    }
}

应用 保存

然后选择

 在选择对应的分支 ,进行构建

如果出现了这种情况,先点击开始构建

 然后再次回到这里,就出现我们的标签了

 构建后就会出现这样的流水线,悬浮上去,选择logs就可以看到每一块的日志

 然后可以看到,harbor对应的推送时间已经发生了变化

接下来我们在代码中,新建一个file,名字叫Jenkinsfile

把我们之前写好的流水线代码粘过来

 然后提交到我们的gitlab中

我们在gitlab创建一个新的标签

 然后在jenkins这里修改流水线项目的配置

把流水线脚本清空,选择scm结尾的,选择Git

输入仓库地址,分支

脚本路径就是我们创建的Jenkinsfile的文件名称要一致

然后 应用保存,选择dev-0.3的标签,构建

 可以看到harbor就有了新的数据了

在浏览器输入我们的微服务接口,就变成了新的数据

http://192.168.184.132:9003/aa

接下来我们对k8s进行一些配置,先提前安装好k8s

使用kubeode快速部署k8s_我是一只代码狗的博客-CSDN博客

然后我们在代码中创建deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-pod
  template:
    metadata:
      labels:
        app: my-pod
    spec:
      containers:
        - name: demo3
          image: 192.168.184.136:80/public/mydemo3:<TAG>
          ports:
            - containerPort: 9003
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  ports:
    - port: 9003
      name: service-port
      nodePort: 31000
  selector:
    app: my-pod

 这里我们吧Deployment和Service的yaml放在了一起,然后通过3个-做分隔符

然后再镜像后面使用<TAG>做动态的版本,然后上传到gitlab中

 我们在创建一个新的标签

 然后我们回到jenkins的系统管理-》系统配置这里,找到Publish over SSH

添加k8s服务器的配置,选择高级输入密码

 name: target-128 随便起

hostname: 192.168.184.128  k8s服务器的ip地址

username: root 登录用户

Remote Directory: /usr/local  远程文件夹,存放到k8s服务器的这个目录下

Passphrase / Password:k8s服务器的密码

点击高级会显示密码

然后点击应用 保存

然后我们重新配置下流水线的任务

在流水线语法这里,改造一下之前的推送镜像,启动容器,变成只推送镜像

命令如下

docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag

 生成流水线脚本,复制 粘贴,放入到发布镜像这里

 然后我们在流水线语法这里选择k8s的服务器,就是之前我们在ssh配置的,然后生成流水线脚本

Source files:deployment.yml 就是我们在gitlab上传的那个

Exec command:就是把代码写的<TAG> 替换成在git哪里配置的$tag,就是下面的这个

 然后删除之前的容器 和服务,并且创建新的容器和服务

命令如下

sed -i 's/<TAG>/$tag/' /usr/local/deployment.yml
kubectl delete deployment my-deployment
kubectl delete service my-service
kubectl apply -f /usr/local/deployment.yml

然后复制流水线脚本 到流水线语法的 启动k8s 这里面 粘贴

然后点击 应用 保存

完整的脚本如下,第1,第二步都没动过,还是之前的,只是吧第3步拆开了,然后加入了第四步

pipeline {
    agent any

    stages {
        stage('拉取源代码') {
            steps {
               checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.184.136:8090/root/test']]])
            }
        }
        
         stage('打包') {
            steps {
                sh '/usr/local/maven/bin/mvn package'
            }
        }
        
        stage('发布镜像') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'target-132', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/usr/local', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
                docker login -u admin -p Harbor12345 192.168.184.136:80
                docker push 192.168.184.136:80/public/mydemo3:$tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/usr/local', remoteDirectorySDF: false, removePrefix: '/docker', sourceFiles: 'docker/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
              }
        }
        
         stage('启动k8s') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'target-128', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''sed -i \'s/<TAG>/$tag/\' /usr/local/deployment.yml
                kubectl delete deployment my-deployment
                kubectl delete service my-service
                kubectl apply -f /usr/local/deployment.yml''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'deployment.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
       
    }
}

然后选择我们之前创建好的标签 进行构建

然后我们去k8s的服务器看一下

cd /usr/local/

cat deployment.yml

可以看到标签已经动态更新为,0.4的版本

 我们在看下harbor

 我们在访问下微服务的接口,注意这里使用的是service的端口,不是微服务内部的端口

http://192.168.184.128:31000/aa

可以看到已经更新了 

如果出现ssh超时,先在这里点击测试一下,那一定是你的网络有问题了,关机重启

,然后出现success表示连接上了

 接下来我们在Jenkins安装Generic Webhook Trigger插件

系统管理-》插件管理

 接下来,我们对流水线的任务再次配置,在构建触发器这里

选择Generic Webhook Trigger

 我们先在浏览器测试下,jenkins对外暴露端口是否成功

 http://JENKINS_URL/generic-webhook-trigger/invoke

这里的jenkins_url就是你的jenkins的地址

我的是

http://192.168.184.136:8080/generic-webhook-trigger/invoke

显示这个就没问题了

 我们先在gitlab配置一下

在菜单-》管理员-》设置-》网络,找到外发请求,展开

 然后2个选项全部选中,点击保存修改

 先找到我们的项目

 点击设置-》Webhooks

我们吧推送事件取消,要不然每次提交代码都会部署项目

所以我们这里选择推送标签事件,在每一次创建新的标签的时候自动发版

 地址就是输入的我们之前在jenkins那个webhook的地址

http://192.168.184.136:8080/generic-webhook-trigger/invoke

令牌我们设置 123456 你可以自定义但是要和jenkins配置那边的token一样

启用ssl验证 勾选上 然后点击add webhook

 然后我们回到jenkins的流水线配置这里,填写token 123456

然后再Post content parameters 点击新增

Variable:tag  和我们的git参数配置哪里一样的名字

Expression: $.ref   这里是正则表达式以ref开头的

Value filter : refs/tags/    意思是吧这一段路径过滤掉,只保留我们的动态的标签

Default value:如果没有找到最新的标签话,我们默认发布0.1的版本 你可以自定义

JSONPath 也要选中

然后点击 应用 保存

接下来我们在gitlab新创建一个标签,看看创建标签后,jenkins会不会自动发版

 

 可以看到自动触发了 发版

我们看下harbor

 我们在看下微服务的接口,已经发生了变化

流水线webhook配置过滤是因为在参数这里会显示 refs/tags/webhook-0.6

 我这里过滤了,所以就显示的只有标签,这样他才能拉取到最新的标签

否则报错,拉取不到

接下来我们基于helm结合jenkins动态发布

先提前安装好helm

helm安装_我是一只代码狗的博客-CSDN博客

然后再jenkins我们新建任务 my-helm-k8s

选择流水线,复制之前写好的流水线的任务 点击确定

 可以看到 之前的这些数据都自动带过来了

 然后点击流水线语法

选择ssh

选择k8s的那台机器

命令如下,卸载掉之前的安装,然后安装仓库,更新仓库,在安装xm 动态传入副本数 和标签

helm uninstall xm

helm repo add my-repo http://192.168.184.136:18080/

helm repo update

helm install xm my-repo/my-charts --set replicas=$replicas --set tag=$tag

然后生成流水线脚本,复制粘贴到启动k8s这里

 然后我们在添加参数这里

选择字符参数

名称:replicas 就是之前命令那里$replicas 对应的就是这个

默认值:1  发布的副本数量

 

 点击应用

然后新增一个Variable 变量

Variable 输入replicas

JSONPath 选中

Default value 默认 1

 然后点击 应用 保存

接下来我们先把之前的my-pipiline配置的webhook停用,要不然就会自动发布2个

在Generic Webhook Trigger这里取消选中,然后应用保存

 接下来我们在gitlab创建一个新的标签

我们在回到jenkins上,可以看到自动发版了

 我们访问下微服务,可以看到已经变化了

 接下来我们选择 Build with Parameters 可以看到分支和副本数都有了

 那么我们设置副本数为3,再次构建下

然后我们回到k8s的服务器 看下效果

kubectl get deploy

kubectl get pods

 可以看到副本数已经更新了

接下来我们对于charts进行优化,把charts目录做成压缩包

cd /usr/local

zip -r charts.zip /usr/local/charts

 

然后把压缩包下载到windows的机器上,然后解压,并把charts目录放入到我们的代码里面

 

然后提交到gitlab

接下来我们回到jenkins这台服务器

 我们进入

cd /usr/bin

然后安装下helm

wget https://get.helm.sh/helm-v3.10.0-linux-amd64.tar.gz


tar zxvf helm-v3.10.0-linux-amd64.tar.gz


mv -f linux-amd64/helm /usr/bin

查看下helm是否安装成功

ll|grep helm

然后把宿主机的helm拷贝到jenkins容器里面去,我这里的jenkins名称就是jenkins,你也可以改成容器id

docker cp /usr/bin/helm jenkins:/usr/bin/helm

 我们进入容器看一下有没有成功

docker exec -it jenkins /bin/bash

cd /usr/bin

ls|grep helm

 

可以看到已经存在了

然后我们退出容器,回到jenkins界面上

exit

回到我们的my-helm-k8s的配置里面

 然后再流水线这里,打包下面在加一个阶段,叫helm构建和上传

然后点击流水线语法

 选择shell,生成流水线脚本

 

 这里的命令意思是,先删除原来的压缩包

curl -X DELETE http://192.168.184.136:18080/api/charts/my-charts/0.1.0

 

 

 

 然后再生成压缩包,注意这里是./charts/my-charts

helm package ./charts/my-charts

 

然后再上传压缩包到chartmuseum 



curl --data-binary "@my-charts-0.1.0.tgz" http://192.168.184.136:18080/api/charts

然后把流水线脚本复制,粘贴到 helm构建和上传 里面

 

 

 完整的脚本如下

pipeline {
    agent any

    stages {
        stage('拉取源代码') {
            steps {
               checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.184.136:8090/root/test']]])
            }
        }
        
         stage('打包') {
            steps {
                sh '/usr/local/maven/bin/mvn package'
            }
        }
        stage('helm构建和上传') {
            steps {
               sh 'curl -X DELETE http://192.168.184.136:18080/api/charts/my-charts/0.1.0'
               sh 'helm package ./charts/my-charts'
               sh 'curl --data-binary "@my-charts-0.1.0.tgz" http://192.168.184.136:18080/api/charts'
               
            }
        }
        
        
        stage('发布镜像') {
            steps {
            sshPublisher(publishers: [sshPublisherDesc(configName: 'target-131', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/docker', sourceFiles: 'docker/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])    
               }
        }
        
         stage('启动k8s') {
            steps {
               sshPublisher(publishers: [sshPublisherDesc(configName: 'target-128', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''helm uninstall xm
                helm repo add my-repo http://192.168.184.136:18080/
                helm repo update
                helm install xm my-repo/my-charts --set replicas=$replicas --set tag=$tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
       
    }
}

 我们其他的stage阶段都不用动

然后点击应用 保存

接下来我们在gitlab在创建一个标签

 然后我们在做一个副本的变更

 在看下k8s的机器

kubectl get pods

kubectl get deploy

 副本数已经发生了变化

微服务接口 也更新了

至此我们就把k8s上面的helm迁移到了jenkins里面

最后我们通过helm管理k8s应用包

Gitlab管理代码和docker脚本,jenkinsfile文件和helm

通过gitlab创建标签后,jenkins自动发布版本

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值