Giter VIP home page Giter VIP logo

linclin / gopub Goto Github PK

View Code? Open in Web Editor NEW
1.4K 67.0 398.0 15.14 MB

vue.js(element框架)+golang(beego框架)开发的运维发布系统,支持git,jenkins版本发布,go ssh,BT两种文件传输方式选择,支持部署前准备任务和部署后任务钩子函数

License: Apache License 2.0

Go 52.68% Shell 1.11% Smarty 0.56% JavaScript 7.98% Vue 36.15% CSS 1.07% HTML 0.08% Dockerfile 0.36%

gopub's Introduction

该项目已停止开发,不再新增功能,十分欢迎开发同学贡献PR。本项目适合有vue+go开发经验的同学作为二次开发框架,不适合小白用户使用,请慎重选择!

gopub(基于vue.js element框架+golang beego框架开发)是一个基于运维场景设计的企业级运维发布系统。配置简单、功能完善、界面流畅、开箱即用!支持git、jenkins版本管理,支持各种web代码发布,一键完成Golang,nodejs,PHP,Python,JAVA等代码的发布、回滚操作。

我们运维团队前期使用walle web部署系统进行发布操作,在此也感谢walle团队贡献的优秀开源项目.walle的web体验比较好,本次开源的gopub前台完全模仿walle前台,使用vue.js element框架重写.

gopub已持续运行近两年时间,在我们预发布和生产环境完成37000+次稳定部署,支持单项目100+台服务器部署110秒左右,支持2G+CDN静态资源发布传输30秒完成. 统计

代码地址

demo地址(Docker部署,账号admin 密码123456)

公网测试环境:http://140.143.85.18:8192/

使用框架

功能特性

  • Docker&k8s支持:Docker镜像仅60M,kubernetes编排文件一键部署运行
  • 部署简便:go二进制部署,无需安装运行环境.
  • gitlab发布支持:配置每个项目git地址,自动获取分支/tag,commit选择并自动拉取代码
  • jenkins发布支持:支持jenkins可选build history一键发布
  • ssh执行命令/传输文件:使用golang内置ssh库高效执行命令/传输文件
  • BT支持:大文件和大批量机器文件传输使用BT协议支持
  • 多项目部署:支持多项目多任务并行,内置grpool协程池支持并发操作命令和传输文件
  • 分批次发布:项目配置支持配置分批发布IP,自动创建多批次上线单
  • 全web化操作:web配置项目,一键发布,一键快速回滚
  • API支持:提供所有配置和发布操作API,便于对接其他系统 API使用example
  • 部署钩子:支持部署前准备任务,代码检出后处理任务,同步后更新软链前置任务,发布完毕后收尾任务4种钩子函数脚本执行

Docker 快速启动

#使用dockerhub镜像启动,连接外部数据库
sudo docker run --name gopub -e MYSQL_HOST=x.x.x.x -e MYSQL_PORT=3306  -e MYSQL_USER=root -e MYSQL_PASS=123456 -e MYSQL_DB=walle -p 8192:8192  --restart always  -d   lc13579443/gopub:latest 

#使用dockerhub镜像启动,连接Docker数据库
sudo docker run --name gopub-mysql -h gopub-mysql  -p 3306:3306  -v /data/gopub-mysql:/var/lib/mysql -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=123456  --restart always -d mysql:5.7.24 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

sudo docker run --name gopub --link gopub-mysql:gopub-mysql -e MYSQL_HOST=gopub-mysql -e MYSQL_PORT=3306  -e MYSQL_USER=root -e MYSQL_PASS=123456 -e MYSQL_DB=walle -p 8192:8192  --restart always  -d   lc13579443/gopub:latest 

Docker 镜像制作

# 使用multi-stage(多阶段构建)需要docker 17.05+版本支持
sudo docker build --network=host  -t  gopub .
sudo docker run --name gopub -e MYSQL_HOST=x.x.x.x  -e MYSQL_PORT=3306  -e MYSQL_USER=root -e MYSQL_PASS=123456 -e MYSQL_DB=walle -p 8192:8192  --restart always  -d  gopub:latest 

Kubernetes 快速部署

# apiVersion: apps/v1需要kubernetes 1.9.0+版本支持
kubectl apply -f  gopub-kubernetes.yml

源码编译安装

编译环境

  • golang >= 1.8+
  • nodejs >= 4.0.0(编译过程中需要可以连公网下载依赖包)

源码下载

# 克隆项目
git clone https://gitee.com/dev-ops/gopub.git

# 编译前端,npm较慢可使用cnpm

cd vue-gopub
npm install
npm run build

#修改配置 数据库配置文件在 src/conf/app.conf

#编译,control需要给可执行权限,并修改go安装目录 export GOROOT=/usr/local/go
./control build

#执行数据库初始化
./control init

#启动服务 启动成功后 可访问 127.0.0.1:8192 用户名:admin 密码:123456
./control start

#停止服务
./control stop

#重启服务
./control restart

快速使用

下载项目二进制包,无需安装go环境和node环境

#给control和src/gopub给可执行权限

#执行数据库初始化
./control init

#启动服务 启动成功后 可访问 127.0.0.1:8192 用户名:admin 密码:123456
./control start

#停止服务
./control stop

#重启服务
./control restart
#安装系统服务
cp ./gopub.service /usr/lib/systemd/system/gopub.service
systemctl enable gopub.service
systemctl restart gopub.service

配置ssh-key信任

前提条件:gopub运行用户(如root)ssh-key必须加入目标机器的{remote_user}用户ssh-key信任列表

#添加机器信任
su {local_user} && ssh-copy-id -i ~/.ssh/id_rsa.pub remote_user@remote_server

#need remote_user's password
#免密码登录需要远程机器权限满足以下三个条件:
/home/{remote_user} 755
~/.ssh 700
~/.ssh/authorized_keys 644 或 600

Getting started

1. 项目配置

项目配置

  • 项目名称:xxx.example.com (项目命名一定要规范并唯一)

  • 项目环境:现在只用到预发布环境和线上环境。

  • 地址:支持gitlab,jenkins,file三种发布方式.

选用Git在地址栏里面填入git地址,https方式需在地址中加入账号密码,ssh方式需保证gopub所在服务器有代码拉取权限.我们一般在gitlab创建一个public用户,将gopub所在服务器key加入public用户deploy-keys设置,并将public用户授权可拉取所有gitlab项目.

选用jenkins需要录入jenkins对于的job地址和账号密码,

宿主机

  • 代码检出库:/data/www/xxx (名称需要唯一)
  • 排除文件:默认不填写,可填写.git(tar打包忽略.git目录)等其他需要打包忽略文件

目标机器

  • 用户:www (目标机执行操作用户)
  • webroot:/data/htdocs/shell_php7 (目标机代码发布目录,软链目录)
  • 发布版本库:/data/htdocs/backup/shell_php7 (目标机代码备份目录,实体目录,* * * webroot软链到该目录下的对应发布目录)
  • 版本保留数:20 (发布版本库中保留多少个发布历史)
  • 机器列表:一行一个IP (复制粘贴ip的时候注意特殊字符)

高级任务

前面两个任务的执行是在管理机上,后面两个任务的执行是在目标机器上

  • 代码检出前任务:视情况而定(默认为空)
  • 代码检出后任务: 需要composer的项目需要添加:cd {WORKSPACE} && rm -rf composer.lock vendor && composer install --optimize-autoloader --no-dev -vvv --ignore-platform-reqs ,否则为空
  • 同步完目标机后任务:视情况而定(默认为空)
  • 更改版本软链后任务:视情况而定(默认为空)

2. 创建上线单

创建上线单

  • gitlab上线单 git配置
  • jenkins上线单 jenkins配置

3. 部署操作

选择上线单 部署

开发团队

  • 林超
  • 高传泽
  • 金阳
  • 赵连启
  • 张群烽

下个版本计划

  • 待定

gopub's People

Contributors

dependabot[bot] avatar gaoyue1989 avatar linclin avatar liuchenrang avatar pixcai avatar suzupy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gopub's Issues

启动的时候一直报错,如下


ListenAndServe:  listen tcp 0.0.0.0:8192: bind: address already
1525399664652004292 [Error] Listen failed:listen tcp 10.205.142.27:1902: bind: cannot assign requested address
1525399664652020021 [Error] Couldn't listen for peers connection: listen tcp 10.205.142.27:1902: bind: cannot assig
2018/05/04 10:07:44 Starting http server 10.205.142.27:1901

提2条建议

1.可考虑增加jenkins编译,在发布上线时考虑项目是否编译
2.考虑多项目支持批量上线

ssh port指定

您好,请问下ssh 端口非22,在哪可以改? 需要修改源码?

我本地环境安装配置错误

➜ gopub git:(master) ✗ ./control build
github.com/cihub/seelog/archive/archive.go:4:2: cannot find package "archive/tar" in any of:
/usr/local/go/src/archive/tar (from $GOROOT)
/Volumes/Macintosh HD/mygithub/gopub/src/archive/tar (from $GOPATH)
github.com/cihub/seelog/archive/archive.go:5:2: cannot find package "archive/zip" in any of:
/usr/local/go/src/archive/zip (from $GOROOT)
/Volumes/Macintosh HD/mygithub/gopub/src/archive/zip (from $GOPATH)

➜ brew info go
go: stable 1.10.2 (bottled), HEAD
Open source programming language to build simple/reliable/efficient software
https://golang.org
/usr/local/Cellar/go/1.10.2 (8,161 files, 336.8MB) *
Poured from bottle on 2018-05-06 at 19:58:01
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/go.rb
==> Requirements
Required: macOS >= 10.8 ✔
==> Options
--without-cgo
Build without cgo (also disables race detector)
--without-race
Build without race detector
--HEAD
Install HEAD version
==> Caveats
A valid GOPATH is required to use the go get command.
If $GOPATH is not specified, $HOME/go will be used by default:
https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
export PATH=$PATH:/usr/local/opt/go/libexec/bin

➜ ln -s /usr/local/go /usr/local/opt/go/

➜ ls /usr/local/go

Gitlab CI支持

看到支持Jenkins,为什么不支持下Gitlab CI呢?

使用docker安装完之后执行./control start报错

ps: unrecognized option: p
BusyBox v1.27.2 (2017-12-12 10:41:50 GMT) multi-call binary.

Usage: ps [-o COL1,COL2=HEADER]

Show list of processes

	-o COL1,COL2=HEADER	Select columns for display
gopub failed to start.

你在src/agent/server.json文件中带有ip,引起上面那个端口占用的问题

docker版,tar命令无 --preserve-permissions参数

cd /tmp/simu/go-test-20180410-101436 && tar --preserve-permissions -czf /tmp/simu/go-test-20180410-101436.tar.gz .

执行结果:
tar: unrecognized option: preserve-permissions
BusyBox v1.27.2 (2017-12-12 10:41:50 GMT) multi-call binary.

Usage: tar -[cxtZzJjahmvO] [-X FILE] [-T FILE] [-f TARFILE] [-C DIR] [FILE]...

Create, extract, or list files from a tar file

Operation:
c Create
x Extract
t List
f Name of TARFILE ('-' for stdin/out)
C Change to DIR before operation
v Verbose
Z (De)compress using compress
z (De)compress using gzip
J (De)compress using xz
j (De)compress using bzip2
a (De)compress using lzma
O Extract to stdout
h Follow symlinks
m Don't restore mtime
exclude File to exclude
X File with names to exclude
T File with names to include

错误:exit status 1

=============

docker启动数据库是空的 lc13579443/gopub:latest版本

1、拉取了版本:
lc13579443/gopub:latest

sudo docker run --name gopub -e MYSQL_HOST=127.0.0.1 -e MYSQL_PORT=3306 -e MYSQL_USER=root -e MYSQL_PASS=root -e MYSQL_DB=walle -p 8192:8192 --restart always -d lc13579443/gopub:latest

数据库数据没有初始放进去。

2、数据库中表不存在或者用户不存在的时候
点击登录按钮一直显示"正在登录中"

运行一段时间以后无法上线,报mysql错误。

2019/01/18 15:58:48 [I] [base.go:353] [{0 127.0.0.1 cd /root/gopubfakegit/release/fakegit/  && rm -f /root/gopubfakegit/release/fakegit/*.tar.gz && rm -rf /root/gopubfakegit/release/fakegit/20190116-114418    2019-01-18 15:58:48.310589532 +0800 CST m=+594667.324144406 2019-01-18 15:58:48.326845324 +0800 CST m=+594667.340399867 <nil> }] 
[ORM]2019/01/18 15:58:48  -[Queries/default] - [  OK / db.QueryRow /     2.7ms] - [SELECT `id`, `user_id`, `task_id`, `status`, `action`, `command`, `duration`, `memo`, `created_at` FROM `record` WHERE `id` = ? ] - `1268`
[ORM]2019/01/18 15:58:48  -[Queries/default] - [  OK / db.QueryRow /     2.8ms] - [SELECT `id`, `user_id`, `task_id`, `status`, `action`, `command`, `duration`, `memo`, `created_at` FROM `record` WHERE `id` = ? ] - `1268`
[ORM]2019/01/18 15:58:48  -[Queries/default] - [  OK /     db.Exec /     5.9ms] - [UPDATE `record` SET `user_id` = ?, `task_id` = ?, `status` = ?, `action` = ?, `command` = ?, `duration` = ?, `memo` = ?, `created_at` = ? WHERE `id` = ?] - `3`, `67`, `1`, `0`, `cd /root/gopubfakegit/release/fakegit/  && rm -f /root/gopubfakegit/release/fakegit/*.tar.gz && rm -rf /root/gopubfakegit/release/fakegit/20190116-114418`, `0`, `[{"Id":0,"Host":"127.0.0.1","Command":"cd /root/gopubfakegit/release/fakegit/  \u0026\u0026 rm -f /root/gopubfakegit/release/fakegit/*.tar.gz \u0026\u0026 rm -rf /root/gopubfakegit/release/fakegit/20190116-114418","LocalFilePath":"","RemoteFilePath":"","Result":"","StartTime":"2019-01-18T15:58:48.310589532+08:00","EndTime":"2019-01-18T15:58:48.326845324+08:00","Error":null,"ErrorInfo":""}]`, `1547798328`, `1268`
Number of records updated in database: 1
[ORM]2019/01/18 15:58:48  -[Queries/default] - [  OK /     db.Exec /     4.5ms] - [UPDATE `task` SET `enable_rollback`='0' WHERE`id` not in (67) and  project_id = ? and  `enable_rollback`=1 ] - `14`
[ORM]2019/01/18 15:58:48  -[Queries/default] - [  OK / db.QueryRow /     1.4ms] - [SELECT `id`, `user_id`, `name`, `level`, `status`, `version`, `repo_url`, `repo_username`, `repo_password`, `repo_mode`, `repo_type`, `deploy_from`, `excludes`, `release_user`, `release_to`, `release_library`, `hosts`, `pre_deploy`, `post_deploy`, `pre_release`, `post_release`, `last_deploy`, `audit`, `keep_version_num`, `created_at`, `updated_at`, `p2p`, `host_group`, `gzip`, `is_group`, `pms_pro_name` FROM `project` WHERE `id` = ? ] - `14`
[ORM]2019/01/18 15:58:48  -[Queries/default] - [FAIL /     db.Exec /     1.6ms] - [UPDATE `project` SET `user_id` = ?, `name` = ?, `level` = ?, `status` = ?, `version` = ?, `repo_url` = ?, `repo_username` = ?, `repo_password` = ?, `repo_mode` = ?, `repo_type` = ?, `deploy_from` = ?, `excludes` = ?, `release_user` = ?, `release_to` = ?, `release_library` = ?, `hosts` = ?, `pre_deploy` = ?, `post_deploy` = ?, `pre_release` = ?, `post_release` = ?, `last_deploy` = ?, `audit` = ?, `keep_version_num` = ?, `created_at` = ?, `updated_at` = ?, `p2p` = ?, `host_group` = ?, `gzip` = ?, `is_group` = ?, `pms_pro_name` = ? WHERE `id` = ?] - `3`, `g4Test-取消维护状态`, `2`, `1`, `20190118-155846`, `/root/gopubfakegit/fakegit`, ``, ``, `branch`, `git`, `/root/gopubfakegit/clonegit`, ``, `root`, `/root/gopubfakegit/deploy`, `/root/gopubfakegit/release`, `127.0.0.1`, `echo "代码检出前任务:"`, `echo "代码检出后任务::"`, `echo "同步完目标机后任务"`, `echo "更改版本软链接后任务::"
/opt/soft/node/bin/node -v
source ~/.bash_profile
cd /data/wanba_bug/app/gong4-server/tools
/opt/soft/node/bin/node ./sh.process.js type=maintainend
`, `echo "版本发布发布完成后执行本地任务:::"`, `0`, `1`, `<nil>`, `<nil>`, `0`, ``, `1`, `0`, ``, `14` - Error 1210: Incorrect arguments to mysqld_stmt_execute
[ORM]2019/01/18 15:58:48  -[Queries/default] - [  OK /     db.Exec /     5.2ms] - [INSERT INTO `task_err_log` (`task_id`, `err_info`, `create_time`) VALUES (?, ?, ?)] - `67`, `Error 1210: Incorrect arguments to mysqld_stmt_execute`, `2019-01-18 07:58:48.347229896 +0000 +0000`

运行一段时间以后就会出现这个问题。 重启一下就好了。

部署时报错

/data/web/gopub/src/github.com/astaxie/beego/tree.go:144:9: expected operand, found 'range'
/data/web/gopub/src/github.com/astaxie/beego/tree.go:149:4: expected '{', found 'if'
/data/web/gopub/src/github.com/astaxie/beego/tree.go:203:34: expected ')', found 'IDENT' string
/data/web/gopub/src/github.com/astaxie/beego/tree.go:257:10: expected operand, found 'range'
/data/web/gopub/src/github.com/astaxie/beego/tree.go:262:5: expected '{', found 'if'
/data/web/gopub/src/github.com/astaxie/beego/tree.go:286:30: expected ')', found 'IDENT' string
/data/web/gopub/src/github.com/astaxie/beego/tree.go:294:1: expected 1 expression
/data/web/gopub/src/github.com/astaxie/beego/tree.go:294:30: expected ')', found 'IDENT' string
/data/web/gopub/src/github.com/astaxie/beego/tree.go:295:2: expected ']', found 'if'
/data/web/gopub/src/github.com/astaxie/beego/tree.go:295:5: expected ';', found 'IDENT' len
/data/web/gopub/src/github.com/astaxie/beego/tree.go:389:45: expected operand, found ']'
/data/web/gopub/src/golang.org/x/net/webdav/prop.go:110:40: expected '}', found ':'
/data/web/gopub/src/golang.org/x/net/webdav/prop.go:171:2: expected declaration, found 'if'
/data/web/gopub/src/golang.org/x/net/webdav/prop.go:182:2: expected declaration, found 'if'
/data/web/gopub/src/golang.org/x/net/webdav/prop.go:230:2: expected declaration, found 'if'
/data/web/gopub/src/golang.org/x/net/webdav/prop.go:353:3: expected declaration, found 'IDENT' xml
/data/web/gopub/src/golang.org/x/net/webdav/prop.go:395:2: expected declaration, found 'IDENT' n

请问你们使用gopub 发布过golang 程序吗?

你好,请问你们使用gopub 发布过golang 的程序吗?现在我们使用gopub的工程中,遇到的问题是,我们所有的项目都在一个github地址下面,里面包含了多个小的golang 程序,发布的时候,不知道怎么处理?而且你们的程序里面没有golang 程序的编译部分,这个有没有已经写好的推荐脚本了?

一次只能发布18台服务器

我们的项目现在是26台服务器,发布的时候超过18台的话 就会丢失一部分,也没有报错,第19个IP显示少最后一段,其它的直接不显示
QQ截图20190624193503

请问 这个是我版本太高导致的么?node 构建前端 老是不成功

2 info using [email protected]
3 info using [email protected]
4 verbose run-script [ 'prebuild', 'build', 'postbuild' ]
5 info lifecycle [email protected]prebuild: [email protected]
6 info lifecycle [email protected]
build: [email protected]
7 verbose lifecycle [email protected]build: unsafe-perm in lifecycle true
8 verbose lifecycle [email protected]
build: PATH: /usr/local/lib/nodejs/node-v12.14.1-linux-x64/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/opt/gopub/vue-gopub/node_modules/.bin:/usr/local/lib/nodejs/node-v12.14.1-linux-x64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/go/bin:/opt/gopub/bin:/root/bin
9 verbose lifecycle [email protected]build: CWD: /opt/gopub/vue-gopub
10 silly lifecycle [email protected]
build: Args: [ '-c', 'node build/build.js' ]
11 silly lifecycle [email protected]build: Returned: code: 1 signal: null
12 info lifecycle [email protected]
build: Failed to exec build script
13 verbose stack Error: [email protected] build: node build/build.js
13 verbose stack Exit status 1
13 verbose stack at EventEmitter. (/usr/local/lib/nodejs/node-v12.14.1-linux-x64/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:332:16)
13 verbose stack at EventEmitter.emit (events.js:223:5)
13 verbose stack at ChildProcess. (/usr/local/lib/nodejs/node-v12.14.1-linux-x64/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack at ChildProcess.emit (events.js:223:5)
13 verbose stack at maybeClose (internal/child_process.js:1021:16)
13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5)
14 verbose pkgid [email protected]
15 verbose cwd /opt/gopub/vue-gopub
16 verbose Linux 3.10.0-1062.9.1.el7.x86_64
17 verbose argv "/usr/local/lib/nodejs/node-v12.14.1-linux-x64/bin/node" "/usr/local/lib/nodejs/node-v12.14.1-linux-x64/bin/npm" "run" "build"
18 verbose node v12.14.1
19 verbose npm v6.13.4
20 error code ELIFECYCLE
21 error

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.