diff --git a/.automation/test/ruby/.gitignore b/.automation/test/ruby/.gitignore new file mode 100644 index 00000000..11a77a44 --- /dev/null +++ b/.automation/test/ruby/.gitignore @@ -0,0 +1,106 @@ + + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port diff --git a/.automation/test/ruby/LICENSE b/.automation/test/ruby/LICENSE new file mode 100644 index 00000000..c2b32069 --- /dev/null +++ b/.automation/test/ruby/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Dave McKinstry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/.automation/test/ruby/README0.md b/.automation/test/ruby/README0.md new file mode 100644 index 00000000..51299da0 --- /dev/null +++ b/.automation/test/ruby/README0.md @@ -0,0 +1,5 @@ +# csv-issue-import + +Sample script to import a CSV file (assumedly from an Azure Boards export) to GitHub issues. + +This script is a starting point - you'll need to update for user name mappings, your own GITHUB_TOKEN, repo name, etc. It isn't a complex or robust solution, but it does show an approach to map into GitHub issues... diff --git a/.automation/test/ruby/importWIT.js b/.automation/test/ruby/importWIT.js new file mode 100644 index 00000000..8afaa339 --- /dev/null +++ b/.automation/test/ruby/importWIT.js @@ -0,0 +1,77 @@ +const fs = require('fs'); +const axios=require('axios'); + +// UPDATE THESE (and set your GITHUB_TOKEN in the environment) +const owner = 'LukasTestOrganization'; +const repo = 'TestImportRepo'; +const token = process.env.GITHUB_TOKEN + +// Configure HTTP client +const url = `https://api.github.com/repos/${owner}/${repo}/issues`; +axios.defaults.headers.post.Accept = "application/vnd.github.v3+json"; +axios.defaults.headers.post.Authorization = `token ${token}`; + +//----------------------------------------------------------------- +// getGitHubUser function - maps TFS users to GitHub users +const userMap = [ + [ "Sample User1", "admiralawkbar"], + [ "Sample User2", ""], // Not mapped in the GitHub side + [ "No Suchuser", "admiralawkbar"] +]; + +function getGitHubUser( user ) { + var foundUser = userMap.find( function( value, index, results) { + return (user === value[0]); + }); + if (foundUser === undefined) { + return ""; + } else { + return foundUser[1]; + } +} + +//----------------------------------------------------------------- +// createIssue function +// Work Item Type and state are stored as a labels +function createIssue( title, workitem_type, state, description, assignee ) { + var body = { + title: title, + body: description, + assignees: [ getGitHubUser(assignee) ], + labels: [ workitem_type, state ] + }; + + var response = axios.post(url, body) + .then((res) => { + var issueNumber = res.data.number; + console.log(`Created issue #${issueNumber}`); + }) + .catch((error) => { + console.error(error) + }); +} + +//----------------------------------------------------------------- +fs.readFile('wit.csv', function(err, charBuffer) { + var fileContents = charBuffer.toString(); + var lines = fileContents.split('\n'); + // The first line is the server name, so skip it + // The second line is column headers (skipped) which is hard coded as: + // ID,Work Item Type,Title,Assigned To,State,Tags + // We are capturing all of it as historical description + for( var i=2; i< lines.length; i++ ) { + columns = lines[i].split(','); + var id = columns[0]; + var workitem_type = columns[1]; + var title = columns[2]; + var user = columns[3]; + var state = columns[4]; + var tags = columns[5]; + + var description = `Imported ${workitem_type} #${id} from TFS, TITLE: ${title}, ASSIGNED TO: ${user}, STATE: ${state}, TAGS: ${tags}`; + + if (id > 0 ) { + createIssue( title, workitem_type, state, description, user ); + } + } +}); diff --git a/.automation/test/ruby/package-lock.json b/.automation/test/ruby/package-lock.json new file mode 100644 index 00000000..1f21ebc3 --- /dev/null +++ b/.automation/test/ruby/package-lock.json @@ -0,0 +1,35 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } +} diff --git a/.automation/test/ruby/wit.csv b/.automation/test/ruby/wit.csv new file mode 100644 index 00000000..82fa83fb --- /dev/null +++ b/.automation/test/ruby/wit.csv @@ -0,0 +1,12 @@ +Project: etc... Ignore +ID,Work Item Type,Title,Assigned To,State,Tags +1,Task,Sample task #1,Sample User1,Closed, +2,Task,Sample task #2,Sample User1,Closed, +43,Bug,Sample bug #1,Sample User2,Closed, +44,Task,Sample task #3,Sample User1,Closed, +55,Bug,Sample bug #2,Sample User3,Resolved, +107,Task,Sample task #4,,Active, +108,Task,Sample task #5,,Active, +117,Test Case,Sample Test Case A,Sample User2,Closed, +118,Issue,Sample Issue X,User X,Closed, +2624,Task,Sample Task #6,Somebody Else,Active, diff --git a/Dockerfile b/Dockerfile index fb53be14..47e5ce3b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -72,7 +72,11 @@ RUN git clone https://github.com/replicatedhq/dockerfilelint.git && cd /dockerfi #################### # Run GEM installs # #################### -RUN gem install rubocop:0.74 rubocop-rails rubocop-github:0.13 +RUN gem install rubocop:0.74.0 rubocop-rails rubocop-github:0.13.0 + +# Need to fix the version as it installs 'rubocop:0.85.1' as a dep, and forces the default +# We then need to promot the correct verion, uninstall, and fix deps +RUN sh -c 'gem install --default rubocop:0.74.0; yes | gem uninstall rubocop:0.85.1 -a -x -I; gem install rubocop:0.74.0' ###################### # Install shellcheck #