Skip to content

Commit 247ab4a

Browse files
authored
feat(plumber): inject SEMAPHORE_BLOCK_NAME env to jobs (#319)
## 📝 Description Adding SEMAPHORE_BLOCK_NAME env variable to jobs. This will allow showing better metrics about jobs on a workflow. ## ✅ Checklist - [x] I have tested this change - [ ] This change requires documentation update
1 parent 69591c1 commit 247ab4a

File tree

5 files changed

+103
-83
lines changed

5 files changed

+103
-83
lines changed

docs/docs/reference/env-vars.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ A string with a user-supplied name for the job.
8888
- **Environment variable**: `SEMAPHORE_JOB_COUNT`
8989
- **Example**: 4
9090

91-
Only available when [job parallelism](../using-semaphore/jobs#job-parallelism) is enabled. This variable holds the total number of jobs configured in job parallelism.
91+
Only available when [job parallelism](../using-semaphore/jobs#job-parallelism) is enabled. This variable holds the total number of jobs configured in job parallelism.
9292

9393
It can be used to configure a test partitioning strategy using a 3rd party test runner.
9494

@@ -130,6 +130,13 @@ Describes why the current job was created. The possible values are:
130130
- `project_debug_job`: job created with [`sem debug project`](./semaphore-cli#sem-debug-project)
131131
- `debug_job`: job created with [`sem debug job`](./semaphore-cli#sem-debug)
132132

133+
### Block name {#block-name}
134+
135+
- **Environment variable**: `SEMAPHORE_BLOCK_NAME`
136+
- **Example**: `Security checks`
137+
138+
A string with a user-supplied block name.
139+
133140
### Organization URL {#organization-url}
134141

135142
- **Environment variable**: `SEMAPHORE_ORGANIZATION_URL`
@@ -504,7 +511,7 @@ The time that the pipeline spent in the queue is expressed in seconds.
504511
- **Environment variable**: `SEMAPHORE_PIPELINE_RESULT`
505512
- **Example**: `failed`, `passed`, `canceled`, `stopped`
506513

507-
Contains the result of the pipeline. Possible values are: `failed`, `passed`, `canceled`, `stopped`
514+
Contains the result of the pipeline. Possible values are: `failed`, `passed`, `canceled`, `stopped`
508515

509516
### Pipeline result reason {#pipeline-result-reason}
510517

plumber/ppl/lib/ppl/definition_reviser/blocks_reviser.ex

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
defmodule Ppl.DefinitionReviser.BlocksReviser do
2+
require Logger
23
@moduledoc """
34
Module performs necessary transformations on raw block definition.
45
"""
@@ -11,6 +12,7 @@ defmodule Ppl.DefinitionReviser.BlocksReviser do
1112
@ppl_artefact_id_env_var_name "SEMAPHORE_PIPELINE_ARTEFACT_ID"
1213
@ppl_id_env_var_name "SEMAPHORE_PIPELINE_ID"
1314
@pipeline_rerun "SEMAPHORE_PIPELINE_RERUN"
15+
@block_name "SEMAPHORE_BLOCK_NAME"
1416
@pipeline_promotion "SEMAPHORE_PIPELINE_PROMOTION"
1517
@pipeline_promoted_by "SEMAPHORE_PIPELINE_PROMOTED_BY"
1618
@workflow_id_env_var_name "SEMAPHORE_WORKFLOW_ID"
@@ -234,7 +236,7 @@ defmodule Ppl.DefinitionReviser.BlocksReviser do
234236
defp set_ppl_env_vars_(block_def, ppl_req, ppl, promoter, triggerer) do
235237
ppl_env_vars =
236238
ppl_req
237-
|> basic_env_vars(ppl, promoter, triggerer)
239+
|> basic_env_vars(ppl, promoter, triggerer, block_def)
238240
|> env_vars_from_prev_ppl_artefact_ids(ppl_req.prev_ppl_artefact_ids ++ [ppl_req.ppl_artefact_id])
239241
|> Enum.concat(Map.get(ppl_req.request_args, "env_vars", []))
240242

@@ -253,8 +255,9 @@ defmodule Ppl.DefinitionReviser.BlocksReviser do
253255
list ++ prev_ids_env_vars
254256
end
255257

256-
defp basic_env_vars(ppl_req, ppl, promoter, triggerer) do
258+
defp basic_env_vars(ppl_req, ppl, promoter, triggerer, block_def) do
257259
snapshot_id = get_snapshot_id(ppl_req.request_args)
260+
block_name = get_block_name(block_def)
258261

259262
[
260263
%{"name" => @workflow_id_env_var_name, "value" => "#{ppl_req.wf_id}"},
@@ -267,6 +270,7 @@ defmodule Ppl.DefinitionReviser.BlocksReviser do
267270
%{"name" => @workflow_triggered_by_manual_run, "value" => manual_run?(ppl_req.request_args)},
268271
%{"name" => @ppl_artefact_id_env_var_name, "value" => "#{ppl_req.ppl_artefact_id}"},
269272
%{"name" => @ppl_id_env_var_name, "value" => "#{ppl_req.id}"},
273+
%{"name" => @block_name, "value" => block_name},
270274
%{"name" => @pipeline_rerun, "value" => ppl_rerun?(ppl.partial_rebuild_of)},
271275
%{"name" => @pipeline_promotion, "value" => promotion?(ppl.extension_of)},
272276
%{"name" => @pipeline_promoted_by, "value" => promoter},
@@ -312,4 +316,7 @@ defmodule Ppl.DefinitionReviser.BlocksReviser do
312316
defp committer(source_args) when is_map(source_args),
313317
do: Map.get(source_args, "repo_host_username", "")
314318
defp committer(_source_args), do: ""
319+
320+
defp get_block_name(%{"name" => name}), do: name
321+
defp get_block_name(_block_def), do: ""
315322
end

plumber/ppl/test/definition_reviser/blocks_reviser_test.exs

Lines changed: 79 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ defmodule Ppl.DefinitionReviser.BlocksReviser.Test do
2626
assert {:ok, real_ppl_req} = PplRequestsQueries.get_by_id(ppl_id)
2727

2828
agent = %{"machine" => %{"type" => "e1-standard-2", "os_image" => "ubuntu1804"}}
29-
blocks = [%{"build" => %{}}, %{"build" => %{}}]
29+
blocks = [%{"build" => %{}, "name" => "blk 0"}, %{"build" => %{}, "name" => "blk 1"}]
3030
ppl_def = %{"agent" => agent, "blocks" => blocks}
3131
args = %{"service" => "local", "repo_name" => "4_cmd_file", "branch_name" => "master",
3232
"commit_sha" => "sha_1", "working_dir" => ".semaphore", "file_name" => "semaphore.yml"}
@@ -38,6 +38,7 @@ defmodule Ppl.DefinitionReviser.BlocksReviser.Test do
3838

3939
@ppl_id_env_var_name "SEMAPHORE_PIPELINE_ID"
4040
@artefact_id_env_var_name "SEMAPHORE_PIPELINE_ARTEFACT_ID"
41+
@block_name "SEMAPHORE_BLOCK_NAME"
4142
@pipeline_rerun "SEMAPHORE_PIPELINE_RERUN"
4243
@pipeline_promotion "SEMAPHORE_PIPELINE_PROMOTION"
4344
@pipeline_promoted_by "SEMAPHORE_PIPELINE_PROMOTED_BY"
@@ -76,24 +77,26 @@ defmodule Ppl.DefinitionReviser.BlocksReviser.Test do
7677
assert %{"blocks" => blocks} = revised_def
7778
assert is_list(blocks)
7879

79-
expected_env_vars = [%{"name" => @workflow_id_env_var_name, "value" => ctx.ppl_req.wf_id},
80-
%{"name" => @workflow_number_env_var_name, "value" => "1"},
81-
%{"name" => @workflow_rerun, "value" => "false"},
82-
%{"name" => @workflow_triggered_by_hook, "value" => "true"},
83-
%{"name" => @workflow_hook_source, "value" => "github"},
84-
%{"name" => @workflow_triggered_by_schedule, "value" => "false"},
85-
%{"name" => @workflow_triggered_by_api, "value" => "false"},
86-
%{"name" => @workflow_triggered_by_manual_run, "value" => "false"},
87-
%{"name" => @artefact_id_env_var_name, "value" => "A1"},
88-
%{"name" => @ppl_id_env_var_name, "value" => ctx.ppl_req.id},
89-
%{"name" => @pipeline_rerun, "value" => "false"},
90-
%{"name" => @pipeline_promotion, "value" => "false"},
91-
%{"name" => @pipeline_promoted_by, "value" => ""},
92-
%{"name" => @workflow_triggered_by, "value" => "gh_username_1"},
93-
%{"name" => @git_commit_author, "value" => "gh_username_2"},
94-
%{"name" => @git_committer, "value" => "gh_username_1"},
95-
%{"name" => "SEMAPHORE_PIPELINE_0_ARTEFACT_ID", "value" => "A1"}]
9680
blocks |> Enum.map(fn block ->
81+
expected_env_vars = [%{"name" => @workflow_id_env_var_name, "value" => ctx.ppl_req.wf_id},
82+
%{"name" => @workflow_number_env_var_name, "value" => "1"},
83+
%{"name" => @workflow_rerun, "value" => "false"},
84+
%{"name" => @workflow_triggered_by_hook, "value" => "true"},
85+
%{"name" => @workflow_hook_source, "value" => "github"},
86+
%{"name" => @workflow_triggered_by_schedule, "value" => "false"},
87+
%{"name" => @workflow_triggered_by_api, "value" => "false"},
88+
%{"name" => @workflow_triggered_by_manual_run, "value" => "false"},
89+
%{"name" => @artefact_id_env_var_name, "value" => "A1"},
90+
%{"name" => @ppl_id_env_var_name, "value" => ctx.ppl_req.id},
91+
%{"name" => @block_name, "value" => block["name"]},
92+
%{"name" => @pipeline_rerun, "value" => "false"},
93+
%{"name" => @pipeline_promotion, "value" => "false"},
94+
%{"name" => @pipeline_promoted_by, "value" => ""},
95+
%{"name" => @workflow_triggered_by, "value" => "gh_username_1"},
96+
%{"name" => @git_commit_author, "value" => "gh_username_2"},
97+
%{"name" => @git_committer, "value" => "gh_username_1"},
98+
%{"name" => "SEMAPHORE_PIPELINE_0_ARTEFACT_ID", "value" => "A1"}]
99+
97100
assert is_map(block)
98101
assert get_in(block, ["build", "ppl_env_variables"]) == expected_env_vars
99102
end)
@@ -107,26 +110,27 @@ defmodule Ppl.DefinitionReviser.BlocksReviser.Test do
107110
assert %{"blocks" => blocks} = revised_def
108111
assert is_list(blocks)
109112

110-
expected_env_vars = [%{"name" => @workflow_id_env_var_name, "value" => ctx.ppl_req.wf_id},
111-
%{"name" => @workflow_number_env_var_name, "value" => "1"},
112-
%{"name" => @workflow_rerun, "value" => "false"},
113-
%{"name" => @workflow_triggered_by_hook, "value" => "true"},
114-
%{"name" => @workflow_hook_source, "value" => "github"},
115-
%{"name" => @workflow_triggered_by_schedule, "value" => "false"},
116-
%{"name" => @workflow_triggered_by_api, "value" => "false"},
117-
%{"name" => @workflow_triggered_by_manual_run, "value" => "false"},
118-
%{"name" => @artefact_id_env_var_name, "value" => "A1"},
119-
%{"name" => @ppl_id_env_var_name, "value" => ctx.ppl_req.id},
120-
%{"name" => @pipeline_rerun, "value" => "false"},
121-
%{"name" => @pipeline_promotion, "value" => "false"},
122-
%{"name" => @pipeline_promoted_by, "value" => ""},
123-
%{"name" => @workflow_triggered_by, "value" => "gh_username_1"},
124-
%{"name" => @git_commit_author, "value" => "gh_username_2"},
125-
%{"name" => @git_committer, "value" => "gh_username_1"},
126-
%{"name" => "SEMAPHORE_PIPELINE_0_ARTEFACT_ID", "value" => "A1"},
127-
%{"name" => "TEST", "value" => "VALUE"}]
128-
129113
blocks |> Enum.map(fn block ->
114+
expected_env_vars = [%{"name" => @workflow_id_env_var_name, "value" => ctx.ppl_req.wf_id},
115+
%{"name" => @workflow_number_env_var_name, "value" => "1"},
116+
%{"name" => @workflow_rerun, "value" => "false"},
117+
%{"name" => @workflow_triggered_by_hook, "value" => "true"},
118+
%{"name" => @workflow_hook_source, "value" => "github"},
119+
%{"name" => @workflow_triggered_by_schedule, "value" => "false"},
120+
%{"name" => @workflow_triggered_by_api, "value" => "false"},
121+
%{"name" => @workflow_triggered_by_manual_run, "value" => "false"},
122+
%{"name" => @artefact_id_env_var_name, "value" => "A1"},
123+
%{"name" => @ppl_id_env_var_name, "value" => ctx.ppl_req.id},
124+
%{"name" => @block_name, "value" => block["name"]},
125+
%{"name" => @pipeline_rerun, "value" => "false"},
126+
%{"name" => @pipeline_promotion, "value" => "false"},
127+
%{"name" => @pipeline_promoted_by, "value" => ""},
128+
%{"name" => @workflow_triggered_by, "value" => "gh_username_1"},
129+
%{"name" => @git_commit_author, "value" => "gh_username_2"},
130+
%{"name" => @git_committer, "value" => "gh_username_1"},
131+
%{"name" => "SEMAPHORE_PIPELINE_0_ARTEFACT_ID", "value" => "A1"},
132+
%{"name" => "TEST", "value" => "VALUE"}]
133+
130134
assert is_map(block)
131135
assert get_in(block, ["build", "ppl_env_variables"]) == expected_env_vars
132136
end)
@@ -137,26 +141,27 @@ defmodule Ppl.DefinitionReviser.BlocksReviser.Test do
137141
assert {:ok, revised_def} = BlocksReviser.revise_blocks_definition(ctx.ppl_def, ppl_req)
138142
assert %{"blocks" => blocks} = revised_def
139143
assert is_list(blocks)
140-
141-
expected_env_vars = [%{"name" => @workflow_id_env_var_name, "value" => ctx.ppl_req.wf_id},
142-
%{"name" => @workflow_number_env_var_name, "value" => "1"},
143-
%{"name" => @workflow_rerun, "value" => "false"},
144-
%{"name" => @workflow_triggered_by_hook, "value" => "true"},
145-
%{"name" => @workflow_hook_source, "value" => "github"},
146-
%{"name" => @workflow_triggered_by_schedule, "value" => "false"},
147-
%{"name" => @workflow_triggered_by_api, "value" => "false"},
148-
%{"name" => @workflow_triggered_by_manual_run, "value" => "false"},
149-
%{"name" => @artefact_id_env_var_name, "value" => "A1"},
150-
%{"name" => @ppl_id_env_var_name, "value" => ctx.ppl_req.id},
151-
%{"name" => @pipeline_rerun, "value" => "false"},
152-
%{"name" => @pipeline_promotion, "value" => "false"},
153-
%{"name" => @pipeline_promoted_by, "value" => ""},
154-
%{"name" => @workflow_triggered_by, "value" => "gh_username_1"},
155-
%{"name" => @git_commit_author, "value" => "gh_username_2"},
156-
%{"name" => @git_committer, "value" => "gh_username_1"},
157-
%{"name" => "SEMAPHORE_PIPELINE_0_ARTEFACT_ID", "value" => "Previous id value"},
158-
%{"name" => "SEMAPHORE_PIPELINE_1_ARTEFACT_ID", "value" => "A1"}]
159144
blocks |> Enum.map(fn block ->
145+
expected_env_vars = [%{"name" => @workflow_id_env_var_name, "value" => ctx.ppl_req.wf_id},
146+
%{"name" => @workflow_number_env_var_name, "value" => "1"},
147+
%{"name" => @workflow_rerun, "value" => "false"},
148+
%{"name" => @workflow_triggered_by_hook, "value" => "true"},
149+
%{"name" => @workflow_hook_source, "value" => "github"},
150+
%{"name" => @workflow_triggered_by_schedule, "value" => "false"},
151+
%{"name" => @workflow_triggered_by_api, "value" => "false"},
152+
%{"name" => @workflow_triggered_by_manual_run, "value" => "false"},
153+
%{"name" => @artefact_id_env_var_name, "value" => "A1"},
154+
%{"name" => @ppl_id_env_var_name, "value" => ctx.ppl_req.id},
155+
%{"name" => @block_name, "value" => block["name"]},
156+
%{"name" => @pipeline_rerun, "value" => "false"},
157+
%{"name" => @pipeline_promotion, "value" => "false"},
158+
%{"name" => @pipeline_promoted_by, "value" => ""},
159+
%{"name" => @workflow_triggered_by, "value" => "gh_username_1"},
160+
%{"name" => @git_commit_author, "value" => "gh_username_2"},
161+
%{"name" => @git_committer, "value" => "gh_username_1"},
162+
%{"name" => "SEMAPHORE_PIPELINE_0_ARTEFACT_ID", "value" => "Previous id value"},
163+
%{"name" => "SEMAPHORE_PIPELINE_1_ARTEFACT_ID", "value" => "A1"}]
164+
160165
assert is_map(block)
161166
assert get_in(block, ["build", "ppl_env_variables"]) == expected_env_vars
162167
end)
@@ -199,25 +204,25 @@ defmodule Ppl.DefinitionReviser.BlocksReviser.Test do
199204
assert %{"blocks" => blocks} = revised_def
200205
assert is_list(blocks)
201206

202-
expected_env_vars = [%{"name" => @workflow_id_env_var_name, "value" => ctx.ppl_req.wf_id},
203-
%{"name" => @workflow_number_env_var_name, "value" => "1"},
204-
%{"name" => @workflow_rerun, "value" => "false"},
205-
%{"name" => @workflow_triggered_by_hook, "value" => "true"},
206-
%{"name" => @workflow_hook_source, "value" => "github"},
207-
%{"name" => @workflow_triggered_by_schedule, "value" => "false"},
208-
%{"name" => @workflow_triggered_by_api, "value" => "false"},
209-
%{"name" => @workflow_triggered_by_manual_run, "value" => "false"},
210-
%{"name" => @artefact_id_env_var_name, "value" => "A1"},
211-
%{"name" => @ppl_id_env_var_name, "value" => ctx.ppl_req.id},
212-
%{"name" => @pipeline_rerun, "value" => "false"},
213-
%{"name" => @pipeline_promotion, "value" => "false"},
214-
%{"name" => @pipeline_promoted_by, "value" => "github_username_1"},
215-
%{"name" => @workflow_triggered_by, "value" => "github_username_2"},
216-
%{"name" => @git_commit_author, "value" => "gh_username_2"},
217-
%{"name" => @git_committer, "value" => "gh_username_1"},
218-
%{"name" => "SEMAPHORE_PIPELINE_0_ARTEFACT_ID", "value" => "A1"}]
219-
220207
blocks |> Enum.map(fn block ->
208+
expected_env_vars = [%{"name" => @workflow_id_env_var_name, "value" => ctx.ppl_req.wf_id},
209+
%{"name" => @workflow_number_env_var_name, "value" => "1"},
210+
%{"name" => @workflow_rerun, "value" => "false"},
211+
%{"name" => @workflow_triggered_by_hook, "value" => "true"},
212+
%{"name" => @workflow_hook_source, "value" => "github"},
213+
%{"name" => @workflow_triggered_by_schedule, "value" => "false"},
214+
%{"name" => @workflow_triggered_by_api, "value" => "false"},
215+
%{"name" => @workflow_triggered_by_manual_run, "value" => "false"},
216+
%{"name" => @artefact_id_env_var_name, "value" => "A1"},
217+
%{"name" => @ppl_id_env_var_name, "value" => ctx.ppl_req.id},
218+
%{"name" => @block_name, "value" => block["name"]},
219+
%{"name" => @pipeline_rerun, "value" => "false"},
220+
%{"name" => @pipeline_promotion, "value" => "false"},
221+
%{"name" => @pipeline_promoted_by, "value" => "github_username_1"},
222+
%{"name" => @workflow_triggered_by, "value" => "github_username_2"},
223+
%{"name" => @git_commit_author, "value" => "gh_username_2"},
224+
%{"name" => @git_committer, "value" => "gh_username_1"},
225+
%{"name" => "SEMAPHORE_PIPELINE_0_ARTEFACT_ID", "value" => "A1"}]
221226
assert is_map(block)
222227
assert get_in(block, ["build", "ppl_env_variables"]) == expected_env_vars
223228
end)

plumber/ppl/test/ppl_blocks/stm_handler/run_test.exs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ defmodule Ppl.PplBlocks.STMHandler.WaitingState.Test do
4444
assert {:ok, ppl_blk} = insert_ppl_blk(ppl_id, 0)
4545
assert ppl_blk.state == "waiting"
4646

47-
with_mock Block, [schedule: &(mocked_schedule({&1, ppl_id, workflow_id, ctx.ppl_req.request_args})),
47+
with_mock Block, [schedule: &(mocked_schedule({&1, ppl_id, workflow_id, ctx.ppl_req.request_args, ppl_blk.name})),
4848
status: &mocked_status(&1)] do
4949
assert {:ok, result_func} = WaitingState.scheduling_handler(ppl_blk)
5050

@@ -65,7 +65,7 @@ defmodule Ppl.PplBlocks.STMHandler.WaitingState.Test do
6565

6666
insert_connections(ctx.ppl_req)
6767

68-
with_mock Block, [schedule: &(mocked_schedule({&1, ppl_id, workflow_id, ctx.ppl_req.request_args})),
68+
with_mock Block, [schedule: &(mocked_schedule({&1, ppl_id, workflow_id, ctx.ppl_req.request_args, ppl_blk.name})),
6969
status: &mocked_status(&1)] do
7070
assert {:ok, result_func} = WaitingState.scheduling_handler(ppl_blk)
7171

@@ -86,7 +86,7 @@ defmodule Ppl.PplBlocks.STMHandler.WaitingState.Test do
8686

8787
insert_connections(ctx.ppl_req)
8888

89-
with_mock Block, [schedule: &(mocked_schedule({&1, ppl_id, workflow_id, ctx.ppl_req.request_args})),
89+
with_mock Block, [schedule: &(mocked_schedule({&1, ppl_id, workflow_id, ctx.ppl_req.request_args, ppl_blk.name})),
9090
status: &mocked_status(&1)] do
9191
assert {:ok, result_func} = WaitingState.scheduling_handler(ppl_blk)
9292

@@ -122,7 +122,7 @@ defmodule Ppl.PplBlocks.STMHandler.WaitingState.Test do
122122
{:ok, ppl_blk}
123123
end
124124

125-
defp mocked_schedule({schedule_request, id, workflow_id, req_args}) do
125+
defp mocked_schedule({schedule_request, id, workflow_id, req_args, blk_name}) do
126126
assert schedule_request.ppl_id == id
127127
assert get_in(schedule_request.definition, ["build", "agent", "machine"]) == %{"os_image" => "bar", "type" => "foo"}
128128
ppl_env_vars = [%{"name" => "SEMAPHORE_WORKFLOW_ID", "value" => "#{workflow_id}"},
@@ -135,6 +135,7 @@ defmodule Ppl.PplBlocks.STMHandler.WaitingState.Test do
135135
%{"name" => "SEMAPHORE_WORKFLOW_TRIGGERED_BY_MANUAL_RUN", "value" => "false"},
136136
%{"name" => "SEMAPHORE_PIPELINE_ARTEFACT_ID", "value" => "#{id}"},
137137
%{"name" => "SEMAPHORE_PIPELINE_ID", "value" => "#{id}"},
138+
%{"name" => "SEMAPHORE_BLOCK_NAME", "value" => blk_name},
138139
%{"name" => "SEMAPHORE_PIPELINE_RERUN", "value" => "false"},
139140
%{"name" => "SEMAPHORE_PIPELINE_PROMOTION", "value" => "false"},
140141
%{"name" => "SEMAPHORE_PIPELINE_PROMOTED_BY", "value" => ""},

0 commit comments

Comments
 (0)