Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,17 @@ jobs:
file: Dockerfile
platforms: linux/amd64,linux/arm64
tags: wurstbrot/dsomm-yaml-generation:${{ steps.get-version.outputs.version }},wurstbrot/dsomm-yaml-generation:latest
- name: Extract generated.yaml
- name: Extract generated.yaml and activities.yaml
run: |
docker run -d --name=yaml --entrypoint="/bin/sleep" wurstbrot/dsomm-yaml-generation:${{ steps.get-version.outputs.version }} 60
docker cp yaml:/var/www/html/src/assets/YAML/generated/generated.yaml src/assets/YAML/generated/generated.yaml
# Commit all changed files back to the repository
- uses: planetscale/ghcommit-action@v0.1.6
docker cp yaml:/var/www/html/src/assets/YAML/generated/generated.yaml src/assets/YAML/generated/generated.yaml # TODO: Remove
Copy link
Collaborator

@vbakke vbakke Nov 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ref the discussion we had regarding having the generated and input source files in the same folder, @wurstbrot:

What about keeping the source yaml files as they are, and move generated folder to root? Then it is not under src and will be obvious for anyone downloading the project.

 /
   - src/assets/YAML/**
   - generated/
      - activities.yaml
      - dependency-tree.md
   - scripts/
        - generateDimensions.php
        - ...   

(And we don't need to rename /yaml-generation to /scripts, btw. It's just a suggestion to make things more self explanatory. But it will have a side-effect on trigering the php file.)

docker cp yaml:/var/www/html/src/assets/YAML/activities.yaml src/assets/YAML/activities.yaml

- name: Replace version placeholder in activities.yaml
run: |
sed -i "s/__VERSION_PLACEHOLDER__/${{ steps.get-version.outputs.version }}/g" src/assets/YAML/activities.yaml
- name: Commit all changed files back to the repository
uses: planetscale/ghcommit-action@v0.1.6
with:
commit_message: "🤖 fmt"
repo: ${{ github.repository }}
Expand Down
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,11 @@ testem.log
.DS_Store
Thumbs.db
/yaml-generation/vendor/
# Generated YAML

/src/assets/YAML/teams.yaml
/src/assets/YAML/meta.yaml

# Generated
/src/assets/YAML/generated/generated.yaml
/src/assets/YAML/activities.yaml
src/assets/YAML/generated/dependency-tree.md
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ docker run -ti -v $(pwd)/src/assets/YAML/default:/var/www/html/src/assets/YAML/d
docker run -v $(pwd)/src/assets/YAML/generated/generated.yaml:/srv/assets/YAML/generated/generated.yaml -p 8080:8080 wurstbrot/dsomm
```

## Development
cd yaml-generation
docker run --rm -v $(pwd):/app composer install
cd ..
docker run -ti -v $(pwd)/yaml-generation:/var/www/html/yaml-generation -v $(pwd)/src/assets/YAML/:/var/www/html/src/assets/YAML/ wurstbrot/dsomm-yaml-generation

## Credits

* The dimension _Test and Verification_ is based on Christian Schneiders [Security DevOps Maturity Model (SDOMM)](https://www.christian-schneider.net/SecurityDevOpsMaturityModel.html). _Application tests_ and _Infrastructure tests_ are added by Timo Pagel. Also, the sub-dimension _Static depth_ has been evaluated by security experts at [OWASP Stammtisch Hamburg](https://www.owasp.org/index.php/OWASP_German_Chapter_Stammtisch_Initiative/Hamburg).
Expand Down
56 changes: 22 additions & 34 deletions yaml-generation/generateDimensions.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,6 @@

$errorMsg = array();
$implementationReferenceFile = "src/assets/YAML/default/implementations.yaml";
$metadata = readYaml("src/assets/YAML/meta.yaml");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I just saw your comment about compatibility, @wurstbrot. We still need these lines to be compatible with generated.yaml. But they can be removed for activities.yaml.


$teams = $metadata["teams"];
if (sizeof($teams) == 0) {
echo "Warning: No teams defined";
}
$teamsImplemented = array();
foreach ($teams as $team) {
$teamsImplemented[$team] = false;
}

$files = glob("src/assets/YAML/default/*/*.yaml");
$dimensions = array();
Expand Down Expand Up @@ -89,29 +79,6 @@
if (!array_key_exists("tags", $activity)) {
$dimensionsAggregated[$dimension][$subdimension][$activityName]["tags"] = ["none"];
}
if (!array_key_exists("teamsImplemented", $activity)) {
$dimensionsAggregated[$dimension][$subdimension][$activityName]["teamsImplemented"] = array();
}
$evidenceImplemented = array();
if (array_key_exists("teamsEvidence", $activity) && is_array($activity["teamsEvidence"]) && IS_IMPLEMENTED_WHEN_EVIDENCE) {
foreach ($activity["teamsEvidence"] as $team => $evidenceForTeam) {
if(!is_string($activity["teamsEvidence"][$team])) {
echo "teamsEvidence for team $team in $activityName is not a string, ignoring";
continue;
}
if (strlen($activity["teamsEvidence"][$team]) > 0) {
$evidenceImplemented[$team] = true;
} else {
echo "Warning: '$activityName -> evidence -> $team' has no evidence set but should have";
}
}
}
$dimensionsAggregated[$dimension][$subdimension][$activityName]["teamsImplemented"] =
array_merge(
$teamsImplemented,
$dimensionsAggregated[$dimension][$subdimension][$activityName]["teamsImplemented"],
$evidenceImplemented
);
if (!array_key_exists("openCRE", $activity["references"])) {
$dimensionsAggregated[$dimension][$subdimension][$activityName]["references"]["openCRE"] = array();
$dimensionsAggregated[$dimension][$subdimension][$activityName]["references"]["openCRE"][] = "https://www.opencre.org/rest/v1/standard/DevSecOps+Maturity+Model+(DSOMM)/" . $subdimension . "/" . $dimensionsAggregated[$dimension][$subdimension][$activityName]["uuid"];
Expand Down Expand Up @@ -193,12 +160,33 @@
}


// Store generated data
// Store generated data with meta document first
Copy link
Collaborator

@vbakke vbakke Nov 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great! 🙂
I'll copy this in DSOMM app👍

$metaDocument = array(
'meta' => array(
'version' => '__VERSION_PLACEHOLDER__',
'released' => date('Y-m-d'),
'publisher' => 'https://github.com/devsecopsmaturitymodel/DevSecOps-MaturityModel-data/'
)
);

$metaString = yaml_emit($metaDocument);
$dimensionsString = yaml_emit($dimensionsAggregated);

// Combine both documents with proper YAML document separators
// Remove trailing ... from meta document and add proper separator
$metaString = rtrim($metaString);
if (substr($metaString, -3) === '...') {
$metaString = substr($metaString, 0, -3);
}

$targetGeneratedFile = getcwd() . "/src/assets/YAML/generated/generated.yaml";
echo "\nStoring to $targetGeneratedFile\n";
file_put_contents($targetGeneratedFile, $dimensionsString);

$combinedYaml = $metaString . $dimensionsString;
$targetGeneratedFile = getcwd() . "/src/assets/YAML/activities.yaml";
echo "\nStoring to $targetGeneratedFile\n";
file_put_contents($targetGeneratedFile, $combinedYaml);

// Store dependency graph
$graphFilename = getcwd() . "/src/assets/YAML/generated/dependency-tree.md";
Expand Down