|
6 | 6 | - main |
7 | 7 | paths: |
8 | 8 | - 'charts/**' |
| 9 | + workflow_dispatch: # Manual trigger |
| 10 | + inputs: |
| 11 | + update_all_charts: |
| 12 | + description: 'Update all charts (not just changed ones)' |
| 13 | + required: false |
| 14 | + type: boolean |
| 15 | + default: false |
| 16 | + clean_start: |
| 17 | + description: 'Delete existing CHANGELOG.md files and start fresh' |
| 18 | + required: false |
| 19 | + type: boolean |
| 20 | + default: false |
| 21 | + custom_message: |
| 22 | + description: 'Custom changelog message (optional)' |
| 23 | + required: false |
| 24 | + type: string |
9 | 25 |
|
10 | 26 | concurrency: |
11 | | - group: ${{ github.workflow }} |
| 27 | + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} |
12 | 28 | cancel-in-progress: false |
13 | 29 |
|
14 | 30 | jobs: |
@@ -40,36 +56,100 @@ jobs: |
40 | 56 | sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 |
41 | 57 | sudo chmod +x /usr/local/bin/yq |
42 | 58 |
|
43 | | - - name: Get changed charts from last commit |
44 | | - id: list-changed |
| 59 | + - name: Determine charts to update |
| 60 | + id: charts-to-update |
45 | 61 | run: | |
46 | | - # Get the commit SHA before the merge |
47 | | - BEFORE_SHA="${{ github.event.before }}" |
48 | | -
|
49 | | - # Find changed charts directories using git diff |
50 | | - changed_files=$(git diff --name-only "${BEFORE_SHA}" HEAD -- 'charts/**') |
51 | | -
|
52 | | - if [[ -n "$changed_files" ]]; then |
53 | | - # Extract unique chart directories |
54 | | - changed_charts=$(echo "$changed_files" | grep '^charts/' | cut -d/ -f1-2 | sort -u | tr '\n' ' ') |
| 62 | + # For manual trigger with update_all_charts enabled |
| 63 | + if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ "${{ github.event.inputs.update_all_charts }}" = "true" ]; then |
| 64 | + echo "Manual trigger: updating all charts" |
| 65 | + all_charts=$(find charts -mindepth 1 -maxdepth 1 -type d | sed 's|^charts/||' | tr '\n' ' ') |
| 66 | + echo "All charts: $all_charts" |
| 67 | + echo "changed=true" >> $GITHUB_OUTPUT |
| 68 | + echo "changedCharts=$all_charts" >> $GITHUB_OUTPUT |
| 69 | + echo "update_mode=all" >> $GITHUB_OUTPUT |
| 70 | + # For manual trigger without update_all_charts (default behavior - changed charts only) |
| 71 | + elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then |
| 72 | + echo "Manual trigger: finding changed charts from last commit" |
| 73 | + # Use the same logic as push event to find changed charts |
| 74 | + BEFORE_SHA=$(git rev-parse HEAD~1) |
| 75 | + changed_files=$(git diff --name-only "${BEFORE_SHA}" HEAD -- 'charts/**') |
| 76 | + |
| 77 | + if [[ -n "$changed_files" ]]; then |
| 78 | + changed_charts=$(echo "$changed_files" | grep '^charts/' | cut -d/ -f1-2 | sort -u | tr '\n' ' ') |
| 79 | + if [[ -n "$changed_charts" ]]; then |
| 80 | + echo "Changed charts: $changed_charts" |
| 81 | + echo "changed=true" >> $GITHUB_OUTPUT |
| 82 | + echo "changedCharts=${changed_charts}" >> $GITHUB_OUTPUT |
| 83 | + echo "update_mode=changed" >> $GITHUB_OUTPUT |
| 84 | + else |
| 85 | + echo "No chart changes detected in last commit" |
| 86 | + echo "changed=false" >> $GITHUB_OUTPUT |
| 87 | + fi |
| 88 | + else |
| 89 | + echo "No chart changes detected in last commit" |
| 90 | + echo "changed=false" >> $GITHUB_OUTPUT |
| 91 | + fi |
| 92 | + # For push event (original behavior) |
| 93 | + else |
| 94 | + echo "Push event: finding changed charts from merge commit" |
| 95 | + BEFORE_SHA="${{ github.event.before }}" |
| 96 | + changed_files=$(git diff --name-only "${BEFORE_SHA}" HEAD -- 'charts/**') |
55 | 97 |
|
56 | | - if [[ -n "$changed_charts" ]]; then |
57 | | - echo "Changed charts:" |
58 | | - echo "$changed_charts" |
59 | | - echo "changed=true" >> $GITHUB_OUTPUT |
60 | | - echo "changedCharts=${changed_charts}" >> $GITHUB_OUTPUT |
| 98 | + if [[ -n "$changed_files" ]]; then |
| 99 | + changed_charts=$(echo "$changed_files" | grep '^charts/' | cut -d/ -f1-2 | sort -u | tr '\n' ' ') |
| 100 | + if [[ -n "$changed_charts" ]]; then |
| 101 | + echo "Changed charts: $changed_charts" |
| 102 | + echo "changed=true" >> $GITHUB_OUTPUT |
| 103 | + echo "changedCharts=${changed_charts}" >> $GITHUB_OUTPUT |
| 104 | + echo "update_mode=changed" >> $GITHUB_OUTPUT |
| 105 | + else |
| 106 | + echo "No chart changes detected" |
| 107 | + echo "changed=false" >> $GITHUB_OUTPUT |
| 108 | + fi |
61 | 109 | else |
62 | 110 | echo "No chart changes detected" |
63 | 111 | echo "changed=false" >> $GITHUB_OUTPUT |
64 | 112 | fi |
| 113 | + fi |
| 114 | +
|
| 115 | + - name: Clean start - Delete existing CHANGELOG.md files |
| 116 | + if: github.event_name == 'workflow_dispatch' && github.event.inputs.clean_start == 'true' && steps.charts-to-update.outputs.changed == 'true' |
| 117 | + run: | |
| 118 | + echo "Clean start enabled - deleting existing CHANGELOG.md files" |
| 119 | + CHANGED_CHARTS="${{ steps.charts-to-update.outputs.changedCharts }}" |
| 120 | + |
| 121 | + for chart_directory in $CHANGED_CHARTS; do |
| 122 | + CHART_NAME=${chart_directory#charts/} |
| 123 | + CHANGELOG_FILE="charts/${CHART_NAME}/CHANGELOG.md" |
| 124 | + |
| 125 | + if [ -f "$CHANGELOG_FILE" ]; then |
| 126 | + echo "Deleting $CHANGELOG_FILE" |
| 127 | + rm "$CHANGELOG_FILE" |
| 128 | + |
| 129 | + # Check if directory is empty except for ignored files |
| 130 | + if [ -z "$(ls -A "charts/${CHART_NAME}" | grep -vE '^(Chart\.yaml|values\.yaml|\.helmignore|templates|crds|\.gitkeep)$')" ]; then |
| 131 | + echo "Directory charts/${CHART_NAME} would be empty after deletion, but keeping it" |
| 132 | + fi |
| 133 | + else |
| 134 | + echo "No CHANGELOG.md found at $CHANGELOG_FILE" |
| 135 | + fi |
| 136 | + done |
| 137 | + |
| 138 | + # Commit the deletions if any files were removed |
| 139 | + if git status --porcelain | grep -q 'CHANGELOG.md'; then |
| 140 | + echo "CHANGELOG.md files deleted successfully" |
| 141 | + git add charts/*/CHANGELOG.md |
| 142 | + git commit -m "chore: remove existing CHANGELOG.md files for clean start" \ |
| 143 | + -m "Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>" |
| 144 | + echo "clean_start_completed=true" >> $GITHUB_ENV |
65 | 145 | else |
66 | | - echo "No chart changes detected" |
67 | | - echo "changed=false" >> $GITHUB_OUTPUT |
| 146 | + echo "No CHANGELOG.md files to delete" |
| 147 | + echo "clean_start_completed=false" >> $GITHUB_ENV |
68 | 148 | fi |
69 | 149 |
|
70 | | - - name: Get PR information |
71 | | - id: pr-info |
72 | | - if: steps.list-changed.outputs.changed == 'true' |
| 150 | + - name: Get PR information for push events |
| 151 | + id: pr-info-push |
| 152 | + if: github.event_name == 'push' && steps.charts-to-update.outputs.changed == 'true' |
73 | 153 | uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 |
74 | 154 | with: |
75 | 155 | github-token: ${{ secrets.GITHUB_TOKEN }} |
@@ -98,59 +178,86 @@ jobs: |
98 | 178 | core.setOutput('pr_url', ''); |
99 | 179 | } |
100 | 180 |
|
| 181 | + - name: Set manual trigger info |
| 182 | + id: manual-info |
| 183 | + if: github.event_name == 'workflow_dispatch' && steps.charts-to-update.outputs.changed == 'true' |
| 184 | + run: | |
| 185 | + if [ -n "${{ github.event.inputs.custom_message }}" ]; then |
| 186 | + PR_TITLE="${{ github.event.inputs.custom_message }}" |
| 187 | + else |
| 188 | + if [ "${{ github.event.inputs.clean_start }}" = "true" ]; then |
| 189 | + PR_TITLE="Manual changelog update with clean start" |
| 190 | + else |
| 191 | + PR_TITLE="Manual changelog update triggered via workflow_dispatch" |
| 192 | + fi |
| 193 | + fi |
| 194 | + |
| 195 | + echo "pr_number=manual" >> $GITHUB_OUTPUT |
| 196 | + echo "pr_title=${PR_TITLE}" >> $GITHUB_OUTPUT |
| 197 | + echo "pr_url=https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> $GITHUB_OUTPUT |
| 198 | +
|
101 | 199 | - name: Generate changelog |
102 | 200 | id: generate-changelog |
103 | | - if: steps.list-changed.outputs.changed == 'true' |
| 201 | + if: steps.charts-to-update.outputs.changed == 'true' |
104 | 202 | env: |
105 | 203 | GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" |
106 | 204 | GITHUB_REPOSITORY: "${{ github.repository }}" |
107 | 205 | GITHUB_REPOSITORY_URL: "${{ github.server_url }}/${{ github.repository }}" |
108 | | - CHANGED_CHARTS: ${{ steps.list-changed.outputs.changedCharts }} |
109 | | - PR_NUMBER: ${{ steps.pr-info.outputs.pr_number }} |
110 | | - PR_TITLE: ${{ steps.pr-info.outputs.pr_title }} |
111 | | - PR_URL: ${{ steps.pr-info.outputs.pr_url }} |
| 206 | + PR_NUMBER: ${{ github.event_name == 'push' && steps.pr-info-push.outputs.pr_number || steps.manual-info.outputs.pr_number }} |
| 207 | + PR_TITLE: ${{ github.event_name == 'push' && steps.pr-info-push.outputs.pr_title || steps.manual-info.outputs.pr_title }} |
| 208 | + PR_URL: ${{ github.event_name == 'push' && steps.pr-info-push.outputs.pr_url || steps.manual-info.outputs.pr_url }} |
| 209 | + UPDATE_MODE: ${{ steps.charts-to-update.outputs.update_mode }} |
| 210 | + CLEAN_START: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.clean_start || 'false' }} |
112 | 211 | run: | |
113 | 212 | set -e |
114 | 213 |
|
115 | | - # Extract chart names from changed chart directories |
116 | | - CHART_NAMES=() |
117 | | - for chart_directory in ${CHANGED_CHARTS}; do |
| 214 | + CHANGED_CHARTS="${{ steps.charts-to-update.outputs.changedCharts }}" |
| 215 | + |
| 216 | + echo "Update mode: $UPDATE_MODE" |
| 217 | + echo "Clean start: $CLEAN_START" |
| 218 | + echo "Processing charts: $CHANGED_CHARTS" |
| 219 | +
|
| 220 | + # Process each chart individually |
| 221 | + for chart_directory in $CHANGED_CHARTS; do |
118 | 222 | CHART_NAME=${chart_directory#charts/} |
119 | | - CHART_NAMES+=("--chart" "$CHART_NAME") |
| 223 | + echo "Processing chart: $CHART_NAME" |
| 224 | + |
| 225 | + # Run the changelog script for this specific chart |
| 226 | + ./generate-changelog.sh \ |
| 227 | + --chart "$CHART_NAME" \ |
| 228 | + --pr-title "${PR_TITLE}" \ |
| 229 | + --pr-number "${PR_NUMBER}" \ |
| 230 | + --pr-url "${PR_URL}" |
120 | 231 | done |
121 | 232 |
|
122 | | - # Build arguments for the changelog script |
123 | | - CHANGELOG_ARGS=("${CHART_NAMES[@]}") |
124 | | -
|
125 | | - if [[ -n "$PR_TITLE" ]]; then |
126 | | - CHANGELOG_ARGS+=("--pr-title" "${PR_TITLE}") |
127 | | - fi |
128 | | -
|
129 | | - if [[ -n "$PR_NUMBER" ]]; then |
130 | | - CHANGELOG_ARGS+=("--pr-number" "${PR_NUMBER}") |
131 | | - fi |
132 | | -
|
133 | | - if [[ -n "$PR_URL" ]]; then |
134 | | - CHANGELOG_ARGS+=("--pr-url" "${PR_URL}") |
135 | | - fi |
136 | | -
|
137 | | - # Run the changelog generation script |
138 | | - ./generate-changelog.sh "${CHANGELOG_ARGS[@]}" |
139 | | -
|
140 | 233 | # Check if there are changes |
141 | 234 | if git status --porcelain | grep -q 'CHANGELOG.md'; then |
142 | 235 | echo "has_changes=true" >> $GITHUB_OUTPUT |
143 | 236 | echo "Changelog changes detected" |
| 237 | + git status --porcelain |
144 | 238 | else |
145 | 239 | echo "No CHANGELOG changes" |
146 | 240 | echo "has_changes=false" >> $GITHUB_OUTPUT |
147 | 241 | fi |
148 | 242 |
|
149 | 243 | - name: Commit and push changelog updates |
150 | | - if: steps.generate-changelog.outputs.has_changes == 'true' |
| 244 | + if: steps.generate-changelog.outputs.has_changes == 'true' && env.clean_start_completed != 'true' |
151 | 245 | run: | |
152 | 246 | git add charts/*/CHANGELOG.md |
153 | | - git commit -m "chore: update CHANGELOG.md for merged changes" \ |
| 247 | + |
| 248 | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then |
| 249 | + COMMIT_MSG="chore: update CHANGELOG.md via manual trigger" |
| 250 | + if [ "${{ github.event.inputs.update_all_charts }}" = "true" ]; then |
| 251 | + COMMIT_MSG="chore: update CHANGELOG.md for all charts via manual trigger" |
| 252 | + fi |
| 253 | + if [ "${{ github.event.inputs.clean_start }}" = "true" ]; then |
| 254 | + COMMIT_MSG="chore: regenerate CHANGELOG.md with clean start" |
| 255 | + fi |
| 256 | + else |
| 257 | + COMMIT_MSG="chore: update CHANGELOG.md for merged changes" |
| 258 | + fi |
| 259 | + |
| 260 | + git commit -m "$COMMIT_MSG" \ |
154 | 261 | -m "Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>" |
155 | 262 |
|
156 | 263 | # Pull latest changes and rebase our commit on top |
|
0 commit comments