飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

记录一次成功CICD完整亲身实践从此踏进入Devops大门

时间:2021-12-19  作者:itxiaoshen  
记录一次成功CICD完整亲身实践从此踏进入Devops大门 当前Devops思想相当火热已经逐步渗透到企业实际运用当中,通过本篇完整学习你一定可以将CICD直接运用到学习或实际工作当中让周围同事、朋友对你另眼相看,构建一个基于容器化的CICD从Git提交源码后自动触发构建、打包、测试、部署到单个应用服务器Docker宿主机容器中运行,核心组件jenkins版本为域名,容器化环境也可换为K8S或docker swarm

Devops概念

DevOps 强调通过一系列手段来实现既快又稳的工作流程,使每个想法(比如一个新的软件功能,一个功能增强请求或者一个 bug 修复)在从开发到生产环境部署的整个流程中,都能不断地为用户带来价值。这种方式需要开发团队和运维团队密切交流、高效协作并且彼此体谅。此外,DevOps 还要能够方便扩展,灵活部署。有了 DevOps,需求最迫切的工作就能通过自助服务和自动化得到解决;通常在标准开发环境编写代码的开发人员也可与 IT 运维人员紧密合作,加速软件的构建、测试和发布,同时保障开发成果的稳定可靠。

下面我们先从几张图大概了解Devops及常用工具集

主体流程

devops01

常用CICD工具集

devops02

核心生态圈

devops03

CICD示例

需求

构建一个基于容器化的CICD,提交源码则后自动触发构建、打包、测试、部署到单个应用服务器docker宿主机容器中运行,目前是单个docker运行环境,后续可改为docker swarm或者K8S集群容器环境

运维架构

image-20210812135300843

部署规划

三台主机或虚拟机 CentOS 7.8以上版本

  • 域名.94(用途:仓库服务器;)
    • GitLab:Git Server 内网私有部署,和GitHub、Gitee都属于Git Server,作为代码仓库
    • Nexus:本地仓库服务器,maven私有仓库,可做内网私服和仓库代理服务器
    • Harbor: docker私有仓库,存放和管理docker镜像
    • docker: 应用安装基于docker环境组件,如GitLab
  • 域名.95 (用途:Jenkins中心服务器)
    • Jenkins:CICD核心组件
    • docker:用于本地编译Dockerfile生成docker镜像文件
    • maven: 用于在本地构建、编译和打包
  • 192.域名 (应用服务器:运行docker镜像)
    • docker: 用于本地运行docker容器

部署步骤

安装docker环境

[docker安装官网地址](https://域名/engine/install/centos/)

详细请参考官网,官网有非常详细安装说明,此外还需要安装docker-compose,docker-compose安装非常简单,直接拷贝到系统的/usr/local/bin并sudo chmod +x /usr/local/bin/docker-compose赋予执行文件权限即可,docker-compose可执行文件存在GitHub中;后续我们再组织专门学习讨论docker和k8s,这里只是需要使用到docker

image-20210812143959111

两台主机都安装完毕后检查下版本,如有如下显示就可以使用docker了

image-20210812144431235

安装Harbor

Harbor官方下载地址 https://域名/goharbor/harbor/releases

选择下载离线包最新版本安装

image-20210812163210713

直接解压进入根目录,官网已经提供docker-compose方式,直接docker-compose up -d运行即可

image-20210812163705110

查看docker容器状态,Harbor暴露提供端口是80,所以直接访问http://域名.94即可

image-20210812163921797

默认账号:admin 密码:Harbor12345

我们新建一个jenkins项目

image-20210812164648993

image-20210812164820161

进入后可以新建账号,我这里新建一个harbor账号,密码为Harbor123,用于后续CICD示例测试

安装Nexus

Nexus官网 https://域名

需要注册账号下载,Nexus主要存储maven 仓库,可以将我们企业内部开发jar公用模块在Nexus中管理,也可以将其作为代理方式统一管理

下载nexus-域名.0-03-域名,直接解压到/usr/local目录下,然后进入到bin目录下直接用 ./nexus start启动即可

image-20210812170900944

image-20210812171300086

默认端口为8081,访问http://域名.94:8081 默认系统用户名:admin,密码:admin123,不过后面的CICD示例暂且还没有使用到Nexus

image-20210812171610366

安装Jenkins

Jenkins官网下载地址 https://域名/download/

我们这里选择generic java package .war包下载,最新版本域名的域名,以war形式安装

下载Tomcat8的安装包,将域名包放在Tomcat的webapps目录,我这里主要为了访问是不加目录,所以解压完后我先关闭Tomcat,删除域名 和重命名ROOT目录为ROOTBAK,最后将解压后的jenkins目录重命名为ROOT,重新./域名 启动Tomcat ,使用默认端口8080

image-20210812172744591

jenkins访问地址:http://域名.95:8080

查看tomcat logs目录下的域名 运行日志,jenkins初始化一个管理员密码用于初始化系统验证,验证完毕后可以进入安装插件页面

image-20210812174701359

image-20210812173823797

image-20210812173957655

如果无法使用或者需要重置密码先找到工作目录,一般都在/root/.jenkins,如果指定过jenkins的目录的话,使用命令行查找JENKINS_HOME环境变量
进入jenkins工作目录,找到域名配置文件

true 修改为: false,重启jenkins,可以不用登陆便可修改jenkins配置,然后再在管理页面修改用户密码

jenkins初始配置

进入首页后通过左侧的系统管理-插件管理,切换到高级设置tab框

将URL升级站点修改为国内地址:https://域名域名/jenkins/updates/update-域名

检查并安装必要插件,包括git、maven、jdk等,这次示例还用到pipe line流水线插件,jenkins强大的地方就是有很多第三方插件简单安装就可直接使用。so easy ;jenkins比较重要使用是参数化构建和pipeline流水线功能,但本篇文章不对jenkins使用做过多的描述,仅是示例入门

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DCYprSJx-1628783084242)(http://域名:3001/assets/域名)]

jenkins依赖其他配置

安装jenkins的服务器,我们也在其本地安装好Jdk和Maven,由于我们需要与Harbor服务器进行交互,还需增加如下的配置,配置insecure-registries为域名.94为Harbor服务器地址,我们这里由于简单演示则采用http协议和IP地址,在所有安装docker且需要和Harbor服务器做通讯都加上下面的配置,包括192.域名和域名.95都要配置

[root@k8s-master-2 bin]# vi /etc/docker/域名
{
 "insecure-registries":["域名.94"]
}

image-20210812180333582

安装GitLab

GitLaba安装官方地址 https://域名/install/

官方提供很多部署方式,这里我们选择docker部署,进入docker安装说明页面

https://域名/ee/install/域名

image-20210812151244120

我们直接采用docker-compose部署方式,建立一个docker-域名文件,内容如下,这里我们先设置好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://域名.94\'
      # Add any other 域名 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\'

image-20210812151705699

配置完后直接在docker-域名所在目录下使用docker-compose up -d后台启动,查看docker 运行容器

image-20210812152754731

访问端口为3380,访问地址为http://域名.94:3380,初次访问后直接输入初始化root用户密码并登录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RI5Ee3ud-1628783084249)(http://域名:3001/assets/域名)]

创建一个空的项git-test

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWtKWT1Q-1628783084251)(http://域名:3001/assets/域名)]

image-20210812161859271

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wMywcGpT-1628783084253)(http://域名:3001/assets/域名)]

我们这里选择Intellij IDEA作为开发工具,在windows安装git客户端(Git-域名.0.2-64-域名,如果直接使用git客户端还需要熟悉几个简单常用的git命令),IDEA Setting中安装GitLab集成插件,在Idea配置git项目地址就可以操作git了

image-20210812150150300

在IDEA的File-Settings-Version Control Git中配置上面已安装windows git客户端可执行文件地址

image-20210812182036257

示例构建

上面我们已经基本环境准备完毕,接下来我们开始构建一个hello world 的SpringBoot Web工程测试

流程简单说明

  1. Jenkins 建立流水线任务,配置web hook触发器、编写流水线脚本
  2. GitLab建立项目和提供访问、操作权限,配置项目的jenkins web hook回调地址
  3. Harbor建立用户、项目和提供访问、操作权限
  4. 在Windows个人电脑开发环境建立Java语言的Maven项目,配置GitLab项目地址,完成代码编写和Dockerfile,通过IDEA提交本地git后push远程GitLab
  5. Gitlab收到提交操作完成后触发jenkin web hook触发jenkins 流水线任务构建;
  6. jenkins所在服务器通过先从GitLab 获取项目源码,拿到源码进行maven编译、测试、构建和打包;
  7. jenkins所在服务器打包完成后再执行docker编译制作成docker镜像并登录和推送镜像到Harbor远程仓库;
  8. jenkins所在服务器登录应用服务器,登录Harbor远程仓库并拉取指定镜像到本地docker并运行容器提供暴露端口服务

准备源码

IDEA 新建git-test的maven工程项目,设置gitlab项目地址,这个git项目地址我们在上一章节已创建好

image-20210812181943187

image-20210812181620311

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://域名/POM/4.0.0" xmlns:xsi="http://域名/2001/XMLSchema-instance"
         xsi:schemaLocation="http://域名/POM/4.0.0 https://域名/xsd/maven-4.域名">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>域名</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>域名in</groupId>
    <artifactId>git-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>git-test</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <域名ion>1.8</域名ion>
        <slf4j-域名ion>1.4.6</slf4j-域名ion>
        <域名ion>域名</域名ion>
    </properties>
    <dependencies>
        <dependency>
            <groupId>域名</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>域名</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>域名</groupId>
            <artifactId>slf4j-spring-boot-starter</artifactId>
            <version>${slf4j-域名ion}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>域名</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

启动类

package 域名in;

import 域名.SpringApplication;
import 域名.域名ngBootApplication;


@SpringBootApplication
public class GitTestApplication {

    public static void main(String[] args) {
        域名(域名s, args);
    }
}

controller测试类

package 域名roller;


import 域名.域名estMapping;
import 域名.域名Controller;
import 域名.域名;
import 域名.域名ltLog;
import 域名Map;
import 域名;

@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);
        域名("code", 200);
        域名("msg", "success");
        return result;
    }
}

编写DockerFile文件

FROM java:8
MAINTAINER itxiaoshen
COPY target/*.jar /域名
ENTRYPOINT ["java","-jar","/域名"]

GitLab更新测试

修改result对象中msg值,先执行commit提交到本地git操作 然后再执行push操作提交到远程GitLab项目仓库

image-20210812182743352

查看GitLab项目上内容确认已提交

image-20210812183015767

Jenkins 流水线任务配置

新建一个流水线的任务,输入名称、选择流水线、点击确定按钮,我们这里暂时只演示流水线,暂时不使用参数化构建功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C9s2DucC-1628783084262)(http://域名:3001/assets/域名)]

点击进入刚刚创建的git-test任务的管理页面,左边菜单栏有流水线语法帮助,比如git check out操作可以输入自动生成,逐渐熟悉一些常用语法,点击配置功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f47QDuCu-1628783084263)(http://域名:3001/assets/域名)]

配置触发器为web hook(构建时机可以有很多种比如像定时触发),这里有一个说明提示http://JENKINS_URL/generic-webhook-trigger/invoke ,将JENKINS_URL替换为我们jenkins服务器web地址,我们这里也即是 http://域名.95:8080/generic-webhook-trigger/invoke

image-20210812184427958

在GitLab的git-test项目管理页面Settings-Webhooks中将上面url地址加上配置Token参数 http://域名.95:8080/generic-webhook-trigger/invoke?token=gittest123456 添加进去,至此GitLab的git-test如果发生提交操作就会调用jenkins webhook钩子接口实现自动触发构建机制

image-20210812185526332

接下来到了最关键的环节,CICD核心也即是编写流水线脚本,编写完脚本放置到高级项目选项的流水线中

image-20210812190041759

下面是一段简单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://域名.94:3380/root/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 -域名=true
        \'\'\'		
		}
   }
   
   // 项目打包到镜像并推送到镜像仓库
   stage(\'Build and Push Image\') {
		steps {
		sh \'\'\'
		cd git-test
		REPOSITORY=域名.94/jenkins/git-test-demo
		docker build -t $REPOSITORY .
		docker login 域名.94 -u harbor -p Harbor123
		docker push $REPOSITORY
		\'\'\'		
		}
   } 
    // 部署到Docker主机
  stage (\'Docker run\') {
     agent none
     steps {
       script {
              def remote = [:]
              域名 = \'application-server\'
              域名 =\'192.域名\'
              域名 = \'******\'
              域名word =\'*********\'
              域名wAnyHosts= true
              sshCommand remote: remote, command:
              \'\'\'
				REPOSITORY=域名.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
              \'\'\'
          }
         }
	  }
	}	
}

先手工点击立即构建进行手工构建测试,构建分阶段执行运行完毕后如下

image-20210812192608180

访问Spring Boot的HelloWorld应用服务器部署地址:http://192.域名:18080/hello,成功显示页面

image-20210812192802021

接下来我们直接修改源码将result对象中msg值修改为后缀222222,push提交GitLab执行自动触发构建测试

image-20210812193025079

从jenkins构建历史数据看已出现一个新的成功构建记录#4

image-20210812193055337

重新访问测试页面显示为修改的数据

image-20210812193141613

查看应用服务器上docker容器也有我们git-test-demo

image-20210812193511561

**本人博客网站 **IT小神 域名

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。