{"id":20838430,"url":"https://github.com/reload/bug-yield","last_synced_at":"2025-06-20T07:33:20.072Z","repository":{"id":37966068,"uuid":"1571429","full_name":"reload/bug-yield","owner":"reload","description":"Integrates Harvest and Jira timetracking","archived":false,"fork":false,"pushed_at":"2023-11-30T05:08:50.000Z","size":637,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-05-08T20:53:24.738Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reload.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2011-04-05T09:45:55.000Z","updated_at":"2023-03-05T13:19:02.000Z","dependencies_parsed_at":"2023-02-14T05:00:30.650Z","dependency_job_id":"1128f846-e15a-434c-b64b-b1c9ce34460b","html_url":"https://github.com/reload/bug-yield","commit_stats":null,"previous_names":[],"tags_count":95,"template":false,"template_full_name":null,"purl":"pkg:github/reload/bug-yield","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reload%2Fbug-yield","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reload%2Fbug-yield/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reload%2Fbug-yield/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reload%2Fbug-yield/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reload","download_url":"https://codeload.github.com/reload/bug-yield/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reload%2Fbug-yield/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260901151,"owners_count":23079719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-18T01:10:15.969Z","updated_at":"2025-06-20T07:33:15.057Z","avatar_url":"https://github.com/reload.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BugYield\n\n[![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/reload/bug-yield/Run%20tests/main?style=for-the-badge)](https://github.com/reload/bug-yield/actions?query=branch%3Amain)\n[![Codecov branch](https://img.shields.io/codecov/c/github/reload/bug-yield/main?style=for-the-badge)](https://codecov.io/gh/reload/bug-yield/branch/main)\n\nBugYield is a console application which tracks changes to tickets\n(issues, work items, bugs whatever) across systems (two-way) to avoid\ntedious double registrations.\n\nWhich means that the developers only need to track time in Harvest,\nand then ticket-titles will be transferred automatically from Jira to\nthe Harvest time entry AND time spend on that ticket will be\nsynchronized in Jira.\n\n## Installation\n\nClone the repository and run composer install to install dependencies.\nThe PHP extensions curl, xml and mbstring are required.\n\n## Configuration\n\nBugYield needs to know where and how to access the systems involved.\nThis configuration is handled by a config.yml file. Copy the provided\nconfig.sample.yml and update it with account information. If your\nconfiguration file is not located in the root directory you can\nspecify the path to the config file using the `--config` option.\n\nIn order to send mails it needs a SendGrid key supplied in the\nenvironment variable `SENDGRID_API_KEY`.\n\n## Usage\n\nBugYield currently supports two use cases:\n\n1. *Time synchronization*: Mapping entries in Harvest to time elapsed in Jira tickets\n2. *Title synchronization*: Mapping ticket titles from Jira to Harvest entries\n\nBugYield works in the context of one or more Harvest projects\nidentified through their id, full name or code. Projects can be\nspecified in the configuration or using the\n\u003ccode\u003e--harvest-project\u003c/code\u003e option. Use the magic name `all` to\nspecify all Harvest projects.\n\nRun \u003ccode\u003e./bugyield\u003c/code\u003e from the command line to show all available commands.\n\n1. **Time synchronization** example:\n   `./bugyield tim --bugtracker=a-label` Run BugYield with the bugtracker defined in config.yml with the label `a-label`\n2. **Title synchronization** example:\n   `./bugyield tit --bugtracker=a-label` Run BugYield with the bugtracker defined in config.yml with the label `a-label`\n\nJust change the `--bugtracker=XXXX` with another label to run another\nbugtracker. We have two Jira bugtrackers configured in the same\nconfig.yml\n\n###  Running in docker\n\nTo build an image to run in docker, you must first build an image:\n\n``` shell\ndocker build . -t reload/bug-yield:local\n```\n\nWhen running in docker, you should mount in the config file:\n\n``` shell\ndocker run -v /path/to/config.yml:/bug-yield/config.yml reload/bug-yield:local\n```\n\nIn development, you can mount in the full source and run a command\nimmediately:\n\n``` shell\ndocker run -v $PWD:/bug-yield/ reload/bug-yield:local /bug-yield/bugyield --bugtracker=sometracker tim\n```\n\n### Time synchronization\n\nBugYield can update tickets in Jira with time registrations in\nHarvest. This makes it easier to show how much time has been spent on\na ticket and how this corresponds with estimates.\n\nIt works like this:\n\n1. Add `#\u003cticket-id\u003e` (without the \u003c\u003e's) in the Harvest entry\n   notes\n2. Run the timesync command\n3. The elapsed time field for the Jira ticket is updated and a new\n   worklog is added to the ticket showing the entry id, the time\n   spent, the task type and the notes from Harvest.\n\nIf the time or task for the Harvest entry is changed at a later point\nin time, subsequent execution of the timesync command adds a new\ncomment to the ticket and the elapsed time field is adjusted\naccordingly.\n\nIf a Harvest entry contains multiple ticket ids the time spent is\ndistributed evenly across the mentioned tickets.\n\nIf BugYield detects serious inconsistencies, then it will email the\noffending user and optionally a separately defined email address (e.g.\nto the Project Manager).\n\n#### PRO TIP for JIRA\n\nMake sure that the Closed state is editable in your Jira workflows,\nthus enabling bugyield to update worklogs on closed issues - see [Jira\ndocumentation](https://confluence.atlassian.com/display/JIRA/Allow+editing+of+Closed+Issues)\n\n### Title synchronization\n\nBugYield can update entries in Harvest with ticket titles from Jira.\nThis makes it easier register time on specific tickets without typing\nother than the ticket-number (prefixed with a `#`). NOTE: When an\nentry has been submitted and thereby locked, then we can't edit the\nentry, and it will fail.\n\nIt works like this:\n\n1. Add `\u003cticket-id\u003e` (without the \u003c\u003e's) in the Harvest entry notes\n2. Run the titlesync command\n3. The entry notes in Harvest are updated with the ticket titles from\n   Jira replacing `\u003cticket-id\u003e` with `\u003cticket-id\u003e[\u003cticket-title\u003e]`\n\nIf a Jira ticket title is changed at a later point in time, subsequent\nexecution of the titlesync command makes sure that the Harvest entry\nnotes are updated accordingly.\n\n##  Known errors and problems\n\n### Brackets in ticket titles\n\nIf you put brackets in your ticket title, you make it difficult for\nBugYield to recognize our \"codes\". It will handle the ticket, but\ndisplay warnings and remove any comments on the Harvest entry created\nby the user.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freload%2Fbug-yield","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freload%2Fbug-yield","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freload%2Fbug-yield/lists"}