mirror of
https://github.com/fleetdm/fleet
synced 2026-04-21 13:37:30 +00:00
Event Execution How to create Event Issues (#40938)
Updating handbook section on event execution
This commit is contained in:
parent
637bcd2bb7
commit
0a594b8471
1 changed files with 328 additions and 0 deletions
|
|
@ -59,5 +59,333 @@ Once an event is approved, a Marketing directly responsible individual (DRI) is
|
|||
|
||||
An event's execution is not complete until the **Definition of Done** is met: the Event Overview Doc must be fully updated with post-event outcomes, notes, and final details.
|
||||
|
||||
## **How to automate event creation**
|
||||
|
||||
Since the tracking process uses github issues and subissues to track tasks, it can be tedious to create the structure for a new event. Here are the steps to automate the creation of the event execution issues in github.
|
||||
|
||||
### Setup
|
||||
We will use a local script that executes commands on the local GitHub command line interface (CLI). In order to get started you need to have the GitHub CLI installed.
|
||||
|
||||
1. **Install Homebrew.** *Homebrew is a package installer and the simplest way to get the GitHub CLI installed.*.
|
||||
1. Navigate to https://brew.sh/ and copy the installation script.
|
||||
2. Open a terminal window, paste and run the script. *You will be prompted for your local password*
|
||||
2. **Install GitHub CLI (GH CLI)**
|
||||
Using homebrew, tell it to install the GitHub command line interface
|
||||
`brew install gh`
|
||||
|
||||
3. **Authenticate / connect with GitHub**
|
||||
1. Enter the command: `gh auth login` and follow the steps to authenticate with the repository
|
||||
|
||||
4. **Update the CLI permissions to include projects**
|
||||
1. Enter the command `gh auth refresh -s project` and follow the steps to authenticate.
|
||||
|
||||
TODO - add a test set up section where a user has a simple issue script they test
|
||||
|
||||
|
||||
### Event Template Process and Script
|
||||
Creating a new event group is now simple.
|
||||
1. copy the script below and save as **NewEvent.sh**
|
||||
2. Edit the script.
|
||||
|
||||
First - CHANGE THESE THREE THINGS.
|
||||
|
||||
**Nothing else needs to change**
|
||||
|
||||
* EVENT_SLUG - will be the name of the event and part of the label for the event
|
||||
* PLANNING_DOC_URL - is the link to the google doc where we're keeping the latest status of the event plans
|
||||
* REQUEST_ISSUE - is thte number of the issue that proposed the event
|
||||
|
||||
For example:
|
||||
```
|
||||
EVENT_SLUG="2606-MacDevOpsYVR-Montreal"
|
||||
PLANNING_DOC_URL="https://docs.google.com/document/d/1Td1XtFClRlOMDuoojXUkJvU8f6MUEjsBacMVRqEJbQQ/edit?tab=t.afz38t4pwdka"
|
||||
REQUEST_ISSUE = "#14599"
|
||||
```
|
||||
|
||||
Save the changed file **NewEvent.sh**
|
||||
|
||||
And then execute the script. `./NewEvent.sh`
|
||||
|
||||
That's it. This should create the events in GitHub to manage the event.
|
||||
|
||||
here's the script
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# --- Event specifics / details - change this
|
||||
EVENT_SLUG="2606-MacDevOpsYVR-Montreal"
|
||||
PLANNING_DOC_URL="https://docs.google.com/document/d/1Td1XtFClRlOMDuoojXUkJvU8f6MUEjsBacMVRqEJbQQ/edit?tab=t.afz38t4pwdka"
|
||||
REQUEST_ISSUE = "#14599"
|
||||
|
||||
# No need to change anything else to run the script
|
||||
|
||||
# --- Static Configuration ---
|
||||
ORG="fleetdm"
|
||||
REPO="confidential"
|
||||
PROJECT_NUMBER="94"
|
||||
|
||||
# 1. Define Labels (Fixed with leading colons)
|
||||
NEW_LABEL=":mktg-event:${EVENT_SLUG}"
|
||||
PARENT_LABELS=":mktg-event,:mktg-event:overview,:mktg-event:tp"
|
||||
CHILD_LABELS=":mktg-event,:mktg-event:detail,:mktg-event:tp"
|
||||
|
||||
# Ensure the specific event label exists
|
||||
echo "1. Ensuring label '${NEW_LABEL}' exists..."
|
||||
# gh label create "$NEW_LABEL" --repo "$ORG/$REPO" --color "1D76DB" --force >/dev/null 2>&1 || true
|
||||
gh label create "$NEW_LABEL" --repo "$ORG/$REPO" --force >/dev/null 2>&1 || true
|
||||
|
||||
|
||||
# ==========================================
|
||||
# STEP 1: CREATE THE PARENT ISSUE
|
||||
# ==========================================
|
||||
echo "2. Creating Parent Issue (Overview)..."
|
||||
|
||||
PARENT_TITLE="${EVENT_SLUG} Execution Overview"
|
||||
|
||||
# Using a Heredoc for clean, WYSIWYG Markdown formatting
|
||||
PARENT_BODY=$(cat << EOF
|
||||
Master tracking issue for ${EVENT_SLUG}.
|
||||
|
||||
EXECUTION for request $REQUEST_ISSUE
|
||||
|
||||
## Executive Snapshot & Key Decisions
|
||||
|
||||
Use this section for a quick overview. If someone only reads this part, they should understand the scope and scale of our presence.
|
||||
|
||||
| Category | Details |
|
||||
|---|---|
|
||||
| Event Name | [e.g., KubeCon NA 2026] |
|
||||
| Dates | [Start Date] to [End Date] |
|
||||
| Location | [City, State, Venue Name] |
|
||||
| Event Website | [Link to official site] |
|
||||
| Budget Estimate | [Total estimated cost] |
|
||||
| Primary Goal | [e.g., Lead Gen (500 scans), Brand Awareness, Recruiting] |
|
||||
| Booth Size | [e.g., 10x20, Island, Tabletop] |
|
||||
| Speaking Slot? (details below) | Yes or No |
|
||||
| Workshop? | Yes or No |
|
||||
| DRI | [Name of person responsible] |
|
||||
| Onsite DRI | [Name of person responsible] |
|
||||
| Planing Doc | $PLANNING_DOC_URL |
|
||||
|
||||
- [ ] Finalize sponsorship agreements
|
||||
- [ ] Assign issues/tasks
|
||||
|
||||
## Progress Tracker
|
||||
- [ ] 1. Speaking Session & Workshop Details
|
||||
- [ ] 2. Promotion & Marketing Plan
|
||||
- [ ] 3. Booth Strategy & Messaging
|
||||
- [ ] 4. Staffing & Travel Logistics
|
||||
- [ ] 5. Execution, Logistics & Swag
|
||||
- [ ] 6 Lead Capture & Follow-Up Strategy
|
||||
- [ ] 7. Post-Mortem & ROI Analysis
|
||||
EOF
|
||||
)
|
||||
|
||||
# Create Parent
|
||||
PARENT_URL=$(gh issue create \
|
||||
--repo "$ORG/$REPO" \
|
||||
--title "$PARENT_TITLE" \
|
||||
--body "$PARENT_BODY" \
|
||||
--label "$PARENT_LABELS,$NEW_LABEL")
|
||||
|
||||
# CRITICAL CHECK: Did the parent issue actually get created?
|
||||
if [ -z "$PARENT_URL" ]; then
|
||||
echo "❌ ERROR: Failed to create Parent Issue. Check if labels exist in the repo."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Extract Issue Number from URL
|
||||
PARENT_NUM=$(echo "$PARENT_URL" | awk -F/ '{print $NF}')
|
||||
echo " ✅ Parent Created: #$PARENT_NUM"
|
||||
|
||||
# Get the Global Node ID of the Parent (Needed for GraphQL linking)
|
||||
PARENT_NODE_ID=$(gh api graphql -f query='
|
||||
query($owner:String!, $repo:String!, $number:Int!) {
|
||||
repository(owner:$owner, name:$repo) {
|
||||
issue(number:$number) { id }
|
||||
}
|
||||
}' -f owner="$ORG" -f repo="$REPO" -F number="$PARENT_NUM" --jq '.data.repository.issue.id')
|
||||
|
||||
if [ -z "$PARENT_NODE_ID" ] || [ "$PARENT_NODE_ID" == "null" ]; then
|
||||
echo "❌ ERROR: Could not fetch GraphQL Node ID for Parent #$PARENT_NUM"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo " 🔹 Parent Node ID: $PARENT_NODE_ID"
|
||||
|
||||
# Add Parent to Project
|
||||
gh project item-add "$PROJECT_NUMBER" --owner "$ORG" --url "$PARENT_URL" >/dev/null 2>&1
|
||||
|
||||
|
||||
# ==========================================
|
||||
# STEP 2: HELPER FUNCTION FOR CHILD ISSUES
|
||||
# ==========================================
|
||||
# This function handles the creation and linking of all sub-issues
|
||||
create_sub_issue() {
|
||||
local TITLE="$1"
|
||||
local BODY="$2"
|
||||
|
||||
CHILD_URL=$(gh issue create \
|
||||
--repo "$ORG/$REPO" \
|
||||
--title "$TITLE: ${EVENT_SLUG}" \
|
||||
--body "$BODY" \
|
||||
--label "$CHILD_LABELS,$NEW_LABEL")
|
||||
|
||||
if [ -n "$CHILD_URL" ]; then
|
||||
CHILD_NUM=$(echo "$CHILD_URL" | awk -F/ '{print $NF}')
|
||||
|
||||
# Get Child Node ID
|
||||
CHILD_NODE_ID=$(gh api graphql -f query='
|
||||
query($owner:String!, $repo:String!, $number:Int!) {
|
||||
repository(owner:$owner, name:$repo) {
|
||||
issue(number:$number) { id }
|
||||
}
|
||||
}' -f owner="$ORG" -f repo="$REPO" -F number="$CHILD_NUM" --jq '.data.repository.issue.id')
|
||||
|
||||
echo " ✅ Created Child: #$CHILD_NUM ($TITLE)"
|
||||
|
||||
# Link as Sub-Issue via GraphQL
|
||||
LINK_RESULT=$(gh api graphql -f query='
|
||||
mutation($parentId: ID!, $childId: ID!) {
|
||||
addSubIssue(input: {issueId: $parentId, subIssueId: $childId}) {
|
||||
clientMutationId
|
||||
}
|
||||
}
|
||||
' -f parentId="$PARENT_NODE_ID" -f childId="$CHILD_NODE_ID" 2>&1)
|
||||
|
||||
if [[ $? -eq 0 ]]; then
|
||||
echo " 🔗 Linked as Sub-issue to Parent #$PARENT_NUM"
|
||||
else
|
||||
echo " ⚠️ Failed to link. Error details:"
|
||||
echo "$LINK_RESULT"
|
||||
fi
|
||||
|
||||
# Add to Project
|
||||
gh project item-add "$PROJECT_NUMBER" --owner "$ORG" --url "$CHILD_URL" >/dev/null 2>&1
|
||||
else
|
||||
echo " ❌ Failed to create child: $TITLE"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# ==========================================
|
||||
# STEP 3: DEFINE & CREATE CHILD ISSUES
|
||||
# ==========================================
|
||||
echo "3. Creating and Linking Child Issues..."
|
||||
|
||||
# --- Child 1 ---
|
||||
BODY=$(cat << EOF
|
||||
**Description**
|
||||
Track all details, deadlines, and requirements for any speaking slots or workshops we are hosting before, during, or after the event.
|
||||
|
||||
- [ ] Confirm speaking session details (Title, Speaker, Date/Time, Room)
|
||||
- [ ] Submit Abstract Link and AV Requirements
|
||||
- [ ] Confirm workshop hosting and timing
|
||||
- [ ] Update Workshop Planning Doc, Registration Link, and Capacity
|
||||
- [ ] Update the $PLANNING_DOC_URL
|
||||
EOF
|
||||
)
|
||||
create_sub_issue "1. Speaking Session & Workshop Details" "$BODY"
|
||||
|
||||
|
||||
# --- Child 2 ---
|
||||
BODY=$(cat << EOF
|
||||
**Description**
|
||||
Manage how we are driving traffic to our booth, session, or workshop.
|
||||
|
||||
- [ ] Schedule Pre-Event Email Blast
|
||||
- [ ] Schedule LinkedIn and Twitter/X Posts
|
||||
- [ ] Create Speaker Promo Graphics and Blog Post
|
||||
- [ ] Assign Customer Invites
|
||||
- [ ] Assign Live Social Coverage during event
|
||||
- [ ] Schedule Event App Push Notification
|
||||
- [ ] Update the $PLANNING_DOC_URL
|
||||
EOF
|
||||
)
|
||||
create_sub_issue "2. Promotion & Marketing Plan" "$BODY"
|
||||
|
||||
|
||||
# --- Child 3 ---
|
||||
BODY=$(cat << EOF
|
||||
**Description**
|
||||
Define the core purpose, layout, and messaging for our physical footprint on the show floor.
|
||||
|
||||
- [ ] Document Booth Number and Exhibit Hall Hours
|
||||
- [ ] Define Core Messaging/Theme
|
||||
- [ ] List Key Demos
|
||||
- [ ] Document Key Requirements (internet, scanners, monitors)
|
||||
- [ ] Update the $PLANNING_DOC_URL
|
||||
EOF
|
||||
)
|
||||
create_sub_issue "3. Booth Strategy & Messaging" "$BODY"
|
||||
|
||||
|
||||
# --- Child 4 ---
|
||||
BODY=$(cat << EOF
|
||||
**Description**
|
||||
Manage who is going, where they are staying, and when they are working the booth.
|
||||
|
||||
- [ ] Assign Staff Manager and Attire
|
||||
- [ ] Select Suggested Hotel
|
||||
- [ ] Set Arrival and Departure Requirements
|
||||
- [ ] Complete Staff Assignments table
|
||||
- [ ] Create Booth Staffing Schedule
|
||||
- [ ] Update the $PLANNING_DOC_URL
|
||||
EOF
|
||||
)
|
||||
create_sub_issue "4. Staffing & Travel Logistics" "$BODY"
|
||||
|
||||
|
||||
# --- Child 5 ---
|
||||
BODY=$(cat << EOF
|
||||
**Description**
|
||||
This section is for the operations team to handle on-site setup, booth build, and shipping.
|
||||
|
||||
- [ ] Track Shipping & Handling deadlines and tracking numbers
|
||||
- [ ] Create Return Shipping Label
|
||||
- [ ] Confirm Booth Vendor, Graphics Deadline, and Furniture/Electrical
|
||||
- [ ] Order Premium Swag, General Swag, and Raffle/Contest items
|
||||
- [ ] Complete Key Points of Contact table
|
||||
- [ ] Update the $PLANNING_DOC_URL
|
||||
EOF
|
||||
)
|
||||
create_sub_issue "5. Execution, Logistics & Swag" "$BODY"
|
||||
|
||||
|
||||
# --- Child 6 ---
|
||||
BODY=$(cat << EOF
|
||||
**Description**
|
||||
Crucial for ROI. Track how we capture data and what happens next.
|
||||
|
||||
- [ ] Define Capture Mechanics, Method, and Device Rental
|
||||
- [ ] Define Incentive to Scan
|
||||
- [ ] Write Qualifying Questions for Booth Staff
|
||||
- [ ] Assign Lead Upload Owner and SLA
|
||||
- [ ] Define Follow Up Strategy and Nurture Sequence
|
||||
- [ ] Update the $PLANNING_DOC_URL
|
||||
EOF
|
||||
)
|
||||
create_sub_issue "6. Lead Capture & Follow-Up Strategy" "$BODY"
|
||||
|
||||
|
||||
# --- Child 7 ---
|
||||
BODY=$(cat << EOF
|
||||
**Description**
|
||||
To be filled out within 1 week of event conclusion to analyze performance and ROI.
|
||||
|
||||
- [ ] Record The Numbers (Leads, MQLs, Spend, CPL)
|
||||
- [ ] Complete Retrospective (What went well/wrong)
|
||||
- [ ] Document Competitor Intel
|
||||
- [ ] Upload Photo Archive
|
||||
- [ ] Update the $PLANNING_DOC_URL
|
||||
EOF
|
||||
)
|
||||
create_sub_issue "7. Post-Mortem & ROI Analysis" "$BODY"
|
||||
|
||||
echo "Done."
|
||||
```
|
||||
|
||||
|
||||
|
||||
<meta name="maintainedBy" value="johnjeremiah">
|
||||
<meta name="title" value="🫧 Marketing Event Execution">
|
||||
|
|
|
|||
Loading…
Reference in a new issue