持续集成(Continuous Integration,CI):代码合并、构建、部署、测试都在一起,不断地执行这个过程,并对结果反馈。
持续部署(Continuous Deployment,CD):部署到测试环境、预生产环境、生产环境。
持续交付(Continuous Delivery,CD):将最终产品发布到生产环境,给用户使用。

高效的CI/CD环境可以获得:
• 及时发现问题
• 大幅度减少故障率
• 加快迭代速度
• 减少时间成本
 

环境准备:

1、部署gitlab

1.1 部署gitlab

[root@k8s-node2 ~]# mkdir gitlab
[root@k8s-node2 ~]# cd gitlab docker run -d \
--name gitlab \
-p 8443:443 \
-p 9999:80 \
-p 9998:22 \
-v $PWD/config:/etc/gitlab \
-v $PWD/logs:/var/log/gitlab \
-v $PWD/data:/var/opt/gitlab \
-v /etc/localtime:/etc/localtime \
lizhenliang/gitlab-ce-zh:latest

访问地址:http://IP:9999

初次会先设置管理员密码 ,然后登陆,默认管理员用户名root,密码就是刚设置的。

1.2 创建项目,提交测试代码

进入后先创建项目,提交代码,以便后面测试。

项目名称java-demo,可见等级私有,创建

默认使用的是主机名

现在已经创建好仓库,现在往仓库提交代码

示例java demo包

tomcat-java-demo-master

先将自己仓库项目代码拉下来,因为没有内容,所以提示是空的

[root@k8s-node2 ~]# git clone http://192.168.146.131:9999/root/java-demo.git
Cloning into 'java-demo'...
Username for 'http://192.168.146.131:9999': root
Password for 'http://root@192.168.146.131:9999':
warning: You appear to have cloned an empty repository.

进入到java-demo目录,将代码拷贝到当前目录,提交到自己的gitlab仓库里边

[root@k8s-node2 ~]# cd java-demo/
[root@k8s-node2 java-demo]# cp ../tomcat-java-demo-master/* ./ -rf
[root@k8s-node2 java-demo]# ls
db Dockerfile LICENSE pom.xml README.md src
#先提交到暂存区
[root@k8s-node2 java-demo]# git add .
[root@k8s-node2 java-demo]# git commit -m 'all'
#提交到远程仓库master分支
[root@k8s-node2 java-demo]# git push origin master

刷新gltlab页面

2、部署Harbor镜像仓库

上篇已经安装部署

3、部署Jenkins

3.1 准备JDK和Maven环境

# tar zxvf jdk-8u45-linux-x64.tar.gz
# mv jdk1..0_45 /usr/local/jdk
# tar zxf apache-maven-3.5.-bin.tar.gz
# mv apache-maven-3.5. /usr/local/maven
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/apache-maven-3.5.0:/usr/local/maven \
-v /usr/local/jdk1.8.0_45:/usr/local/jdk \
-v /etc/localtime:/etc/localtime \
--name jenkins jenkins/jenkins:lts

进入到容器中,查看是否已有jdk和maven

[root@k8s-node3 ~]# docker exec -it jenkins bash
root@e06952269e6c:/# ls /usr/local/jdk/
COPYRIGHT LICENSE README.html THIRDPARTYLICENSEREADME-JAVAFX.txt THIRDPARTYLICENSEREADME.txt bin db include javafx-src.zip jre lib man release src.zip
root@e06952269e6c:/# ls -l /usr/local/ma
man/ maven/
root@e06952269e6c:/# ls -l /usr/local/maven/
total
-rw-r--r--. dialout Apr LICENSE
-rw-r--r--. dialout Apr NOTICE
-rw-r--r--. dialout Apr README.txt
drwxr-xr-x. root root Dec : bin
drwxr-xr-x. root root Dec : boot
drwxr-xr-x. dialout Apr conf
drwxr-xr-x. dialout Dec : lib

默认80端口

[root@k8s-node3 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e06952269e6c jenkins/jenkins:lts "/sbin/tini -- /usr/…" seconds ago Up seconds 0.0.0.0:->/tcp, 0.0.0.0:->/tcp jenkins

jenkins的文件再这个目录,只要备份这个数据目录,可以再其它机器上重新运行命令再起一个

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

可以再logs里获取密码 docker logs jenkins

选择插件安装,先不装任何插件

选择无,点击安装

用户admin,密码自己设置一个

开始使用Jenkins

3.2 安装插件

系统管理-->插件管理-->Installed

搜索git/pipeline,点击安装。

如果安装慢,可以更新一下插件源地址

cd /opt/jenkins_home/updates
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

创建jobs,名字test

4、发布测试

4.1 添加参数化构建

This project is parameterized -> String Parameter

Name:Branch # 变量名,下面脚本中调用

Default Value:master # 默认分支

Description:发布的代码分支 # 描述

${BUILD_NUMBER} 这个变量是Jenkins自身记录的版本号,作为镜像的tag,保证其唯一性

4.2 Pipeline脚本

#!/usr/bin/env groovy

def registry = "192.168.146.130" #指定仓库地址
def project = "welcome"
def app_name = "java-demo"
def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"
def git_address = "http://192.168.146.131:9999/root/java-demo.git"
def docker_registry_auth = "bf0b3689-c1c7-4bc4-9189-e5a53246efe1"
def git_auth = "3fca4572-f8c3-4132-9a30-f5b948e41983" 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
java -version
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}
"""
}
}
}

4.3 添加凭据

1、添加拉取git代码凭据,并获取id替换到上面git_auth变量值。

2、添加拉取harbor镜像凭据,并获取id替换到上面docker_registry_auth变量值。

完成后 ,构建测试发布

可以看到每一步的操作跟日志

注:默认是境外官方地址进行拉取操作的,我们可以修改为阿里云的地址

/usr/local/apache-maven-3.5.0/conf这个目录路径下编辑settings.xml

 <mirror>
<id>central</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>

Harbor镜像仓库里边可以看到发布的版本

基于 Docker 构建企业 Jenkins CI平台的更多相关文章

  1. DevOps实践之一:基于Docker构建企业Jenkins CI平台

    基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  2. 基于Docker构建企业Jenkins CI平台

  3. 使用Docker构建企业Jenkins CI平台

    在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...

  4. 视频私有云实战:基于Docker构建点播私有云平台

    私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...

  5. 基于Kubernetes构建企业Jenkins master/slave CI/CD平台

    搭建平台目的: k8s中搭建jenkins master/slave架构,解决单jenkins执行效率低,资源不足等问题(jenkins master 调度任务到 slave上,并发执行任务,提升任务 ...

  6. 基于docker构建flink大数据处理平台

    https://www.cnblogs.com/1ssqq1lxr/p/10417005.html 由于公司业务需求,需要搭建一套实时处理数据平台,基于多方面调研选择了Flink. 初始化Swarm环 ...

  7. 【docker构建】基于docker构建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  8. 基于docker构建jenkins和svn服务(转)

    码农们很定都知道svn的重要性,机器坏掉丢代码的惨痛教训想必很多人都有. jenkins可能很多人都不了解.这是一个持续集成的工具,在敏捷开发领域很流行:跟svn结合可以实现定期build.check ...

  9. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

随机推荐

  1. Ubuntu16.04下LAMP环境的安装与配置

    Ubuntu16.04下LAMP环境的安装与配置 最近做个实验需要用到Ubuntu环境的靶场,所以这里介绍下Ubuntu环境下LAMP的安装与配置,话不多说,我们gkd! 1.Apache2的安装 首 ...

  2. H - 蓬松的头发 HDU - 5504

    给你一个N个整数的序列. 你应该选择一些数字(至少一个),并使它们的乘积尽可能大. 它保证你在初始序列中选择的任何数的乘积的绝对值不会大于263−1. Input 在第一行有一个数字T(表示样例数). ...

  3. A - 无聊的游戏 HDU - 1525(博弈)

    A - 无聊的游戏 HDU - 1525 疫情当下,有两个很无聊的人,小A和小B,准备玩一个游戏,玩法是这样的,从两个自然数开始比赛.第一个玩家小A从两个数字中的较大者减去两个数字中较小者的任何正倍数 ...

  4. findbugs过滤R.java文件

    在第一次使用findbugs时检查出100多个Bad pratice,仔细一看原来全是R文件里面的类名首字母没有大写导致的. 于是只有自己在findbugs设置界面中添加过滤条件来忽略掉R文件. 在F ...

  5. css中(单冒号):after和(双冒号)::after的区别

    :after是伪元素 .::after是伪类 什么是伪类? CSS伪类是添加到选择器的关键字,指定要选择的元素的特殊状态.例如,:hover可被用于在用户将鼠标悬停在按钮上时改变按钮的颜色. ::af ...

  6. PTA | 1019 数字黑洞 (20分)

    给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有" ...

  7. 家庭记账本app实现登录注册界面以及仿微信操作界面(共4个实现一个)遇到了麻烦

    今天学习了数据的创建,以及关于数据库的相关操作. 今天主要是实现了对于数据库的增加和查找. 具体的代码如下: 首先是数据库的创建: DBOpenMessage.java package com.exa ...

  8. 【Selenium02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第二篇博 ...

  9. template_homepage

    homepage用到的方法 使用 {% for ... in ...%}  加 {% endfor %} 实现循环结构 举例:  {% for post in posts %} <p style ...

  10. c++缓冲区 vBufferChar.hpp

    //vbuffer_char.hpp //vov #ifndef V_BUFFER_CHAR_HPP #define V_BUFFER_CHAR_HPP #include <iostream&g ...