Giter Club home page Giter Club logo

verification-tests's Introduction

Cucumber based blackbox testing framework for OpenShift

Getting started

More info you can find in Overview document.

Create local dev environment

  1. Install git if not installed already, install ruby 2.7+ if not installed

  2. git clone [email protected]:openshift/verification-tests.git

  3. cd verification-tests

  4. tools/install_os_deps.sh # need sudo; you may need to login again to terminal if ruby was installed via rvm during this phase (see below for RVM usage)

  5. tools/hack_bundle.rb # normal user

  6. Install OKD or OpenShift Container Platform client tools

  7. Install the web driver if you desire to run tests which work with the Web UI. See Web Driver

Update local dev environment

bundle update

Test scenario execution

This is an example:

export BUSHSLICER_DEFAULT_ENVIRONMENT=ocp4
export OPENSHIFT_ENV_OCP4_HOSTS=api.*.openshift.com:lb
export OPENSHIFT_ENV_OCP4_USER_MANAGER_USERS=user1:redhat,user2:redhat
export OPENSHIFT_ENV_OCP4_ADMIN_CREDS_SPEC=file:///home/path-to/kubeconfig
export BUSHSLICER_CONFIG='
global:
  browser: chrome
environments:
  ocp4:
    version: "4.9.0"
    #api_port: 443	# For HA clusters, both 3.x and 4.x
    #api_port: 6443	# For non-HA 4.x clusters
    #api_port: 8443	# For non-HA 3.x clusters
    #web_console_url: https://console-openshift-console.apps.*.openshift.com
'

# execute a whole feature file
bundle exec cucumber features/cli/create.feature
# or execute a single scenario
bundle exec cucumber features/cli/create.feature:5
# or execute the smoke tests
bundle exec cucumber --tags @smoke

You can check which environments are defined in config/config.yaml.

You could also use the BUSHSLICER_CONFIG variable to override other configuration options. Add YAML/JSON into it and it will be merged with configuration file.

Debugging failures

If any step fails, you will fall into a pry shell where you can investigate what’s going on. This behavior depends on Cucumber profile that you enable during execution.

  1. running steps using step 'Step name'

  2. inspecting the @result variable

  3. calling and methods in World

Running tests from outside this repository

You can put your private test scenarios under features/tierN directory. It is in .gitignore so that you can keep your test scenarios under the same file system tree without git messing them up.

Contributing

Please submit issues and pull requests to the project. You can discuss and ask questions on OpenShift mailing list.

RVM for dependency management

If you are planning on installing dependencies for verification Tests on your system, it is often a good idea to use some kind of Version Manager/Package manager, like RVM.

RVM is analogous to virtualenv in python and it stands for Ruby Version Manager.

You can install RVM and read more abou it on https://rvm.io/

Usually once RVM is installed, you would want to create/install a new rvm interpreter using:

When we install Ruby 2.7.1, it creates a local directory for your user with Ruby 2.7.1 under `~/.rvm/rubies/ruby-2.7.1`.
Once that is done, the Gemset creation is basically an attempt to have dependencies for various apps under same interpreter `2.7.1`. So in this case,
we are creating Gemset `verification-tests` for this repo dependencies. If you had multiple repos, you would use similar command as above to create a new Gemset under 2.7.1
and give it a name that you can recognize. Then for each respective app you may choose to use different gemset as `rvm use 2.7.1@verification-tests` or `rvm use 2.7.1@my-other-repo-or-app`.

Feel free to read about interpreter and gemset in the Ruby docs or elsewhere on the internet.

Once ruby is installed, interpreter is created and gemset is present and activated, you can run `which ruby` to validate if the correct ruby is used and `ruby -v` to check version.
Following this, you may continue the steps as mentioned above, to run `bundle` commands to install gems listed in Gemfile to your Gemset.

Also if you are wondering what does `bundle` command do, search and read about `ruby bundler` on the internet.

verification-tests's People

Contributors

akostadinov avatar aleskandro avatar anpingli avatar anuragthehatter avatar duanwei33 avatar huiran0826 avatar jhou1 avatar jianzhangbjz avatar kasturinarra avatar liangxia avatar lihongan avatar lihongyan1 avatar miyadav avatar openshift-merge-robot avatar pruan-rht avatar qiaolingtang avatar rbbratta avatar ssshahan avatar sunzhaohua2 avatar weinliu avatar weliang1 avatar wewang58 avatar xiaocwan avatar xingxingxia avatar xiuwang avatar xiyunzhao avatar yanpzhan avatar yapei avatar zhaozhanqi avatar zhouying7780 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

Watchers

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

verification-tests's Issues

undefined method `split' for nil:NilClass (NoMethodError)

I got below errors when running the Given oc major.minor version is stored in the clipboard step:

    Given oc major.minor version is stored in the clipboard                                                                                  # features/step_definitions/cli.rb:7
      [05:37:15] INFO> Shell Commands: oc version --kubeconfig=/Users/jianzhang/workdir/mac-jianzhang/ocp4_admin.kubeconfig
      Client Version: 4.4.0-0.nightly-2020-02-17-211020
      Server Version: 4.4.0-0.nightly-2020-03-01-215047
      Kubernetes Version: v1.17.1
      
      [05:37:17] INFO> Exit Status: 0
      undefined method `split' for nil:NilClass (NoMethodError)
      /Users/jianzhang/project/verification-tests/features/step_definitions/cli.rb:10:in `/^oc major.minor version is stored in the(?: :(\S+))? clipboard$/'
      features/upgrade/olm/upgrade.feature:38:in `Given oc major.minor version is stored in the clipboard'

The step definition in features/step_definitions/cli.rb:7:

Given /^oc major.minor version is stored in the#{OPT_SYM} clipboard$/ do |cb_name|
  @result = user.cli_exec(:version)
  cb_name ||= "oc_version"
  cb[cb_name] = @result[:props][:oc_version].split(".")[0..1].join(".")
end

Migrate ImageContentSoucrePolicy to ImageDigestMirrorSet

OCPNODE-521 has been implemented and will ship with openshift 4.13.
This will introduce new CRD ImageDigestMirrorSet to redirect image pull for mirrored content.
It is planned that other openshift components rely on ImageContentSource to migrate to ImageDigestMirrorSet in OCP 4.14.
Could contributors who are familiar with ICSP use in the repository help with the migration?

This may need to cooperate PRs of openshift components that this repository relies on. I could help with that.

Unable to run it on Openshift

Hey, I'm running openshift 4.7 on Openstack. Configured with SSO login via google.
I'm unable to run the tests.
These are the environment variables i've set.

BUSHSLICER_DEFAULT_ENVIRONMENT=ocp4
OPENSHIFT_ENV_OCP4_HOSTS=<MY_MASTER_NODE>:master

I run this command for the test bundle exec cucumber features/logging/kibana.feature.

I get the following error:

Host object was not created with :node specified. (RuntimeError)
      /mnt/d/otherRepos/verification-tests-master/lib/host.rb:932:in `node'
...

result contain 'STDERR' information when host run command with 'oc debug'

/job/Runner-v3/50163/console

see above logs:
I want to run command '/sbin/ip\ route\ show\ default\ \|\ awk\ \'/default/\ \{print\ \$5\}\' on host. and get the result ens5, but the Result also included the following information:

      STDERR:
      Starting pod/ip-10-0-51-233us-east-2computeinternal-debug ...
      To use host binaries, run `chroot /host`
      
      Removing debug pod ...

@akostadinov

lib/rest_kubernetes.rb argument number

#88 is a great PR. Found an issue related to it: self.populate adds 4th argument type in method def but leaves all callings still only 3 arguments without 4th argument type. This makes below failure, like in the log:

wrong number of arguments (given 3, expected 4)
ArgumentError
/home/jenkins/workspace/Runner-v3/lib/rest_kubernetes.rb:8:in `populate'
/home/jenkins/workspace/Runner-v3/lib/rest_kubernetes.rb:79:in `create_pod_eviction'
/home/jenkins/workspace/Runner-v3/lib/rest.rb:101:in `delegate_rest_request'
/home/jenkins/workspace/Runner-v3/lib/rest.rb:27:in `exec'
/home/jenkins/workspace/Runner-v3/lib/api_accessor.rb:67:in `rest_request'
/home/jenkins/workspace/Runner-v3/lib/api_accessor_owner.rb:28:in `public_send'
/home/jenkins/workspace/Runner-v3/lib/api_accessor_owner.rb:28:in `block (2 levels) in '
/home/jenkins/workspace/Runner-v3/features/step_definitions/common.rb:26:in `/^I perform the :([a-z_]*?) rest request with:$/'
features/tierN/admin/pod.feature:480:in `When I perform the :create_pod_eviction rest request with:'

The api's are diverse. @akostadinov @pruan-rht any idea?

Step 4 tools/install_os_deps.sh fails on RHEL 8.1

While running the step 4 of the installation, the tools/install_os_deps.sh fails with the message:

Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)                                                                                                                            13 kB/s | 4.5 kB     00:00    
Red Hat Ansible Engine 2 for RHEL 8 x86_64 (RPMs)                                                                                                                                   11 kB/s | 4.0 kB     00:00    
Red Hat Enterprise Linux 8 for x86_64 - BaseOS (RPMs)                                                                                                                               11 kB/s | 4.1 kB     00:00    
Package bzip2-1.0.6-26.el8.x86_64 is already installed.
Package git-2.18.1-3.el8.x86_64 is already installed.
Package jq-1.5-12.el8.x86_64 is already installed.
Package make-1:4.2.1-9.el8.x86_64 is already installed.
Package patch-2.7.6-8.el8.x86_64 is already installed.
Package readline-7.0-10.el8.x86_64 is already installed.
Package which-2.21-10.el8.x86_64 is already installed.
Package zlib-1.2.11-10.el8.x86_64 is already installed.
Package zlib-devel-1.2.11-10.el8.x86_64 is already installed.
Error: 
 Problem: problem with installed package libssh-config-0.9.0-4.el8.noarch
  - installed package libssh-config-0.9.0-4.el8.noarch obsoletes libssh < 0.9.0-1 provided by libssh-0.8.5-2.el8.x86_64
  - package libssh-config-0.9.0-4.el8.noarch obsoletes libssh < 0.9.0-1 provided by libssh-0.8.5-2.el8.x86_64
  - problem with installed package libssh-0.9.0-4.el8.x86_64
  - package libssh-0.9.0-4.el8.x86_64 requires libcrypto.so.1.1(OPENSSL_1_1_1b)(64bit), but none of the providers can be installed
  - package openssl-devel-1:1.1.1-8.el8.x86_64 requires openssl-libs(x86-64) = 1:1.1.1-8.el8, but none of the providers can be installed
  - cannot install both openssl-libs-1:1.1.1c-2.el8.x86_64 and openssl-libs-1:1.1.1-8.el8.x86_64
  - cannot install the best candidate for the job
  - cannot install both openssl-libs-1:1.1.1-8.el8.x86_64 and openssl-libs-1:1.1.1c-2.el8.x86_64
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

The log associated with the error:

[2019-12-17 14:10:10] requirements_centos_libs_install
requirements_centos_libs_install () 
{ 
    __rvm_try_sudo yum install -y "$@" || return $?
}
current path: /usr/local/rvm/src/rvm
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/rvm/bin
command(11): requirements_centos_libs_install autoconf automake bison gcc-c++ libffi-devel libtool readline-devel ruby sqlite-devel openssl-devel
++ __rvm_try_sudo yum install -y autoconf automake bison gcc-c++ libffi-devel libtool readline-devel ruby sqlite-devel openssl-devel
++ typeset -a command_to_run
++ typeset sudo_path sbin_path missing_paths
++ command_to_run=("$@")
++ ((  UID == 0  ))
++ yum install -y autoconf automake bison gcc-c++ libffi-devel libtool readline-devel ruby sqlite-devel openssl-devel
Updating Subscription Management repositories.
Last metadata expiration check: 0:02:52 ago on Tue 17 Dec 2019 02:07:21 PM UTC.
Error: 
 Problem: problem with installed package libssh-config-0.9.0-4.el8.noarch
  - installed package libssh-config-0.9.0-4.el8.noarch obsoletes libssh < 0.9.0-1 provided by libssh-0.8.5-2.el8.x86_64
  - package libssh-config-0.9.0-4.el8.noarch obsoletes libssh < 0.9.0-1 provided by libssh-0.8.5-2.el8.x86_64
  - problem with installed package libssh-0.9.0-4.el8.x86_64
  - package libssh-0.9.0-4.el8.x86_64 requires libcrypto.so.1.1(OPENSSL_1_1_1b)(64bit), but none of the providers can be installed
  - package openssl-devel-1:1.1.1-8.el8.x86_64 requires openssl-libs(x86-64) = 1:1.1.1-8.el8, but none of the providers can be installed
  - cannot install both openssl-libs-1:1.1.1c-2.el8.x86_64 and openssl-libs-1:1.1.1-8.el8.x86_64
  - cannot install the best candidate for the job
  - cannot install both openssl-libs-1:1.1.1-8.el8.x86_64 and openssl-libs-1:1.1.1c-2.el8.x86_64
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
++ return 1
++ return 1

Version of OS:

$ cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.1 (Ootpa)

lib/rest_openshift.rb self.populate update

In 4.0 env, due to https://jira.coreos.com/browse/MSTR-306, Given I have a project fails with:

error getting self from api: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Unauthorized","reason":"Unauthorized","code":401}

Apply below diff, Given I have a project then passes.

       def self.populate(path, base_opts, opts)
-        populate_common("/oapi/<oapi_version>", path, base_opts, opts)
+        populate_common("/apis/user.openshift.io/<oapi_version>", path, base_opts, opts)
       end

Need update it considering 3.x compatibility
@akostadinov @pruan-rht could you help?
CC @zhouying7780 @wjiangjay @zihantang-rh

Failed to get the admin credentials

I got the following error on v4.2 auto testing, seems it cannot get the credentials

  Given the env is using multitenant or networkpolicy network                                                                                       # features/step_definitions/networking.rb:43
      [06:10:39] INFO> Remote cmd: `mkdir -v -p 'logs/2019/09/03/06:05:29'` @ssh://[email protected]
      
      [06:10:40] INFO> Exit Status: 0
      Net::SSH::ConnectionTimeout (Net::SSH::ConnectionTimeout)
      /home/jenkins/workspace/Runner-v3/lib/ssh.rb:251:in `initialize'
      /home/jenkins/workspace/Runner-v3/lib/host.rb:766:in `new'
      /home/jenkins/workspace/Runner-v3/lib/host.rb:766:in `ssh'
      /home/jenkins/workspace/Runner-v3/lib/host.rb:771:in `exec_raw'
      /home/jenkins/workspace/Runner-v3/lib/host.rb:488:in `mkdir'
      /home/jenkins/workspace/Runner-v3/lib/host.rb:93:in `workdir'
      /home/jenkins/workspace/Runner-v3/lib/host.rb:474:in `exec_as'
      /home/jenkins/workspace/Runner-v3/lib/host.rb:187:in `exec_admin'
      /home/jenkins/workspace/Runner-v3/lib/admin_credentials.rb:40:in `get'
      /home/jenkins/workspace/Runner-v3/lib/admin_credentials.rb:92:in `get'
      /home/jenkins/workspace/Runner-v3/lib/environment.rb:89:in `admin'
      /home/jenkins/workspace/Runner-v3/lib/world.rb:100:in `admin'
      /home/jenkins/workspace/Runner-v3/features/step_definitions/networking.rb:50:in `/^the env is using one of the listed network plugins:$/'
      /home/jenkins/workspace/Runner-v3/features/step_definitions/networking.rb:44:in `/^the env is using multitenant or networkpolicy network$/'
      features/networking/egress-ingress.feature:107:in `Given the env is using multitenant or networkpolicy network'

@akostadinov @pruan-rht
Could you help check this? thanks

Error from server (NotFound): replicationcontrollers "ldapserver-1" not found

Issue:
Getting error for every LDAP auto test cases.

Description:

As per 4.5 changes in the oc, The oc run command can now only be used to create Pods. So other resources are not created with it. Because of this replicationcontroller is not creating and auto is failing on check point.

Actual Result:

Failing with error

Error from server (NotFound): replicationcontrollers "ldapserver-1" not found

Expected Result:
It should not fail when in use "I have LDAP service in my project" in auto.

Additional Information:

$ oc version
Client Version: 4.5.0-rc.2
Server Version: 4.5.0-rc.7

Met "Selenium::WebDriver::Error::UnknownError" when launch auto for jenkins test cases with 3.11 cluster

See Runner-v3/39302/consoleFull
Runner-v3/39052/consoleFull

The error “Failed to decode response from marionette (Selenium::WebDriver::Error::UnknownError)”

Or [07:03:33] INFO> Launching Firefox Marionette/Geckodriver
invalid argument: can't kill an exited process (Selenium::WebDriver::Error::UnknownError)

This failure could be resolved with setting BUSHSLICER_CONFIG
global:
browser: chrome

undefined method `elif' for #<BushSlicer::DefaultWorld:0x0000000006294540> Did you mean? elsif NoMethodError

For the upgrading test(from 4.4 to 4.5), we get the below errors when running OCP-22618:

undefined method `elif' for #<BushSlicer::DefaultWorld:0x0000000006294540> Did you mean? elsif
NoMethodError
/home/jenkins/ws/workspace/Runner-v3/features/step_definitions/operators.rb:74:in `/^the marketplace works well$/'
/opt/rh/rh-ruby27/root/usr/share/ruby/forwardable.rb:235:in `invoke_dynamic_steps'
/home/jenkins/ws/workspace/Runner-v3/features/step_definitions/meta_steps.rb:48:in `block (2 levels) in '
/home/jenkins/ws/workspace/Runner-v3/lib/base_helper.rb:153:in `wait_for'
/home/jenkins/ws/workspace/Runner-v3/features/step_definitions/meta_steps.rb:43:in `/^I wait(?: up to ([0-9]+|<%=.+?%>) seconds)? for the steps to pass:$/'
features/upgrade/marketplace/upgrade.feature:23:in `And I wait up to 360 seconds for the steps to pass:'

Full logs: http://ci-qe-openshift.usersys.redhat.com/userContent/cucushift/v3/2021/02/24/16:20:21/upgrade_Marketplace_-_prepare/console.html
The cluster is 140396, I checked the log and it works as expected. And, based on my understanding, the original cluster is 4.4, and it should run this part: https://github.com/openshift/verification-tests/blob/master/features/step_definitions/operators.rb#L62-L73 and then return. But, I'm not sure why failed on this step: https://github.com/openshift/verification-tests/blob/master/features/step_definitions/operators.rb#L74

Cucumber "Background" keyword is not supported

Cucumber keyword is not supported in verification-tests

features/node/kata/install.feature: (7:3): expected: #TagLine, #ScenarioLine, #Comment, #Empty, got 'Background:' (Cucumber::Core::Gherkin::ParseError)
/usr/share/gems/gems/cucumber-core-8.0.1/lib/cucumber/core/gherkin/parser.rb:29:in block in document' /usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:64:in yield'
/usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:64:in block in yield_parse_errors' /usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:53:in each'
/usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:53:in yield_parse_errors' /usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:42:in rescue in block (2 levels) in messages'
/usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:27:in block (2 levels) in messages' /usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:79:in yield'
/usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:79:in block (2 levels) in sources' /usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:78:in each'
/usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:78:in block in sources' /usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:25:in each'
/usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:25:in each' /usr/share/gems/gems/cucumber-gherkin-15.0.2/lib/gherkin/stream/parser_message_stream.rb:25:in block in messages'
/usr/share/gems/gems/cucumber-core-8.0.1/lib/cucumber/core/gherkin/parser.rb:21:in each' /usr/share/gems/gems/cucumber-core-8.0.1/lib/cucumber/core/gherkin/parser.rb:21:in each'
/usr/share/gems/gems/cucumber-core-8.0.1/lib/cucumber/core/gherkin/parser.rb:21:in document' /usr/share/gems/gems/cucumber-core-8.0.1/lib/cucumber/core.rb:33:in block in parse'
/usr/share/gems/gems/cucumber-core-8.0.1/lib/cucumber/core.rb:32:in each' /usr/share/gems/gems/cucumber-core-8.0.1/lib/cucumber/core.rb:32:in parse'
/usr/share/gems/gems/cucumber-core-8.0.1/lib/cucumber/core.rb:24:in compile' /usr/share/gems/gems/cucumber-5.3.0/lib/cucumber/runtime.rb:79:in run!'
/usr/share/gems/gems/cucumber-5.3.0/lib/cucumber/cli/main.rb:29:in execute!' /usr/share/gems/gems/cucumber-5.3.0/bin/cucumber:9:in <top (required)>'
/home/valiev/bin/cucumber:23:in load' /home/valiev/bin/cucumber:23:in <top (required)>'
/usr/share/gems/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:75:in load' /usr/share/gems/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:75:in kernel_load'
/usr/share/gems/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:28:in run' /usr/share/gems/gems/bundler-1.16.1/lib/bundler/cli.rb:424:in exec'
/usr/share/gems/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/command.rb:27:in run' /usr/share/gems/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in invoke_command'
/usr/share/gems/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor.rb:387:in dispatch' /usr/share/gems/gems/bundler-1.16.1/lib/bundler/cli.rb:27:in dispatch'
/usr/share/gems/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/base.rb:466:in start' /usr/share/gems/gems/bundler-1.16.1/lib/bundler/cli.rb:18:in start'
/usr/share/gems/gems/bundler-1.16.1/exe/bundle:30:in block in <top (required)>' /usr/share/gems/gems/bundler-1.16.1/lib/bundler/friendly_errors.rb:122:in with_friendly_errors'
/usr/share/gems/gems/bundler-1.16.1/exe/bundle:22:in <top (required)>' /usr/bin/bundle:23:in load'
/usr/bin/bundle:23:in `

'
[12:10:32] INFO> === At Exit ===

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.