记录一次成功CICD完整亲身实践从此踏进入Devops大门
Devops概念
DevOps 强调通过一系列手段来实现既快又稳的工作流程,使每个想法(比如一个新的软件功能,一个功能增强请求或者一个 bug 修复)在从开发到生产环境部署的整个流程中,都能不断地为用户带来价值。这种方式需要开发团队和运维团队密切交流、高效协作并且彼此体谅。此外,DevOps 还要能够方便扩展,灵活部署。有了 DevOps,需求最迫切的工作就能通过自助服务和自动化得到解决;通常在标准开发环境编写代码的开发人员也可与 IT 运维人员紧密合作,加速软件的构建、测试和发布,同时保障开发成果的稳定可靠。
下面我们先从几张图大概了解Devops及常用工具集
主体流程
常用CICD工具集
核心生态圈
CICD示例
需求
构建一个基于容器化的CICD,提交源码则后自动触发构建、打包、测试、部署到单个应用服务器docker宿主机容器中运行,目前是单个docker运行环境,后续可改为docker swarm或者K8S集群容器环境
运维架构
部署规划
三台主机或虚拟机 CentOS 7.8以上版本
- 192.168.50.94(用途:仓库服务器;)
- GitLab:Git Server 内网私有部署,和GitHub、Gitee都属于Git Server,作为代码仓库
- Nexus:本地仓库服务器,maven私有仓库,可做内网私服和仓库代理服务器
- Harbor: docker私有仓库,存放和管理docker镜像
- docker: 应用安装基于docker环境组件,如GitLab
- 192.168.50.95 (用途:Jenkins中心服务器)
- Jenkins:CICD核心组件
- docker:用于本地编译Dockerfile生成docker镜像文件
- maven: 用于在本地构建、编译和打包
- 192.168.3.117 (应用服务器:运行docker镜像)
- docker: 用于本地运行docker容器
部署步骤
安装docker环境
[docker安装官网地址](https://docs.docker.com/engine/install/centos/)
详细请参考官网,官网有非常详细安装说明,此外还需要安装docker-compose,docker-compose安装非常简单,直接拷贝到系统的/usr/local/bin并sudo chmod +x /usr/local/bin/docker-compose赋予执行文件权限即可,docker-compose可执行文件存在GitHub中;后续我们再组织专门学习讨论docker和k8s,这里只是需要使用到docker
两台主机都安装完毕后检查下版本,如有如下显示就可以使用docker了
安装Harbor
选择下载离线包最新版本安装
直接解压进入根目录,官网已经提供docker-compose方式,直接docker-compose up -d运行即可
查看docker容器状态,Harbor暴露提供端口是80,所以直接访问http://192.168.50.94即可
默认账号:admin 密码:Harbor12345
我们新建一个jenkins项目
进入后可以新建账号,我这里新建一个harbor账号,密码为Harbor123,用于后续CICD示例测试
安装Nexus
Nexus官网 https://www.sonatype.com
需要注册账号下载,Nexus主要存储maven 仓库,可以将我们企业内部开发jar公用模块在Nexus中管理,也可以将其作为代理方式统一管理
下载nexus-3.32.0-03-unix.tar.gz,直接解压到/usr/local目录下,然后进入到bin目录下直接用 ./nexus start启动即可
默认端口为8081,访问http://192.168.50.94:8081 默认系统用户名:admin,密码:admin123,不过后面的CICD示例暂且还没有使用到Nexus
安装Jenkins
Jenkins官网下载地址 https://www.jenkins.io/download/
我们这里选择generic java package .war包下载,最新版本2.306的jenkins.war,以war形式安装
下载Tomcat8的安装包,将jenkins.war包放在Tomcat的webapps目录,我这里主要为了访问是不加目录,所以解压完后我先关闭Tomcat,删除jenkins.war 和重命名ROOT目录为ROOTBAK,最后将解压后的jenkins目录重命名为ROOT,重新./startup.sh 启动Tomcat ,使用默认端口8080
jenkins访问地址:http://192.168.50.95:8080
查看tomcat logs目录下的catalina.out 运行日志,jenkins初始化一个管理员密码用于初始化系统验证,验证完毕后可以进入安装插件页面
如果无法使用或者需要重置密码先找到工作目录,一般都在/root/.jenkins,如果指定过jenkins的目录的话,使用命令行查找JENKINS_HOME环境变量
进入jenkins工作目录,找到config.xml配置文件
true 修改为: false,重启jenkins,可以不用登陆便可修改jenkins配置,然后再在管理页面修改用户密码
jenkins初始配置
进入首页后通过左侧的系统管理-插件管理,切换到高级设置tab框
将URL升级站点修改为国内地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
检查并安装必要插件,包括git、maven、jdk等,这次示例还用到pipe line流水线插件,jenkins强大的地方就是有很多第三方插件简单安装就可直接使用。so easy ;jenkins比较重要使用是参数化构建和pipeline流水线功能,但本篇文章不对jenkins使用做过多的描述,仅是示例入门
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DCYprSJx-1628783084242)(http://www.itxiaoshen.com:3001/assets/1628765111753GkteHEtc.png)]
jenkins依赖其他配置
安装jenkins的服务器,我们也在其本地安装好Jdk和Maven,由于我们需要与Harbor服务器进行交互,还需增加如下的配置,配置insecure-registries为192.168.50.94为Harbor服务器地址,我们这里由于简单演示则采用http协议和IP地址,在所有安装docker且需要和Harbor服务器做通讯都加上下面的配置,包括192.168.3.117和192.168.50.95都要配置
[root@k8s-master-2 bin]# vi /etc/docker/daemon.json
{
"insecure-registries":["192.168.50.94"]
}
安装GitLab
GitLaba安装官方地址 https://about.gitlab.com/install/
官方提供很多部署方式,这里我们选择docker部署,进入docker安装说明页面
https://docs.gitlab.com/ee/install/docker.html
我们直接采用docker-compose部署方式,建立一个docker-compose.yml文件,内容如下,这里我们先设置好GITLAB_HOME环境变量路径,
export GITLAB_HOME=/home/docker_resource/gitlabdata
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'k8s-master-2'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.50.94'
# Add any other gitlab.rb configuration here, each on its own line
ports:
- '3380:80'
- '33443:443'
- '3322:22'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
配置完后直接在docker-compose.yml所在目录下使用docker-compose up -d后台启动,查看docker 运行容器
访问端口为3380,访问地址为http://192.168.50.94:3380,初次访问后直接输入初始化root用户密码并登录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RI5Ee3ud-1628783084249)(http://www.itxiaoshen.com:3001/assets/1628753333325S2tRkTKc.png)]
创建一个空的项git-test
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWtKWT1Q-1628783084251)(http://www.itxiaoshen.com:3001/assets/16287571527517EtnSZb6.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wMywcGpT-1628783084253)(http://www.itxiaoshen.com:3001/assets/1628763846454TcBha64n.png)]
我们这里选择Intellij IDEA作为开发工具,在windows安装git客户端(Git-2.32.0.2-64-bit.exe,如果直接使用git客户端还需要熟悉几个简单常用的git命令),IDEA Setting中安装GitLab集成插件,在Idea配置git项目地址就可以操作git了
在IDEA的File-Settings-Version Control Git中配置上面已安装windows git客户端可执行文件地址
示例构建
上面我们已经基本环境准备完毕,接下来我们开始构建一个hello world 的SpringBoot Web工程测试
流程简单说明
- Jenkins 建立流水线任务,配置web hook触发器、编写流水线脚本
- GitLab建立项目和提供访问、操作权限,配置项目的jenkins web hook回调地址
- Harbor建立用户、项目和提供访问、操作权限
- 在Windows个人电脑开发环境建立Java语言的Maven项目,配置GitLab项目地址,完成代码编写和Dockerfile,通过IDEA提交本地git后push远程GitLab
- Gitlab收到提交操作完成后触发jenkin web hook触发jenkins 流水线任务构建;
- jenkins所在服务器通过先从GitLab 获取项目源码,拿到源码进行maven编译、测试、构建和打包;
- jenkins所在服务器打包完成后再执行docker编译制作成docker镜像并登录和推送镜像到Harbor远程仓库;
- jenkins所在服务器登录应用服务器,登录Harbor远程仓库并拉取指定镜像到本地docker并运行容器提供暴露端口服务
准备源码
IDEA 新建git-test的maven工程项目,设置gitlab项目地址,这个git项目地址我们在上一章节已创建好
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.aotain</groupId>
<artifactId>git-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>git-test</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<slf4j-springboot.version>1.4.6</slf4j-springboot.version>
<lombok.version>1.18.20</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>wiki.xsx</groupId>
<artifactId>slf4j-spring-boot-starter</artifactId>
<version>${slf4j-springboot.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动类
package cn.aotain;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GitTestApplication {
public static void main(String[] args) {
SpringApplication.run(GitTestApplication.class, args);
}
}
controller测试类
package cn.aotain.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import wiki.xsx.core.log.Log;
import wiki.xsx.core.log.ResultLog;
import java.util.HashMap;
import java.util.Map;
@RestController
public class HelloController {
@RequestMapping("/hello")
@Log(value = "gettaskbydev", paramFilter = {"request"})
@ResultLog(value = "ResultLog-test2")
public Map<String, Object> Hello(){
Map<String, Object> result = new HashMap<>(3);
result.put("code", 200);
result.put("msg", "success");
return result;
}
}
编写DockerFile文件
FROM java:8
MAINTAINER itxiaoshen
COPY target/*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
GitLab更新测试
修改result对象中msg值,先执行commit提交到本地git操作 然后再执行push操作提交到远程GitLab项目仓库
查看GitLab项目上内容确认已提交
Jenkins 流水线任务配置
新建一个流水线的任务,输入名称、选择流水线、点击确定按钮,我们这里暂时只演示流水线,暂时不使用参数化构建功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C9s2DucC-1628783084262)(http://www.itxiaoshen.com:3001/assets/1628767700284apa76HRS.png)]
点击进入刚刚创建的git-test任务的管理页面,左边菜单栏有流水线语法帮助,比如git check out操作可以输入自动生成,逐渐熟悉一些常用语法,点击配置功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f47QDuCu-1628783084263)(http://www.itxiaoshen.com:3001/assets/16287657297564CsTWzck.png)]
配置触发器为web hook(构建时机可以有很多种比如像定时触发),这里有一个说明提示http://JENKINS_URL/generic-webhook-trigger/invoke ,将JENKINS_URL替换为我们jenkins服务器web地址,我们这里也即是 http://192.168.50.95:8080/generic-webhook-trigger/invoke
在GitLab的git-test项目管理页面Settings-Webhooks中将上面url地址加上配置Token参数 http://192.168.50.95:8080/generic-webhook-trigger/invoke?token=gittest123456 添加进去,至此GitLab的git-test如果发生提交操作就会调用jenkins webhook钩子接口实现自动触发构建机制
接下来到了最关键的环节,CICD核心也即是编写流水线脚本,编写完脚本放置到高级项目选项的流水线中
下面是一段简单pipeline流水线脚本,核心部署是git源码拉取-编译-打包推送docker镜像到docker仓库-登录应用服务器并从docker仓库获取镜像部署到本地docker环境并运行容器,容器应用暴露外部访问端口18080
pipeline {
agent any
stages {
// 拉取代码 git从git仓库中拉取代码,采用的是免交互方式 checkout如何产生?参考 Docker:pipeline编写基本技巧- jenkins配置通过密钥拉取git源码管理仓库的代码
stage('Git Checkout') {
steps {
checkout([$class: 'GitSCM', branches: [[name: 'master']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.50.94:3380/root/git-test.git']]])
}
}
// 代码编译
stage('Maven Build') {
steps {
sh '''
export JAVA_HOME=/home/commons/jdk8
cd git-test
/home/commons/apache-maven-3.6.3/bin/mvn clean package -Dmaven.test.skip=true
'''
}
}
// 项目打包到镜像并推送到镜像仓库
stage('Build and Push Image') {
steps {
sh '''
cd git-test
REPOSITORY=192.168.50.94/jenkins/git-test-demo
docker build -t $REPOSITORY .
docker login 192.168.50.94 -u harbor -p Harbor123
docker push $REPOSITORY
'''
}
}
// 部署到Docker主机
stage ('Docker run') {
agent none
steps {
script {
def remote = [:]
remote.name = 'application-server'
remote.host ='192.168.3.117'
remote.user = '******'
remote.password ='*********'
remote.allowAnyHosts= true
sshCommand remote: remote, command:
'''
REPOSITORY=192.168.50.94/jenkins/git-test-demo
docker rm -f git-test-demo |true
docker pull $REPOSITORY
docker container run -d --name git-test-demo -p 18080:8080 $REPOSITORY
'''
}
}
}
}
}
先手工点击立即构建进行手工构建测试,构建分阶段执行运行完毕后如下
访问Spring Boot的HelloWorld应用服务器部署地址:http://192.168.3.117:18080/hello,成功显示页面
接下来我们直接修改源码将result对象中msg值修改为后缀222222,push提交GitLab执行自动触发构建测试
从jenkins构建历史数据看已出现一个新的成功构建记录#4
重新访问测试页面显示为修改的数据
查看应用服务器上docker容器也有我们git-test-demo
**本人博客网站 **IT小神 www.itxiaoshen.com
记录一次成功CICD完整亲身实践从此踏进入Devops大门的更多相关文章
- 亲身实践 yui-compressor压缩js和css
最近很懒散,个人感情.家庭原因,没有动力去学东西,老是发誓要搞好前端工程化,老中断,唉!没有魄力! 最近老觉得这前端工程化有什么好的,东西那么多,还得学!直到前几天产品提了个优化,说搜索结果页跳商品详 ...
- 记录一次成功反混淆脱壳及抓包激活app全过程
记录一次成功反混淆脱壳及抓包激活app全过程 前言 近期接到一个需求,要对公司之前开发的一款app进行脱壳.因为该app是两年前开发的,源代码文件已经丢失,只有加壳后的apk文件,近期要查看其中一 ...
- 关于微信的jsdk的若干亲身实践之小结
前言: 业务来源:自主研发的手机app软件有分享文章到微信或者QQ以及微博的功能,而在微信中再次点击分享按钮的时候,情况就出现的不可把控了: 文章显示的缩略图不能正常显示:文章的简介不能显示……而我们 ...
- 记录Linux CentOS 7系统完整部署Docker容器环境教程
笔者之前有在"详细介绍Ubuntu 16.04系统环境安装Docker CE容器的过程"文章中有介绍到利用Ubuntu系统安装Docker容器环境的过程.如果我们有使用CentOS ...
- 详解bootstrap-fileinput文件上传控件的亲身实践
经理让我帮服务器开发人员开发一个上传文件功能界面,我就想着以前使用过bootstrap-fileinput插件进行文件上传,很不错.赶紧就撸起来了. 1.下载压缩包.插件地址https://githu ...
- bootstrap-fileinput文件上传控件的亲身实践
经理让我帮服务器开发人员开发一个上传文件功能界面,我就想着以前使用过bootstrap-fileinput插件进行文件上传,很不错.赶紧就撸起来了. 1.下载压缩包.插件地址https://githu ...
- [亲身实践]linux命令行下配置网路
1.在命令行下输入setup, 2.之后出现下图,选择网络配置 4.配置IP地址,子网掩码,DNS 5.保存之后回到命令行模式下,输入service network restart,至此网络配置完成
- Cenos7下指定ftp用户限制在特定目录下(亲身实践)
好了,废话不多说.上头下来个需求,让我给别人开个ftp账户,只能访问项目的目录,不能访问项目外的目录,就算cd切换目录也不行. 开始: 第一步;安装ftp,我用的是centos7,只需敲入命令 yum ...
- GitOps:Kubernetes多集群环境下的高效CICD实践
为了解决传统应用升级缓慢.架构臃肿.不能快速迭代.故障不能快速定位.问题无法快速解决等问题,云原生这一概念横空出世.云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司 ...
随机推荐
- react之路由
功能:让用户从一个视图(组件)导航到另一个视图(组件) 前端路由是一套映射规则,在React中,是URL路径与组件的对应关系 使用React路由简单来说,就是配置路径和组件 路由的使用 1.安装路由 ...
- [at4631]Jewels
如果要选某颜色,必然会选该颜色最大的两个,那么不妨将这两个宝石权值修改为两者的平均数,显然不影响两者的和,也即不影响答案 接下来,将所有宝石按权值从大到小排序,并在权值相同时按颜色编号从小到大(使颜色 ...
- [spring-core]作用域
本文试图从原理上讲解Spring IoC容器的作用域机制,建议对着源码阅读,事半功倍. 0 引入问题 当我们谈到Spring作用域的时候,自然而然会想到如下作用域(来自spring-core官方文档) ...
- c语言用指针交换两个变量
#include<stdio.h> #include<math.h> int main(){ void swap(int a,int b); void swapPointer( ...
- [R] ignore.case区分大小写参数
字符串操作的函数(如contains),很多都包含ignore.case参数,默认是T,即不分大小写,稍不注意就会掉坑里,最好的习惯是下意识地加入这个参数. 举个例子: 我要选择An的列,就用下面这个 ...
- Linux—export命令查看、修改用户环境变量
Linux export 命令用于设置或显示环境变量. 在 shell 中执行程序时,shell 会提供一组环境变量. export 可新增,修改或删除环境变量,供后续执行的程序使用. export ...
- 【模板】二分图最大权完美匹配(KM算法)/洛谷P6577
题目链接 https://www.luogu.com.cn/problem/P6577 题目大意 给定一个二分图,其左右点的个数各为 \(n\),带权边数为 \(m\),保证存在完美匹配. 求一种完美 ...
- MapReduce01 概述
MapReduce 概述 目录 MapReduce 概述 1.定义 2.优缺点 优点 缺点 3.MapReduce核心思想 4.MapReduce进程 5.官方 WordCount 源码 6.常用数据 ...
- 面向多场景而设计的 Erda Pipeline
作者|林俊(万念) 来源|尔达 Erda 公众号 Erda Pipeline 是端点自研.用 Go 编写的一款企业级流水线服务.截至目前,已经为众多行业头部客户提供交付和稳定的服务. 为什么我们坚持自 ...
- Hive(七)【内置函数】
目录 一.系统内置函数 1.查看系统自带内置函数 2.查看函数的具体用法 二.常用内置函数 1.数学函数 round 2.字符函数 split concat concat_ws lower,upper ...