前言
之前有出现过一个情况,就是 master 分支有改了一些东西,但是发现这些东西有问题,这时候要回滚到 master 的某一个 commit 版本:1
git rest --hard xxxx
这时候就将这个分支回滚到之前的某一个 commit 了。 但是这时候直接1
git push origin
是不行的。 会显示远端的版本比当前版本高,所以只能用 -f 来强制 push 上去。1
git push -u origin master -f
但是发现还是报错:
Quick notes
通过 gitlab 生成并使用 ssh keys 我们就在 gitlab 上用 ssh key 去进行命令行提交代码了。但是有时候会有一些个人项目也在这台PC上,但是这时候传的就不是项目的内部私有代码库gitlab了。而是 github。
那么要怎么在同一台 PC 同时对 gitlab 和 github 进行不同项目的代码 git 操作呢,比如 push 之类的?
通过 使用 docker 来让多个 golang 环境并存并实现多版本打包和编译 我们已经可以在服务器上通过 Docker 来实现多个 golang 版本的并存。 但是我的平时开发环境有一台是 windows7,这台机器有时候也会需要跑 go 程序,所以在这台 windows7 上也会有安装多个 golang 版本的需求。
我的 windows7 本来就有安装 golang 版本了,不过是比较旧的版本,1.7.4:1
2
3admin@admin-PC MINGW64 /f/airdroid_code/go/src
$ go version
go version go1.7.4 windows/amd64
所以我打算也通过 Docker 也安装一个容器来装载一个比较新的 golang 版本,比如 1.10 或者更新。有些比较细的,之前就有在 使用 docker 来让多个 golang 环境并存并实现多版本打包和编译 讲过了,这边就不细讲了,这边只讲差异点。
现在我们使用 CI/CD 是通过 gitlab + Jenkins 的方式, 也就是无论是部署到生产环境还是部署到测试环境,都会通过一台叫做部署Jenkins的构建/部署服务器。
以Golang程序的部署来说,比如我要将一个go程序更新部署到测试环境,那么通过 gitlab 的项目分支构建的 webhook,会触发到 Jenkins 对应的构建任务,这时候 Jenkins 就会去 pull gitlab 对应的项目代码,然后开始打包编译成二进制文件,最后在上传到对应的测试服,然后执行测试服的脚本,比如 supervisor 脚本,然后将这个二进制程序启动起来。
但是现在我们 Jenkins 打包服务器上面的 golang 环境还是比较旧的版本,而且是直接装在服务器上的,只有一个版本,现在为了提高 golang 程序的执行效率和使用更新的语法,我后面打算慢慢将 golang 的版本升级上来,但是因为我们的 go 服务实在太多,而且有复杂的,也有简单的。 所以刚开始不可能一下子就把所有的go版本全部升上来,这样风险太大,所以肯定会有一部分的 go 程序还是用的旧版本,但是一部分 go 程序已经要换成新版本了。
所以这个也就要求 Jenkins 打包服务器上,要并存多个 golang 版本的环境,并且 src 还不能共用,并且还要支持同一时间的多个不同的 golang 版本的程序一起构建。
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。
想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的。Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
之前在用docker安装golang 版本的时候,有出现过一种情况,就是宿主机有设置代理,但在docker的容器内(container)下载golang依赖资源的时候,却不能使用宿主机的代理设置,所以下载依赖就会失败。
举个例子,我run了一个 docker 的容器,基于 go10.1 这个go版本。1
[root@VM_156_200_centos docker-go1.10]# sudo docker run -it --name golang-1.10-1 kbz/golang-1.10
然后我把宿主机的 go 程序的代码放到这个容器里面的 GOPATH 路径的 src 目录,最后跑起来,但是因为没有安装依赖,所以会报错:1
2
3
4
5
6
7
8
9
10
11
12[root@VM_156_200_centos docker-go1.10]# docker cp /root/go/src/goworker golang-1.10-1:/go/src/
[root@VM_156_200_centos docker-go1.10]# docker exec -it golang-1.10-1 /bin/bash
root@4943d5f1558c:/app# cd /go/src
root@4943d5f1558c:/go/src# ls
go_learn_demo goworker
root@4943d5f1558c:/go/src# cd goworker/
root@4943d5f1558c:/go/src/goworker# ls
hello_worker.go worker worker.go
root@4943d5f1558c:/go/src/goworker# go run *.go
hello_worker.go:5:2: cannot find package "github.com/benmanns/goworker" in any of:
/usr/local/go/src/github.com/benmanns/goworker (from $GOROOT)
/go/src/github.com/benmanns/goworker (from $GOPATH)
之前在 docker 容器内使用宿主机的代理配置 需要将 docker 升级到最新版本,所以这边弄一下,我是 CentOS 7 系统
首先找出主机上所有 docker 的包,然后卸掉:1
2
3
4[root@VM_156_200_centos ~]# rpm -qa | grep docker
docker-common-1.13.1-91.git07f3374.el7.centos.x86_64
docker-1.13.1-91.git07f3374.el7.centos.x86_64
docker-client-1.13.1-91.git07f3374.el7.centos.x86_64
然后分别卸掉,用 remove 指令:1
2
3[root@VM_156_200_centos ~]# yum remove docker-common-1.13.1-91.git07f3374.el7.centos.x86_64
[root@VM_156_200_centos ~]# yum remove docker-1.13.1-91.git07f3374.el7.centos.x86_64
[root@VM_156_200_centos ~]# yum remove docker-client-1.13.1-91.git07f3374.el7.centos.x86_64
之前在使用 gvm 在安装 go 版本的时候(安装 gvm 来管理多个go版本),就有出现因为没法翻墙而导致没办法下载资源的问题。因此 CentOS7 要设置一下代理才行, 因为之前有在腾讯云香港那边搭了一台中转服务器作为国内服务器翻墙的代理服务器。 所以这边直接用 shadowsocks 配置,然后将代理指向那台中转服务器即可。
当业务成长到一定规模之后,会有许多想看各种不同类型报表的需求,如果单独做在后台,那么无疑会浪费前端和后端开发的时间。所以一直都有在寻找一款好用的BI工具。
后面查了一下,市面上好用的一些非商业的BI工具,主要的是 Superset,Redash, Metabase 这三种。
评测请看:
数据可视化的开源方案: Superset vs Redash vs Metabase (一)
数据可视化的开源方案: Superset vs Redash vs Metabase (二)
通过 webrtc 的 turn 服务器 coturn 的搭建 我们知道自己搭的turn server 可以用于 webrtc 的 turn server转发了,但是后面发现在进行转发的过程中,输出的log,竟然没有带日期格式,也就是说,当我们在看log找问题的时候,根本找不到对应的时间点? 这样可不利于bug排除?
我们在进行前端开发的时候,有时候在本地开发的时候,会进行域名host,以便进行绕过服务端的一些CORS校验,这时候我们只需要在hosts文件进行域名host指定即可。
比如本地开发的html路径是:1
http://127.0.0.1/airdroid_user/intl_web.htm
然后这个页面涉及到登录,然后服务端要求ajax post 的时候,会进行 cors 校验,要求origin一定要 airdroid.com 开头的,这样子开发的时候,就会遇到问题。因此我们需要在hosts进行指向,将 127.0.0.1 改成是 airdroid.com 结尾的,比如:1
127.0.0.1 zach.airdroid.com
这样就会将本地的 127.0.0.1 指向你设置的那个域名。 就可以登录成功了。
之前在测试环境,已经有进行集群部署了: webrtc 的 signal 服务器 VerneMQ 的集群设置。但是这种部署方式不够灵活,尤其是像后面生产环境要在全球多个点部署好几台,其实很不方便。再加上如果有版本迭代的话,就更不方便了。所以后面考量了一下,决定还是用docker来进行集群部署。
虽然 VerneMQ 有使用docker搭建的教程: 传送门, 但是在使用中,使用 VerneMQ 原生镜像,修改测试文件无效,只能在 run 命令中指定参数,这个就非常长了,所以就使用自定义 Dockerfile ,自己创建镜像。
而且这个 docker 部署集群,会分别在中国区,新加坡,美区,欧洲 四个区域部署。
通过 webrtc 的 turn 服务器 coturn 的搭建 我们知道自己搭的turn server 可以用于 webrtc 的 turn server转发了,所以接下来就要开始弄 coturn 的校验机制了。
具体的配置项:传送门
校验方式主要是有两种:
我们采用的是通过开启静态key的方式,和配合 ttl 有效期的方式来做连接校验。