基于docker搭建的gitlab实现CI/CD
在开发过程中,提起CI/CD就会想到使用gitlab来实现。本文使用docker搭建gitlab环境,基于官方文档说明并尝试对常见CI/CD操作做讲解说明。
1.gitlab 所需硬件配置目前,gitlab对内存要求最小是4G。本文使用服务器配置:阿里云ECS,4核8G
配置低的话,容易把系统搞死,gitlab 比较占资源
2.安装docker
卸载老版本docker
12345678yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
安装docker基础包
1yum install -y yum-utils device-mapper-persistent-data lvm2
设置仓库
1yum-config-manager --add-repo https://mirr ...
docker多阶段构建
多阶段的构建对于那些努力优化 Dockerfiles 的开发者来说非常有用,同时也使 Dockerfiles 更易于阅读和维护。
1.多阶段 build 之前的 buildbuild镜像 最具挑战性的事情之一是使镜像变得更小。Dockerfile 中的每条指令都会为镜像添加一层,需要记住的是要清理任何不需要的内容,然后再进入下一层。为了编写一个非常有效的 Dockerfile,传统上需要采用shell技巧和其他逻辑来保持每一层尽可能小,并确保每一层都具有上一层中所需的内容,而没有其他多余内容。
实际上,一个用于生产环境的 Dockerfile(其中包含构建应用程序所需的一切),其中仅包含您的应用程序以及运行它所需的内容,并尽可能的小。这被称为 “builder pattern”。而维持两个 Dockerfiles 也不是理想的选择。
下面举一个使用 Dockerfile.build 与 Dockerfile 进行构建的例子。
Dockerfile.build:
123456# syntax=docker/dockerfile:1FROM golang:1.16WORKDIR /go/s ...
go中slice append扩容的一些细节
1.问题与事件事件:一个朋友面试某家公司问题:对容量为4的int切片追加5个元素,最终切片的容量是多少?
针对该问题,朋友回答:16
该问题考察slice扩容:①在容量小于1024时,在原基础上2倍扩容 ②大于1024时,在原基础上1/4的扩容
面试官回答说:10
让回去自己试一下,看看具体是多少?
事后分析了一下,能确定的是:面试官提出的问题,有4种写法。
2.同一个问题不同写法的不同结果在4种写法执行之前,你觉得最终的容量cap分别会是多少?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546func TestSliceAppend(t *testing.T) { SliceAppend0() SliceAppend1() SliceAppend2() SliceAppend3()}// slice 长度为0,容量为4,批量追加5个元素func SliceAppend0() { m := make([]int, 0, 4 ...
Innodb引擎可重复读的幻读现象
关于幻读众所周知,MySQL不同的隔离级别可能会出现不同的问题。其中,有一问题就是在可重复读隔离级别会出现幻读问题。可能会有人说:不是说MySQL的可重复读隔离级不会出现幻读吗?怎么会出现幻读?
这里有2个问题需要明确:① MySQL官方并未说明可重复读隔离级别不会出现幻读② 什么是幻读
问题① 查看MySQL官方相关资料,官方也会标明可重复读隔离级别可能会出现幻读问题② 要理解幻读是可见与不可见的一种权衡。如果用一句话说明,那就是:幻读是看不到数据,却能感受到它存在的一种现象
产生幻读的本质是不同读的方式:当前读 or 快照读,这两种方式的选择
数据库中数据操作方式,一般分为如下四种:1.SELECT2.INSERT3.UPDATE4.DELETE
在可重复读隔离级别中,SELECT 操作不会对数据造成影响,剩余的三种操作则会对数据造成影响。并且,这几种操作看待数据的方式也不太一样。SELECT 使用快照读,剩余三种操作使用当前读。
活跃事务数组与可见性在事务开启之后,每个事务会持有一个当前活跃事务数组,活跃事务数组中保存着当前存在却还未提交的事务ID。对这些事务ID进行排序 ...
go字符串无拷贝转换切片的一个问题
1.字符串无拷贝转换切片提起 字符串无拷贝转换切片 这个话题,可能很多人会想到下面一段代码:
123func string2Slice(s string) []byte { return *(*[]byte)(unsafe.Pointer(&s))}
这段代码利用了指针进行强转,并且在实现过程中不会出现数据拷贝,简单、强大!
2.同一切片多次获取容量结果不相同来看一个测试用例:
123456789101112131415161718192021222324package testimport ( "fmt" "testing" "unsafe")func string2Slice(s string) []byte { return *(*[]byte)(unsafe.Pointer(&s))}func TestString2Slice(t *testing.T) { for i := 0; i < 3; i++ { s := string2Sl ...
认识智能语音呼叫系统
1. 什么是智能语音系统现实生活中,会遇到下面一些场景:1.对着iPhone说”hey, siri”2.对着智能音响说”天猫精灵”,”小爱同学”,”小度小度”3.对着导航说””要到XXX,请帮我规划路线”4.接到阿里云打来的服务报警电话5.接到银行、通讯服务商、电商平台的推销电话6.机器人在线客服…
对于上面的场景,不知道你遇到过或用过多少。他们有一个共同的特点:人机交互;他们有一个通用的叫法:智能语音系统。说起智能语音系统,很多人可能第一次听说。不理解没关系,在这里跟随我的步伐一起来看看这是个什么东西。
如果对 智能语音系统 这个专业名词进行拆解,大概可以拆分为三个词:智能:使用AI、机器学习来识别交互过程中的意图,从而做出正确的决策
智能的终极目标也是图灵测试的终极目标,让机器更像人或者比人更像人
语音:文本转语音(TTS),语音转文本(STT)这两个相反的过程
文本转语音相当于一个说的过程,相当于嘴巴语音转文本相当于一个听的过程,相当于耳朵人类在日常的交互过程中,说与听一般如下:说的过程是人的大脑中产生一些想法,想法汇总为表意词汇,词汇通过嘴巴念出来,引起空气振动,从而 ...
MySQL主键ID耗尽时会发生什么
说起流行的关系型数据库,MySQL一定会被提及。在使用MySQL的过程中,创建表时需要指定主键id,其类型一般为int或者bigint类型。但是,有这么一个问题,不知道你可曾想过:MySQL主键id耗尽时会发生什么?
为什么会想到这个问题呢?缘起于,笔者在某家公司偶然发现一张表竟然有30多亿条数据(2年多时间)。表字段不多,数据+索引占用磁盘空间就将近1000G。抛开数据同步以及数据恢复时会遇到的问题不说,仅仅是表主键id就是很大的消耗。
MySQL整型类型与取值范围MySQL 支持 SQL 标准的整型类型:INTEGER(或 INT)和 SMALLINT。作为标准的扩展,MySQL 也支持这些整型类型:TINYINT、MEDIUMINT 和 BIGINT。以下表格展示了每种整型类型所需的存储空间和取值范围。
超出取值范围与溢出,MySQL 的处理方式当 MySQL 向数值类型的列存储超出列数据类型允许范围的值时,处理结果取决于当时的 SQL 模式。如果启用 SQL 严格模式,MySQL 则按照 SQL 标准处理——以报错的方式拒绝超出范围的值,即插入失败。如果未启用任何限制模 ...
golang工程师面试总结
笔者作为Golang面试官,曾经面试过不少候选人。在面试的过程中,一般会根据公司需要制定一些面试规则,例如:面试题型、面试分数占比、面试时间等等。在面试过程中也会记录候选人的表现,并在面试结束之后提交面试评语。
鉴于以往的面试经验,整理出本文,希望对那些正在准备面试的人有所帮助。
1. 基础能力1.进程、线程、协程三者的关系与区别
拓展题问题1:go的GMP模型以及三者关系问题2:进程的内存布局大概分为几块?问题3:用户空间与内核空间的区别?问题4:上下文切换时一般需要做什么操作?
2.sync、context包的常用方法以及使用场景
拓展题问题1:进程间通信的实现方式有哪些?问题2:线程间通信的实现方式有哪些?问题3:什么是并行?什么是并发?并行与并发的区别?
3.goroutine 泄露的排查步骤
拓展题问题1:列举一些常见的会导致泄露发生的例子以及解决方法?问题2:go的垃圾回收使用的是哪一种方式?问题3:go的GC中内存屏障是什么?问题4:go中常用的减小GC压力的方法?
4.并发时对临界资源的使用
123456789101112131415func demo() ...
mariaDB 通过物理文件进行数据恢复
起因时间:2022.03.12 10:10事件:网站的 mariadb 数据库 server 突然崩溃,尝试各种办法启动无果过程:不幸的是数据库没有备份,万幸的是可以通过数据库物理文件恢复数据结果:恢复数据,并特此记录一下过程,以备急时之需
数据库与数据文件众所周知,数据库中的数据会以文件的形式落盘进行保存(这些文件是以某种特定格式存储的,不是text格式,试图用文本编辑器打开会看到乱码)。在数据库中,每一个 database 都是一个单独的文件夹,文件夹下存储着每一张表的相关文件(不同的存储引擎生成的表文件可能不同,这里使用 innodb 引擎)。
例如,笔者网站数据库名称叫 ivansli,有一个用户表 - user,脱敏之后的数据文件布局大致如下:
1234567891011121314151617181920212223➜ /usr/local/data tree -L 2 .├── aria_log.00000001├── aria_log_control├── ib_buffer_pool├── ibdata1├── ib_logfi ...
Go 构建约束的使用方式
在go中进行编译时,可能会带一些指示条件(如:不同平台、架构等)让编译器选择满足条件的代码参与编译,将不满足条件的代码舍弃。这就是条件编译,也可称为构建(编译)约束。
目前,支持的构建约束有2种使用方式:1.文件后缀2.编译标签(build tag)
两者区别:
文件后缀方式多用于交叉编译 (跨平台)。
编译标签方式多用于条件编译 (也可用于交叉编译)。
构建约束官方文档
https://pkg.go.dev/cmd/go#hdr-Build_constraints
文件后缀的使用方式编译器根据文件后缀来选择具体文件来参与编译操作,格式如下:
123$filenamePrefix_$GOOS.go$filenamePrefix_$GOARCH.go$filenamePrefix_$GOOS_$GOARCH.go
$filenamePrefix: 源码文件名称前缀(一般为包名称)。$GOOS: 表示操作系统,从环境变量中获取。$GOARCH: 表示系统架构,从环境变量中获取。
例如,Go源码中os包的Linux、windows实现
123456src/runtime/os_lin ...