Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
179 changes: 127 additions & 52 deletions .github/workflows/daily_releases.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ name: Daily Release Status Notification

on:
schedule:
# Run daily at 00:00 UTC
- cron: '0 0 * * *'
pull_request:
branches: [ main ]
Expand Down Expand Up @@ -52,15 +51,13 @@ jobs:
id: get_day
run: |
if [ "${{ github.event.inputs.specific_day }}" == "today" ] || [ -z "${{ github.event.inputs.specific_day }}" ]; then
# Get current day of week (1=Monday, 2=Tuesday, etc.)
DAY_NUM=$(date +%u)
else
DAY_NUM="${{ github.event.inputs.specific_day }}"
fi

echo "DAY_NUMBER=$DAY_NUM" >> $GITHUB_OUTPUT

# Map day number to day name
case $DAY_NUM in
1) DAY_NAME="Monday" ;;
2) DAY_NAME="Tuesday" ;;
Expand All @@ -77,14 +74,13 @@ jobs:
run: |
DAY_NUM="${{ steps.get_day.outputs.DAY_NUMBER }}"

# Define all integrations with their schedules (UTC and IST)
declare -A MONDAY_RELEASES=(
["nri-consul"]="02:00 UTC (07:30 IST)|Package"
["nri-mysql"]="05:30 UTC (11:00 IST)|Package"
["nri-memcached"]="07:30 UTC (13:00 IST)|Package"
["nri-redis"]="09:30 UTC (15:00 IST)|Package"
["nri-varnish"]="11:30 UTC (17:00 IST)|Package"
["nri-discovery"]="13:00 UTC (18:30 IST)|GITHUB BINARY"
["nri-discovery-kubernetes"]="13:00 UTC (18:30 IST)|GITHUB BINARY"
["nri-apache"]="13:00 UTC (18:30 IST)|Package"
["nri-postgresql"]="15:00 UTC (20:30 IST)|Package"
)
Expand Down Expand Up @@ -118,7 +114,6 @@ jobs:
["nri-jmx"]="19:00 UTC (00:30 IST next day)|Package"
)

# Build release list for Slack formatting with proper spacing
RELEASE_LIST=""

case $DAY_NUM in
Expand Down Expand Up @@ -162,7 +157,6 @@ jobs:
;;
esac

# Save to output
if [[ "$RELEASE_LIST" == "No scheduled releases"* ]]; then
echo "RELEASES=$RELEASE_LIST" >> $GITHUB_OUTPUT
echo "HAS_RELEASES=false" >> $GITHUB_OUTPUT
Expand All @@ -182,26 +176,20 @@ jobs:
PRERELEASE_INFO=""
DAY_NUM="${{ steps.get_day.outputs.DAY_NUMBER }}"

# Function to compare semantic versions
# Returns 0 if version1 > version2, 1 otherwise
compare_versions() {
local v1="${1#v}" # Remove 'v' prefix if present
local v1="${1#v}"
local v2="${2#v}"

# Handle empty/null versions
[ -z "$v2" ] && return 0
[ -z "$v1" ] && return 1

# Split versions into components
IFS='.' read -r -a ver1 <<< "$v1"
IFS='.' read -r -a ver2 <<< "$v2"

# Compare major.minor.patch
for i in 0 1 2; do
local num1="${ver1[$i]:-0}"
local num2="${ver2[$i]:-0}"

# Remove any non-numeric suffix (like -rc1, -beta)
num1="${num1%%-*}"
num2="${num2%%-*}"

Expand All @@ -212,53 +200,44 @@ jobs:
fi
done

# If base versions are equal, pre-release < release
if [[ "$v1" == *"-"* ]] && [[ "$v2" != *"-"* ]]; then
return 1
elif [[ "$v1" != *"-"* ]] && [[ "$v2" == *"-"* ]]; then
return 0
fi

return 1 # versions are equal or v1 <= v2
return 1
}

# Get list of repos for today
case $DAY_NUM in
1) REPOS="nri-consul nri-mysql nri-memcached nri-redis nri-varnish nri-discovery nri-apache nri-postgresql" ;;
1) REPOS="nri-consul nri-mysql nri-memcached nri-redis nri-varnish nri-discovery-kubernetes nri-apache nri-postgresql" ;;
2) REPOS="nri-haproxy nri-nagios nri-elasticsearch nri-mongodb nri-mssql nri-oracledb nri-docker" ;;
3) REPOS="nri-couchbase nri-rabbitmq nri-kafka nri-prometheus nri-cassandra nri-nginx nrjmx" ;;
4) REPOS="nri-f5 nri-vsphere infrastructure-bundle nri-ecs nri-statsd nri-jmx" ;;
*) REPOS="" ;;
esac

# Check for pre-releases in each repo
for repo in $REPOS; do
echo "Checking releases for newrelic/${repo}..."

# Using GitHub API to check for releases
RESPONSE=$(curl -s \
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/newrelic/${repo}/releases")

# Check if we got a valid response
if echo "$RESPONSE" | jq -e . >/dev/null 2>&1; then
# Get latest release (non-prerelease)
LATEST_RELEASE=$(echo "$RESPONSE" | jq -r '.[] | select(.prerelease==false) | .tag_name' | head -1)

# Get latest pre-release
LATEST_PRERELEASE=$(echo "$RESPONSE" | jq -r '.[] | select(.prerelease==true) | .tag_name' | head -1)

if [ -n "$LATEST_PRERELEASE" ] && [ "$LATEST_PRERELEASE" != "null" ]; then
echo " Found pre-release: ${LATEST_PRERELEASE}"
echo " Latest release: ${LATEST_RELEASE:-none}"

# Only include pre-release if it's newer than the latest release
if compare_versions "$LATEST_PRERELEASE" "$LATEST_RELEASE"; then
PRERELEASE_INFO="${PRERELEASE_INFO}• *${repo}* - Pre-release: \`${LATEST_PRERELEASE}\` | Latest: \`${LATEST_RELEASE:-N/A}\` :arrow_up:\n"
echo " Pre-release ${LATEST_PRERELEASE} is newer than release ${LATEST_RELEASE}"
echo " Pre-release ${LATEST_PREREASE} is newer than release ${LATEST_RELEASE}"
else
echo " Pre-release ${LATEST_PRERELEASE} is not newer than release ${LATEST_RELEASE}, skipping"
echo " Pre-release ${LATEST_PREREASE} is not newer than release ${LATEST_RELEASE}, skipping"
fi
else
echo " No pre-release found"
Expand All @@ -277,59 +256,149 @@ jobs:
echo "EOF" >> $GITHUB_OUTPUT
echo "HAS_PRERELEASES=true" >> $GITHUB_OUTPUT
fi

- name: Check for new commits since latest release
id: check_commits
if: steps.get_releases.outputs.HAS_RELEASES == 'true'
env:
GITHUB_TOKEN: ${{ github.token }}
run: |
COMMITS_INFO=""
DAY_NUM="${{ steps.get_day.outputs.DAY_NUMBER }}"

case $DAY_NUM in
1) REPOS="nri-consul nri-mysql nri-memcached nri-redis nri-varnish nri-discovery-kubernetes nri-apache nri-postgresql" ;;
2) REPOS="nri-haproxy nri-nagios nri-elasticsearch nri-mongodb nri-mssql nri-oracledb nri-docker" ;;
3) REPOS="nri-couchbase nri-rabbitmq nri-kafka nri-prometheus nri-cassandra nri-nginx nrjmx" ;;
4) REPOS="nri-f5 nri-vsphere infrastructure-bundle nri-ecs nri-statsd nri-jmx" ;;
*) REPOS="" ;;
esac

for repo in $REPOS; do
echo "Checking commits for newrelic/${repo}..."

LATEST_COMMIT_SHA=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" \
"https://api.github.com/repos/newrelic/${repo}/commits/main" | jq -r .sha)
if [ "$LATEST_COMMIT_SHA" == "null" ]; then
LATEST_COMMIT_SHA=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" \
"https://api.github.com/repos/newrelic/${repo}/commits/master" | jq -r .sha)
fi

LATEST_RELEASE_SHA=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/newrelic/${repo}/releases" | jq -r 'if type == "array" then .[0].target_commitish else .target_commitish end')

if [ -z "$LATEST_COMMIT_SHA" ] || [ "$LATEST_COMMIT_SHA" == "null" ]; then
echo " Failed to get latest commit for ${repo}. Skipping."
continue
fi

if [ -z "$LATEST_RELEASE_SHA" ] || [ "$LATEST_RELEASE_SHA" == "null" ]; then
COMMITS_INFO="${COMMITS_INFO}• *${repo}* - :new: No releases found - any new commit will trigger a release\n"
elif [ "$LATEST_COMMIT_SHA" != "$LATEST_RELEASE_SHA" ]; then
COMMITS_INFO="${COMMITS_INFO}• *${repo}* - :heavy_check_mark: New commits found since latest release\n"
else
COMMITS_INFO="${COMMITS_INFO}• *${repo}* - :x: No new commits found since latest release\n"
fi
done

if [ -z "$COMMITS_INFO" ]; then
echo "COMMITS_STATUS=No scheduled repositories found" >> $GITHUB_OUTPUT
echo "HAS_COMMITS=false" >> $GITHUB_OUTPUT
else
echo "COMMITS_STATUS<<EOF" >> $GITHUB_OUTPUT
echo -e "$COMMITS_INFO" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "HAS_COMMITS=true" >> $GITHUB_OUTPUT
fi

- name: Format Slack message
id: format_message
run: |
# Create a properly formatted Slack message with proper Slack markup
CURRENT_TIME=$(date -u '+%H:%M')

# Start building the message
cat > slack_message.txt << MESSAGE_END
:calendar: *Daily Release Status Report*
:clock1: ${{ steps.get_day.outputs.DAY_NAME }} | Generated at ${CURRENT_TIME} UTC

────────────────────────────────────

:traffic_light: *Automatic Release Status*
${{ steps.check_status.outputs.STATUS_MESSAGE }}


MESSAGE_END

# Add scheduled releases section
if [ "${{ steps.get_releases.outputs.HAS_RELEASES }}" == "true" ]; then
cat >> slack_message.txt << 'MESSAGE_END'
:rocket: *Today's Scheduled Releases*

${{ steps.get_releases.outputs.RELEASES }}

:rocket: *Scheduled Releases for Today*

MESSAGE_END

# Add pre-release section if there are any
if [ "${{ steps.check_prereleases.outputs.HAS_PRERELEASES }}" == "true" ]; then

# Group repos with commits and those without
COMMITS_FOUND_REPOS=""
NO_COMMITS_REPOS=""
PRERELEASES_READY=""

IFS=$'\n'

# Combine each scheduled repo with its commit status
readarray -t RELEASES_ARRAY <<< "${{ steps.get_releases.outputs.RELEASES }}"
readarray -t COMMITS_ARRAY <<< "${{ steps.check_commits.outputs.COMMITS_STATUS }}"

for i in "${!RELEASES_ARRAY[@]}"; do
RELEASE_LINE="${RELEASES_ARRAY[$i]}"
COMMIT_LINE="${COMMITS_ARRAY[$i]}"

if [[ "$COMMIT_LINE" == *":heavy_check_mark:"* ]]; then
COMMITS_FOUND_REPOS+="${RELEASE_LINE} - :heavy_check_mark: Release should happen! 🚀\n"
elif [[ "$COMMIT_LINE" == *":x:"* ]]; then
NO_COMMITS_REPOS+="${RELEASE_LINE} - :x: No new commits found since last release.\n"
elif [[ "$COMMIT_LINE" == *":new:"* ]]; then
NO_COMMITS_REPOS+="${RELEASE_LINE} - :new: No releases found - any new commit will trigger a release.\n"
fi
done

# Output grouped results
if [ -n "$COMMITS_FOUND_REPOS" ]; then
cat >> slack_message.txt << 'MESSAGE_END'
:heavy_check_mark: *The following repos have new commits:*
MESSAGE_END
echo -e "$COMMITS_FOUND_REPOS" >> slack_message.txt
echo "" >> slack_message.txt
fi

if [ -n "$NO_COMMITS_REPOS" ]; then
cat >> slack_message.txt << 'MESSAGE_END'
:x: *The following repos have no new commits:*
MESSAGE_END
echo -e "$NO_COMMITS_REPOS" >> slack_message.txt
echo "" >> slack_message.txt
fi

# Pre-release section
if [ "${{ steps.check_prereleases.outputs.HAS_PRERELEASES }}" == "true" ]; then
cat >> slack_message.txt << 'MESSAGE_END'
---
:package: *Pre-releases Ready for Promotion*
:dart: The following pre-releases are newer than their latest releases and will be promoted:

${{ steps.check_prereleases.outputs.PRERELEASE_STATUS }}

MESSAGE_END
else
cat >> slack_message.txt << 'MESSAGE_END'
:package: *Pre-release Status*
:information_source: No new pre-releases ready for promotion today.

fi

# Add separator and Automatic Release Status
cat >> slack_message.txt << 'MESSAGE_END'
---
:traffic_light: *Automatic Release Status*
${{ steps.check_status.outputs.STATUS_MESSAGE }}

MESSAGE_END
fi

# Add summary stats

REPO_COUNT=$(echo "${{ steps.get_releases.outputs.RELEASES }}" | grep -c "^•" || echo "0")
PRERELEASE_COUNT=$(echo "${{ steps.check_prereleases.outputs.PRERELEASE_STATUS }}" | grep -c ":arrow_up:" || echo "0")
COMMITS_COUNT=$(echo "${{ steps.check_commits.outputs.COMMITS_STATUS }}" | grep -c ":heavy_check_mark:" || echo "0")

{
echo ":bar_chart: *Summary*"
echo "• :calendar: *Total scheduled releases:* $REPO_COUNT"
echo "• :new: *Pre-releases to promote:* $PRERELEASE_COUNT"
echo "• :git: *Repos with new commits:* $COMMITS_COUNT"

if [ "${{ steps.check_status.outputs.RELEASES_ENABLED }}" == "true" ]; then
echo "• :white_check_mark: *Status:* Ready to release! :tada:"
Expand All @@ -339,14 +408,14 @@ jobs:
echo ""
} >> slack_message.txt
else
# Fallback for no scheduled releases
cat >> slack_message.txt << 'MESSAGE_END'
:clipboard: *Release Schedule*
:sleeping: ${{ steps.get_releases.outputs.RELEASES }}

MESSAGE_END
fi

# Save to GitHub output (no footer with workflow link)
{
echo "SLACK_MESSAGE<<EOF"
cat slack_message.txt
Expand All @@ -372,6 +441,12 @@ jobs:
if [ "${{ steps.get_releases.outputs.HAS_RELEASES }}" == "true" ]; then
echo "### Scheduled Releases:" >> $GITHUB_STEP_SUMMARY
echo "${{ steps.get_releases.outputs.RELEASES }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Pre-releases for Promotion:" >> $GITHUB_STEP_SUMMARY
echo "${{ steps.check_prereleases.outputs.PRERELEASE_STATUS }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Commit Status:" >> $GITHUB_STEP_SUMMARY
echo "${{ steps.check_commits.outputs.COMMITS_STATUS }}" >> $GITHUB_STEP_SUMMARY
else
echo "### No releases scheduled for today" >> $GITHUB_STEP_SUMMARY
fi
Loading