Giter Club home page Giter Club logo

ruby-orb's Introduction

Ruby Orb

CircleCI Build Status CircleCI Orb Version GitHub License CircleCI Community

Easily cache and install your Ruby Gems automatically, run parallel RSpec tests or Rubocop checking, or just install Ruby.

Usage

Example use-cases are provided on the orb registry page. Source for these examples can be found within the src/examples directory.

Example

View the CircleCI Ruby Rails Demo app complete with full config utilizing our Node and Ruby orbs. https://github.com/CircleCI-Public/circleci-demo-ruby-rails/

Resources

CircleCI Orb Registry Page - The official registry page of this orb for all versions, executors, commands, and jobs described.
CircleCI Orb Docs - Docs for using and creating CircleCI Orbs.

How to Contribute

We welcome issues to and pull requests against this repository!

How to Publish An Update

  1. Merge pull requests with desired changes to the main branch.
  2. Find the current version of the orb.
    • You can run circleci orb info circleci/ruby | grep "Latest" to see the current version.
  3. Create a new Release on GitHub.
    • Click "Choose a tag" and create a new semantically versioned tag. (ex: v1.0.0)
      • We will have an opportunity to change this before we publish if needed after the next step.
  4. Click "+ Auto-generate release notes".
    • This will create a summary of all of the merged pull requests since the previous release.
    • If you have used Conventional Commit Messages it will be easy to determine what types of changes were made, allowing you to ensure the correct version tag is being published.
  5. Now ensure the version tag selected is semantically accurate based on the changes included.
  6. Click "Publish Release".
    • This will push a new tag and trigger your publishing pipeline on CircleCI.

ruby-orb's People

Contributors

2shortplanks avatar amithkk avatar dsayling avatar elliterate avatar ericribeiro avatar felicianotech avatar hrytsiuk avatar irolia avatar jabsci avatar jaryt avatar joerodrig avatar jsharpe-ctm avatar kelvintaywl avatar ksylvest avatar kyletryon avatar lanzhiheng avatar lokst avatar meanmachin3 avatar micahvdk avatar nanophate avatar natashahull avatar olleolleolle avatar r7kamura avatar rsanheim avatar semanticallynull avatar tadashi0713 avatar teka23 avatar viveksoundrapandi avatar vzvu3k6k avatar yuki-inoue 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

Watchers

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

ruby-orb's Issues

Getting version from `.ruby-version`

Describe Request:

When no version is specified for ruby/install, it would be great if the Ruby version from .ruby-version file in the repository is used. This would make sure that, when upgrading the Ruby version of a project, we would only have to make a change in one file.

Examples:

version: 2.1
orbs:
  ruby: circleci/ruby@1
jobs:
  build:
    docker:
      - image: cimg/base:stable
    steps:
      - checkout
      # When a Ruby version is not specified, the version from .ruby-version will be used
      - ruby/install

Supporting Documentation Links:

bundler not utilizing cache

Orb version:

circleci/[email protected]

What happened:

Even though the cache seems to be restored successfully, bundler fetches gems each time.

Expected behavior:

bundler should not download gems each time

Additional Information:

I rerun the workflow and each time bundler downloads gems. No other changes are being made to the branch and the Gemfile.lock remains unchanged.

version: 2.1
orbs:
  ruby: circleci/[email protected]

jobs:
  build:
    docker:
      - image: cimg/ruby:2.7.2-browsers
    executor: ruby/default
    steps:
      - checkout
      - ruby/install-deps

image

History not working between runs

Orb Version
1.0.0

Describe the bug

When running ruby/rspec-test we consistently get the following message:

Error reading historical timing data: file does not exist
 
Requested weighting by historical based timing, but they are not present. Falling back to weighting by name.

I see the following running after the tests:

Archiving the following test results
  * /tmp/test-results/rspec/results.xml

Uploaded

I can confirm this file exists in artifacts.

To Reproduce

Unfortunately I don't have a simplified / public reproduction scenario.

Expected behavior

For it to be able to use historical information as intended.

Additional context

None

install steps fails on osx - maybe orbs (in general) need a way to mark which architectures are supported?

Using 1.1.4 on a macOS container:

jobs:
  foo:
     steps:
      - ruby/install:
          version: 2.7.4
      - ruby/install-deps

Install steps fails with:

/bin/bash: line 6: gpg: command not found
Network error: Unable to receive GPG keys. Will attempt again (1/3)
/bin/bash: line 6: gpg: command not found
Network error: Unable to receive GPG keys. Will attempt again (2/3)
/bin/bash: line 6: gpg: command not found
Unable to receive GPG keys, FAILING

Exited with code exit status 1
CircleCI received exit code 1

Fixed by manually doing:

brew install gnupg

Shouldn't need to do that. The plugin should handle it.

After doing that, it fails with:

#!/bin/bash --login -eo pipefail
rvm install 2.7.4
rvm use 2.7.4
echo . $(rvm 2.7.4 do rvm env --path) >> $BASH_ENV

Required ruby-2.7.4 is not installed.
To install do: 'rvm install "ruby-2.7.4"'
Warning! PATH is not properly set up, /Users/distiller/.gem/ruby/2.7.3/bin is not at first place.
         <log>Usually this is caused by shell initialization files. Search for <code>PATH=...</code> entries.
         You can also re-add RVM to your profile by running: <code>rvm get stable --auto-dotfiles</code>
         To fix it temporarily in this shell session run: <code>rvm use 2.7.3</code>
         To ignore this error add <code>rvm_silence_path_mismatch_check_flag=1</code> to your <code>~/.rvmrc</code> file.
Searching for binary rubies, this might take some time.
No binary rubies available for: osx/11.4/x86_64/ruby-2.7.4.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
Checking requirements for osx.
Required ruby-2.7.4 is not installed.
ERROR: 'To install do: 'rvm install "ruby-2.7.4"'
/usr/local/bin' is not writable - it is required for Homebrew, try 'brew doctor' to fix it!
Requirements installation failed with status: 1.

Exited with code exit status 1
CircleCI received exit code 1

New cache key required for Ruby 3.1.3

Orb version:

2.0.0

What happened:

When I create a PR to upgrade the Ruby version (and some gems) of a Rails app from 3.1.2 to 3.1.3, CircleCI workflows fail.

I'm using cimg/ruby:3.1.3-browsers image and the following "install gems" step which has worked fine until now:

ruby/install-deps:
  include-branch-in-cache-key: false

But I get these errors in my "Prepare database" step:

#!/bin/bash -eo pipefail
dockerize -wait tcp://localhost:5432 -timeout 1m
bundle exec rails db:create db:schema:load

2022/12/06 11:26:10 Waiting for: tcp://localhost:5432
2022/12/06 11:26:10 Connected to tcp://localhost:5432
rails aborted!
LoadError: libssl.so.1.1: cannot open shared object file: No such file or directory - /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-5.6.5/lib/puma/puma_http11.so
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.15.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.15.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-5.6.5/lib/puma.rb:13:in `<main>'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.15.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.15.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/circleci/project/config/application.rb:24:in `<main>'
/home/circleci/project/Rakefile:6:in `require_relative'
/home/circleci/project/Rakefile:6:in `<main>'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/railties-7.0.4/lib/rails/commands/rake/rake_command.rb:20:in `block in perform'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/railties-7.0.4/lib/rails/commands/rake/rake_command.rb:18:in `perform'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/railties-7.0.4/lib/rails/command.rb:51:in `invoke'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/railties-7.0.4/lib/rails/commands.rb:18:in `<main>'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.15.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/circleci/project/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.15.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
bin/rails:12:in `<main>'
(See full trace by running task with --trace)

Exited with code exit status 1
CircleCI received exit code 1

If I force a new cache key using the following, the errors do not occur.

ruby/install-deps:
  include-branch-in-cache-key: false
  key: 'v1-gems-{{ checksum "Gemfile.lock" }}'

But why do I need to force a new cache key? The PR in question updates a number of files including:

  • Gemfile
  • Gemfile.lock
  • .ruby-version

I would have expected these changes to trigger a new cache, as it has done in the past.

This issue seems specific to the Ruby 3.1.3 upgrade, I have completed gem and Ruby upgrades in the past using this setup without the need to set a new cache key..

Expected behavior:

I expected the default internal caching behaviour of this Orb to not require a new cache key to be set, when a branch upgrades the Ruby version and multiple gems.

Is the internal cache key not already based on Gemfile.lock? Why isn't this working?

Additional Information:

Am I missing something about the default caching behaviour here? I want to use the default recommended setup, but am being forced to create a new cache key. Maybe there's a better way of clearing this cache?

sks-keyservers isn't available so ruby-orb doesn't work at all

Orb version:

1.1.3

What happened:

sks-keyservers that is used in ruby-orb isn't available.

gpg: keyserver receive failed: No name
Network error: Unable to receive GPG keys. Will attempt again (1/3)
gpg: keyserver receive failed: No name
Network error: Unable to receive GPG keys. Will attempt again (2/3)
gpg: keyserver receive failed: No name
Unable to receive GPG keys, FAILING

Expected behavior:

ruby-orb should use an available keyserver instead.

Additional Information:

An option that is suggested in #70 would be helpful to avoid stuck in this situation.

Add app-dir paramater

Describe Request:

In my company we are using a monorepo, meaning we have a structure like this:

packages
├── backend
├── frontend
├── midend

Our Gemfile is within the backend folder. This orb assumes Gemfile is at the root of the repository, which is not the case here. Like the node orb, an app-dir would be welcome.

Examples:

jobs:
  build:
    docker:
     - image: cimg/ruby:2.7-node
  steps:
    - checkout
    - ruby/install-deps:
        app-dir: packages/backend

Bundle --path deprecated in Bundler 2.1+

Orb version:

1.1.1

What happened:

"Bug" is a strong word, but in order to be forward-compatible, the bundle [cmd]--path commands should instead be prefixed with something like bundle config set path '$BUNDLE_PATH'.

Expected behavior:

bundle install and other bundle commands run without issues, instead of throwing this deprecation warning:

[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set path './vendor/bundle'`, and stop using this flag

Additional Information:

Allow additional fallback cache key when restoring gems

Is your feature request related to a problem? Please describe.
Right now the cache key always consists of at least Gemfile.lock checksum - this means as soon as one gem is added to the bundle the entire cache is invalidated.

- restore_cache:
keys:
- << parameters.key >>-{{ checksum "./Gemfile.lock" }}-{{ .Branch }}
- << parameters.key >>-{{ checksum "./Gemfile.lock" }}

This approach has the advantage that the bundle is always automatically as small as possible (i.e. no outdated gem versions are present). However, in large(er) code bases w/ several hundreds of dependencies (and automatic dependency management w/ e.g. https://dependabot.com/) this quickly becomes a bottleneck since bundling can easily take up a couple minutes. The advantage of avoiding the time it takes to bundle everything far outweighs the (tiny) speedup due to smaller cache size (and faster download of archived cache).

Describe the solution you'd like
It would be great if the default configuration added an additional fallback cache key (i.e. << parameters.key >>-) - like e.g. this orb: https://circleci.com/orbs/registry/orb/valimail/dependency-manager

should be able to configure the keyserver used in gpg commands

Describe Request:

gpg takes a flag: --keyserver hkp://pool.sks-keyservers.net
Allow me to set that with a parameter to the install step in the event the default server has fallen over and blocks all builds like it is right now.

Examples:

Supporting Documentation Links:

man gpg

Latest release (according to github) is 0.2.2

GitHub reports that the latest release is 0.2.2 but there have been at least 12 tags since 0.2.2. (Latest is 1.1.3, I believe)

image

I think the preferred solution is to properly create releases and leverage github's functionality.

But barring that, if GitHub Releases are not going to be used, then the existing releases should be deleted so that github isn't portraying an inaccurate representation. And then the Releases section should be removed from the repo homepage (if this repo isn't going to use Releases)

Errors on non circle images - runs as root and sources wrong bash profile

Orb version:

0.2.2

What happened:

There's seems to be an issue with the installation when using non-circle provided images as it will attempt to source the bash profile from root providing this error:

rvm install 2.7
rvm use 2.7
echo . $(rvm 2.7 do rvm env --path) >> $BASH_ENV

/tmp/.bash_env-60a2b2cc3b59b77b9bec7a64-0-build: line 2: /root/.rvm/scripts/rvm: No such file or directory
/bin/bash: rvm: command not found

Exited with code exit status 127

I'd contacted circle support and this was the response:

I believe the issue here with RVM is that the installation is run as the root as opposed to an unprivileged user or with sudo. The Orb does not appear to account for that. I've created a custom run step based on the Orb that should get RVM installed and running on that image. I also removed a few parts for brevity.

      - run: |
          # Disable IPv6
          mkdir -p ~/.gnupg/
          find ~/.gnupg -type d -exec chmod 700 {} \;
          echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf
          until gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
          curl -sSL "https://get.rvm.io" | bash -s stable
          # this should be what needs to be added to that $BASH_ENV since this is what's in bash_profile - i dont know when $HOME is set
          echo "source /etc/profile.d/rvm.sh" >> $BASH_ENV
          # this will source if anyone logs in noninteractively, nvm setup only adds nvm to the path, to get the rubygems later you need to source this again
          echo "source /etc/profile.d/rvm.sh" >> .bashrc
      - run: |
          rvm install 2.7
          rvm use 2.7
The only thing that actually needed to change here was the source commands. The Orb makes use of the following based upon a user install:

echo "source $HOME/.rvm/scripts/rvm" >> $BASH_ENV
echo "source $HOME/.rvm/scripts/rvm" >> ~/.bashrc
I changed that to make use of the multi-user installation location for RVM:

echo "source /etc/profile.d/rvm.sh" >> $BASH_ENV
echo "source /etc/profile.d/rvm.sh" >> .bashrc

Expected behavior:

Conditional logic to select the correct bash profile and run it at such

Failing to import gpg keys for rvm

Orb Version
1.0.5

Describe the bug
Ruby install fails with the following details

gpg: keyserver receive failed: Cannot assign requested address
Network error: Unable to receive GPG keys. Will attempt again (1/3)
gpg: keyserver receive failed: Cannot assign requested address
Network error: Unable to receive GPG keys. Will attempt again (2/3)
gpg: keyserver receive failed: Cannot assign requested address
Unable to receive GPG keys, FAILING

This RVM issue may provide a reason why

rvm/rvm#4215

To Reproduce
run ruby/install step

Expected behavior
Should import keys with no problem

Additional context

panic: runtime error: index out of range [0] with length 0 is occured

Orb version:

1.4.1

What happened:

panic: runtime error: index out of range [0] with length 0 is occured when ruby/rspec-test is running. Below is yaml.

- ruby/rspec-test:
    include: spec/**/*_spec.rb spec/**/**/*_spec.rb

Expected behavior:

There is no panic.

Additional Information:

I think this PR is cause.

Run bundle clean in install-deps

This is suggested in the docs and was part of this PR.

After bundle install, run bundle clean --force, because:

Since Bundler uses system gems that are not explicitly specified, it is non-deterministic, and partial cache restoration can be unreliable.

To prevent this behavior, add a step that cleans Bundler before restoring dependencies from cache.

And keep the cache smaller.

Or at least make this an option.

Install-deps caches entire project directory

Orb Version
1.0.0

Describe the bug
The ruby/install-deps command caches the entire project directory instead the bundle path. Because of this, the cache overrides the code grabbed from the checkout step.

To Reproduce

  1. Add ruby/install-deps to the circleci config with caching enabled
    • Add this step after the checkout step
  2. Run the build
  3. Commit new code
  4. Run the build
  5. Open SSH to the build and view ~/project files to find updated code from step 3 (not present)

Expected behavior
Only the bundle dependencies are cached.

Additional context
Also will probably solve #19

Code Location:

steps:
- when:
condition: <<parameters.with-cache>>
steps:
- restore_cache:
keys:
- << parameters.key >>-{{ checksum "<< parameters.path >>/Gemfile.lock" }}-{{ .Branch }}
- run:
name: Bundle Install <<^parameters.with-cache>>(No Cache)<</parameters.with-cache>>
command: |
if ! echo $(bundle version) | grep -q <<parameters.bundler-version>>; then
echo "Installing bundler <<parameters.bundler-version>>"
gem install bundler:<<parameters.bundler-version>>
else
echo "bundler <<parameters.bundler-version>> is already installed."
fi
bundle install
- when:
condition: <<parameters.with-cache>>
steps:
- save_cache:
key: << parameters.key >>-{{ checksum "<< parameters.path >>/Gemfile.lock" }}-{{ .Branch }}
paths:
- << parameters.path >>

Additional suggestion
One suggestion would be to remove the << parameters.path >> from the Gemfile checksum and add bundle config set path << parameters.path >> before bundle install.

OR

In the ruby/install-deps command, the bundler should be setup using a << parameters.bundle_path >> similar to #21. Then the save_cache step in should use that bundle path.

parameters:
# ... Lines 3-18 same ...
  bundle_path:
    description: The gem bundle installation path
    type: string
    default: vendor/bundle

steps:
# ... Lines 19-25 same ...
  - run:
      name: Bundle Install <<^parameters.with-cache>>(No Cache)<</parameters.with-cache>>
      command: |
          # ... Lines 29-34 same ...
          bundle config set path << parameters.bundle_path >>
          bundle install
  - when:
      condition: <<parameters.with-cache>>
      steps:
        - save_cache:
            key: << parameters.key >>-{{ checksum "<< parameters.path >>/Gemfile.lock"  }}-{{ .Branch }}
            paths:
              - << parameters.bundle_path >>

Add warning for attempting to split by test timing when parallelism is set to 1

Describe Request:

CircleCI CLI test splitting by timing has a somewhat cryptic error is parallelism is set to 1

Error reading historical timing data: file does not exist
Requested weighting by historical based timing, but they are not present. Falling back to weighting by name.

We can check $CIRCLE_NODE_TOTAL > 1 and output a warning the split by test timings requires parallelism to generate historical timing data.

Supporting Documentation Links:

https://circleci.com/docs/2.0/parallelism-faster-jobs/#splitting-by-timing-data

Dependencies not installed when using bundler 2.2.15

Orb version:

1.1.12

What happened:

When using Bundler 2.2.15 in my gemfile it bundle check even though there's no dependencies installed so it never installs gems.

Here's a commit that fixes it in my project by pinning to a younger bundler version (2.1.4) https://github.com/sharpstone/cutlass/pull/1/commits/a32622ab5bd825f86e9c33808008347a1f420995

From Circle:

if test -f "Gemfile.lock"; then
  APP_BUNDLER_VERSION=$(cat Gemfile.lock | tail -1 | tr -d " ")
  if [ -z "$APP_BUNDLER_VERSION" ]; then
    echo "Could not find bundler version from Gemfile.lock. Please use bundler-version parameter"
  else
    echo "Gemfile.lock is bundled with bundler version $APP_BUNDLER_VERSION"
  fi
fi

if ! [ -z  ]; then
  echo "Found bundler-version parameter to override"
  APP_BUNDLER_VERSION=
fi

if ! echo $(bundle version)  | grep -q $APP_BUNDLER_VERSION; then
  echo "Installing bundler $APP_BUNDLER_VERSION"
  gem install bundler:$APP_BUNDLER_VERSION
else
  echo "bundler $APP_BUNDLER_VERSION is already installed."
fi

if [ "./vendor/bundle" == "./vendor/bundle" ]; then
  bundle check --path ./vendor/bundle || bundle install --deployment
else
  bundle check --path ./vendor/bundle || bundle install --path=./vendor/bundle
fi

Gemfile.lock is bundled with bundler version 2.2.15
Installing bundler 2.2.15
Fetching bundler-2.2.15.gem
Successfully installed bundler-2.2.15
1 gem installed
[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local path './vendor/bundle'`, and stop using this flag
The Gemfile's dependencies are satisfied

CircleCI received exit code 0

Expected behavior:

Ideally, the gems in my Gemfile get installed

Additional Information:

Test file globbing does not recurse correctly

Orb version:

1.4.0

What happened:

We noticed that test coverage on our Ruby app dropped from ~90% to ~50%.

Expected behavior:

All tests should be run.

Additional Information:

I ran the job with SSH, and noticed that circleci tests glob spec/**/*_spec.rb wasn't listing all the _spec.rb files under spec/, but stopping at those in the first level of folders.

Looking back to previous test runs, where the coverage was at normal levels, I noticed that the argument to circleci tests was quoted:

TESTFILES=$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)

Whereas with the current version of the orb, those quotes are missing:

TESTFILES=$(circleci tests glob spec/**/*_spec.rb | circleci tests split --split-by=timings)

I suspect after PR #85 the globbing is being carried out by the shell rather than circleci test, and ** does not mean the same in the shell as it does in circleci test.

Feature Request: Support cacheing gems.locked

Is your feature request related to a problem? Please describe.
Bundler is now migrating from Gemfile/Gemfile.lock to gems.rb/gems.locked. Using the new naming causes the cacheing to fail due to Gemfile.lock not existing.

https://depfu.com/blog/2017/09/06/gemfiles-new-clothes

Describe the solution you'd like
Either:
a) preferentially cache gems.locked, falling back to Gemfile.lock (in line with bundler behaviour), or
b) mimic the behaviour of the circleci/node orb, which allows the user to specify the lockfile for the checksum

Describe alternatives you've considered
I'll be switching back to Gemfile.lock in the meantime until the new naming convention is better supported, so it's not a blocker.

Additional context

Use gemspec instead of Gemfile.lock

Describe Request:

In a repo that is released as a gem, I do not have a Gemfile.lock checked in, but I would like to use checksum of foo.gemspec as part of the cache key.

The normal case is still Gemfile.lock so the gemspec could be used as a fallback, or at least have a way of using with-cache: true without having a Gemfile.lock

Examples:

Supporting Documentation Links:

bundle install --path is deprecated in Bundler 2.1 versions

Orb Version
0.2.1

Describe the bug

"Bug" is a strong word, but in order to be forward-compatible, the bundle install --path vendor/bundle should become BUNDLE_PATH=vendor/bundle bundle install, instead.

To Reproduce

Read orb source around line 40 for the bundle install command https://circleci.com/orbs/registry/orb/circleci/ruby#orb-source

Expected behavior

A bundle install without the --path option.

Additional context

This issue in Capistrano details and links to the Bundler issue:

capistrano/bundler#115

Cache is not working when path is outside of the project directory

Orb Version
The version number of the orb

1.0.0

Describe the bug

When I run ruby/install-deps with path: /home/circleci/.gem/ruby/2.5.0, I get an error in Restoring cache and Storing cache.

- ruby/install-deps:
     path: /home/circleci/.gem/ruby/2.5.0

The error is below.

Error computing cache key: template: cacheKey:1:11: executing "cacheKey" at <checksum "/home/circleci/.gem/ruby/2.5.0/Gemfile.lock">: error calling checksum: open /home/circleci/.gem/ruby/2.5.0/Gemfile.lock: no such file or directory

To Reproduce

Run ruby/install-deps with path: /home/circleci/.gem/ruby/2.5.0

Expected behavior

Succeed Restoring cache and Storing Cache

Additional context

Task `run-tests` does not work with Bundler 2.1.4

Orb Version
0.2.2

Describe the bug
After the change introduced in #18 the deprecation warning goes away and the gems are installed in the correct path, but at least on bundler 2.1.4 setting the BUNDLE_PATH does not seem to make the configuration persistent, so running ruby/run-tests fails as bundler can't find the rspec executable.

To Reproduce
Using bundler version 2.1.4, call these steps in the following order:

  1. ruby/load-cache
  2. ruby/install-deps
  3. ruby/save-cache (saves on the wrong path if path overwritten on step 2, as described on #19)
  4. ruby/run-tests - fail to run as the rspec executable can't be found by Bundler

Screen Shot 2020-05-05 at 4 48 19 pm

Expected behavior
Step 4 above runs successfully.

Additional context
My current workaround:

Running this before the steps mentioned above.

      - run:
          name: Setup bundler
          command: |
            bundle config set path vendor/bundle

'ruby/install' doesn't respect version param

Orb Version
1.0

Describe the bug

Followed instructions to have ruby installed. Ruby not installed.

To Reproduce

Use barebones example:

jobs:
  build:
    docker:
      - image: 'cimg/base:stable'
    steps:
      - checkout
      - ruby/install:
          version: '2.6.6'
      - run: echo "Ruby 2.6.6 has been installed"
orbs:
  ruby: circleci/[email protected]
version: 2.1

Expected behavior

ruby 2.6.6 would be installed

Additional context

It's pretty obvious from the code. The install step doesn't even use the version param except in the name of the step.

Test results are being stored in the wrong directory

Orb Version
0.2.1

Describe the bug
For circleci tests split to work, test results should be stored in test-results/rspec/results.xml. In 0.2.1, they are being stored in test-results/rspec.xml instead.

To Reproduce
Run the tests with ruby/run-tests.

Expected behavior
circleci tests split should be able to retrieve timing data accurately.

Actual behavior
circleci tests split complains about timing data not being available.

Additional context
https://circleci.com/docs/2.0/configuration-reference/#example-6

Provide a Changelog

Describe Request:

A Changelog helps users track what changed between releases, making it easier to discern if the current configuration can be updated as-is or if configuration changes are needed.

Examples:

1.5.0:

  • Allow users to configure bundler in the install-deps step, implements #88

Cannot install Ruby with RVM - Operation not permitted could not set group

Orb Version
The version number of the orb

0.2.1

Describe the bug

Build fails while trying to ruby/install

#!/bin/bash -eo pipefail
# Fix for retrieving GPG over IPv6 issue
mkdir ~/.gnupg && echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf
curl -sSL https://rvm.io/mpapis.asc | gpg --import -
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -

curl -sSL "https://get.rvm.io" | bash -s stable
adduser $(whoami) rvm
source /etc/profile.d/rvm.sh
rvm install 2.5.5
rvm use 2.5.5 default

echo 'source /etc/profile.d/rvm.sh' >> $BASH_ENV

mkdir: cannot create directory ‘/home/circleci/.gnupg’: File exists
gpg: key D39DC0E3: "Michal Papis (RVM signing) <[email protected]>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg: key 39499BDB: public key "Piotr Kuczynski <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
Downloading https://github.com/rvm/rvm/archive/1.29.9.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.9/1.29.9.tar.gz.asc
gpg: Signature made Wed 10 Jul 2019 08:31:02 AM UTC using RSA key ID 39499BDB
gpg: Good signature from "Piotr Kuczynski <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7D2B AF1C F37B 13E2 069D  6956 105B D0E7 3949 9BDB
GPG verified '/opt/circleci/.rvm/archives/rvm-1.29.9.tgz'
Creating group 'rvm'
Upgrading the RVM installation in /opt/circleci/.rvm/
chown: changing group of ‘/opt/circleci/.rvm/man/man1/rvm.1.gz’: Operation not permitted
    could not set group of '/opt/circleci/.rvm/man/man1/rvm.1.gz', prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
chown: changing group of ‘/opt/circleci/.rvm/man/man1/rvm.1’: Operation not permitted
    could not set group of '/opt/circleci/.rvm/man/man1/rvm.1', prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
    Found 5498 files not belonging to 'rvm',
use `--debug` to see the list, run `rvmsudo rvm get stable` to fix it., prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
    Found 976 directories with mode different than '775',
use `--debug` to see the list, run `rvmsudo rvm get stable` to fix it., prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
    Found 3445 files with mode different than '664' or '775',
use `--debug` to see the list, run `rvmsudo rvm get stable` to fix it., prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
Upgrade of RVM in /opt/circleci/.rvm/ is complete.

<warn>Thanks for installing RVM 🙏</warn>
Please consider donating to our open collective to help us maintain RVM.

👉  Donate: <code>https://opencollective.com/rvm/donate</code>

To Reproduce

Here's my config.yml

version: 2.1
orbs:
  buildpacks: jkutner/[email protected]
  ruby: circleci/[email protected]
jobs:
  build:
    machine: true
    steps:
      - buildpacks/install-pack:
          version: "0.7.0"
      - checkout
      - ruby/install:
          version: 2.5.5
      - run:
          command: |
            bundle install
            bundle exec rake hatchet:setup_ci
      - run:
          command: |
            rspec spec/cnb/

workflows:
  main:
    jobs:
      - build

Expected behavior

I pushed and expect to be able to use Ruby 2.5.5. Instead I got an error

Additional context
URL of the build: https://circleci.com/gh/heroku/heroku-buildpack-ruby/1033

It's also worth noting that the "prep for RVM" step also failed:

#!/bin/bash -eo pipefail
# Fix for retrieving GPG over IPv6 issue
mkdir ~/.gnupg && echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf
curl -sSL https://rvm.io/mpapis.asc | gpg --import -
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -

curl -sSL "https://get.rvm.io" | bash -s stable
adduser $(whoami) rvm
source /etc/profile.d/rvm.sh
rvm install 2.5.5
rvm use 2.5.5 default

echo 'source /etc/profile.d/rvm.sh' >> $BASH_ENV

mkdir: cannot create directory ‘/home/circleci/.gnupg’: File exists
gpg: key D39DC0E3: "Michal Papis (RVM signing) <[email protected]>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg: key 39499BDB: public key "Piotr Kuczynski <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
Downloading https://github.com/rvm/rvm/archive/1.29.9.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.9/1.29.9.tar.gz.asc
gpg: Signature made Wed 10 Jul 2019 08:31:02 AM UTC using RSA key ID 39499BDB
gpg: Good signature from "Piotr Kuczynski <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7D2B AF1C F37B 13E2 069D  6956 105B D0E7 3949 9BDB
GPG verified '/opt/circleci/.rvm/archives/rvm-1.29.9.tgz'
Creating group 'rvm'
Upgrading the RVM installation in /opt/circleci/.rvm/
chown: changing group of ‘/opt/circleci/.rvm/man/man1/rvm.1.gz’: Operation not permitted
    could not set group of '/opt/circleci/.rvm/man/man1/rvm.1.gz', prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
chown: changing group of ‘/opt/circleci/.rvm/man/man1/rvm.1’: Operation not permitted
    could not set group of '/opt/circleci/.rvm/man/man1/rvm.1', prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
    Found 5498 files not belonging to 'rvm',
use `--debug` to see the list, run `rvmsudo rvm get stable` to fix it., prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
    Found 976 directories with mode different than '775',
use `--debug` to see the list, run `rvmsudo rvm get stable` to fix it., prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
    Found 3445 files with mode different than '664' or '775',
use `--debug` to see the list, run `rvmsudo rvm get stable` to fix it., prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug.
Upgrade of RVM in /opt/circleci/.rvm/ is complete.

<warn>Thanks for installing RVM 🙏</warn>
Please consider donating to our open collective to help us maintain RVM.

👉  Donate: <code>https://opencollective.com/rvm/donate</code>


adduser: Only root may add a user or group to the system.

Exited with code exit status 1

Monorepo support

Is your feature request related to a problem? Please describe.
Currently, ruby-orb does not support monorepo.

Describe the solution you'd like
Add monorepo support.

Allow configuration of bundler

Describe Request:

Allow for a user supplied bundler configuration to be executed between installing bundler and running bundle install.

Example use case: The repository being tested uses a private gem server which requires authorization. Or freezing the bundle before installation.

Add rubocop command

There are too many project protect their code quality by integrating Rubocop, It might be a good chance to add associate command in this ORB.

Add no_output_timeout parameter to rspec-test

Describe Request:

I was hoping we could emulate the no_output_timeout from the run command to be on the rspec-test command.

Examples:

On really large test suites, it will exceed the default 10m timeout that circleci imposes, which will cause it to fail out.

Do not include branch in cache key for install-deps

My dev cycle is:

  • Create a branch off master
  • Make changes (usually without changing gems)
  • Commit and push the branch to git
  • See test results on CircleCI
  • If good, merge to master

Currently, install-deps bases its cache key on the checksum of Gemfile.lock and the branch name. The result is that every time I follow the process above, I'm creating a new cache entry and using up more storage, even when I haven't changed the gems.

I suggest instead that it be based solely on the checksum. If there are other flows that make it useful to include the branch, perhaps this can be an option.

Add issue and pull request templates

We could add this to have consistency across all other orbs project. I would like to pick this up. Please consider adding the orbtoberfest label on the issue

Allow specifying glob for rspec-tests command

Describe Request:

We want to collect test coverage from just our "unit" tests, not including end-to-end tests. So we separate them into 2 test phases. It would be nice if we could pass a custom glob pattern in order to separate these out. Right now the rspec-test command from the orb only supports running all rspec tests. Or we would need to set a custom env variable to exclude tests within our test suite, but this messes with the test timings.

Examples:

TEST_FILES="$(circleci tests glob "spec/features/**/*_spec.rb" | \
  circleci tests split --split-by=timings)"

Support for Ruby 3.1?

Orb version:

1.4.0

What happened:

Ruby 3.1. cannot be installed:

Unknown ruby string (do not know how to handle): ruby-3.1.

Expected behavior:

Supported and released rubies are available.

Additional Information:

It looks like this orb relies on RVM which has not released support for 3.1 and doesn't seem like it's planning to anytime soon. Docker might be a better way to ensure released rubies are available (I realize that is a larger-ish change to this orb).

Bundled Dependencies are not Cached Globally

Version: 1.0

Description:
The cache key for bundler does not have any fallback.

To Reproduce
Open a PR in a new branch. bundler does not use any caching.

Expected behavior
Caches attempt to restore based on existing cached gems.

Note: this PR fixes - anyone available to review / give feedback?

#28

Setup of ruby 2.7.6 in environment with cimg/base:2022.09 or later as base image causes gem install to fail

Orb version:

2.0.0 (also 1.8.0)

What happened:

After updating cimg/node from 16.17.1 to 16.18.0, the gem installation failed in the environment set up with ruby/install. ruby version was 2.7.6.

Here is the configuration file that reproduces

# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/2.0/configuration-reference
version: 2.1

# Orbs are reusable packages of CircleCI configuration that you may share across projects, enabling you to create encapsulated, parameterized commands, jobs, and executors that can be used across multiple projects.
# See: https://circleci.com/docs/2.0/orb-intro/
orbs:
  # https://circleci.com/developer/orbs/orb/circleci/ruby
  ruby: circleci/[email protected]

# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
jobs:
  build:
    docker:
      - image: cimg/node:16.18.0
    steps:
      - checkout
      - ruby/install:
          version: 2.7.6
      - run: |
          gem install bundler
# Invoke jobs via workflows
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
workflows:
  sample: # This is the name of the workflow, feel free to change it to better match your workflow.
    # Inside the workflow, you define the jobs you want to run.
    jobs:
      - build

ref. https://github.com/mkusaka/ruby-orb-issue-repro/blob/3a1188dac37599e24814c020058e3b71415c79c8/.circleci/config.yml

The error message was something like this

ERROR:  Loading command: install (LoadError)
	cannot load such file -- openssl
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

Exited with code exit status 1

ref. https://app.circleci.com/pipelines/github/mkusaka/ruby-orb-issue-repro/2/workflows/bbc2c09a-36d2-4bb0-b926-9cb3b3123c58/jobs/2

As the error message shows, this seems to be caused by openssl.

Expected behavior:

I want gem install to not fail after install ruby2.7.6 with ruby/install even in an environment with cimb/base:2022.09 as the base image.

Additional Information:

After some investigation, I found that cimg/node 16.17.1 uses openssl 1.1.1f (ubuntu 20.04) and cimg/node 16.18.0 uses openssl 3.0.2 (ubuntu 22.04).

~/src/github.com/mkusaka/ruby-orb-issue-repro
❯ docker run -it --rm cimg/node:16.17.1 openssl version
OpenSSL 1.1.1f 31 Mar 2020

~/src/github.com/mkusaka/ruby-orb-issue-repro
❯ docker run -it --rm cimg/node:16.17.1 cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

~/src/github.com/mkusaka/ruby-orb-issue-repro
❯ docker run -it --rm cimg/node:16.18.0 openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

~/src/github.com/mkusaka/ruby-orb-issue-repro
❯ docker run -it --rm cimg/node:16.18.0 cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

This is caused by cimg/base changing the base image from ubuntu 20.04 to 22.04 at the time of 2022.08 to 2022.09, and cimg/node changing the base image from cimg/base 2022.08 to 2022.10 at the time of 16.17.1.

~/src/github.com/mkusaka/ruby-orb-issue-repro workaround
❯ docker run -it --rm cimg/base:2022.08 cat /etc/os-releases
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

~/src/github.com/mkusaka/ruby-orb-issue-repro
❯ docker run -it --rm cimg/base:2022.09 cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

refs.

The problem related to openssl 3.0.0 (ubuntu22.04) seems to be a known issue in ruby and in case of ruby-build, a solution has been found .
However, the current installation of the ruby-orb script (based on rvm) does not work, and it seems that we need to re-install via script.

At this moment, there are several workarounds.

A. Re-install via rvm

Change the configuration file as follows

# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/2.0/configuration-reference
version: 2.1

# Orbs are reusable packages of CircleCI configuration that you may share across projects, enabling you to create encapsulated, parameterized commands, jobs, and executors that can be used across multiple projects.
# See: https://circleci.com/docs/2.0/orb-intro/
orbs:
  # https://circleci.com/developer/orbs/orb/circleci/ruby
  ruby: circleci/[email protected]

# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
jobs:
  build:
    docker:
      - image: cimg/node:16.18.0
    steps:
      - checkout
      - ruby/install:
          version: 2.7.6
      - run: |
          rvm pkg install openssl
          rvm reinstall ruby-2.7.6 --with-openssl-dir=$HOME/.rvm/usr
      - run: |
          gem install aws-sdk

# Invoke jobs via workflows
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
workflows:
  sample: # This is the name of the workflow, feel free to change it to better match your workflow.
    # Inside the workflow, you define the jobs you want to run.
    jobs:
      - build

ref. https://github.com/mkusaka/ruby-orb-issue-repro/blob/6f15e0fb1ec57903e211d187659f83256f1fd5fb/.circleci/config.yml

The problem with this workarond is reinstallation via rvm is very slow (about 4minutes).

B. Stop using cimg/node and change cimg/base with ubuntu 20.04

Change the configuration file as follows

# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/2.0/configuration-reference
version: 2.1

# Orbs are reusable packages of CircleCI configuration that you may share across projects, enabling you to create encapsulated, parameterized commands, jobs, and executors that can be used across multiple projects.
# See: https://circleci.com/docs/2.0/orb-intro/
orbs:
  # https://circleci.com/developer/orbs/orb/circleci/ruby
  ruby: circleci/[email protected]
  # https://circleci.com/developer/orbs/orb/circleci/node
  node: circleci/[email protected]

# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
jobs:
  build:
    docker:
      - image: cimg/base:2022.10-20.04
    steps:
      - checkout
      - node/install:
          yarn-version: 1.22.19
          install-yarn: true
          node-version: 16.18.0
      - ruby/install:
          version: 2.7.6
      - run: |
          gem install bundler

# Invoke jobs via workflows
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
workflows:
  sample: # This is the name of the workflow, feel free to change it to better match your workflow.
    # Inside the workflow, you define the jobs you want to run.
    jobs:
      - build

ref. https://github.com/mkusaka/ruby-orb-issue-repro/blob/1bdb39845afe3fe799e067e3e55578b2ba3cbd3f/.circleci/config.yml

The problem with this workarond is that it requires more effort to create an environment equivalent to a convenience image such as cimg/node:16.18.0-browsers.

Allow rspec-test to accept seed parameter

Describe Request:

In order to set seed value for repeating a deterministic random test run, one must provide the seed via the command line. The desired feature would allow passing a parameter to the rspec-test command that would then send --seed <SEED> if the parameter is set.

I've looked into setting the seed via ENV var which would be read by the spec_helper.rb. However, rspec does not surface any knowledge about whether config.seed is the default random seed, or provided explicitly via --seed. Which means one cannot set the seed from the ENV var without potentially overwriting the command-line argument. (And command-line values should always take precedence over ENV values.) This leaves, the orb command as the only location to provide the seed paramater via CLI.

Examples:

workflows:
  build_and_test:
    jobs:
      - ruby/rspec-test:
          seed: 12345

Supporting Documentation Links:

--seed docs: https://relishapp.com/rspec/rspec-core/docs/command-line/order

Do not force order when option is not given

Describe Request:

In the 1.7.0 release an order paramater was added. This defaults to defined. If you set this order in your rspec config either via .rspec or via spec_helper.rb, it is now overridden by the default in the rspec-test job.

This is an unexpected change in behavior when upgrading from < 1.7.0. Ideally the option should only change the order if set to something (i.e. random:1234) as was requested in #64.

Examples:

If your project has the order set via .rspec config

--order random

Or via the spec_helper.rb

RSpec.configure do |config|
  config.order = :random
end

It is no longer taken into account, instead the default rspec behavior of defined is used because the --order defined is passed directly to the rspec command.

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.