使用Drone搭建持续集成系统
- 持续集成:自动化的测试、编译打包并且自动部署到开发或者测试环境
- 持续交付:自动化的测试、编译打包生产环境的包,但是不做自动化的生产环境部署,需要手动来做
- 持续部署:和持续交付的区别就是生产环境的部署也是自动化的。
Drone持续集成系统主要有两部分组成:
- Drone服务器:这个是用来管理的一个UI界面
- runner:这个是用来执行构建动作的服务
仓库以国内的Gitee为例子。Drone版本是2。
### 1、创建仓库访问应用
在自己的Gitee后台创建一个可以访问自己仓库的应用,位置在`个人设置-数据管理-第三方应用`。

Gihub和Gitlab也是类似的,创建一个`OAuth`的应用,方便可以通过这个密钥访问我们的仓库。

var trans ut.Translator
//设置验证器中文翻译
func init() {
if trans != nil {
...
go从1.11版本开始,实验性的加入了`WebAssembly`的支持。
## `hellow world`程序
```go
package main
import "fmt"
func main() {
fmt.Println("Hello, WebAssembly!")
}
```
设置go编译`WebAssembly`环境变量值,`GOOS=js`和`GOARCH=wasm`。
设置方法有两种:
- 修改默认变量值,执行命令:`go env -w GOOS=js GOARCH=wasm`
- 编译的时候指定值:`cd`到项目根目录,执行命令:`GOOS=js GOARCH=wasm go build -o main.wasm`
这时将生成一个`main.wasm`文件,`.wasm`后缀的文件可以通过`http`设置合适的`Content-Type`http头来使用。
需要注意的一点是,只能编译`main`包,否则是不能在`WebAssembly`里面使用的。
**在浏览器里面运行`main.wasm`**
...
protocol buffers(简称**protobuf**)是google搞的,是用来序列化数据的一种数据格式,类似于json、xml等这种。
本文其他概念不讲直接讲基本用法了。
首先需要定义数据结构,数据结构定义写在一个扩展名是`.proto`的文本文件里面,这个文件叫做`proto`文件。
protobuf的数据叫`message`,每一个消息都是一系列名值对,我们把他叫做`fields`,当然还有更复杂的结构,这就不在这里讨论了。
例如:
```
syntax = "proto3"; #版本
package tutorial; #包名
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
```
`package`包名是为了避免不同项目的名字冲突。
上面就是我们定义的数据结构,然后用protobuf的编译器`protoc`去生成指定语言的数据访问代码,提供了简便的方法来操作整个结构的二进制数据。
pr...
默认是有个JsonResponseFormatter的,但是呢,我们如果做APP的API的话,json响应的格式和内容,每个人的约定都是有差异的,不可能和yii2默认的相一致。之前通过搜索搜索到的答案是,给Response对象的EVENT_BEFORE_SEN事件注册一个处理函数,在发送结果之前再处理一下。原文链接:https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/rest-error-handling.md主要代码如下:return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response-&g...
把Mobile Detect类库作为一个组件引入到Yii2里面去。首先需要先用Composer安装Mobile Detect:composer require mobiledetect/mobiledetectlib。然后新建一个DeviceDetect类:<?php
namespace common\service;
use Yii;
use yii\base\Object;
use Detection\MobileDetect;
/**
* 移动设备检测功能
* @link http://mobiledetect.net/
* @link https://www.360us.net/
*
* @example
* //注册一个检测移动设备组件
* Yii::$app->set('deviceDetect', [
* 'class' => 'common\service\DeviceDetect',
* ]);
* //使用
* Yii::$app->deviceDetect->isMobile();
*
* Cl...
服务器端:package main
import (
"bufio"
"bytes"
"fmt"
"net"
"os"
"strconv"
"time"
)
var User map[string]*net.TCPConn
func main() {
var tcpAddr *net.TCPAddr
var tcpListen *net.TCPListener
var tcpConn *net.TCPConn
var err error
User = make(map[string]*net.TCPConn)
//监听端口
tcpAddr, err = net.ResolveTCPAddr("tcp4", ":5000")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
//监听
tcpListen, err = net.ListenTCP("tcp4", t...
yii2的程序功能测试yii2集成了Codeception测试框架,所以是官方支持程序的单元测试,功能测试和验收测试。yii2的基本应用模板和高级应用模板都支持这三种测试。测试文件是在tests目录,很明显。这里主要是介绍怎么来用框架提供的这个测试功能。第一步安装Codeception:composer global require "codeception/codeception=2.0.*"
composer global require "codeception/specify=*"
composer global require "codeception/verify=*"第二步是添加全局命令执行命令composer global status,命令的输出应该会有一个目录,类似如下输出:Changed current directory to <directory>把<directory>/vendor/bin添加到系统环境变量path里面,这样做的目的是可以全局执行codecept命令。第三部是安装依赖包在项目根目录,就是有composer.json文...
文章是翻译自Go官方博客的文章:http://blog.golang.org/errors-are-values随便翻译的一下,给自己参考,有需要的同学也可以参考参考,翻译的不好的地方或者难以理解的地方请参考原文。本人英语本身也不怎么样!所有有可能会有理解错误,用词不当,语言组织不当的地方,请见谅!该怎么样去处理错误(errors),是go程序员特别是刚学go的人之间的一个共同讨论点。讨论经常会随着下面这段程序出现的次数越来越多而变成抱怨。if err != nil {
return err
}我们最近扫描了所有我们能够找到的开源项目,发现重复出现这段代码的次数是每页或者每两页只出现了一次,是不是比你想象中的要少很多。然而,如果你还是感觉必须到处写if err != nil,那一定是哪里出了问题,并且会认为问题很明显是出在go自己身上。很不幸,这是错误的,而且这很容易去纠正。假如一个新手go程序员去提问这发生了什么,“怎么会只有一个错误处理?”,其实你应该学习这种模式,并且保持它。在其他编程语言里面,一种可能方式是使用try-catch块或者其他类似原理的方式去处理错误(err...
go有一个官方包来操作json格式的数据,包位于encoding/json。JSON编码func Marshal(v interface{}) ([]byte, error)返回用JSON编码v之后的值。类型转换规则:boolean值会编码成JSON的boolean;float,integer会编码成JSON的number;string值会编码成UTF-8JSON字符串,无效的字节用Unicode替换,"<"和">"编码成"\u003c" and "\u003e","&"编码成"\u0026";array和slice会编码成JSON array,[]byte编码成base64字符串,空的slice编码成null;struct会编码成JSON object。空值是指false,0,空指针或者空interface,任何长度为0的array,slice,map或者string。json对象默认的key字符串是strut的字段名,也可以自己指定名字,方法是在每个字段最后用“json”标签指定名字:比如:type Personal struct {
Name stri...