2 complementary command-line tools for GitHub issue management - **00-jira-to-gh-issues**: A Rust tool that converts Jira CSV exports to GitHub issue markdown files compatible with gh-issue-generator. It handles messy CSV data and preserves issue metadata - **01-gh-issue-generator**: A Rust tool that creates GitHub issues from Markdown files with YAML front matter. It parses structured Markdown, supports batch processing, and integrates with GitHub CLI
Jira to GitHub Issues Converter
A Rust command-line tool that converts Jira CSV exports to GitHub issue markdown files compatible with the gh-issue-generator tool.
Prerequisites
- Rust installed (cargo, rustc)
- Basic familiarity with Jira CSV exports
Installation
Option 1: Build from source
- Clone this repository
git clone https://github.com/bee8333/2ticketss.git
cd 2ticketss/00-jira-to-gh-issues
- Build the application:
cargo build --release
-
The executable will be in
target/release/jira-to-gh-issues -
Optional: Add to your PATH
# Linux/macOS
cp target/release/jira-to-gh-issues ~/.local/bin/
# or add the following to your .bashrc or .zshrc
export PATH="$PATH:/path/to/2ticketss/00-jira-to-gh-issues/target/release"
Option 2: Install with Cargo
If you have Rust installed, you can install directly with:
cargo install --path .
Exporting Issues from Jira
- In Jira, go to the issue list view (with all filters applied)
- Click "Export" and select "CSV (All fields)"
- Save the CSV file
Required Jira fields:
- Summary (required)
- Issue key (required)
Recommended fields (for best results):
- Issue Type
- Priority
- Description
- Assignee
- Reporter
- Created
- Labels
Usage
jira-to-gh-issues [OPTIONS] --input <jira_export.csv>
Arguments:
--input, -i <jira_export.csv>: Path to the CSV file exported from Jira (required)
Options:
--output, -o <output_dir>: Directory where the markdown files will be saved--status, -s <status>: Default status for the issues (draft or ready)--verbose, -v: Increase verbosity level (can be used multiple times: -v, -vv)--config, -c <config>: Path to config file
Logging Options
You can control log verbosity in two ways:
-
Using the
--verboseflag:-v: Debug level logging-vv: Trace level logging
-
Using the
RUST_LOGenvironment variable:# Set global log level RUST_LOG=debug jira-to-gh-issues --input issues.csv # Set per-module log level RUST_LOG=jira_to_gh_issues=trace,csv=warn jira-to-gh-issues --input issues.csv
Configuration
The tool supports configuration files to store default settings. Configuration is searched in these locations (in order):
- Path specified with
--configoption .jira-to-gh-issues.tomlin current directory~/.jira-to-gh-issues.tomlin home directory~/.config/jira-to-gh-issues/config.tomlin XDG config directory
A default configuration file will be created at ~/.config/jira-to-gh-issues/config.toml if none exists.
Configuration Options
# Default output directory
output_dir = "00-jira-to-gh-issues/output"
# Default issue status (draft or ready)
default_status = "ready"
# Required fields in CSV
required_fields = ["Summary", "Issue key"]
Creating or Editing Configuration
You can manually create or edit the configuration file, or run the tool once to create a default configuration automatically.
For example, to set custom defaults:
mkdir -p ~/.config/jira-to-gh-issues
cat > ~/.config/jira-to-gh-issues/config.toml << EOF
output_dir = "github-issues/jira-exports"
default_status = "draft"
required_fields = ["Summary", "Issue key", "Description"]
EOF
Example Workflow
1. Export issues from Jira
# Assuming you've exported Jira issues to "sprint-backlog.csv"
2. Convert to GitHub issue format
jira-to-gh-issues --input sprint-backlog.csv --output github-issues
3. Create GitHub issues using gh-issue-generator
cd ..
gh-issue-generator --repo myuser/myrepo github-issues/20240405123045/batch.md
How It Works
- The tool reads a CSV file exported from Jira
- For each issue in the CSV, it:
- Extracts relevant information (title, description, labels, etc.)
- Converts it to the GitHub issue markdown format with YAML front matter
- Writes individual markdown files for each issue
- Creates a batch file containing all issues
- Output is saved in a timestamped directory to avoid overwriting previous conversions
- An error log is generated for any issues that couldn't be processed
Output Format
The tool generates:
- Individual markdown files for each issue (named after the Jira issue key)
- A batch file containing all issues in the format expected by gh-issue-generator
- An error log file listing any processing issues
Each generated file follows the format required by the gh-issue-generator tool:
---
title: Issue title
status: ready (or draft)
labels:
- label1
- label2
assignees:
- assignee1
---
# Issue title
## Description
Issue description...
## Metadata
- **Jira Issue**: JIRA-123
- **Created**: Creation date
- **Reporter**: Reporter name
Mapping Rules
| Jira Field | GitHub Issue Field |
|---|---|
| Summary | title |
| Issue Type | Converted to a label |
| Priority | High/Critical → priority label |
| Labels | labels |
| Description | Description section |
| Assignee | assignees |
| Reporter | Listed in metadata |
| Created | Listed in metadata |
| Issue Key | Listed in metadata & filename |
Troubleshooting
CSV Import Issues
- Ensure the CSV export from Jira includes the required fields (Summary, Issue key)
- If the import fails with "Missing required columns", verify your Jira export contains these field names
- For malformed CSV files, try opening in a spreadsheet application and re-saving
Character Encoding
- If you see corrupted characters, ensure your CSV is UTF-8 encoded
- Some Jira instances export in different encodings depending on region settings
Large Exports
- For very large exports (1000+ issues), consider splitting into multiple files
- Processing large files may require more memory
Limitations
- Complex Jira markup may not convert perfectly to Markdown
- Attachments from Jira issues are not transferred
- Comments are not included in the conversion
License
MIT