SlideShare a Scribd company logo
1 of 52
DU KAN IKKE LEVERE KONTINUERLIG OM DU HAR NEDETID




                        Smidig 2012
                    Stein Inge Morisbak
Vår høyeste prioritet er å tilfredsstille kunden
gjennom tidlige og kontinuerlige leveranser
        av programvare som har verdi.
Lever fungerende programvare hyppig,
med et par ukers til et par måneders mellomrom.
           Jo oftere, desto bedre.
Fungerende programvare er det primære
         målet på fremdrift.
Continuous delivery is about putting the
  release schedule in the hands of the
    business, not in the hands of IT.

    ... 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/)
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);
    }

}
BIG-IP LASTBALANSERER




NODE 1   /online   NODE 2   /online         NODE 3   /online
BIG-IP LASTBALANSERER




NODE 1   /offline
         /online    NODE 2   /online         NODE 3   /online
BIG-IP LASTBALANSERER




NODE 1   /offline
         /online    NODE 2   /online         NODE 3   /online
BIG-IP LASTBALANSERER




   NODE 1   /offline
            /online               NODE 2   /online         NODE 3   /online




> ./jetty-deploy.sh web-app 1.7
BIG-IP LASTBALANSERER




NODE 1   /offline
         /online    NODE 2   /online         NODE 3   /online
BIG-IP LASTBALANSERER




NODE 1   /offline
         /online    NODE 2   /online         NODE 3   /online
BIG-IP LASTBALANSERER




NODE 1   /offline
         /online    NODE 2   /online         NODE 3   /online
BIG-IP LASTBALANSERER




NODE 1   /offline
         /online    NODE 2   /offline
                             /online         NODE 3   /offline
                                                      /online
#!/bin/bash
# Usage: jetty-deploy.sh <artifact> <version>

artifact=$1
version=$2

wget https://nexus.bekk.no/${artifact}/${version}/${artifact}-${version}.zip

unzip ${artifact}.zip

/etc/init.d/${artifact} stop

rm ${artifact} # softlink

ln -s ${artifact}-${version} ${artifact}

/etc/init.d/${artifact} start

while ( ! curl http://localhost:8080/status 2>/dev/null | grep online )
do
   echo "Waiting for web-app to come online."
   sleep 10
done
#!/bin/bash
# Usage: rollback.sh <artifact> <version>

artifact=$1
version=$2

/etc/init.d/${artifact} stop

rm ${artifact} # softlink

ln -s ${artifact}-${version} ${artifact}

/etc/init.d/${artifact} start

while ( ! curl http://localhost:8080/status 2>/dev/null | grep online )
do
   echo "Waiting for web-app to come online."
   sleep 10
done
upstream my_webapp_upstream {
  server 127.0.0.1:8080;
  server 127.0.0.1:8081;
  server 127.0.0.1:8082;
  server 127.0.0.1:8083;
  keepalive 64;
}

...
location @webapp {
...
proxy_next_upstream error timeout http_502;
...
proxy_pass http://my_webapp_upstream;
}
...
<VirtualHost *:80>
  ServerName example.com
  ProxyRequests Off
  ProxyPreserveHost On

  ProxyPass / http://localhost: / 8080
  ProxyPassReverse / http://localhost: / 8080
</VirtualHost>
<VirtualHost *:80>
  ServerName example.com
  ProxyRequests Off
  ProxyPreserveHost On

  ProxyPass / http://localhost: / 8080
  ProxyPassReverse / http://localhost: / 8080
</VirtualHost>



$ jetty-deploy.sh -port=8081
<VirtualHost *:80>
  ServerName example.com
  ProxyRequests Off
  ProxyPreserveHost On

  ProxyPass / http://localhost: / 8081
  ProxyPassReverse / http://localhost: / 8081
</VirtualHost>



$ jetty-deploy.sh -port=8081
<VirtualHost *:80>
  ServerName example.com
  ProxyRequests Off
  ProxyPreserveHost On

  ProxyPass / http://localhost: / 8081
  ProxyPassReverse / http://localhost: / 8081
</VirtualHost>



$ /etc/init.d/apache reload
DATABASEMIGRERING (OG ROLLBACK)
DATABASEMIGRERING (OG ROLLBACK)
EXPAND/CONTRACT-PATTERN
EXPAND/CONTRACT-PATTERN




          EXPAND:
EXPAND/CONTRACT-PATTERN




          EXPAND:         CONTRACT:
db v. 3




          TID
app v. 14
          kompatibel med
              db v. 3

db v. 3

              deploy




                           TID
app v. 14
          kompatibel med
              db v. 3

db v. 3                    db pre. 4

              deploy



                            migrer


                                       TID
app v. 14                    app v. 15
          kompatibel med               kompatibel med
              db v. 3                    pre 4 og 4

db v. 3                    db pre. 4

              deploy                       deploy



                            migrer


                                                        TID
app v. 14                    app v. 15
          kompatibel med               kompatibel med
              db v. 3                    pre 4 og 4

db v. 3                    db pre. 4                    db v. 4

              deploy                       deploy



                            migrer                      migrer


                                                        TID
app v. 14                    app v. 15                  app v. 17
          kompatibel med               kompatibel med             kompatibel med
              db v. 3                    pre 4 og 4                  db 4 og 5

db v. 3                    db pre. 4                    db v. 4

              deploy                       deploy                     deploy



                            migrer                      migrer


                                                        TID
app v. 14                    app v. 15                  app v. 17
          kompatibel med               kompatibel med             kompatibel med
              db v. 3                    pre 4 og 4                  db 4 og 5

db v. 3                    db pre. 4                    db v. 4                    db v. 5

              deploy                       deploy                     deploy



                            migrer                      migrer                     migrer


                                                        TID
app v. 14                    app v. 15                  app v. 17                  app v. 18
          kompatibel med               kompatibel med             kompatibel med             kompatibel med
              db v. 3                    pre 4 og 4                  db 4 og 5                   db v. 5

db v. 3                    db pre. 4                    db v. 4                    db v. 5

              deploy                       deploy                     deploy                     deploy



                            migrer                      migrer                     migrer


                                                        TID
http://www.liquibase.org
<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>
OPPSUMMERING
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.

Nedetidfri deploy kan løses på følgende måte:
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.

Nedetidfri deploy kan løses på følgende måte:

   - Sesjonsreplikering i databasen.
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.

Nedetidfri deploy kan løses på følgende måte:

   - Sesjonsreplikering i databasen.

   - Migrer bakover- og fremoverkompatible databaseendringer (expand).
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.

Nedetidfri deploy kan løses på følgende måte:

   - Sesjonsreplikering i databasen.

   - Migrer bakover- og fremoverkompatible databaseendringer (expand).

   - Meld ut en node av lastbalansering/reverse proxy.
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.

Nedetidfri deploy kan løses på følgende måte:

   - Sesjonsreplikering i databasen.

   - Migrer bakover- og fremoverkompatible databaseendringer (expand).

   - Meld ut en node av lastbalansering/reverse proxy.

   - Deploy til noden.
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.

Nedetidfri deploy kan løses på følgende måte:

   - Sesjonsreplikering i databasen.

   - Migrer bakover- og fremoverkompatible databaseendringer (expand).

   - Meld ut en node av lastbalansering/reverse proxy.

   - Deploy til noden.

   - Gjenta for resten av nodene.
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.

Nedetidfri deploy kan løses på følgende måte:

   - Sesjonsreplikering i databasen.

   - Migrer bakover- og fremoverkompatible databaseendringer (expand).

   - Meld ut en node av lastbalansering/reverse proxy.

   - Deploy til noden.

   - Gjenta for resten av nodene.

   - Rydd opp i databasen (contract).
OPPSUMMERING

Du er ikke smidig om du ikke leverer kontinuerlig!

Du kan ikke levere kontinuerlig om du har nedetid!

Forretning bestemmer hva og når noe skal i produksjon.

Prodsetting skal være like enkelt som å trykke på en knapp.

Nedetidfri deploy kan løses på følgende måte:

   - Sesjonsreplikering i databasen.

   - Migrer bakover- og fremoverkompatible databaseendringer (expand).

   - Meld ut en node av lastbalansering/reverse proxy.

   - Deploy til noden.

   - Gjenta for resten av nodene.

   - Rydd opp i databasen (contract).
y
    DevO ps Norwa




                                                     Dan North

                    14. november klokken 18:00:

How to build your own Heroku - an experience report.

              http://www.meetup.com/DevOps-Norway/
TAKK FOR MEG!


           Stein Inge Morisbak
Fagleder Kontinuerlige Leveranser/DevOps

     stein.inge.morisbak@BEKK.no
                @steinim

    http://open.bekk.no/

More Related Content

Viewers also liked

B I O Products Sriphatoom Uni 24062011
B I O  Products  Sriphatoom Uni 24062011B I O  Products  Sriphatoom Uni 24062011
B I O Products Sriphatoom Uni 24062011aj_kwan.ph
 
Getting to know your users with RUM
Getting to know your users with RUMGetting to know your users with RUM
Getting to know your users with RUMScott Povlot
 
El desarrollo del pesamiento creativo en estudiantes de ingneireia
El desarrollo del pesamiento creativo en estudiantes de ingneireiaEl desarrollo del pesamiento creativo en estudiantes de ingneireia
El desarrollo del pesamiento creativo en estudiantes de ingneireiacrojas6
 
Geração de jesus - Jotta A
Geração de jesus - Jotta AGeração de jesus - Jotta A
Geração de jesus - Jotta ALea Campos
 
B Sc Sec D&T Education @ NTU induction
B Sc Sec D&T Education @ NTU inductionB Sc Sec D&T Education @ NTU induction
B Sc Sec D&T Education @ NTU inductionAlison Hardy
 
비영리단체 온라인 캠페인 만들기 1탄 이거바 쪼개보기
비영리단체 온라인 캠페인 만들기 1탄 이거바 쪼개보기비영리단체 온라인 캠페인 만들기 1탄 이거바 쪼개보기
비영리단체 온라인 캠페인 만들기 1탄 이거바 쪼개보기Andrew Hwang
 
HARDWARE COMPONENTS
HARDWARE COMPONENTSHARDWARE COMPONENTS
HARDWARE COMPONENTSVero Castro
 
Intervento Zecchi-Valdrè Inglese
Intervento Zecchi-Valdrè IngleseIntervento Zecchi-Valdrè Inglese
Intervento Zecchi-Valdrè IngleseIrecoop Toscana
 
The changing landscape of display & what smart marketers need to know
The changing landscape of display & what smart marketers need to knowThe changing landscape of display & what smart marketers need to know
The changing landscape of display & what smart marketers need to knowIABmembership
 
La féte-du-chausson- Teixeira Eva
La féte-du-chausson- Teixeira EvaLa féte-du-chausson- Teixeira Eva
La féte-du-chausson- Teixeira Evakedougou
 
Digital age 2.0
Digital age 2.0Digital age 2.0
Digital age 2.0idilpalali
 
Personal Leadership rev 1
Personal Leadership rev 1Personal Leadership rev 1
Personal Leadership rev 1Rachmat Gunawan
 
La fête de la truite - Vales Natalia
La fête de la truite - Vales NataliaLa fête de la truite - Vales Natalia
La fête de la truite - Vales Nataliakedougou
 
Hs 101 project
Hs 101 projectHs 101 project
Hs 101 projectmjtheman
 
Ahad1 welcome from cp
Ahad1 welcome from cpAhad1 welcome from cp
Ahad1 welcome from cpnpeducation
 

Viewers also liked (20)

B I O Products Sriphatoom Uni 24062011
B I O  Products  Sriphatoom Uni 24062011B I O  Products  Sriphatoom Uni 24062011
B I O Products Sriphatoom Uni 24062011
 
Getting to know your users with RUM
Getting to know your users with RUMGetting to know your users with RUM
Getting to know your users with RUM
 
El desarrollo del pesamiento creativo en estudiantes de ingneireia
El desarrollo del pesamiento creativo en estudiantes de ingneireiaEl desarrollo del pesamiento creativo en estudiantes de ingneireia
El desarrollo del pesamiento creativo en estudiantes de ingneireia
 
Geração de jesus - Jotta A
Geração de jesus - Jotta AGeração de jesus - Jotta A
Geração de jesus - Jotta A
 
B Sc Sec D&T Education @ NTU induction
B Sc Sec D&T Education @ NTU inductionB Sc Sec D&T Education @ NTU induction
B Sc Sec D&T Education @ NTU induction
 
Use power point
Use power pointUse power point
Use power point
 
Oltre l'orientamento
Oltre l'orientamentoOltre l'orientamento
Oltre l'orientamento
 
Discurso Speroni
Discurso SperoniDiscurso Speroni
Discurso Speroni
 
비영리단체 온라인 캠페인 만들기 1탄 이거바 쪼개보기
비영리단체 온라인 캠페인 만들기 1탄 이거바 쪼개보기비영리단체 온라인 캠페인 만들기 1탄 이거바 쪼개보기
비영리단체 온라인 캠페인 만들기 1탄 이거바 쪼개보기
 
HARDWARE COMPONENTS
HARDWARE COMPONENTSHARDWARE COMPONENTS
HARDWARE COMPONENTS
 
Intervento Zecchi-Valdrè Inglese
Intervento Zecchi-Valdrè IngleseIntervento Zecchi-Valdrè Inglese
Intervento Zecchi-Valdrè Inglese
 
The changing landscape of display & what smart marketers need to know
The changing landscape of display & what smart marketers need to knowThe changing landscape of display & what smart marketers need to know
The changing landscape of display & what smart marketers need to know
 
1 Інвестиційний потенціал області - Микола Джига
1 Інвестиційний потенціал області - Микола Джига1 Інвестиційний потенціал області - Микола Джига
1 Інвестиційний потенціал області - Микола Джига
 
La féte-du-chausson- Teixeira Eva
La féte-du-chausson- Teixeira EvaLa féte-du-chausson- Teixeira Eva
La féte-du-chausson- Teixeira Eva
 
Digital age 2.0
Digital age 2.0Digital age 2.0
Digital age 2.0
 
Personal Leadership rev 1
Personal Leadership rev 1Personal Leadership rev 1
Personal Leadership rev 1
 
La fête de la truite - Vales Natalia
La fête de la truite - Vales NataliaLa fête de la truite - Vales Natalia
La fête de la truite - Vales Natalia
 
Hs 101 project
Hs 101 projectHs 101 project
Hs 101 project
 
Ahad1 welcome from cp
Ahad1 welcome from cpAhad1 welcome from cp
Ahad1 welcome from cp
 
Minustako bloggari?
Minustako bloggari?Minustako bloggari?
Minustako bloggari?
 

More from Stein Inge Morisbak

More from Stein Inge Morisbak (11)

Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
 
Orkestrering av IT-utvikling i Store Organisasjoner
Orkestrering av IT-utvikling i Store OrganisasjonerOrkestrering av IT-utvikling i Store Organisasjoner
Orkestrering av IT-utvikling i Store Organisasjoner
 
Slutt med IT-prosjekter!
Slutt med IT-prosjekter!Slutt med IT-prosjekter!
Slutt med IT-prosjekter!
 
Devops or die!
Devops or die!Devops or die!
Devops or die!
 
Devops eller dø!
Devops eller dø!Devops eller dø!
Devops eller dø!
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
 
Verdien av kontinuerlige leveranser
Verdien av kontinuerlige leveranserVerdien av kontinuerlige leveranser
Verdien av kontinuerlige leveranser
 
Er du moden for å levere kontinuerlig?
Er du moden for å levere kontinuerlig?Er du moden for å levere kontinuerlig?
Er du moden for å levere kontinuerlig?
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Hvis du ikke leverer kontinuerlig, så er du ikke smidig!
Hvis du ikke leverer kontinuerlig, så er du ikke smidig!Hvis du ikke leverer kontinuerlig, så er du ikke smidig!
Hvis du ikke leverer kontinuerlig, så er du ikke smidig!
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 

Du kan ikke levere kontinuerlig om du har nedetid

  • 1. DU KAN IKKE LEVERE KONTINUERLIG OM DU HAR NEDETID Smidig 2012 Stein Inge Morisbak
  • 2. Vår høyeste prioritet er å tilfredsstille kunden gjennom tidlige og kontinuerlige leveranser av programvare som har verdi.
  • 3. Lever fungerende programvare hyppig, med et par ukers til et par måneders mellomrom. Jo oftere, desto bedre.
  • 4. Fungerende programvare er det primære målet på fremdrift.
  • 5. Continuous delivery is about putting the release schedule in the hands of the business, not in the hands of IT. ... 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/)
  • 6.
  • 7. 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); } }
  • 8. BIG-IP LASTBALANSERER NODE 1 /online NODE 2 /online NODE 3 /online
  • 9. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /online NODE 3 /online
  • 10. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /online NODE 3 /online
  • 11. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /online NODE 3 /online > ./jetty-deploy.sh web-app 1.7
  • 12. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /online NODE 3 /online
  • 13. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /online NODE 3 /online
  • 14. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /online NODE 3 /online
  • 15. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /offline /online NODE 3 /offline /online
  • 16. #!/bin/bash # Usage: jetty-deploy.sh <artifact> <version> artifact=$1 version=$2 wget https://nexus.bekk.no/${artifact}/${version}/${artifact}-${version}.zip unzip ${artifact}.zip /etc/init.d/${artifact} stop rm ${artifact} # softlink ln -s ${artifact}-${version} ${artifact} /etc/init.d/${artifact} start while ( ! curl http://localhost:8080/status 2>/dev/null | grep online ) do echo "Waiting for web-app to come online." sleep 10 done
  • 17. #!/bin/bash # Usage: rollback.sh <artifact> <version> artifact=$1 version=$2 /etc/init.d/${artifact} stop rm ${artifact} # softlink ln -s ${artifact}-${version} ${artifact} /etc/init.d/${artifact} start while ( ! curl http://localhost:8080/status 2>/dev/null | grep online ) do echo "Waiting for web-app to come online." sleep 10 done
  • 18. upstream my_webapp_upstream { server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; keepalive 64; } ... location @webapp { ... proxy_next_upstream error timeout http_502; ... proxy_pass http://my_webapp_upstream; } ...
  • 19. <VirtualHost *:80> ServerName example.com   ProxyRequests Off ProxyPreserveHost On   ProxyPass / http://localhost: / 8080   ProxyPassReverse / http://localhost: / 8080 </VirtualHost>
  • 20. <VirtualHost *:80> ServerName example.com   ProxyRequests Off ProxyPreserveHost On   ProxyPass / http://localhost: / 8080   ProxyPassReverse / http://localhost: / 8080 </VirtualHost> $ jetty-deploy.sh -port=8081
  • 21. <VirtualHost *:80> ServerName example.com   ProxyRequests Off ProxyPreserveHost On   ProxyPass / http://localhost: / 8081   ProxyPassReverse / http://localhost: / 8081 </VirtualHost> $ jetty-deploy.sh -port=8081
  • 22. <VirtualHost *:80> ServerName example.com   ProxyRequests Off ProxyPreserveHost On   ProxyPass / http://localhost: / 8081   ProxyPassReverse / http://localhost: / 8081 </VirtualHost> $ /etc/init.d/apache reload
  • 27. EXPAND/CONTRACT-PATTERN EXPAND: CONTRACT:
  • 28. db v. 3 TID
  • 29. app v. 14 kompatibel med db v. 3 db v. 3 deploy TID
  • 30. app v. 14 kompatibel med db v. 3 db v. 3 db pre. 4 deploy migrer TID
  • 31. app v. 14 app v. 15 kompatibel med kompatibel med db v. 3 pre 4 og 4 db v. 3 db pre. 4 deploy deploy migrer TID
  • 32. app v. 14 app v. 15 kompatibel med kompatibel med db v. 3 pre 4 og 4 db v. 3 db pre. 4 db v. 4 deploy deploy migrer migrer TID
  • 33. app v. 14 app v. 15 app v. 17 kompatibel med kompatibel med kompatibel med db v. 3 pre 4 og 4 db 4 og 5 db v. 3 db pre. 4 db v. 4 deploy deploy deploy migrer migrer TID
  • 34. app v. 14 app v. 15 app v. 17 kompatibel med kompatibel med kompatibel med db v. 3 pre 4 og 4 db 4 og 5 db v. 3 db pre. 4 db v. 4 db v. 5 deploy deploy deploy migrer migrer migrer TID
  • 35. app v. 14 app v. 15 app v. 17 app v. 18 kompatibel med kompatibel med kompatibel med kompatibel med db v. 3 pre 4 og 4 db 4 og 5 db v. 5 db v. 3 db pre. 4 db v. 4 db v. 5 deploy deploy deploy deploy migrer migrer migrer TID
  • 37. <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>
  • 39. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig!
  • 40. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid!
  • 41. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon.
  • 42. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp.
  • 43. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp. Nedetidfri deploy kan løses på følgende måte:
  • 44. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp. Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen.
  • 45. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp. Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand).
  • 46. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp. Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy.
  • 47. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp. Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy. - Deploy til noden.
  • 48. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp. Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy. - Deploy til noden. - Gjenta for resten av nodene.
  • 49. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp. Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy. - Deploy til noden. - Gjenta for resten av nodene. - Rydd opp i databasen (contract).
  • 50. OPPSUMMERING Du er ikke smidig om du ikke leverer kontinuerlig! Du kan ikke levere kontinuerlig om du har nedetid! Forretning bestemmer hva og når noe skal i produksjon. Prodsetting skal være like enkelt som å trykke på en knapp. Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy. - Deploy til noden. - Gjenta for resten av nodene. - Rydd opp i databasen (contract).
  • 51. y DevO ps Norwa Dan North 14. november klokken 18:00: How to build your own Heroku - an experience report. http://www.meetup.com/DevOps-Norway/
  • 52. TAKK FOR MEG! Stein Inge Morisbak Fagleder Kontinuerlige Leveranser/DevOps stein.inge.morisbak@BEKK.no @steinim http://open.bekk.no/

Editor's Notes

  1. Jeg heter Stein Inge Morisbak og er fagleder for Kointinuerlige Leveranser og DevOps i BEKK. Jeg jobber til daglig som tech lead p&amp;#xE5; teamet som lager Digipost. P&amp;#xE5; Digipost s&amp;#xE5; leverer vi kontinuerlig, og vi har for tiden ca. en kvart million brukere. Da er det ikke s&amp;#xE5; g&amp;#xF8;y &amp;#xE5; ha nedetid n&amp;#xE5;r vi leverer s&amp;#xE5;pass hyppig som vi gj&amp;#xF8;r. I snitt deployer vi en gang i uka, men vi jobber med &amp;#xE5; f&amp;#xE5; enn&amp;#xE5; hyppigere prodsettinger.\n
  2. N&amp;#xE5;r man driver med smidig utvikling s&amp;#xE5; er f&amp;#xF8;rste prinsipp at man skal levere kontinuerlig.\n
  3. Og man skal levere hyppig. Jo oftere desto bedre. Setningen i midten er utdatert, s&amp;#xE5; den stryker jeg.\n
  4. Framdrift m&amp;#xE5;les utelukkende fra fungerende programvare i produksjon. Og jo lenger tid det tar mellom hver produksjonssetting, jo vanskeligere er det &amp;#xE5; m&amp;#xE5;le fremdrift.\n
  5. Kontinuerlig leveranse handler om &amp;#xE5; redusere ledetid fra id&amp;#xE9; til produksjon. Det er forretning som skal sitte i f&amp;#xF8;rersetet og kunne bestemme hva og n&amp;#xE5;r noe skal i produksjon. S&amp;#xE5; kunden kan si at han &amp;#xF8;nsker en endring og f&amp;#xE5; se det i produksjon i l&amp;#xF8;pet av dagen eller enda kortere. Og da skal ikke vi m&amp;#xE5;tte si nei.\n
  6. Da m&amp;#xE5; prodsetting v&amp;#xE6;re like enkelt som &amp;#xE5; trykke p&amp;#xE5; en knapp og vi kan ikke ha nedetid med s&amp;#xE5; hyppige prodsettinger og s&amp;#xE5; mange brukere.\n
  7. Uansett; m&amp;#xE5;ten vi har gjort det p&amp;#xE5; er &amp;#xE5; bruke sesjonsreplikering i databasen. Dette er det st&amp;#xF8;tte for out-of-the box i Jetty. Man legger simpelthen til en JDBCSessionHandler som persisterer brukersesjonene til databasen. Dersom en sesjon ikke eksisterer i minne, s&amp;#xE5; sjekkes databasen for om det finnes en sesjon fra en annen server der, og laster inn sesjonen i minne p&amp;#xE5; den nye serveren. Enkelt - men vi m&amp;#xE5; gj&amp;#xF8;re en ting til (klikk).\n
  8. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  9. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  10. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  11. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  12. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  13. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  14. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  15. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  16. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  17. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  18. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  19. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  20. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  21. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  22. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  23. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  24. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  25. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  26. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  27. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  28. Foran applikasjonsserverne v&amp;#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&amp;#xE5; sist. Det kan ta litt tid f&amp;#xF8;r lastbalansereren merker at en node er nede, s&amp;#xE5; den vil vente ganske lenge p&amp;#xE5; at applikasjonsserveren er tilgjengelig f&amp;#xF8;r den ruter brukeren til neste server. Brukeren m&amp;#xE5; da vente lenge p&amp;#xE5; &amp;#xE5; f&amp;#xE5; svar. M&amp;#xE5;ten vi har ordnet det p&amp;#xE5; er som f&amp;#xF8;lger. Det starter med at serveren du &amp;#xF8;nsker &amp;#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &amp;#xE5; endre returstatus for requesten som lastbalansereren poller p&amp;#xE5; fra online til offline (klikk). S&amp;#xE5; venter vi litte grann og fortsetter &amp;#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&amp;#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&amp;#xF8;re tester mot den nye applikasjonen (klikk) f&amp;#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&amp;#xE5; gj&amp;#xF8;r vi tilsvarende med resterende servere.\n
  29. Den ene knappen som produksjonssetter har vi implementert som et bash-skript. Deployskriptet her er forenklet en del, men ikke s&amp;#xE5; mye. Man angir artefakt og versjon som parameter 1 og 2, henter artefakten fra artefaktrepoet, pakker ut den nye versjonen, stopper applikasjonen, flytter soft-link fra gammel til ny applikasjon og starter den nye applikasjonen. While-loopen p&amp;#xE5; slutten venter til applikasjonen er online igjen f&amp;#xF8;r skriptet avsluttes. S&amp;#xE5; hvis man kaller dette skriptet fra et annet skript for hver server man skal deploye til, s&amp;#xE5; er man sikker p&amp;#xE5; at hver server er online f&amp;#xF8;r neste server deployes.\n
  30. Rollback er enn&amp;#xE5; enklere. Der stopper vi appen. Flytter symlinken fra ny til forrige versjon og starter opp igjen.\n
  31. Det er ikke alle som har Big-Ip som lastbalanserer. Det er en sinnsykt dyr boks for sv&amp;#xE6;re l&amp;#xF8;sninger. Men du kan f&amp;#xE5; til prinsippet ved &amp;#xE5; bruke andre proxier foran applikasjonene dine. Her er et eksempel med Nginx. Hvis nginx oppdager en feil, det vil si connection refused eller en timeout p&amp;#xE5; en upstream server, s&amp;#xE5; failer den over til den neste upstream serveren. I dette tilfellet kaster vi en 502 for &amp;#xE5; indikere at en graceful shutdown p&amp;#xE5;g&amp;#xE5;r. Nginx gj&amp;#xF8;r da en failover til neste upstream server n&amp;#xE5;r den f&amp;#xE5;r en feil, en timeout eller en 502.\n
  32. Apache. (klikk) Vi deployer en ny versjon av applikasjonen p&amp;#xE5; en annen port. Her 8081. (klikk) S&amp;#xE5; endrer vi porten til revers-proxien til 8081 (klikk) og reloader apache configen (klikk).\n
  33. Apache. (klikk) Vi deployer en ny versjon av applikasjonen p&amp;#xE5; en annen port. Her 8081. (klikk) S&amp;#xE5; endrer vi porten til revers-proxien til 8081 (klikk) og reloader apache configen (klikk).\n
  34. Apache. (klikk) Vi deployer en ny versjon av applikasjonen p&amp;#xE5; en annen port. Her 8081. (klikk) S&amp;#xE5; endrer vi porten til revers-proxien til 8081 (klikk) og reloader apache configen (klikk).\n
  35. Apache. (klikk) Vi deployer en ny versjon av applikasjonen p&amp;#xE5; en annen port. Her 8081. (klikk) S&amp;#xE5; endrer vi porten til revers-proxien til 8081 (klikk) og reloader apache configen (klikk).\n
  36. Apache. (klikk) Vi deployer en ny versjon av applikasjonen p&amp;#xE5; en annen port. Her 8081. (klikk) S&amp;#xE5; endrer vi porten til revers-proxien til 8081 (klikk) og reloader apache configen (klikk).\n
  37. Apache. (klikk) Vi deployer en ny versjon av applikasjonen p&amp;#xE5; en annen port. Her 8081. (klikk) S&amp;#xE5; endrer vi porten til revers-proxien til 8081 (klikk) og reloader apache configen (klikk).\n
  38. Apache. (klikk) Vi deployer en ny versjon av applikasjonen p&amp;#xE5; en annen port. Her 8081. (klikk) S&amp;#xE5; endrer vi porten til revers-proxien til 8081 (klikk) og reloader apache configen (klikk).\n
  39. Apache. (klikk) Vi deployer en ny versjon av applikasjonen p&amp;#xE5; en annen port. Her 8081. (klikk) S&amp;#xE5; endrer vi porten til revers-proxien til 8081 (klikk) og reloader apache configen (klikk).\n
  40. Til slutt skal jeg snakke om databasemigrering (klikk) og rollback. Det er et slags h&amp;#xF8;na og egget problem: Databaseendringer kan ikke gjennomf&amp;#xF8;res uten &amp;#xE5; bryte med den eksisterende l&amp;#xF8;sningen, og den nye versjonen virker ikke uten endringene du skal gjennomf&amp;#xF8;re. Ikke bra. Vel det finnes l&amp;#xF8;sninger p&amp;#xE5; det.\n
  41. For eksempel har vi det vi kaller expand/contract pattern. (klikk) Expansion skript er databaseendringer som er trygge &amp;#xE5; legge til uten &amp;#xE5; bryte bakoverkompatibiltet med den eksisterende applikasjonen. Endringer som &amp;#xE5; legge til nye tabeller, legge til kolonner eller &amp;#xE5; tweake indekser faller inn under denne kategorien. (klikk) Contraction-skript er databasemigreringer som rydder opp ting i databasen som ikke trengs lenger etter oppgraderingen. &amp;#xC5; slette kolonner, tabeller eller constraints, og &amp;#xE5; legge til constraints er eksepler p&amp;#xE5; det. Ekspansjonsskriptene kj&amp;#xF8;res f&amp;#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&amp;#xF8;rer n&amp;#xE5;r applikasjonen er oppgradert og stabil. Det er ytterst sjelden at vi gj&amp;#xF8;r andre ting som gj&amp;#xF8;r at ikke applikasjonen kan v&amp;#xE6;re kompatibel med to versjoner av databasen. Og det finnes andre teknikker for &amp;#xE5; f&amp;#xE5; til at for eksempel en kolonne skal endre navn eller flyttes til en ny tabell. Man kan for eksempe bruke triggers og en migreringsjobb.\n
  42. For eksempel har vi det vi kaller expand/contract pattern. (klikk) Expansion skript er databaseendringer som er trygge &amp;#xE5; legge til uten &amp;#xE5; bryte bakoverkompatibiltet med den eksisterende applikasjonen. Endringer som &amp;#xE5; legge til nye tabeller, legge til kolonner eller &amp;#xE5; tweake indekser faller inn under denne kategorien. (klikk) Contraction-skript er databasemigreringer som rydder opp ting i databasen som ikke trengs lenger etter oppgraderingen. &amp;#xC5; slette kolonner, tabeller eller constraints, og &amp;#xE5; legge til constraints er eksepler p&amp;#xE5; det. Ekspansjonsskriptene kj&amp;#xF8;res f&amp;#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&amp;#xF8;rer n&amp;#xE5;r applikasjonen er oppgradert og stabil. Det er ytterst sjelden at vi gj&amp;#xF8;r andre ting som gj&amp;#xF8;r at ikke applikasjonen kan v&amp;#xE6;re kompatibel med to versjoner av databasen. Og det finnes andre teknikker for &amp;#xE5; f&amp;#xE5; til at for eksempel en kolonne skal endre navn eller flyttes til en ny tabell. Man kan for eksempe bruke triggers og en migreringsjobb.\n
  43. Her er et eksempel p&amp;#xE5; forskjellige typiske m&amp;#xF8;nstre for evolusjon av databaser og applikasjoner. Vi starter med database versjon 3. (klikk) S&amp;#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 (klikk). S&amp;#xE5; deployer vi en database som fungerer med forrige og neste versjon av applikasjonen - expansion (klikk). Deretter en applikasjon som er kompatibel med versjon pre 4 og 4. S&amp;#xE5; rydder vi opp og deployer den komplette versjon 4 - contraction. (klikk ) Neste applikasjon er kompatibel med b&amp;#xE5;de database 4 og den kommende versjon 5 (klikk). Vi migrerer versjon 5. (klikk) S&amp;#xE5; deployer vi en ny applikasjon som er kompatibel med kun 5. Og s&amp;#xE5;nn g&amp;#xE5;r nu dagan.\n
  44. Her er et eksempel p&amp;#xE5; forskjellige typiske m&amp;#xF8;nstre for evolusjon av databaser og applikasjoner. Vi starter med database versjon 3. (klikk) S&amp;#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 (klikk). S&amp;#xE5; deployer vi en database som fungerer med forrige og neste versjon av applikasjonen - expansion (klikk). Deretter en applikasjon som er kompatibel med versjon pre 4 og 4. S&amp;#xE5; rydder vi opp og deployer den komplette versjon 4 - contraction. (klikk ) Neste applikasjon er kompatibel med b&amp;#xE5;de database 4 og den kommende versjon 5 (klikk). Vi migrerer versjon 5. (klikk) S&amp;#xE5; deployer vi en ny applikasjon som er kompatibel med kun 5. Og s&amp;#xE5;nn g&amp;#xE5;r nu dagan.\n
  45. Her er et eksempel p&amp;#xE5; forskjellige typiske m&amp;#xF8;nstre for evolusjon av databaser og applikasjoner. Vi starter med database versjon 3. (klikk) S&amp;#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 (klikk). S&amp;#xE5; deployer vi en database som fungerer med forrige og neste versjon av applikasjonen - expansion (klikk). Deretter en applikasjon som er kompatibel med versjon pre 4 og 4. S&amp;#xE5; rydder vi opp og deployer den komplette versjon 4 - contraction. (klikk ) Neste applikasjon er kompatibel med b&amp;#xE5;de database 4 og den kommende versjon 5 (klikk). Vi migrerer versjon 5. (klikk) S&amp;#xE5; deployer vi en ny applikasjon som er kompatibel med kun 5. Og s&amp;#xE5;nn g&amp;#xE5;r nu dagan.\n
  46. Her er et eksempel p&amp;#xE5; forskjellige typiske m&amp;#xF8;nstre for evolusjon av databaser og applikasjoner. Vi starter med database versjon 3. (klikk) S&amp;#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 (klikk). S&amp;#xE5; deployer vi en database som fungerer med forrige og neste versjon av applikasjonen - expansion (klikk). Deretter en applikasjon som er kompatibel med versjon pre 4 og 4. S&amp;#xE5; rydder vi opp og deployer den komplette versjon 4 - contraction. (klikk ) Neste applikasjon er kompatibel med b&amp;#xE5;de database 4 og den kommende versjon 5 (klikk). Vi migrerer versjon 5. (klikk) S&amp;#xE5; deployer vi en ny applikasjon som er kompatibel med kun 5. Og s&amp;#xE5;nn g&amp;#xE5;r nu dagan.\n
  47. Her er et eksempel p&amp;#xE5; forskjellige typiske m&amp;#xF8;nstre for evolusjon av databaser og applikasjoner. Vi starter med database versjon 3. (klikk) S&amp;#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 (klikk). S&amp;#xE5; deployer vi en database som fungerer med forrige og neste versjon av applikasjonen - expansion (klikk). Deretter en applikasjon som er kompatibel med versjon pre 4 og 4. S&amp;#xE5; rydder vi opp og deployer den komplette versjon 4 - contraction. (klikk ) Neste applikasjon er kompatibel med b&amp;#xE5;de database 4 og den kommende versjon 5 (klikk). Vi migrerer versjon 5. (klikk) S&amp;#xE5; deployer vi en ny applikasjon som er kompatibel med kun 5. Og s&amp;#xE5;nn g&amp;#xE5;r nu dagan.\n
  48. Her er et eksempel p&amp;#xE5; forskjellige typiske m&amp;#xF8;nstre for evolusjon av databaser og applikasjoner. Vi starter med database versjon 3. (klikk) S&amp;#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 (klikk). S&amp;#xE5; deployer vi en database som fungerer med forrige og neste versjon av applikasjonen - expansion (klikk). Deretter en applikasjon som er kompatibel med versjon pre 4 og 4. S&amp;#xE5; rydder vi opp og deployer den komplette versjon 4 - contraction. (klikk ) Neste applikasjon er kompatibel med b&amp;#xE5;de database 4 og den kommende versjon 5 (klikk). Vi migrerer versjon 5. (klikk) S&amp;#xE5; deployer vi en ny applikasjon som er kompatibel med kun 5. Og s&amp;#xE5;nn g&amp;#xE5;r nu dagan.\n
  49. Her er et eksempel p&amp;#xE5; forskjellige typiske m&amp;#xF8;nstre for evolusjon av databaser og applikasjoner. Vi starter med database versjon 3. (klikk) S&amp;#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 (klikk). S&amp;#xE5; deployer vi en database som fungerer med forrige og neste versjon av applikasjonen - expansion (klikk). Deretter en applikasjon som er kompatibel med versjon pre 4 og 4. S&amp;#xE5; rydder vi opp og deployer den komplette versjon 4 - contraction. (klikk ) Neste applikasjon er kompatibel med b&amp;#xE5;de database 4 og den kommende versjon 5 (klikk). Vi migrerer versjon 5. (klikk) S&amp;#xE5; deployer vi en ny applikasjon som er kompatibel med kun 5. Og s&amp;#xE5;nn g&amp;#xE5;r nu dagan.\n
  50. Vi bruker liquibase for &amp;#xE5; lage databaseskriptene v&amp;#xE5;re. (klikk)\n
  51. Liquibase er xml-basert, og n&amp;#xE5;r du kj&amp;#xF8;rer sier den for eksempel fra hvis du ikke har skrevet kode for roll-back. Den sier ogs&amp;#xE5; fra om noe er feil med skriptene dine f&amp;#xF8;r du pr&amp;#xF8;ver de mot databasen. Hver release tagges med versjonsnummer i metadata-tabeller i databasen og du kan rulle frem og tilbake mellom versjoner med en enkel kommando. Snedig! (klikk)\n
  52. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  53. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  54. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  55. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  56. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  57. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  58. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  59. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  60. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  61. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  62. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  63. S&amp;#xE5;; hva har vi sett? \n(klikk) Dersom du skal kunne si at du driver med Smidig, s&amp;#xE5; m&amp;#xE5; du levere kontinuerlig.\n(klikk) Du kan ikke levere kontinuerlig om du har nedetid.\n(klikk) Vi utviklere skal ikke si nei om forretning sier at noe skal i produksjon i l&amp;#xF8;pet av dagen eller enda raskere.\n(klikk) Prodsetting kan ikke v&amp;#xE6;re en tung prosess med masse manuelle steg.\n(klikk) Nedetidfri deploy kan relativt enkelt lages ved &amp;#xE5; (klikk) replikere sesjoner i databasen, (klikk) migrere databaseendringer som ikke bryter kompatibilitet med eksisterende eller ny versjon av applikasjonen, (klikk) meld ut en server av lastbalanserer-poolen, (klikk) og deploy til den ene serveren. (klikk) Gjenta for resten av serverne. (klikk) Rydd opp i databasen med migreringer som kan gj&amp;#xF8;res etter at den nye applikasjonen er produksjonssatt.\nOg selvf&amp;#xF8;lgelig. S&amp;#xF8;rg for &amp;#xE5; lage og teste rollback.\n
  64. Reklame for DevOps Norway\n
  65. \n