summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2016-01-15 15:54:35 +0000
committerDouwe Maan <douwe@gitlab.com>2016-01-15 15:54:35 +0000
commitc19795dff596a6a7343460a36f4a430c3bf0eb03 (patch)
tree1d87b4373a7fe9151ab656c2ab32a0bf1d842168 /spec
parent57d8faf662930ef0941b364f7b4e2fa1b60a8cf1 (diff)
parent1ce766367eb529fe88068be2f34315f87d74a349 (diff)
downloadgitlab-ce-c19795dff596a6a7343460a36f4a430c3bf0eb03.tar.gz
Merge branch 'ci/build_dependencies' into 'master'
Let the CI runner know about builds that this build depends on This allows us to implement artifacts passing: runner will download artifacts from all prior builds. It will happen automatically, and always, as long as artifacts are enabled. ## The changes: This MR exposes list of prior builds in CI::API::Builds. **The API response when asking for builds** ```json { "id": 48584, "ref": "0.1.1", "tag": true, "sha": "d63117656af6ff57d99e50cc270f854691f335ad", "status": "success", "name": "pages", "token": "9dd60b4f1a439d1765357446c1084c", "stage": "test", "project_id": 479, "project_name": "test", "commands": "echo commands", "repo_url": "http://gitlab-ci-token:token@gitlab.example/group/test.git", "before_sha": "0000000000000000000000000000000000000000", "allow_git_fetch": false, "options": { "image": "docker:image", "artifacts": { "paths": [ "public" ] }, "cache": { "paths": [ "vendor" ] } }, "timeout": 3600, "variables": [ { "key": "CI_BUILD_TAG", "value": "0.1.1", "public": true } ], "dependencies": { "builds": [ { "id": 48584, "ref": "0.1.1", "tag": true, "sha": "d63117656af6ff57d99e50cc270f854691f335ad", "status": "success", "name": "build", "token": "9dd60b4f1a439d1765357446c1084c", "stage": "build", "project_id": 479, "project_name": "test", "artifacts_file": { "filename": "artifacts.zip", "size": 0 } } ] } } ``` ## How it will work? **Example:** ``` build: type: build script: - echo TEST > test_file artifacts: untracked: true rspec: type: test script: - test-my-project staging: type: deploy script: - scp test_file root@server.com: ``` **The flow:** 1. We run `build`. The `build` creates a file `test_file`. This file gets archived and send us build artifacts. 2. We run `rspec`. The `rspec` downloads build artifacts from `build`. Uses the `test_file`. 3. We run `staging`. The `staging` downloads build artifacts from `build` and `rspec`, but since the `rspec` doesn't have build artifacts we skip that build. Deploys the `test_file`. This partially implements the https://gitlab.com/gitlab-org/gitlab-ce/issues/3423. In the next release we will introduce option to configure what artifacts are received. /cc @grzesiek @DouweM @sytse @rspeicher See merge request !2437
Diffstat (limited to 'spec')
-rw-r--r--spec/models/build_spec.rb24
-rw-r--r--spec/requests/ci/api/builds_spec.rb12
-rw-r--r--spec/support/gitlab_stubs/gitlab_ci.yml8
3 files changed, 40 insertions, 4 deletions
diff --git a/spec/models/build_spec.rb b/spec/models/build_spec.rb
index 0e13456723d..d12b9e65c82 100644
--- a/spec/models/build_spec.rb
+++ b/spec/models/build_spec.rb
@@ -426,6 +426,30 @@ describe Ci::Build, models: true do
it { is_expected.to include(project.web_url[7..-1]) }
end
+ describe :depends_on_builds do
+ let!(:build) { FactoryGirl.create :ci_build, commit: commit, name: 'build', stage_idx: 0, stage: 'build' }
+ let!(:rspec_test) { FactoryGirl.create :ci_build, commit: commit, name: 'rspec', stage_idx: 1, stage: 'test' }
+ let!(:rubocop_test) { FactoryGirl.create :ci_build, commit: commit, name: 'rubocop', stage_idx: 1, stage: 'test' }
+ let!(:staging) { FactoryGirl.create :ci_build, commit: commit, name: 'staging', stage_idx: 2, stage: 'deploy' }
+
+ it 'to have no dependents if this is first build' do
+ expect(build.depends_on_builds).to be_empty
+ end
+
+ it 'to have one dependent if this is test' do
+ expect(rspec_test.depends_on_builds.map(&:id)).to contain_exactly(build.id)
+ end
+
+ it 'to have all builds from build and test stage if this is last' do
+ expect(staging.depends_on_builds.map(&:id)).to contain_exactly(build.id, rspec_test.id, rubocop_test.id)
+ end
+
+ it 'to have retried builds instead the original ones' do
+ retried_rspec = Ci::Build.retry(rspec_test)
+ expect(staging.depends_on_builds.map(&:id)).to contain_exactly(build.id, retried_rspec.id, rubocop_test.id)
+ end
+ end
+
def create_mr(build, commit, factory: :merge_request, created_at: Time.now)
FactoryGirl.create(factory,
source_project_id: commit.gl_project_id,
diff --git a/spec/requests/ci/api/builds_spec.rb b/spec/requests/ci/api/builds_spec.rb
index 648ea0d5f50..eec927102aa 100644
--- a/spec/requests/ci/api/builds_spec.rb
+++ b/spec/requests/ci/api/builds_spec.rb
@@ -101,6 +101,18 @@ describe Ci::API::API do
{ "key" => "TRIGGER_KEY", "value" => "TRIGGER_VALUE", "public" => false },
])
end
+
+ it "returns dependent builds" do
+ commit = FactoryGirl.create(:ci_commit, project: project)
+ commit.create_builds('master', false, nil, nil)
+ commit.builds.where(stage: 'test').each(&:success)
+
+ post ci_api("/builds/register"), token: runner.token, info: { platform: :darwin }
+
+ expect(response.status).to eq(201)
+ expect(json_response["depends_on_builds"].count).to eq(2)
+ expect(json_response["depends_on_builds"][0]["name"]).to eq("rspec")
+ end
end
describe "PUT /builds/:id" do
diff --git a/spec/support/gitlab_stubs/gitlab_ci.yml b/spec/support/gitlab_stubs/gitlab_ci.yml
index 3482145404e..a5b256bd3ec 100644
--- a/spec/support/gitlab_stubs/gitlab_ci.yml
+++ b/spec/support/gitlab_stubs/gitlab_ci.yml
@@ -36,8 +36,8 @@ staging:
script: "cap deploy stating"
type: deploy
tags:
- - capistrano
- - debian
+ - ruby
+ - mysql
except:
- stable
@@ -47,8 +47,8 @@ production:
- cap deploy production
- cap notify
tags:
- - capistrano
- - debian
+ - ruby
+ - mysql
only:
- master
- /^deploy-.*$/