Skip to content

Commit 177762a

Browse files
refi64sjoerdsimons
authored andcommitted
mock: Add support for setting job variables
This refactors job variables to be built on top of a new MockJobVariable struct, allowing them to now be added by the API user. Signed-off-by: Ryan Gonzalez <[email protected]>
1 parent 9ccbe6a commit 177762a

File tree

5 files changed

+521
-79
lines changed

5 files changed

+521
-79
lines changed

gitlab-runner-mock/src/api/request.rs

+1-78
Original file line numberDiff line numberDiff line change
@@ -61,83 +61,6 @@ impl Respond for JobRequestResponder {
6161

6262
if let Some(job) = self.mock.grab_pending_job() {
6363
job.update_state(MockJobState::Running);
64-
let variables = json!([
65-
{ "key": "CI_PIPELINE_ID", "value": "120", "public": true, "masked": false },
66-
{ "key": "CI_PIPELINE_URL", "value": "https://gitlab.example.com/test/gitlab-test/-/pipelines/120", "public": true, "masked": false },
67-
{ "key": "CI_JOB_ID", "value": job.id().to_string(), "public": true, "masked": false },
68-
{ "key": "CI_JOB_URL", "value": "https://gitlab.example.com/test/gitlab-test/-/jobs/265", "public": true, "masked": false },
69-
{ "key": "CI_JOB_TOKEN", "value": "tokn", "public": false, "masked": true },
70-
{ "key": "CI_JOB_STARTED_AT", "value": "2021-05-05T17:16:32Z", "public": true, "masked": false },
71-
{ "key": "CI_BUILD_ID", "value": "265", "public": true, "masked": false },
72-
{ "key": "CI_BUILD_TOKEN", "value": "tokn", "public": false, "masked": true },
73-
{ "key": "CI_REGISTRY_USER", "value": "gitlab-ci-token", "public": true, "masked": false },
74-
{ "key": "CI_REGISTRY_PASSWORD", "value": "token", "public": false, "masked": true },
75-
{ "key": "CI_REPOSITORY_URL", "value": "https://gitlab-ci-token:[email protected]/test/gitlab-test.git", "public": false, "masked": false },
76-
{ "key": "CI_DEPENDENCY_PROXY_USER", "value": "gitlab-ci-token", "public": true, "masked": false },
77-
{ "key": "CI_DEPENDENCY_PROXY_PASSWORD", "value": "token", "public": false, "masked": true },
78-
{ "key": "CI_JOB_NAME", "value": "custom", "public": true, "masked": false },
79-
{ "key": "CI_JOB_STAGE", "value": "build", "public": true, "masked": false },
80-
{ "key": "CI_NODE_TOTAL", "value": "1", "public": true, "masked": false },
81-
{ "key": "CI_BUILD_NAME", "value": "custom", "public": true, "masked": false },
82-
{ "key": "CI_BUILD_STAGE", "value": "build", "public": true, "masked": false },
83-
{ "key": "GITLAB_CI", "value": "true", "public": true, "masked": false },
84-
{ "key": "CI_SERVER_URL", "value": "https://gitlab.example.com", "public": true, "masked": false },
85-
{ "key": "CI_SERVER_HOST", "value": "gitlab.example.com", "public": true, "masked": false },
86-
{ "key": "CI_SERVER_PORT", "value": "443", "public": true, "masked": false },
87-
{ "key": "CI_SERVER_PROTOCOL", "value": "https", "public": true, "masked": false },
88-
{ "key": "CI_SERVER_NAME", "value": "GitLab", "public": true, "masked": false },
89-
{ "key": "CI_SERVER_VERSION", "value": "13.11.3", "public": true, "masked": false },
90-
{ "key": "CI_SERVER_VERSION_MAJOR", "value": "13", "public": true, "masked": false },
91-
{ "key": "CI_SERVER_VERSION_MINOR", "value": "11", "public": true, "masked": false },
92-
{ "key": "CI_SERVER_VERSION_PATCH", "value": "3", "public": true, "masked": false },
93-
{ "key": "CI_SERVER_REVISION", "value": "b321336e443", "public": true, "masked": false },
94-
{ "key": "GITLAB_FEATURES", "value": "", "public": true, "masked": false },
95-
{ "key": "CI_PROJECT_ID", "value": "4", "public": true, "masked": false },
96-
{ "key": "CI_PROJECT_NAME", "value": "gitlab-test", "public": true, "masked": false },
97-
{ "key": "CI_PROJECT_TITLE", "value": "gitlab-test", "public": true, "masked": false },
98-
{ "key": "CI_PROJECT_PATH", "value": "test/gitlab-test", "public": true, "masked": false },
99-
{ "key": "CI_PROJECT_PATH_SLUG", "value": "test-gitlab-test", "public": true, "masked": false },
100-
{ "key": "CI_PROJECT_NAMESPACE", "value": "test", "public": true, "masked": false },
101-
{ "key": "CI_PROJECT_ROOT_NAMESPACE", "value": "test", "public": true, "masked": false },
102-
{ "key": "CI_PROJECT_URL", "value": "https://gitlab.example.com/test/gitlab-test", "public": true, "masked": false },
103-
{ "key": "CI_PROJECT_VISIBILITY", "value": "private", "public": true, "masked": false },
104-
{ "key": "CI_PROJECT_REPOSITORY_LANGUAGES", "value": "dockerfile,ocaml", "public": true, "masked": false },
105-
{ "key": "CI_DEFAULT_BRANCH", "value": "master", "public": true, "masked": false },
106-
{ "key": "CI_PROJECT_CONFIG_PATH", "value": ".gitlab-ci.yml", "public": true, "masked": false },
107-
{ "key": "CI_CONFIG_PATH", "value": ".gitlab-ci.yml", "public": true, "masked": false },
108-
{ "key": "CI_PAGES_DOMAIN", "value": "example.com", "public": true, "masked": false },
109-
{ "key": "CI_PAGES_URL", "value": "http://test.example.com/gitlab-test", "public": true, "masked": false }, { "key": "CI_REGISTRY", "value": "registry.example.com", "public": true, "masked": false },
110-
{ "key": "CI_REGISTRY_IMAGE", "value": "registry.example.com/test/gitlab-test", "public": true, "masked": false },
111-
{ "key": "CI_DEPENDENCY_PROXY_SERVER", "value": "gitlab.example.com:443", "public": true, "masked": false },
112-
{ "key": "CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX", "value": "gitlab.example.com:443/test/dependency_proxy/containers", "public": true, "masked": false },
113-
{ "key": "CI_API_V4_URL", "value": "https://gitlab.example.com/api/v4", "public": true, "masked": false },
114-
{ "key": "CI_PIPELINE_IID", "value": "33", "public": true, "masked": false },
115-
{ "key": "CI_PIPELINE_SOURCE", "value": "push", "public": true, "masked": false },
116-
{ "key": "CI_PIPELINE_CREATED_AT", "value": "2021-05-05T10:20:00Z", "public": true, "masked": false },
117-
{ "key": "CI_COMMIT_SHA", "value": "265c14cf140a66cfc61e40e4ab45c95ba8df5ed1", "public": true, "masked": false },
118-
{ "key": "CI_COMMIT_SHORT_SHA", "value": "265c14cf", "public": true, "masked": false },
119-
{ "key": "CI_COMMIT_BEFORE_SHA", "value": "fc40ad32cdd36b814f07a540605110edc209a38c", "public": true, "masked": false },
120-
{ "key": "CI_COMMIT_REF_NAME", "value": "custom", "public": true, "masked": false },
121-
{ "key": "CI_COMMIT_REF_SLUG", "value": "custom", "public": true, "masked": false },
122-
{ "key": "CI_COMMIT_BRANCH", "value": "custom", "public": true, "masked": false },
123-
{ "key": "CI_COMMIT_MESSAGE", "value": "test rust runner\n", "public": true, "masked": false },
124-
{ "key": "CI_COMMIT_TITLE", "value": "test rust runner", "public": true, "masked": false },
125-
{ "key": "CI_COMMIT_DESCRIPTION", "value": "", "public": true, "masked": false },
126-
{ "key": "CI_COMMIT_REF_PROTECTED", "value": "false", "public": true, "masked": false },
127-
{ "key": "CI_COMMIT_TIMESTAMP", "value": "2021-05-05T12:19:53+02:00", "public": true, "masked": false },
128-
{ "key": "CI_COMMIT_AUTHOR", "value": "Test User <[email protected]>", "public": true, "masked": false },
129-
{ "key": "CI_BUILD_REF", "value": "265c14cf140a66cfc61e40e4ab45c95ba8df5ed1", "public": true, "masked": false },
130-
{ "key": "CI_BUILD_BEFORE_SHA", "value": "fc40ad32cdd36b814f07a540605110edc209a38c", "public": true, "masked": false },
131-
{ "key": "CI_BUILD_REF_NAME", "value": "custom", "public": true, "masked": false },
132-
{ "key": "CI_BUILD_REF_SLUG", "value": "custom", "public": true, "masked": false },
133-
{ "key": "CI_RUNNER_ID", "value": "8", "public": true, "masked": false },
134-
{ "key": "CI_RUNNER_DESCRIPTION", "value": "Rust runner test", "public": true, "masked": false },
135-
{ "key": "CI_RUNNER_TAGS", "value": "rust-runner", "public": true, "masked": false },
136-
{ "key": "GITLAB_USER_ID", "value": "2", "public": true, "masked": false },
137-
{ "key": "GITLAB_USER_EMAIL", "value": "[email protected]", "public": true, "masked": false },
138-
{ "key": "GITLAB_USER_LOGIN", "value": "test", "public": true, "masked": false },
139-
{ "key": "GITLAB_USER_NAME", "value": "Test User", "public": true, "masked": false }
140-
]);
14164
let dependencies: Vec<_> = job
14265
.dependencies()
14366
.iter()
@@ -201,7 +124,7 @@ impl Respond for JobRequestResponder {
201124
"timeout": 3600,
202125
"runner_session_url": null
203126
},
204-
"variables": variables,
127+
"variables": job.variables(),
205128
"steps": job.steps(),
206129
"image": null,
207130
"services": [],

gitlab-runner-mock/src/job.rs

+34
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
use serde::Deserialize;
22
use serde::Serialize;
3+
use std::collections::HashMap;
34
use std::sync::Arc;
45
use std::sync::Mutex;
56
use thiserror::Error;
67

8+
use crate::variables::default_job_variables;
9+
710
#[derive(Copy, Clone, Debug, PartialEq, Eq, Deserialize)]
811
#[serde(rename_all = "lowercase")]
912
pub enum MockJobState {
@@ -36,6 +39,14 @@ pub(crate) struct MockJobInner {
3639
log_patches: u32,
3740
}
3841

42+
#[derive(Clone, Serialize, Debug)]
43+
pub struct MockJobVariable {
44+
pub key: String,
45+
pub value: String,
46+
pub public: bool,
47+
pub masked: bool,
48+
}
49+
3950
#[derive(Copy, Clone, Serialize, Debug, Eq, PartialEq)]
4051
#[serde(rename_all = "snake_case")]
4152
pub enum MockJobStepWhen {
@@ -84,6 +95,7 @@ pub struct MockJob {
8495
name: String,
8596
id: u64,
8697
token: String,
98+
variables: Vec<MockJobVariable>,
8799
steps: Vec<MockJobStep>,
88100
dependencies: Vec<MockJob>,
89101
artifacts: Vec<MockJobArtifact>,
@@ -124,6 +136,10 @@ impl MockJob {
124136
&self.artifacts
125137
}
126138

139+
pub fn variables(&self) -> &[MockJobVariable] {
140+
&self.variables
141+
}
142+
127143
pub fn steps(&self) -> &[MockJobStep] {
128144
&self.steps
129145
}
@@ -202,6 +218,7 @@ impl MockJob {
202218
pub struct MockJobBuilder {
203219
name: String,
204220
id: u64,
221+
variables: HashMap<String, MockJobVariable>,
205222
steps: Vec<MockJobStep>,
206223
dependencies: Vec<MockJob>,
207224
artifacts: Vec<MockJobArtifact>,
@@ -212,10 +229,26 @@ impl MockJobBuilder {
212229
Self {
213230
name,
214231
id,
232+
variables: default_job_variables(id)
233+
.into_iter()
234+
.map(|v| (v.key.clone(), v))
235+
.collect(),
215236
..Default::default()
216237
}
217238
}
218239

240+
pub fn add_variable(&mut self, key: String, value: String, public: bool, masked: bool) {
241+
self.variables.insert(
242+
key.clone(),
243+
MockJobVariable {
244+
key,
245+
value,
246+
public,
247+
masked,
248+
},
249+
);
250+
}
251+
219252
pub fn add_step(
220253
&mut self,
221254
name: MockJobStepName,
@@ -293,6 +326,7 @@ impl MockJobBuilder {
293326
id: self.id,
294327
token: format!("job-token-{}", self.id),
295328
steps: self.steps,
329+
variables: self.variables.into_values().collect(),
296330
dependencies: self.dependencies,
297331
artifacts: self.artifacts,
298332
inner,

gitlab-runner-mock/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use wiremock::matchers::{body_json_schema, method, path, path_regex};
88
use wiremock::{Mock, MockServer};
99

1010
mod job;
11+
mod variables;
1112
pub use job::{
1213
MockJob, MockJobArtifactWhen, MockJobBuilder, MockJobState, MockJobStepName, MockJobStepWhen,
1314
};

0 commit comments

Comments
 (0)