codebuild 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (175) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +10 -2
  5. data/docs/.gitignore +4 -0
  6. data/docs/CNAME +1 -0
  7. data/docs/Gemfile +3 -0
  8. data/docs/LICENSE +21 -0
  9. data/docs/README.md +25 -0
  10. data/docs/_config.yml +73 -0
  11. data/docs/_docs/contributing.md +99 -0
  12. data/docs/_docs/conventions.md +51 -0
  13. data/docs/_docs/deploy.md +69 -0
  14. data/docs/_docs/dsl.md +12 -0
  15. data/docs/_docs/dsl/project.md +80 -0
  16. data/docs/{dsl → _docs/dsl}/role.md +39 -1
  17. data/docs/_docs/dsl/schedule.md +29 -0
  18. data/docs/_docs/examples.md +12 -0
  19. data/docs/_docs/examples/ecs.md +94 -0
  20. data/docs/_docs/examples/jets.md +68 -0
  21. data/docs/_docs/examples/ruby.md +44 -0
  22. data/docs/_docs/github_oauth.md +51 -0
  23. data/docs/_docs/install.md +14 -0
  24. data/docs/_docs/next-steps.md +16 -0
  25. data/docs/_docs/settings.md +34 -0
  26. data/docs/_docs/start.md +46 -0
  27. data/docs/_docs/type-option.md +72 -0
  28. data/docs/_docs/variables.md +90 -0
  29. data/docs/_includes/commands.html +86 -0
  30. data/docs/_includes/content.html +25 -0
  31. data/docs/_includes/edit-on-github.html +9 -0
  32. data/docs/_includes/footer.html +41 -0
  33. data/docs/_includes/google_analytics.html +10 -0
  34. data/docs/_includes/head.html +45 -0
  35. data/docs/_includes/js.html +18 -0
  36. data/docs/_includes/nav.html +17 -0
  37. data/docs/_includes/prev_next.md +19 -0
  38. data/docs/_includes/reference.md +1 -0
  39. data/docs/_includes/subnav.html +38 -0
  40. data/docs/_includes/tutorials.md +38 -0
  41. data/docs/_layouts/default.html +12 -0
  42. data/docs/_reference/codebuild-completion.md +44 -0
  43. data/docs/_reference/codebuild-completion_script.md +25 -0
  44. data/docs/_reference/codebuild-delete.md +26 -0
  45. data/docs/_reference/codebuild-deploy.md +58 -0
  46. data/docs/_reference/codebuild-init.md +87 -0
  47. data/docs/_reference/codebuild-start.md +43 -0
  48. data/docs/_reference/codebuild-version.md +21 -0
  49. data/docs/_sass/_bootstrap-overrides.scss +40 -0
  50. data/docs/_sass/_contact.scss +49 -0
  51. data/docs/_sass/_cta.scss +37 -0
  52. data/docs/_sass/_download.scss +31 -0
  53. data/docs/_sass/_features.scss +47 -0
  54. data/docs/_sass/_footer.scss +49 -0
  55. data/docs/_sass/_global.scss +102 -0
  56. data/docs/_sass/_main.scss +364 -0
  57. data/docs/_sass/_masthead.scss +70 -0
  58. data/docs/_sass/_mixins.scss +79 -0
  59. data/docs/_sass/_navbar.scss +92 -0
  60. data/docs/_sass/_syntax.scss +65 -0
  61. data/docs/_sass/_table.scss +34 -0
  62. data/docs/_sass/_timeline.scss +207 -0
  63. data/docs/_sass/_variables.scss +24 -0
  64. data/docs/bin/web +8 -0
  65. data/docs/docs.md +22 -0
  66. data/docs/favicon.ico +0 -0
  67. data/docs/img/docs/codebuild-output.png +0 -0
  68. data/docs/img/logos/boltops-logo-full.png +0 -0
  69. data/docs/img/logos/boltops-logo.png +0 -0
  70. data/docs/img/logos/project-logo.png +0 -0
  71. data/docs/index.html +35 -0
  72. data/docs/js/nav.js +39 -0
  73. data/docs/js/new-age.js +38 -0
  74. data/docs/js/new-age.min.js +6 -0
  75. data/docs/new-age.scss +20 -0
  76. data/docs/quick-start.md +72 -0
  77. data/docs/reference.md +12 -0
  78. data/docs/support.md +22 -0
  79. data/docs/vendor/bootstrap/css/bootstrap-grid.css +1339 -0
  80. data/docs/vendor/bootstrap/css/bootstrap-grid.css.map +1 -0
  81. data/docs/vendor/bootstrap/css/bootstrap-grid.min.css +1 -0
  82. data/docs/vendor/bootstrap/css/bootstrap-grid.min.css.map +1 -0
  83. data/docs/vendor/bootstrap/css/bootstrap-reboot.css +459 -0
  84. data/docs/vendor/bootstrap/css/bootstrap-reboot.css.map +1 -0
  85. data/docs/vendor/bootstrap/css/bootstrap-reboot.min.css +1 -0
  86. data/docs/vendor/bootstrap/css/bootstrap-reboot.min.css.map +1 -0
  87. data/docs/vendor/bootstrap/css/bootstrap.css +9320 -0
  88. data/docs/vendor/bootstrap/css/bootstrap.css.map +1 -0
  89. data/docs/vendor/bootstrap/css/bootstrap.min.css +6 -0
  90. data/docs/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
  91. data/docs/vendor/bootstrap/js/bootstrap.js +3535 -0
  92. data/docs/vendor/bootstrap/js/bootstrap.min.js +7 -0
  93. data/docs/vendor/font-awesome/css/font-awesome.css +2337 -0
  94. data/docs/vendor/font-awesome/css/font-awesome.min.css +4 -0
  95. data/docs/vendor/font-awesome/fonts/FontAwesome.otf +0 -0
  96. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  97. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.svg +2671 -0
  98. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  99. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  100. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  101. data/docs/vendor/font-awesome/less/animated.less +34 -0
  102. data/docs/vendor/font-awesome/less/bordered-pulled.less +25 -0
  103. data/docs/vendor/font-awesome/less/core.less +12 -0
  104. data/docs/vendor/font-awesome/less/fixed-width.less +6 -0
  105. data/docs/vendor/font-awesome/less/font-awesome.less +18 -0
  106. data/docs/vendor/font-awesome/less/icons.less +789 -0
  107. data/docs/vendor/font-awesome/less/larger.less +13 -0
  108. data/docs/vendor/font-awesome/less/list.less +19 -0
  109. data/docs/vendor/font-awesome/less/mixins.less +60 -0
  110. data/docs/vendor/font-awesome/less/path.less +15 -0
  111. data/docs/vendor/font-awesome/less/rotated-flipped.less +20 -0
  112. data/docs/vendor/font-awesome/less/screen-reader.less +5 -0
  113. data/docs/vendor/font-awesome/less/stacked.less +20 -0
  114. data/docs/vendor/font-awesome/less/variables.less +799 -0
  115. data/docs/vendor/font-awesome/scss/_animated.scss +34 -0
  116. data/docs/vendor/font-awesome/scss/_bordered-pulled.scss +25 -0
  117. data/docs/vendor/font-awesome/scss/_core.scss +12 -0
  118. data/docs/vendor/font-awesome/scss/_fixed-width.scss +6 -0
  119. data/docs/vendor/font-awesome/scss/_icons.scss +789 -0
  120. data/docs/vendor/font-awesome/scss/_larger.scss +13 -0
  121. data/docs/vendor/font-awesome/scss/_list.scss +19 -0
  122. data/docs/vendor/font-awesome/scss/_mixins.scss +60 -0
  123. data/docs/vendor/font-awesome/scss/_path.scss +15 -0
  124. data/docs/vendor/font-awesome/scss/_rotated-flipped.scss +20 -0
  125. data/docs/vendor/font-awesome/scss/_screen-reader.scss +5 -0
  126. data/docs/vendor/font-awesome/scss/_stacked.scss +20 -0
  127. data/docs/vendor/font-awesome/scss/_variables.scss +799 -0
  128. data/docs/vendor/font-awesome/scss/font-awesome.scss +18 -0
  129. data/docs/vendor/jquery-easing/jquery.easing.compatibility.js +59 -0
  130. data/docs/vendor/jquery-easing/jquery.easing.js +166 -0
  131. data/docs/vendor/jquery-easing/jquery.easing.min.js +1 -0
  132. data/docs/vendor/jquery/jquery.js +10253 -0
  133. data/docs/vendor/jquery/jquery.min.js +4 -0
  134. data/docs/vendor/simple-line-icons/css/simple-line-icons.css +778 -0
  135. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot +0 -0
  136. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.svg +200 -0
  137. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf +0 -0
  138. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff +0 -0
  139. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2 +0 -0
  140. data/docs/vendor/simple-line-icons/less/simple-line-icons.less +982 -0
  141. data/docs/vendor/simple-line-icons/scss/simple-line-icons.scss +979 -0
  142. data/docs/vendor/tether/tether.js +1811 -0
  143. data/docs/vendor/tether/tether.min.js +1 -0
  144. data/exe/cb +1 -1
  145. data/exe/codebuild +1 -1
  146. data/lib/codebuild.rb +0 -1
  147. data/lib/codebuild/aws_services/helpers.rb +1 -1
  148. data/lib/codebuild/cli.rb +2 -1
  149. data/lib/codebuild/core.rb +2 -2
  150. data/lib/codebuild/dsl/project.rb +3 -3
  151. data/lib/codebuild/help/init.md +38 -2
  152. data/lib/codebuild/help/start.md +7 -1
  153. data/lib/codebuild/init.rb +19 -9
  154. data/lib/codebuild/project.rb +3 -2
  155. data/lib/codebuild/role.rb +2 -0
  156. data/lib/codebuild/schedule.rb +5 -0
  157. data/lib/codebuild/setting.rb +2 -3
  158. data/lib/codebuild/stack.rb +25 -0
  159. data/lib/codebuild/start.rb +22 -3
  160. data/lib/codebuild/variables.rb +17 -0
  161. data/lib/codebuild/version.rb +1 -1
  162. data/lib/template/{.codebuild → project}/buildspec.yml +7 -7
  163. data/lib/template/{.codebuild → project}/project.rb.tt +8 -0
  164. data/lib/template/{.codebuild → project}/role.rb +0 -0
  165. data/lib/template/project/schedule.rb +3 -0
  166. data/lib/template/top/settings.yml +9 -0
  167. data/lib/template/top/variables/base.rb +1 -0
  168. data/lib/template/top/variables/development.rb +1 -0
  169. data/lib/template/top/variables/production.rb +1 -0
  170. metadata +150 -11
  171. data/docs/dsl/project.md +0 -46
  172. data/docs/dsl/schedule.md +0 -12
  173. data/docs/github_oauth.md +0 -39
  174. data/docs/type.md +0 -39
  175. data/lib/template/.codebuild/settings.yml +0 -13
@@ -0,0 +1 @@
1
+ !function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=t.getBoundingClientRect(),o={};for(var i in e)o[i]=e[i];if(t.ownerDocument!==document){var r=t.ownerDocument.defaultView.frameElement;if(r){var s=n(r);o.top+=s.top,o.bottom+=s.top,o.left+=s.left,o.right+=s.left}}return o}function r(t){var e=getComputedStyle(t)||{},o=e.position,i=[];if("fixed"===o)return[t];for(var n=t;(n=n.parentNode)&&n&&1===n.nodeType;){var r=void 0;try{r=getComputedStyle(n)}catch(s){}if("undefined"==typeof r||null===r)return i.push(n),i;var a=r,f=a.overflow,l=a.overflowX,h=a.overflowY;/(auto|scroll)/.test(f+h+l)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&i.push(n)}return i.push(t.ownerDocument.body),t.ownerDocument!==document&&i.push(t.ownerDocument.defaultView),i}function s(){A&&document.body.removeChild(A),A=null}function a(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i=n(t),r=P();return i.top-=r.top,i.left-=r.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function f(t){return t.offsetParent||document.documentElement}function l(){if(M)return M;var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");h(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return M={width:n,height:n}}function h(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function d(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=c(t).replace(o," ");g(t,i)}}function p(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{d(t,e);var o=c(t)+(" "+e);g(t,o)}}function u(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=c(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function c(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function g(t,e){t.setAttribute("class",e)}function m(t,e,o){o.forEach(function(o){e.indexOf(o)===-1&&u(t,o)&&d(t,o)}),e.forEach(function(e){u(t,e)||p(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function y(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function b(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function w(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;i<e;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function C(t,e){return"string"==typeof t.left&&t.left.indexOf("%")!==-1&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&t.top.indexOf("%")!==-1&&(t.top=parseFloat(t.top,10)/100*e.height),t}function O(t,e){return"scrollParent"===e?e=t.scrollParents[0]:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=e,o=a(e),i=o,n=getComputedStyle(e);if(e=[i.left,i.top,o.width+i.left,o.height+i.top],t.ownerDocument!==document){var r=t.ownerDocument.defaultView;e[0]+=r.pageXOffset,e[1]+=r.pageYOffset,e[2]+=r.pageXOffset,e[3]+=r.pageYOffset}G.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var E=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),x=void 0;"undefined"==typeof x&&(x={modules:[]});var A=null,T=function(){var t=0;return function(){return++t}}(),S={},P=function(){var t=A;t&&document.body.contains(t)||(t=document.createElement("div"),t.setAttribute("data-tether-id",T()),h(t.style,{top:0,left:0,position:"absolute"}),document.body.appendChild(t),A=t);var e=t.getAttribute("data-tether-id");return"undefined"==typeof S[e]&&(S[e]=n(t),k(function(){delete S[e]})),S[e]},M=null,W=[],k=function(t){W.push(t)},_=function(){for(var t=void 0;t=W.pop();)t()},B=function(){function t(){i(this,t)}return E(t,[{key:"on",value:function(t,e,o){var i=!(arguments.length<=3||void 0===arguments[3])&&arguments[3];"undefined"==typeof this.bindings&&(this.bindings={}),"undefined"==typeof this.bindings[t]&&(this.bindings[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})}},{key:"once",value:function(t,e,o){this.on(t,e,o,!0)}},{key:"off",value:function(t,e){if("undefined"!=typeof this.bindings&&"undefined"!=typeof this.bindings[t])if("undefined"==typeof e)delete this.bindings[t];else for(var o=0;o<this.bindings[t].length;)this.bindings[t][o].handler===e?this.bindings[t].splice(o,1):++o}},{key:"trigger",value:function(t){if("undefined"!=typeof this.bindings&&this.bindings[t]){for(var e=0,o=arguments.length,i=Array(o>1?o-1:0),n=1;n<o;n++)i[n-1]=arguments[n];for(;e<this.bindings[t].length;){var r=this.bindings[t][e],s=r.handler,a=r.ctx,f=r.once,l=a;"undefined"==typeof l&&(l=this),s.apply(l,i),f?this.bindings[t].splice(e,1):++e}}}}]),t}();x.Utils={getActualBoundingClientRect:n,getScrollParents:r,getBounds:a,getOffsetParent:f,extend:h,addClass:p,removeClass:d,hasClass:u,updateClasses:m,defer:k,flush:_,uniqueId:T,Evented:B,getScrollBarSize:l,removeUtilElements:s};var z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),j=function(t,e,o){for(var i=!0;i;){var n=t,r=e,s=o;i=!1,null===n&&(n=Function.prototype);var a=Object.getOwnPropertyDescriptor(n,r);if(void 0!==a){if("value"in a)return a.value;var f=a.get;if(void 0===f)return;return f.call(s)}var l=Object.getPrototypeOf(n);if(null===l)return;t=l,e=r,o=s,i=!0,a=l=void 0}};if("undefined"==typeof x)throw new Error("You must include the utils.js file before tether.js");var Y=x.Utils,r=Y.getScrollParents,a=Y.getBounds,f=Y.getOffsetParent,h=Y.extend,p=Y.addClass,d=Y.removeClass,m=Y.updateClasses,k=Y.defer,_=Y.flush,l=Y.getScrollBarSize,s=Y.removeUtilElements,L=function(){if("undefined"==typeof document)return"";for(var t=document.createElement("div"),e=["transform","WebkitTransform","OTransform","MozTransform","msTransform"],o=0;o<e.length;++o){var i=e[o];if(void 0!==t.style[i])return i}}(),D=[],X=function(){D.forEach(function(t){t.position(!1)}),_()};!function(){var t=null,e=null,o=null,i=function n(){return"undefined"!=typeof e&&e>16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&b()-t<10||(null!=o&&(clearTimeout(o),o=null),t=b(),X(),e=b()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var F={center:"center",left:"right",right:"left"},H={middle:"middle",top:"bottom",bottom:"top"},N={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},U=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=F[e.left]),"auto"===i&&(i=H[e.top]),{left:o,top:i}},V=function(t){var e=t.left,o=t.top;return"undefined"!=typeof N[t.left]&&(e=N[t.left]),"undefined"!=typeof N[t.top]&&(o=N[t.top]),{left:e,top:o}},R=function(t){var e=t.split(" "),o=z(e,2),i=o[0],n=o[1];return{top:i,left:n}},q=R,I=function(t){function e(t){var o=this;i(this,e),j(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),D.push(this),this.history=[],this.setOptions(t,!1),x.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return v(e,t),E(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]||arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=h(i,t);var n=this.options,s=n.element,a=n.target,f=n.targetModifier;if(this.element=s,this.target=a,this.targetModifier=f,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),p(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&p(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=q(this.options.targetAttachment),this.attachment=q(this.options.attachment),this.offset=R(this.options.offset),this.targetOffset=R(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=r(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return a(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=a(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.top<pageYOffset&&(e.top=pageYOffset),e.left<pageXOffset&&(e.left=pageXOffset),e}if("scroll-handle"===this.targetModifier){var t=void 0,o=this.target;o===document.body?(o=document.documentElement,t={left:pageXOffset,top:pageYOffset,height:innerHeight,width:innerWidth}):t=a(o);var i=getComputedStyle(o),n=o.scrollWidth>o.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,r=0;n&&(r=15);var s=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-r,e={width:15,height:.975*s*(s/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;s<408&&this.target===document.body&&(f=-11e-5*Math.pow(s,2)-.00727*s+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-s);return e.top=l*(s-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];this.options.addTargetClasses!==!1&&p(this.target,this.getClass("enabled")),p(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;d(this.target,this.getClass("enabled")),d(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),D.forEach(function(e,o){e===t&&D.splice(o,1)}),0===D.length&&s()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),k(function(){"undefined"!=typeof o._addAttachClasses&&(m(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&m(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];if(this.enabled){this.clearCache();var o=U(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return a(t.element)}),n=i.width,r=i.height;if(0===n&&0===r&&"undefined"!=typeof this.lastSize){var s=this.lastSize;n=s.width,r=s.height}else this.lastSize={width:n,height:r};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,p=C(V(this.attachment),{width:n,height:r}),u=C(V(o),d),c=C(this.offset,{width:n,height:r}),g=C(this.targetOffset,d);p=w(p,c),u=w(u,g);for(var m=h.left+u.left-p.left,v=h.top+u.top-p.top,y=0;y<x.modules.length;++y){var b=x.modules[y],O=b.position.call(this,{left:m,top:v,targetAttachment:o,targetPos:h,elementPos:i,offset:p,targetOffset:u,manualOffset:c,manualTargetOffset:g,scrollbarSize:S,attachment:this.attachment});if(O===!1)return!1;"undefined"!=typeof O&&"object"==typeof O&&(v=O.top,m=O.left)}var E={page:{top:v,left:m},viewport:{top:v-pageYOffset,bottom:pageYOffset-v-r+innerHeight,left:m-pageXOffset,right:pageXOffset-m-n+innerWidth}},A=this.target.ownerDocument,T=A.defaultView,S=void 0;return T.innerHeight>A.documentElement.clientHeight&&(S=this.cache("scrollbar-size",l),E.viewport.bottom-=S.height),T.innerWidth>A.documentElement.clientWidth&&(S=this.cache("scrollbar-size",l),E.viewport.right-=S.width),["","static"].indexOf(A.body.style.position)!==-1&&["","static"].indexOf(A.body.parentElement.style.position)!==-1||(E.page.bottom=A.body.scrollHeight-v-r,E.page.right=A.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return f(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return a(e)}),i=getComputedStyle(e),n=o,r={};if(["Top","Left","Bottom","Right"].forEach(function(t){r[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-n.width+r.right,o.bottom=A.body.scrollHeight-o.top-n.height+r.bottom,E.page.top>=o.top+r.top&&E.page.bottom>=o.bottom&&E.page.left>=o.left+r.left&&E.page.right>=o.right){var s=e.scrollTop,l=e.scrollLeft;E.offset={top:E.page.top-o.top+s-r.top,left:E.page.left-o.left+l-r.left}}}(),this.move(E),this.history.unshift(E),this.history.length>3&&this.history.pop(),e&&_(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,s=0;s<this.history.length;++s){var a=this.history[s];if("undefined"!=typeof a[i]&&!y(a[i][n],t[i][n])){r=!0;break}}r||(o[i][n]=!0)}}var l={top:"",left:"",right:"",bottom:""},d=function(t,o){var i="undefined"!=typeof e.options.optimizations,n=i?e.options.optimizations.gpu:null;if(n!==!1){var r=void 0,s=void 0;if(t.top?(l.top=0,r=o.top):(l.bottom=0,r=-o.bottom),t.left?(l.left=0,s=o.left):(l.right=0,s=-o.right),window.matchMedia){var a=window.matchMedia("only screen and (min-resolution: 1.3dppx)").matches||window.matchMedia("only screen and (-webkit-min-device-pixel-ratio: 1.3)").matches;a||(s=Math.round(s),r=Math.round(r))}l[L]="translateX("+s+"px) translateY("+r+"px)","msTransform"!==L&&(l[L]+=" translateZ(0)")}else t.top?l.top=o.top+"px":l.bottom=o.bottom+"px",t.left?l.left=o.left+"px":l.right=o.right+"px"},p=!1;if((o.page.top||o.page.bottom)&&(o.page.left||o.page.right)?(l.position="absolute",d(o.page,t.page)):(o.viewport.top||o.viewport.bottom)&&(o.viewport.left||o.viewport.right)?(l.position="fixed",d(o.viewport,t.viewport)):"undefined"!=typeof o.offset&&o.offset.top&&o.offset.left?!function(){l.position="absolute";var i=e.cache("target-offsetparent",function(){return f(e.target)});f(e.element)!==i&&k(function(){e.element.parentNode.removeChild(e.element),i.appendChild(e.element)}),d(o.offset,t.offset),p=!0}():(l.position="absolute",d({top:!0,left:!0},t.page)),!p)if(this.options.bodyElement)this.options.bodyElement.appendChild(this.element);else{for(var u=!0,c=this.element.parentNode;c&&1===c.nodeType&&"BODY"!==c.tagName;){if("static"!==getComputedStyle(c).position){u=!1;break}c=c.parentNode}u||(this.element.parentNode.removeChild(this.element),this.element.ownerDocument.body.appendChild(this.element))}var g={},m=!1;for(var n in l){var v=l[n],b=this.element.style[n];b!==v&&(m=!0,g[n]=v)}m&&k(function(){h(e.element.style,g),e.trigger("repositioned")})}}}]),e}(B);I.modules=[],x.position=X;var $=h(I,x),z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),Y=x.Utils,a=Y.getBounds,h=Y.extend,m=Y.updateClasses,k=Y.defer,G=["left","top","right","bottom"];x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var r=this.cache("element-bounds",function(){return a(e.element)}),s=r.height,f=r.width;if(0===f&&0===s&&"undefined"!=typeof this.lastSize){var l=this.lastSize;f=l.width,s=l.height}var d=this.cache("target-bounds",function(){return e.getTargetBounds()}),p=d.height,u=d.width,c=[this.getClass("pinned"),this.getClass("out-of-bounds")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&c.push(e),o&&c.push(o)}),c.forEach(function(t){["left","top","right","bottom"].forEach(function(e){c.push(t+"-"+e)})});var g=[],v=h({},n),y=h({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,a=t.attachment,l=t.pin;"undefined"==typeof a&&(a="");var h=void 0,d=void 0;if(a.indexOf(" ")>=0){var c=a.split(" "),m=z(c,2);d=m[0],h=m[1]}else h=d=a;var b=O(e,r);"target"!==d&&"both"!==d||(o<b[1]&&"top"===v.top&&(o+=p,v.top="bottom"),o+s>b[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&o<b[1]?(o+=p,v.top="bottom",o+=s,y.top="top"):"top"===y.top&&o+s>b[3]&&o-(s-p)>=b[1]&&(o-=s-p,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+s>b[3]?(o-=p,v.top="top",o-=s,y.top="bottom"):"bottom"===y.top&&o<b[1]&&o+(2*s-p)<=b[3]&&(o+=s-p,v.top="top",y.top="top")),"middle"===v.top&&(o+s>b[3]&&"top"===y.top?(o-=s,y.top="bottom"):o<b[1]&&"bottom"===y.top&&(o+=s,y.top="top"))),"target"!==h&&"both"!==h||(i<b[0]&&"left"===v.left&&(i+=u,v.left="right"),i+f>b[2]&&"right"===v.left&&(i-=u,v.left="left")),"together"===h&&(i<b[0]&&"left"===v.left?"right"===y.left?(i+=u,v.left="right",i+=f,y.left="left"):"left"===y.left&&(i+=u,v.left="right",i-=f,y.left="right"):i+f>b[2]&&"right"===v.left?"left"===y.left?(i-=u,v.left="left",i-=f,y.left="right"):"right"===y.left&&(i-=u,v.left="left",i+=f,y.left="left"):"center"===v.left&&(i+f>b[2]&&"left"===y.left?(i-=f,y.left="right"):i<b[0]&&"right"===y.left&&(i+=f,y.left="left"))),"element"!==d&&"both"!==d||(o<b[1]&&"bottom"===y.top&&(o+=s,y.top="top"),o+s>b[3]&&"top"===y.top&&(o-=s,y.top="bottom")),"element"!==h&&"both"!==h||(i<b[0]&&("right"===y.left?(i+=f,y.left="left"):"center"===y.left&&(i+=f/2,y.left="left")),i+f>b[2]&&("left"===y.left?(i-=f,y.left="right"):"center"===y.left&&(i-=f/2,y.left="right"))),"string"==typeof l?l=l.split(",").map(function(t){return t.trim()}):l===!0&&(l=["top","left","right","bottom"]),l=l||[];var w=[],C=[];o<b[1]&&(l.indexOf("top")>=0?(o=b[1],w.push("top")):C.push("top")),o+s>b[3]&&(l.indexOf("bottom")>=0?(o=b[3]-s,w.push("bottom")):C.push("bottom")),i<b[0]&&(l.indexOf("left")>=0?(i=b[0],w.push("left")):C.push("left")),i+f>b[2]&&(l.indexOf("right")>=0?(i=b[2]-f,w.push("right")):C.push("right")),w.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),g.push(t),w.forEach(function(e){g.push(t+"-"+e)})}(),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),g.push(t),C.forEach(function(e){g.push(t+"-"+e)})}(),(w.indexOf("left")>=0||w.indexOf("right")>=0)&&(y.left=v.left=!1),(w.indexOf("top")>=0||w.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===n.top&&v.left===n.left&&y.top===e.attachment.top&&y.left===e.attachment.left||(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,g,c),m(e.element,g,c)}),{top:o,left:i}}});var Y=x.Utils,a=Y.getBounds,m=Y.updateClasses,k=Y.defer;x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return a(e.element)}),r=n.height,s=n.width,f=this.getTargetBounds(),l=o+r,h=i+s,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==h||d.push(t)}),i<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==l||d.push(t)});var p=[],u=[],c=["left","top","right","bottom"];return p.push(this.getClass("abutted")),c.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),d.length&&u.push(this.getClass("abutted")),d.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,u,p),m(e.element,u,p)}),!0}});var z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return x.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=z(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),$});
data/exe/cb CHANGED
@@ -3,7 +3,7 @@
3
3
  # Trap ^C
4
4
  Signal.trap("INT") {
5
5
  puts "\nCtrl-C detected. Exiting..."
6
- sleep 1
6
+ sleep 0.1
7
7
  exit
8
8
  }
9
9
 
@@ -3,7 +3,7 @@
3
3
  # Trap ^C
4
4
  Signal.trap("INT") {
5
5
  puts "\nCtrl-C detected. Exiting..."
6
- sleep 1
6
+ sleep 0.1
7
7
  exit
8
8
  }
9
9
 
@@ -19,5 +19,4 @@ module Codebuild
19
19
  extend Core
20
20
  end
21
21
 
22
-
23
22
  Codebuild.set_aws_profile!
@@ -43,7 +43,7 @@ module Codebuild::AwsServices
43
43
  # myapp-ci-deploy-development-2
44
44
  #
45
45
  def inferred_stack_name(project_name)
46
- items = [project_name, "cb", @options[:type], Codebuild.env_extra]
46
+ items = [project_name, @options[:type], Codebuild.env_extra, "cb"]
47
47
  items.insert(3, Codebuild.env) if Codebuild.settings.dig(:stack_naming, :append_env)
48
48
  items.reject(&:blank?).compact.join("-")
49
49
  end
@@ -8,7 +8,7 @@ module Codebuild
8
8
  Init.cli_options.each do |args|
9
9
  option(*args)
10
10
  end
11
- register(Init, "init", "init", "Set up initial ufo files.")
11
+ register(Init, "init", "init", "Set up initial .codebuild files.")
12
12
 
13
13
  common_options = Proc.new do
14
14
  option :type, desc: "folder to use within .codebuild folder for different build types"
@@ -35,6 +35,7 @@ module Codebuild
35
35
  long_desc Help.text(:start)
36
36
  option :source_version, default: "master", desc: "git branch"
37
37
  option :branch, aliases: "b", default: "master", desc: "git branch"
38
+ option :env_vars, type: :array, desc: "env var overrides. IE: KEY1=VALUE1 KEY2=VALUE2"
38
39
  common_options.call
39
40
  def start(project_name=nil)
40
41
  Start.new(options.merge(project_name: project_name)).run
@@ -45,9 +45,9 @@ module Codebuild
45
45
  memoize :settings
46
46
 
47
47
  def check_codebuild_project!
48
- check_path = "#{Codebuild.root}/.codebuild/settings.yml"
48
+ check_path = "#{Codebuild.root}/.codebuild"
49
49
  unless File.exist?(check_path)
50
- puts "ERROR: No settings file at #{check_path}. Are you sure you are in a project with codebuild setup?".color(:red)
50
+ puts "ERROR: No .codebuild folder found. Are you sure you are in a project with codebuild setup?".color(:red)
51
51
  puts "Current directory: #{Dir.pwd}"
52
52
  puts "If you want to set up codebuild for this prjoect, please create a settings file via: codebuild init"
53
53
  exit 1 unless ENV['TEST']
@@ -83,9 +83,9 @@ module Codebuild::Dsl
83
83
  end
84
84
 
85
85
  def environment_variables(vars)
86
- @env_vars = vars
87
- @mapped_env_vars = @env_vars.map { |k,v|
88
- k = k.to_s
86
+ # Storing @mapped_env_vars as instance variable for later usage in linux_environment
87
+ @mapped_env_vars = vars.map { |k,v|
88
+ k, v = k.to_s, v.to_s
89
89
  if v =~ /^ssm:/
90
90
  { type: "PARAMETER_STORE", name: k, value: v.sub('ssm:','') }
91
91
  else
@@ -1,7 +1,43 @@
1
1
  ## Examples
2
2
 
3
3
  cb init # infers the name from the parent folder
4
- cb init --name demo-codebuild-project # set the name
4
+ cb init my-project # set the name
5
+
6
+ ## Type Option
7
+
8
+ The type option is useful to generate subfolder under .codebuild that contain another codebuild project. Example:
9
+
10
+ cb init --type unit
11
+
12
+ Thi generates the cb files under the `.codebuild/unit` folder.
13
+
14
+ .codebuild
15
+ └── unit
16
+ ├── buildspec.yml
17
+ ├── project.rb
18
+ ├── role.rb
19
+ └── schedule.rb
20
+
21
+ To tell the codebuild tool to use these files, you specify the `--type` option as a part of the other commands. Examples:
22
+
23
+ cb deploy --type unit
24
+ cb start --type unit
25
+
26
+ ## Structure
27
+
28
+ So if you need multiple CodeBuild projects that perform different tasks but are both related to the same code repo, you might have a structure like this:
29
+
30
+ .codebuild
31
+ ├── deploy
32
+ │ ├── buildspec.yml
33
+ │ ├── project.rb
34
+ │ ├── role.rb
35
+ │ └── schedule.rb
36
+ └── unit
37
+ ├── buildspec.yml
38
+ ├── project.rb
39
+ ├── role.rb
40
+ └── schedule.rb
5
41
 
6
42
  ## Custom Templates
7
43
 
@@ -11,7 +47,7 @@ If you would like the `cb init` command to use your own custom templates, you ca
11
47
 
12
48
  This will clone the repo on GitHub into the `~/.codebuild/templates/tongueroo/codebuild-custom-template` and use that as an additional template source. The default `--template-mode=additive` mode means that if there's a file in `tongueroo/codebuild-custom-template` that exists it will use that in place of the default template files.
13
49
 
14
- If you do not want to use any of the original default template files within the ufo gem at all, you can use the `--template-mode=replace` mode. Replace mode will only use templates from the provided `--template` option. Example:
50
+ If you do not want to use any of the original default template files within the codebuild gem at all, you can use the `--template-mode=replace` mode. Replace mode will only use templates from the provided `--template` option. Example:
15
51
 
16
52
  cb init --template=tongueroo/codebuild-custom-template --template-mode=replace
17
53
 
@@ -1,6 +1,12 @@
1
- ## Examples
1
+ # Examples
2
2
 
3
3
  cb start # infers the name from the parent folder
4
4
  cb start stack-name # looks up project via CloudFormation stack
5
5
  cb start demo-project # looks up project via codebuild project name
6
6
 
7
+ ## Overriding Env Variables at Runtime
8
+
9
+ You can override env variables at runtime with `--env-vars`. Examples:
10
+
11
+ cb start --type vpc --env-vars K1=v1 K2=v2
12
+ cb start --type vpc --env-vars K1=v1 K2=ssm:v2 # support for PARAMETER_STORE
@@ -3,10 +3,12 @@ module Codebuild
3
3
  # Ugly, this is how I can get the options from to match with this Thor::Group
4
4
  def self.cli_options
5
5
  [
6
- [:name, desc: "CodeBuild project name."],
7
- [:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files."],
8
- [:template, desc: "Custom template to use."],
9
- [:template_mode, desc: "Template mode: replace or additive."],
6
+ [:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
7
+ [:name, desc: "CodeBuild project name"],
8
+ [:template, desc: "Custom template to use"],
9
+ [:template_mode, desc: "Template mode: replace or additive"],
10
+ [:type, desc: "Type option creates a subfolder under .codebuild"],
11
+ [:variables, type: :boolean, default: true, desc: "Create variables starter files"],
10
12
  ]
11
13
  end
12
14
  cli_options.each { |o| class_option(*o) }
@@ -26,17 +28,25 @@ module Codebuild
26
28
  override_source_paths(custom_template)
27
29
  else # additive: modify on top of default template
28
30
  default_template = File.expand_path("../../template", __FILE__)
31
+ puts "default_template: #{default_template}"
29
32
  override_source_paths([custom_template, default_template])
30
33
  end
31
34
  end
32
35
 
36
+ def copy_top_level
37
+ puts "Initialize codebuild top-level folder"
38
+ dest = ".codebuild"
39
+ excludes = %w[.git]
40
+ excludes << %w[variables] unless @options[:variables]
41
+ pattern = Regexp.new(excludes.join('|'))
42
+ directory "top", dest, exclude_pattern: pattern
43
+ end
44
+
33
45
  def copy_project
34
46
  puts "Initialize codebuild project in .codebuild"
35
- if @options[:template]
36
- directory ".", ".codebuild", exclude_pattern: /.git/
37
- else
38
- directory ".", exclude_pattern: /.git/
39
- end
47
+ dest = ".codebuild"
48
+ dest = "#{dest}/#{@options[:type]}" if @options[:type]
49
+ directory "project", dest, exclude_pattern: /.git/
40
50
  end
41
51
 
42
52
  private
@@ -4,6 +4,7 @@ module Codebuild
4
4
  class Project
5
5
  include Dsl::Project
6
6
  include Evaluate
7
+ include Variables
7
8
 
8
9
  attr_reader :project_name, :full_project_name, :project_path
9
10
  def initialize(options={})
@@ -11,8 +12,7 @@ module Codebuild
11
12
  @project_name = options[:project_name]
12
13
  @full_project_name = options[:full_project_name] # includes -development at the end
13
14
  @project_path = options[:project_path] || get_project_path
14
- # These defaults make it the project.rb simpler
15
- @properties = default_properties
15
+ @properties = default_properties # defaults make project.rb simpler
16
16
  end
17
17
 
18
18
  def exist?
@@ -20,6 +20,7 @@ module Codebuild
20
20
  end
21
21
 
22
22
  def run
23
+ load_variables
23
24
  evaluate(@project_path)
24
25
  resource = {
25
26
  code_build: {
@@ -4,6 +4,7 @@ module Codebuild
4
4
  class Role
5
5
  include Codebuild::Dsl::Role
6
6
  include Evaluate
7
+ include Variables
7
8
 
8
9
  def initialize(options={})
9
10
  @options = options
@@ -13,6 +14,7 @@ module Codebuild
13
14
  end
14
15
 
15
16
  def run
17
+ load_variables
16
18
  evaluate(@role_path) if File.exist?(@role_path)
17
19
  @properties[:policies] = [{
18
20
  policy_name: "CodeBuildAccess",
@@ -2,6 +2,7 @@ module Codebuild
2
2
  class Schedule
3
3
  include Codebuild::Dsl::Schedule
4
4
  include Evaluate
5
+ include Variables
5
6
 
6
7
  def initialize(options={})
7
8
  @options = options
@@ -13,9 +14,13 @@ module Codebuild
13
14
  def run
14
15
  return unless File.exist?(@schedule_path)
15
16
 
17
+ old_properties = @properties.clone
18
+ load_variables
16
19
  evaluate(@schedule_path)
20
+
17
21
  @properties[:schedule_expression] = @schedule_expression if @schedule_expression
18
22
  set_rule_event! if @rule_event_props
23
+ return if old_properties == @properties # empty schedule.rb file
19
24
 
20
25
  resource = {
21
26
  events_rule: {
@@ -11,9 +11,8 @@ module Codebuild
11
11
  # data contains the settings.yml config. The order or precedence for settings
12
12
  # is the project ufo/settings.yml and then the ~/.codebuild/settings.yml.
13
13
  def data
14
- if @check_codebuild_project && !File.exist?(project_settings_path)
15
- Codebuild.check_codebuild_project!
16
- end
14
+ Codebuild.check_codebuild_project! if @check_codebuild_project
15
+ return {} unless File.exist?(project_settings_path)
17
16
 
18
17
  # project based settings files
19
18
  project = load_file(project_settings_path)
@@ -45,6 +45,15 @@ module Codebuild
45
45
  return if @options[:noop]
46
46
  puts "Deploying stack #{@stack_name.color(:green)} with CodeBuild project #{@full_project_name.color(:green)}"
47
47
 
48
+ @stack = find_stack(@stack_name)
49
+ if @stack && rollback_complete?(@stack)
50
+ puts "Existing stack in ROLLBACK_COMPLETE state. Deleting stack before continuing."
51
+ cfn.delete_stack(stack_name: @stack_name)
52
+ status.wait
53
+ status.reset
54
+ @stack = nil # at this point stack has been deleted
55
+ end
56
+
48
57
  begin
49
58
  perform
50
59
  url_info
@@ -73,5 +82,21 @@ module Codebuild
73
82
  def status
74
83
  @status ||= Cfn::Status.new(@stack_name)
75
84
  end
85
+
86
+ def rollback_complete?(stack)
87
+ stack.stack_status == 'ROLLBACK_COMPLETE'
88
+ end
89
+
90
+ def find_stack(stack_name)
91
+ resp = cfn.describe_stacks(stack_name: stack_name)
92
+ resp.stacks.first
93
+ rescue Aws::CloudFormation::Errors::ValidationError => e
94
+ # example: Stack with id demo-web does not exist
95
+ if e.message =~ /Stack with/ && e.message =~ /does not exist/
96
+ nil
97
+ else
98
+ raise
99
+ end
100
+ end
76
101
  end
77
102
  end
@@ -10,16 +10,35 @@ module Codebuild
10
10
 
11
11
  def run
12
12
  source_version = @options[:branch] || @options[:source_version] || 'master'
13
- resp = codebuild.start_build(
13
+ params = {
14
14
  project_name: project_name,
15
15
  source_version: source_version
16
- )
16
+ }
17
+ params[:environment_variables_override] = environment_variables_override if @options[:env_vars]
18
+ resp = codebuild.start_build(params)
17
19
  puts "Build started for project: #{project_name}"
18
20
  puts "Please check the CodeBuild console for the status."
19
21
  puts "Codebuild Log Url:"
20
22
  puts codebuild_log_url(resp.build.id)
21
23
  end
22
24
 
25
+ def environment_variables_override
26
+ @options[:env_vars].map do |s|
27
+ k, v = s.split('=')
28
+ ssm = false
29
+ if /^ssm:(.*)/.match(v)
30
+ v = $1
31
+ ssm = true
32
+ end
33
+
34
+ {
35
+ name: k,
36
+ value: v,
37
+ type: ssm ? "PARAMETER_STORE" : "PLAINTEXT"
38
+ }
39
+ end
40
+ end
41
+
23
42
  def project_name
24
43
  if project_exists?(@full_project_name)
25
44
  @full_project_name
@@ -30,7 +49,7 @@ module Codebuild
30
49
  end
31
50
  resource.physical_resource_id # codebuild project name
32
51
  else
33
- puts "ERROR: Unable to find the codebuild project with identifier #@identifier".color(:red)
52
+ puts "ERROR: Unable to find the codebuild project with either full_project_name: #{@full_project_name} or project_name: #{@project_name}".color(:red)
34
53
  exit 1
35
54
  end
36
55
  end
@@ -0,0 +1,17 @@
1
+ module Codebuild
2
+ module Variables
3
+ def load_variables
4
+ load_variables_file("base")
5
+ load_variables_file(Codebuild.env)
6
+ # Then load type scope variables, so they take higher precedence
7
+ load_variables_file("base", @options[:type])
8
+ load_variables_file(Codebuild.env, @options[:type])
9
+ end
10
+
11
+ def load_variables_file(filename, type=nil)
12
+ items = ["#{Codebuild.root}/.codebuild", type, "variables/#{filename}.rb"].compact
13
+ path = items.join('/')
14
+ instance_eval(IO.read(path), path) if File.exist?(path)
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module Codebuild
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -6,13 +6,13 @@ version: 0.2
6
6
  phases:
7
7
  install:
8
8
  commands:
9
- - uname -a
10
- - pwd
11
- - ls
12
- - env | sort
13
- - ls /etc/*release*
14
- - cat /etc/*release*
15
- - whoami
9
+ # - uname -a
10
+ # - pwd
11
+ # - ls
12
+ # - env | sort
13
+ # - ls /etc/*release*
14
+ # - cat /etc/*release*
15
+ # - whoami
16
16
  # - bundle
17
17
  build:
18
18
  commands:
@@ -16,6 +16,14 @@ environment_variables(
16
16
  # Uncomment to enable github webhook, the GitHub oauth token needs admin:repo_hook permissions
17
17
  # Refer to https://github.com/tongueroo/codebuild/blob/master/readme/github_oauth.md
18
18
  # triggers(webhook: true)
19
+ # Another example:
20
+ # Docs: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projecttriggers.html
21
+ # {type: "EVENT", pattern: "PUSH"} is required
22
+ # Also, note the extra brackets: [[]] is actually the proper format. I know weird.
23
+ # triggers(
24
+ # webhook: true,
25
+ # filter_groups: [[{type: "HEAD_REF", pattern: "my-branch"}, {type: "EVENT", pattern: "PUSH"}]]
26
+ # )
19
27
 
20
28
  # Shorthand to enable all local cache modes
21
29
  # local_cache(true)
@@ -0,0 +1,3 @@
1
+ # rate "1 day"
2
+ # or
3
+ # cron("0 10 * * ? *") # Run at 10:00 am (UTC) every day
@@ -0,0 +1,9 @@
1
+ base:
2
+ # stack_naming:
3
+ # append_env: true # default false
4
+
5
+ development:
6
+ # aws_profile: dev_profile
7
+
8
+ production:
9
+ # aws_profile: prod_profile
@@ -0,0 +1 @@
1
+ @myvar = "base-value"
@@ -0,0 +1 @@
1
+ @myvar = "development-value"