Giter Site home page Giter Site logo

kitura / package-builder Goto Github PK

View Code? Open in Web Editor NEW
33.0 27.0 29.0 457 KB

Build and utility scripts used for continuous integration builds for Swift Package Manager projects on the Travis CI environment

License: Apache License 2.0

Shell 93.00% Makefile 4.38% Swift 2.61%

package-builder's Introduction

Build Status

Package-Builder

This repository contains build and utility scripts used for continuous integration builds on the Travis CI environment. It offers many extension points for customizing builds and tests.

Build prerequisites

Package-Builder is intended to be used as part of Travis CI tests, and will operate on both Ubuntu 14.04 and macOS. At a minimum, the .travis.yml file of your application will look something like this:

$ cat .travis.yml

matrix:
  include:
    - os: linux
      dist: trusty
      sudo: required
    - os: osx
      osx_image: xcode9
      sudo: required

before_install:
  - git clone https://github.com/Kitura/Package-Builder.git

script:
  - ./Package-Builder/build-package.sh -projectDir $TRAVIS_BUILD_DIR

If you need to install system-level dependencies such as libmysqlclient-dev, you can do so in the before_install section of the .travis.yml file so that the Travis CI build environment is ready for compilation and testing of your Swift package.

How to start the build-package.sh script

This script must be started form the folder that contains your Swift package. Also, please note that the projectDir argument passed to the script should be the directory of the whole repository. For most projects, this is the same as the folder that contains your Swift package, as shown in the example above. However, there are repositories where the Swift packaage is a sub-folder in the main project.

Providing custom credentials

It is not uncommon for swift packages to need to connect to secure services, offerings, and middleware such as databases. To do this, credentials are needed from properties files. To ensure the security of these credentials, many teams use private repositories to store these credentials while their public ones contain dummy files like the one below:

$ cat configuration.json

{
  ...
  "credentials": {
      "url": "<url>",
      "name": "<name>",
      "password": "<password>"      
    }
  ...
}

The true credentials, show below, should be stored in a private repository:

$ cat configuration.json

{
  ...
  "credentials": {
      "url": "api.ng.bluemix.net/v2/authenticate",
      "name": "[email protected]",
      "password": "passw0rd"      
    }
  ...
}

In order to meet this need, Package-Builder will copy and overwrite these dummy files with the credentials from the private repository. To leverage this functionality, be sure to clone the credentials in the before_install section, and then use the following in your .travis.yml, pointing towards the folder where the cloned credentials exist:

script:
  - ./Package-Builder/build-package.sh -projectDir $TRAVIS_BUILD_DIR -credentialsDir <path to credentials>

Codecov

Codecov is used in Package-Builder to determine how much test coverage exists in your code. Codecov allows us to determine which methods and statements in our code are not currently covered by the automated test cases included in the project. Codecov performs its analysis by generating an Xcode project.

To turn on Codecov, you need to add the following to your .travis.yml file:

env:
  global:
    - CODECOV_ELIGIBLE=true

For example, see the current test coverage for the Swift-cfenv package.

Codecov Report

Please note that Codecov is only leveraged when executing builds on the macOS platform.

SonarCloud

In parallel to Codecov, you can also use SonarCloud. SonarCloud will provide you both with code coverage and code analysis tools.

Just as Codecov, SonarCloud is only leveraged when executing builds on the macOS platform.

A little customization to your .travis.yml file is needed:

env:
  global:
    - SONARCLOUD_ELIGIBLE=true
    - SONAR_LOGIN_TOKEN={your login token -- better add this in Travis directly}

Feel free to read the source for more info: sonarcloud.sh

It is recommended to use a sonar-project.properties at the root of your project. Here's a good example: sonar-project.properties. The whole Swift-Travis-Sonarcloud-CI repo is a good starting point for both Travis-CI & Sonarcloud.

You can also provide a .swift-sonarcloud file with your custom sonar-scanner command.

Auto Jazzy Docs Build

Jazzy provides automatic documentation construction. To simplify the process of updating public facing api/documentation, package builder can automate the creation and pushing of updated docs for a Pull Request.

To indicate that documentation should be generated, add the jazzy-doc label to the Pull Request.

In order for a PR to receive automatic documentation generation, the following must be configured:

  • The Travis configuration for the repository must define the following environment variables, specifying the credentials of a user that has sufficient permissions to push to PR branches:
    • GITHUB_USERNAME
    • GITHUB_PASSWORD
    • GITHUB_EMAIL
  • The repository must have a jazzy-doc label defined
  • The .travis.yaml for the project must contain one macOS build with env: JAZZY_ELIGIBLE=true
  • The PR must have the jazzy-doc label applied

Once the regular build has executed, Jazzy will be run for MacOS builds and the resulting documentation pushed to the PR branch in a new [jazzy-doc] commit. Docs will be generated for each new commit to the PR branch whose commit message does not contain the text [jazzy-doc].

Custom Xcode project generation

If for Codecov, you need a custom command to generate the Xcode project for your Swift package, you should include a .swift-xcodeproj file that contains your custom swift package generate-xcodeproj command.

Custom code coverage

If you need to run a custom command to generate code coverage for your Swift package, you should include a .swift-codecov file that contains your command.

Custom SwiftLint

SwiftLint is a tool to enforce Swift style and conventions. Ensure that your team's coding standard conventions are being met by providing your own .swiftlint.yml in the root directory with the specified rules to be run by Package-Builder. For now each project should provide their own .swiftlint.yml file to adhere to your preferences. A default may be used in the future, but as of now no SwiftLint operations are performed unless a .swiftlint.yml file exists.

Please note that SwiftLint is only leveraged when executing builds on the macOS platform.

Using different Swift versions and snapshots

Package-Builder uses, by default, the most recent release version of Swift, which at the time of writing is 4.0.3. If you need a specific version of Swift to build and compile your repo, you should specify that version in a .swift-version file in the root level of your repository. Valid contents of this file include release and development snapshots from Swift.org.

$ cat .swift-version

swift-DEVELOPMENT-SNAPSHOT-2017-02-14-a

Testing with multiple Swift versions

To test your package using a different version of Swift than the one specified in your .swift-version file, simply add the SWIFT_SNAPSHOT environment variable to your .travis.yml file in each one of the entries under the matrix section as shown below:

$ cat .travis.yml

matrix:
  include:
    - os: linux
      dist: trusty
      sudo: required
    - os: linux
      dist: trusty
      sudo: required
      env: SWIFT_SNAPSHOT=3.1.1

before_install:
  - git clone https://github.com/Kitura/Package-Builder.git

script:
  - ./Package-Builder/build-package.sh -projectDir $TRAVIS_BUILD_DIR

In this example above, the first build uses the version specified in the .swift-version of the project, or the default version supported by Package-Builder. The second one declares a SWIFT_SNAPSHOT environment variable, which overrides the default and .swift-version versions for that build.

Testing under Docker

To test your package using a different version of Linux, add the DOCKER_IMAGE environment variable to your .travis.yml file in each one of the entries under the matrix section as shown below:

$ cat .travis.yml

matrix:
  include:
    - os: linux
      dist: trusty
      sudo: required
      env: SWIFT_SNAPSHOT=4.1.3
    - os: linux
      dist: trusty
      sudo: required
      env: DOCKER_IMAGE=ubuntu:16.04 SWIFT_SNAPSHOT=4.1.3

before_install:
  - git clone https://github.com/Kitura/Package-Builder.git

script:
  - ./Package-Builder/build-package.sh -projectDir $TRAVIS_BUILD_DIR

In the above example, the first build uses Ubuntu 14.04 (Trusty) which is supported natively by Travis. The second build uses Trusty to download a 16.04 (Xenial) Docker container, and will then re-execute the Package-Builder command within that container.

Additional environment variables

Selected environment variables are passed through to the container. These are currently: SWIFT_SNAPSHOT and KITURA_NIO. Additional environment variables can be passed through by setting the DOCKER_ENVIRONMENT variable as follows:

      env: DOCKER_IMAGE=ubuntu:16.04 DOCKER_ENVIRONMENT="CUSTOMENV1 CUSTOMENV2"

Additional system packages

A number of system packages are installed within the Docker container by default (this includes pkg-config for SwiftPM, and packages required by Package-Builder itself). Additional system package dependencies can be specified by setting the DOCKER_PACKAGES variable as follows:

      env: DOCKER_IMAGE=ubuntu:16.04 DOCKER_PACKAGES="libSomePackage someOtherPackage"

Custom build and test commands

If you need a custom command for compiling your Swift package, you should include a .swift-build-linux or .swift-build-macOS file in the root level of your repository and specify in it the exact compilation command for the corresponding platform.

$ cat .swift-build-linux

swift build -Xcc -I/usr/include/postgresql

If you need a custom command for testing your Swift package, you should include a .swift-test-linux or .swift-test-macOS file in the root level of your repository and specify in it the exact testing command for the corresponding platform.

$ cat .swift-test-linux

swift test -Xcc -I/usr/include/postgresql

If you require more granularity than the platform files above provide you can also set the CUSTOM_BUILD_SCRIPT and CUSTOM_TEST_SCRIPT environment variables in your travis configuration. The scripts these environment variables point to will be executed in place of the platform custom scripts or default commands.

$ cat .build-ubuntu1404
swift build -Xlinker -L/usr/lib -Xcc -I/usr/include/ -Xcc -I/usr/include/mysql/

$ cat .test-ubuntu1404
swift test -Xlinker -L/usr/lib -Xcc -I/usr/include/ -Xcc -I/usr/include/mysql/

$ cat .travis.yml
matrix:
  include:
    - os: linux
      dist: trusty
      services: docker
      env:
        - DOCKER_IMAGE=ubuntu:14.04 CUSTOM_BUILD_SCRIPT=.build-ubuntu1404 CUSTOM_TEST_SCRIPT=.test-ubuntu1404
      sudo: required

Custom swift test arguments

If you only need to provide arguments to the swift test command, rather than providing a customized test script, you can define the SWIFT_TEST_ARGS environment variable. For example:

SWIFT_TEST_ARGS="--parallel --num-workers=16"

Custom configuration for executing tests

Sometimes, a dependency must be set up before the testing process can begin. You may also have the need to execute certain actions after your tests have completed (e.g. shutting down a server). Package-Builder provides an extension point to do this; you can include a before_tests.sh and/or a after_tests.sh file containing the commands to be executed before and after the tests.

These files should be placed in a folder structure that matches the outline shown below (see the linux, osx, and common folders):

File Structure

Before Tests: The linux/before_tests.sh and osx/before_tests.sh scripts will be executed first if present, followed by common/before_tests.sh. Once complete, the tests will commence.

After Tests: After the tests are performed, common/after_tests.sh is executed first, followed by linux/after_tests.sh or osx/after_tests.sh.

Troubleshooting

If there is a crash during the execution of test cases, Package-Builder will perform a log dump to provide meaningful diagnosis of where the failure has occurred.

package-builder's People

Contributors

bdhernand avatar dannys42 avatar dfirsht avatar djones6 avatar helenmasters avatar ianpartridge avatar irar2 avatar kilnerm avatar kyemaloy97 avatar ladislas avatar na-gupta avatar nacho4d avatar nethraravindran avatar quanvo87 avatar rolivieri avatar shihabmehboob avatar shmuelk avatar tfrank64 avatar tobias avatar vadimeisenbergibm avatar youming-lin 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

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

package-builder's Issues

Add SonarCloud code coverage

As reported in #142, I'm not able to get codecov to work.

But I was able to work with SonarCloud and it is very easy.

Would you be interested in a PR to add this feature?

Can't get codecov to work

Hi there!

First, thanks a lot for this great tool that makes running CI super easy for SPM Packages.

Even though everything builds well and tests pass, I can't seem to get codecov to work.

The build log says it has uploaded the reports to Codecov.io but when I want to see them it tells me that there was some errors in the reports...

Here are the relevant links:

I'm using Xcode 10 and Swift 4.2 on my machine and on Travis.

Thanks in advance!

Best,
-- Ladislas

Parameterize testing credentials repo

In build-package.sh, we have the name of the testing credentials folder hardcoded to Kitura-TestingCredentials. Instead, this should be an optional parameterized value coming from the travis.yml file. We should then update the build-package.sh script accordingly. Note that this change will require PRs against the dependent repos.

0807 Travis builds fail in dispatch

>> Testing Kitura package...
Compile CHTTPParser utils.c
Compile CHTTPParser http_parser.c
Compile Swift Module 'Socket' (3 sources)
Compile Swift Module 'LoggerAPI' (1 sources)
Linking CHTTPParser
Compile Swift Module 'KituraSys' (1 sources)
Compile Swift Module 'KituraNet' (29 sources)
<unknown>:0: error: module 'CDispatch' requires feature 'blocks'
<unknown>:0: error: could not build Objective-C module 'CDispatch'
<unknown>:0: error: module 'CDispatch' requires feature 'blocks'
<unknown>:0: error: could not build Objective-C module 'CDispatch'
<unknown>:0: error: module 'CDispatch' requires feature 'blocks'
<unknown>:0: error: could not build Objective-C module 'CDispatch'
<unknown>:0: error: module 'CDispatch' requires feature 'blocks'
<unknown>:0: error: could not build Objective-C module 'CDispatch'
<unknown>:0: error: module 'CDispatch' requires feature 'blocks'
<unknown>:0: error: could not build Objective-C module 'CDispatch'
<unknown>:0: error: module 'CDispatch' requires feature 'blocks'
<unknown>:0: error: could not build Objective-C module 'CDispatch'
<unknown>:0: error: module 'CDispatch' requires feature 'blocks'
<unknown>:0: error: could not build Objective-C module 'CDispatch'
<unknown>:0: error: module 'CDispatch' requires feature 'blocks'
<unknown>:0: error: could not build Objective-C module 'CDispatch'
<unknown>:0: error: build had 1 command failures
error: exit(1): /home/travis/build/IBM-Swift/Kitura-net/swift-DEVELOPMENT-SNAPSHOT-2016-08-07-a-ubuntu14.04/usr/bin/swift-build-tool -f /home/travis/build/IBM-Swift/Kitura-net/.build/debug.yaml test

This is because the build-package.sh script does swift test, but swift test -Xcc -fblocks is required on that snapshot.

https://github.com/IBM-Swift/Package-Builder/blob/master/build-package.sh#L110

Support SwiftLint

We'd like to automatically run SwiftLint against PRs on Travis. Would it be possible for this to be done via Package-Builder?

linux/install_swift_binaries.sh is fixed to experimental/foundation branch

The install_swift_binaries.sh script pulls the experimental/foundation branch of libdispatch.

https://github.com/IBM-Swift/Package-Builder/blob/d1af56597d1f5ab360c854c127c1cd2aead7ab7c/linux/install_swift_binaries.sh#L55

As we migrate to the 0807 snapshot (and beyond) we need to move to the master branch, and also be more fine-grained.

We need to be able to specify a specific commit of libdispatch, as changes are going into master which break compatibility with previous snapshots.

So, we need to do something like:

git clone -n https://github.com/apple/swift-corelibs-libdispatch.git
git checkout 55261225184e49c6a42c38bbedb144c2610def4a

to pull the version compatible with the 0807 snapshot, and

git clone -n https://github.com/apple/swift-corelibs-libdispatch.git
git checkout 1a7ff3f3e1073eb3352a56ab121ccfa712c42cef

to pull the version compatible with the 0818 snapshot.

This is blocking Kitura moving up from 0725.

***-PREVIEW Swift toolchains not supported

From Travis log:

echo ">> Installing '${SWIFT_SNAPSHOT}'..."
>> Installing 'swift-3.0.1-PREVIEW-3-RELEASE'...
# Install Swift compiler
cd $WORK_DIR
wget https://swift.org/builds/$SNAPSHOT_TYPE/$UBUNTU_VERSION_NO_DOTS/$SWIFT_SNAPSHOT/$SWIFT_SNAPSHOT-$UBUNTU_VERSION.tar.gz
--2016-10-12 15:02:47--  https://swift.org/builds/swift-3.0.1-preview-3-release/ubuntu1404/swift-3.0.1-PREVIEW-3-RELEASE/swift-3.0.1-PREVIEW-3-RELEASE-ubuntu14.04.tar.gz
Resolving swift.org (swift.org)... 169.45.67.140
Connecting to swift.org (swift.org)|169.45.67.140|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2016-10-12 15:02:47 ERROR 404: Not Found.

The correct download URL is https://swift.org/builds/swift-3.0.1-preview-3/ubuntu1404/swift-3.0.1-PREVIEW-3/swift-3.0.1-PREVIEW-3-ubuntu14.04.tar.gz; there is no -RELEASE after PREVIEW-3.

Extract Kitura related folders to a separate repo.

  • As the intention of this repo is to have a package-builder that is not tied to any Kitura repos in specific (i.e. this is a builder for any of our Swift repos, Kitura related or not), let's move the following folders to a separate single repo named Kitura-CI:
  • Kitura-Session-Redis
  • Kitura-redis

Also, to avoid breaking the dependent repos, we will have to keep the above folders in place until the PRs have been merged/accepted.

  • As part of this task, we will need to perform a couple of PRs against the dependent repos (i.e. dependent repos will add as git submodules the new repo that will contain the above folders) and will also need to come up with a convention so that the build scripts in this repo can dynamically find the above folders.
  • Once all PRs are merged, we should come back and clean up this repo (i.e., remove correspoding folders from it).

No support for custom test command

Looks like run_tests.sh is hard coded to run swift test... it would be nice if there were support for custom test commands, e.g. for a .swift-test-platform file analogous to what exists for .swift-build-platform. My use case was running tests for a package that needs to add to the library link search path.

Run Kitura tests for Kitura-net and Kitura-NIO PRs

Kitura has a much more comprehensive test suite compared to Kitura-net/Kitura-NIO. It's been observed that some regressions get caught only in the Kitura test suite. It would be great if Kitura tests could be run in Travis for pull requests on Kitura-net/Kitura-NIO.

Ability to have custom builds for linux and macOS.

Need the ability for a Repo to specify a custom build file for linux and mac.

if the repo specifies a .swift-build-linux or .swift-build-macOS then need to run the command
listed in that file vs the swift build command that we normally use.

Swift toolchain 5.2 support

Hey there,

I've been using Package-Builder to test my open source project on linux for a while now.

Recently I've been getting this error:

error: package at '/home/travis/build/Bersaelor/KDTree' is using Swift tools version 5.2.0 but the installed version is 5.0.0

Can I give updating to swift 5.2 a shot by myself? Is the project still maintained and somneone is already working on the 5.2 support @djones6 ?

Swift 4 Snapshot Breaking Codecov Portion

Just FYI in case this change ends up in the final Swift 4 release: SPM changed how the Xcode scheme is named in Swift 4 (as observed in 06/11 toolchain).

Travis log:
https://travis-ci.org/IBM-Swift/swift-html-entities/jobs/242539038#L342

Previously, the scheme name was the same as the package name: HTMLEntities.
With the 06/10 toolchain, the scheme name is now HTMLEntities-Package. I checked this by generating xcodeproj locally using the 06/11 toolchain.

ylin@youming-mbpr:~/Swift/swift-html-entities$ xcodebuild -list
Information about project "HTMLEntities":
    Targets:
        HTMLEntitiesTests
        HTMLEntities
        HTMLEntitiesPackageTests

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Debug" is used.

    Schemes:
        HTMLEntities-Package
        HTMLEntitiesPackageTests

Support multi-Swift-version testing

As we update code to support new Swift versions and maintain backwards compatibility with older Swift versions, we should be testing repos on multiple Swift toolchain versions.

In addition, it has came to light that many of our repos do not pass on 3.0.2. Adding multi-version testing to CI tests can help catch this and alert repo owners to update their code.

install_swift_binaries.sh breaks ubuntu 16.04 build

export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/clang/ {next} {print}'`

The above line in install_swift_binaries.sh adds a newline and extra colon at the end of PATH and causes some commands to no longer be available. It also doesn't seem to change the path in any other way in ubuntu 14.04 or 16.04, so not sure it's serving a purpose at all.

For example, it changes PATH from:

"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

to:

"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
:"

Commenting out this line seems to fix the issue for Kitura, but not sure if it does anything useful on other builds. Could we either fix or remove this line.

package builder script fails to fetch dependencies

branches:
  only:
    - master

matrix:
  include:
    - os: linux
      dist: trusty
      sudo: required
    - os: linux
      dist: trusty
      sudo: required
      env: SWIFT_SNAPSHOT=$SWIFT_4_DEV_SNAPSHOT
    - os: osx
      osx_image: xcode8.3
      sudo: required
    - os: osx
      osx_image: xcode9
      sudo: required
      env: SWIFT_SNAPSHOT=$SWIFT_4_DEV_SNAPSHOT

before_install:
  - git clone https://github.com/IBM-Swift/Package-Builder.git

script:
  - ./Package-Builder/build-package.sh -projectDir $TRAVIS_BUILD_DIR

My Package.swift:

// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "BioSwift",
    products: [
        // Products define the executables and libraries produced by a package, and make them visible to other packages.
        .library(
            name: "BioSwift",
            targets: ["BioSwift"]),
    ],
    dependencies: [
        .package(url: "https://github.com/valdirunars/BigIntCompress.git", from: "1.0.0"),
        .package(url: "https://github.com/attaswift/BigInt.git", from: "3.0.0")
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "BioSwift",
            dependencies: [ "BigInt", "BigIntCompress" ],
	    path: ".",
            sources: ["Sources"]),
        .testTarget(
            name: "BioSwiftTests",
            dependencies: ["BioSwift"]),
    ]
)

The gist of the output:

11.10s$ swift build
Cloning https://github.com/valdirunars/BigIntCompress.git
error: terminated(128): git clone --shared /Users/travis/build/valdirunars/BioSwift/.build/repositories/BigIntCompress.git-5255985680209734865 /Users/travis/build/valdirunars/BioSwift/.build/checkouts/BigIntCompress.git-5255985680209734865
error: product dependency 'BigInt' not found
error: product dependency 'BigIntCompress' not found
The command "swift build" exited with 1.
0.58s$ swift test
Cloning https://github.com/valdirunars/BigIntCompress.git
error: terminated(128): git clone --shared /Users/travis/build/valdirunars/BioSwift/.build/repositories/BigIntCompress.git-5255985680209734865 /Users/travis/build/valdirunars/BioSwift/.build/checkouts/BigIntCompress.git-5255985680209734865
error: product dependency 'BigInt' not found
error: product dependency 'BigIntCompress' not found
The command "swift test" exited with 1.
Done. Your build exited with 1.

Everything runs locally if I do
swift build,
swift test,
swift package resolve,
swift package update

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.