|
10 | 10 | - main |
11 | 11 | workflow_dispatch: |
12 | 12 |
|
| 13 | +permissions: |
| 14 | + contents: read |
| 15 | + |
13 | 16 | jobs: |
14 | 17 | # We build from source and commit all generated file changes so that we can see the impact in PRs |
15 | 18 | # We want to ensure that the commit of built changes does happen, so fail if building creates changes |
@@ -91,193 +94,3 @@ jobs: |
91 | 94 | for checkov_values in charts/matrix-stack/ci/*checkov*values.yaml; do |
92 | 95 | scripts/checkov.sh "$checkov_values" |
93 | 96 | done |
94 | | -
|
95 | | - template-dyff: |
96 | | - runs-on: ubuntu-latest |
97 | | - permissions: |
98 | | - contents: read |
99 | | - pull-requests: write # required to post a comment to a pull request |
100 | | - steps: |
101 | | - - name: Checkout PR |
102 | | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 |
103 | | - with: |
104 | | - fetch-depth: 0 |
105 | | - |
106 | | - # helm template doesn't reliably order manifests within the same kind, so use yq to do it for us |
107 | | - - name: Generate manifests for PR |
108 | | - id: generate-manifests |
109 | | - run: | |
110 | | - mkdir -p "$RUNNER_TEMP/new" |
111 | | - for values in charts/matrix-stack/ci/*values.yaml; do |
112 | | - echo "Generating new templates with $values"; |
113 | | - mkdir -p "$RUNNER_TEMP/new/$(basename "$values" ".yaml")" |
114 | | - helm template \ |
115 | | - -n ess-ci \ |
116 | | - -a monitoring.coreos.com/v1/ServiceMonitor \ |
117 | | - -f "$values" charts/matrix-stack | \ |
118 | | - yq ea '[.] | .[] | splitDoc' | \ |
119 | | - yq -s "\"$RUNNER_TEMP/new/$(basename "$values" ".yaml")/\""' + ([.kind, .metadata.name] | join("-") | downcase) + ".yaml"' |
120 | | - done |
121 | | - echo "output_dir=$RUNNER_TEMP/new" | tee -a "$GITHUB_OUTPUT" |
122 | | -
|
123 | | - # We want the most recent common ancestor between the target & PR branches rather than the target branch itself |
124 | | - # There could have been more commits to the target branch since the PR branch was created and we don't want to see |
125 | | - # those changes in the dyff, only what this branch is doing. |
126 | | - - name: Determine most recent common ancestor of target and PR branches |
127 | | - id: merge-base |
128 | | - run: | |
129 | | - echo "merge-base=$(git merge-base ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }})" | tee -a "$GITHUB_OUTPUT" |
130 | | -
|
131 | | - - name: Checkout target |
132 | | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 |
133 | | - with: |
134 | | - ref: ${{ steps.merge-base.outputs.merge-base }} |
135 | | - |
136 | | - - name: Generate manifests for base |
137 | | - run: | |
138 | | - mkdir -p "$RUNNER_TEMP/old" |
139 | | - for values in charts/matrix-stack/ci/*values.yaml; do |
140 | | - echo "Generating old templates with $values"; |
141 | | - mkdir -p "$RUNNER_TEMP/old/$(basename "$values" ".yaml")" |
142 | | - helm template \ |
143 | | - -n ess-ci \ |
144 | | - -a monitoring.coreos.com/v1/ServiceMonitor \ |
145 | | - -f "$values" charts/matrix-stack | \ |
146 | | - yq ea '[.] | .[] | splitDoc' | \ |
147 | | - yq -s "\"$RUNNER_TEMP/old/$(basename "$values" ".yaml")/\""' + ([.kind, .metadata.name] | join("-") | downcase) + ".yaml"' |
148 | | - done |
149 | | -
|
150 | | - - name: Install dyff with asdf |
151 | | - uses: asdf-vm/actions/install@1902764435ca0dd2f3388eea723a4f92a4eb8302 # v4 |
152 | | - with: |
153 | | - tool_versions: | |
154 | | - dyff 1.10.1 |
155 | | -
|
156 | | - - name: Upload new manifests |
157 | | - id: upload-new |
158 | | - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 |
159 | | - with: |
160 | | - name: new-manifests |
161 | | - path: ${{ steps.generate-manifests.outputs.output_dir }} |
162 | | - retention-days: 1 |
163 | | - |
164 | | - - name: dyff old and new manifests |
165 | | - id: dyff |
166 | | - shell: bash |
167 | | - env: |
168 | | - ARTIFACT_URL: ${{ steps.upload-new.outputs.artifact-url }} |
169 | | - run: | |
170 | | - echo "output_dir=$RUNNER_TEMP" | tee -a "$GITHUB_OUTPUT" |
171 | | - values_directories=$(find "$RUNNER_TEMP/old" "$RUNNER_TEMP/new" -maxdepth 1 -type d | sed -E 's|'"$RUNNER_TEMP"'/(old\|new)||' | sed -E 's|^/||' | sort | uniq) |
172 | | - header="# dyff of changes in rendered templates of CI manifests\n\n" |
173 | | - comment_body="" |
174 | | - while read -r values_dir; do |
175 | | - if [ -z "$values_dir" ]; then |
176 | | - continue |
177 | | - fi |
178 | | -
|
179 | | - templates_files=$(find "$RUNNER_TEMP/old" "$RUNNER_TEMP/new" -maxdepth 2 -name '*.yaml' | grep "$values_dir" | sed -E 's|'"$RUNNER_TEMP"'/(old\|new)/||' | sort | uniq) |
180 | | - comment_templates_body="" |
181 | | -
|
182 | | - while read -r templates_file; do |
183 | | - current_file="$(basename "$templates_file")" |
184 | | - if [[ "$current_file" == ".yaml" ]] && [ ! -s "$template_file" ]; then |
185 | | - continue |
186 | | - fi |
187 | | -
|
188 | | - if [ ! -f "$RUNNER_TEMP/old/$templates_file" ]; then |
189 | | - api_version=$(yq '.apiVersion' "$RUNNER_TEMP/new/$templates_file") |
190 | | - kind=$(yq '.kind' "$RUNNER_TEMP/new/$templates_file") |
191 | | - name=$(yq '.metadata.name' "$RUNNER_TEMP/new/$templates_file") |
192 | | - namespace=$(yq '.metadata.namespace' "$RUNNER_TEMP/new/$templates_file") |
193 | | - metadata=$(yq '.metadata' "$RUNNER_TEMP/new/$templates_file") |
194 | | - comment_templates_body+="@@ $current_file @@\n" |
195 | | - comment_templates_body+="# $api_version/$kind/$namespace/$name\n" |
196 | | - comment_templates_body+="! + one file added - the full content of the file is available in ${ARTIFACT_URL}\n" |
197 | | - comment_templates_body+="+ apiVersion: $api_version\n" |
198 | | - comment_templates_body+="+ kind: $kind\n" |
199 | | - comment_templates_body+="+ metadata:\n" |
200 | | - while IFS= read -r line; do |
201 | | - comment_templates_body+="+ $line\n" |
202 | | - done <<< "$metadata" |
203 | | - comment_templates_body+="\n\n" |
204 | | - continue |
205 | | - fi |
206 | | -
|
207 | | - if [ ! -f "$RUNNER_TEMP/new/$templates_file" ]; then |
208 | | - api_version=$(yq '.apiVersion' "$RUNNER_TEMP/old/$templates_file" ) |
209 | | - kind=$(yq '.kind' "$RUNNER_TEMP/old/$templates_file") |
210 | | - name=$(yq '.metadata.name' "$RUNNER_TEMP/old/$templates_file") |
211 | | - namespace=$(yq '.metadata.namespace' "$RUNNER_TEMP/old/$templates_file") |
212 | | - metadata=$(yq '.metadata' "$RUNNER_TEMP/old/$templates_file") |
213 | | - comment_templates_body+="@@ $current_file @@\n" |
214 | | - comment_templates_body+="# $api_version/$kind/$namespace/$name\n" |
215 | | - comment_templates_body+="! - one file removed\n" |
216 | | - comment_templates_body+="- apiVersion: $api_version\n" |
217 | | - comment_templates_body+="- kind: $kind\n" |
218 | | - comment_templates_body+="- metadata:\n" |
219 | | - while IFS= read -r line; do |
220 | | - comment_templates_body+="- $line\n" |
221 | | - done <<< "$metadata" |
222 | | - comment_templates_body+="\n\n" |
223 | | - continue |
224 | | - fi |
225 | | -
|
226 | | - exit_code=0 |
227 | | - dyff_detail=$(dyff between --set-exit-code --omit-header --output=github "$RUNNER_TEMP/old/$templates_file" "$RUNNER_TEMP/new/$templates_file" 2>&1) || exit_code=$? |
228 | | - if [ $exit_code -ne 0 ]; then |
229 | | - if [[ "$dyff_detail" == *"failed to compare input files"* ]]; then |
230 | | - echo "failed with file $templates_file" |
231 | | - exit 1 |
232 | | - fi |
233 | | -
|
234 | | - api_version=$(yq '.apiVersion' "$RUNNER_TEMP/new/$templates_file") |
235 | | - kind=$(yq '.kind' "$RUNNER_TEMP/new/$templates_file") |
236 | | - name=$(yq '.metadata.name' "$RUNNER_TEMP/new/$templates_file") |
237 | | - namespace=$(yq '.metadata.namespace' "$RUNNER_TEMP/new/$templates_file") |
238 | | - resource_metadata="# $api_version/$kind/$namespace/$name" |
239 | | - comment_templates_body+=$(sed -e "1d" -e "/^@@/a$resource_metadata" <<< "$dyff_detail") |
240 | | - comment_templates_body+="\n\n\n" |
241 | | - fi |
242 | | - done <<< "$templates_files" |
243 | | -
|
244 | | - if [[ -n "$comment_templates_body" ]]; then |
245 | | - comment_body+="<details><summary><b>$values_dir.yaml</b></summary>\n" |
246 | | - comment_body+='\n```diff\n' |
247 | | - comment_body+="$comment_templates_body" |
248 | | - comment_body+='```\n' |
249 | | - comment_body+="\n</details>\n" |
250 | | - fi |
251 | | -
|
252 | | - done <<< "$values_directories" |
253 | | -
|
254 | | - if [ -z "$comment_body" ]; then |
255 | | - comment_body="No changes in rendered templates" |
256 | | - fi |
257 | | -
|
258 | | - echo -e "$header$comment_body" | tee "$RUNNER_TEMP/dyff-output.md" |
259 | | -
|
260 | | - - name: Upload generated manifests |
261 | | - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 |
262 | | - with: |
263 | | - name: dyff-templates |
264 | | - path: ${{ steps.dyff.outputs.output_dir }} |
265 | | - retention-days: 1 |
266 | | - |
267 | | - - name: Find dyff comment |
268 | | - if: github.event.pull_request.number != '' |
269 | | - uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3 |
270 | | - id: find-dyff-comment |
271 | | - with: |
272 | | - issue-number: ${{ github.event.pull_request.number }} |
273 | | - comment-author: 'github-actions[bot]' |
274 | | - body-includes: 'dyff of changes in rendered templates' |
275 | | - |
276 | | - - name: Create or update comment |
277 | | - if: github.event.pull_request.number != '' |
278 | | - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 |
279 | | - with: |
280 | | - comment-id: ${{ steps.find-dyff-comment.outputs.comment-id }} |
281 | | - issue-number: ${{ github.event.pull_request.number }} |
282 | | - body-path: ${{ runner.temp }}/dyff-output.md |
283 | | - edit-mode: replace |
0 commit comments