zoukankan      html  css  js  c++  java
  • 从0到1体验Jenkins+Docker+Git+Registry实现CI自动化发布

    一、前言

    Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
    Jenkins是一个广泛用于持续构建的可视化Web工具,持续构建就是将项目自动化编译、打包、部署。通过规范化来完成,简单,繁琐,浪费时间的重复工作。

     Jenkins名言:构建伟大,无所不能! 
    Jenkins用户手册传送门:https://jenkins.io/zh/doc/

    二、发布流程

     工作详细流程:

    三、环境准备

    服务器角色 IP地址 主机名 运行服务 系统版本
     Jenkins/Docker  192.168.115.21  jenkins 安装Docker、Tomcat运行Jenkins、Git客户端、JDK、Maven CentOS 7.4 
     Git/Registry  192.168.115.22  git  安装Docker、Git服务、Registry私有仓库容器  CentOS 7.4
     Docker  192.168.115.23  docker  安装Docker、拉取Tomcat镜像运行Java项目  CentOS 7.4

    本文有点长,理论较少、属于实践型的,请大概看一下文章的整体,准备用三台虚拟机来跟着一起实践,否则可能会坚持不下去哦,就算坚持看完了也收获不大,主要在于实践。

    四、部署思路梳理

    五、三台机器上操作

    i. 配置好yum源安装必要的一些系统工具

    [root@jenkins ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

     ii. 添加软件源信息

    [root@jenkins ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    iii. 更新并安装 Docker-CE

    [root@jenkins ~]# yum makecache fast
    [root@jenkins ~]# yum -y install docker-ce

    iv. 开启Docker服务

    [root@jenkins ~]# systemctl start docker
    [root@jenkins ~]# systemctl enable docker

    v. 检查docker版本

    注:以上步骤三台服务器都需要同样的操作。

    六、Git机器上操作

    6.1、部署Git仓库,Git机器上操作

    i. 安装Git

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

    ii. 创建Git用户和设置密码

    [root@git ~]# useradd git
    [root@git ~]# passwd git
    Changing password for user git.
    New password: *******
    BAD PASSWORD: The password is shorter than 8 characters
    Retype new password: *******
    passwd: all authentication tokens updated successfully.

    iii. 创建仓库

    [root@git ~]# su - git
    [git@git ~]$ mkdir test-jenkins.git
    [git@git ~]$ cd test-jenkins.git/
    [git@git test-jenkins.git]$ git --bare init
    Initialized empty Git repository in /home/git/test-jenkins.git/

    6.2、访问Git仓库测试,Jenkins机器上操作

    i. 安装Git客户端

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

    ii. 生成公钥,拷贝到Git服务器

    [root@jenkins ~]# ssh-keygen -t rsa   // 三个回车
    [root@jenkins ~]# ssh-copy-id git@192.168.115.22   // 注意是git用户

    iii. 拉取Git项目测试

    [root@jenkins ~]# git clone git@192.168.115.22:/home/git/test-jenkins.git
    Cloning into 'test-jenkins'...
    warning: You appear to have cloned an empty repository.

    6.3、部署Docker私有仓库,Git机器上操作

    i. 创建Registry容器

    [root@git ~]# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name rregistry registry

    ii. 检查Registry容器状态,已经成功启动了

    七、Docker机器上操作

    i. 配置私有仓库

    [root@docker ~]# cat  /etc/docker/daemon.json 
    {"registry-mirrors": ["http://abcd1234.m.daocloud.io"],
     "insecure-registries": [ "192.168.115.22:5000"]}

    注:第2行是192.168.115.22 Docker私有仓库地址。

    ii. 重启Docker服务

    [root@docker ~]# systemctl restart docker

    iii. 配置JDK
    JDK1.8下载:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    [root@docker ~]# tar zxvf jdk-8u221-linux-x64.tar.gz
    [root@docker ~]# mv jdk1.8.0_221/ /usr/local/jdk

    iv. 构建Tomcat基础镜像

    [root@docker ~]# cat Dockerfile
    # 基础镜像
    FROM centos:7
    # 维护者信息
    MAINTAINER test-Jenkins        
    # Tomcat版本
    ENV VERSION=8.5.45    
    # jdk目录    
    ENV JAVA_HOME /usr/local/jdk    
    # 安装wget命令
    RUN yum install wget -y        
    
    # 下载Tomcat
    RUN wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz &&      
    # 解压tomcat
    tar zxf apache-tomcat-${VERSION}.tar.gz &&                     
    # 移动解压出来的tomcat文件
    mv apache-tomcat-${VERSION} /usr/local/tomcat-jenkins &&         
    # 删除不需要的文件,减轻容器体积
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat-jenkins/webapps/* &&         
    # 创建ROOT,tomcat默认目录
    mkdir /usr/local/tomcat-jenkins/webapps/ROOT            
    
    # 映射端口
    EXPOSE 8080        
    # 启动tomcat    
    CMD ["/usr/local/tomcat-jenkins/bin/catalina.sh", "run"]

    v. 构建镜像上传Registry仓库

    [root@docker ~]# docker build -t 192.168.115.22:5000/tomcat-jenkins -f Dockerfile .

    vi. 推送到镜像仓库

    [root@docker ~]# docker push 192.168.115.22:5000/tomcat-jenkins

    vii. 验证是否上传Registry镜像仓库

    [root@docker ~]# curl -XGET http://192.168.115.22:5000/v2/_catalog
    {"repositories":["tomcat-jenkins"]}

    八、Jenkins机器上操作

    8.1、配置私有仓库、Git、JDK、Maven

    i. 配置私有仓库

    [root@docker ~]# cat  /etc/docker/daemon.json 
    {"registry-mirrors": ["http://abcd1234.m.daocloud.io"],
     "insecure-registries": [ "192.168.115.22:5000"]}
     
    重启Docker服务:
    [root@docker ~]# systemctl restart docker

    注:第2行是192.168.115.22 Docker私有仓库地址。

    ii. 安装JDK 
    JDK1.8下载:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    [root@jenkins ~]# tar zxvf jdk-8u221-linux-x64.tar.gz
    [root@jenkins ~]# mv jdk1.8.0_221/ /usr/local/jdk

    iii. 配置JDK

    [root@jenkins ~]# vim /etc/profile
    --------------------添加环境变量---------------------
    JAVA_HOME=/usr/local/jdk
    PATH=$PATH:$JAVA_HOME/bin
    CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export JAVA_HOME PATH CLASSPATH

    iv. 更新系统环境变量

    [root@jenkins ~]# source /etc/profile

    v. 验证

    [root@jenkins ~]# java -version

    vi. 安装Maven 
    Maven下载连接:http://maven.apache.org/download.cgi

    [root@jenkins ~]# tar zxvf apache-maven-3.6.1-bin.tar.gz
    [root@jenkins ~]# mv apache-maven-3.6.1 /usr/local/maven

    8.2、安装Jenkins和Tomcat

    Jenkins下载链接:https://jenkins.io/zh/download/ 
    Tomcat下载链接:http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.45/bin/apache-tomcat-8.5.45.tar.gz

    i. 解压和拷贝Jenkins.war到Tomcat目录下

    [root@jenkins ~]# tar zxvf apache-tomcat-8.5.45.tar.gz
    [root@jenkins ~]# mv apache-tomcat-8.5.45  /usr/local/tomcat-jenkins
    [root@jenkins ~]# rm -rf /usr/local/tomcat-jenkins/webapps/*
    [root@jenkins ~]# unzip jenkins.war -d /usr/local/tomcat-jenkins/webapps

    ii. 启动Tomcat

    [root@jenkins ~]# /usr/local/tomcat-jenkins/bin/startup.sh

    8.3、配置Jenkins

    i. 访问Jenkins(http://IP:8080

    ii. 获取密码

    [root@jenkins ~]# cat /var/jenkins_home/secrets/initialAdminPassword
    e3218946860a4e62b5b4808db0a7f2b6

    iii. 选择插件的安装(不熟悉的情况下推荐安装即可,省得麻烦)

    iv. 创建用户

    v. 配置Maven、jdk、git环境

    注:系统管理 —>  全局工具配置,指定JDK、Maven路径,Git保持默认

    vi. Jenkins安装必要插件

    注:系统管理 —> 管理插件(安装SSH与Git Parameter插件)

    插件说明:

    SSH:用于SSH远程Docker主机执行Shell命令;
    Git Parameter:动态获取Git仓库Branch、Tag;

    vii. 配置SSH插件

    viii. 输入Docker主机的用户名/密码

    ix. 添加SSH远程主机

    注:记得点击左下角“保存”按钮。

    九、上传JAVA项目代码到Git仓库

    先下载并安装git:https://git-scm.com/download/

    9.1、使用IDEA创建测试项目

    创建新项目:

    选择Spring Initializr:本地提前配置好JDK环境和Maven环境

    选择war:

    选择Web —> Sping Web Starter:

    随便起个项目名称:

    来个简单的“Hello World”:

    代码如下:

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @SpringBootApplication
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
        @RequestMapping
        public String hello() {
            return "Hello Jenkins v1.0";
        }
    }

    本地运行测试项目:

    本地浏览器访问测试:

    9.2、连接Git仓库上传代码

    i. 在IDEA中设置Git,在File-->Setting->Version Control-->Git-->Path to Git executable选择你的git安装后的git.exe文件,然后点击Test,测试是否设置成功。

    ii. 选择要上传的项目

    iii. 将本项目添加到本地仓库

    注:我们在项目文件名上右键选择 git,通过 add 添加到本地库的跟踪区,再comment 正式提交到本地仓库。

    iv. 添加Git仓库地址

    v. 上传代码

    vi. 在Jenkins机器上下载项目验证是否上传成功

    [root@jenkins ~]# git clone git@192.168.115.22:/home/git/test-jenkins.git
    [root@jenkins ~]# cd test-jenkins/
    [root@jenkins test-jenkins]# ls
    mvnw  mvnw.cmd  pom.xml  src

    9.3、给项目添加Tag

    9.3.1、IDEA测试项目连接Git添加Tag

    i. 进入Version Control-->log

    ii. 在之前版本中,右键,新建标签

    iii. Push标签

    注:由于不是在当前最新版本打入的标签,push 时需要选择 push tags (all),不然不能push。

    iv. 在Git仓库上查看Tag验证一下

    [root@git ~]# su - git
    [git@git ~]$ cd test-jenkins.git/
    [git@git test-jenkins.git]$ git tag
    v1.0

    9.3.2、如果是直接上传项目到Git仓库,加Tag方法

    [root@git ~]# su - git
    [git@git ~]$ cd test-jenkins.git/
    [git@git test-jenkins.git]$ git branch
    [git@git test-jenkins.git]$ git tag v1.0
    [git@git test-jenkins.git]$ git tag
    v1.0

    额外补充删除Tag:

    [git@git test-jenkins.git]$ git tag -d v1.0

    十、Jenkins发布测试

    10.1、配置Jenkins项目

    安装Maven插件,构建一个Maven项目:

    配置项目(新建任务 -> 输入任务名称,构建一个Maven项目)

    配置Git参数化构建:

    动态获取Git仓库Tag,与用户交互选择Tag发布:

    指定项目Git仓库地址:

    注:修改*/master为$Tag,Tag是上面动态获取的变量名,表示根据用户选择打代码版本。

    设置maven构建命令选项(clean package -Dmaven.test.skip=true):

    Jenkins本机镜像构建和推送到私有镜像仓库:

    代码如下:

    # 定义变量
    REPOSITORY=192.168.115.22:5000/tomcat-jenkins:${Tag}
    
    # 开始构建镜像
    cat > Dockerfile << EOF
    # 拉取私有仓库的镜像
    FROM 192.168.115.22:5000/tomcat-jenkins:latest
    # 删除Tomcat下不需要的ROOT项目
    RUN rm -rf /usr/local/tomcat-jenkins/webapps/ROOT
    # 将jenkins编译好的war包拷贝到Tomcat目录下
    COPY target/*.war /usr/local/tomcat-jenkins/webapps/ROOT.war
    # 运行Tomcat
    CMD ["/usr/local/tomcat-jenkins/bin/catalina.sh", "run"]
    EOF
    
    # 清除Jenkins主机旧的构建镜像
    docker image rm 192.168.115.22:5000/tomcat-jenkins:${Tag}
    # 构建自定义镜像
    docker build -t $REPOSITORY .
    # 开始上传镜像
    docker push $REPOSITORY

    SSH远程在Docker主机上执行创建容器命令:

    代码如下:

    # 定义变量
    REPOSITORY=192.168.115.22:5000/tomcat-jenkins:${Tag}
    
    # 删除之前容器和镜像
    docker rm -f tomcat-jenkins |true
    docker image rm $REPOSITORY |true
    
    # 开始部署容器
    docker container run -d --name tomcat-jenkins -v /usr/local/jdk:/usr/local/jdk -p 80:8080 $REPOSITORY

    10.2、开始构建

    点击项目名称 —> 选择版本 —> 开始构建

    查看构建过程以及信息输出:

    查看是否构建成功:

    验证项目是否可以访问:

    十一、后面总结再废话两句

    1. 到此就简单体验了Jenkins+Docker+Git+Registry实现一套CI自动化发布流程,文章有点长,但是坚持下来就有收获。

    2. 本来打算Jenkins放在容器上运行的,发现Jenkins容器里面需要Docker命令,但是比较繁琐,也感觉没必要好像,就直接采用方法一了。

    3. 感兴趣的可以通过以下方式实现:

    - 不使用任何Jenkins镜像,宿主机安装Jenkins [宿主机有Docker服务] - 不使用官方Jenkins镜像,自己构造带有Docker服务的Jenkins镜像 - Docker-in-Docker [DinD] - Docker-outside-of-Docker [DooD] - 使用Jenkins的Docker插件

  • 相关阅读:
    python 的基础 学习 第六天 基础数据类型的操作方法 字典
    python 的基础 学习 第五天 基础数据类型的操作方法
    python 的基础 学习 第四天 基础数据类型
    ASP.NET MVC 入门8、ModelState与数据验证
    ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    ASP.NET MVC 入门6、TempData
    ASP.NET MVC 入门5、View与ViewData
    ASP.NET MVC 入门4、Controller与Action
    ASP.NET MVC 入门3、Routing
    ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  • 原文地址:https://www.cnblogs.com/l-hh/p/11455870.html
Copyright © 2011-2022 走看看