三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

docker安装jenkins, pipeline再调用宿主机的docker, 实现远程主机部署网站,以下以 springboot 为例

docker安装jenkins, pipeline再调用宿主机的docker, 实现远程主机部署网站,以下以 springboot 为例

准备3台主机,(每台主机,都要安装好docker ,docker-compose)
主机一: 192.168.31.199
主机二: 192.168.31.200
主机三: 192.168.31.201

需要实现主要功能:

主机一安装jenkins拉取git仓库代码,生成docker镜像,在主机二中运行部署站点

主机三用来安装harbor仓库,保存docker镜像

主机一安装jenkins

docker run -u root -d -p 8080:8080 -p 50000:50000 -v ./jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --restart=always --name=jenkins jenkins/jenkins:lts

主机三安装harbor

下载Harbor的压缩包(本课程版本为:v1.9.2
https://github.com/goharbor/harbor/releases
上传压缩包到linux,并解压
tar -xzf harbor-offline-installer-v1.9.2.tgz mkdir /opt/harbor mv harbor/* /opt/harbor cd /opt/harbor
修改Harbor的配置
vi harbor.yml
修改hostnameport
hostname: 192.168.66.102 port: 85
安装Harbor
./prepare ./install.sh
启动Harbor
docker-compose up -d 启动 docker-compose stop 停止 docker-compose restart 重新启动
访问Harbor
http://192.168.31.201:85
默认账户密码:admin/Harbor12345
pepiline 语法
Jenkinsfile
// 项目名称 String project_name = "demo-test" // harbor仓库地址 String harbor_url = "192.168.31.201:85" // harbor项目名称 String harbor_project_name = "test" // docker标签、版本号 String tag = "latest" // 开放端口 String port = "10086" pipeline { agent any tools { maven 'maven-3.8.9' // 确保这里的名称与 Jenkins 系统配置中的 Maven 名称一致 } stages { stage('pull') { steps { // 下载git代码 git branch: 'main', credentialsId: 'gogs', url: 'http://192.168.31.199:10880/gogs/demo-test.git' } } stage('build') { steps { // 执行maven打包完成后,并完成 docker打包生成镜像 sh 'mvn clean package dockerfile:build' } } stage('docker tag') { steps { // 生成的镜像打标签 sh "docker tag ${project_name}:${tag} 192.168.31.201:85/test/${project_name}:${tag}" } } stage('docker push') { steps { // 镜像上传到 harbor 仓库 withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'password', usernameVariable: 'username')]) { // 登陆harbor仓库 sh "docker login -u harbor -p 300800aA 192.168.31.201:85" // 镜像上传 sh "docker push 192.168.31.201:85/test/${project_name}:${tag}" // sh "echo 上传成功" } } } stage('server 200 publish') { steps { // 方法一,需要安装 Publish Over SSH 插件 //sshPublisher(publishers: [sshPublisherDesc(configName: 'test-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) // 方法二, 需要安装 SSH Agent 插件 sshagent(credentials: ['server-ip-200']) { sh """ ssh root@192.168.31.200 \' /opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port \' """ } } } } }
Dockerfile
FROM openjdk:17 ARG JAR_FILE COPY ${JAR_FILE} app.jar EXPOSE 10086 ENTRYPOINT ["java","-jar","/app.jar"]
deploy.sh
#! /bin/sh #接收外部参数 harbor_url=$1 harbor_project_name=$2 project_name=$3 tag=$4 port=$5 imageName=$harbor_url/$harbor_project_name/$project_name:$tag echo "容器名称:$imageName" echo "harbor_url: $harbor_url" echo "harbor_project_name: $harbor_project_name" echo "project_name: $project_name" echo "tag: $tag" echo "port: $port" #查询容器是否存在,存在则删除 containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'` if [ "$containerId" != "" ] ; then #停掉容器 docker stop $containerId #删除容器 docker rm $containerId echo "成功删除容器" fi #查询镜像是否存在,存在则删除 imageId=`docker images | grep -w $project_name | awk '{print $3}'` if [ "$imageId" != "" ] ; then #删除镜像 docker rmi -f $imageId echo "成功删除镜像" fi # 登录Harbor docker login -u harbor -p 123456 $harbor_url # 下载镜像 docker pull $imageName # 启动容器 docker run -di -p $port:8080 $imageName echo "容器启动成功"
← 返回列表