Docker Gitlab+Jenkins+Harbor构建持久化平台操作

CI/CD概述

CI工作流程设计

Git 代码版本管理系统 只能命令行去管理git

Gitlab 基于git做了图形管理页面,企业使用gitlab做私有的代码管理仓库

Github 公共代码管理仓库

搭建gitlab

搭建gitlab先创建工作目录,因为有些数据需要持久化

[root@www ~]# mkdir -p /gitlab
[root@www ~]# cd /gitlab/

docker run -d \
 --name gitlab \
 -p 8443:443 \
 -p 9999:80 \
 -p 9998:22 \
 -v /gitlab/config:/etc/gitlab \
 -v /gitlab/logs:/var/log/gitlab \
 -v /gitlab/data:/var/opt/gitlab \
 -v /etc/localtime:/etc/localtime \
 --restart=always \
 lizhenliang/gitlab-ce-zh:latest

9999是web端口 8443web htpps端口 9998 ssh端口

将容器化的数据持久化到本地宿主机,这个镜像是早期汉化后构建的,默认官方的镜像是英文的,这个是英文的,这个镜像比较大差不多1G,包括数据库和消息队列,里面封装的内容很多。

[root@www gitlab]# docker logs 3396d5ccc518
  - execute /opt/gitlab/bin/gitlab-ctl start postgresql
+psql_host='/var/opt/gitlab/postgresql'

通过日志可以查看到有哪些组件如postgresql

初次访问的时候可能有点慢,因为组件较多,可能要等待3-5分钟

出现这个页面说明gitlab服务是启动起来了,可能里面其他组件还没启动成功。这里最好给到物理内存4G,如果只有2G是不能正常启动的,差不多八分钟之后如下所示

用户名默认是root这里需要设置新密码,新密码最少8位可以设置为qwerasdf,然后更新完密码就可以使用root用户名 密码qwerasdf去登入

创建一个私有项目java-demo

推送代码到java-demo仓库

在另外一台机器上安装git,将项目的源码包上传

[root@localhost ~]# yum install git -y

[root@localhost ~]# unzip tomcat-java-demo-master.zip

初始化Git目录

[root@localhost ~]# cd tomcat-java-demo-master
[root@localhost tomcat-java-demo-master]# git init
Initialized empty Git repository in /root/tomcat-java-demo-master/.git/

这个git目录就会配置git相关的一些数据,初始化完成以后

[root@localhost tomcat-java-demo-master]# cd .git/
[root@localhost .git]# ls
branches config description HEAD hooks info objects refs

配置git的配置文件

这条命令是将gitlab的地址写到.git/config配置文件当中

[root@localhost tomcat-java-demo-master]# git remote add origin http://192.168.179.100:9999/root/java-demo.git

[root@localhost tomcat-java-demo-master]# cat .git/config  可以看到gitlab地址写进去了,待会去提交代码都会去读取该配置文件
[core]
 repositoryformatversion = 0
 filemode = true
 bare = false
 logallrefupdates = true
[remote "origin"]
 url = http://192.168.179.100:9999/root/java-demo.git
 fetch = +refs/heads/*:refs/remotes/origin/*

这个.代表所有,将当前代码目录提交到暂存区

[root@localhost tomcat-java-demo-master]# git add .
[root@localhost tomcat-java-demo-master]# ls
db Dockerfile LICENSE pom.xml README.md src

提交到当前git仓库里面,因为本身其就是一个git仓库了(本地也是一个git仓库)

[root@localhost tomcat-java-demo-master]# git commit -m 'all'

推送到远程仓库,这个就会读取之前的配置文件了

[root@localhost tomcat-java-demo-master]# git push origin master
Username for 'http://192.168.179.100:9999': root
Password for 'http://root@192.168.179.100:9999':
Counting objects: 179, done.
Compressing objects: 100% (166/166), done.
Writing objects: 100% (179/179), 1.12 MiB | 0 bytes/s, done.
Total 179 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
To http://192.168.179.100:9999/root/java-demo.git
 * [new branch]   master -> master

部署jenkins

[root@localhost jenkins]# ls
apache-maven-3.5.0-bin.tar.gz jdk-8u45-linux-x64.tar.gz
[root@localhost jenkins]# tar xf apache-maven-3.5.0-bin.tar.gz;tar xf jdk-8u45-linux-x64.tar.gz
[root@localhost jenkins]# mv jdk1.8.0_45 /usr/local/jdk
[root@localhost jenkins]# mv apache-maven-3.5.0 /usr/local/maven

这两个工具包的作用是让jenkins去用,jenkins是用容器部署的,所以宿主机上面的两个环境就可以挂载进去。要将maven jdk挂载进去。

因为要在jenkins里面去做镜像的构建,要使用docker build,所以这里有docker in docker,即在jenkins里面再构建docker,这里不需要研究如何在容器里面再安装docker。可以直接将宿主机的命令和socket直接挂载进去就可以直接在容器里面使用docker命令。

-v是将jenkins的数据持久化到目录下,jenkins官方将jenkins产生的数据文件都放在

/var/jenkins_home

目录下面,所以只需要将这个目录进行持久化就行,即使jenkins容器被删除了,那么数据还是可以恢复过来。

使用的镜像就是最新版,长期维护的镜像

docker run -d --name jenkins -p 80:8080 -p 50000:50000 -u root \
  -v /opt/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock  \
  -v /usr/bin/docker:/usr/bin/docker \
  -v /usr/local/maven:/usr/local/maven \
  -v /usr/local/jdk:/usr/local/jdk \
  -v /etc/localtime:/etc/localtime \
  --restart=always \
  --name jenkins jenkins/jenkins

[root@localhost jenkins]# docker ps
CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS       PORTS                      NAMES
566d2ec85fe0    jenkins/jenkins   "/sbin/tini -- /usr/…"  3 minutes ago    Up 3 minutes    0.0.0.0:50000->50000/tcp, 0.0.0.0:80->8080/tcp  jenkins

5000端口是master slave端口

[root@localhost jenkins]# docker logs 566d2ec85fe0 查看日志

点击选择插件安装,这里选择无不安装插件,先安装jenkins以后插件需要什么就安装什么

Jenkins pipeline概念

• Jenkins Pipeline是一套插件,支持在Jenkins中实现集成和持续交付管道;

• Pipeline通过特定语法对简单到复杂的传输管道进行建模;

• 声明式:遵循与Groovy相同语法。pipeline { }

• 脚本式:支持Groovy大部分功能,也是非常表达和灵活的工具。node { }

• Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile

先要安装pipeline插件然后写文本,对pipeline去建模,现在主要使用声明式语法,文本文件长什么样

在这个文件当中告诉jenkins要做什么事情,在一个大的stage里面分为了很多小的stage,通过这种流水线的形式分好了这几个阶段,在这几个stage组成了pipeline的流水线。按照从上到下的顺序执行,直到执行完成。

pipeLine写法大致是下面这些流程

Pipeline实现之后有一个案板

这个案板根据pipeline的每个步骤会输出每个步骤案板。如消耗了多长时间和日志。这样容易定位问题方便查看。

Jenkins pipeline插件的安装和pipeline使用

在安装插件的时候会很慢,如何提速?Jenkins下载插件的时候是有一些源的,可以修改位国内的源,在插件高级里面修改其实是没有用的

[root@localhost jenkins]# cd /opt/jenkins_home/
[root@localhost jenkins_home]# ls
config.xml                   nodeMonitors.xml
copy_reference_file.log             nodes
hudson.model.UpdateCenter.xml          plugins
identity.key.enc                secret.key
jenkins.install.InstallUtil.lastExecVersion   secret.key.not-so-secret
jenkins.install.UpgradeWizard.state       secrets
jenkins.model.JenkinsLocationConfiguration.xml updates
jenkins.telemetry.Correlator.xml        userContent
jobs                      users
logs                      war
[root@localhost jenkins_home]# cd updates/
[root@localhost updates]# pwd
/opt/jenkins_home/updates

[root@localhost updates]# ls

default.json 这里其实写了插件的源 hudson.tasks.Maven.MavenInstaller 使用sed进行修改

sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && \

sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

修改为清华源,然后重启生效

[root@localhost updates]# docker restart jenkins

jenkins

把git和pipeline都安装上,有个别安装失败可以,只要核心主键安装好就行

替换插件源之后安装插件明显变快了,可以看到新建项目多了流水线的选择,这里选择流水线构建

pipeline {
  agent any

  stages {
    stage('1.拉取拉取代码') {
      steps {
        echo '拉取代码'
      }
    }
        stage('2.代码代码代码编译') {
      steps {
        echo '编译'
      }
    }
        stage('3.代码部署') {
      steps {
        echo '部署'
      }
    }
  }
}

可以看到看板

这里是控制台输出,也可以指定从某个阶段运行构建

下面使用pipeline来完成流程设计

从git拉取代码,构建镜像。推送到harbor再部署到docker当中。这个脚本可以复用

#!/usr/bin/env groovy

def registry = "reg.harbor.com"
def project = "welcome"
def app_name = "demo"
def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"
def git_address = "http://192.168.179.100:9999/root/java-demo.git"
def docker_registry_auth = "c91491d9-91cd-4248-96c8-fc8cc00f7db4"
def git_auth = "86ebc99d-d3fc-4e6e-b938-db1f5a1f3642"

pipeline {
  agent any
  stages {
    stage('拉取代码'){
      steps {
       checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
      }
    }

    stage('代码编译'){
      steps {
       sh """
        JAVA_HOME=/usr/local/jdk
        PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH
        mvn clean package -Dmaven.test.skip=true
        """
      }
    }

    stage('构建镜像'){
      steps {
        withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
        sh """
         echo '
          FROM ${registry}/library/tomcat:v1
          LABEL maitainer lizhenliang
          RUN rm -rf /usr/local/tomcat/webapps/*
          ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
         ' > Dockerfile
         docker build -t ${image_name} .
         docker login -u ${username} -p '${password}' ${registry}
         docker push ${image_name}
        """
        }
      }
    }

    stage('部署到Docker'){
      steps {
       sh """
       docker rm -f tomcat-java-demo |true
       docker container run -d --name tomcat-java-demo -p 88:8080 ${image_name}
       """
      }
    }
  }
}

可以看到这里要你输入分支

参数化构建,变量的名称可以在shell脚本或者pipeline当中去引用

      steps {
        echo '${Branch}'
      }

创建harbor的凭据,即使用jenkin要访问docker harbor仓库需要知道用户名和密码

可以看到这里多了一个凭据 c91491d9-91cd-4248-96c8-fc8cc00f7db4,pipeline脚本当中就定义了凭据def docker_registry_auth = "c91491d9-91cd-4248-96c8-fc8cc00f7db4" 这是jenkins的凭据

还需要插件git凭据 86ebc99d-d3fc-4e6e-b938-db1f5a1f3642 在pipeline里面定义def git_auth = "86ebc99d-d3fc-4e6e-b938-db1f5a1f3642"

Pipeline有些语句可以自动生成,比如生成拉从取代码

知道pipeline大概的框架 套进去就行

checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '86ebc99d-d3fc-4e6e-b938-db1f5a1f3642', url: 'http://192.168.179.100:9999/root/java-demo.git']]])

拉取编译好之后的war包放到环境镜像里面

现在配置maven的源

Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-war-plugin/3.1.0/maven-war-plugin-3.1.0.jar (91 kB at 5.3 kB/s)

Downloading: https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.0.1.RELEASE/spring-boot-starter-web-2.0.1.RELEASE.pom

在后台输出可以看到这些东西,在编译构建的时候maven的源是默认的网络比较慢,现在要修改源确保拉取速度快一些宿主机上修改,这里面定义了从那个源拉取相应的依赖包

[root@localhost ~]# vim /usr/local/maven/conf/settings.xml
  <mirror>
   <id>central</id>
   <mirrorOf>central</mirrorOf>
   <name>aliyun maven</name>
   <url>https://maven.aliyun.com/repository/public</url>
  </mirror>

修改完之后不需要重启容器直重新构建,可以看到构建出来的包

[root@localhost ~]# ls /opt/jenkins_home/workspace/test-pipeline/target/ classes generated-sources ly-simple-tomcat-0.0.1-SNAPSHOT ly-simple-tomcat-0.0.1-SNAPSHOT.war maven-archiver maven-status

Job存放的是数据源信息

[root@localhost ~]# ls /opt/jenkins_home/jobs/

test test-pipeline

如果需要在其他dcker主机上部署可以使用ssh插件的ssh命令或者使用ansible别的机器上启动执行docker命令创建容器

题外话

提供了如果你的harbor提供了Https认证,那么请在你的jenkins这台主机将证书拷贝到相应的目录下面。确保jenkins主机能够登入进docker harbor仓库

[root@localhost ~]# mkdir -p /etc/docker/certs.d/reg.harbor.com
[root@localhost ~]# ls
anaconda-ks.cfg  reg.harbor.com.pem

[root@localhost ~]# cp reg.harbor.com.pem /etc/docker/certs.d/reg.harbor.com/reg.harbor.com.crt

[root@localhost ~]# cat /etc/hosts
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1     localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.179.102 reg.harbor.com

[root@localhost ~]# docker login reg.harbor.com
Authenticating with existing credentials...
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

以上这篇Docker Gitlab+Jenkins+Harbor构建持久化平台操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Docker重命名镜像名称和TAG操作

    使用docker images时,可能会出现REPOSITORY和TAG均为none的镜像,如下图 这时,我们可以重命名镜像 # docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签) 补充知识:docker image 重命名 docker image 名称不小心写错了,例如想命名为 ubuntu1604-arm-qt,写成了 unbuntu1604-arm-qt.如何改回来? 用 docker tag 重命名 docker images 找到image_

  • Docker镜像的制作,上传,拉取和部署操作(利用阿里云)

    由于学习过程中发现push镜像的时候一直超时,所以直接把阿里云的Docker仓库申请一个(管理中心–>创建镜像仓库–>我的是华东2绑定github账户即可),搞定!以后push就用这个仓库,pull的时候使用加速器,注意切换根据使用场景进行切换,dockerhub丢弃--记录了一下操作流程: 1.创建命名空间hhu(以当前学校为单位,只能小写,每个账号只能创建5个),创建菜鸟Docker镜像仓库docker1(绑定github中某个仓库,个人可以随意,这个仓库镜像就像是一个app,可以不断的更

  • Docker 配置阿里云容器服务操作

    配置阿里云Docker容器服务 登录 阿里云镜像服务控制台 首先要有一个自己的阿里云账号 1.点击名称空间,建议用自己名字/公司名字 比如叫 aliyun-stg 创建完成名字空间 2.点击镜像仓库,创建镜像,填写细信息 仓库可以使用Redis mysql 等名字进行管理 创建仓库 3.观察创建好后的信息 registry.cn-beijing.aliyuncs.com/aliyun-stg/flask 阿里docker域名 registry.cn-beijing.aliyuncs.com 我自

  • Docker 修改docker存储位置 修改容器镜像大小限制操作

    新版本这样好像快不行了,不推荐了. 不行可以直接软连接去修改存储位置. vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd  --graph=/work/docker_data --storage-driver devicemapper --storage-opt dm.loopdatasize=1000G --storage-opt dm.loopmetadatasize=10G --storage-opt

  • Docker 容器监控原理及 cAdvisor的安装与使用说明

    生产环境中监控容器的运行状况十分重要,通过监控我们可以随时掌握容器的运行状态,做到线上隐患和问题早发现,早解决. 所以今天我就和你分享关于容器监控的知识(原理及工具 cAdvisor). 虽然传统的物理机和虚拟机监控已经有了比较成熟的监控方案,但是容器的监控面临着更大的挑战,因为容器的行为和本质与传统的虚拟机是不一样的,总的来说,容器具有以下特性: 容器是短期存活的,并且可以动态调度 容器的本质是进程,而不是一个完整操作系统 由于容器非常轻量,容器的创建和销毁也会比传统虚拟机更加频繁 Docke

  • docker 打包本地镜像,并到其他机器进行恢复操作

    1.使用docker images查看本机所有的镜像文件 2.docker save eb40dcf64078> /root/mydjango-save-1016.tar 将镜像保存为本地文件,其中eb40dcf64078为image id 3.将保存到本地的文件上传到不能pull的服务器上,网络是相通的我这里直接使用的是scp命令 4.使用load方法加载刚才上传的tar文件 docker load < /root/mydjango-save-1016.tar 5.在新的机器上再此使用doc

  • Docker配置阿里云镜像加速pull的实现

    今天使用docker拉取镜像,那速度简直不能看,而且等着等着到最后还出现了 read tcp 192.168.31.60:55550->104.18.123.25:443: read: connection reset by peer 传输异常 然后看见网上说可以配置阿里云提供的镜像加速 具体方式 进入阿里云的容器镜像服务 快速链接: 容器镜像服务 复制加速器的地址 在/etc/docker目录下找到在daemon.json文件(没有就新建),将下面内容写入 { "registry-mir

  • Docker Gitlab+Jenkins+Harbor构建持久化平台操作

    CI/CD概述 CI工作流程设计 Git 代码版本管理系统 只能命令行去管理git Gitlab 基于git做了图形管理页面,企业使用gitlab做私有的代码管理仓库 Github 公共代码管理仓库 搭建gitlab 搭建gitlab先创建工作目录,因为有些数据需要持久化 [root@www ~]# mkdir -p /gitlab [root@www ~]# cd /gitlab/ docker run -d \ --name gitlab \ -p 8443:443 \ -p 9999:80

  • docker+gitlab+jenkins从零搭建自动化部署

    目录 前言: 一.安装Docker 二.Docker 安装Jenkins 1. 搜索仓库中的jenkins镜像 2. 通过拉取jenkins镜像到本地images中 3. 启动jenkins容器 三.登陆Jenkins的初始化操作 四.全局工具配置(配置环境) 五.安装Maven插件 点击系统管理–插件管理 六.新建任务,完成自动化部署 前言: 通过几天的学习和自己的理解,整理了下Docker+Jenkins的自动部署教程,如有不足,还请多多指点,谢谢! Docker的优点: Docker 让开

  • 基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境的详细教程

    环境搭建概述 亲爱的家人们可以到链接:http://xiazai.jb51.net/202105/yuanma/javayaml_jb51.rar  下载所需要的yaml文件. 1.K8S是什么? K8S全称是Kubernetes,是一个全新的基于容器技术的分布式架构领先方案,基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化. 如果我们的系统设计遵循了kubernetes的设计思想,那么传统系统架构中那些和业务没有多大关系的底层代码或功能模块,都可以使用K8S来管

  • docker搭建jenkins+maven代码构建部署平台

    目录 Docker基本概念 Docker安装过程(Centos6.9) 升级内核 安装docker-io 基于Docker的jenkins安装 拉取应用 运行容器 跟踪应用log 关闭打开容器 tomcat账户配置 配置jenkins,构建部署war应用 配置JDK.Maven等参数 新建任务构建部署 通过ssh脚本部署maven项目到指定Tomcat中 配置Publish Over SSH插件 编写部署ssh脚本 项目构建配置 由于项目开发,经常需要在本地搭一些环境进行开发或测试,大家知道搭环

  • 使用Docker+Jenkins自动构建部署

    本文介绍了Docker+Jenkins自动构建部署,分享给大家,具体如下: 环境 阿里云ESC,宿主机服务器安装Docker,在安全规则中确认8080端口开启. 客户端mac 运行jenkins 运行jenkins容器 在主机上创建目录,并添加读写权限以便jenkins应用运行时读写文件,如: $ mkdir -p /var/jenkins_node $ chmod 777 /var/jenkins_node 拉取jenkins镜像:docker pull jenkins,当前是2.60.3版.

  • 基于Harbor构建docker私有仓库的方法

    目录 一.harbor简介 一.harbor构建私有仓库 三.维护管理Harbor 四.创建Harbor用户 一.harbor简介 基于镜像的复制策略:支持LDAP/AD域,通过VPN连接域使用:图像删除和垃圾收集:图像UI,方便:审计,此功能使用较少,一般企业中用ELK收集.分析日志:RESTful API 一.harbor构建私有仓库 1.上传dock-compose,并设置权限 [root@harbor ~]# cd /usr/local/bin/ [root@harbor bin]# r

  • Docker环境搭建Jenkins在构建任务时控制台日志出现中文乱码的问题

    一.问题描述: 在Linux环境Centos操作系统下,通过Docker下载Jenkins镜像后创建了容器,并且通过服务器IP+端口访问Jenkins地址,进行相关的配置,然后创建任务job来构建跑java+selenium自动化测试脚本,目前构建Success,唯一不足之处是打印的日志出现就了乱码,如下图: (备注:执行机就是jenkins本身,同一台机器) 二.排查Jenkins设置 Jenkins系统设置查看全局属性中语言部分 2.Jenkins详细信息(浏览器Jenkins地址后面加上/

  • Docker buildx构建多平台镜像并推送到私有仓库的方法

    引子 最近发现有ARM版Docker,hub.docker.com上也有ARM版本的镜像,但是ARM版本的Docker镜像构建是个问题.嵌入式程序可以在PC机上进行交叉编译,不知道Docker是否有交叉构建的方案. 方案 目前想到的Docker构建ARM镜像方法有如下几种.第三种就类似交叉编译. 使用ARM主机,安装ARM版本的Docker,docker build出来的就是ARM版本的镜像. 使用Linux的虚拟化软件,模拟ARM芯片+ Linux,例如qemu. 使用Docker试验功能bu

  • Docker Buildx构建多平台镜像的实现

    目录 写在前边 构建环境 启用BuildX 安装qemu-user-static 通知Docker使用qemu 创建Buildx构建容器 调整Dockerfile接收平台相关参数 同时构建X86_64与ARM64镜像 写在最后 写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker 20.10.16 Ubuntu 和 Fedora 安装构建环境比较方便,

  • Shell脚本构建Docker 半自动化编译打包发布应用操作

    Docker 发布的方式为实现DevOps(自动化运维,需要配置 代码管理工具如Git的hook来实现提交编译.打包.发布等一系列事件控制)提供了诸多方便,辅助于Shell脚本可以很好的配合起来. Docker镜像可以通过自动化编译,也可以通过导入镜像的方式来获得. 本文的题目叫:Shell脚本构建Docker 半自动化编译打包发布,因为我这里还没跟代码管理关联起来. Shell脚本不同实现 导入镜像方式(镜像文件rtvsweb-publish.tar): 构建发布方式(依靠Dockerfile

随机推荐