Skip to content

[Draft] NGINX OpenTelemetry Input Package #113

[Draft] NGINX OpenTelemetry Input Package

[Draft] NGINX OpenTelemetry Input Package #113

name: Documentation edit helper
on:
pull_request:
types:
- opened
- synchronize
paths:
- 'packages/*/_dev/build/docs/README.md'
jobs:
help-with-docs:
if: |
github.actor != 'github-actions[bot]' &&
(startsWith(github.head_ref, 'docs-enhancement/') || startsWith(github.head_ref, 'docs-bugfix/'))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Analyze documentation changes and generate commands
id: analyze
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
echo "πŸ” Analyzing documentation changes..."
PR_NUMBER=${{ github.event.pull_request.number }}
# Get changed files directly from PR
if ! PR_FILES=$(gh pr view $PR_NUMBER --json files -q '.files[].path' 2>/dev/null); then
echo "Error: Failed to fetch PR files"
exit 1
fi
CHANGED_DOCS=$(echo "$PR_FILES" | grep '^packages/.*/_dev/build/docs/README\.md$' || true)
if [ -z "$CHANGED_DOCS" ]; then
echo "no_docs_changes=true" >> $GITHUB_OUTPUT
exit 0
fi
# Determine change type from branch name
CHANGE_TYPE="enhancement"
VERSION_BUMP="minor"
LABEL="enhancement"
if [[ "${{ github.head_ref }}" =~ ^docs-bugfix/ ]]; then
CHANGE_TYPE="bugfix"
VERSION_BUMP="patch"
LABEL="bugfix"
fi
# Get custom changelog description from PR body
if ! PR_BODY=$(gh pr view $PR_NUMBER --json body -q '.body // ""' 2>/dev/null); then
echo "Warning: Failed to fetch PR body, using default changelog description"
PR_BODY=""
fi
CHANGELOG_DESC="Improve documentation"
if [ "$CHANGE_TYPE" = "bugfix" ]; then
CHANGELOG_DESC="Fix documentation"
fi
# Check for custom changelog description in PR body
if echo "$PR_BODY" | grep -qi "^changelog:"; then
CUSTOM_DESC=$(echo "$PR_BODY" | grep -i "^changelog:" | sed 's/^changelog://i' | xargs)
if [ -n "$CUSTOM_DESC" ]; then
# Escape quotes and special characters for safe command generation
CHANGELOG_DESC=$(echo "$CUSTOM_DESC" | sed 's/"/\\"/g' | sed "s/'/\\'/g")
fi
fi
echo "change_type=$CHANGE_TYPE" >> $GITHUB_OUTPUT
echo "version_bump=$VERSION_BUMP" >> $GITHUB_OUTPUT
echo "label=$LABEL" >> $GITHUB_OUTPUT
echo "changelog_desc=$CHANGELOG_DESC" >> $GITHUB_OUTPUT
# Get all changed files from PR to check what's already updated
# Reuse the PR_FILES we already fetched to avoid another API call
ALL_CHANGED_FILES="$PR_FILES"
# Find packages that need updates vs already done
PACKAGES_NEEDING_UPDATE=""
PACKAGES_ALREADY_DONE=""
while IFS= read -r doc_file; do
[ -z "$doc_file" ] && continue
PACKAGE=$(echo "$doc_file" | sed 's|^packages/\([^/]*\)/.*|\1|')
# Check if manifest.yml or changelog.yml are in the changed files
MANIFEST_CHANGED=$(echo "$ALL_CHANGED_FILES" | grep "^packages/$PACKAGE/manifest.yml$" || true)
CHANGELOG_CHANGED=$(echo "$ALL_CHANGED_FILES" | grep "^packages/$PACKAGE/changelog.yml$" || true)
if [ -z "$MANIFEST_CHANGED" ] && [ -z "$CHANGELOG_CHANGED" ]; then
PACKAGES_NEEDING_UPDATE="$PACKAGES_NEEDING_UPDATE $PACKAGE"
else
PACKAGES_ALREADY_DONE="$PACKAGES_ALREADY_DONE $PACKAGE"
fi
done <<< "$CHANGED_DOCS"
echo "packages_needing_update=$PACKAGES_NEEDING_UPDATE" >> $GITHUB_OUTPUT
echo "packages_already_done=$PACKAGES_ALREADY_DONE" >> $GITHUB_OUTPUT
- name: Comment with exact commands (same-repo PRs)
if: steps.analyze.outputs.packages_needing_update && github.event.pull_request.head.repo.fork == false
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PACKAGES="${{ steps.analyze.outputs.packages_needing_update }}"
CHANGE_TYPE="${{ steps.analyze.outputs.change_type }}"
VERSION_BUMP="${{ steps.analyze.outputs.version_bump }}"
CHANGELOG_DESC="${{ steps.analyze.outputs.changelog_desc }}"
PR_NUMBER=${{ github.event.pull_request.number }}
# Create clean package list for the for loop
PACKAGE_LIST=$(echo $PACKAGES | xargs)
# Safety check for empty package list
if [ -z "$PACKAGE_LIST" ]; then
echo "No packages found, skipping comment"
exit 0
fi
COMMENT_FILE=$(mktemp)
{
echo "Please run these commands to update changelogs and build docs:"
echo ""
echo '```bash'
echo "for pkg in ${PACKAGE_LIST}; do"
echo ' cd packages/$pkg'
echo " elastic-package changelog add --type $CHANGE_TYPE --description \"$CHANGELOG_DESC\" --link \"https://github.com/${{ github.repository }}/pull/$PR_NUMBER\" --next $VERSION_BUMP"
echo " elastic-package build"
echo " cd ../.."
echo "done"
echo "git add -u"
echo "git commit -m \"docs: update changelogs and build documentation\""
echo "git push"
echo '```'
echo ""
echo "Prerequisite: \`go install github.com/elastic/elastic-package\`"
} > "$COMMENT_FILE"
if [ -n "${{ steps.analyze.outputs.packages_already_done }}" ]; then
echo "" >> "$COMMENT_FILE"
echo "Note: These packages already updated: \`${{ steps.analyze.outputs.packages_already_done }}\`" >> "$COMMENT_FILE"
fi
if ! gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"; then
{
echo "## πŸ“‹ Documentation follow-up"
echo
cat "$COMMENT_FILE"
} >> "$GITHUB_STEP_SUMMARY"
fi
- name: Show commands in summary (fork PRs)
if: steps.analyze.outputs.packages_needing_update && github.event.pull_request.head.repo.fork == true
run: |
PACKAGES="${{ steps.analyze.outputs.packages_needing_update }}"
CHANGE_TYPE="${{ steps.analyze.outputs.change_type }}"
VERSION_BUMP="${{ steps.analyze.outputs.version_bump }}"
CHANGELOG_DESC="${{ steps.analyze.outputs.changelog_desc }}"
PR_NUMBER=${{ github.event.pull_request.number }}
PACKAGE_LIST=$(echo $PACKAGES | xargs)
if [ -z "$PACKAGE_LIST" ]; then
exit 0
fi
{
echo "## πŸ“‹ Documentation follow-up"
echo ""
echo "Please run these commands to update changelogs and build docs:"
echo ""
echo '```bash'
echo "for pkg in ${PACKAGE_LIST}; do"
echo ' cd packages/$pkg'
echo " elastic-package changelog add --type $CHANGE_TYPE --description \"$CHANGELOG_DESC\" --link \"https://github.com/${{ github.repository }}/pull/$PR_NUMBER\" --next $VERSION_BUMP"
echo " elastic-package build"
echo " cd ../.."
echo "done"
echo "git add -u"
echo "git commit -m \"docs: update changelogs and build documentation\""
echo "git push"
echo '```'
echo ""
echo "Prerequisite: \`go install github.com/elastic/elastic-package\`"
if [ -n "${{ steps.analyze.outputs.packages_already_done }}" ]; then
echo ""
echo "Note: These packages already updated: \`${{ steps.analyze.outputs.packages_already_done }}\`"
fi
} >> "$GITHUB_STEP_SUMMARY"
- name: Add labels
run: |
echo "Please add the following labels β€” '${{ steps.analyze.outputs.label }}' and 'documentation'" >> "$GITHUB_STEP_SUMMARY"
- name: Handle edge cases
if: steps.analyze.outputs.no_docs_changes == 'true' || (steps.analyze.outputs.packages_needing_update == '' && steps.analyze.outputs.packages_already_done != '')
run: |
if [ "${{ steps.analyze.outputs.no_docs_changes }}" = "true" ]; then
MESSAGE="No documentation files (packages/*/_dev/build/docs/README.md) were changed in this PR."
else
MESSAGE="All packages with documentation changes already have updated changelogs and manifests."
fi
echo "## πŸ“š Documentation Status
$MESSAGE
Your PR is ready for review! πŸŽ‰" >> "$GITHUB_STEP_SUMMARY"