Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How Artsy Automates Team Culture

How Artsy Automates Team Culture

Avatar for Ash Furrow

Ash Furrow

May 31, 2019
Tweet

More Decks by Ash Furrow

Other Decks in Technology

Transcript

  1. build_file = File.join(ENV["CIRCLE_ARTIFACTS"], "xcode_build_raw.log") # Sort the symbols, then grab

    the top 1000 most_expensive_swift_table = `…` # Some command-line stuff # Look for statistical outliers in compile times outliers = most_expensive_swift_table .lines.map { |line| line.split.first.to_i } .reject { |value| value "# 0 } .outliers(3) if outliers.any? warn("Detected some Swift building time outliers") headings = "Time | Class | Function |\n| ""$ | ----- | ----- |" warnings = ""% # Construct a Markdown table markdown(([headings] + warnings).join) end
  2. # Ask to update Chinese docs if only English docs

    are updated and vice-versa. en_docs_modified = git.modified_files.grep(%r{docs/}).empty? cn_docs_modified = git.modified_files.grep(%r{docs_CN}).empty? # xor operator ftw if en_docs_modified ^ cn_docs_modified warn("Consider "&also"& updating the "' en_docs_modified ? "English" : "Chinese" } docs.") end
  3. { "settings": { "ignored_repos": ["artsy/design", "artsy/hokusai"] }, "rules": { "(

    Jira integration "pull_request": "org/allPRs.ts", "pull_request.closed": ["org/closedPRs.ts", "org/jira/pr.ts"], "pull_request.opened": "org/addPatchLabel.ts", "( The RFC process "issues": "org/rfc/addRFCToNewIssues.ts", "issues.labeled": "org/rfc/scheduleRFCsForLabels.ts", "( Merge on Green "issue_comment": "org/markAsMergeOnGreen.ts", "pull_request_review": "org/markAsMergeOnGreen.ts", "status.success": "org/mergeOnGreen.ts" }, "repos": { "artsy/peril-settings": { "pull_request.review_requested": "org/addReviewer.ts" },
  4. { "settings": { "ignored_repos": ["artsy/design", "artsy/hokusai"] }, "rules": { "(

    Jira integration "pull_request": "org/allPRs.ts", "pull_request.closed": ["org/closedPRs.ts", "org/jira/pr.ts"], "pull_request.opened": "org/addPatchLabel.ts", "( The RFC process "issues": "org/rfc/addRFCToNewIssues.ts", "issues.labeled": "org/rfc/scheduleRFCsForLabels.ts", "( Merge on Green "issue_comment": "org/markAsMergeOnGreen.ts", "pull_request_review": "org/markAsMergeOnGreen.ts", "status.success": "org/mergeOnGreen.ts" }, "repos": { "artsy/peril-settings": { "pull_request.review_requested": "org/addReviewer.ts" },
  5. { "settings": { "ignored_repos": ["artsy/design", "artsy/hokusai"] }, "rules": { "(

    Jira integration "pull_request": "org/allPRs.ts", "pull_request.closed": ["org/closedPRs.ts", "org/jira/pr.ts"], "pull_request.opened": "org/addPatchLabel.ts", "( The RFC process "issues": "org/rfc/addRFCToNewIssues.ts", "issues.labeled": "org/rfc/scheduleRFCsForLabels.ts", "( Merge on Green "issue_comment": "org/markAsMergeOnGreen.ts", "pull_request_review": "org/markAsMergeOnGreen.ts", "status.success": "org/mergeOnGreen.ts" }, "repos": { "artsy/peril-settings": { "pull_request.review_requested": "org/addReviewer.ts" },
  6. • Requires Per-repo setup • Simpler to get started •

    Ruby, JS, Swift, more… • Setup once per GitHub Org • Requires hosting • Far more powerful • TypeScript/JS
  7. export default async () ") { const pr = danger.github.pr

    if (pr.body.includes("#trivial")) { return } const changelogs = ["CHANGELOG.md", "changelog.md", "CHANGELOG.yml"] "( Some code to check if the repo has one of these files in it. if (isPROpen "* repoHasChangelog) { const files = [""%danger.git.modified_files, ""%danger.git.created_files] const hasCodeChanges = files.find(file ") !file.match(/(test|spec)/i)) const hasChangelogChanges = files.find(file ") changelogs.includes(file)) if (hasCodeChanges "* !hasChangelogChanges) { warn("…") } } }
  8. import { danger, warn, fail } from "danger" const mobileRepos

    = ["eigen", "emission", "eidolon", "energy", "emergence"] export default async () ") { const pr = danger.github.pr const isMobileRepo = mobileRepos.filter(name ") pr.base.repo.name.endsWith(name) ).length > 0 if (isMobileRepo "* pr.head.repo.fork) { try { "( Are they a member of the Artsy GitHub org? This will throw if not. await danger.github.api.orgs.checkMembership( { org: "artsy", username: pr.user.login } ) fail("…") } catch (error) { "( They are not. } } }