summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2020-06-11 21:54:04 +0900
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2020-06-18 19:14:15 +0900
commitcc059b16b253d0f9622fa0c51606e722b190b526 (patch)
tree737fa7f6510f56888534cec792cbebecf303e9af
parent9be1baedbc14be036342cca3e363ae6f44153990 (diff)
downloadruby-cc059b16b253d0f9622fa0c51606e722b190b526.tar.gz
Manually cherry-picked at https://github.com/rubygems/rubygems/commit/80260b3496e357bf96ffe6f381e29bf25b6749cb
-rw-r--r--lib/bundler/cli.rb1
-rw-r--r--lib/bundler/cli/gem.rb50
-rw-r--r--lib/bundler/templates/newgem/.circleci/config.yml.tt13
-rw-r--r--lib/bundler/templates/newgem/.github/workflows/main.yml.tt18
-rw-r--r--lib/bundler/templates/newgem/.gitlab-ci.yml.tt9
-rw-r--r--spec/bundler/commands/newgem_spec.rb102
6 files changed, 189 insertions, 4 deletions
diff --git a/lib/bundler/cli.rb b/lib/bundler/cli.rb
index ec3044ee5b..e342aa6edb 100644
--- a/lib/bundler/cli.rb
+++ b/lib/bundler/cli.rb
@@ -575,6 +575,7 @@ module Bundler
method_option :rubocop, :type => :boolean, :desc => "Add rubocop to the generated Rakefile and gemspec. Set a default with `bundle config set gem.rubocop true`."
method_option :test, :type => :string, :lazy_default => Bundler.settings["gem.test"] || "", :aliases => "-t", :banner => "Use the specified test framework for your library",
:desc => "Generate a test directory for your library, either rspec, minitest or test-unit. Set a default with `bundle config set gem.test rspec`."
+ method_option :ci, :type => :string, :desc => "Generate CI configuration, either Github Actions, Travis CI, Gitlab CI or Circle CI. Set a default with `bundle config set gem.ci (github|travis|gitlab|circle)`"
def gem(name)
end
diff --git a/lib/bundler/cli/gem.rb b/lib/bundler/cli/gem.rb
index d069ca36f0..8770a98198 100644
--- a/lib/bundler/cli/gem.rb
+++ b/lib/bundler/cli/gem.rb
@@ -84,8 +84,6 @@ module Bundler
config[:test] = test_framework
config[:test_framework_version] = TEST_FRAMEWORK_VERSIONS[test_framework]
- templates.merge!("travis.yml.tt" => ".travis.yml")
-
case test_framework
when "rspec"
templates.merge!(
@@ -109,6 +107,25 @@ module Bundler
end
end
+ if ci_template = ask_and_set_ci
+ config[:ci] = ci_template
+
+ case ci_template
+ when "github"
+ templates.merge!(".github/workflows/main.yml.tt" => ".github/workflows/main.yml")
+ config[:ci] = "github"
+ when "travis"
+ templates.merge!("travis.yml.tt" => ".travis.yml")
+ config[:ci] = "travis"
+ when "gitlab"
+ templates.merge!(".gitlab-ci.yml.tt" => ".gitlab-ci.yml")
+ config[:ci] = "gitlab"
+ when "circle"
+ templates.merge!(".circleci/config.yml.tt" => ".circleci/config.yml")
+ config[:ci] = "circleci"
+ end
+ end
+
if ask_and_set(:mit, "Do you want to license your code permissively under the MIT license?",
"This means that any other developer or company will be legally allowed to use your code " \
"for free as long as they admit you created it. You can read more about the MIT license " \
@@ -247,6 +264,35 @@ module Bundler
end
end
+ def ask_and_set_ci
+ ci_template = options[:ci] || Bundler.settings["gem.ci"]
+
+ if ci_template.nil?
+ Bundler.ui.confirm "Do you want to add Continuous Integration to your gem? " \
+ "Adding a CI service to your project helps ensure your project is well tested " \
+ "before shipping your gem to users. Bundler recommends several different services for testing "\
+ "your code. For more information about each service, see:\n" \
+ "* Travis CI: https://travis-ci.org/\n" \
+ "* Github Actions: https://github.com/features/actions\n" \
+ "* Circle CI: https://circleci.com/\n" \
+ "* Gitlab CI: https://docs.gitlab.com/ee/ci/\n\n"
+
+ result = Bundler.ui.ask "Type 'github', 'travis', 'gitlab' or 'circle' to generate those test files now and " \
+ "in the future. github/travis/gitlab/circle/(none):"
+ if result =~ /github|travis|gitlab|circle/
+ ci_template = result
+ else
+ ci_template = false
+ end
+ end
+
+ if Bundler.settings["gem.ci"].nil?
+ Bundler.settings.set_global("gem.ci", ci_template)
+ end
+
+ ci_template
+ end
+
def bundler_dependency_version
v = Gem::Version.new(Bundler::VERSION)
req = v.segments[0..1]
diff --git a/lib/bundler/templates/newgem/.circleci/config.yml.tt b/lib/bundler/templates/newgem/.circleci/config.yml.tt
new file mode 100644
index 0000000000..660943a3df
--- /dev/null
+++ b/lib/bundler/templates/newgem/.circleci/config.yml.tt
@@ -0,0 +1,13 @@
+version: 2.1
+jobs:
+ build:
+ docker:
+ - image: ruby:<%= RUBY_VERSION %>
+ steps:
+ - checkout
+ - run:
+ name: Run tests
+ command: |
+ gem install bundler -v <%= Bundler::Version %>
+ bundle install
+ bundle exec rake test
diff --git a/lib/bundler/templates/newgem/.github/workflows/main.yml.tt b/lib/bundler/templates/newgem/.github/workflows/main.yml.tt
new file mode 100644
index 0000000000..929901ac56
--- /dev/null
+++ b/lib/bundler/templates/newgem/.github/workflows/main.yml.tt
@@ -0,0 +1,18 @@
+name: Ruby
+
+on: [push,pull_request]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up Ruby <%= ::Gem::Version.new(RUBY_VERSION).segments[0..1].join(".") %>
+ uses: actions/setup-ruby@v1
+ with:
+ ruby-version: <%= ::Gem::Version.new(RUBY_VERSION).segments[0..1].join(".") %>.x
+ - name: Build and test with Rake
+ run: |
+ gem install bundler -v <%= Bundler::VERSION %>
+ bundle install --jobs 4 --retry 3
+ bundle exec rake
diff --git a/lib/bundler/templates/newgem/.gitlab-ci.yml.tt b/lib/bundler/templates/newgem/.gitlab-ci.yml.tt
new file mode 100644
index 0000000000..0e71ff26a4
--- /dev/null
+++ b/lib/bundler/templates/newgem/.gitlab-ci.yml.tt
@@ -0,0 +1,9 @@
+image: ruby:<%= RUBY_VERSION %>
+
+before_script:
+ - gem install bundler -v <%= Bundler::VERSION %>
+ - bundle install
+
+example_job:
+ script:
+ - bundle exec rake
diff --git a/spec/bundler/commands/newgem_spec.rb b/spec/bundler/commands/newgem_spec.rb
index a31b28bf85..769b2678b3 100644
--- a/spec/bundler/commands/newgem_spec.rb
+++ b/spec/bundler/commands/newgem_spec.rb
@@ -585,6 +585,94 @@ RSpec.describe "bundle gem" do
it_behaves_like "test framework is present"
end
+ context "--ci with no arugment" do
+ it "does not generate any CI config" do
+ bundle "gem #{gem_name}"
+
+ expect(bundled_app("#{gem_name}/.github/workflows/main.yml")).to_not exist
+ expect(bundled_app("#{gem_name}/.travis.yml")).to_not exist
+ expect(bundled_app("#{gem_name}/.gitlab-ci.yml")).to_not exist
+ expect(bundled_app("#{gem_name}/.circleci/config.yml")).to_not exist
+ end
+ end
+
+ context "--ci set to github" do
+ it "generates a Github Actions config file" do
+ bundle "gem #{gem_name} --ci=github"
+
+ expect(bundled_app("#{gem_name}/.github/workflows/main.yml")).to exist
+ end
+ end
+
+ context "--ci set to gitlab" do
+ it "generates a Gitlab Ci config file" do
+ bundle "gem #{gem_name} --ci=gitlab"
+
+ expect(bundled_app("#{gem_name}/.gitlab-ci.yml")).to exist
+ end
+ end
+
+ context "--ci set to circle" do
+ it "generates a Circle Ci config file" do
+ bundle "gem #{gem_name} --ci=circle"
+
+ expect(bundled_app("#{gem_name}/.circleci/config.yml")).to exist
+ end
+ end
+
+ context "--ci set to travis" do
+ it "generates a Travis Ci config file" do
+ bundle "gem #{gem_name} --ci=travis"
+
+ expect(bundled_app("#{gem_name}/.travis.yml")).to exist
+ end
+ end
+
+ context "gem.ci setting set to none" do
+ it "doesnt generate any CI config" do
+ expect(bundled_app("#{gem_name}/.github/workflows/main.yml")).to_not exist
+ expect(bundled_app("#{gem_name}/.travis.yml")).to_not exist
+ expect(bundled_app("#{gem_name}/.gitlab-ci.yml")).to_not exist
+ expect(bundled_app("#{gem_name}/.circleci/config.yml")).to_not exist
+ end
+ end
+
+ context "gem.ci setting set to github" do
+ it "generates a Github Actions config file" do
+ bundle "config set gem.ci github"
+ bundle "gem #{gem_name}"
+
+ expect(bundled_app("#{gem_name}/.github/workflows/main.yml")).to exist
+ end
+ end
+
+ context "gem.ci setting set to travis" do
+ it "generates a Travis config file" do
+ bundle "config set gem.ci travis"
+ bundle "gem #{gem_name}"
+
+ expect(bundled_app("#{gem_name}/.travis.yml")).to exist
+ end
+ end
+
+ context "gem.ci setting set to gitlab" do
+ it "generates a Gitlab config file" do
+ bundle "config set gem.ci gitlab"
+ bundle "gem #{gem_name}"
+
+ expect(bundled_app("#{gem_name}/.gitlab-ci.yml")).to exist
+ end
+ end
+
+ context "gem.ci setting set to circleci" do
+ it "generates a CircleCI config file" do
+ bundle "config set gem.ci circle"
+ bundle "gem #{gem_name}"
+
+ expect(bundled_app("#{gem_name}/.circleci/config.yml")).to exist
+ end
+ end
+
context "gem.test setting set to test-unit" do
before do
bundle "config set gem.test test-unit"
@@ -875,8 +963,18 @@ Usage: "bundle gem NAME [OPTIONS]"
expect(bundled_app("foobar/Gemfile").read).to include('gem "rspec"')
end
+ it "asks about CI service" do
+ global_config "BUNDLE_GEM__TEST" => "false", "BUNDLE_GEM__MIT" => "false", "BUNDLE_GEM__COC" => "false", "BUNDLE_GEM__RUBOCOP" => "false"
+
+ bundle! "gem foobar" do |input, _, _|
+ input.puts "github"
+ end
+
+ expect(bundled_app("foobar/.github/workflows/main.yml")).to exist
+ end
+
it "asks about MIT license" do
- global_config "BUNDLE_GEM__TEST" => "false", "BUNDLE_GEM__COC" => "false"
+ global_config "BUNDLE_GEM__TEST" => "false", "BUNDLE_GEM__COC" => "false", "BUNDLE_GEM__CI" => "false", "BUNDLE_GEM__RUBOCOP" => "false"
bundle "config list"
@@ -888,7 +986,7 @@ Usage: "bundle gem NAME [OPTIONS]"
end
it "asks about CoC" do
- global_config "BUNDLE_GEM__MIT" => "false", "BUNDLE_GEM__TEST" => "false"
+ global_config "BUNDLE_GEM__MIT" => "false", "BUNDLE_GEM__TEST" => "false", "BUNDLE_GEM__CI" => "false", "BUNDLE_GEM__RUBOCOP" => "false"
bundle! "gem foobar" do |input, _, _|
input.puts "yes"