Commit 5f0ec4df authored by Fabio Pitino's avatar Fabio Pitino

Merge branch 'fix-runner-heartbeat' into 'master'

Heartbeat runner only for specific job-context requests

See merge request gitlab-org/gitlab!75022
parents 8ef02578 aa5e73e7
...@@ -52,7 +52,7 @@ module API ...@@ -52,7 +52,7 @@ module API
# HTTP status codes to terminate the job on GitLab Runner: # HTTP status codes to terminate the job on GitLab Runner:
# - 403 # - 403
def authenticate_job!(require_running: true) def authenticate_job!(require_running: true, heartbeat_runner: false)
job = current_job job = current_job
# 404 is not returned here because we want to terminate the job if it's # 404 is not returned here because we want to terminate the job if it's
...@@ -70,7 +70,17 @@ module API ...@@ -70,7 +70,17 @@ module API
job_forbidden!(job, 'Job is not running') unless job.running? job_forbidden!(job, 'Job is not running') unless job.running?
end end
# Only some requests (like updating the job or patching the trace) should trigger
# runner heartbeat. Operations like artifacts uploading are executed in context of
# the running job and in the job environment, which in many cases will cause the IP
# to be updated to not the expected value. And operations like artifacts downloads can
# be done even after the job is finished and from totally different runners - while
# they would then update the connection status of not the runner that they should.
# Runner requests done in context of job authentication should explicitly define when
# the heartbeat should be triggered.
if heartbeat_runner
job.runner&.heartbeat(get_runner_ip) job.runner&.heartbeat(get_runner_ip)
end
job job
end end
......
...@@ -176,7 +176,7 @@ module API ...@@ -176,7 +176,7 @@ module API
optional :exit_code, type: Integer, desc: %q(Job's exit code) optional :exit_code, type: Integer, desc: %q(Job's exit code)
end end
put '/:id', feature_category: :continuous_integration do put '/:id', feature_category: :continuous_integration do
job = authenticate_job! job = authenticate_job!(heartbeat_runner: true)
Gitlab::Metrics.add_event(:update_build) Gitlab::Metrics.add_event(:update_build)
...@@ -203,7 +203,7 @@ module API ...@@ -203,7 +203,7 @@ module API
optional :token, type: String, desc: %q(Job's authentication token) optional :token, type: String, desc: %q(Job's authentication token)
end end
patch '/:id/trace', feature_category: :continuous_integration do patch '/:id/trace', feature_category: :continuous_integration do
job = authenticate_job! job = authenticate_job!(heartbeat_runner: true)
error!('400 Missing header Content-Range', 400) unless request.headers.key?('Content-Range') error!('400 Missing header Content-Range', 400) unless request.headers.key?('Content-Range')
content_range = request.headers['Content-Range'] content_range = request.headers['Content-Range']
......
...@@ -131,8 +131,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do ...@@ -131,8 +131,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
let(:send_request) { subject } let(:send_request) { subject }
end end
it 'updates runner info' do it "doesn't update runner info" do
expect { subject }.to change { runner.reload.contacted_at } expect { subject }.not_to change { runner.reload.contacted_at }
end end
shared_examples 'authorizes local file' do shared_examples 'authorizes local file' do
...@@ -280,8 +280,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do ...@@ -280,8 +280,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end end
end end
it 'updates runner info' do it "doesn't update runner info" do
expect { upload_artifacts(file_upload, headers_with_token) }.to change { runner.reload.contacted_at } expect { upload_artifacts(file_upload, headers_with_token) }.not_to change { runner.reload.contacted_at }
end end
context 'when the artifact is too large' do context 'when the artifact is too large' do
...@@ -812,8 +812,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do ...@@ -812,8 +812,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
let(:send_request) { download_artifact } let(:send_request) { download_artifact }
end end
it 'updates runner info' do it "doesn't update runner info" do
expect { download_artifact }.to change { runner.reload.contacted_at } expect { download_artifact }.not_to change { runner.reload.contacted_at }
end end
context 'when job has artifacts' do context 'when job has artifacts' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment