|
483 | 483 | </ul> |
484 | 484 | </nav> |
485 | 485 |
|
| 486 | +</li> |
| 487 | + |
| 488 | + <li class="md-nav__item"> |
| 489 | + <a href="#github-actions" class="md-nav__link"> |
| 490 | + <span class="md-ellipsis"> |
| 491 | + Github Actions |
| 492 | + </span> |
| 493 | + </a> |
| 494 | + |
486 | 495 | </li> |
487 | 496 |
|
488 | 497 | </ul> |
|
579 | 588 | </ul> |
580 | 589 | </nav> |
581 | 590 |
|
| 591 | +</li> |
| 592 | + |
| 593 | + <li class="md-nav__item"> |
| 594 | + <a href="#github-actions" class="md-nav__link"> |
| 595 | + <span class="md-ellipsis"> |
| 596 | + Github Actions |
| 597 | + </span> |
| 598 | + </a> |
| 599 | + |
582 | 600 | </li> |
583 | 601 |
|
584 | 602 | </ul> |
@@ -683,6 +701,81 @@ <h3 id="flip-traffic">Flip traffic</h3> |
683 | 701 | </code></pre></div> |
684 | 702 | <p>Cutover is instant. Green is now live, and Blue is the idle stack.</p> |
685 | 703 | <p>And rollback is simple: flip the <code>Caddyfile</code> back and <code>caddy reload</code> again.</p> |
| 704 | +<h2 id="github-actions">Github Actions</h2> |
| 705 | +<p>Here's a workflow for B/G deploys:</p> |
| 706 | +<details> |
| 707 | +<summary>Click to expand</summary> |
| 708 | + |
| 709 | +<div class="highlight"><span class="filename">.github/workflows/ci.yaml</span><pre><span></span><code><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Deploy to VPS</span> |
| 710 | + |
| 711 | +<span class="nt">on</span><span class="p">:</span> |
| 712 | +<span class="w"> </span><span class="nt">push</span><span class="p">:</span> |
| 713 | +<span class="w"> </span><span class="nt">branches</span><span class="p">:</span> |
| 714 | +<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">main</span> |
| 715 | + |
| 716 | +<span class="nt">jobs</span><span class="p">:</span> |
| 717 | +<span class="w"> </span><span class="nt">deploy</span><span class="p">:</span> |
| 718 | +<span class="w"> </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ubuntu-latest</span> |
| 719 | +<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">production</span> |
| 720 | + |
| 721 | +<span class="w"> </span><span class="nt">steps</span><span class="p">:</span> |
| 722 | +<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Checkout code</span> |
| 723 | +<span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">actions/checkout@v4</span> |
| 724 | + |
| 725 | +<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Start SSH agent</span> |
| 726 | +<span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">webfactory/ssh-agent@v0.9.0</span> |
| 727 | +<span class="w"> </span><span class="nt">with</span><span class="p">:</span> |
| 728 | +<span class="w"> </span><span class="nt">ssh-private-key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.VPS_SSH_KEY }}</span> |
| 729 | + |
| 730 | +<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Get the idle stack</span> |
| 731 | +<span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">idle</span> |
| 732 | +<span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">|</span> |
| 733 | +<span class="w"> </span><span class="no">ACTIVE=$(ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no \</span> |
| 734 | +<span class="w"> </span><span class="no">${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }} \</span> |
| 735 | +<span class="w"> </span><span class="no">'cat active_stack 2>/dev/null || echo blue')</span> |
| 736 | + |
| 737 | +<span class="w"> </span><span class="no">if [ "$ACTIVE" = "blue" ]; then</span> |
| 738 | +<span class="w"> </span><span class="no">echo "IDLE=green" >> $GITHUB_OUTPUT</span> |
| 739 | +<span class="w"> </span><span class="no">else</span> |
| 740 | +<span class="w"> </span><span class="no">echo "IDLE=blue" >> $GITHUB_OUTPUT</span> |
| 741 | +<span class="w"> </span><span class="no">fi</span> |
| 742 | +<span class="w"> </span><span class="no">echo "ACTIVE=$ACTIVE" >> $GITHUB_OUTPUT</span> |
| 743 | + |
| 744 | +<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Copy compose.yaml to idle stack</span> |
| 745 | +<span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">appleboy/scp-action@master</span> |
| 746 | +<span class="w"> </span><span class="nt">with</span><span class="p">:</span> |
| 747 | +<span class="w"> </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.VPS_HOST }}</span> |
| 748 | +<span class="w"> </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.VPS_USER }}</span> |
| 749 | +<span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">22</span> |
| 750 | +<span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.VPS_SSH_KEY }}</span> |
| 751 | +<span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s">"compose.yaml"</span> |
| 752 | +<span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="s">"${{</span><span class="nv"> </span><span class="s">steps.idle.outputs.IDLE</span><span class="nv"> </span><span class="s">}}/"</span> |
| 753 | + |
| 754 | +<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Deploy with Docker Compose</span> |
| 755 | +<span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">appleboy/ssh-action@v1.0.3</span> |
| 756 | +<span class="w"> </span><span class="nt">with</span><span class="p">:</span> |
| 757 | +<span class="w"> </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.VPS_HOST }}</span> |
| 758 | +<span class="w"> </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.VPS_USER }}</span> |
| 759 | +<span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.VPS_SSH_KEY }}</span> |
| 760 | +<span class="w"> </span><span class="nt">envs</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">GHCR_PAT,JWT_SECRET,POSTGRES_USER,PGUSER,POSTGRES_PASSWORD,PGPASS,PGRST_AUTHENTICATOR_PASS</span> |
| 761 | +<span class="w"> </span><span class="nt">script</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">|</span> |
| 762 | +<span class="w"> </span><span class="no">set -euo pipefail</span> |
| 763 | +<span class="w"> </span><span class="no">echo $GHCR_PAT | docker login ghcr.io -u ${{ github.actor }} --password-stdin</span> |
| 764 | +<span class="w"> </span><span class="no">cd ${{ steps.idle.outputs.IDLE }}</span> |
| 765 | +<span class="w"> </span><span class="no">docker compose pull -q</span> |
| 766 | +<span class="w"> </span><span class="no">docker compose up -d</span> |
| 767 | +<span class="w"> </span><span class="no">echo "${{ steps.idle.outputs.ACTIVE }}" > active_stack</span> |
| 768 | +<span class="w"> </span><span class="nt">env</span><span class="p">:</span> |
| 769 | +<span class="w"> </span><span class="nt">GHCR_PAT</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.GHCR_PAT }}</span> |
| 770 | +<span class="w"> </span><span class="nt">JWT_SECRET</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.JWT_SECRET }}</span> |
| 771 | +<span class="w"> </span><span class="nt">PGRST_AUTHENTICATOR_PASS</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.PGRST_AUTHENTICATOR_PASS }}</span> |
| 772 | +<span class="w"> </span><span class="nt">PGUSER</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.PGUSER }}</span> |
| 773 | +<span class="w"> </span><span class="nt">PGPASS</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.PGPASS }}</span> |
| 774 | +<span class="w"> </span><span class="nt">POSTGRES_USER</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.POSTGRES_USER }}</span> |
| 775 | +<span class="w"> </span><span class="nt">POSTGRES_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.POSTGRES_PASSWORD }}</span> |
| 776 | +</code></pre></div> |
| 777 | + |
| 778 | +</details> |
686 | 779 |
|
687 | 780 |
|
688 | 781 |
|
|
0 commit comments