jenkins构建docker镜像上传到harbor并发布到kubernetes

很早之前写过一篇jenkins集成docker的文章,使用的是CloudBees Docker Build and Publish plugin插件。这篇文章是直接使用shell脚本做的,主要是这次有一个需求是检测harbor仓库里面是否已经存在要构建的镜像,如果存在就放弃构建,如果不存在则构建镜像并上传到harbor仓库,我这里是通过请求harbor的api来检测的。

整个过程大致分为四个步骤,画了一个简单图:

1、在jenkins上构建一个自由风格的软件项目

2、源码管理使用git。

这里的账号是gitlab上的账号。

3、构建触发器,我这里使用的是Poll SCM定时检测,即每隔一段时间检测一次代码是否有更新。

4、添加构建步骤。

这个过程是这样:

  • 读取自定义tag,并赋值给一个变量。
  • 检测harbor仓库上是否有该镜像。如果没有则构建镜像并上传到harbor,如果有则退出。
  • 通用ssh发布到kubernetes。

需要单独说一下的是,我这里需要使用自定义tag,我使用一个插件Environment Injector Plugin将这个变量变成jenkins环境变量,让其能在jenkins上调用。

另外,在远程机器上ssh执行命令需要添加授权。系统设置 -> SSH remote hosts

这里的账号是ssh连接的远程主机的用户和私钥(或者账号和密码)。

5、到这里整个过程基本完成了,进入项目,尝试构建。

控制台输出,由于太长我就直接贴文字了:

Started by user shengyongp
[EnvInject] - Loading node environment variables.
Building in workspace /var/lib/tomcat8/.jenkins/workspace/k8sdesktop
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url [email protected]:sa/k8sdesktop.git # timeout=10
Fetching upstream changes from [email protected]:sa/k8sdesktop.git
 > git --version # timeout=10
using GIT_ASKPASS to set credentials
 > git fetch --tags --progress [email protected]:sa/k8sdesktop.git +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 7593b720066259d291a31a8eb25121c260dd6e00 (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 7593b720066259d291a31a8eb25121c260dd6e00
Commit message: "update"
 > git rev-list --no-walk 7593b720066259d291a31a8eb25121c260dd6e00 # timeout=10
[k8sdesktop] $ /bin/sh -xe /tmp/tomcat8-tomcat8-tmp/jenkins6696265847877639661.sh
+ cat last_tag
+ LAST_TAG=0.0.5
+ echo LAST_TAG=0.0.5
+ curl -i -s -k https://harbor.oupeng.com/api/repositories/k8sdesktop%2Fk8sdesktop/tags/0.0.5
+ awk {print $2}
+ head -1
+ is_exsist=404
+ [ 404 -ne 200 ]
+ echo Image not exsist, prepare to build it.
Image not exsist, prepare to build it.
+ docker build -t harbor.oupeng.com/k8sdesktop/k8sdesktop:0.0.5 .
Sending build context to Docker daemon  60.25MB

Step 1/10 : FROM alpine:3.7
 ---> 3fd9065eaf02
Step 2/10 : MAINTAINER "weiduan"
 ---> Using cache
 ---> d7053b014ba5
Step 3/10 : RUN rm /etc/apk/repositories
 ---> Using cache
 ---> a73bff2a847a
Step 4/10 : ADD /sources/repositories /etc/apk/repositories
 ---> Using cache
 ---> dfbb18dfbfbd
Step 5/10 : RUN apk add --no-cache python3 supervisor nginx python3-dev build-base linux-headers pcre-dev openldap-dev     && pip3 install --no-cache-dir uwsgi django django-auth-ldap PyMySQL
 ---> Using cache
 ---> 9b318af7da67
Step 6/10 : ADD sources/ /data
 ---> Using cache
 ---> 600dcbcc0935
Step 7/10 : WORKDIR /data
 ---> Using cache
 ---> 4b4b2687ac2f
Step 8/10 : RUN ln -s /usr/lib/python3.6/site-packages/django/contrib/admin/static/admin /data/k8sdesktop/static/     && rm -f /etc/nginx/nginx.conf /etc/supervisord.conf /usr/bin/python     && mkdir -p /etc/nginx/sites-enabled /var/log/uwsgi /run/nginx     && ln -s /usr/bin/python3 /usr/bin/python     && ln -s /data/supervisord.conf /etc/     && ln -s /data/nginx.conf /etc/nginx/     && ln -s /data/k8sdesktop.conf /etc/nginx/sites-enabled/
 ---> Using cache
 ---> 4f3f962c0635
Step 9/10 : EXPOSE 80
 ---> Using cache
 ---> 2604a91e376d
Step 10/10 : ENTRYPOINT ["supervisord", "-n"]
 ---> Using cache
 ---> dde892e6136a
Successfully built dde892e6136a
Successfully tagged harbor.oupeng.com/k8sdesktop/k8sdesktop:0.0.5
+ echo Push the image to Harbor.
Push the image to Harbor.
+ docker push harbor.oupeng.com/k8sdesktop/k8sdesktop:0.0.5
The push refers to repository [harbor.oupeng.com/k8sdesktop/k8sdesktop]
950915917e6f: Preparing
7d26b9ed8228: Preparing
82a138967623: Preparing
ba67b311ae84: Preparing
68b0d545b5ec: Preparing
cd7100a72410: Preparing
cd7100a72410: Waiting
68b0d545b5ec: Layer already exists
cd7100a72410: Layer already exists
950915917e6f: Pushed
ba67b311ae84: Pushed
7d26b9ed8228: Pushed
82a138967623: Pushed
0.0.5: digest: sha256:43efbc46adef6eb7644ebaa7fe2c46dd91cfc6be9926457f276fc001e2c6543e size: 1574
[EnvInject] - Injecting environment variables from a build step.
[EnvInject] - Injecting as environment variables the properties file path ‘tmp.tags‘
[EnvInject] - Variables injected successfully.
[SSH] script:
LAST_TAG="0.0.5"

sed -ri "[email protected](image\:.*\:).*@\1${LAST_TAG}@" /root/k8sdesktop.yaml

kubectl apply -f /root/k8sdesktop.yaml

[SSH] executing...
deployment "k8sdesktop-deployment" unchanged
service "k8sdesktop-deployment" unchanged

[SSH] completed
[SSH] exit-status: 0

[k8sdesktop] $ /bin/sh -xe /tmp/tomcat8-tomcat8-tmp/jenkins7903574837135018812.sh
+ rm -f tmp.tags
Finished: SUCCESS

原文地址:https://www.cnblogs.com/keithtt/p/8440134.html

时间: 2024-10-15 20:18:17

jenkins构建docker镜像上传到harbor并发布到kubernetes的相关文章

使用Jenkins构建Docker镜像

Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时Jenkins能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性.并且Jenkins提供了大量的插件,能够完成各种任务. 今天我需要使用Jenkins构建一个Docker镜像,然后自动push到docker registry中.到了docker registry中,后面测试人员就可以把镜像发布到测试环境,测试如

docker 镜像 上传到docker hub

需要按照如下步骤处理: 我一直没有第三步,一直没有成功,直到尝试了一次docker tag ,上传docker hub就没有出现问题了. step1--找到本地镜像的ID:docker images step2--登陆Hub:docker login --username=username --password=password --email=email step3--tag:docker tag <imageID> <namespace>/<image name>:

将本地docker镜像上传至阿里云镜像仓库

1.登录阿里云镜像仓库--username后面跟上账户名,以及服务器地址2.查看本次docker镜像docker images 或者docker images ls3.push我们需要上传至阿里云镜像仓库的docker镜像注意:1).仓库名必须与阿里云所在仓库名相匹配2).非docker-hub的镜像仓库,名称空间前需要指明服务器地址,及这里的registry.cn-hangzhou.aliyuncs.com4.在阿里云镜像仓库即可看到我们上传的docker镜像 原文地址:https://blo

本地docker镜像上传到腾讯云镜像仓库。

和上篇上传到Docker Hub类似,只是登录时切换成腾讯云镜像仓库地址(ccr.ccs.tencentyun.com/longdbtencentdocker/publongdb)即可. docker login --username=账号ID ccr.ccs.tencentyun.com/longdbtencentdocker/publongdb 开始一直不成功是因为网上说的,用注册时的账号(我用qq号注册的腾讯云)login即可. 后来用腾讯云对应的账号ID就成功啦. 账号ID可以在账号信息

docker自定义镜像上传阿里云

1.alpine制作jdk镜像 2.Alpine制作jre镜像(瘦身) 3.Docker镜像上传至阿里云 alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBox以减少系统的体积和运行时的资源消耗. 2.Alpine Linux提供了自己的包管理工具:apk(注意:ubuntu中是apt-get),我们可以通过https://pkgs.alpineli

自定义镜像上传阿里云

alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBox以减少系统的体积和运行时的资源消耗. 2.Alpine Linux提供了自己的包管理工具:apk(注意:ubuntu中是apt-get),我们可以通过https://pkgs.alpinelinux.org/packages 查询包信息 3.Alpine Docker镜像继承了Alpine Lin

alpine制作jdk、jre镜像、自定义镜像上传阿里云

alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBox以减少系统的体积和运行时的资源消耗. 2.Alpine Linux提供了自己的包管理工具:apk(注意:ubuntu中是apt-get),我们可以通过https://pkgs.alpinelinux.org/packages 查询包信息 3.Alpine Docker镜像继承了Alpine Lin

docker 外部镜像 上传到本地仓库

下载外部镜像,多个节点服务器需要安装的时候再到外网下载,虽然加了加速器,修改镜像源为国内的,但是下载速度还是挺慢. 于是想我们已经安装了镜像仓库,为什么不直接将外部下载的镜像信息上传到本地仓库呢.这样只需要下载一次,然后任何需要使用的机器到本地的仓库下载安装即可. 这里我安装ELK中的L,也就是logstash,需要在每个节点服务器都安装,而这个文件就有800多M,再次下载就比较慢.于是..这样做了. 这里我的镜像仓库harbor安装在192.168.89.132上. 上传镜像的格式为 dock

如何将自己的镜像上传到docker hub上面

1.首先需要拥有自己的Docker hub账号 2.使用Docker hub账号在验证本地登录#docker login输入用户名和密码 3.先docker images看看本地的镜像 #docker images 如果REPOITORY的名不是你Docker hub账号和仓库,即Docker ID/仓库名,是上传不成功的 使用docker tag 镜像ID 用户名称/镜像源名 :新的标签名(tag) 来更改 #docker tag 861661772e3e liuxianhuacn/nginx