实习修炼第十八天

整体进程

项目部署到dev环境
jenkins简单了解
StringJoiner

项目部署到dev环境

1. 先在git上进行分支合并,将自己开发的分支合并到dev分支上;
2. 然后到相应环境利用jenkins进行项目构建;
jenkins主界面如下
在这里插入图片描述
点击如下选项进行构建
在这里插入图片描述
3. 然后刷新运行项目(结合Rancher,下篇文章介绍)
在Postman工具进行接口测试
在这里插入图片描述

jenkins简单了解

官方文档
1 jenkins作用
jenkins用于自动化各种任务,包括构建、测试和部署软件。其实Jenkins只是一个平台,真正运作的在此平台上的插件。
目的
一句话说就是就是让产品在快速迭代的同时保持高质量;
2 主要特性

  1. 持续集成(Continuous integration简称CI):频繁地将代码集成到主干,将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。
  2. 持续交付(Continuous delivery):指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
  3. 持续部署(continuous deployment):是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境
    上述三个特性层层递进,持续交付就是对持续集成的拓展,是将集成后的代码部署到更贴近真实运行环境的「类生产环境」,在持续交付后代码通过评审,自动部署到生产环境,就是持续部署。

jenkins的工作原理如下所示:
在这里插入图片描述
如果在项目开发中利用gitlab作为git server则产品上线流程为

  1. 开发者将新完成版本push到相应的git server (Gitlab),如上述的dev环境;

  2. Gitlab随后触发jenkins master结点进行一次build。(通过web hook或者定时检测);

  3. jenkins master结点将这个build任务分配给若干个注册的slave结点中的一个,这个slave结点根据一个事先设置好的脚本进行build。这个脚本将原本需要手动完成的比如编译、测试、生成测试报告等事情交给jenkins来做;

  4. 在build进行编译
    摘自 此文章
    jenkins的部署方式:

  5. jenkins触发式构建:用于开发环境部署,开发人员push代码或者合并代码到gitlab项目的master分支,jenkins就部署代码到对应服务器,一般比较常用;

  6. jenkins参数化构建:用于测试环境预上线环境部署,开发push代码或者合并代码到gitlab项目的master分支之后,并不会部署代码,而是需要登录到jenkins的web界面,点击构建按钮,传入对应的参数(比如参数需要构建的tag,需要部署的分支)然后才会部署;比如在前面dev环境下就是这一构建的;

  7. jenkins定时构建:用于APP自动打包,定时构建是在参数化构建的基础上添加的,开发人员可以登录jenkins手动传入tag进行打包,如果不手动打包,那么jenkins就每天凌晨从gitlab拉取最新的APP代码打包。

StringJoiner

源码如下,其实就是封装了一个StringBuilder和String;是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾

package java.util;

public final class StringJoiner {
    private final String prefix;//前缀
    private final String delimiter;//间隔符
    private final String suffix;//后缀
    private StringBuilder value;//值

    private String emptyValue;//空值

    public StringJoiner(CharSequence delimiter) {
        this(delimiter, "", "");//默认前缀和后缀为"",重载调用
    }

    public StringJoiner(CharSequence delimiter,
                        CharSequence prefix,
                        CharSequence suffix) {
        //间隔符,前缀和后缀判断是否为null,null将抛出异常
        Objects.requireNonNull(prefix, "The prefix must not be null");
        Objects.requireNonNull(delimiter, "The delimiter must not be null");
        Objects.requireNonNull(suffix, "The suffix must not be null"); 
        // 成员变量赋值
        this.prefix = prefix.toString();
        this.delimiter = delimiter.toString();
        this.suffix = suffix.toString();
        this.emptyValue = this.prefix + this.suffix;//空值被设置为只有前后缀
    }
	//设置空值,检查是否为null
    public StringJoiner setEmptyValue(CharSequence emptyValue) {
        this.emptyValue = Objects.requireNonNull(emptyValue,
            "The empty value must not be null").toString();
        return this;
    }

    @Override
    public String toString() {
        if (value == null) {
            return emptyValue;//没有值将返回空值或者后续设置的空值
        } else {
            if (suffix.equals("")) {
                return value.toString();//后缀为""直接返回字符串,不用添加
            } else {
	            //后缀不为"",添加后缀,然后直接返回字符串,修改长度
                int initialLength = value.length();
                String result = value.append(suffix).toString();
                // reset value to pre-append initialLength
                value.setLength(initialLength);
                return result;
            }
        }
    }
    初始化,先添加前缀,有了之后每次先添加间隔符,StringBuilder后续append字符串
    public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
	//合并StringJoiner,注意后面StringJoiner 的前缀就不要了,后面的appen进来
    public StringJoiner merge(StringJoiner other) {
        Objects.requireNonNull(other);
        if (other.value != null) {
            final int length = other.value.length();
            // lock the length so that we can seize the data to be appended
            // before initiate copying to avoid interference, especially when
            // merge 'this'
            StringBuilder builder = prepareBuilder();
            builder.append(other.value, other.prefix.length(), length);
        }
        return this;
    }
	//初始化,先添加前缀,有了之后每次先添加间隔符
    private StringBuilder prepareBuilder() {
        if (value != null) {
            value.append(delimiter);
        } else {
            value = new StringBuilder().append(prefix);
        }
        return value;
    }

    public int length() {
        // Remember that we never actually append the suffix unless we return
        // the full (present) value or some sub-string or length of it, so that
        // we can add on more if we need to.
        //不忘添加后缀的长度
        return (value != null ? value.length() + suffix.length() :
                emptyValue.length());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值