Giter Club home page Giter Club logo

hubot-jenkins-enhanced's Introduction

Hubot Jenkins Enhanced Plugin

Jenkins integration for Hubot with multiple server support with the use of access tokens instead of password authentication.

Configuration

Auth should be in the "user:access-token" format.
You can find your access token at $JENKINS_URL/me/configure

  • HUBOT_JENKINS_URL
  • HUBOT_JENKINS_AUTH
  • HUBOT_JENKINS_{1-N}_URL
  • HUBOT_JENKINS_{1-N}_AUTH

Commands

  • hubot jenkins aliases - lists all saved job name aliases **
  • hubot jenkins b <jobNumber> - builds the job specified by jobNumber. List jobs to get number.
  • hubot jenkins b <jobNumber>, <params> - builds the job specified by jobNumber with parameters as key=value&key2=value2. List jobs to get number.
  • hubot jenkins build <job|alias|job folder/job> - builds the specified Jenkins job
  • hubot jenkins build <job|alias|job folder/job>, <params> - builds the specified Jenkins job with parameters as key=value&key2=value2
  • hubot jenkins d <jobNumber> - Describes the job specified by jobNumber. List jobs to get number.
  • hubot jenkins describe <job|alias|job folder/job> - Describes the specified Jenkins job
  • hubot jenkins getAlias <name> - Retrieve value of job name alias **
  • hubot jenkins l <jobNumber> - Details about the last build for the job specified by jobNumber. List jobs to get number.
  • hubot jenkins last <job|alias|job folder/job> - Details about the last build for the specified Jenkins job
  • hubot jenkins list <filter> - lists Jenkins jobs grouped by server
  • hubot jenkins servers - Lists known jenkins servers
  • hubot jenkins setAlias <name>, <value> - creates job name alias **
  • hubot jenkins remAlias <name> - removes job name alias **

Notes:

  • Job Folder/Job can be either the absolute path to the job or the folder containing the job.
    For example, hubot jenkins describe The Path/To/My/Job/The Job To Run or hubot jenkins describe Job/The Job To Run

Persistence **

Note: Various features will work best if the Hubot brain is configured to be persisted. By default the brain is an in-memory key/value store, but it can easily be configured to be persisted with Redis so data isn't lost when the process is restarted.

@See Hubot Scripting for more details

hubot-jenkins-enhanced's People

Contributors

eh-am avatar wintondeshong avatar zack-hable 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

hubot-jenkins-enhanced's Issues

Failure with message ERROR TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object

Node: v7.10.0

test-bot> test-bot jenkins servers
test-bot> [Wed Sep 06 2017 16:20:13 GMT+0530 (IST)] ERROR TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.
at fromObject (buffer.js:280:9)
at Function.Buffer.from (buffer.js:106:10)
at new Buffer (buffer.js:85:17)
at HubotJenkinsPlugin._configureRequest (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:275:12)
at HubotJenkinsPlugin._configureRequest (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:32:1)
at HubotJenkinsPlugin._requestFactorySingle (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:343:6)
at HubotJenkinsPlugin._requestFactorySingle (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:32:1)
at HubotJenkinsPlugin._requestFactory (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:348:8)
at HubotJenkinsPlugin._requestFactory (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:32:1)
at HubotJenkinsPlugin.list (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:220:6)
at HubotJenkinsPlugin.list (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:32:1)
at HubotJenkinsPlugin._init (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:167:6)
at HubotJenkinsPlugin._init (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:32:1)
at HubotJenkinsPlugin.servers (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:231:20)
at HubotJenkinsPlugin. (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:32:1)
at TextListener.callback (/Users/TestUser/test-bot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:479:24)
at /Users/TestUser/test-bot/node_modules/hubot/src/listener.coffee:65:12
at allDone (/Users/TestUser/test-bot/node_modules/hubot/src/middleware.coffee:44:37)
at /Users/TestUser/test-bot/node_modules/async/lib/async.js:274:13
at Object.async.eachSeries (/Users/TestUser/test-bot/node_modules/async/lib/async.js:142:20)
at Object.async.reduce (/Users/TestUser/test-bot/node_modules/async/lib/async.js:268:15)
at /Users/TestUser/test-bot/node_modules/hubot/src/middleware.coffee:49:13
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)

Shell: This is the first command run after startup. Please wait while we perform initialization...

Using aliases with folders

Hi, we have our jenkins jobs in a folder structure, so this works:

hubot jenkins build myfolder/myjob

I would have expected that if I ran hubot jenkins setAlias myjob, myfolder/myjob then that would let me do hubot jenkins build myjob, but instead I get "There are no jobs with the name myjob". Is this a bug or by design?

Update NPM package?

Hi, it's me again, i'm sure you didn't miss me much? ๐Ÿ˜„

I just set up a new Hubot and installed the module via NPM, but it seems as if the version in NPM is still the old one without your fixes. Could you update it there?

Thanks a lot & cheers!

HUBOT_JENKINS_{1-N}_URL

How is {1-N} defined?

HUBOT_JENKINS_1_URL

like that?

Then I would do:

@bot jenkins list 1

Job with spaces in name

Hi, thanks for your script! We're having issue with commands like "@bot jenkins b 1" if that job with the ID 1 has a space in its name, same for "@bot jenkins build 'my job'" (with or without quotes).

The script throws the following error then:

[Wed Feb 25 2015 11:35:59 GMT+0100 (CET)] ERROR TypeError: Cannot read property 'url' of null
  at HubotJenkinsPlugin._requestFactorySingle (/srv/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:298:5, <js>:473:25)
  at HubotJenkinsPlugin._requestFactorySingle (/srv/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:29:1, <js>:3:61)
  at HubotJenkinsPlugin.build (/srv/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:193:5, <js>:307:19)
  at HubotJenkinsPlugin.build (/srv/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:29:1, <js>:3:61)
  at TextListener.callback (/srv/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:413:5, <js>:625:33)
  at TextListener.Listener.call (/srv/hubot/node_modules/hubot/src/listener.coffee:27:7, <js>:23:14)
  at Robot.receive (/srv/hubot/node_modules/hubot/src/robot.coffee:197:9, <js>:143:33)
  at LCB.Adapter.receive (/srv/hubot/node_modules/hubot/src/adapter.coffee:66:5, <js>:47:25)
  at Socket.<anonymous> (/srv/hubot/node_modules/hubot-lets-chat/src/0_3.coffee:60:9, <js>:99:24)
  at Socket.Emitter.emit (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
  at Socket.onevent (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/lib/socket.js:254:10)
  at Socket.onpacket (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/lib/socket.js:212:12)
  at Manager.<anonymous> (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
  at Manager.Emitter.emit (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
  at Manager.ondecoded (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/lib/manager.js:301:8)
  at Decoder.<anonymous> (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
  at Decoder.Emitter.emit (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
  at Decoder.add (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/socket.io-parser/index.js:247:12)
  at Manager.ondata (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/lib/manager.js:291:16)
  at Socket.<anonymous> (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
  at Socket.Emitter.emit (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
  at Socket.onPacket (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/lib/socket.js:430:14)
  at WS.<anonymous> (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/lib/socket.js:248:10)
  at WS.Emitter.emit (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
  at WS.Transport.onPacket (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/lib/transport.js:147:8)
  at WS.Transport.onData (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/lib/transport.js:139:8)
  at WebSocket.ws.onmessage (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/websocket.js:112:10)
  at WebSocket.onMessage (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/WebSocket.js:360:18)
  at WebSocket.EventEmitter.emit (events.js:98:17)
  at Receiver.self._receiver.ontext (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/WebSocket.js:697:10)
  at Receiver.opcodes.1.finish (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/Receiver.js:397:14)
  at Receiver.expectHandler (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/Receiver.js:384:31)
  at Receiver.add (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/Receiver.js:93:24)
  at Socket.firstHandler (/srv/hubot/node_modules/hubot-lets-chat/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/WebSocket.js:678:22)
  at Socket.EventEmitter.emit (events.js:95:17)
  at Socket.<anonymous> (_stream_readable.js:746:14)
  at Socket.EventEmitter.emit (events.js:92:17)
  at emitReadable_ (_stream_readable.js:408:10)
  at emitReadable (_stream_readable.js:404:5)
  at readableAddChunk (_stream_readable.js:165:9)
  at Socket.Readable.push (_stream_readable.js:127:10)
  at TCP.onread (net.js:526:21)

correct parsing of ampersand in @_params used when constructing jenkins url

Hi Winton,

I came across your repo and decided to try your script.
After integrating your cool script I found out that if I specify params of the build via Slack command e.g.
jenkins build Deploy Smth Cool, BRANCH=integration&NOTES=testtext2
only the first parameter is passing to the Jenkins job successfully.
I believe this is happening because of how ampersand is interpreted in the script.
Please have a look at this gist https://gist.github.com/nikitabugrovsky/75472fe9dd4b028b559283aaadf0683a .
This is how I fixed that for me.

Hubot jenkins url

Firstly, thanks for enhanced plugin. When I want to declare a variable for one of the jenkins server, HUBOT_JENKINS_1_AUTH=<server_address> would be right? I see an error in my log saying

ERROR TypeError: Cannot read property 'url' of null

I guess, I am giving variable name wrong. If anybody has time, please lok into this. Thanks!

How to remove an alias

Hi! First of all, thanks for your work.

When I want to delete an incorrect alias, I try to use "hubot jenkins setAlias , ". But I find that it doesn't really implement the delete operation, I get the result that "-- Alias '' for job '' ".

Is there any way to remove the wrong alias name?

build with parameters not work

734: robot.respond /j(?:enkins)? build (.*)(, (.+))?/i, id: 'jenkins.build', (msg) ->

It could not extract params. It use "job, foo=bar" as job name, and job not found.

Hubot - Call jenkis job return error 404

Hi all,

When i past this URL in my browser it launch the job :

But when i launch it via Hubot/Mattermost it gaves me an "Errorr 404" with this command "hubot build job_name, param=value"

When i prompt the value of my URL they are excatly the same ...
When i launch the list command from hubot it works and i get all the job list.
The describe command works too.

If someone can help me !
Thanks in advance !

No Hubot output with this module and Hipchat

On a default Hubot install, when this (or hubot-jenkins) is enabled, I get no output via 'help', 'ping', 'pug me', etc.. Very strange. If I put Hubot into debug mode, I can see the 'help' and other commands return something, but it never makes it to Hipchat. I've tried with node 0.12.9, 0.12.2, and 4.2.3 - all same results.

jenkins crumb support in 1.2.2

Version 1.1.3 has jenkins crumb support but in the latest version seems it has just disappeared.
Is there any chances to add it again ?

Parameters are not passed to the job

Using this plugin with hipchat, but the plugin does not send the parameter to the job:

hubot jenkins build foo, VERSION=1.2.3

In jenkins, I can see that this parameter is not sent. Version: "hubot-jenkins-enhanced": "^1.1.0", and using only 1 jenkins instance, that is via parameters: HUBOT_JENKINS_URL, HUBOT_JENKINS_AUTH.

Rename default branch from master to main.

Feature request

What is the expected behavior?
To have the default branch named main instead of master

What is motivation or use case for adding/changing the behavior?
Removing terminology in technology evocative of racial inequality.

How should this be implemented in your opinion?
Following Scott Hanselman's advice

  1. Move master to main (maintains branch history)
git branch -m master main
git push -u origin main
  1. Update the default branch in repo settings from master to main.
  2. Repoint HEAD, and delete master branch.
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
git push origin --delete master

Are you willing to work on this yourself?
no

Jenkins certificate ?

Hello,

I'm not so sure of this ...
But when i try to get the list of all the job i get an certificate error like below :

Jenkins says: Error: self signed certificate in certificate chain

My variable are like these :

HUBOT_JENKINS_URL=https://jenkins.url.uk:1000X/jenkins
HUBOT_JENKINS_AUTH=user:password

Did i have to put my certificate from jenkins.crt anywhere on the machine of Hubot ?
Did i have to put the cerficate anywhere in npm / node.js ?

Thanks in advance for help !
Best regards.

Support for multi-branch pipelines?

Would be great if we could have support for multi branch pipeline jobs by provide the branch name as a parameter... could anyone help with this?

Right now when attempting: hubot jenkins build <job name>, branch=develop, this fails with:

Status 404 <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Error 404 Not Found</title>
</head>
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /job/job-name/buildWithParameters. Reason:
<pre>    Not Found</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/>

</body>
</html>

HTTP 400 - Bad request.

First of all, thanks for your contribution towards this project. I have tried make it work. But having a weird issue. Its throwing Error 400. I have tested it using Postman successfully using the URL (http://dhud001:6900/apprel/api/json) and basic auth. Any idea what might be causing this issue.

[Thu Jun 01 2017 08:21:17 GMT-0500 (Central Daylight Time)] DEBUG Executing listener callback for Message 'devops jenkins list'
URL "http://dhud001:6900/apprel
requestfactory end point = api/json
_requestFactorySingle path = "http://dhud001:6900/apprel/api/json
RES =[object Object]
BODY =<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid URL</h2>
<hr><p>HTTP Error 400. The request URL is invalid.</p>
</BODY></HTML>

[Thu Jun 01 2017 08:21:17 GMT-0500 (Central Daylight Time)] DEBUG Sending to C58KYRMST: SyntaxError: Unexpected token < in JSON at position 0
error: no_text
Unhandled rejection Error: no_text
  at handleHttpResponse (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\@slack\client\lib\clients\transports\call-transport.js:105:17)
  at handleTransportResponse (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\@slack\client\lib\clients\transports\call-transport.js:155:19)
  at apply (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\@slack\client\node_modules\lodash\lodash.js:499:17)
  at wrapper (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\@slack\client\node_modules\lodash\lodash.js:5356:16)
  at Request.handleRequestTranportRes (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\@slack\client\lib\clients\transports\request.js:20:5)
  at apply (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\@slack\client\node_modules\lodash\lodash.js:499:17)
  at Request.wrapper [as _callback] (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\@slack\client\node_modules\lodash\lodash.js:5356:16)
  at Request.self.callback (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\request\request.js:188:22)
  at emitTwo (events.js:106:13)
  at Request.emit (events.js:191:7)
  at Request.<anonymous> (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\request\request.js:1171:10)
  at emitOne (events.js:96:13)
  at Request.emit (events.js:188:7)
  at IncomingMessage.<anonymous> (C:\Users\mcs023\WORK\DevOps\ChatOps\wrkspace\apprel\node_modules\request\request.js:1091:12)
  at IncomingMessage.g (events.js:291:16)
  at emitNone (events.js:91:20)
  at IncomingMessage.emit (events.js:185:7)
  at endReadableNT (_stream_readable.js:974:12)
  at _combinedTickCallback (internal/process/next_tick.js:80:11)
  at process._tickCallback (internal/process/next_tick.js:104:9)
 

building jobs in nested folders

Hi ๐Ÿ‘‹ I'm using the CloudBees Folders Plugin to organize my jobs in nested folders, i noticed that if i want to build a job wich is in a nested folder hubot-jenkins-enhanced crashes, i.e:

$ hubot jenkins build my_nested_job

[Tue Feb 21 2017 23:09:56 GMT+0000 (UTC)] ERROR TypeError: Cannot read property 'url' of null
  at HubotJenkinsPlugin._requestFactorySingle (/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:337:5, <js>:527:25)
  at HubotJenkinsPlugin._requestFactorySingle (/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:31:1, <js>:3:61)
  at HubotJenkinsPlugin.describe (/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:203:5, <js>:326:19)
  at HubotJenkinsPlugin.describe (/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:31:1, <js>:3:61)
  at TextListener.callback (/hubot/node_modules/hubot-jenkins-enhanced/src/jenkins-enhanced.coffee:466:5, <js>:703:33)
  at executeListener (/hubot/node_modules/hubot/src/listener.coffee:65:11, <js>:53:19)
  at allDone (/hubot/node_modules/hubot/src/middleware.coffee:44:37, <js>:34:16)
  at /hubot/node_modules/async/lib/async.js:274:13
  at /hubot/node_modules/async/lib/async.js:154:25
  at /hubot/node_modules/async/lib/async.js:271:17
  at nextFunc (/hubot/node_modules/hubot/src/middleware.coffee:33:35, <js>:23:18)
  at /hubot/scripts/jenkins_aw.coffee:12:5, <js>:17:9
  at executeSingleMiddleware (/hubot/node_modules/hubot/src/middleware.coffee:36:9, <js>:26:33)
  at /hubot/node_modules/async/lib/async.js:269:13
  at iterate (/hubot/node_modules/async/lib/async.js:146:13)
  at Object.async.eachSeries (/hubot/node_modules/async/lib/async.js:162:9)
  at Object.async.reduce (/hubot/node_modules/async/lib/async.js:268:15)
  at /hubot/node_modules/hubot/src/middleware.coffee:49:7, <js>:37:22
  at process._tickCallback (node.js:442:13)

is there a way to accomplish this or this is something which is not supported by hubot-jenkins-enhanced?

thanks in advance and thanks for this hubot script is pretty usefull :)

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.