添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
旅途中的小熊猫  ·  Maven ...·  1 年前    · 

在上一篇文章中我们介绍了在Jenkinsfile中使用dockerfile来动态生成镜像,从而在指定的阶段进行使用。而对于将构建生成的二进制应用进行容器化,比如将spring boot应用的jar文件打包生成一个基于JRE或者JDK基础的镜像,这个可以使用docker.build来实现,这篇文章将继续结合示例来进行介绍。

本文使用Easypack的LTS Jenkins 2.176.1版,环境准备请参看

  • https://liumiaocn.blog.csdn.net/article/details/92764938

Registry 准备:
本文使用docker registry作为镜像私库的管理,环境准备只需如下一行语句即可

执行命令:docker run -d -p 5000:5000 registry

使用docker ps确认私库管理的容器已经启动

liumiaocn:docker liumiao$ docker ps |grep registry
06601f2782c0        registry                     "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp                              cocky_murdock
liumiaocn:docker liumiao$

获取Jenkins-Crumb

使用如下示例代码获取Jenkins-Crumb,为使用API方式为示例作准备。

liumiaocn:jenkins liumiao$ jenkins_host_url=http://localhost:32002
liumiaocn:jenkins liumiao$ user_passwd="root:liumiaocn"
liumiaocn:jenkins liumiao$ jenkins_crumb=`curl -u $user_passwd ${jenkins_host_url}'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' 2>/dev/null`
liumiaocn:jenkins liumiao$ echo $jenkins_crumb
Jenkins-Crumb:6af0183fd58dea3d16f393b9e3272747
liumiaocn:jenkins liumiao$ 

创建Job

使用如下代码示例创建Job

liumiaocn:jenkins liumiao$ ls demo/pipeline/docker/registry/config.xml
demo/pipeline/docker/registry/config.xml
liumiaocn:jenkins liumiao$ cat demo/pipeline/docker/registry/config.xml
<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job@2.32">
  <actions>
    <org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction plugin="pipeline-model-definition@1.3.8"/>
  </actions>
  <description>Pipeline Job Sample</description>
  <keepDependencies>false</keepDependencies>
  <properties>
    <hudson.plugins.jira.JiraProjectProperty plugin="jira@3.0.7"/>
    <com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty plugin="gitlab-plugin@1.5.12">
      <gitLabConnection></gitLabConnection>
    </com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
  </properties>
  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@2.69">
  <script>node {
       stage('Prepare Dockerfile') {
        sh 'cp /tmp/Dockerfile .' 
       stage('Build image and push to local registry') {
         docker.withRegistry('http://192.168.31.242:5000') {
           def nginx_img = docker.build('my-nginx:v1')
           nginx_img.push()
       stage('Build image and push to dockerhub ') {
          sh 'docker login -u liumiaocn -p MYPASSWORD'
          sh 'docker tag my-nginx:v1 liumiaocn/my-nginx:v1'
          sh 'docker push liumiaocn/my-nginx:v1'
  }</script>
  <sandbox>false</sandbox>
  </definition>
  <triggers/>
  <disabled>false</disabled>
</flow-definition>
liumiaocn:jenkins liumiao$ curl -X POST -u $user_passwd -H ${jenkins_crumb} -H "Content-Type:application/xml"  --data-binary  "@demo/pipeline/docker/registry/config.xml" ${jenkins_host_url}/createItem?name=pipeline_job_registry
liumiaocn:jenkins liumiao$ echo $?
liumiaocn:jenkins liumiao$ 

注:MYPASSWORD在实际运行是需要改成自己的密码,前面的liumiaocn是我的dockerhub的账号。

Jenkinsfile说明

本文示例所使用的Jenkinsfile信息如下所示,内容非常简单易读,简单说明如下:

  • node是结构,在其中可以指定stage等信息
  • stage为具体的节点,比如本文示例中模拟实际的准备Dockerfile、构建镜像等操作
  • 本示例中使用了两种镜像推送的方式,第一种直接推送到前文准备的registry中,第二种推送到dockerhub上。
node {
       stage('Prepare Dockerfile') {
        sh 'cp /tmp/Dockerfile .' 
       stage('Build image and push to local registry') {
         docker.withRegistry('http://192.168.31.242:5000') {
           def nginx_img = docker.build('my-nginx:v1')
           nginx_img.push()
       stage('Build image and push to dockerhub ') {
          sh 'docker login -u liumiaocn -p MYPASSWORD'
          sh 'docker tag my-nginx:v1 liumiaocn/my-nginx:v1'
          sh 'docker push liumiaocn/my-nginx:v1'

执行Job

  • Dockerfile准备
    Dockerfile内容如下所示
liumiaocn:jenkins liumiao$ docker exec -it jenkins_jenkins_1 sh
/ # cat /tmp/Dockerfile 
FROM nginx:latest
liumiaocn:jenkins liumiao$ docker images |grep my-nginx
liumiaocn:jenkins liumiao$ 

使用如下命令或者直接在Jenkins上点击构建

liumiaocn:jenkins liumiao$ curl -X POST -u $user_passwd -H ${jenkins_crumb} ${jenkins_host_url}/job/pipeline_job_registry/build
liumiaocn:jenkins liumiao$ echo $?
liumiaocn:jenkins liumiao$

确认执行结果

使用如下命令可以确认相关的执行日志信息

liumiaocn:jenkins liumiao$ curl -u $user_passwd ${jenkins_host_url}/job/pipeline_job_registry/1/consoleText
Started by user root
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /data/jenkins/workspace/pipeline_job_registry
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Prepare Dockerfile)
[Pipeline] sh
+ cp /tmp/Dockerfile .
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build image and push to local registry)
[Pipeline] withEnv
[Pipeline] {
[Pipeline] withDockerRegistry
[Pipeline] {
[Pipeline] sh
+ docker build -t my-nginx:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM nginx:latest
latest: Pulling from library/nginx
8d691f585fa8: Pulling fs layer
047cb16c0ff6: Pulling fs layer
b0bbed1a78ca: Pulling fs layer
b0bbed1a78ca: Verifying Checksum
b0bbed1a78ca: Download complete
047cb16c0ff6: Verifying Checksum
047cb16c0ff6: Download complete
8d691f585fa8: Verifying Checksum
8d691f585fa8: Download complete
8d691f585fa8: Pull complete
047cb16c0ff6: Pull complete
b0bbed1a78ca: Pull complete
Digest: sha256:77ebc94e0cec30b20f9056bac1066b09fbdc049401b71850922c63fc0cc1762e
Status: Downloaded newer image for nginx:latest
 ---> 5a9061639d0a
Successfully built 5a9061639d0a
Successfully tagged my-nginx:v1
[Pipeline] dockerFingerprintFrom
[Pipeline] sh
+ docker tag my-nginx:v1 192.168.31.242:5000/my-nginx:v1
[Pipeline] sh
+ docker push 192.168.31.242:5000/my-nginx:v1
The push refers to repository [192.168.31.242:5000/my-nginx]
cf2436e84ea8: Preparing
ed4a4820ee08: Preparing
b67d19e65ef6: Preparing
cf2436e84ea8: Pushed
ed4a4820ee08: Pushed
b67d19e65ef6: Pushed
v1: digest: sha256:224f1b76ad5d6d5878c2dccba5b3dcc8e9a263ff04efdf0f8e0ef8f68c208a44 size: 948
[Pipeline] }
[Pipeline] // withDockerRegistry
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build image and push to dockerhub )
[Pipeline] sh
+ docker login -u liumiaocn -p MYPASSWORD
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[Pipeline] sh
+ docker tag my-nginx:v1 liumiaocn/my-nginx:v1
[Pipeline] sh
+ docker push liumiaocn/my-nginx:v1
The push refers to repository [docker.io/liumiaocn/my-nginx]
cf2436e84ea8: Preparing
ed4a4820ee08: Preparing
b67d19e65ef6: Preparing
b67d19e65ef6: Mounted from library/nginx
cf2436e84ea8: Mounted from library/nginx
ed4a4820ee08: Mounted from library/nginx
v1: digest: sha256:224f1b76ad5d6d5878c2dccba5b3dcc8e9a263ff04efdf0f8e0ef8f68c208a44 size: 948
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
liumiaocn:jenkins liumiao$

blueocean构建结果确认

构建后镜像确认

liumiaocn:jenkins liumiao$ docker images |grep my-nginx
192.168.31.242:5000/my-nginx                    v1                              5a9061639d0a        2 days ago          126MB
my-nginx                                        v1                              5a9061639d0a        2 days ago          126MB
liumiaocn/my-nginx                              v1                              5a9061639d0a        2 days ago          126MB
liumiaocn:jenkins liumiao$
  • Dockerhub镜像确认
    在这里插入图片描述

环境准备的docker-compose.yml中需要包含如下内容,以保证能够以容器方式运行的Jenkins能够进行镜像的生成。
- /var/run/docker.sock:/var/run/docker.sock
为了保证Jenkins-Crumb能够正常获取,不要设定如下Jenkins收起启动跳过插件内容的设定,以保证API的正常执行。
JAVA_OPTS=-Djenkins.install.runSetupWizard=false

另外,需要将registry的内容进行设定,否则在push时会出现下列类似的错误信息

Get https://192.168.31.242:5000/v2/: http: server gave HTTP response to HTTPS client

对应方法:
在linux下,可以在/etc/docker/daemon.json中添加registry的信息,重启docker服务即可。

{ "insecure-registries":["192.168.31.242:5000"] }

在macOS上,则可以直接在GUI页面设定之后Apply,然后重启docker服务即可

https://jenkins.io/doc/book/pipeline/docker/

//使用 wrap([$class: 'BuildUser']) 是可以取出build用户信息你 wrap([$class: 'BuildUser']) { withCredentials([usernamePassword(cred Jenkins 能做的事情太多了,如果要一一讲解肯定讲不完,因此此系列文章只以多分支流水线任务(Pipeline)为例。 我们要实现的是,能够通过 Jenkins 的 pipeline,拉取代码,编译,发布 docker 镜像,部署 docker 服务器。 我们使用 git 作为代码版本管理工具,使用 nexus3 私服作为jar包、docker 镜像的仓库。Pipeline 中,主要是使用 ... 经常遇到这种情况:线上开发、测试环境bug多,快速开发阶段,通常会修改bug之后,直接push到代码仓库,这时候的代码需要发布到开发、测试环境,以前每次都要手动去点jenkins发布,次数多了显得就有点麻烦了。 于是提出问题:能否gitlab提交之后,自动触发jenkins发布? 当然是可以配置的,那么如何配置呢? 代码提交到gitlab后自动触发jenkins发布的配置方法: 1、jenkins配置: 1.1 打开jenkins对应工程配置页面,点击最上面导航栏【构建触发器】 1.2 勾. 文章目录1. Jenkins 是什么2. 流水线2.1 流水线是什么2.2 流水线的分类2.2 为什么使用流水线3. 声明式流水线——jenkinsfile 的语法3.1 声明式流水线基础语法3.2 典型的声明式流水线例子3.3 流水线基础语法详解3.3.1 agent (require)3.3.2 stages (require)3.3.3 stage (require && alest one)3.3.4 steps (require)3.3.5 environment3.3.6 pa. 这里以gitbook的项目为例,GitHub中的gitbook项目部署在Jenkins中,执行git push命令时自动执行Jenkins构建,其他项目只是最后的执行脚本不同 安装Jenkins,详情见Jenkins安装 配置Jenkins插件,Git,GitHub的一些相关插件 安装gitbook,见gitbook 安装,如果你的项目不是gitbook的,这个可以不用安装 获取Gi... # 前言Jenkins 持续构建集成是软件版本迭代的一大利器,对于前端攻城狮来说,本身对服务器的接触就少,也并不愿意去做这个事。Jenkins持续构建省去了繁琐的服务器替换包的过程,同时有历史构建记录和每次构建的变更记录,这为我们回退和检查构建情况提供了便利。本文假设你已经搭建了一些基础环境,如Git环境,Node环境等。如未处理请自行百度# Jenkins配置步骤1. 在Jenkins中进入你要... 文章目录前言一、idea一般操作1、修改菜单通用字体2、代码区域字体3、web服务器步骤4、安装tomcat配置5、系统识别tomcat二、开启版本控制1、安装git2、查看远程gitlab三、安装Jenkins1、安装jdk2、持续集成环境(2)-插件管理 一、idea一般操作 1、修改菜单通用字体 2、代码区域字体 3、web服务器步骤 一、Jenkins安装 1、解压apache-tomcat-8.5.41-windows-x64.zip到非中文和特殊字符的路径(例如:D:\Java\azrj\apache-tomcat-8.5.41-jenkins\apache-tomcat-8.5.41)。 2、复制jenkins.war到apache-tomcat-8.5.41\webapps下。 3、解压.jenkins.zi... // 通过jenkins pipeline-syntax语法生成器获取SSH私钥 withCredentials(bindings: [sshUserPrivateKey(credentialsId: 'gituser', keyFileVariable: 'SSH_KEY_FOR_GIT', passphraseVariable: '', usernameVariable: '')]) { // 自定义ssh参考<https://git-scm.com/docs/gitfaq>"How