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).
8. 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 is
always 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/)
39. Stø
tte r
utv
ikli
ng
Teknologirettet
Forretningsrettet
Kri
tise
rer
p rod
u kte
t
40. Stø
tte r
utv
ikli
ng
Teknologirettet
Forretningsrettet
Kri
tise
rer
p rod
u kte
t
41. Forretningsrettet
t
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Teknologirettet
42. Forretningsrettet
t
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Integrasjonstester
Teknologirettet
43. Forretningsrettet
t
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Integrasjonstester
Infrastrukturtester
Teknologirettet
44. Forretningsrettet
Funksjonelle
akseptansetester
t
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Integrasjonstester
Infrastrukturtester
Teknologirettet
48. Given
When Akseptansekriterier
Then
Given /I have done x/ do
Akseptansetester
end
49. Given
When Akseptansekriterier
Then
Given /I have done x/ do
Akseptansetester
end
Kode
50. Forretningsrettet
Funksjonelle
akseptansetester
t
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Integrasjonstester
Infrastrukturtester
Teknologirettet
51. Forretningsrettet
Funksjonelle
akseptansetester
Brukbarhetstesting
t
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Integrasjonstester
Infrastrukturtester
Teknologirettet
52. Forretningsrettet
Funksjonelle Showcasing
akseptansetester
Brukbarhetstesting
t
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Integrasjonstester
Infrastrukturtester
Teknologirettet
53. Forretningsrettet
Funksjonelle Showcasing
akseptansetester
Brukbarhetstesting
t
Exploratory testing
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Integrasjonstester
Infrastrukturtester
Teknologirettet
54. Forretningsrettet
Funksjonelle Showcasing
akseptansetester
Brukbarhetstesting
t
Exploratory testing
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Kri
Integrasjonstester
Infrastrukturtester
Teknologirettet
55. Forretningsrettet
Funksjonelle Showcasing
akseptansetester
Brukbarhetstesting
t
Exploratory testing
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Ytelsestester
Kri
Integrasjonstester
Infrastrukturtester
Teknologirettet
56. Forretningsrettet
Funksjonelle Showcasing
akseptansetester
Brukbarhetstesting
t
Exploratory testing
kte
ng
u
ikli
rod
utv
p
rer
tte r
Unittester
tise
Stø
Ytelsestester
Kri
Integrasjonstester
Infrastrukturtester Sikkerhetstester
Teknologirettet
115. 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
end
end
123. #!/bin/bash
########################################
# The script checks if a server is down
# Sends an e-mail if they are.
# Install it as a cron-job.
app=webapp
app=/server/bekkopen/$app
hostname=`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.no
fi
129. 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);
}
}
140. @Component
public 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();
}
}
141. @Component
public 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, "/"));
}
}
142. @Autowired
public 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;
}
143. @Autowired
public 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
144. @Autowired
public 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
ctx.addEventListener(webContextListener); // add listener
145. @Autowired
public 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
ctx.addEventListener(webContextListener); // add listener
ServletHolder servletHolder = new ServletHolder(healthCheckServlet);
servletHolder.setName("healthCheck");
ctx.addServlet(new ServletHolder(healtCheckServlet), "/healtCheck.html"); // add servlet
147. EN BUNDLE SOM KAN DEPLOYES HVOR SOM HELST
En propertyfil som bundles med applikasjonen:
<miljo>.<servernavn>.min.property=true
148. 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.
149. 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.
150. 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.
151. 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
158. app v. 14
kompatibel med
db v. 3 og 4
db v. 3
deploy
app v. 14
TID
159. app v. 14
kompatibel med
db v. 3 og 4
db v. 3 db v. 4
deploy
app v. 14
migrer db v. 4
TID
160. app v. 14 app v. 15
kompatibel med kompatibel med
db v. 3 og 4 db v. 4
db v. 3 db v. 4
deploy deploy
app v. 14 app v. 15
migrer db v. 4
TID
161. 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. 4
db v. 3 db v. 4
deploy deploy deploy
app v. 14 app v. 15 app v. 16
migrer db v. 4
TID
162. 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 5
db 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
163. 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 5
db 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
164. 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. 5
db 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
165. 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;
167. <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>
176. Failover
Smidig Backup Sikkerhet
XP
Kanban Deployment Drift
Lean root-tilgang
DBA
Retrospekt Virtualisering/Cloud
Kunde DEV OPS Marked
Pakketering Overvåkning
TDD Automatisering Beredskap
Versjonskontroll Logging Audit
Konfigurasjonsstyring
177. Failover
Smidig Kontinuerlig leveranse Backup Sikkerhet
XP
Kanban Test Deployment Drift
Lean root-tilgang
Time to market Raskere feedback DBA
Retrospekt Virtualisering/Cloud
Kunde DEVOPS Marked
Pakketering Overvåkning
Kryssfunksjonalitet
TDD Automatisering Beredskap
Versjonskontroll Samarbeid Logging Audit
Infrastruktur som kode Konfigurasjonsstyring
178. 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 to
software that’s producing value - since
software only produces value when it’s
in production.
- Martin Fowler (http://martinfowler.com/delivery.html)
181. BYGG OG CI 98
Kontinuerlig integrasjon
Alle endringer trigger feedbackmekanismene
Deployment pipelines
182. KONFIGURASJONSSTYRING 99
Infrastruktur som kode (deklarativ)
Applikasjonen din er ikke infratruktur (imperativ)
183. DEPLOYRUTINER 100
Felles 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.
184. “LØS “ ARKITEKTUR OG ENKEL TEKNOLOGI 101
Enkelt å konfigurere.
Enkel å skripte mot.
Branch by abstraction.
185. PROSESS/ORGANISASJON 102
Pull-basert prosess
Alltid produksjonssettbar kode.
DevOps.
Selvorganisering tar tid - kontinuerlig forbedring.
186. Vår høyeste prioritet er å tilfredsstille kunden
gjennom tidlige og kontinuerlige leveranser
av programvare som har verdi.
187. y
DevO ps Norwa
November: Dan North
http://www.meetup.com/DevOps-Norway/
Notas do Editor
Jeg er Stein Inge og jeg er Sveinung. Vi skal snakke om en modell for &#xE5; finne ut av hvor man st&#xE5;r i forhold til &#xE5; levere kontinuerlig og hvilke grep man kan gj&#xF8;re for &#xE5; bedre ruste seg til &#xE5; kunne levere kontinuerlig. For kontinuerlige leveranser er i vinden om dagen, og det er noe vi er glad for. (slide: thoughtworks radar )\n
Thoughtworks har for eksempel kontinuerlig leveranse - og en rekke praksiser, verkt&#xF8;y og teknologier som underst&#xF8;tter det - p&#xE5; sin teknologiradar, og den er det mange som ser til. Thoughtworks ser det som en naturlig videreforedling av smidig. If you are wondering &#x201C;What comes after agile?,&#x201D; you should look towards continuous delivery. Veeeeeeel... (slide: 1. prinsipp)\n
Det er i og for seg ikke noe spesielt nytt med det &#xE5; levere kontinuerlig innen smidig. Det har hele tiden v&#xE6;rt meningen at man skal levere kontinuerlig n&#xE5;r man driver med smidig utvikling. Men, det har likevel ikke v&#xE6;rt s&#xE5; vanlig at man gj&#xF8;r det. Og det er rart.\n
&#xC5;rsaken til at det har blitt mer fokus p&#xE5; det n&#xE5;, har kanskje sammenheng med at den metodikken som har blitt r&#xE5;dende innen smidig - alts&#xE5; Scrum - ikke er optimalisert for &#xE5; levere kontinuerlig (klikk) - p&#xE5; grunn av timeboxing, estimering og releaseplaner - f&#xF8;r mini-fossefallet. (slide: par uker til et par m&#xE5;neder)\n
Og det er en setning i smidigmanifestet som ikke burde v&#xE6;rt der i utgangspunktet. (klikk) De burde skippet setningen i midten og holdt seg til &#x201C;Jo oftere, desto bedre&#x201D;. Det burde v&#xE6;re un&#xF8;dvendig &#xE5; spesifisere hvor lenge &#x201C;Jo oftere, desto bedre&#x201D; skal v&#xE6;re.\n
S&#xE5; hva handler egentlig kontinuerlige leveranser om? Jo; det handler i bunn og grunn om &#xE5; redusere ledetid fra id&#xE9; til produksjon. Med det s&#xE5; mener vi at forretning skal sitte i f&#xF8;rersetet og kunne bestemme hva og n&#xE5;r noe skal i produksjon. Og da mener vi ikke at forretning skal legge en plan om at noe skal i produksjon om 1 uke, 2 uker, 1 m&#xE5;ned eller om et halvt &#xE5;r. Nei da mener vi at kunden skal kunne si at han &#xF8;nsker en endring og f&#xE5; se det i produksjon i l&#xF8;pet av dagen eller enda kortere. Det er jo selvsagt urimelig noen ganger - det tar tross alt litt tid &#xE5; utvikle noe - men det betyr at forretning skal kunne se det i produksjon s&#xE5; snart noe er ferdig. Men det er alts&#xE5; ingen andre enn forretning - ikke drift, ikke virksomhetsarkitekten, ikke QA-avdelingen eller utviklingsteamet som skal bestemme n&#xE5;r prodsettingsdatoen skal v&#xE6;re. Og det skal v&#xE6;re s&#xE5; automatisert at prodsetting skal v&#xE6;re like enkelt som &#xE5; trykke p&#xE5; en knapp (slide: fungerende programvare)\n
Og det er en s&#xE5;nn knapp forretning &#xF8;nsker seg (slide: kanban).\n
For &#xE5; f&#xE5; til det m&#xE5; vi ha en pull-basert prosess. Vi kan ikke drive med masse planlegging i forkant, ikke bruke masse tid p&#xE5; &#xE5; estimere, ikke utvikle oppgaver i parallell - nei, vi m&#xE5; fokusere p&#xE5; den oppgaven som kunden har prioritert &#xE5; jobbe med akkurat n&#xE5;, og trekke den s&#xE5; fort og sikkert som mulig ut i produksjon (klikk). (slide: sisyfos)\n
Det sier seg selv at man ikke bare kan begynne med dette over natta om man ikke har en s&#xE5;nn prosess eller de riktige verkt&#xF8;yene og kvalitetssikringen p&#xE5; plass. V&#xE5;r erfaring er at det er lite hensiktsmessig, og til en viss grad sv&#xE6;rt farlig, &#xE5; fors&#xF8;ke &#xE5; f&#xE5; til dette i ett jafs. En mer fornuftig tiln&#xE6;rmingsm&#xE5;te er &#xE5; bygge stein for stein basert p&#xE5; tilstanden man befinner seg i, og gradvis forbedre situasjonen. Det fine er at hver ting du gj&#xF8;r gir stor verdi i seg selv, s&#xE5; man m&#xE5; ikke gj&#xF8;re alt med en gang. Det er ulikt mange andre smidigrammeverk som sier at; om du ikke gj&#xF8;r alt, s&#xE5; er det ikke rart at du feiler.\n
Man m&#xE5; alts&#xE5; finne ut av hva situasjonen er i dag. Om man kryper. S&#xE5; m&#xE5; man l&#xE6;re seg &#xE5; krabbe (slide: krabbe) f&#xF8;r man kan g&#xE5; (slide: g&#xE5;). Og g&#xE5;, f&#xF8;r man kan rock! (djeveltegn)\n
Man m&#xE5; alts&#xE5; finne ut av hva situasjonen er i dag. Om man kryper. S&#xE5; m&#xE5; man l&#xE6;re seg &#xE5; krabbe (slide: krabbe) f&#xF8;r man kan g&#xE5; (slide: g&#xE5;). Og g&#xE5;, f&#xF8;r man kan rock! (djeveltegn)\n
Man m&#xE5; alts&#xE5; finne ut av hva situasjonen er i dag. Om man kryper. S&#xE5; m&#xE5; man l&#xE6;re seg &#xE5; krabbe (slide: krabbe) f&#xF8;r man kan g&#xE5; (slide: g&#xE5;). Og g&#xE5;, f&#xF8;r man kan rock! (djeveltegn)\n
Man m&#xE5; alts&#xE5; finne ut av hva situasjonen er i dag. Om man kryper. S&#xE5; m&#xE5; man l&#xE6;re seg &#xE5; krabbe (slide: krabbe) f&#xF8;r man kan g&#xE5; (slide: g&#xE5;). Og g&#xE5;, f&#xF8;r man kan rock! (djeveltegn)\n
Man m&#xE5; alts&#xE5; finne ut av hva situasjonen er i dag. Om man kryper. S&#xE5; m&#xE5; man l&#xE6;re seg &#xE5; krabbe (slide: krabbe) f&#xF8;r man kan g&#xE5; (slide: g&#xE5;). Og g&#xE5;, f&#xF8;r man kan rock! (djeveltegn)\n
Man m&#xE5; alts&#xE5; finne ut av hva situasjonen er i dag. Om man kryper. S&#xE5; m&#xE5; man l&#xE6;re seg &#xE5; krabbe (slide: krabbe) f&#xF8;r man kan g&#xE5; (slide: g&#xE5;). Og g&#xE5;, f&#xF8;r man kan rock! (djeveltegn)\n
I BEKK sin faggruppe for kontinuerlige leveranser og DevOps har vi laget en modenhetsmodell. Den inneholder teknikker og verkt&#xF8;y hvor man kan plassere seg selv, og finne ut av hvor man st&#xE5;r i dag. Innover i modellen finner man tiltak som gj&#xF8;r at du stadig forbedrer deg. Vi kan &#xE6;rlig innr&#xF8;mme at vi ikke har noen prosjekter i dag som alene har implementert alle stegene... Det vi skal presentere er erfaringer med s&#xE5; og si alle stegene i modellen, s&#xE5; det er litt av hvert. De 4 niv&#xE5;ene i modellen er: store utfordringer (krype), baseline (krabbe), medium (g&#xE5;) og avansert (rock!). Dersom du har store utfordringer, s&#xE5; er det viktigste &#xE5; bevege seg derfra og til baseline. Eksempler p&#xE5; store problemer er (klikk) manuelle rutiner for bygging og manglende artefaktrepository, (klikk) manuell konfigurasjon i hvert milj&#xF8; og p&#xE5; hver server, (klikk) manuell deploy og databasemigrering, (klikk) testing mot slutten og at utviklere ikke tester selv, og at du har en testavdeling, (klikk) store enterprise-produkter som skal l&#xF8;se alle problemer (klikk) silo-organisasjon hvor folk ikke sitter sammen, sjeldne prodsettinger og utviklere som ikke har tilgang p&#xE5; produksjonslogger.(slide: med uthevet det vi vil se p&#xE5;):\n
I BEKK sin faggruppe for kontinuerlige leveranser og DevOps har vi laget en modenhetsmodell. Den inneholder teknikker og verkt&#xF8;y hvor man kan plassere seg selv, og finne ut av hvor man st&#xE5;r i dag. Innover i modellen finner man tiltak som gj&#xF8;r at du stadig forbedrer deg. Vi kan &#xE6;rlig innr&#xF8;mme at vi ikke har noen prosjekter i dag som alene har implementert alle stegene... Det vi skal presentere er erfaringer med s&#xE5; og si alle stegene i modellen, s&#xE5; det er litt av hvert. De 4 niv&#xE5;ene i modellen er: store utfordringer (krype), baseline (krabbe), medium (g&#xE5;) og avansert (rock!). Dersom du har store utfordringer, s&#xE5; er det viktigste &#xE5; bevege seg derfra og til baseline. Eksempler p&#xE5; store problemer er (klikk) manuelle rutiner for bygging og manglende artefaktrepository, (klikk) manuell konfigurasjon i hvert milj&#xF8; og p&#xE5; hver server, (klikk) manuell deploy og databasemigrering, (klikk) testing mot slutten og at utviklere ikke tester selv, og at du har en testavdeling, (klikk) store enterprise-produkter som skal l&#xF8;se alle problemer (klikk) silo-organisasjon hvor folk ikke sitter sammen, sjeldne prodsettinger og utviklere som ikke har tilgang p&#xE5; produksjonslogger.(slide: med uthevet det vi vil se p&#xE5;):\n
I BEKK sin faggruppe for kontinuerlige leveranser og DevOps har vi laget en modenhetsmodell. Den inneholder teknikker og verkt&#xF8;y hvor man kan plassere seg selv, og finne ut av hvor man st&#xE5;r i dag. Innover i modellen finner man tiltak som gj&#xF8;r at du stadig forbedrer deg. Vi kan &#xE6;rlig innr&#xF8;mme at vi ikke har noen prosjekter i dag som alene har implementert alle stegene... Det vi skal presentere er erfaringer med s&#xE5; og si alle stegene i modellen, s&#xE5; det er litt av hvert. De 4 niv&#xE5;ene i modellen er: store utfordringer (krype), baseline (krabbe), medium (g&#xE5;) og avansert (rock!). Dersom du har store utfordringer, s&#xE5; er det viktigste &#xE5; bevege seg derfra og til baseline. Eksempler p&#xE5; store problemer er (klikk) manuelle rutiner for bygging og manglende artefaktrepository, (klikk) manuell konfigurasjon i hvert milj&#xF8; og p&#xE5; hver server, (klikk) manuell deploy og databasemigrering, (klikk) testing mot slutten og at utviklere ikke tester selv, og at du har en testavdeling, (klikk) store enterprise-produkter som skal l&#xF8;se alle problemer (klikk) silo-organisasjon hvor folk ikke sitter sammen, sjeldne prodsettinger og utviklere som ikke har tilgang p&#xE5; produksjonslogger.(slide: med uthevet det vi vil se p&#xE5;):\n
I BEKK sin faggruppe for kontinuerlige leveranser og DevOps har vi laget en modenhetsmodell. Den inneholder teknikker og verkt&#xF8;y hvor man kan plassere seg selv, og finne ut av hvor man st&#xE5;r i dag. Innover i modellen finner man tiltak som gj&#xF8;r at du stadig forbedrer deg. Vi kan &#xE6;rlig innr&#xF8;mme at vi ikke har noen prosjekter i dag som alene har implementert alle stegene... Det vi skal presentere er erfaringer med s&#xE5; og si alle stegene i modellen, s&#xE5; det er litt av hvert. De 4 niv&#xE5;ene i modellen er: store utfordringer (krype), baseline (krabbe), medium (g&#xE5;) og avansert (rock!). Dersom du har store utfordringer, s&#xE5; er det viktigste &#xE5; bevege seg derfra og til baseline. Eksempler p&#xE5; store problemer er (klikk) manuelle rutiner for bygging og manglende artefaktrepository, (klikk) manuell konfigurasjon i hvert milj&#xF8; og p&#xE5; hver server, (klikk) manuell deploy og databasemigrering, (klikk) testing mot slutten og at utviklere ikke tester selv, og at du har en testavdeling, (klikk) store enterprise-produkter som skal l&#xF8;se alle problemer (klikk) silo-organisasjon hvor folk ikke sitter sammen, sjeldne prodsettinger og utviklere som ikke har tilgang p&#xE5; produksjonslogger.(slide: med uthevet det vi vil se p&#xE5;):\n
I BEKK sin faggruppe for kontinuerlige leveranser og DevOps har vi laget en modenhetsmodell. Den inneholder teknikker og verkt&#xF8;y hvor man kan plassere seg selv, og finne ut av hvor man st&#xE5;r i dag. Innover i modellen finner man tiltak som gj&#xF8;r at du stadig forbedrer deg. Vi kan &#xE6;rlig innr&#xF8;mme at vi ikke har noen prosjekter i dag som alene har implementert alle stegene... Det vi skal presentere er erfaringer med s&#xE5; og si alle stegene i modellen, s&#xE5; det er litt av hvert. De 4 niv&#xE5;ene i modellen er: store utfordringer (krype), baseline (krabbe), medium (g&#xE5;) og avansert (rock!). Dersom du har store utfordringer, s&#xE5; er det viktigste &#xE5; bevege seg derfra og til baseline. Eksempler p&#xE5; store problemer er (klikk) manuelle rutiner for bygging og manglende artefaktrepository, (klikk) manuell konfigurasjon i hvert milj&#xF8; og p&#xE5; hver server, (klikk) manuell deploy og databasemigrering, (klikk) testing mot slutten og at utviklere ikke tester selv, og at du har en testavdeling, (klikk) store enterprise-produkter som skal l&#xF8;se alle problemer (klikk) silo-organisasjon hvor folk ikke sitter sammen, sjeldne prodsettinger og utviklere som ikke har tilgang p&#xE5; produksjonslogger.(slide: med uthevet det vi vil se p&#xE5;):\n
I BEKK sin faggruppe for kontinuerlige leveranser og DevOps har vi laget en modenhetsmodell. Den inneholder teknikker og verkt&#xF8;y hvor man kan plassere seg selv, og finne ut av hvor man st&#xE5;r i dag. Innover i modellen finner man tiltak som gj&#xF8;r at du stadig forbedrer deg. Vi kan &#xE6;rlig innr&#xF8;mme at vi ikke har noen prosjekter i dag som alene har implementert alle stegene... Det vi skal presentere er erfaringer med s&#xE5; og si alle stegene i modellen, s&#xE5; det er litt av hvert. De 4 niv&#xE5;ene i modellen er: store utfordringer (krype), baseline (krabbe), medium (g&#xE5;) og avansert (rock!). Dersom du har store utfordringer, s&#xE5; er det viktigste &#xE5; bevege seg derfra og til baseline. Eksempler p&#xE5; store problemer er (klikk) manuelle rutiner for bygging og manglende artefaktrepository, (klikk) manuell konfigurasjon i hvert milj&#xF8; og p&#xE5; hver server, (klikk) manuell deploy og databasemigrering, (klikk) testing mot slutten og at utviklere ikke tester selv, og at du har en testavdeling, (klikk) store enterprise-produkter som skal l&#xF8;se alle problemer (klikk) silo-organisasjon hvor folk ikke sitter sammen, sjeldne prodsettinger og utviklere som ikke har tilgang p&#xE5; produksjonslogger.(slide: med uthevet det vi vil se p&#xE5;):\n
Vi vil se p&#xE5; build/deployment pipelines og kontinuerlig integrasjon, (klikk) Infrastruktur som kode og kontroll p&#xE5; applikasjonskonfigurasjon, (klikk) One-click deploy, automatisert deploy og deploy uten nedetid (klikk) Vi vil snakke om testing. (klikk) Vi skal snakke om l&#xF8;s arkitektur og enkel teknologi, (klikk) Og pull-basert prosess har vi allerede snakket om, men vi skal ogs&#xE5; snakke litt om selvorganiserte team og DevOps. Det f&#xF8;rste vi skal snakke om (klikk)\n
Vi vil se p&#xE5; build/deployment pipelines og kontinuerlig integrasjon, (klikk) Infrastruktur som kode og kontroll p&#xE5; applikasjonskonfigurasjon, (klikk) One-click deploy, automatisert deploy og deploy uten nedetid (klikk) Vi vil snakke om testing. (klikk) Vi skal snakke om l&#xF8;s arkitektur og enkel teknologi, (klikk) Og pull-basert prosess har vi allerede snakket om, men vi skal ogs&#xE5; snakke litt om selvorganiserte team og DevOps. Det f&#xF8;rste vi skal snakke om (klikk)\n
Vi vil se p&#xE5; build/deployment pipelines og kontinuerlig integrasjon, (klikk) Infrastruktur som kode og kontroll p&#xE5; applikasjonskonfigurasjon, (klikk) One-click deploy, automatisert deploy og deploy uten nedetid (klikk) Vi vil snakke om testing. (klikk) Vi skal snakke om l&#xF8;s arkitektur og enkel teknologi, (klikk) Og pull-basert prosess har vi allerede snakket om, men vi skal ogs&#xE5; snakke litt om selvorganiserte team og DevOps. Det f&#xF8;rste vi skal snakke om (klikk)\n
Vi vil se p&#xE5; build/deployment pipelines og kontinuerlig integrasjon, (klikk) Infrastruktur som kode og kontroll p&#xE5; applikasjonskonfigurasjon, (klikk) One-click deploy, automatisert deploy og deploy uten nedetid (klikk) Vi vil snakke om testing. (klikk) Vi skal snakke om l&#xF8;s arkitektur og enkel teknologi, (klikk) Og pull-basert prosess har vi allerede snakket om, men vi skal ogs&#xE5; snakke litt om selvorganiserte team og DevOps. Det f&#xF8;rste vi skal snakke om (klikk)\n
Vi vil se p&#xE5; build/deployment pipelines og kontinuerlig integrasjon, (klikk) Infrastruktur som kode og kontroll p&#xE5; applikasjonskonfigurasjon, (klikk) One-click deploy, automatisert deploy og deploy uten nedetid (klikk) Vi vil snakke om testing. (klikk) Vi skal snakke om l&#xF8;s arkitektur og enkel teknologi, (klikk) Og pull-basert prosess har vi allerede snakket om, men vi skal ogs&#xE5; snakke litt om selvorganiserte team og DevOps. Det f&#xF8;rste vi skal snakke om (klikk)\n
Vi vil se p&#xE5; build/deployment pipelines og kontinuerlig integrasjon, (klikk) Infrastruktur som kode og kontroll p&#xE5; applikasjonskonfigurasjon, (klikk) One-click deploy, automatisert deploy og deploy uten nedetid (klikk) Vi vil snakke om testing. (klikk) Vi skal snakke om l&#xF8;s arkitektur og enkel teknologi, (klikk) Og pull-basert prosess har vi allerede snakket om, men vi skal ogs&#xE5; snakke litt om selvorganiserte team og DevOps. Det f&#xF8;rste vi skal snakke om (klikk)\n
er kvalitetssikring. (bytte)\n\nN&#xE5;r man produksjonssetter st&#xF8;tt og stadig, s&#xE5; er det viktig &#xE5; v&#xE6;re sikker p&#xE5; at en gitt releasekandidat holder m&#xE5;l.\n
er kvalitetssikring. (bytte)\n\nN&#xE5;r man produksjonssetter st&#xF8;tt og stadig, s&#xE5; er det viktig &#xE5; v&#xE6;re sikker p&#xE5; at en gitt releasekandidat holder m&#xE5;l.\n
er kvalitetssikring. (bytte)\n\nN&#xE5;r man produksjonssetter st&#xF8;tt og stadig, s&#xE5; er det viktig &#xE5; v&#xE6;re sikker p&#xE5; at en gitt releasekandidat holder m&#xE5;l.\n
Derfor er det viktig at alt av testing blir gjort kontinuerlig, for &#xE5; kunne avdekke feil s&#xE5; hyppig, og tidlig, som mulig.\nDette b&#xF8;r gjelde for alle typer tester som er relevante for prosjektet.\n
Brian Marick deler tester inn i 4 kvadranter:\nDen nedre halvdelen er teknologiretta (verifiserer koden), den &#xF8;vre forretningsretta (verifiserer funksjonelle krav).\nDen venster halvdelen st&#xF8;tter opp under utvikling, den h&#xF8;yre kontrollerer at produktet virkelig leverer det som trengs.\n
Brian Marick deler tester inn i 4 kvadranter:\nDen nedre halvdelen er teknologiretta (verifiserer koden), den &#xF8;vre forretningsretta (verifiserer funksjonelle krav).\nDen venster halvdelen st&#xF8;tter opp under utvikling, den h&#xF8;yre kontrollerer at produktet virkelig leverer det som trengs.\n
Brian Marick deler tester inn i 4 kvadranter:\nDen nedre halvdelen er teknologiretta (verifiserer koden), den &#xF8;vre forretningsretta (verifiserer funksjonelle krav).\nDen venster halvdelen st&#xF8;tter opp under utvikling, den h&#xF8;yre kontrollerer at produktet virkelig leverer det som trengs.\n
Brian Marick deler tester inn i 4 kvadranter:\nDen nedre halvdelen er teknologiretta (verifiserer koden), den &#xF8;vre forretningsretta (verifiserer funksjonelle krav).\nDen venster halvdelen st&#xF8;tter opp under utvikling, den h&#xF8;yre kontrollerer at produktet virkelig leverer det som trengs.\n
De f&#xF8;rste er kjent for de fleste, vi bruker (klikk) unit- og (klikk) integrasjonstester for &#xE5; sikre at appene v&#xE5;re holder m&#xE5;l p&#xE5; et lavt niv&#xE5;, og til &#xE5; drive utviklingen. Da gjennom TDD.\n(klikk) En applikasjon st&#xE5;r sjelden alene, og har en varierende mengde med infrastruktur den avhenger av, som f.eks. apache, database-server o.l. Stein Inge skal snakke om infrastruktur som kode etterp&#xE5;, og testing av denne. Ein b&#xF8;r ogs&#xE5; smoketeste at all infrastrukturen er p&#xE5; plass i test og etter produksjonssetting.\n
De f&#xF8;rste er kjent for de fleste, vi bruker (klikk) unit- og (klikk) integrasjonstester for &#xE5; sikre at appene v&#xE5;re holder m&#xE5;l p&#xE5; et lavt niv&#xE5;, og til &#xE5; drive utviklingen. Da gjennom TDD.\n(klikk) En applikasjon st&#xE5;r sjelden alene, og har en varierende mengde med infrastruktur den avhenger av, som f.eks. apache, database-server o.l. Stein Inge skal snakke om infrastruktur som kode etterp&#xE5;, og testing av denne. Ein b&#xF8;r ogs&#xE5; smoketeste at all infrastrukturen er p&#xE5; plass i test og etter produksjonssetting.\n
De f&#xF8;rste er kjent for de fleste, vi bruker (klikk) unit- og (klikk) integrasjonstester for &#xE5; sikre at appene v&#xE5;re holder m&#xE5;l p&#xE5; et lavt niv&#xE5;, og til &#xE5; drive utviklingen. Da gjennom TDD.\n(klikk) En applikasjon st&#xE5;r sjelden alene, og har en varierende mengde med infrastruktur den avhenger av, som f.eks. apache, database-server o.l. Stein Inge skal snakke om infrastruktur som kode etterp&#xE5;, og testing av denne. Ein b&#xF8;r ogs&#xE5; smoketeste at all infrastrukturen er p&#xE5; plass i test og etter produksjonssetting.\n
N&#xE5;r man leverer til produksjon st&#xF8;tt og stadig, er det viktig &#xE5; vere sikker p&#xE5; at produktet alltid gj&#xF8;r det forretning forventer at det skal gj&#xF8;re. Derfor trenger vi ogs&#xE5; et sett med funksjonelle akseptansetester.\n
Funksjonelle akseptansetester b&#xF8;r ha sitt grunnlag i godt samarbeid. For &#xE5; unng&#xE5; at forretning, testere, drift og utviklere har ulik forst&#xE5;else av hva som skal lages, b&#xF8;r alle interessenter sitte sammen til rett tid. Alle b&#xF8;r v&#xE6;re, og f&#xF8;le seg som, del av ett og samme team, selv om de har ulike spesialiseringer.\n
F.eks. kan f&#xF8;lgende prosess brukes:\nI all hovedsak er det forretning og testere som spesifiserer akseptansekriterier sammen, men det kan ogs&#xE5; v&#xE6;re driftere eller utviklere som b&#xF8;r involveres dersom det er snakk om infrastruktur og/eller tekniske krav.\n\nDeretter b&#xF8;r testeren og utvikleren, eventuelt drifteren, ilag skrive automatiserte tester\n\nog til slutt kan utvikleren og/eller drift implementere funksjonaliteten.\n
F.eks. kan f&#xF8;lgende prosess brukes:\nI all hovedsak er det forretning og testere som spesifiserer akseptansekriterier sammen, men det kan ogs&#xE5; v&#xE6;re driftere eller utviklere som b&#xF8;r involveres dersom det er snakk om infrastruktur og/eller tekniske krav.\n\nDeretter b&#xF8;r testeren og utvikleren, eventuelt drifteren, ilag skrive automatiserte tester\n\nog til slutt kan utvikleren og/eller drift implementere funksjonaliteten.\n
F.eks. kan f&#xF8;lgende prosess brukes:\nI all hovedsak er det forretning og testere som spesifiserer akseptansekriterier sammen, men det kan ogs&#xE5; v&#xE6;re driftere eller utviklere som b&#xF8;r involveres dersom det er snakk om infrastruktur og/eller tekniske krav.\n\nDeretter b&#xF8;r testeren og utvikleren, eventuelt drifteren, ilag skrive automatiserte tester\n\nog til slutt kan utvikleren og/eller drift implementere funksjonaliteten.\n
S&#xE5; har vi brukbarhetstesting (klikk). N&#xE5;r man leverer kontinuerlig og itererativt kan man gj&#xF8;re dette i produksjon. Det er meningen at man skal levere noe som gir forretningsverdi s&#xE5; fort som mulig, og gradvis forbedre funksjonaliteten. Det finnes ikke noe bedre enn &#xE5; teste brukbarhet p&#xE5; reelle brukere. Dette har vi sett at det ofte syndes mot, for eksempel i Scrum, da man anser en brukerhistorie som helt ferdig n&#xE5;r den er i produksjon.\n\nI tillegg har vi showcasing (klikk), som kan v&#xE6;re et godt verkt&#xF8;y for &#xE5; verifisere at forretning virkelig er tilfreds med det som skal ut i produksjon.\nDet kan framleis skje at bugs oppst&#xE5;r ved reell bruk (klikk), derfor b&#xF8;r vi framleis benytte oss av exploratory testing til &#xE5; avdekke feilscenarier vi ikke har tenkt p&#xE5;.\nTestene i denne kvadranten er s&#xE5;ledes til for &#xE5; kontrollere at vi produserer det brukeren virkelig trenger. Til sammenlikning kontrollerer funksjonelle akseptansetester at vi leverer det forretning forventer.\n
S&#xE5; har vi brukbarhetstesting (klikk). N&#xE5;r man leverer kontinuerlig og itererativt kan man gj&#xF8;re dette i produksjon. Det er meningen at man skal levere noe som gir forretningsverdi s&#xE5; fort som mulig, og gradvis forbedre funksjonaliteten. Det finnes ikke noe bedre enn &#xE5; teste brukbarhet p&#xE5; reelle brukere. Dette har vi sett at det ofte syndes mot, for eksempel i Scrum, da man anser en brukerhistorie som helt ferdig n&#xE5;r den er i produksjon.\n\nI tillegg har vi showcasing (klikk), som kan v&#xE6;re et godt verkt&#xF8;y for &#xE5; verifisere at forretning virkelig er tilfreds med det som skal ut i produksjon.\nDet kan framleis skje at bugs oppst&#xE5;r ved reell bruk (klikk), derfor b&#xF8;r vi framleis benytte oss av exploratory testing til &#xE5; avdekke feilscenarier vi ikke har tenkt p&#xE5;.\nTestene i denne kvadranten er s&#xE5;ledes til for &#xE5; kontrollere at vi produserer det brukeren virkelig trenger. Til sammenlikning kontrollerer funksjonelle akseptansetester at vi leverer det forretning forventer.\n
S&#xE5; har vi brukbarhetstesting (klikk). N&#xE5;r man leverer kontinuerlig og itererativt kan man gj&#xF8;re dette i produksjon. Det er meningen at man skal levere noe som gir forretningsverdi s&#xE5; fort som mulig, og gradvis forbedre funksjonaliteten. Det finnes ikke noe bedre enn &#xE5; teste brukbarhet p&#xE5; reelle brukere. Dette har vi sett at det ofte syndes mot, for eksempel i Scrum, da man anser en brukerhistorie som helt ferdig n&#xE5;r den er i produksjon.\n\nI tillegg har vi showcasing (klikk), som kan v&#xE6;re et godt verkt&#xF8;y for &#xE5; verifisere at forretning virkelig er tilfreds med det som skal ut i produksjon.\nDet kan framleis skje at bugs oppst&#xE5;r ved reell bruk (klikk), derfor b&#xF8;r vi framleis benytte oss av exploratory testing til &#xE5; avdekke feilscenarier vi ikke har tenkt p&#xE5;.\nTestene i denne kvadranten er s&#xE5;ledes til for &#xE5; kontrollere at vi produserer det brukeren virkelig trenger. Til sammenlikning kontrollerer funksjonelle akseptansetester at vi leverer det forretning forventer.\n
I siste kvadrant har vi de testene som oftest blir fors&#xF8;mt, iallefall i &#xE5; bli gjort kontinuerlig.\nNemlig (klikk) ytelsestester og (klikk) sikkerhetstester. Iallefall ytelsestester kan med gevinst automatiseres og gj&#xF8;res med faste intervall, for p&#xE5; den m&#xE5;ten lettere se hvordan ytelsen utvikler seg over tid.\n
I siste kvadrant har vi de testene som oftest blir fors&#xF8;mt, iallefall i &#xE5; bli gjort kontinuerlig.\nNemlig (klikk) ytelsestester og (klikk) sikkerhetstester. Iallefall ytelsestester kan med gevinst automatiseres og gj&#xF8;res med faste intervall, for p&#xE5; den m&#xE5;ten lettere se hvordan ytelsen utvikler seg over tid.\n
Hvem b&#xF8;r teste? I utganspunktet alle, men n&#xE5;r man leverer kontinuerlig har vi ikke tid til tunge testprosesser. Det er heller ikke n&#xF8;dvendig fordi vi leverer lite funksjonalitet hver gang vi prodsetter. Ergo er det lite &#xE5; teste. Man b&#xF8;r f&#xE5; akseptanse fra forretning, men dette kan v&#xE6;re noks&#xE5; uformelt ved at en utvikler viser det han har laget p&#xE5; sin maskin. Dersom det er snakk om driftsting b&#xF8;r utviklere teste sammen med driftere. Ellers er det ingenting i veien for at utviklerne tester selv. Helst ved at det er noen andre enn den som har utviklet oppgaven som g&#xE5;r gjennom og tester.\n
Kontinuerlig integrasjon har allerede blitt pratet mye om opp gjennom &#xE5;rene, s&#xE5; det er lite nytt for oss &#xE5; si.\n\nMen det som skal sies: er at skal du levere kontinuerlig, m&#xE5; du ogs&#xE5; integrere minst like kontinuerlig.\n\nDet nytter ikke &#xE5; ha flere features klare til produksjon, n&#xE5;r de ikke er til stede i den samme releasekandidaten.\n\nNoken gode praksiser &#xE5; f&#xE5; med seg er &#xE5; ikke godta feilende bygg, men &#xE5; fikse opp i de med en gang, og at kontinuerlig integrasjon er en praksis, ikke et verkt&#xF8;y.\n
N&#xE5; skal jeg snakke litt om build/deployment pipelines og kontinuerlig integrasjon.\n
N&#xE5; skal jeg snakke litt om build/deployment pipelines og kontinuerlig integrasjon.\n
N&#xE5; skal jeg snakke litt om build/deployment pipelines og kontinuerlig integrasjon.\n
Deployment pipelinen er Kontinuerlig integrasjon tatt ett skritt lenger\n\nog er en m&#xE5;te &#xE5; sikre seg at koden alltid er produksjonssettbar, og at du bygger kvalitet inn i prosessen i stedet for &#xE5; verifisere kvalitet etter at utvikling er &#x201C;ferdig&#x201D;.\n\nPipelinen best&#xE5;r av ei rekke med steg som begynner med at man sjekker inn en endring I versjonskontroll. Det er viktig &#xE5; merke seg at alle endringer b&#xF8;r trigge pipelinen &#x2013; ogs&#xE5; endringer i konfigurasjon.\n\nRekkef&#xF8;lgen p&#xE5; stegene er ikke alltid s&#xE5; viktig, og b&#xF8;r ofte formes etter behov. Det er ikke sikkert at man trenger &#xE5; innf&#xF8;re alle stega engang.\n\nFor at ein deployment pipeline skal gi mening trenger den noe infrastruktur rundt seg:\nsom for eksempel det mest selvsagte, et versjonskontrollsystem, til kildekoden og konfigurasjonsdata,\nog et artefakt repository, til lagring av bin&#xE6;rfiler, testrapporter og ymse metadata det skulle v&#xE6;re behov for.\n
Trigget hver gang en utvikler gj&#xF8;r en check in til VC\n\nKompilerer,\nkj&#xF8;rer unittester,\nog eventuelt kodeanalyse\n\nOg pakketerer til slutt kandidaten slik at den er klar til deploy. Det skal v&#xE6;re den samme kandidaten som g&#xE5;r gjennom hele pipelinen (uten &#xE5; bygge p&#xE5; nytt), slik at vi vet at kandidaten som passerte UAT er den samme som passerte commit steget.\n
Deployer bin&#xE6;rfilene fra forrige steg\n\nKj&#xF8;rer akseptansetestane mot installasjonen\n
P&#xE5; samme m&#xE5;te som akseptansesteget vil dette steget deploye bin&#xE6;rfilene fra commit-steget, konfigurere milj&#xF8;et og kj&#xF8;re testene automatisk.\n\nForskjellen er at det her kan v&#xE6;re hensiktsmessig at det er teamet selv som bestemmer om kandidaten kommer videre I prosessen.\n
N&#xE5;r det kommer til UAT kan testerene selv trigge en deploy til et testmilj&#xF8;, og deretter bestemme om releasekandidaten f&#xE5;r lov til &#xE5; g&#xE5; videre I pipelinen.\n
N&#xE5;r alle forg&#xE5;ende steg er aksepterte kan kandidaten dyttes ut I produksjon med et tastetrykk.\n\nEn deployment pipeline er s&#xE5;ledes en m&#xE5;te &#xE5; forsikre oss om at en releasekandidat virkelig holder m&#xE5;l f&#xF8;r vi eventuelt produksjonssetter den.\n
For &#xE5; lage en Deployment pipeline trengs det knapt mer enn en egen server som kj&#xF8;rer for eksempel Jenkins\n
P&#xE5; SpareBank1 begynte vi med et helt vanlig maven-bygg satt opp I jenkins, som som vanlig ble trigget hver gang vi pushet kode.\n
Om koden kompilerte, og testene passerte, ble det bygget en RPM som ble lagt p&#xE5; en felles tjener (et slags artefaktrepository med andre ord).\n
Et jenkinsbygg kan ogs&#xE5; konfigureres til &#xE5; trigge et annet bygg, dersom bygget g&#xE5;r bra.\n\nI v&#xE5;rt tilfelle satte vi opp et bygg med et bash-skript som tok RPMen, og installerte den p&#xE5; en testtjener.\n\nMerk at det I dette tilfellet lett kan dyttast p&#xE5; med fleire liknande steg, om det skulle vere &#xF8;nskeleg &#xE5; ha ein testtjenar dedikert til testarane, og ein til utviklarane\n
Som et ekstra sikkerhetsnett hadde vi ogs&#xE5; et jenkinsbygg med smoketester som kj&#xF8;rte ved jevne mellomrom.\n\nI stedet for &#xE5; bli trigget av en commit, tok dette bygget ved midnatt &#xE5; installerte den nyeste RPMen p&#xE5; en dedikert testtjener, kj&#xF8;rte opp applikasjonen, og kj&#xF8;rte smoketestene. I v&#xE5;rt tilfelle en suite av WebDriver-tester.\n\nDette er bare en m&#xE5;te &#xE5; lage en enkel deployment pipeline p&#xE5;. Det finst plugins for &#xE5; gj&#xF8;re mye av det samme, iallefall for jenkins, men sikkert ogs&#xE5; for andre systemer.\n
Et av poengene med &#xE5; drive med kontinuerlige leveranser er at man skal f&#xE5; feedback p&#xE5; det man gj&#xF8;r s&#xE5; tidlig som mulig. Mest for &#xE5; sikre at man jobber med s&#xE5; lite overhead som mulig.\n\nFeedbacken gjelder alle testfaser: unittesting, integrasjonstesting, akseptansetesting, og ogs&#xE5; fra brukerene. \n\nEn hindring som ofte kommer I vegen for dette er at man I mange tilfeller vil kontrollere tidspunktet en feature blir gjort synlig for brukerene. Uferdige features som ligger I produksjon kan selvsagt vere en stor risiko for sikkerhet og omd&#xF8;mme.\n
Den tradisjonelle m&#xE5;ten &#xE5; gjere dette p&#xE5; har vore ved &#xE5; nytte feature branching. Ofte ein branch per feature som m&#xE5; kunne leverast separat.\n\nS&#xE5; lenge ein jobber p&#xE5; f&#xE5; features om gangen, teamet er godt samlokalisert, og levetida p&#xE5; kvar branch er kort, s&#xE5; fungerer igrunn feature branching bra nok.\n\nDigipost er eit godt d&#xF8;me p&#xE5; dette.\n\nDet ultimate er n&#xE5;r du berre jobber p&#xE5; ein ting I gongen. D&#xE5; blir I praksis dev-branchen mainline, og ei utrulling berre ei oppdatering av master utan noko som helst form for merge.\n
Men etter kvart som desse to talet p&#xE5; features under utvikling auker, og levetida deira blir lengre, aukar ogs&#xE5; overheaden.\n\nDen mest sj&#xF8;lvsagte overheaden er merging. Om ein gitt branch lever separert lenge nok kan den uunng&#xE5;elige mergen til slutt ta veldig lang tid\n\neg har sj&#xF8;lv vore borti tilfeller p&#xE5; oppmot 3 veker.\n
- I s&#xE5;nne tilfeller kan feature toggles hjelpe oss.\n- Ein feature toggle er til sjuande og sist ein &#x201C;if&#x201D; og ei linje med konfigurasjon som seier &#x201C;av&#x201D; eller &#x201C;p&#xE5;&#x201D;.\n- Med denne teknikken kan me bruke koden sj&#xF8;lv til &#xE5; kontrollere om ein gitt feature er aktiv eller ikkje i eit gitt milj&#xF8;\n- Dette er ofte mest hensiktsmessig under utvikling, der featuren er aktiv i testmilj&#xF8;et, men inaktiv i prod.\n- Etter at featuren er ferdig utvikla, er det sjeldan nokon grunn til &#xE5; spare p&#xE5; den lenger, s&#xE5; det kan vere &#xF8;nskeleg &#xE5; fjerne den, d&#xE5; den d&#xE5; berre er ekstra kompleksitet.\n- \n
Feature toggles kan ogs&#xE5; vere til hjelp om me driv med A/B-testing. D&#xE5; s&#xF8;rger me berre for at eit subset av brukarane g&#xE5;r mot ein feature, medan eit anna subset g&#xE5;r mot ein alternativ feature.\n\nDet kan ogs&#xE5; vere at me har lyst til &#xE5; begrense ein release av ein feature til eit subset av kundane v&#xE5;re, iallefall i starten, til me er sikre p&#xE5; at alt er som det skal vere.\n
Det neste eg skal snakka om (klikk) er laus arkitektur. Me skal sj&#xE5; p&#xE5; korleis ein kan erstatta ein komponent i applikasjonen med ein annan.\n
Det neste eg skal snakka om (klikk) er laus arkitektur. Me skal sj&#xE5; p&#xE5; korleis ein kan erstatta ein komponent i applikasjonen med ein annan.\n
Det neste eg skal snakka om (klikk) er laus arkitektur. Me skal sj&#xE5; p&#xE5; korleis ein kan erstatta ein komponent i applikasjonen med ein annan.\n
Til &#xE5; halde seg p&#xE5; mainline har me ein teknikk i verk&#xF8;ykassa kalla branch-by-abstraction.\n\nUtgangspunket me har n&#xE5;r me byrjer med denne teknikken er ein applikasjon som bruker ein komponent (t.d. Hibernate).\n\nsom me har lyst til &#xE5; bytte ut med ein annan (t.d. JdbcTemplates)\n
Det fyrste me gjer, er &#xE5; introdusere eit abstraksjonslag mellom applikasjonen v&#xE5;r og den gamle komponenten.\n
Dermed kan den nye komponenten ogs&#xE5; implementere det samme interfacet.\n
&#x2026; og vi kan gj&#xF8;re den nye komponenten til vere den gjeldende implementasjonen\n
Og til sist kan vi fjerne abstraksjonslaget om vi ikke lenger har bruk for det.\n
Jeg skal snakke litt om konfigurasjonsstyring og begynner med det mest avanserte (klikk), nemlig infrastruktur som kode. F&#xF8;rst m&#xE5; jeg forklare hva som er m&#xE5;lsetningen med &#xE5; deklarativt kunne spesifisere infrastrukturen som applikasjonene v&#xE5;re skal kj&#xF8;re p&#xE5; og hvorfor det er s&#xE5; viktig (slide: finn 5 feil).\n
Jeg skal snakke litt om konfigurasjonsstyring og begynner med det mest avanserte (klikk), nemlig infrastruktur som kode. F&#xF8;rst m&#xE5; jeg forklare hva som er m&#xE5;lsetningen med &#xE5; deklarativt kunne spesifisere infrastrukturen som applikasjonene v&#xE5;re skal kj&#xF8;re p&#xE5; og hvorfor det er s&#xE5; viktig (slide: finn 5 feil).\n
Jeg skal snakke litt om konfigurasjonsstyring og begynner med det mest avanserte (klikk), nemlig infrastruktur som kode. F&#xF8;rst m&#xE5; jeg forklare hva som er m&#xE5;lsetningen med &#xE5; deklarativt kunne spesifisere infrastrukturen som applikasjonene v&#xE5;re skal kj&#xF8;re p&#xE5; og hvorfor det er s&#xE5; viktig (slide: finn 5 feil).\n
&#xC5;rsaken til at det er viktig er selvsagt at vi &#xF8;nsker produksjonslik infrastruktur i alle milj&#xF8;er - prod - qa - test og ogs&#xE5; lokalt p&#xE5; utvikermaskinene. Det er mange grunner til at vi &#xF8;nsker det. For det f&#xF8;rste er det enkelt &#xE5; kunne sette opp nye milj&#xF8;er. For det andre er det mye lettere &#xE5; feils&#xF8;ke i produksjonslike milj&#xF8;er. For det tredje - og dette er viktig - s&#xE5; kan vi finne feil f&#xF8;r de er i produksjon. (slide: it works on my machine).\n
For alle har vel opplevd at det virker i utvikling, i test, i qa, men s&#xE5; feiler det i produksjon. Og da er det vanskelig &#xE5; feils&#xF8;ke om man ikke har produksjonslike milj&#xF8;er (slide: pile of documents).\n
Andre fordeler med infrastruktur som kode, er at du har dokumentasjon p&#xE5; infrastrukturen etter samme prinsipp som at god kode dokumenterer seg selv. (slide: refactoring) \n
Du kan refaktorere provisjoneringskoden din og evolusjon&#xE6;rt forbedre infrastrukturen din (slide: kloning).\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
Dersom du trenger et nytt milj&#xF8; eller skal f&#xE5; en ny utvikler kjapt i gang, kan du kjapt klone et milj&#xF8; ved &#xE5; provisjonere opp en ny maskin. (slide: fordeler)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
En annen fordel er at du f&#xE5;r versjonskontroll p&#xE5; infrastrukturen din (klikk), og du kan teste provisjoneringsskriptene, deployskriptene, clusteringoppsett, lastbalansering og fallbackmekanismer. (klikk) Du kan automatisere disse testene i CI-serveren din. (klikk). Og du kan automatisere provisjonering av nye bokser. One-click, eller automatisk deploy fra Jenkins. (slide: devops)\n
Da snakker vi DevOps! Utviklere har brakt med seg praksiser de kjenner godt, kildekodekontroll, testdrevet utvikling, kontinuerlig integrasjon og automatisering - inn i driftsf&#xE6;ren. Men; hvordan funker egentlig dette her i praksis da? (slide: puppet)\n
Vi har erfaring med bruk av Puppet for provisjonering (slide: imperativt/deklarativt)\n
Forskjellen mellom tradisjonell m&#xE5;te &#xE5; installere software p&#xE5; og et provisjoneringsverkt&#xF8;y som Puppet er at du tradisjonelt eksplisitt angir hva som skal gj&#xF8;res p&#xE5; en imperativ m&#xE5;te (Gj&#xF8;r f&#xF8;rst dette, s&#xE5; dette) (klikk). Med deklarativ konfigurasjonsstyring beskriver du hvordan infrastrukturen din skal se ut, og det er plattformuavhengig. Hvis noe feiler kan du enkelt modifisere koden og Puppet vil konfigurere opp p&#xE5; nytt. Det kan du ikke gj&#xF8;re hvis det imperative installasjonsskriptet ditt tryner midtveis. Da blir det en masse opprydning og hassle f&#xF8;r du kan kj&#xF8;re det p&#xE5; nytt.\n
Noe av det fine med Puppet er at det er ganske lett &#xE5; komme i gang med. Men, du kan etter ganske kort tid m&#xF8;te "veggen". Vel og merke hvis du pr&#xF8;ver &#xE5; gj&#xF8;re for mye p&#xE5; en gang eller roter deg inn i noen anti-patterns. For det finnes det en del av. Det kan derfor v&#xE6;re lurt &#xE5; ta et kurs eller &#xE5; f&#xE5; hjelp av noen som har gjort det f&#xF8;r.\nEksempler p&#xE5; anti-patterns er spaghetti-kode, manglende kontinuerlig integrasjon, kun manuelle integrasjonstester og at du glemmer &#xE5; teste med jevne mellomrom. Men, det som er veldig fint med Puppet er at du kan starte i det sm&#xE5; og gradvis bygge ut. Du trenger ikke provisjonere absolutt alt p&#xE5; boksen med en gang.\n
Begynn for eksempel med &#xE5; provisjonere opp en applikasjonsbruker. (slide: provisjonere mysql)\n
Deretter kan du for eksempel fortsette med &#xE5; legge til noen verkt&#xF8;y du &#xF8;nsker skal v&#xE6;re tilgjengelig p&#xE5; maskinen; som her, apache. Du beskriver at apache-server skal v&#xE6;re installert og at den skal installeres som en service. (klikk) S&#xE5; kan du for eksempel konfigurere opp ssl i en egen fil i samme modul. Legg merke til at den arver fra apache-modulen. Du spesifiserer ogs&#xE5; avhengigheter som skal v&#xE6;re p&#xE5; plass ved help av require. N&#xE5;r du f&#xE5;r dreisen p&#xE5; det kan du begynne &#xE5; konfigurere database, installere java, ssh-config og s&#xE5; videre og s&#xE5; videre. (slide: community)\n
S&#xE5; har du full kontroll p&#xE5; infratrukturen din og kan fortsette og forbedre den, akkurat som du forbedrer applikasjonene dine. Og livet som DevOp blir mye enklere.\n
En veldig fin ting er at det finnes en enormt stor community rundt puppet (slide: github og puppetforge)\n
Og en masse ferdigskrevne moduler for s&#xE5; og si alt. Disse kan du rett og slett klone fra puppetforge, github eller andre steder. Delingsviljen i Puppet-milj&#xF8;et er enorm for alle skj&#xF8;nner at om man deler s&#xE5; f&#xE5;r man masse tilbake (slide: puppet job trends)\n
Og Puppet kommer som ei kule i milj&#xF8;et. Dette er satistikk fra jobbannonser p&#xE5; indeed.com.\n
S&#xE5; har vi Vagrant. Vagrant er en Ruby-applikasjon bygd p&#xE5; toppen av Puppet - og VirtualBox. VirtualBox er et virtualiseringsprodukt som lar deg kj&#xF8;re et umodifisert os p&#xE5; toppen av ditt eksisterende OS. Alts&#xE5; en virtuell maskin. (slide: vm p&#xE5; utviklermaskiner)\n
Det vi &#xF8;nsker &#xE5; oppn&#xE5; er &#xE5; replikere produksjonsmilj&#xF8;et p&#xE5; utviklermaskinene. OS-et p&#xE5; utviklermaskinene er sjeldent det samme som i produksjon, s&#xE5; vi m&#xE5; virtualisere produksjons-OS-et lokalt. (klikk) VirtualBox m&#xE5; v&#xE6;re installert. (klikk) Vi m&#xE5; ogs&#xE5; ha skaffet oss, eller laget oss et virtualbox image, med det samme os'et som er i produksjon. Det finnes mange av de p&#xE5; nettet, og det finnes ogs&#xE5; rammeverk, s&#xE5;nn som veewee, som lar deg lage nye os-image p&#xE5; en enkel m&#xE5;te. (klikk) S&#xE5; m&#xE5; vi bruke de samme provisjoneringsskriptene for &#xE5; provisjonere de lokale virtuelle maskinene p&#xE5; utviklermaskinene (slide: vagrant config).\n
Det vi &#xF8;nsker &#xE5; oppn&#xE5; er &#xE5; replikere produksjonsmilj&#xF8;et p&#xE5; utviklermaskinene. OS-et p&#xE5; utviklermaskinene er sjeldent det samme som i produksjon, s&#xE5; vi m&#xE5; virtualisere produksjons-OS-et lokalt. (klikk) VirtualBox m&#xE5; v&#xE6;re installert. (klikk) Vi m&#xE5; ogs&#xE5; ha skaffet oss, eller laget oss et virtualbox image, med det samme os'et som er i produksjon. Det finnes mange av de p&#xE5; nettet, og det finnes ogs&#xE5; rammeverk, s&#xE5;nn som veewee, som lar deg lage nye os-image p&#xE5; en enkel m&#xE5;te. (klikk) S&#xE5; m&#xE5; vi bruke de samme provisjoneringsskriptene for &#xE5; provisjonere de lokale virtuelle maskinene p&#xE5; utviklermaskinene (slide: vagrant config).\n
Det vi &#xF8;nsker &#xE5; oppn&#xE5; er &#xE5; replikere produksjonsmilj&#xF8;et p&#xE5; utviklermaskinene. OS-et p&#xE5; utviklermaskinene er sjeldent det samme som i produksjon, s&#xE5; vi m&#xE5; virtualisere produksjons-OS-et lokalt. (klikk) VirtualBox m&#xE5; v&#xE6;re installert. (klikk) Vi m&#xE5; ogs&#xE5; ha skaffet oss, eller laget oss et virtualbox image, med det samme os'et som er i produksjon. Det finnes mange av de p&#xE5; nettet, og det finnes ogs&#xE5; rammeverk, s&#xE5;nn som veewee, som lar deg lage nye os-image p&#xE5; en enkel m&#xE5;te. (klikk) S&#xE5; m&#xE5; vi bruke de samme provisjoneringsskriptene for &#xE5; provisjonere de lokale virtuelle maskinene p&#xE5; utviklermaskinene (slide: vagrant config).\n
Her er et eksempel p&#xE5; en enkel konfigurasjonsfil. Vi konfigurerer opp et base-box-image. I dette tilfellet Debian for en app-server boks og Cent Os for en databaseboks. Vi konfigurerer opp en folder som skal v&#xE6;re delt. Du kan nemlig dele foldere fra lokal maskin. I dette tilfellet utviklingsfolderen. Dermed har du tilgjengelig kildekoden din p&#xE5; den virtuelle boksen s&#xE5; du kan bedrive utvikling rett i et produksjonslikt milj&#xF8;. Vi angir at vi skal bruke Puppet for &#xE5; provisjonere opp boksene. (slide: jobbe p&#xE5; fly).\n
Med et virtualisert lokalt prod-likt milj&#xF8; kan utviklerne jobbe mot et prodlikt milj&#xF8; p&#xE5; sin egen maskin, du kan ogs&#xE5; jobbe uten nett, for eksempel p&#xE5; et fly - (slide: Norwegian).\n
Med unntak av dette flyet, som har wifi. (slide: kloning)\n
Det er visse ting du ikke b&#xF8;r bruke Puppet til. Du b&#xF8;r ikke deploye applikasjonen din med Puppet. Applikasjonen din er ikke infrastruktur (klikk). Med Puppet s&#xE5; konfigurer du infrastruktur deklarativt i en master slave arkitektur hvor slavene puller konfigurasjonen fra master med ujevne mellomrom. Du &#xF8;nsker mye bedre kontroll og muligheten til &#xE5; f&#xF8;lge med og se p&#xE5; logger ved deploy (klikk). Deploy b&#xF8;r ikke v&#xE6;re deklarativt men imperativt s&#xE5;nn at du kan f&#xF8;lge med p&#xE5; hva som skjer ved deploy. Du pusher alts&#xE5; applikasjonen og databaseendringer til serverne du deployer til (slide: deploy.sh)\n
Det er visse ting du ikke b&#xF8;r bruke Puppet til. Du b&#xF8;r ikke deploye applikasjonen din med Puppet. Applikasjonen din er ikke infrastruktur (klikk). Med Puppet s&#xE5; konfigurer du infrastruktur deklarativt i en master slave arkitektur hvor slavene puller konfigurasjonen fra master med ujevne mellomrom. Du &#xF8;nsker mye bedre kontroll og muligheten til &#xE5; f&#xF8;lge med og se p&#xE5; logger ved deploy (klikk). Deploy b&#xF8;r ikke v&#xE6;re deklarativt men imperativt s&#xE5;nn at du kan f&#xF8;lge med p&#xE5; hva som skjer ved deploy. Du pusher alts&#xE5; applikasjonen og databaseendringer til serverne du deployer til (slide: deploy.sh)\n
Det er visse ting du ikke b&#xF8;r bruke Puppet til. Du b&#xF8;r ikke deploye applikasjonen din med Puppet. Applikasjonen din er ikke infrastruktur (klikk). Med Puppet s&#xE5; konfigurer du infrastruktur deklarativt i en master slave arkitektur hvor slavene puller konfigurasjonen fra master med ujevne mellomrom. Du &#xF8;nsker mye bedre kontroll og muligheten til &#xE5; f&#xF8;lge med og se p&#xE5; logger ved deploy (klikk). Deploy b&#xF8;r ikke v&#xE6;re deklarativt men imperativt s&#xE5;nn at du kan f&#xF8;lge med p&#xE5; hva som skjer ved deploy. Du pusher alts&#xE5; applikasjonen og databaseendringer til serverne du deployer til (slide: deploy.sh)\n
Derfor egner skript seg veldig godt. Her har du verdens enkleste deployskript. Man angir artefakt og versjon som parameer 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. (slide: rollback)\n
Rollback er enn&#xE5; enklere. Der stopper vi appen. Flytter symlinken fra ny til forrige versjon og starter opp igjen.\n
&#xC5; kunne skripting er ogs&#xE5; sv&#xE6;rt nyttig i andre sammenhenger, som for eksempel &#xE5; lage enkle overv&#xE5;kningsskript som kan installeres som en cron-jobb. Dette skriptet sender e-post dersom en applikasjon er nede p&#xE5; en av serverne. Det er viktig &#xE5; merke seg at du ikke b&#xF8;r basere overv&#xE5;kningen din p&#xE5; s&#xE5;nne skript. Det finnes mye mer avanserte overv&#xE5;kningsverkt&#xF8;y, som for eksempel Nagios.\n
Bash er et utrolig kraftig verkt&#xF8;y. N&#xE5;r du er nybegynner med bash-skripting s&#xE5; er det fort gjort at skriptene kan bli et mareritt &#xE5; vedlikeholde. Derfor burde du sette deg godt inn i hvordan du kan lage feilh&#xE5;ndtering og rollback. Som jeg sa tidligere, s&#xE5; er bash imperativt, s&#xE5; et skript som feiler midtveis kan ha gjort veldig mye skade, og du kan sannsynligvis ikke bare kj&#xF8;re skriptet p&#xE5; nytt.\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Det neste jeg skal snakke om er nedetidfri produksjonssetting (klikk). Det er flere m&#xE5;ter &#xE5; f&#xE5; til det p&#xE5;, men m&#xE5;ten vi har gjort det p&#xE5; i Digipost, hvor jeg jobber n&#xE5;, er den jeg skal beskrive. At vi f&#xE5;r det til henger sammen med at vi bruker enkel teknologi (klikk). Vi bruker embedded Jetty, som er sv&#xE6;rt fordelaktig &#xE5; jobbe med i forhold til store enterprisy appservere. En vanlig innvending jeg h&#xF8;rer n&#xE5;r jeg snakker om det er at "vi har ikke lov &#xE5; bruke Jetty hos oss, virksomhetarkitekten sier nei, eller ledelsen sier at gull-avtalen vi har med Big Enterprise Company er mye tryggere. Vi har betalt masse for support og det er skummelt &#xE5; bruke Open Source&#x201D;. Alle argumentene er selvsagt bare tull. Hvordan overbevise virksomhetsarkitekter og ledelsen om &#xE5; bruke den beste og enkleste teknologien tilgjengelig er et eget foredrag i seg selv. (slide: driving technical change)\n
Eller dere kan lese denne boken.\n
Uansett; m&#xE5;ten vi har gjort det p&#xE5; er &#xE5; bruke sesjonsreplikering i databasen. Dette er det st&#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&#xE5; sjekkes databasen for om det finnes en sesjon fra en annen server der, og laster inn sesjonen i minne p&#xE5; den nye serveren. Enkelt - men vi m&#xE5; gj&#xF8;re en ting til (klikk).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Foran applikasjonsserverne v&#xE5;re har vi en lastbalanserer som ruter brukerne til den samme serveren som de var p&#xE5; sist. Det kan ta litt tid f&#xF8;r lastbalansereren merker at en node er nede, s&#xE5; den vil vente ganske lenge p&#xE5; at applikasjonsserveren er tilgjengelig f&#xF8;r den ruter brukeren til neste server. Brukeren m&#xE5; da vente lenge p&#xE5; &#xE5; f&#xE5; svar. M&#xE5;ten vi har ordnet det p&#xE5; er som f&#xF8;lger. Det starter med at serveren du &#xF8;nsker &#xE5; ta ned for redeploy melder seg selv ut av lastbalanserer-poolen ved &#xE5; endre returstatus for requesten som lastbalansereren poller p&#xE5; fra online til offline (klikk). S&#xE5; venter vi litte grann og fortsetter &#xE5; serve brukere til lastbalansereren har pinget oss og meldt serveren ut av poolen (klikk) . S&#xE5; kan man deploye til serveren som er tatt ned (klikk). Deretter kan man gj&#xF8;re smoke-tester mot den nye applikasjonen (klikk) f&#xF8;r vi melder den inn igjen i clusteret (klikk)(klikk). S&#xE5; gj&#xF8;r vi tilsvarende med resterende servere (slide: databasemigrering).\n
Jeg skal snakke litt om kontroll p&#xE5; applikasjonskonfig f&#xF8;r vi skal snakke om nedetidfri migrering og rollback av database. Jeg har tenkt &#xE5; bruke et eksempel, nemlig Jetty, for &#xE5; snakke om det.\n
Jeg skal snakke litt om kontroll p&#xE5; applikasjonskonfig f&#xF8;r vi skal snakke om nedetidfri migrering og rollback av database. Jeg har tenkt &#xE5; bruke et eksempel, nemlig Jetty, for &#xE5; snakke om det.\n
Jeg skal snakke litt om kontroll p&#xE5; applikasjonskonfig f&#xF8;r vi skal snakke om nedetidfri migrering og rollback av database. Jeg har tenkt &#xE5; bruke et eksempel, nemlig Jetty, for &#xE5; snakke om det.\n
For &#xF8;yeblikket anser jeg Jetty som den enkleste og beste servlet-containeren i verden, og det &#xE5; jobbe med den er noe helt annet enn hva jeg var vant til for en 5 &#xE5;rs tid siden. Jeg har v&#xE6;rt s&#xE5; heldig &#xE5; bruke Jetty lenge, men det er f&#xF8;rst i det seneste at jeg virkelig har oppdaget at den er god for mye mer enn jeg har brukt tidligere. (klikk)\n
En fin ting med en embedded Jetty-server er at vi kan konfigurere selve serveren som en Spring-b&#xF8;nne og dermed vil Springkonteksten ogs&#xE5; inkludere serveren. Konfigurasjon er tilgjengelig fra hvor som helst i applikasjonskoden. Eller du kan selvf&#xF8;lgelig la v&#xE6;re &#xE5; bruke Spring, men vi bruker alts&#xE5; det (klikk). Main-metoden er superenkel. Den laster spring-konteksten, henter server-b&#xF8;nna fra konteksten, finner stien til webappen, som ikke er en war, men en vanlig utpakket folder, og starter serveren. Det fine med &#xE5; jobbe med en utpakket folder er at det er lett &#xE5; fyre opp serveren med Main-klassen i utvikling uten &#xE5; m&#xE5;tte pakke en war f&#xF8;rst. Og hva skal vi egentlig med en war? Dette er litt forenklet, og en av tingene som mangler er webappkonfigurasjonen, alts&#xE5; det som vanligvis ligger i web.xml. (klikk)\n
For web.xml kan vi erstatte med kode. Her har vi et eksempel. WebServerConfiguration er wiret opp fra Spring og setter applikasjonskonteksten, et filter, en listener og en servlet. For &#xE5; legget til et filter gj&#xF8;r man s&#xE5;nn (klikk). (klikk) en listener, (klikk) en servlet og (klikk) en jsp. Alt kan konfigureres i kode, og det blir mye lettere &#xE5; teste og &#xE5; kj&#xF8;re opp ting lokalt under utvikling. En ting som er rart er at jeg har funnet veldig lite om dette p&#xE5; internett. Det er mange som bruker Jetty, men det er f&#xF8;rst n&#xE5;r du f&#xE5;r p&#xE5; plass disse mekanismene at du virkelig kan lage en ekte embedded webapp container. Det neste vi m&#xE5; gj&#xF8;re er &#xE5; vurdere &#xE5; kutte ut Spring.\n
For web.xml kan vi erstatte med kode. Her har vi et eksempel. WebServerConfiguration er wiret opp fra Spring og setter applikasjonskonteksten, et filter, en listener og en servlet. For &#xE5; legget til et filter gj&#xF8;r man s&#xE5;nn (klikk). (klikk) en listener, (klikk) en servlet og (klikk) en jsp. Alt kan konfigureres i kode, og det blir mye lettere &#xE5; teste og &#xE5; kj&#xF8;re opp ting lokalt under utvikling. En ting som er rart er at jeg har funnet veldig lite om dette p&#xE5; internett. Det er mange som bruker Jetty, men det er f&#xF8;rst n&#xE5;r du f&#xE5;r p&#xE5; plass disse mekanismene at du virkelig kan lage en ekte embedded webapp container. Det neste vi m&#xE5; gj&#xF8;re er &#xE5; vurdere &#xE5; kutte ut Spring.\n
For web.xml kan vi erstatte med kode. Her har vi et eksempel. WebServerConfiguration er wiret opp fra Spring og setter applikasjonskonteksten, et filter, en listener og en servlet. For &#xE5; legget til et filter gj&#xF8;r man s&#xE5;nn (klikk). (klikk) en listener, (klikk) en servlet og (klikk) en jsp. Alt kan konfigureres i kode, og det blir mye lettere &#xE5; teste og &#xE5; kj&#xF8;re opp ting lokalt under utvikling. En ting som er rart er at jeg har funnet veldig lite om dette p&#xE5; internett. Det er mange som bruker Jetty, men det er f&#xF8;rst n&#xE5;r du f&#xE5;r p&#xE5; plass disse mekanismene at du virkelig kan lage en ekte embedded webapp container. Det neste vi m&#xE5; gj&#xF8;re er &#xE5; vurdere &#xE5; kutte ut Spring.\n
For web.xml kan vi erstatte med kode. Her har vi et eksempel. WebServerConfiguration er wiret opp fra Spring og setter applikasjonskonteksten, et filter, en listener og en servlet. For &#xE5; legget til et filter gj&#xF8;r man s&#xE5;nn (klikk). (klikk) en listener, (klikk) en servlet og (klikk) en jsp. Alt kan konfigureres i kode, og det blir mye lettere &#xE5; teste og &#xE5; kj&#xF8;re opp ting lokalt under utvikling. En ting som er rart er at jeg har funnet veldig lite om dette p&#xE5; internett. Det er mange som bruker Jetty, men det er f&#xF8;rst n&#xE5;r du f&#xE5;r p&#xE5; plass disse mekanismene at du virkelig kan lage en ekte embedded webapp container. Det neste vi m&#xE5; gj&#xF8;re er &#xE5; vurdere &#xE5; kutte ut Spring.\n
Jeg liker &#xE5; ha mest mulig konfigurasjon i kode, men det kan v&#xE6;re kjekt &#xE5; ha noen properties som kan endres runtime eller etter restart ogs&#xE5;. Og, for eksempel passord kan uansett ikke v&#xE6;re en del av kildekoden. M&#xE5;ten vi har gjort det p&#xE5; er &#xE5; ha en propertyfil som bundles med applikasjonen. Det er kun en propertyfil og den skal kunne brukes i alle milj&#xF8; og p&#xE5; alle servere, ogs&#xE5; lokalt. Det er selvsagt forskjeller p&#xE5; milj&#xF8;er. Databasen man skal g&#xE5; mot er for eksempel forskjellig lokalt, i test, i qa og i prod. Derfor har vi laget oss en superenkel property-loader hvor du kan prefikse propertiene med milj&#xF8;, for eksempel local, test, qa eller production, eller spesifikt servernavn hvis det er forskjellige propertier p&#xE5; forskjellige servere. Vi har valgt &#xE5; skrive v&#xE5;rt eget, men K&#xE5;re Nilsens Constretto har lignende funksjonalitet (klikk). I tillegg til den ene propertyfilen, s&#xE5; har vi en secret.properties som lever p&#xE5; hver server. Den inneholder hemmelige properties, s&#xE5;nn som passord. Den fila er den eneste konfigurasjonen som lever p&#xE5; serverne. Ganske fett i forhold til hvordan man setter opp sv&#xE6;re enterprise servere.\n
Vi pakker sammen applikasjonen med appassembler-plugin og assembly-plugin. Appassembler plugin gir deg et oppstartsskript og assembly-plugin pakker alt i en zip-fil. Ved deploy pakker du ut zipfilen og kj&#xF8;rer oppstartsskriptet som setter opp classpath og java options og som starter applikasjonen med standard java kommando. Dermed er applikasjonen din kun en java-prosess, som er veldig enkelt &#xE5; forholde seg til driftsmessig (klikk). Lokalt kan du bruke maven-exec-plugin, Run... i IDE-et ditt, eller rett og slett java-kommandoen.\n
Vi pakker sammen applikasjonen med appassembler-plugin og assembly-plugin. Appassembler plugin gir deg et oppstartsskript og assembly-plugin pakker alt i en zip-fil. Ved deploy pakker du ut zipfilen og kj&#xF8;rer oppstartsskriptet som setter opp classpath og java options og som starter applikasjonen med standard java kommando. Dermed er applikasjonen din kun en java-prosess, som er veldig enkelt &#xE5; forholde seg til driftsmessig (klikk). Lokalt kan du bruke maven-exec-plugin, Run... i IDE-et ditt, eller rett og slett java-kommandoen.\n
Vi pakker sammen applikasjonen med appassembler-plugin og assembly-plugin. Appassembler plugin gir deg et oppstartsskript og assembly-plugin pakker alt i en zip-fil. Ved deploy pakker du ut zipfilen og kj&#xF8;rer oppstartsskriptet som setter opp classpath og java options og som starter applikasjonen med standard java kommando. Dermed er applikasjonen din kun en java-prosess, som er veldig enkelt &#xE5; forholde seg til driftsmessig (klikk). Lokalt kan du bruke maven-exec-plugin, Run... i IDE-et ditt, eller rett og slett java-kommandoen.\n
N&#xE5; skal jeg snakke om databasemigrering (klikk) og rollback. For, en vanlig innvending mot hyppig utrulling er: Hvordan h&#xE5;ndteres forskjellige versjoner av databasen. Gj&#xF8;r ikke det nedetidfri prodsetting umulig? Hvordan kan den gamle og den nye applikasjonen kj&#xF8;re mot samme skjema. Det er et slags h&#xF8;na og egget problem: Databaseendringene kan ikke gjennomf&#xF8;res uten &#xE5; bryte med den eksisternde l&#xF8;sningen, og den nye versjonen virker ikke uten endringene du skal gjennomf&#xF8;re. Ikke bra. Vel det finnes l&#xF8;sninger p&#xE5; det. (slide: expand /contract)\n
For eksempel har vi det vi kaller expand/contract pattern. (klikk) Expansion skript er databaseendringer som er trygge &#xE5; legge til uten &#xE5; bryte bakoverkompatibiltet med den eksisterende applikasjonen. Endringer som &#xE5; legge til nye tabeller, legge til kolonner eller &#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. &#xC5; slette kolonner, tabeller eller constraints, og &#xE5; legge til constraints er eksepler p&#xE5; det. Det er ytterst sjelden at vi gj&#xF8;r andre ting som gj&#xF8;r at ikke applikasjonen kan v&#xE6;re kompatibel med to versjoner av databasen. I s&#xE5; tilfelle kan man lage et abstraksjonslag i applikasjonen, s&#xE5;nn som Sveinung viste med abstraction-layer-patternet. Men - som sagt - det slipper du som regel unna. (slide: legg p&#xE5; endringer f&#xF8;r og etter deploy)\n
For eksempel har vi det vi kaller expand/contract pattern. (klikk) Expansion skript er databaseendringer som er trygge &#xE5; legge til uten &#xE5; bryte bakoverkompatibiltet med den eksisterende applikasjonen. Endringer som &#xE5; legge til nye tabeller, legge til kolonner eller &#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. &#xC5; slette kolonner, tabeller eller constraints, og &#xE5; legge til constraints er eksepler p&#xE5; det. Det er ytterst sjelden at vi gj&#xF8;r andre ting som gj&#xF8;r at ikke applikasjonen kan v&#xE6;re kompatibel med to versjoner av databasen. I s&#xE5; tilfelle kan man lage et abstraksjonslag i applikasjonen, s&#xE5;nn som Sveinung viste med abstraction-layer-patternet. Men - som sagt - det slipper du som regel unna. (slide: legg p&#xE5; endringer f&#xF8;r og etter deploy)\n
Ekspansjonsskriptene kj&#xF8;res f&#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&#xF8;rer n&#xE5;r applikasjonen er oppgradert og stabil. Her er et eksempel p&#xE5; hvordan dette funker i praksis. Vi starter med database versjon 3. S&#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 og 4 av databasen som vi enn&#xE5; ikke har migrert. S&#xE5; gj&#xF8;r vi det. S&#xE5; rydder vi opp og deployer en applikasjon som kun er kompatibel med database versjon 4, og s&#xE5; kanskje enda en. Neste gang deployer vi en versjon som er kompatibel med forrige og kommende versjon av databasen, migrerer og rydder opp. Det ligner litt p&#xE5; branch by abstraction faktisk, som Sveinung snakket om tidligere. (slide: sql)\n
Ekspansjonsskriptene kj&#xF8;res f&#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&#xF8;rer n&#xE5;r applikasjonen er oppgradert og stabil. Her er et eksempel p&#xE5; hvordan dette funker i praksis. Vi starter med database versjon 3. S&#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 og 4 av databasen som vi enn&#xE5; ikke har migrert. S&#xE5; gj&#xF8;r vi det. S&#xE5; rydder vi opp og deployer en applikasjon som kun er kompatibel med database versjon 4, og s&#xE5; kanskje enda en. Neste gang deployer vi en versjon som er kompatibel med forrige og kommende versjon av databasen, migrerer og rydder opp. Det ligner litt p&#xE5; branch by abstraction faktisk, som Sveinung snakket om tidligere. (slide: sql)\n
Ekspansjonsskriptene kj&#xF8;res f&#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&#xF8;rer n&#xE5;r applikasjonen er oppgradert og stabil. Her er et eksempel p&#xE5; hvordan dette funker i praksis. Vi starter med database versjon 3. S&#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 og 4 av databasen som vi enn&#xE5; ikke har migrert. S&#xE5; gj&#xF8;r vi det. S&#xE5; rydder vi opp og deployer en applikasjon som kun er kompatibel med database versjon 4, og s&#xE5; kanskje enda en. Neste gang deployer vi en versjon som er kompatibel med forrige og kommende versjon av databasen, migrerer og rydder opp. Det ligner litt p&#xE5; branch by abstraction faktisk, som Sveinung snakket om tidligere. (slide: sql)\n
Ekspansjonsskriptene kj&#xF8;res f&#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&#xF8;rer n&#xE5;r applikasjonen er oppgradert og stabil. Her er et eksempel p&#xE5; hvordan dette funker i praksis. Vi starter med database versjon 3. S&#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 og 4 av databasen som vi enn&#xE5; ikke har migrert. S&#xE5; gj&#xF8;r vi det. S&#xE5; rydder vi opp og deployer en applikasjon som kun er kompatibel med database versjon 4, og s&#xE5; kanskje enda en. Neste gang deployer vi en versjon som er kompatibel med forrige og kommende versjon av databasen, migrerer og rydder opp. Det ligner litt p&#xE5; branch by abstraction faktisk, som Sveinung snakket om tidligere. (slide: sql)\n
Ekspansjonsskriptene kj&#xF8;res f&#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&#xF8;rer n&#xE5;r applikasjonen er oppgradert og stabil. Her er et eksempel p&#xE5; hvordan dette funker i praksis. Vi starter med database versjon 3. S&#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 og 4 av databasen som vi enn&#xE5; ikke har migrert. S&#xE5; gj&#xF8;r vi det. S&#xE5; rydder vi opp og deployer en applikasjon som kun er kompatibel med database versjon 4, og s&#xE5; kanskje enda en. Neste gang deployer vi en versjon som er kompatibel med forrige og kommende versjon av databasen, migrerer og rydder opp. Det ligner litt p&#xE5; branch by abstraction faktisk, som Sveinung snakket om tidligere. (slide: sql)\n
Ekspansjonsskriptene kj&#xF8;res f&#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&#xF8;rer n&#xE5;r applikasjonen er oppgradert og stabil. Her er et eksempel p&#xE5; hvordan dette funker i praksis. Vi starter med database versjon 3. S&#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 og 4 av databasen som vi enn&#xE5; ikke har migrert. S&#xE5; gj&#xF8;r vi det. S&#xE5; rydder vi opp og deployer en applikasjon som kun er kompatibel med database versjon 4, og s&#xE5; kanskje enda en. Neste gang deployer vi en versjon som er kompatibel med forrige og kommende versjon av databasen, migrerer og rydder opp. Det ligner litt p&#xE5; branch by abstraction faktisk, som Sveinung snakket om tidligere. (slide: sql)\n
Ekspansjonsskriptene kj&#xF8;res f&#xF8;r oppgradering av applikasjonen og contraction-skriptene kj&#xF8;rer n&#xE5;r applikasjonen er oppgradert og stabil. Her er et eksempel p&#xE5; hvordan dette funker i praksis. Vi starter med database versjon 3. S&#xE5; deployer vi en applikasjon som er kompatibel med versjon 3 og 4 av databasen som vi enn&#xE5; ikke har migrert. S&#xE5; gj&#xF8;r vi det. S&#xE5; rydder vi opp og deployer en applikasjon som kun er kompatibel med database versjon 4, og s&#xE5; kanskje enda en. Neste gang deployer vi en versjon som er kompatibel med forrige og kommende versjon av databasen, migrerer og rydder opp. Det ligner litt p&#xE5; branch by abstraction faktisk, som Sveinung snakket om tidligere. (slide: sql)\n
Du b&#xF8;r skripte alle databaseendringer inkrementelt og refaktorere databasen. Databaseskjemaet b&#xF8;r behandles p&#xE5; samme m&#xE5;te som kode. Det er kode. S&#xE5; putt de i versjonskontroll og s&#xF8;rg for &#xE5; lage og teste rollback-kode i skriptene. (slide: liquibase)\n
Vi bruker liquibase for &#xE5; lage skriptene v&#xE5;re. (slide: liquibase-skript)\n
Liquibase er xml-basert, og n&#xE5;r du kj&#xF8;rer det sier den for eksempel fra hvis du ikke har skrevet kode for roll-back. Den sier ogs&#xE5; fra om noe er feil med skriptene dine f&#xF8;r du en gang pr&#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! (slide: refactor-boka)\n
Og s&#xE5; er det viktig &#xE5; organisere kildekoden for databasen p&#xE5; en ordentlig og strukturert m&#xE5;te, s&#xE5;nn at det er lett &#xE5; finne igjen hvilke endringer som er i hvilken release. &#xC5; refaktorere databasen din er viktig. Du skal ikke v&#xE6;re redd for &#xE5; endre datamodellen. Det har mye &#xE5; si for hvordan resten av koden din vil se ut. Og automatiser databasetester s&#xE5;nn at du kan feile p&#xE5; et tidligst mulig tidspunkt. Da har du tid til &#xE5; fikse problemene. Og, som jeg sa tidligere; produksjonssett databaseendringer adskilt fra applikasjonen. Jo f&#xE6;rre ting du produksjonssetter hver gang - jo f&#xE6;rre ting er det som kan g&#xE5; galt.\n
Til slutt skal jeg snakke litt om selvorganiserte team og litt om DevOps. Er det noe du ikke bare kan begynne med, s&#xE5; er det det. Et velfungerende kryssfunksjonelt selvorganisert team dannes ikke over natta, men over tid.\n
Til slutt skal jeg snakke litt om selvorganiserte team og litt om DevOps. Er det noe du ikke bare kan begynne med, s&#xE5; er det det. Et velfungerende kryssfunksjonelt selvorganisert team dannes ikke over natta, men over tid.\n
Til slutt skal jeg snakke litt om selvorganiserte team og litt om DevOps. Er det noe du ikke bare kan begynne med, s&#xE5; er det det. Et velfungerende kryssfunksjonelt selvorganisert team dannes ikke over natta, men over tid.\n
Selvorganisering handler om &#xE5; sette sammen et team og gi de en eller flere oppgaver de skal l&#xF8;se. Teamet finner selv ut av hvordan oppgavene skal l&#xF8;ses og hvordan de skal m&#xE5;le fremdrift, dele opp oppgavene og ikke minst; hvordan de skal bli bedre. Noen rammer: Teamsammensetning er viktig: &#x201C;Helt team&#x201D;: Alle som trengs for &#xE5; konvertere behov til fungerende software er en del av teamet (inkludert forretning, drift, designere, interaksjonsdesignere, testere og utviklere) Det er flat organisering: Dersom en eller to personer bestemmer hva og hvordan andre skal gj&#xF8;re jobben havner man fort i &#x201C;command and control&#x201D;-situasjon. (klikk).\n
Tuckman har noe han kaller stages of group development, og jeg kjenner meg veldig igjen i disse stegene, s&#xE5; derfor vil jeg dele det med dere. Det f&#xF8;rste er &#x201C;forming&#x201D;: Det er som f&#xF8;rste skoledag, usikre p&#xE5; hverandre, lite uenighet, ingen stikker seg frem, alle lurer p&#xE5; hvem som vil dominere. Neste steg er &#x201C;Storming&#x201D;: Da er det uenighet, konkurerende synspunkter, konfrontasjon og fare for &#xE5; ikke bli enige. S&#xE5;nn var det for eksempel i Digipost hvor vi hadde veldig topptung bemanning og alle hadde sterke meninger om alt. N&#xE5;r vi fikk inn noen juniorer ble det endelig noen som utviklet noe. I Norming er det enighet om rammer for arbeidet, man har bestemt seg for et sett med regler, og det er relativt effektivt, typisk Scrum. S&#xE5; &#x201C;Performing&#x201D;: Da kjenner alle hverandres svakheter og styrker og har evne til &#xE5; tilpasse seg enhver oppgave og &#xE5; l&#xF8;se denne som et lag. Ikke v&#xE6;re redd for &#xE5; tilpasse teamet underveis for &#xE5; f&#xE5; perfekt sammensetning. For eksempel ved &#xE5; ha en god blanding av erfarne og juniorer. Det er fort gjort at fasene stagnerer etter &#x201C;Norming&#x201D;, eller enda v&#xE6;rre; p&#xE5; Storming. Da m&#xE5; det tas grep.\n
Tuckman har noe han kaller stages of group development, og jeg kjenner meg veldig igjen i disse stegene, s&#xE5; derfor vil jeg dele det med dere. Det f&#xF8;rste er &#x201C;forming&#x201D;: Det er som f&#xF8;rste skoledag, usikre p&#xE5; hverandre, lite uenighet, ingen stikker seg frem, alle lurer p&#xE5; hvem som vil dominere. Neste steg er &#x201C;Storming&#x201D;: Da er det uenighet, konkurerende synspunkter, konfrontasjon og fare for &#xE5; ikke bli enige. S&#xE5;nn var det for eksempel i Digipost hvor vi hadde veldig topptung bemanning og alle hadde sterke meninger om alt. N&#xE5;r vi fikk inn noen juniorer ble det endelig noen som utviklet noe. I Norming er det enighet om rammer for arbeidet, man har bestemt seg for et sett med regler, og det er relativt effektivt, typisk Scrum. S&#xE5; &#x201C;Performing&#x201D;: Da kjenner alle hverandres svakheter og styrker og har evne til &#xE5; tilpasse seg enhver oppgave og &#xE5; l&#xF8;se denne som et lag. Ikke v&#xE6;re redd for &#xE5; tilpasse teamet underveis for &#xE5; f&#xE5; perfekt sammensetning. For eksempel ved &#xE5; ha en god blanding av erfarne og juniorer. Det er fort gjort at fasene stagnerer etter &#x201C;Norming&#x201D;, eller enda v&#xE6;rre; p&#xE5; Storming. Da m&#xE5; det tas grep.\n
Tuckman har noe han kaller stages of group development, og jeg kjenner meg veldig igjen i disse stegene, s&#xE5; derfor vil jeg dele det med dere. Det f&#xF8;rste er &#x201C;forming&#x201D;: Det er som f&#xF8;rste skoledag, usikre p&#xE5; hverandre, lite uenighet, ingen stikker seg frem, alle lurer p&#xE5; hvem som vil dominere. Neste steg er &#x201C;Storming&#x201D;: Da er det uenighet, konkurerende synspunkter, konfrontasjon og fare for &#xE5; ikke bli enige. S&#xE5;nn var det for eksempel i Digipost hvor vi hadde veldig topptung bemanning og alle hadde sterke meninger om alt. N&#xE5;r vi fikk inn noen juniorer ble det endelig noen som utviklet noe. I Norming er det enighet om rammer for arbeidet, man har bestemt seg for et sett med regler, og det er relativt effektivt, typisk Scrum. S&#xE5; &#x201C;Performing&#x201D;: Da kjenner alle hverandres svakheter og styrker og har evne til &#xE5; tilpasse seg enhver oppgave og &#xE5; l&#xF8;se denne som et lag. Ikke v&#xE6;re redd for &#xE5; tilpasse teamet underveis for &#xE5; f&#xE5; perfekt sammensetning. For eksempel ved &#xE5; ha en god blanding av erfarne og juniorer. Det er fort gjort at fasene stagnerer etter &#x201C;Norming&#x201D;, eller enda v&#xE6;rre; p&#xE5; Storming. Da m&#xE5; det tas grep.\n
Tuckman har noe han kaller stages of group development, og jeg kjenner meg veldig igjen i disse stegene, s&#xE5; derfor vil jeg dele det med dere. Det f&#xF8;rste er &#x201C;forming&#x201D;: Det er som f&#xF8;rste skoledag, usikre p&#xE5; hverandre, lite uenighet, ingen stikker seg frem, alle lurer p&#xE5; hvem som vil dominere. Neste steg er &#x201C;Storming&#x201D;: Da er det uenighet, konkurerende synspunkter, konfrontasjon og fare for &#xE5; ikke bli enige. S&#xE5;nn var det for eksempel i Digipost hvor vi hadde veldig topptung bemanning og alle hadde sterke meninger om alt. N&#xE5;r vi fikk inn noen juniorer ble det endelig noen som utviklet noe. I Norming er det enighet om rammer for arbeidet, man har bestemt seg for et sett med regler, og det er relativt effektivt, typisk Scrum. S&#xE5; &#x201C;Performing&#x201D;: Da kjenner alle hverandres svakheter og styrker og har evne til &#xE5; tilpasse seg enhver oppgave og &#xE5; l&#xF8;se denne som et lag. Ikke v&#xE6;re redd for &#xE5; tilpasse teamet underveis for &#xE5; f&#xE5; perfekt sammensetning. For eksempel ved &#xE5; ha en god blanding av erfarne og juniorer. Det er fort gjort at fasene stagnerer etter &#x201C;Norming&#x201D;, eller enda v&#xE6;rre; p&#xE5; Storming. Da m&#xE5; det tas grep.\n
Conways law: Sier at organisasjoner er d&#xF8;mt til &#xE5; designe systemer som er kopier av kommunikasjonslinjene i organisasjonen.\n\nDerfor jobber vi smidig og sitter sammen med forretning hver dag.\nTrenger bare snu hodet.\nUtviklerne sitter rund ett og samme bord\nSalg/marked sitter rundt ett og samme bord.\nF&#xE6;rre m&#xF8;ter. Er i m&#xF8;te hele tiden!\n
S&#xE5; er det dette med DevOps. Hva er egentlig det? Uviklere kan en del ting, s&#xE5;nn som smidig utvikling, og TDD, automatisering og versjonskontroll, og drift kan en masse ting, som backup, de har DBA-er, overv&#xE5;kning, og ikke minst har de rot-tilgang. Og tradisjonelt ser et utviklingsl&#xF8;p s&#xE5;nn ut. Kunden ber utviklerne om &#xE5; gj&#xF8;re noe, utviklerne gj&#xF8;r det og overleverer det til drift. Drift setter det i produksjon, og det er f&#xF8;rst da man f&#xE5;r feedback fra brukerne. Det er selvsagt mye feil som kan oppst&#xE5; p&#xE5; veien, fordi man har siloer hvor man slenger ting over veggen for at neste avdeling skal ta tak i det. En testavdeling er vanligvis inni dette her ogs&#xE5;, men det har jeg utelatt, fordi det burde dere v&#xE6;rt kvitt for lenge siden (klikk). N&#xE5;r utviklere og drift jobber sammen som et team, eller n&#xE5;r det er de samme folka som utvikler og drifter, s&#xE5; oppst&#xE5;r en masse flotte ting (klikk). Du kan levere kontinuerlig, tester underveis, time to market blir kortere og du f&#xE5;r raskere feedback. Du f&#xE5;r kryssfunksjonelle team, samarbeid, og infrastruktur som kode kvalitetssikrer infrastrukturen din mye bedre enn tradisjonelt.\n
S&#xE5; er det dette med DevOps. Hva er egentlig det? Uviklere kan en del ting, s&#xE5;nn som smidig utvikling, og TDD, automatisering og versjonskontroll, og drift kan en masse ting, som backup, de har DBA-er, overv&#xE5;kning, og ikke minst har de rot-tilgang. Og tradisjonelt ser et utviklingsl&#xF8;p s&#xE5;nn ut. Kunden ber utviklerne om &#xE5; gj&#xF8;re noe, utviklerne gj&#xF8;r det og overleverer det til drift. Drift setter det i produksjon, og det er f&#xF8;rst da man f&#xE5;r feedback fra brukerne. Det er selvsagt mye feil som kan oppst&#xE5; p&#xE5; veien, fordi man har siloer hvor man slenger ting over veggen for at neste avdeling skal ta tak i det. En testavdeling er vanligvis inni dette her ogs&#xE5;, men det har jeg utelatt, fordi det burde dere v&#xE6;rt kvitt for lenge siden (klikk). N&#xE5;r utviklere og drift jobber sammen som et team, eller n&#xE5;r det er de samme folka som utvikler og drifter, s&#xE5; oppst&#xE5;r en masse flotte ting (klikk). Du kan levere kontinuerlig, tester underveis, time to market blir kortere og du f&#xE5;r raskere feedback. Du f&#xE5;r kryssfunksjonelle team, samarbeid, og infrastruktur som kode kvalitetssikrer infrastrukturen din mye bedre enn tradisjonelt.\n
S&#xE5; er det dette med DevOps. Hva er egentlig det? Uviklere kan en del ting, s&#xE5;nn som smidig utvikling, og TDD, automatisering og versjonskontroll, og drift kan en masse ting, som backup, de har DBA-er, overv&#xE5;kning, og ikke minst har de rot-tilgang. Og tradisjonelt ser et utviklingsl&#xF8;p s&#xE5;nn ut. Kunden ber utviklerne om &#xE5; gj&#xF8;re noe, utviklerne gj&#xF8;r det og overleverer det til drift. Drift setter det i produksjon, og det er f&#xF8;rst da man f&#xE5;r feedback fra brukerne. Det er selvsagt mye feil som kan oppst&#xE5; p&#xE5; veien, fordi man har siloer hvor man slenger ting over veggen for at neste avdeling skal ta tak i det. En testavdeling er vanligvis inni dette her ogs&#xE5;, men det har jeg utelatt, fordi det burde dere v&#xE6;rt kvitt for lenge siden (klikk). N&#xE5;r utviklere og drift jobber sammen som et team, eller n&#xE5;r det er de samme folka som utvikler og drifter, s&#xE5; oppst&#xE5;r en masse flotte ting (klikk). Du kan levere kontinuerlig, tester underveis, time to market blir kortere og du f&#xE5;r raskere feedback. Du f&#xE5;r kryssfunksjonelle team, samarbeid, og infrastruktur som kode kvalitetssikrer infrastrukturen din mye bedre enn tradisjonelt.\n
S&#xE5; er det dette med DevOps. Hva er egentlig det? Uviklere kan en del ting, s&#xE5;nn som smidig utvikling, og TDD, automatisering og versjonskontroll, og drift kan en masse ting, som backup, de har DBA-er, overv&#xE5;kning, og ikke minst har de rot-tilgang. Og tradisjonelt ser et utviklingsl&#xF8;p s&#xE5;nn ut. Kunden ber utviklerne om &#xE5; gj&#xF8;re noe, utviklerne gj&#xF8;r det og overleverer det til drift. Drift setter det i produksjon, og det er f&#xF8;rst da man f&#xE5;r feedback fra brukerne. Det er selvsagt mye feil som kan oppst&#xE5; p&#xE5; veien, fordi man har siloer hvor man slenger ting over veggen for at neste avdeling skal ta tak i det. En testavdeling er vanligvis inni dette her ogs&#xE5;, men det har jeg utelatt, fordi det burde dere v&#xE6;rt kvitt for lenge siden (klikk). N&#xE5;r utviklere og drift jobber sammen som et team, eller n&#xE5;r det er de samme folka som utvikler og drifter, s&#xE5; oppst&#xE5;r en masse flotte ting (klikk). Du kan levere kontinuerlig, tester underveis, time to market blir kortere og du f&#xE5;r raskere feedback. Du f&#xE5;r kryssfunksjonelle team, samarbeid, og infrastruktur som kode kvalitetssikrer infrastrukturen din mye bedre enn tradisjonelt.\n
Det har v&#xE6;rt gjort mye for &#xE5; forbedre m&#xE5;ten vi utvikler programvare p&#xE5; de siste 10 &#xE5;ra.\nDet som det ikke har v&#xE6;rt tilstrekkelig fokus p&#xE5; er den s&#xE5;kalt &#x201C;last mile&#x201D; &#x2013; &#xE5; f&#xE5; ting ut i produksjon.\nOg det er f&#xF8;rst da &#x2013; at programvare skaper verdi. &#xC5; utvikle masse ting i parallel og &#xE5; vente med &#xE5; f&#xE5; ut ting som er ferdig er bare dumt. N&#xE5;r en produkteier f&#xE5;r oppleve hvordan det er &#xE5; levere kontinuerlig, s&#xE5; forandres hele tankesettet hans, og det &#xE5;pner seg et hav av nye muligheter. Og vi slutter &#xE5; v&#xE6;re redd for produksjonssettinger (slide: impact)\n
S&#xE5;, hva er det vi &#xF8;nsker at dere skal ta med dere fra dette foredraget?\n
N&#xE5;r man leverer kontinuerlig m&#xE5; man ogs&#xE5; teste kontinuerlig. Vi har ikke tid til testfaser eller overlevering til en testavdeling.\nHusk at det er mindre &#xE5; teste for hver release dersom du leverer ofte,\nAlle skal teste, og det er effektivt at utviklerne tester selv.\nOg ikke glem &#xE5; teste ytelse og sikkerhet.\n
Eit veldig grunnleggende steg p&#xE5; veien mot kontinuerlige leveranser er kontinuerlig integrasjon av kodebasen. Det er vanskelig &#xE5; levere kontinuerlig n&#xE5;r kodebasen f&#xF8;rst blir integrert en m&#xE5;ned etter at featuren er ferdig.\n\nDet vanlige er &#xE5; trigge feedbackmekanismene n&#xE5;r koden sjekkes inn i versjonskontroll. I tillegg m&#xE5; ogs&#xE5; konfigurasjonsendringer, b&#xE5;de av appen og infrastrukturen, trigge disse.\n\nTil slutt har vi Deployment pipelines, som er en m&#xE5;te &#xE5; verifisere at en gitt releasekandidat er klar for produksjon f&#xF8;r den dyttes ut.\nHusk at disse kan bygges inkrementelt, og at man ikke trenger g&#xE5; all-in med utrulling I prod fra dag en for &#xE5; f&#xE5; noe igjen.\n
Et veldig sentralt omr&#xE5;de innen kontinuerlige leveranser er konfigurasjonsstyring.\n\nDet &#xE5; kunne uttrykke infrastrukturen sin som kode gir stor verdi. Slik kan du enkelt provisjonere opp nye milj&#xF8;er, du f&#xE5;r dokumentasjon i form av lettlest kode; infrastrukturen kommer i versjonskontroll. Den blir enkel &#xE5; refaktorere, og den blir ikke minst lik i alle milj&#xF8;er. Men du b&#xF8;r ikke deploye applikasjonen din med et provisjoneringsrammeverk. Da b&#xF8;r du bruke skript.\n
Det er ekstremt viktig &#xE5; ha kontroll p&#xE5; deployment n&#xE5;r du driver med kontinuerlig leveranse. Du b&#xF8;r deploye p&#xE5; samme m&#xE5;te til alle milj&#xF8; og det skal v&#xE6;re s&#xE5; enkelt som &#xE5; trykke p&#xE5; en knapp eller kj&#xF8;re ett skript. En ekstra sikkerhetsmekanisme er feature toggles hvor du kan prodsette features uten at det gj&#xF8;res tilgjengelig for sluttbrukere, eller for kun et utvalg av brukerne. Nedetidfri deployment blir ogs&#xE5; viktig n&#xE5;r du prodsetter hyppigere og hyppigere. Og selvsagt m&#xE5; det v&#xE6;re enkelt &#xE5; rulle frem og tilbake - ogs&#xE5; mellom databaseversjoner. Det er lurt &#xE5; migrere databasen uavhengig av applikasjonen. Da er det f&#xE6;rre ting som kan g&#xE5; galt ved hver deploy.\n
Det er viktig &#xE5; kunne velge den beste teknologien tilgjengelig, og denne kjennetegnes av at den er enkel &#xE5; konfigurere og skripte mot. S&#xE5;nn teknologi er stort sett open source, s&#xE5; de som sliter med &#xE5; overbevise ledelsen om dette m&#xE5; st&#xE5; p&#xE5;. Det skal v&#xE6;re enkelt &#xE5; bytte ut teknologi til fordel for noe bedre, for eksempel med branch by abstraction.\n
Kontinuerlige leveranser m&#xE5; ha en pull-basert prosess. Det nytter ikke &#xE5; drive med en masse planlegging og estimering hvis du skal levere hyppig. Koden m&#xE5; alltid v&#xE6;re produksjonssettbar, ellers s&#xE5; kan du ikke deploye n&#xE5;r du vil. Og - bust siloene! -Samarbeid med drift, eller enda bedre ha driftere eller driftskompetanse i teamet. Selvorganisering skjer ikke over natta, men med kontinuerlig forbedring og &#xE5; t&#xF8;rre &#xE5; pr&#xF8;ve, s&#xE5; blir man bedre og bedre.\n
Og husk: Hvis du ikke leverer kontinuerlig, s&#xE5; er du egentlig ikke smidig!\n