Skip to content

Commit bf3e6cc

Browse files
committed
feat(zizmor): Add Zizmor static analysis and update all rules to pass
1 parent 8839ac0 commit bf3e6cc

File tree

7 files changed

+160
-63
lines changed

7 files changed

+160
-63
lines changed

.github/workflows/diff-rendered-charts.yml

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@ jobs:
2323
uses: actions/checkout@v4
2424
with:
2525
fetch-depth: '100'
26+
persist-credentials: false
2627

2728
- name: find changed helm charts
2829
id: find_changed_charts
2930
run: |
30-
git fetch origin ${{ github.base_ref }}:${{ github.base_ref }}
31-
echo matrix_changed_charts=$(git diff --name-only ${{ github.base_ref }}...HEAD -- '**/k8s/**/*.yaml' '**/k8s/**/*.yml' '**/k8s/**/*.tpl' '**/k8s/**/*.tmpl' | cut -d'/' -f1,2,3 | uniq | jq -R 'split("\n")' | jq -s 'flatten(1)') >> $GITHUB_OUTPUT
32-
echo changed_charts=$(git diff --name-only ${{ github.base_ref }}...HEAD -- '**/k8s/**/*.yaml' '**/k8s/**/*.yml' '**/k8s/**/*.tpl' '**/k8s/**/*.tmpl' | cut -d'/' -f1,2,3 | uniq) >> $GITHUB_OUTPUT
31+
git fetch origin ${GITHUB_BASE_REF}:${GITHUB_BASE_REF}
32+
echo matrix_changed_charts=$(git diff --name-only ${GITHUB_BASE_REF}...HEAD -- '**/k8s/**/*.yaml' '**/k8s/**/*.yml' '**/k8s/**/*.tpl' '**/k8s/**/*.tmpl' | cut -d'/' -f1,2,3 | uniq | jq -R 'split("\n")' | jq -s 'flatten(1)') >> $GITHUB_OUTPUT
33+
echo changed_charts=$(git diff --name-only ${GITHUB_BASE_REF}...HEAD -- '**/k8s/**/*.yaml' '**/k8s/**/*.yml' '**/k8s/**/*.tpl' '**/k8s/**/*.tmpl' | cut -d'/' -f1,2,3 | uniq) >> $GITHUB_OUTPUT
34+
env:
35+
GITHUB_BASE_REF: ${{ github.base_ref }}
3336

3437
render_head_ref_charts:
3538
runs-on: ubuntu-latest
@@ -40,24 +43,28 @@ jobs:
4043
steps:
4144
- name: checkout repository
4245
uses: actions/checkout@v4
46+
with:
47+
persist-credentials: false
4348

4449
- name: setup helm
45-
uses: azure/setup-helm@v4.0.0
50+
uses: azure/setup-helm@29960d0f5f19214b88e1d9ba750a9914ab0f1a2f #v4.0.0
4651

4752
- name: render ${{ matrix.chart }} from head ref
4853
id: render_head
4954
run: |
5055
mkdir -p shared/head-charts
51-
git fetch origin "$HEAD_REF"
52-
git checkout "$HEAD_REF" --
53-
if [ -f "${{ matrix.chart }}/Chart.yaml" ]; then
54-
helm dependency update "${{ matrix.chart }}"
55-
values_files="${{ matrix.chart }}"/values-*
56+
git fetch origin "${HEAD_REF}"
57+
git checkout "${HEAD_REF}" --
58+
if [ -f "${MATRIX_CHART}/Chart.yaml" ]; then
59+
helm dependency update "${MATRIX_CHART}"
60+
values_files="${MATRIX_CHART}"/values-*
5661
for values_file in $(basename -a $values_files); do
57-
helm template "${{ matrix.chart }}" -f "${{ matrix.chart }}/values.yaml" -f "${{ matrix.chart }}/${values_file}" --output-dir "shared/head-charts/${{ matrix.chart }}/${values_file}"
62+
helm template "${MATRIX_CHART}" -f "${MATRIX_CHART}/values.yaml" -f "${MATRIX_CHART}/${values_file}" --output-dir "shared/head-charts/${MATRIX_CHART}/${values_file}"
5863
done
5964
fi
60-
echo sanitized_name=$(echo "${{ matrix.chart }}" | sed 's/\//-/g') >> $GITHUB_OUTPUT
65+
echo sanitized_name=$(echo "${MATRIX_CHART}" | sed 's/\//-/g') >> $GITHUB_OUTPUT
66+
env:
67+
MATRIX_CHART: ${{ matrix.chart }}
6168
- name: upload artifact
6269
uses: actions/upload-artifact@v4
6370
with:
@@ -73,24 +80,30 @@ jobs:
7380
steps:
7481
- name: checkout repository
7582
uses: actions/checkout@v4
83+
with:
84+
persist-credentials: false
7685

7786
- name: setup helm
78-
uses: azure/setup-helm@v4.0.0
87+
uses: azure/setup-helm@29960d0f5f19214b88e1d9ba750a9914ab0f1a2f #v4.0.0
7988

8089
- name: render ${{ matrix.chart }} from base ref
8190
id: render_base
8291
run: |
8392
mkdir -p shared/base-charts
84-
git fetch origin ${{ github.base_ref }}
85-
git checkout ${{ github.base_ref }} --
86-
if [ -f "${{ matrix.chart }}/Chart.yaml" ]; then
87-
helm dependency update "${{ matrix.chart }}"
88-
values_files="${{ matrix.chart }}"/values-*
93+
git fetch origin $GITHUB_BASE_REF
94+
git checkout $GITHUB_BASE_REF --
95+
if [ -f "${MATRIX_CHART}/Chart.yaml" ]; then
96+
helm dependency update "${MATRIX_CHART}"
97+
values_files="${MATRIX_CHART}"/values-*
8998
for values_file in $(basename -a $values_files); do
90-
helm template "${{ matrix.chart }}" -f "${{ matrix.chart }}/values.yaml" -f "${{ matrix.chart }}/${values_file}" --output-dir "shared/base-charts/${{ matrix.chart }}/${values_file}"
99+
helm template "${MATRIX_CHART}" -f "${MATRIX_CHART}/values.yaml" -f "${MATRIX_CHART}/${values_file}" --output-dir "shared/base-charts/${MATRIX_CHART}/${values_file}"
91100
done
92101
fi
93-
echo sanitized_name=$(echo "${{ matrix.chart }}" | sed 's/\//-/g') >> $GITHUB_OUTPUT
102+
echo sanitized_name=$(echo "${MATRIX_CHART}" | sed 's/\//-/g') >> $GITHUB_OUTPUT
103+
env:
104+
MATRIX_CHART: ${{ matrix.chart }}
105+
GITHUB_BASE_REF: "${{ github.base_ref }}"
106+
94107
- name: upload artifact
95108
uses: actions/upload-artifact@v4
96109
with:
@@ -105,7 +118,7 @@ jobs:
105118
- render_head_ref_charts
106119
steps:
107120
- name: setup helm
108-
uses: azure/setup-helm@v4.0.0
121+
uses: azure/setup-helm@29960d0f5f19214b88e1d9ba750a9914ab0f1a2f #v4.0.0
109122

110123
- name: download artifacts
111124
uses: actions/download-artifact@v4
@@ -117,12 +130,14 @@ jobs:
117130
- name: diff helm charts
118131
id: diff_helm_charts
119132
run: |
120-
for chart in ${{ needs.get_changed_helm_charts.outputs.charts }}; do
133+
for chart in ${CHARTS}; do
121134
chart_diff_output=$(diff -r "shared/base-charts/${chart}" "shared/head-charts/${chart}" || true)
122135
if [ -n "$chart_diff_output" ]; then
123136
echo -e "Changes found in chart: ${chart}\n$(diff -ruN shared/base-charts/${chart} shared/head-charts/${chart})\n" >> diff.log
124137
fi
125138
done
139+
env:
140+
CHARTS: ${{ needs.get_changed_helm_charts.outputs.charts }}
126141
- name: post diff as comment on pull request
127142
if: needs.get_changed_helm_charts.outputs.charts != ''
128143
uses: actions/github-script@v7

.github/workflows/release.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@ jobs:
1010
name: release
1111
runs-on:
1212
- ubuntu-latest
13+
permissions:
14+
contents: write
1315

1416
steps:
1517
- name: checkout
1618
uses: actions/checkout@v4
1719
with:
1820
fetch-depth: 0
21+
persist-credentials: false
1922

2023
- name: setup node.js
2124
uses: actions/setup-node@v4

.github/workflows/validate-k8s-manifests.yml

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@ jobs:
2727
uses: actions/checkout@v4
2828
with:
2929
fetch-depth: '100'
30+
persist-credentials: false
3031

3132
- name: find changed helm charts
3233
id: find_changed_charts
3334
run: |
34-
git fetch origin ${{ github.base_ref }}:${{ github.base_ref }}
35-
echo matrix_changed_charts=$(git diff --name-only ${{ github.base_ref }}...HEAD -- '**/k8s/**/*.yaml' '**/k8s/**/*.yml' '**/k8s/**/*.tpl' '**/k8s/**/*.tmpl' | cut -d'/' -f1,2,3 | uniq | jq -R 'split("\n")' | jq -s 'flatten(1)') >> $GITHUB_OUTPUT
36-
echo changed_charts=$(git diff --name-only ${{ github.base_ref }}...HEAD -- '**/k8s/**/*.yaml' '**/k8s/**/*.yml' '**/k8s/**/*.tpl' '**/k8s/**/*.tmpl' | cut -d'/' -f1,2,3 | uniq) >> $GITHUB_OUTPUT
35+
git fetch origin $GITHUB_BASE_REF:$GITHUB_BASE_REF
36+
echo matrix_changed_charts=$(git diff --name-only $GITHUB_BASE_REF...HEAD -- '**/k8s/**/*.yaml' '**/k8s/**/*.yml' '**/k8s/**/*.tpl' '**/k8s/**/*.tmpl' | cut -d'/' -f1,2,3 | uniq | jq -R 'split("\n")' | jq -s 'flatten(1)') >> $GITHUB_OUTPUT
37+
echo changed_charts=$(git diff --name-only $GITHUB_BASE_REF...HEAD -- '**/k8s/**/*.yaml' '**/k8s/**/*.yml' '**/k8s/**/*.tpl' '**/k8s/**/*.tmpl' | cut -d'/' -f1,2,3 | uniq) >> $GITHUB_OUTPUT
38+
env:
39+
GITHUB_BASE_REF: ${{ github.base_ref }}
3740

3841
render_head_ref_charts:
3942
runs-on: ubuntu-latest
@@ -44,25 +47,30 @@ jobs:
4447
steps:
4548
- name: checkout repository
4649
uses: actions/checkout@v4
50+
with:
51+
persist-credentials: false
4752

4853
- name: setup helm
49-
uses: azure/setup-helm@v4.0.0
54+
uses: azure/setup-helm@29960d0f5f19214b88e1d9ba750a9914ab0f1a2f #v4.0.0
5055

5156
- name: render ${{ matrix.chart }} from head ref
5257
id: render_head
5358
run: |
5459
mkdir -p shared/head-charts
5560
git fetch origin "$HEAD_REF"
5661
git checkout "$HEAD_REF" --
57-
if [ -f "${{ matrix.chart }}/Chart.yaml" ]; then
58-
helm dependency update "${{ matrix.chart }}"
59-
values_files="${{ matrix.chart }}"/values-*
62+
if [ -f "$MATRIX_CHART/Chart.yaml" ]; then
63+
helm dependency update "$MATRIX_CHART"
64+
values_files="$MATRIX_CHART"/values-*
6065
for values_file in $(basename -a $values_files); do
6166
env_name=$(basename "$values_file" | sed -E 's/^values-(.+)\.ya?ml$/\1/')
62-
helm template $(basename -a "${{ matrix.chart }}") "${{ matrix.chart }}" -f "${{ matrix.chart }}/values.yaml" -f "${{ matrix.chart }}/${values_file}" --output-dir "shared/charts/${{ matrix.chart }}/${env_name}"
67+
helm template $(basename -a "$MATRIX_CHART") "$MATRIX_CHART" -f "$MATRIX_CHART/values.yaml" -f "$MATRIX_CHART/${values_file}" --output-dir "shared/charts/$MATRIX_CHART/${env_name}"
6368
done
6469
fi
65-
echo sanitized_name=$(echo "${{ matrix.chart }}" | sed 's/\//-/g') >> $GITHUB_OUTPUT
70+
echo sanitized_name=$(echo "$MATRIX_CHART" | sed 's/\//-/g') >> $GITHUB_OUTPUT
71+
env:
72+
MATRIX_CHART: ${{ matrix.chart }}
73+
6674
- name: upload artifact
6775
uses: actions/upload-artifact@v4
6876
with:
@@ -104,10 +112,9 @@ jobs:
104112
run: |
105113
set -eo pipefail
106114
107-
charts="${{ needs.get_changed_helm_charts.outputs.charts }}"
108115
exit_code=0
109116
110-
for chart in $charts; do
117+
for chart in $CHARTS; do
111118
echo "Validating ${chart}..."
112119
113120
if [ -d "shared/charts/${chart}" ]; then
@@ -126,6 +133,8 @@ jobs:
126133
done
127134
128135
echo "kubeconform_exit_code=$exit_code" >> $GITHUB_OUTPUT
136+
env:
137+
CHARTS: ${{ needs.get_changed_helm_charts.outputs.charts }}
129138

130139
- name: minimize previous kubeconform comments
131140
uses: actions/github-script@v7
@@ -227,4 +236,6 @@ jobs:
227236
- name: fail workflow if kubeconform validation fails
228237
run: |
229238
# We want this workflow to fail if kubeconform validation fails, but after posting the comment
230-
exit ${{ steps.validate_k8s_manifests.outputs.kubeconform_exit_code }}
239+
exit ${EXIT_CODE}
240+
env:
241+
EXIT_CODE: ${{ steps.validate_k8s_manifests.outputs.kubeconform_exit_code }}

.github/workflows/zizmor.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# https://github.com/woodruffw/zizmor
2+
name: GitHub Actions Security Analysis with Zizmor
3+
4+
on:
5+
push:
6+
branches: ["main"]
7+
pull_request:
8+
branches: ["*"]
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
12+
cancel-in-progress: true
13+
14+
permissions: {}
15+
16+
jobs:
17+
zizmor:
18+
name: Zizmor latest via Cargo
19+
runs-on: ubuntu-latest
20+
steps:
21+
- name: Clone Repository
22+
uses: actions/checkout@v4
23+
with:
24+
persist-credentials: false
25+
26+
- run: python -m pip install zizmor
27+
shell: bash
28+
- name: Run zizmor
29+
run: zizmor .

deploy/action.yaml

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,20 +84,25 @@ runs:
8484
name: deployment service account
8585
shell: bash
8686
run: |
87-
if [[ "${{ inputs.project_id }}" == "" ]]; then
88-
echo "SERVICE_ACCOUNT=deploy-${{ inputs.env_name }}@moz-fx-${{ inputs.app_name }}-${{ inputs.realm_name }}.iam.gserviceaccount.com" >> $GITHUB_OUTPUT
87+
if [[ "$PROJECT_ID" == "" ]]; then
88+
echo "SERVICE_ACCOUNT=deploy-$ENV_NAME@moz-fx-$APP_NAME-$REALM_NAME.iam.gserviceaccount.com" >> $GITHUB_OUTPUT
8989
else
90-
echo "SERVICE_ACCOUNT=deploy-${{ inputs.env_name }}@${{ inputs.project_id }}.iam.gserviceaccount.com" >> $GITHUB_OUTPUT
90+
echo "SERVICE_ACCOUNT=deploy-$ENV_NAME@$PROJECT_ID.iam.gserviceaccount.com" >> $GITHUB_OUTPUT
9191
fi
92+
env:
93+
PROJECT_ID: ${{ inputs.project_id }}
94+
REALM: ${{ inputs.realm_name }}
95+
APP_NAME: ${{ inputs.app_name }}
96+
ENV_NAME: ${{ inputs.env_name }}
9297

9398
- name: gcp authentication
94-
uses: google-github-actions/auth@v2
99+
uses: google-github-actions/auth@6fc4af4b145ae7821d527454aa9bd537d1f2dc5f #v2
95100
with:
96101
service_account: ${{ steps.deployment_service_account.outputs.SERVICE_ACCOUNT }}
97102
workload_identity_provider: projects/${{ inputs.workload_identity_pool_project_number }}/locations/global/workloadIdentityPools/github-actions/providers/github-actions
98103

99104
- name: get gke credentials
100-
uses: google-github-actions/get-gke-credentials@v2
105+
uses: google-github-actions/get-gke-credentials@9025e8f90f2d8e0c3dafc3128cc705a26d992a6a #v2
101106
with:
102107
cluster_name: ${{ inputs.k8s_cluster_name }}
103108
location: ${{ inputs.k8s_cluster_location }}
@@ -107,63 +112,92 @@ runs:
107112
id: helm_values
108113
shell: bash
109114
run: |
110-
if [[ "${{ inputs.helm_value_files }}" == "" ]]; then
111-
echo "FILES=-f values-${{ inputs.env_name }}.yaml" >> $GITHUB_OUTPUT
115+
if [[ "${HELM_VALUE_FILES}" == "" ]]; then
116+
echo "FILES=-f values-${ENV_NAME}.yaml" >> $GITHUB_OUTPUT
112117
else
113-
echo "FILES=${{ inputs.helm_value_files }}" >> $GITHUB_OUTPUT
118+
echo "FILES=${HELM_VALUE_FILES}" >> $GITHUB_OUTPUT
114119
fi
120+
env:
121+
ENV_NAME: ${{ inputs.env_name }}
122+
HELM_VALUE_FILES: ${{ inputs.helm_value_files }}
115123

116124
- name: helm version
117125
shell: bash
118126
run: helm version
119127

120128
- name: helm list
121129
shell: bash
122-
run: helm list -n ${{ inputs.app_name }}-${{ inputs.env_name }} -a
130+
run: helm list -n ${APP_NAME}-${ENV_NAME} -a
131+
env:
132+
APP_NAME: ${{ inputs.app_name }}
133+
ENV_NAME: ${{ inputs.env_name }}
123134

124135
# Workaround for --dependency-update flag failing to update OCI packaged charts
125136
- name: helm dependency update
126137
shell: bash
127-
working-directory: infra_repo/${{ inputs.helm_chart_path }}
138+
working-directory: infra_repo/${HELM_CHART_PATH}
128139
run: helm dependency update
140+
env:
141+
HELM_CHART_PATH: ${{ inputs.helm_chart_path }}
129142

130143
# FIXME
131144
# - Look at adding --atomic or --wait as flags
132145
- name: helm install
133146
shell: bash
134-
working-directory: infra_repo/${{ inputs.helm_chart_path }}
147+
working-directory: infra_repo/${HELM_CHART_PATH}
135148
run: |
136-
helm upgrade ${{ inputs.helm_release_name }} . \
149+
helm upgrade ${HELM_RELEASE_NAME} . \
137150
--install \
138151
--dependency-update \
139-
--namespace ${{ inputs.app_name }}-${{ inputs.env_name }} \
140-
${{ steps.helm_values.outputs.FILES }} \
141-
--set ${{ inputs.tag_value_path }}=${{ inputs.image_tag }} \
142-
--timeout ${{ inputs.helm_timeout }} \
143-
${{ inputs.helm_values }}
152+
--namespace ${APP_NAME}-${ENV_NAME} \
153+
${VALUES} \
154+
--set ${TAG_VALUE_PATH}=${IMAGE_TAG} \
155+
--timeout ${HELM_TIMEOUT} \
156+
${HELM_VALUES}
157+
env:
158+
APP_NAME: ${{ inputs.app_name }}
159+
ENV_NAME: ${{ inputs.env_name }}
160+
HELM_CHART_PATH: ${{ inputs.helm_chart_path }}
161+
HELM_RELEASE_NAME: ${{ inputs.helm_release_name }}
162+
HELM_TIMEOUT: ${{ inputs.helm_timeout }}
163+
HELM_VALUES: ${{ inputs.helm_values }}
164+
IMAGE_TAG: ${{ inputs.image_tag }}
165+
TAG_VALUE_PATH: ${{ inputs.tag_value_path }}
166+
VALUES: ${{ steps.helm_values.outputs.FILES }}
144167

145168
# List installed charts after upgrade
146169
- name: helm list
147170
if: always()
148171
shell: bash
149-
run: helm list -n ${{ inputs.app_name }}-${{ inputs.env_name }} -a
172+
run: helm list -n ${APP_NAME}-${ENV_NAME} -a
173+
env:
174+
APP_NAME: ${{ inputs.app_name }}
175+
ENV_NAME: ${{ inputs.env_name }}
150176

151177
- name: helm app version
152178
if: always()
153179
id: helm_app_version
154180
shell: bash
155181
run: |
156182
helm list \
157-
--filter ${{ inputs.helm_release_name }} \
158-
--namespace ${{ inputs.app_name }}-${{ inputs.env_name }} \
183+
--filter ${HELM_RELEASE_NAME} \
184+
--namespace ${APP_NAME}-${ENV_NAME} \
159185
--no-headers | awk '{printf "deployed_chart_app_version=%s",$10}' | tee $GITHUB_OUTPUT
186+
env:
187+
APP_NAME: ${{ inputs.app_name }}
188+
ENV_NAME: ${{ inputs.env_name }}
189+
HELM_RELEASE_NAME: ${{ inputs.helm_release_name }}
160190

161191
- name: helm chart version
162192
if: always()
163193
id: helm_chart_version
164194
shell: bash
165195
run: |
166196
helm list \
167-
--filter ${{ inputs.helm_release_name }} \
168-
--namespace ${{ inputs.app_name }}-${{ inputs.env_name }} \
197+
--filter ${HELM_RELEASE_NAME} \
198+
--namespace ${APP_NAME}-${ENV_NAME} \
169199
--no-headers | awk '{printf "deployed_chart_version=%s",$9}' | tee $GITHUB_OUTPUT
200+
env:
201+
APP_NAME: ${{ inputs.app_name }}
202+
ENV_NAME: ${{ inputs.env_name }}
203+
HELM_RELEASE_NAME: ${{ inputs.helm_release_name }}

0 commit comments

Comments
 (0)