codebuild 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"