|
1 | 1 | --- Expand README nginx rollout across a fleet --- |
2 | 2 |
|
3 | 3 | set release_id = "2026.04.15" |
| 4 | +set web_names = "web-01,web-02,web-03,web-04,web-05,web-06,web-07,web-08,web-09,web-10,web-11,web-12" |
4 | 5 | set web_hosts = "web-01:deploy@10.0.1.11,web-02:deploy@10.0.1.12,web-03:deploy@10.0.1.13,web-04:deploy@10.0.1.14,web-05:deploy@10.0.1.15,web-06:deploy@10.0.1.16,web-07:deploy@10.0.1.17,web-08:deploy@10.0.1.18,web-09:deploy@10.0.1.19,web-10:deploy@10.0.1.20,web-11:deploy@10.0.1.21,web-12:deploy@10.0.1.22" |
5 | 6 |
|
6 | 7 | target "control" local: |
7 | 8 |
|
8 | | - [prepare release bundle]: |
9 | | - skip if $ test -f /tmp/cgr-pages-demo/releases/myapp-${release_id}.tar.gz |
10 | | - run $ mkdir -p /tmp/cgr-pages-demo/releases && printf "myapp %s\n" "${release_id}" > /tmp/cgr-pages-demo/releases/myapp-${release_id}.tar.gz |
| 9 | + [build release]: |
| 10 | + parallel 3 at a time, if one fails stop all: |
| 11 | + [render nginx template]: |
| 12 | + run $ mkdir -p /tmp/cgr-pages-demo/build && printf "server template %s\n" "${release_id}" > /tmp/cgr-pages-demo/build/nginx.conf |
11 | 13 |
|
12 | | - [smoke test release]: |
13 | | - first [prepare release bundle] |
14 | | - run $ test -s /tmp/cgr-pages-demo/releases/myapp-${release_id}.tar.gz |
| 14 | + [compile static assets]: |
| 15 | + run $ mkdir -p /tmp/cgr-pages-demo/build && printf "assets %s\n" "${release_id}" > /tmp/cgr-pages-demo/build/assets.txt |
| 16 | + |
| 17 | + [write release notes]: |
| 18 | + run $ mkdir -p /tmp/cgr-pages-demo/build && printf "release %s\n" "${release_id}" > /tmp/cgr-pages-demo/build/notes.txt |
| 19 | + |
| 20 | + run $ tar -czf /tmp/cgr-pages-demo/myapp-${release_id}.tar.gz -C /tmp/cgr-pages-demo/build . |
| 21 | + |
| 22 | + [choose artifact mirror]: |
| 23 | + first [build release] |
| 24 | + |
| 25 | + race: |
| 26 | + [mirror us-east]: |
| 27 | + run $ printf "us-east\n" > /tmp/cgr-pages-demo/mirror.txt |
| 28 | + |
| 29 | + [mirror us-west]: |
| 30 | + run $ printf "us-west\n" > /tmp/cgr-pages-demo/mirror.txt |
| 31 | + |
| 32 | + [mirror eu-central]: |
| 33 | + run $ printf "eu-central\n" > /tmp/cgr-pages-demo/mirror.txt |
| 34 | + |
| 35 | + [preload release to fleet]: |
| 36 | + first [choose artifact mirror] |
| 37 | + |
| 38 | + each server in ${web_names}, 4 at a time: |
| 39 | + [preload ${server}]: |
| 40 | + run $ printf "preloaded ${release_id} for ${server}\n" >> /tmp/cgr-pages-demo/preload.log |
| 41 | + |
| 42 | + [shift traffic]: |
| 43 | + first [preload release to fleet] |
| 44 | + |
| 45 | + stage "traffic shift": |
| 46 | + phase "canary" 1 from ${web_names}: |
| 47 | + [enable ${server} in load balancer]: |
| 48 | + run $ printf "enabled canary ${server}\n" >> /tmp/cgr-pages-demo/lb.log |
| 49 | + |
| 50 | + verify "canary ${server} healthy": |
| 51 | + run $ printf "healthy ${server}\n" |
| 52 | + retry 3x wait 2s |
| 53 | + |
| 54 | + phase "half" 50% from ${web_names}: |
| 55 | + each server, 3 at a time: |
| 56 | + [enable ${server} in load balancer]: |
| 57 | + run $ printf "enabled half ${server}\n" >> /tmp/cgr-pages-demo/lb.log |
| 58 | + |
| 59 | + phase "remaining" rest from ${web_names}: |
| 60 | + each server, 6 at a time: |
| 61 | + [enable ${server} in load balancer]: |
| 62 | + run $ printf "enabled remaining ${server}\n" >> /tmp/cgr-pages-demo/lb.log |
15 | 63 |
|
16 | 64 | each name, addr in ${web_hosts}: |
17 | 65 | target "${name}" ssh ${addr}: |
18 | 66 |
|
19 | 67 | [install nginx] as root: |
20 | | - first [control/smoke test release] |
| 68 | + first [control/choose artifact mirror] |
21 | 69 | skip if $ command -v nginx |
22 | 70 | run $ apt-get update && apt-get install -y nginx |
23 | 71 |
|
24 | | - [write site config] as root: |
| 72 | + [configure and stage ${name}]: |
25 | 73 | first [install nginx] |
26 | | - content > /etc/nginx/sites-available/myapp: |
27 | | - server { |
28 | | - listen 80; |
29 | | - server_name ${name}.example.com; |
30 | | - root /var/www/myapp; |
31 | | - index index.html; |
32 | | - location / { try_files $uri $uri/ =404; } |
33 | | - } |
34 | | - validate $ nginx -t |
35 | | - |
36 | | - [enable site] as root: |
37 | | - first [write site config] |
38 | | - skip if $ test -L /etc/nginx/sites-enabled/myapp |
39 | | - run $ ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp |
40 | | - |
41 | | - [deploy code]: |
42 | | - first [install nginx] |
43 | | - skip if $ test -f /var/www/myapp/releases/${release_id}/index.html |
44 | | - run $ mkdir -p /var/www/myapp/releases/${release_id} && printf '<h1>Hello from ${name}</h1>\n' > /var/www/myapp/releases/${release_id}/index.html |
| 74 | + |
| 75 | + parallel, if one fails wait for rest: |
| 76 | + [write site config] as root: |
| 77 | + content > /etc/nginx/sites-available/myapp: |
| 78 | + server { |
| 79 | + listen 80; |
| 80 | + server_name ${name}.example.com; |
| 81 | + root /var/www/myapp/current; |
| 82 | + index index.html; |
| 83 | + location / { try_files $uri $uri/ =404; } |
| 84 | + } |
| 85 | + validate $ nginx -t |
| 86 | + |
| 87 | + [deploy code]: |
| 88 | + skip if $ test -f /var/www/myapp/releases/${release_id}/index.html |
| 89 | + run $ mkdir -p /var/www/myapp/releases/${release_id} && printf '<h1>Hello from ${name}</h1>\n' > /var/www/myapp/releases/${release_id}/index.html |
| 90 | + |
| 91 | + [write health endpoint]: |
| 92 | + run $ mkdir -p /var/www/myapp/releases/${release_id} && printf 'ok ${name}\n' > /var/www/myapp/releases/${release_id}/health.txt |
45 | 93 |
|
46 | 94 | [activate release] as root: |
47 | | - first [deploy code] |
| 95 | + first [configure and stage ${name}] |
48 | 96 | run $ ln -sfn /var/www/myapp/releases/${release_id} /var/www/myapp/current |
49 | 97 |
|
50 | 98 | [start nginx] as root: |
51 | | - first [enable site], [activate release] |
| 99 | + first [activate release] |
52 | 100 | skip if $ systemctl is-active nginx |
53 | 101 | run $ systemctl reload-or-restart nginx |
54 | 102 |
|
55 | 103 | verify "site is live on ${name}": |
56 | | - first [start nginx] |
| 104 | + first [start nginx], [control/shift traffic] |
57 | 105 | run $ curl -sf http://localhost/ |
58 | 106 | retry 3x wait 2s |
59 | 107 |
|
|
0 commit comments