--- name: Diff Helm Releases on Pull Requests on: # yamllint disable-line rule:truthy pull_request: branches: - main paths: - "cluster/**.yaml" env: conf_live_branch: main conf_ignore_known_labels_containing_versions: true jobs: changes: name: Detect changes runs-on: ubuntu-20.04 outputs: files: "${{ steps.extract.outputs.files }}" steps: - name: Checkout uses: actions/checkout@v2 - name: Get changes uses: dorny/paths-filter@v2 id: filter with: list-files: shell filters: | changed: - '**' - name: Filter Helm Releases id: extract run: | filtered=$(grep -zl "kind: HelmRelease.*registryUrl=" ${{ steps.filter.outputs.changed_files }} \ | jq -nR '[inputs | select(length>0)]') echo ::set-output name=files::${filtered} helm: name: Template Helm Releases runs-on: ubuntu-20.04 if: ${{ needs.changes.outputs.files != '' }} needs: - changes strategy: matrix: file: ${{ fromJson(needs.changes.outputs.files) }} fail-fast: false steps: - name: Setup Kubernetes Tools uses: yokawasa/action-setup-kube-tools@v0.8.0 with: setup-tools: | helmv3 yq - name: Checkout live branch uses: actions/checkout@v2 with: ref: ${{ env.conf_live_branch }} path: live - name: Checkout PR branch uses: actions/checkout@v2 with: path: pr - name: Create diff id: diff run: | hr_live_url=$(sed -nr 's|.*registryUrl=(.+)$|\1|p' live/${{ matrix.file }}) hr_live_chart=$(yq e .spec.chart.spec.chart live/${{ matrix.file }}) hr_live_version=$(yq e .spec.chart.spec.version live/${{ matrix.file }}) hr_live_values=$(yq e .spec.values live/${{ matrix.file }}) hr_pr_url=$(sed -nr 's|.*registryUrl=(.+)$|\1|p' pr/${{ matrix.file }}) hr_pr_chart=$(yq e .spec.chart.spec.chart pr/${{ matrix.file }}) hr_pr_version=$(yq e .spec.chart.spec.version pr/${{ matrix.file }}) hr_pr_values=$(yq e .spec.values pr/${{ matrix.file }}) helm repo add live "$hr_live_url" helm repo add pr "$hr_pr_url" resources_live=$(echo "$hr_live_values" | \ helm template "$hr_live_chart" \ live/"$hr_live_chart" \ --version "$hr_live_version" -f - || true) echo "$resources_live" echo "#####################################################" resources_pr=$(echo "$hr_pr_values" | \ helm template "$hr_pr_chart" \ pr/"$hr_pr_chart" \ --version "$hr_pr_version" -f -) echo "$resources_pr" echo "#####################################################" if [ "$conf_ignore_known_labels_containing_versions" = "true" ]; then labels='.metadata.labels."helm.sh/chart"' labels+=',.metadata.labels.chart' labels+=',.metadata.labels."app.kubernetes.io/version"' labels+=',.spec.template.metadata.labels."helm.sh/chart"' labels+=',.spec.template.metadata.labels.chart' labels+=',.spec.template.metadata.labels."app.kubernetes.io/version"' resources_live=$(echo "$resources_live" | yq e "del($labels)" -) resources_pr=$(echo "$resources_pr" | yq e "del($labels)" -) fi diff=$((diff -u <(echo "$resources_live") <(echo "$resources_pr") || true) | tail +3) echo "$diff" message="Path: \`${{ matrix.file }}\`" if [ "$hr_live_chart" != "$hr_pr_chart" ]; then message="$message"$'\n'"Chart: \`$hr_live_chart\` -> \`$hr_pr_chart\`" fi if [ "$hr_live_version" != "$hr_pr_version" ]; then message="$message"$'\n'"Version: \`$hr_live_version\` -> \`$hr_pr_version\`" fi if [ "$hr_live_url" != "$hr_pr_url" ]; then message="$message"$'\n'"Repo: \`$hr_live_url\` -> \`$hr_pr_url\`" fi message="$message"$'\n'$'\n' if [ -z "$diff" ]; then message="$message"'```'$'\n'"No changes in detected in resources"$'\n''```' else message="$message"'```diff'$'\n'"$diff"$'\n''```' fi echo "::set-output name=message::$(echo "$message" | jq --raw-input --slurp)" - name: Add Pull Request comment uses: peter-evans/create-or-update-comment@v1 with: issue-number: ${{ github.event.pull_request.number }} body: "${{ fromJSON(steps.diff.outputs.message) }}"