diff --git a/docker/lib/dependabot/docker/file_fetcher.rb b/docker/lib/dependabot/docker/file_fetcher.rb index 47eaab1b8b..5a1ce3fb08 100644 --- a/docker/lib/dependabot/docker/file_fetcher.rb +++ b/docker/lib/dependabot/docker/file_fetcher.rb @@ -13,7 +13,7 @@ class FileFetcher < Dependabot::FileFetchers::Base extend T::Helpers YAML_REGEXP = /^[^\.].*\.ya?ml$/i - DOCKER_REGEXP = /dockerfile|containerfile/i + DOCKER_REGEXP = /(docker|container)file/i sig { override.params(filenames: T::Array[String]).returns(T::Boolean) } def self.required_files_in?(filenames) @@ -23,7 +23,7 @@ def self.required_files_in?(filenames) sig { override.returns(String) } def self.required_files_message - "Repo must contain a Dockerfile or Kubernetes YAML files." + "Repo must contain a Dockerfile, Containerfile, or Kubernetes YAML files." end sig { override.returns(T::Array[DependencyFile]) } diff --git a/docker/lib/dependabot/docker/file_updater.rb b/docker/lib/dependabot/docker/file_updater.rb index c0100cffe9..916a9df80c 100644 --- a/docker/lib/dependabot/docker/file_updater.rb +++ b/docker/lib/dependabot/docker/file_updater.rb @@ -15,7 +15,7 @@ class FileUpdater < Dependabot::FileUpdaters::Base FROM_REGEX = /FROM(\s+--platform\=\S+)?/i YAML_REGEXP = /^[^\.].*\.ya?ml$/i - DOCKER_REGEXP = /dockerfile/i + DOCKER_REGEXP = /(docker|container)file/i sig { override.returns(T::Array[Regexp]) } def self.updated_files_regex @@ -63,7 +63,7 @@ def check_required_files # Just check if there are any files at all. return if dependency_files.any? - raise "No Dockerfile!" + raise "No Dockerfile or Containerfile!" end sig { params(file: Dependabot::DependencyFile).returns(String) } diff --git a/docker/spec/dependabot/docker/file_fetcher_spec.rb b/docker/spec/dependabot/docker/file_fetcher_spec.rb index d00446c435..fc00386c0b 100644 --- a/docker/spec/dependabot/docker/file_fetcher_spec.rb +++ b/docker/spec/dependabot/docker/file_fetcher_spec.rb @@ -323,5 +323,33 @@ .to match_array(matching_filenames) end end + + context "with a Containerfile" do + before do + stub_request(:get, url + "?ref=sha"). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: fixture("github", "contents_docker_repo.json"), + headers: { "content-type" => "application/json" } + ) + + stub_request(:get, File.join(url, "Dockerfile?ref=sha")). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: dockerfile_fixture, + headers: { "content-type" => "application/json" } + ) + end + + let(:dockerfile_fixture) { fixture("github", "contents_containerfile.json") } + + it "fetches the Containerfile" do + expect(file_fetcher_instance.files.count).to eq(1) + expect(file_fetcher_instance.files.map(&:name)). + to match_array(%w(Containerfile)) + end + end end end diff --git a/docker/spec/fixtures/github/contents_containerfile.json b/docker/spec/fixtures/github/contents_containerfile.json new file mode 100644 index 0000000000..35e19e82e9 --- /dev/null +++ b/docker/spec/fixtures/github/contents_containerfile.json @@ -0,0 +1,18 @@ +{ + "name": "Containerfile", + "path": "Containerfile", + "sha": "311f9743315183cc6751313cb251cfeb3de45c1a", + "size": 4927, + "url": "https://api.github.com/repos/dependabot/dependabot-core/contents/Containerfile?ref=master", + "html_url": "https://github.com/dependabot/dependabot-core/blob/main/Containerfile", + "git_url": "https://api.github.com/repos/dependabot/dependabot-core/git/blobs/311f9743315183cc6751313cb251cfeb3de45c1a", + "download_url": "https://raw.githubusercontent.com/dependabot/dependabot-core/master/Containerfile", + "type": "file", + "content": "RlJPTSB1YnVudHU6MTguMDQKCiMjIyBTWVNURU0gREVQRU5ERU5DSUVTCgoj\nIEV2ZXJ5dGhpbmcgZnJvbSBgbWFrZWAgb253YXJkcyBpbiBhcHQtZ2V0IGlu\nc3RhbGwgaXMgb25seSBpbnN0YWxsZWQgdG8gZW5zdXJlCiMgUHl0aG9uIHN1\ncHBvcnQgd29ya3Mgd2l0aCBhbGwgcGFja2FnZXMgKHdoaWNoIG1heSByZXF1\naXJlIHNwZWNpZmljIGxpYnJhcmllcwojIGF0IGluc3RhbGwgdGltZSkuCkVO\nViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKUlVOIGFwdC1nZXQg\ndXBkYXRlIFwKICAgICYmIGFwdC1nZXQgdXBncmFkZSAteSBcCiAgICAmJiBh\ncHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAog\nICAgICBidWlsZC1lc3NlbnRpYWwgXAogICAgICBkaXJtbmdyIFwKICAgICAg\nZ2l0IFwKICAgICAgZ251cGcyIFwKICAgICAgY3VybCBcCiAgICAgIHdnZXQg\nXAogICAgICB6bGliMWctZGV2IFwKICAgICAgbGlibHptYS1kZXYgXAogICAg\nICB0emRhdGEgXAogICAgICB6aXAgXAogICAgICB1bnppcCBcCiAgICAgIGxv\nY2FsZXMgXAogICAgICBvcGVuc3NoLWNsaWVudCBcCiAgICAgIG1ha2UgXAog\nICAgICBsaWJzc2wtZGV2IFwKICAgICAgbGliYnoyLWRldiBcCiAgICAgIGxp\nYnJlYWRsaW5lLWRldiBcCiAgICAgIGxpYnNxbGl0ZTMtZGV2IFwKICAgICAg\nbGx2bSBcCiAgICAgIGxpYm5jdXJzZXM1LWRldiBcCiAgICAgIGxpYm5jdXJz\nZXN3NS1kZXYgXAogICAgICBsaWJteXNxbGNsaWVudC1kZXYgXAogICAgICB4\nei11dGlscyBcCiAgICAgIHRrLWRldiBcCiAgICAmJiBsb2NhbGUtZ2VuIGVu\nX1VTLlVURi04CkVOViBMQ19BTEwgZW5fVVMuVVRGLTgKCgojIyMgUlVCWQoK\nIyBJbnN0YWxsIFJ1YnkgMi41LCB1cGRhdGUgUnVieUdlbXMsIGFuZCBpbnN0\nYWxsIEJ1bmRsZXIKUlVOIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNl\ncnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEMzMTczQUE2IFwKICAgICYm\nIGVjaG8gImRlYiBodHRwOi8vcHBhLmxhdW5jaHBhZC5uZXQvYnJpZ2h0Ym94\nL3J1YnktbmcvdWJ1bnR1IGJpb25pYyBtYWluIiA+IC9ldGMvYXB0L3NvdXJj\nZXMubGlzdC5kL2JyaWdodGJveC5saXN0IFwKICAgICYmIGFwdC1nZXQgdXBk\nYXRlIFwKICAgICYmIGFwdC1nZXQgaW5zdGFsbCAteSBydWJ5Mi41IHJ1Ynky\nLjUtZGV2IFwKICAgICYmIGdlbSB1cGRhdGUgLS1zeXN0ZW0gMi43LjcgXAog\nICAgJiYgZ2VtIGluc3RhbGwgLS1uby1yaSAtLW5vLXJkb2MgYnVuZGxlciAt\ndiAxLjE2LjQKCgojIyMgUFlUSE9OCgojIEluc3RhbGwgUHl0aG9uIDIuNyBh\nbmQgMy42IHdpdGggcHllbnYuIFVzaW5nIHB5ZW52IGxldHMgdXMgc3VwcG9y\ndCBtdWx0aXBsZSBQeXRob25zCkVOViBQWUVOVl9ST09UPS91c3IvbG9jYWwv\nLnB5ZW52IFwKICAgIFBBVEg9Ii91c3IvbG9jYWwvLnB5ZW52L2JpbjokUEFU\nSCIKUlVOIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vcHllbnYvcHll\nbnYuZ2l0IC91c3IvbG9jYWwvLnB5ZW52IFwKICAgICYmIGNkIC91c3IvbG9j\nYWwvLnB5ZW52ICYmIGdpdCBjaGVja291dCB2MS4yLjcgJiYgY2QgLSBcCiAg\nICAmJiBweWVudiBpbnN0YWxsIDMuNi41IFwKICAgICYmIHB5ZW52IGluc3Rh\nbGwgMi43LjE1IFwKICAgICYmIHB5ZW52IGdsb2JhbCAzLjYuNQoKCiMjIyBK\nQVZBU0NSSVBUCgojIEluc3RhbGwgTm9kZSA4LjAgYW5kIFlhcm4KUlVOIGN1\ncmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL3NldHVwXzgueCB8\nIGJhc2ggLSBcCiAgICAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgbm9kZWpzIFwK\nICAgICYmIGN1cmwgLXNTIGh0dHBzOi8vZGwueWFybnBrZy5jb20vZGViaWFu\nL3B1YmtleS5ncGcgfCBhcHQta2V5IGFkZCAtIFwKICAgICYmIGVjaG8gImRl\nYiBodHRwczovL2RsLnlhcm5wa2cuY29tL2RlYmlhbi8gc3RhYmxlIG1haW4i\nIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL3lhcm4ubGlzdCBcCiAg\nICAmJiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgeWFy\nbgoKCiMjIyBFTE0KCiMgSW5zdGFsbCBFbG0gMC4xOApFTlYgUEFUSD0iJFBB\nVEg6L25vZGVfbW9kdWxlcy8uYmluIgpSVU4gbnBtIGluc3RhbGwgZWxtQDAu\nMTguMAoKCiMjIyBQSFAKCiMgSW5zdGFsbCBQSFAgNy4yIGFuZCBDb21wb3Nl\ncgpSVU4gZWNobyAiZGViIGh0dHA6Ly9wcGEubGF1bmNocGFkLm5ldC9vbmRy\nZWovcGhwL3VidW50dSBiaW9uaWMgbWFpbiIgPj4gL2V0Yy9hcHQvc291cmNl\ncy5saXN0LmQvb25kcmVqLXBocC5saXN0IFwKICAgICYmIGVjaG8gImRlYi1z\ncmMgaHR0cDovL3BwYS5sYXVuY2hwYWQubmV0L29uZHJlai9waHAvdWJ1bnR1\nIGJpb25pYyBtYWluIiA+PiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9vbmRy\nZWotcGhwLmxpc3QgXAogICAgJiYgYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIg\na2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgNEY0RUEwQUFFNTI2\nN0E2QyBcCiAgICAmJiBhcHQtZ2V0IHVwZGF0ZSBcCiAgICAmJiBhcHQtZ2V0\nIGluc3RhbGwgLXkgcGhwNy4yIHBocDcuMi14bWwgcGhwNy4yLWpzb24gcGhw\nNy4yLXppcCBwaHA3LjItbWJzdHJpbmcgcGhwNy4yLWludGwgcGhwNy4yLWNv\nbW1vbiBwaHA3LjItZ2V0dGV4dCBwaHA3LjItY3VybCBwaHAteGRlYnVnIHBo\ncDcuMi1iY21hdGggcGhwLWdtcCBwaHA3LjItaW1hZ2ljayBwaHA3LjItZ2Qg\ncGhwNy4yLXJlZGlzIHBocDcuMi1zb2FwIHBocDcuMi1sZGFwIFwKICAgICYm\nIGN1cmwgLXNTIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2luc3RhbGxlciB8\nIHBocCBcCiAgICAmJiBtdiBjb21wb3Nlci5waGFyIC91c3IvbG9jYWwvYmlu\nL2NvbXBvc2VyCgoKIyMjIEdPCgojIEluc3RhbGwgR28gYW5kIGRlcApSVU4g\nY3VybCAtTyBodHRwczovL2RsLmdvb2dsZS5jb20vZ28vZ28xLjEwLjMubGlu\ndXgtYW1kNjQudGFyLmd6IFwKICAgICYmIHRhciB4dmYgZ28xLjEwLjMubGlu\ndXgtYW1kNjQudGFyLmd6IFwKICAgICYmIHdnZXQgaHR0cHM6Ly9naXRodWIu\nY29tL2dvbGFuZy9kZXAvcmVsZWFzZXMvZG93bmxvYWQvdjAuNS4wL2RlcC1s\naW51eC1hbWQ2NCBcCiAgICAmJiBtdiBkZXAtbGludXgtYW1kNjQgZ28vYmlu\nL2RlcCBcCiAgICAmJiBjaG1vZCAreCBnby9iaW4vZGVwIFwKICAgICYmIG12\nIGdvIC9yb290CkVOViBQQVRIPS9yb290L2dvL2JpbjokUEFUSAoKCiMjIyBF\nTElYSVIKCiMgSW5zdGFsbCBFcmxhbmcsIEVsaXhpciBhbmQgSGV4CkVOViBQ\nQVRIPSIkUEFUSDovdXNyL2xvY2FsL2VsaXhpci9iaW4iClJVTiB3Z2V0IGh0\ndHBzOi8vcGFja2FnZXMuZXJsYW5nLXNvbHV0aW9ucy5jb20vZXJsYW5nLXNv\nbHV0aW9uc18xLjBfYWxsLmRlYiBcCiAgICAmJiBkcGtnIC1pIGVybGFuZy1z\nb2x1dGlvbnNfMS4wX2FsbC5kZWIgXAogICAgJiYgYXB0LWdldCB1cGRhdGUg\nXAogICAgJiYgYXB0LWdldCBpbnN0YWxsIC15IGVzbC1lcmxhbmcgXAogICAg\nJiYgd2dldCBodHRwczovL2dpdGh1Yi5jb20vZWxpeGlyLWxhbmcvZWxpeGly\nL3JlbGVhc2VzL2Rvd25sb2FkL3YxLjcuMi9QcmVjb21waWxlZC56aXAgXAog\nICAgJiYgdW56aXAgLWQgL3Vzci9sb2NhbC9lbGl4aXIgLXggUHJlY29tcGls\nZWQuemlwIFwKICAgICYmIHJtIC1mIFByZWNvbXBpbGVkLnppcCBcCiAgICAm\nJiBtaXggbG9jYWwuaGV4IC0tZm9yY2UKCgojIyMgUlVTVAoKIyBJbnN0YWxs\nIFJ1c3QKRU5WIFJVU1RVUF9IT01FPS9vcHQvcnVzdCBcCiAgICBQQVRIPSIk\ne1BBVEh9Oi9vcHQvcnVzdC9iaW4iClJVTiBleHBvcnQgQ0FSR09fSE9NRT0v\nb3B0L3J1c3QgOyBjdXJsIGh0dHBzOi8vc2gucnVzdHVwLnJzIC1zU2YgfCBz\naCAtcyAtLSAteQoKCiMjIyBKQVZBLCBHUk9PVlkgQU5EIEdSQURMRQoKIyBJ\nbnN0YWxsIEphdmEsIEdyb292eSBhbmQgR3JhZGxlClJVTiBlY2hvICJvcmFj\nbGUtamF2YTgtaW5zdGFsbGVyIHNoYXJlZC9hY2NlcHRlZC1vcmFjbGUtbGlj\nZW5zZS12MS0xIHNlbGVjdCB0cnVlIiB8IGRlYmNvbmYtc2V0LXNlbGVjdGlv\nbnMgXAogICAgJiYgZWNobyAiZGViIGh0dHA6Ly9wcGEubGF1bmNocGFkLm5l\ndC93ZWJ1cGQ4dGVhbS9qYXZhL3VidW50dSBiaW9uaWMgbWFpbiIgPiAvZXRj\nL2FwdC9zb3VyY2VzLmxpc3QuZC93ZWJ1cGQ4dGVhbS1qYXZhLXRydXN0eS5s\naXN0IFwKICAgICYmIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZl\nci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEVFQTE0ODg2IFwKICAgICYmIGFw\ndC1nZXQgdXBkYXRlIFwKICAgICYmIGFwdC1nZXQgaW5zdGFsbCAteSBvcmFj\nbGUtamF2YTgtaW5zdGFsbGVyIG9yYWNsZS1qYXZhOC1zZXQtZGVmYXVsdCBc\nCiAgICAmJiBjZCAvdG1wIFwKICAgICYmIHdnZXQgaHR0cDovL2RsLmJpbnRy\nYXkuY29tL2dyb292eS9tYXZlbi9hcGFjaGUtZ3Jvb3Z5LWJpbmFyeS0yLjUu\nMi56aXAgXAogICAgJiYgdW56aXAgYXBhY2hlLWdyb292eS1iaW5hcnktMi41\nLjIuemlwIFwKICAgICYmIG12IGdyb292eS0yLjUuMiAvdXNyL2xvY2FsL2dy\nb292eSBcCiAgICAmJiBybSAtZiBhcGFjaGUtZ3Jvb3Z5LWJpbmFyeS0yLjUu\nMi56aXAgXAogICAgJiYgY2QgL3RtcCBcCiAgICAmJiB3Z2V0IGh0dHBzOi8v\nc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS00Ljkt\nYmluLnppcCBcCiAgICAmJiB1bnppcCBncmFkbGUtNC45LWJpbi56aXAgXAog\nICAgJiYgbXYgZ3JhZGxlLTQuOSAvdXNyL2xvY2FsL2dyYWRsZSBcCiAgICAm\nJiBybSAtZiBncmFkbGUtNC45LWJpbi56aXAKRU5WIEpBVkFfSE9NRT0vdXNy\nL2xpYi9qdm0vamF2YS04LW9yYWNsZSBcCiAgICBHUk9PVllfSE9NRT0vdXNy\nL2xvY2FsL2dyb292eSBcCiAgICBHUkFETEVfSE9NRT0vdXNyL2xvY2FsL2dy\nYWRsZSBcCiAgICBQQVRIPS91c3IvbG9jYWwvZ3Jvb3Z5L2Jpbi86L3Vzci9s\nb2NhbC9ncmFkbGUvYmluOiRQQVRICg==\n", + "encoding": "base64", + "_links": { + "self": "https://api.github.com/repos/dependabot/dependabot-core/contents/Containerfile?ref=master", + "git": "https://api.github.com/repos/dependabot/dependabot-core/git/blobs/311f9743315183cc6751313cb251cfeb3de45c1a", + "html": "https://github.com/dependabot/dependabot-core/blob/main/Containerfile" + } +} \ No newline at end of file diff --git a/docker/spec/fixtures/github/contents_docker_repo.json b/docker/spec/fixtures/github/contents_docker_repo.json index 421769e2d5..2c429ad96d 100644 --- a/docker/spec/fixtures/github/contents_docker_repo.json +++ b/docker/spec/fixtures/github/contents_docker_repo.json @@ -111,6 +111,22 @@ "html": "https://github.com/dependabot/dependabot-core/blob/main/Dockerfile" } }, + { + "name": "Containerfile", + "path": "Containerfile", + "sha": "311f9743315183cc6751313cb251cfeb3de45c1a", + "size": 4927, + "url": "https://api.github.com/repos/dependabot/dependabot-core/contents/Containerfile?ref=master", + "html_url": "https://github.com/dependabot/dependabot-core/blob/main/Containerfile", + "git_url": "https://api.github.com/repos/dependabot/dependabot-core/git/blobs/311f9743315183cc6751313cb251cfeb3de45c1a", + "download_url": "https://raw.githubusercontent.com/dependabot/dependabot-core/master/Containerfile", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/dependabot/dependabot-core/contents/Containerfile?ref=master", + "git": "https://api.github.com/repos/dependabot/dependabot-core/git/blobs/311f9743315183cc6751313cb251cfeb3de45c1a", + "html": "https://github.com/dependabot/dependabot-core/blob/main/Containerfile" + } + }, { "name": "Gemfile", "path": "Gemfile",