jenkinsci / dingtalk-plugin Goto Github PK
View Code? Open in Web Editor NEWDingtalk for jenkins
Home Page: https://jenkinsci.github.io/dingtalk-plugin/
License: MIT License
Dingtalk for jenkins
Home Page: https://jenkinsci.github.io/dingtalk-plugin/
License: MIT License
源码地址:http://qiniu.liuweigl.cn/
故障:导致钉钉发送图片信息,获取不到
故障图片地址:https://s1.ax1x.com/2020/03/23/877puj.png
个人解决方法:修改过这个地址后,重新编译插件,上传需要的.gif图片,成功
Jenkins:2.235.1
DingTalk:2.3.1
项目配置:钉钉配置、gitlab 拉取代码,调用 shell 构建;完成。
问题:构建完成后,没有钉钉消息提示。系统配置有正确配置钉钉机器人信息,能收到测试消息。
1.9版本可以这样调用
post { success { dingTalk accessToken:'你的钉钉webhook,完整的webhook即可', imageUrl:'图片地址', jenkinsUrl:'jenkins地址/', message:'成功时,想要发送的消息', notifyPeople:'' } failure { dingTalk accessToken:'你的钉钉webhook,完整的webhook即可', imageUrl:'图片地址', jenkinsUrl:'jenkins地址/', message:'失败时想要发送的消息', notifyPeople:'' } }
但是2.0版本后这样调用就出错了
环境
jenkins 2.230
钉钉插件:2.2.0
问题
pipeline script使用钉钉通知不生效,钉钉没消息。pipeline部分配置如下:
stage ("build") {
container("golang") {
sh """
git config --global url."https://oauth2:[email protected]".insteadOf "https://git.test.com"
export GOPROXY=https://goproxy.io,direct
export GOPRIVATE=git.test.com
export GOPATH=/home/jenkins
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main main.go
"""
}
}
stage('link'){
steps {
echo 'go build失败了,请检查!'
}
post {
failure {
dingtalk (
robot: '6cc574c3-17fa-4e0c-8724-f7de3376e1b6',
type: 'LINK',
text: [
'go build失败了,请检查!'
]
)
}
}
}
网上资料说钉钉通知不支持pipeline script。暂时无解,能指点下是哪里的问题吗,谢谢。
在Manage System--Configure System中可以设置默认视图,升级插件到2.0.0后,默认视图变成下拉选项中的第一个,手动修改选其他视图保存设置后,保存成功后,默认视图仍是下拉选项第一个。例如,下拉选项中有DEV,all两个,默认选中了DEV,改成all保存后又变回DEV。其他设置不变,把插件降回1.9,没有这个问题。
Jenkins版本是Jenkins ver. 2.204.2
自定义通知文案和类型 只需要获取执行人手机号变量
之前版本也不支持,我小改了一下,希望大佬有时间能增加官方支持[感谢]
我发现自由风格的JOB可以将不同构建结果按照不同颜色显示,能不能把多分支pipeline将构建结果按照不同颜色显示
Describe the bug
A clear and concise description of what the bug is.
Screenshots
If applicable, add screenshots to help explain your problem.
pipeline:
post {
always {
echo 'try'
dingTalk(robot: '70e29cb1-bc39-496f-8624-d8c9b4de448f',atAll: false)
}
}
error:
[Pipeline] dingtalk
Error when executing always post condition:
java.lang.NullPointerException
at io.jenkins.plugins.service.impl.DingTalkServiceImpl.send(DingTalkServiceImpl.java:47)
at io.jenkins.plugins.DingTalkPipeline.perform(DingTalkPipeline.java:205)
at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:80)
at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:67)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Jenkins Info(please complete the following information):
Describe the bug
NullPointerException occurred when the maven project started/completed.
Screenshots
Here is the log:
java.lang.NullPointerException
at io.jenkins.plugins.DingTalkRunListener.onStarted(DingTalkRunListener.java:151)
at hudson.model.listeners.RunListener.fireStarted(RunListener.java:238)
at hudson.maven.MavenBuild$ProxyImpl2.start(MavenBuild.java:614)
at sun.reflect.GeneratedMethodAccessor209.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at hudson.model.Executor$2.call(Executor.java:932)
at hudson.util.InterceptingProxy$1.invoke(InterceptingProxy.java:23)
at com.sun.proxy.$Proxy87.start(Unknown Source)
at sun.reflect.GeneratedMethodAccessor209.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.perform(RemoteInvocationHandler.java:931)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.call(RemoteInvocationHandler.java:905)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.call(RemoteInvocationHandler.java:857)
at hudson.remoting.UserRequest.perform(UserRequest.java:211)
at hudson.remoting.UserRequest.perform(UserRequest.java:54)
at hudson.remoting.Request$2.run(Request.java:369)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at org.jenkinsci.remoting.CallableDecorator.call(CallableDecorator.java:18)
at hudson.remoting.CallableDecoratorList$1.call(CallableDecoratorList.java:21)
at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
RunListener failed
java.lang.NullPointerException
at io.jenkins.plugins.DingTalkRunListener.onCompleted(DingTalkRunListener.java:174)
at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:209)
at hudson.model.Run.execute(Run.java:1925)
at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:428)
Jenkins Info(please complete the following information):
DingTalk Plugin Info(please complete the following information):
Additional context
There's no problem when clicking the test action button.
只要触发钉钉就会在日志里发现这个警告,怀疑是Jenkins新版本的信息通知和之前不一样了,以前是在POST这一步选择,现在是选择机器人。
01-Sep-2020 09:27:31.530 警告 [Computer.threadPoolForRemoting [#11] for Channel to Maven [/usr/local/jdk6/bin/java, -cp, /root/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven35-agent-1.13.jar:/usr/local/apache-maven/boot/plexus-classworlds-2.6.0.jar:/usr/local/apache-maven/conf/logging, jenkins.maven3.agent.Maven35Main, /usr/local/apache-maven, /usr/local/tomcat1/webapps/jenkins/WEB-INF/lib/remoting-4.3.jar, /root/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven35-interceptor-1.13.jar, /root/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.13.jar, 23511] id=350] hudson.model.listeners.RunListener.report RunListener failed
java.lang.NullPointerException
at io.jenkins.plugins.DingTalkRunListener.send(DingTalkRunListener.java:99)
at io.jenkins.plugins.DingTalkRunListener.onCompleted(DingTalkRunListener.java:235)
at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:209)
at hudson.maven.MavenBuild$ProxyImpl2.end(MavenBuild.java:636)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at hudson.model.Executor$2.call(Executor.java:932)
at hudson.util.InterceptingProxy$1.invoke(InterceptingProxy.java:23)
at com.sun.proxy.$Proxy125.end(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.perform(RemoteInvocationHandler.java:931)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.call(RemoteInvocationHandler.java:905)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.call(RemoteInvocationHandler.java:857)
at hudson.remoting.UserRequest.perform(UserRequest.java:211)
at hudson.remoting.UserRequest.perform(UserRequest.java:54)
at hudson.remoting.Request$2.run(Request.java:369)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at org.jenkinsci.remoting.CallableDecorator.call(CallableDecorator.java:18)
at hudson.remoting.CallableDecoratorList$1.call(CallableDecoratorList.java:21)
at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
根据文档配置之后,报错如下:
+ echo 你好
你好
ERROR: Build step failed with exception
java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
at io.jenkins.plugins.service.impl.DingTalkServiceImpl.getSender(DingTalkServiceImpl.java:25)
at io.jenkins.plugins.service.impl.DingTalkServiceImpl.send(DingTalkServiceImpl.java:43)
at io.jenkins.plugins.DingTalkPipeline.perform(DingTalkPipeline.java:176)
at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:78)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741)
at hudson.model.Build$BuildExecution.build(Build.java:206)
at hudson.model.Build$BuildExecution.doRun(Build.java:163)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504)
at hudson.model.Run.execute(Run.java:1880)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:428)
Build step 'DingTalk' marked build as failure
Finished: FAILURE
这个是我无法配置的问题吗?版本是2.1.0 Jenkins 版本是官网下载的最新的war包..
配置信息如下:
使用admin 和 其他用户都不触发,在配置页面点击测试,可以成功发送。
您好,当前我理解的@的人是执行这个pipeline的人,我们现在都是根据开发人员提交后触发webhook而触发执行,因此这个插件能否通过git提交信息,让我们可以配置@相关commit提交人员呢
ERROR: 钉钉机器人发生错误:ID 为 a52dd727-9135-40f6-a985-74040d577c9d 的机器人不存在。钉钉机器人ID已经没有了,改为WebHook了,啥时候这边也可以改为WebHook模式呢?
上下文
当我使用jenkins configuration as code插件来配置dingding-notifications插件时,
dingTalkGlobalConfig:
verbose: true
noticeOccasions:
- "SUCCESS"
- "START"
- "NOT_BUILT"
- "ABORTED"
- "FAILURE"
- "UNSTABLE"
robotConfigs:
- id: 123 # 就是它经过Jcasc解析传给dingding-notifications插件时,类型不匹配
name: "钉钉告警通知"
webhook: "**********"
securityPolicyConfigs:
- checked: false
desc: "ip 地址/段"
type: "IP"
value: ""
- checked: true
desc: "关键字"
type: "KEY"
value: "Jenkins"
- checked: false
desc: "加密"
type: "SECRET"
value: ""
报错
2020-06-20 16:44:21.344+0000 [id=29] SEVERE jenkins.InitReactorRunner$1#onTaskFailed: Failed ConfigurationAsCode.init
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.tryConstructor(DataBoundConfigurator.java:174)
Caused: io.jenkins.plugins.casc.ConfiguratorException: : Failed to construct instance of class io.jenkins.plugins.DingTalkRobotConfig.
Constructor: public io.jenkins.plugins.DingTalkRobotConfig(java.lang.String,java.lang.String,java.lang.String,java.util.concurrent.CopyOnWriteArrayList).
# 请看此处
Arguments: [java.lang.String, java.lang.String, java.lang.String, java.util.ArrayList].
Expected Parameters: id java.lang.String, name java.lang.String, webhook java.lang.String, securityPolicyConfigs java.util.concurrent.CopyOnWriteArrayList<io.jenkins.plugins.DingTalkSecurityPolicyConfig>
救助
我在Jcasc配置文件中配置dingding-notifications插件时,robot的ID我该怎么写?
我希望在通知中附加一些消息内容,比如:
当出发构建时,通知中包含: 变更:{修复登录bug}触发了自动构建,预计2分钟后重启服务
当构建完成时:{修复登录bug}已经完成,服务可用
按照官方示例填写的会报错
No such DSL method 'dingTalk' found among steps
问题描述
jenkins master和slave基于K8s运行,系统配置->Jenkins Location的地址是http://jenkins.ci.svc.cluster.local/ (这是K8s集群内部地址由于其他原因这个地址不能修改)。我们jenkins访问地址是https://jenkins.test.tech/
Describe the bug
A clear and concise description of what the bug is.
https://jenkins.io/security/advisory/2019-10-01/#SECURITY-1423
Screenshots
If applicable, add screenshots to help explain your problem.
Jenkins Info(please complete the following information):
DingTalk Plugin Info(please complete the following information):
Additional context
Add any other context about the problem here.
用了pipeline以后想把id定义成变量,但现在只能是随机数,配置起来很不方便。
WorkflowScript: 174: Missing required parameter: "jsonFilePath" @ line 174, column 9.
18:57:58 dingding accessToken: '${env.OpsInotifycation-dingding}'
18:57:58 ^
18:57:58
18:57:58 WorkflowScript: 180: Missing required parameter: "jsonFilePath" @ line 180, column 9.
18:57:58 dingding accessToken: '${env.OpsInotifycation-dingding}'
18:57:58 ^
18:57:58
18:57:58 WorkflowScript: 186: Missing required parameter: "jsonFilePath" @ line 186, column 9.
18:57:58 dingding accessToken: '${env.OpsInotifycation-dingding}'
18:57:58 ^
18:57:58
18:57:58 3 errors
18:57:58
18:57:58 at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
18:57:58 at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
18:57:58 at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
18:57:58 at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
18:57:58 at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
18:57:58 at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
18:57:58 at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
18:57:58 at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
18:57:58 at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
18:57:58 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142)
18:57:58 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
18:57:58 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:561)
18:57:58 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:522)
18:57:58 at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:331)
18:57:58 at hudson.model.ResourceController.execute(ResourceController.java:97)
18:57:58 at hudson.model.Executor.run(Executor.java:429)
18:57:58 Finished: FAILURE
post字段中如下
dingding accessToken: '${env.OpsInotifycation-dingding}', imageUrl: '', message: 'Jenkins构建通知', notifyPeople: 'Abner'
之前是dingTalk不知道为什么新版本里变成了dingding
消息类型Markdown,自定义按钮组在消息中不显示、自定义的字体也不能显示出来
Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
Describe the solution you'd like
A clear and concise description of what you want to happen.
Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
Additional context
Add any other context or screenshots about the feature request here.
Describe the bug
测试的时候提示错误:only group admin can @ All
Screenshots
If applicable, add screenshots to help explain your problem.
Jenkins Info(please complete the following information):
DingTalk Plugin Info(please complete the following information):
Additional context
测试的时候提示错误:only group admin can @ All
安装好插件后,配置好机器人,但是在项目设置中的构建后操作栏中没有dingtalk选项,在系统设置机器人的时候测试推送是没问题的,有重启jenkins
jenkins版本2.222
dingtalk 2.3.0
使用Jenkins内置的admin账户主动发起构建时,该项目收不到通知。构建成功后关联触发构建的其他项目可以收到通知。
配置完全局url,也能测试发送。
但是在任务里选中配置的机器人,然后构建时发送不了通知。报错如下
01-Apr-2020 11:42:18.653 WARNING [Executor #-1 for master : executing test2 #2] hudson.model.listeners.RunListener.report RunListener failed
java.lang.NullPointerException
at io.jenkins.plugins.DingTalkRunListener.onStarted(DingTalkRunListener.java:93)
at hudson.model.listeners.RunListener.fireStarted(RunListener.java:238)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:291)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:427)
Describe the bug
The port number of the link is inconsistent in the Mac version of the DingDing bot notification message.
Because we changed the Jenkins default port number to something else, not 5000.
But only link 1 will open correctly. The other three links open with the same port number of 5000.
Jenkins Info(please complete the following information):
DingTalk Plugin Info(please complete the following information):
Additional context
The ios version of DingDing does the same thing, so I'm guessing it's an issue with that plugin?
2020-06-02 02:44:34.447+0000 [id=63] WARNING h.model.listeners.RunListener#report: RunListener failed
java.lang.ClassNotFoundException: hudson.plugins.promoted_builds.JobPropertyImpl
at jenkins.util.AntClassLoader.findClassInComponents(AntClassLoader.java:1383)
at jenkins.util.AntClassLoader.findClass(AntClassLoader.java:1336)
at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1083)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Caused: java.lang.NoClassDefFoundError: hudson/plugins/promoted_builds/JobPropertyImpl
at org.jenkinsci.plugins.firplugin.FirRunListener.onCompleted(FirRunListener.java:22)
at org.jenkinsci.plugins.firplugin.FirRunListener.onCompleted(FirRunListener.java:18)
at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:209)
at hudson.model.Run.execute(Run.java:1898)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:427)
插件安装不正确,重新安装试试。
Originally posted by @liuweiGL in #49 (comment)
text: [
'以下服务更新完成:',
'--【xxx服务】',
'--【xx用户服务】',
'变更内容:
【$DEFAULT_CONTENT】'
],
这个没有生效
在普通流水线项目中能找到
Describe the bug
1.钉钉通知提炼到方法中在jenkis项目取消的时候 触发提醒 钉钉通知没执行
2. LINK模式不支持@功能 这个功能很需要 在构建失败或取消的时候已获取构建人手机号情况需要自定义@构建人 不使用钉钉插件的默认通知
Jenkins Info(please complete the following information):
Jenkins 2.243
DingTalk Plugin Info(please complete the following information):
2.3.1
Additional context
if ("${IS_ROLL_DEPLOY}" == 'true') {
dingNotice("CI/CD滚动部署被取消 ❌")
}
// 钉钉通知
def dingNotice(content = '') {
dingtalk(
robot: "${DING_TALK_ROBOT}",
type: 'LINK',
title: "${JOB_NAME}#${BUILD_NUMBER}项目${content}",
text: ['点击查看更多详情'],
messageUrl: "${env.BUILD_URL}",
picUrl: ''
)
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.