Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Er du moden for å levere kontinuerlig?

1,079 views

Published on

Kontinuerlige Leveranser og Devops praktiseres av svært mange skal man tro buzzen. Ved hjelp av nye verktøy og prosesser dytter virksomheter idéer ut til sine kunder før andre er ferdige med sin første iterasjon. Det er kunden som bestemmer når noe skal ut i produksjon, ikke IT. Og dette får de til uten å kompromisse på kvalitet. Hvem kunne ikke tenke seg å ha det sånn? Hvordan får de det til?

Vår erfaring er at det er lite hensiktsmessig, og til en viss grad svært farlig, å forsøke å få til dette i ett jafs. En mer fornuftig tilnærmingsmåte er å bygge stein for stein basert på tilstanden man befinner seg i, og gradvis forbedre situasjonen. Vi har laget en modenhetsmodell for kontinuerlige leveranser som inneholder teknikker og verktøy som bringer en nærmere målet, og det fine med å være på denne "reisen" er at hvert steg gir stor verdi i seg selv. I foredraget vil vi presentere noen erfaringer på godt og vondt med å implementere steg i modellen.

Vi vil starte med å presentere modenhetsmodellen, for deretter å ta for oss noen av teknikkene vi har hatt erfaringer med. Disse er; effektiv bruk av versjonskontroll, branch by abstraction, feature toggles, deployment pipelines med Jenkins, infrastruktur som kode med Puppet, virtualisering av produksjonslike miljøer for utvikling og test (Virtualbox, Vagrant), one-click deploy (og tilbakerulling), nedetidfri produksjonssetting og håndtering av databasemigrering (og tilbakerulling).

Published in: Technology
  • Be the first to comment

Er du moden for å levere kontinuerlig?

  1. 1. ER DU MODEN FOR Å LEVERE KONTINUERLIG? JavaZone 2012 Sveinung Dalatun og Stein Inge Morisbak 13/09/12
  2. 2. IF YOU ARE WONDERING “WHAT COMES AFTER AGILE?,”YOU SHOULD LOOK TOWARDS CONTINUOUS DELIVERY.
  3. 3. Vår høyeste prioritet er å tilfredsstille kundengjennom tidlige og kontinuerlige leveranser av programvare som har verdi.
  4. 4. Lever fungerende programvare hyppig,med et par ukers til et par måneders mellomrom. Jo oftere, desto bedre.
  5. 5. Lever fungerende programvare hyppig,med et par ukers til et par måneders mellomrom. Jo oftere, desto bedre.
  6. 6. Continuous delivery is about putting the release schedule in the hands of the business, not in the hands of IT. Implementing continuous delivery means making sure your software isalways production ready throughout its entire lifecycle – that any build could potentially be released to users at the touch of a button using a fully automated process in a matter of seconds or minutes. - Jez Humble (http://continuousdelivery.com/)
  7. 7. Fungerende programvare er det primære målet på fremdrift.
  8. 8. KLAR UTVIKLING FERDIG!
  9. 9. KLAR UTVIKLING FERDIG!
  10. 10. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  11. 11. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  12. 12. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  13. 13. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  14. 14. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  15. 15. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  16. 16. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  17. 17. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  18. 18. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  19. 19. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  20. 20. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  21. 21. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  22. 22. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  23. 23. Build/deployment pipeline Selvorganisert team Kontinuerlig integrasjon Pull-basert prosess CI-server Agile 101 Manuelle rutiner Silo-organisasjon“Løs” arkitektur Infrastruktur som kodeEnkel teknologi Kontroll på applikasjonskonfigurasjonBest-of-breed Kontroll på avhengigheter“Enterprise” infrastruktur Manuell konfigurasjon “All” testing automatisert One-click deploy Automatiserte funksjonelle tester Automatisert deploy Automatiserte tekniske tester Repeterbar deploy Manuelle tester Manuell deploy
  24. 24. "All" testing automatisert Automatiserte funksjonelle testerAutomatiserte tekniske tester
  25. 25. Teknologirettet
  26. 26. ForretningsrettetTeknologirettet
  27. 27. Forretningsrettet ng ikli utv tte rStø Teknologirettet
  28. 28. Stø tte r utv ikli ngTeknologirettet Forretningsrettet Kri tise rer p rod u kte t
  29. 29. Stø tte r utv ikli ngTeknologirettet Forretningsrettet Kri tise rer p rod u kte t
  30. 30. Forretningsrettet t kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Teknologirettet
  31. 31. Forretningsrettet t kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Integrasjonstester Teknologirettet
  32. 32. Forretningsrettet t kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Integrasjonstester Infrastrukturtester Teknologirettet
  33. 33. Forretningsrettet Funksjonelle akseptansetester t kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Integrasjonstester Infrastrukturtester Teknologirettet
  34. 34. Feature: TeamworkIn order to work effectivelyAs a team memberI want good communication
  35. 35. GivenWhen AkseptansekriterierThen
  36. 36. GivenWhen AkseptansekriterierThen Given /I have done x/ do Akseptansetester end
  37. 37. GivenWhen AkseptansekriterierThen Given /I have done x/ do Akseptansetester end Kode
  38. 38. Forretningsrettet Funksjonelle akseptansetester t kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Integrasjonstester Infrastrukturtester Teknologirettet
  39. 39. Forretningsrettet Funksjonelle akseptansetester Brukbarhetstesting t kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Integrasjonstester Infrastrukturtester Teknologirettet
  40. 40. Forretningsrettet Funksjonelle Showcasing akseptansetester Brukbarhetstesting t kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Integrasjonstester Infrastrukturtester Teknologirettet
  41. 41. Forretningsrettet Funksjonelle Showcasing akseptansetester Brukbarhetstesting t Exploratory testing kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Integrasjonstester Infrastrukturtester Teknologirettet
  42. 42. Forretningsrettet Funksjonelle Showcasing akseptansetester Brukbarhetstesting t Exploratory testing kte ng u ikli rod utv p rer tte r Unittester tiseStø Kri Integrasjonstester Infrastrukturtester Teknologirettet
  43. 43. Forretningsrettet Funksjonelle Showcasing akseptansetester Brukbarhetstesting t Exploratory testing kte ng u ikli rod utv p rer tte r Unittester tiseStø Ytelsestester Kri Integrasjonstester Infrastrukturtester Teknologirettet
  44. 44. Forretningsrettet Funksjonelle Showcasing akseptansetester Brukbarhetstesting t Exploratory testing kte ng u ikli rod utv p rer tte r Unittester tiseStø Ytelsestester Kri Integrasjonstester Infrastrukturtester Sikkerhetstester Teknologirettet
  45. 45. Kontinuerlig integrasjonBuild/deployment pipeline
  46. 46. <% if (feature.isActive()) { %> <jsp:include page="featureX.jsp" /><% } %>
  47. 47. “Løs” arkitektur
  48. 48. kode som ktur a struInfr
  49. 49. FINN 5 FEIL UTVIKLING TEST QA PROD
  50. 50. REFACTORING
  51. 51. REFACTORING
  52. 52. SLAVEMASTER SLAVE SLAVE
  53. 53. http://puppetlabs.com/
  54. 54. Imperativt for Debian: apt-get install vim echo "set nocp" > /etc/vim/vimrcImperativt for Redhat: yum install vim echo "set nocp" > /etc/vim/vimrc
  55. 55. Imperativt for Debian: Deklarativt uavhengig av OS: apt-get install vim package { "vim": echo "set nocp" > /etc/vim/vimrc ensure => present, }Imperativt for Redhat: file { "/etc/vim/vimrc": content => "set nocp", } yum install vim echo "set nocp" > /etc/vim/vimrc
  56. 56. user { elvis: home => /home/elvis/, uid => 501, gid => 501, shell => /bin/bash, ensure => present, password => hemmelig,}
  57. 57. /puppet/modules/apache/manifests/init.pp class apache { package { httpd: ensure => present, } service { httpd: ensure => running, require => Package[httpd], } }
  58. 58. /puppet/modules/apache/manifests/init.pp class apache { package { httpd: ensure => present, } service { httpd: /puppet/modules/apache/manifests/ssl.pp ensure => running, require => Package[httpd], } class apache::ssl inherits apache { package { mod_ssl: } ensure => present, } service[apache] { require => Package[mod_ssl], } }
  59. 59. forgehttps://github.com/puppetlabs/puppet http://forge.puppetlabs.com/
  60. 60. http://vagrantup.com/
  61. 61. UTVIKLER 1 UTVIKLER 2 UTVIKLER 3 PROD
  62. 62. UTVIKLER 1 UTVIKLER 2 UTVIKLER 3 PROD
  63. 63. UTVIKLER 1 UTVIKLER 2 UTVIKLER 3 PROD
  64. 64. UTVIKLER 1 UTVIKLER 2 UTVIKLER 3 PROD
  65. 65. Vagrant::Config.run do |config|  config.vm.define :app do |app|    app.vm.box_url = "https://open.bekk.no/debian.box" app.vm.share_folder "/home/elvis/dev", "~/dev" app.vm.provision :puppet do |puppet|     puppet.manifest_file = "app.pp" end  end  config.vm.define :db do |db| db.vm.box_url = "https://open.bekk.no/centos.box" db.vm.provision :puppet do |puppet|     puppet.manifest_file = "app.pp" end  endend
  66. 66. PULL ELLER PUSH?
  67. 67. master pull pull pullslave 1 slave 2 slave 3
  68. 68. master deploy host #! push pull pull pull app appslave 1 slave 2 slave 3 appserver 1 appserver 2 db-server
  69. 69. #!/bin/bash# Usage: deploy.sh <artifact> <version>artifact=$1version=$2wget https://nexus.bekk.no/${artifact}/${version}/${artifact}-${version}.zipunzip ${artifact}.zip/etc/init.d/${artifact} stoprm ${artifact} # softlinkln -s ${artifact}-${version} ${artifact}/etc/init.d/${artifact} start
  70. 70. #!/bin/bash# Usage: rollback.sh <artifact> <version>artifact=$1version=$2/etc/init.d/${artifact} stoprm ${artifact} # softlinkln -s ${artifact}-${version} ${artifact}/etc/init.d/${artifact} start
  71. 71. #!/bin/bash######################################### The script checks if a server is down# Sends an e-mail if they are.# Install it as a cron-job.app=webappapp=/server/bekkopen/$apphostname=`hostname`pid=`ps -ea -o "pid ppid args" | grep -v grep | grep $app | sed -e s/^ *// -e s/ .*// | head -1`if [ ! $pid ]; then echo "$app on $hostname is down." | mail -s "$app on $hostname is down" stein.inge.morisbak@BEKK.nofi
  72. 72. One-click deploy Automatisert deploy
  73. 73. En ke l te kn olo gi
  74. 74. public class MySessionHandler extends SessionHandler { public MySessionHandler(final Server server, final DataSource dataSource) { super(); setSessionManager(new MyJDBCSessionManager(server, dataSource)); }}public class MyJDBCSessionIdManager extends JDBCSessionIdManager implements SessionIdManager { public MyJDBCSessionIdManager(final Server server, final DataSource ds) { super(server); setDatasource(ds); }}
  75. 75. BIG-IP LASTBALANSERERNODE 1 /online NODE 2 /online NODE 3 /online
  76. 76. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  77. 77. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  78. 78. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /online NODE 3 /online> ./deploy.sh web-app 1.2
  79. 79. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  80. 80. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  81. 81. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  82. 82. @Componentpublic class EmbeddedJettyServer extends Server { public void start(final WebAppContext webappContext) throws Exception { final HandlerCollection handlers = new HandlerCollection(); handlers.addHandler(new ContextHandlerCollection()); handlers.addHandler(webappContext); setHandler(handlers); start(); }}
  83. 83. @Componentpublic class EmbeddedJettyServer extends Server { public void start(final WebAppContext webappContext) throws Exception { final HandlerCollection handlers = new HandlerCollection(); handlers.addHandler(new ContextHandlerCollection()); handlers.addHandler(webappContext); setHandler(handlers); start(); }}public class WebServerMain { public static void main(final String[] args) throws Exception { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("webAppContext.xml"); EmbeddedJettyServer server = ctx.getBean(EmbeddedJettyServer.class); String url = WebServerMain.class.getResource("/webapp").toExternalForm(); server.start(new WebAppContext(url, "/")); }}
  84. 84. @Autowiredpublic WebServerConfiguration(final ConfigurableApplicationContext ctx, final LoginFilter loginFilter, final MyWebContextListener webContextListener, final HealthCheckServlet healthCheckServlet) { this.ctx = ctx; this.loginFilter = loginFilter; this.webContextListener = webContextListener; this.healthCheckServlet = healthCheckServlet;}
  85. 85. @Autowiredpublic WebServerConfiguration(final ConfigurableApplicationContext ctx, final LoginFilter loginFilter, final MyWebContextListener webContextListener, final HealthCheckServlet healthCheckServlet) { this.ctx = ctx; this.loginFilter = loginFilter; this.webContextListener = webContextListener; this.healthCheckServlet = healthCheckServlet;}ctx.getServletHandler().addFilter("LoginFilter", loginFilter); // add filter
  86. 86. @Autowiredpublic WebServerConfiguration(final ConfigurableApplicationContext ctx, final LoginFilter loginFilter, final MyWebContextListener webContextListener, final HealthCheckServlet healthCheckServlet) { this.ctx = ctx; this.loginFilter = loginFilter; this.webContextListener = webContextListener; this.healthCheckServlet = healthCheckServlet;}ctx.getServletHandler().addFilter("LoginFilter", loginFilter); // add filterctx.addEventListener(webContextListener); // add listener
  87. 87. @Autowiredpublic WebServerConfiguration(final ConfigurableApplicationContext ctx, final LoginFilter loginFilter, final MyWebContextListener webContextListener, final HealthCheckServlet healthCheckServlet) { this.ctx = ctx; this.loginFilter = loginFilter; this.webContextListener = webContextListener; this.healthCheckServlet = healthCheckServlet;}ctx.getServletHandler().addFilter("LoginFilter", loginFilter); // add filterctx.addEventListener(webContextListener); // add listenerServletHolder servletHolder = new ServletHolder(healthCheckServlet);servletHolder.setName("healthCheck");ctx.addServlet(new ServletHolder(healtCheckServlet), "/healtCheck.html"); // add servlet
  88. 88. @Autowiredpublic WebServerConfiguration(final ConfigurableApplicationContext ctx, final LoginFilter loginFilter, final MyWebContextListener webContextListener, final HealthCheckServlet healthCheckServlet) { this.ctx = ctx; this.loginFilter = loginFilter; this.webContextListener = webContextListener; this.healthCheckServlet = healthCheckServlet;}ctx.getServletHandler().addFilter("LoginFilter", loginFilter); // add filterctx.addEventListener(webContextListener); // add listenerServletHolder servletHolder = new ServletHolder(healthCheckServlet);servletHolder.setName("healthCheck");ctx.addServlet(new ServletHolder(healtCheckServlet), "/healtCheck.html"); // add servletServletHolder jspHolder = new ServletHolder(JspServlet.class);jspHolder.setName("login");jspHolder.setForcedPath("/WEB-INF/jsp/login.jsp");ctx.addServlet(jspHolder, "/login.html"); // add jsp
  89. 89. EN BUNDLE SOM KAN DEPLOYES HVOR SOM HELSTEn propertyfil som bundles med applikasjonen:<miljo>.<servernavn>.min.property=true
  90. 90. EN BUNDLE SOM KAN DEPLOYES HVOR SOM HELSTEn propertyfil som bundles med applikasjonen:<miljo>.<servernavn>.min.property=true En secret.properties lever i hvert miljø med “hemmelige” properties.
  91. 91. EN BUNDLE SOM KAN DEPLOYES HVOR SOM HELSTEn propertyfil som bundles med applikasjonen:<miljo>.<servernavn>.min.property=true En secret.properties lever i hvert miljø med “hemmelige” properties.
  92. 92. EN BUNDLE SOM KAN DEPLOYES HVOR SOM HELSTEn propertyfil som bundles med applikasjonen:<miljo>.<servernavn>.min.property=true En secret.properties lever i hvert miljø med “hemmelige” properties.Zip-fil som inneholder alt applikasjonen trenger, inkludert oppstartsskript lages med:appassembler-maven-plugin og maven-assembly-plugin.
  93. 93. EN BUNDLE SOM KAN DEPLOYES HVOR SOM HELST En propertyfil som bundles med applikasjonen: <miljo>.<servernavn>.min.property=true En secret.properties lever i hvert miljø med “hemmelige” properties. Zip-fil som inneholder alt applikasjonen trenger, inkludert oppstartsskript lages med: appassembler-maven-plugin og maven-assembly-plugin.Kjøring av Main-klassen lokalt med exec-maven-plugin, i IDE-et eller java-kommandoen:mvn exec:java java -classpath ... no.bekk.WebServerMain
  94. 94. DATABASEMIGRERING (OG ROLLBACK)
  95. 95. DATABASEMIGRERING (OG ROLLBACK)
  96. 96. EXPAND/CONTRACT-PATTERN
  97. 97. EXPAND/CONTRACT-PATTERNEXPAND:Legg til nye tabeller / kolonner.Tweake indekser.Migrer databasen.
  98. 98. EXPAND/CONTRACT-PATTERNEXPAND: CONTRACT:Legg til nye tabeller / kolonner. Fjern ubrukte kolonner / tabeller / constraints.Tweake indekser. Legg til nye constraints.Migrer databasen.
  99. 99. db v. 3 TID
  100. 100. app v. 14 kompatibel med db v. 3 og 4db v. 3 deploy app v. 14 TID
  101. 101. app v. 14 kompatibel med db v. 3 og 4db v. 3 db v. 4 deploy app v. 14 migrer db v. 4 TID
  102. 102. app v. 14 app v. 15 kompatibel med kompatibel med db v. 3 og 4 db v. 4db v. 3 db v. 4 deploy deploy app v. 14 app v. 15 migrer db v. 4 TID
  103. 103. app v. 14 app v. 15 app v. 16 kompatibel med kompatibel med kompatibel med db v. 3 og 4 db v. 4 db v. 4db v. 3 db v. 4 deploy deploy deploy app v. 14 app v. 15 app v. 16 migrer db v. 4 TID
  104. 104. app v. 14 app v. 15 app v. 16 app v. 17 kompatibel med kompatibel med kompatibel med kompatibel med db v. 3 og 4 db v. 4 db v. 4 db v. 4 og 5db v. 3 db v. 4 deploy deploy deploy deploy app v. 14 app v. 15 app v. 16 app v. 16 migrer db v. 4 TID
  105. 105. app v. 14 app v. 15 app v. 16 app v. 17 kompatibel med kompatibel med kompatibel med kompatibel med db v. 3 og 4 db v. 4 db v. 4 db v. 4 og 5db v. 3 db v. 4 db v. 5 deploy deploy deploy deploy app v. 14 app v. 15 app v. 16 app v. 16 migrer db v. 4 migrer db v. 5 TID
  106. 106. app v. 14 app v. 15 app v. 16 app v. 17 app v. 18 kompatibel med kompatibel med kompatibel med kompatibel med kompatibel med db v. 3 og 4 db v. 4 db v. 4 db v. 4 og 5 db v. 5db v. 3 db v. 4 db v. 5 deploy deploy deploy deploy deploy app v. 14 app v. 15 app v. 16 app v. 16 app v. 17 migrer db v. 4 migrer db v. 5 TID
  107. 107. 001_create_initial_tables.sql: CREATE TABLE customer ( firstname VARCHAR(255), lastname VARCHAR(255) ); 002_add_customer_date_of_birth.sql ALTER TABLE customer ADD COLUMN dateofbirth DATETIME; --//@UNDO ALTER TABLE customer DROP COLUMN dateofbirth;
  108. 108. http://www.liquibase.org
  109. 109. <databaseChangeLog> <changeSet id="Legger til kolonne for kontostatus" author="Stein Inge Morisbak"> <addColumn tableName="KONTO"> <column type="VARCHAR(20)" name="STATUS" /> </addColumn> </changeSet> <changeSet id="Migrer kontostatus" author="Stein Inge Morisbak"> <sql> update KONTO set STATUS = AKTIV where AKTIV = 1; update KONTO set STATUS = DEAKTIVERT where AKTIV = 0; </sql> <rollback> update KONTO set AKTIV = 1 where STATUS = AKTIV; update KONTO set AKTIV = 0 where STATUS = DEAKTIVERT; update KONTO set AKTIV = 0 where STATUS = STENGT; </rollback> </changeSet> <changeSet id="Fjerner gammel kolonne for aktiv" author="Stein Inge Morisbak"> <dropColumn tableName="KONTO" columnName="AKTIV"/> <rollback> <addColumn tableName="KONTO"> <column type="NUMBER(1,0)" name="AKTIV"/> </addColumn> </rollback> </changeSet></databaseChangeLog>
  110. 110. FORMING
  111. 111. XP! Scrum! STORMINGFORMING
  112. 112. XP! Scrum! NORMING STORMINGFORMING
  113. 113. PERFORMING XP! Scrum! NORMING STORMINGFORMING
  114. 114. Failover Smidig Backup Sikkerhet XP Kanban Deployment DriftLean root-tilgang DBA Retrospekt Virtualisering/CloudKunde DEV OPS Marked Pakketering OvervåkningTDD Automatisering BeredskapVersjonskontroll Logging Audit Konfigurasjonsstyring
  115. 115. Failover Smidig Kontinuerlig leveranse Backup Sikkerhet XP Kanban Test Deployment DriftLean root-tilgang Time to market Raskere feedback DBA Retrospekt Virtualisering/CloudKunde DEVOPS Marked Pakketering Overvåkning KryssfunksjonalitetTDD Automatisering BeredskapVersjonskontroll Samarbeid Logging AuditInfrastruktur som kode Konfigurasjonsstyring
  116. 116. It’s hard enough for software developers to write code that works on their machine. But even when that’s done, there’s a long journey from there tosoftware that’s producing value - sincesoftware only produces value when it’s in production. - Martin Fowler (http://martinfowler.com/delivery.html)
  117. 117. TESTINGTest kontinuerligJo hyppigere leveranser, jo mindre å teste.Test sammen.Utviklere kan teste.Husk å teste ytelse og sikkerhet.
  118. 118. BYGG OG CI 98Kontinuerlig integrasjonAlle endringer trigger feedbackmekanismeneDeployment pipelines
  119. 119. KONFIGURASJONSSTYRING 99Infrastruktur som kode (deklarativ)Applikasjonen din er ikke infratruktur (imperativ)
  120. 120. DEPLOYRUTINER 100Felles og repeterbar deployprosess for alle miljø.Automatisert og skriptet.Feature toggles.Nedetidfri deployment.Skal være enkelt å rulle frem og tilbake (også mellom databaseversjoner).Skill databasemigrering og deploy av applikasjonen.
  121. 121. “LØS “ ARKITEKTUR OG ENKEL TEKNOLOGI 101Enkelt å konfigurere.Enkel å skripte mot.Branch by abstraction.
  122. 122. PROSESS/ORGANISASJON 102Pull-basert prosessAlltid produksjonssettbar kode.DevOps.Selvorganisering tar tid - kontinuerlig forbedring.
  123. 123. Vår høyeste prioritet er å tilfredsstille kundengjennom tidlige og kontinuerlige leveranser av programvare som har verdi.
  124. 124. yDevO ps Norwa November: Dan North http://www.meetup.com/DevOps-Norway/

×