From 2905624ab4862c3c1817ef5cb4fec742659a4eda Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Mon, 29 Dec 2025 13:20:46 +0100 Subject: [PATCH 1/2] Add Dockerfile and GitHub Actions workflow for AWS ECR deployment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds: - Dockerfile with multi-stage build for production deployment - GitHub Actions workflow for automated Docker image building and pushing to AWS ECR - Multi-platform builds (linux/amd64, linux/arm64) - Automated tagging based on branch and SHA - GitHub Actions cache for faster builds 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .github/workflows/build-push-ecr.yml | 62 ++++++++++++++++++++++++++++ Dockerfile | 20 +++++++++ 2 files changed, 82 insertions(+) create mode 100644 .github/workflows/build-push-ecr.yml create mode 100644 Dockerfile diff --git a/.github/workflows/build-push-ecr.yml b/.github/workflows/build-push-ecr.yml new file mode 100644 index 0000000..4fdcc9e --- /dev/null +++ b/.github/workflows/build-push-ecr.yml @@ -0,0 +1,62 @@ +name: Build and Push to AWS ECR + +on: + pull_request: + types: [opened, synchronize, reopened, closed] + workflow_dispatch: + +env: + AWS_REGION: us-east-1 + ECR_REPOSITORY: zerodev/orchestra + +permissions: + contents: write + id-token: write + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::117243983517:role/zerodev-gha + role-session-name: GitHubActions-${{ github.run_id }} + aws-region: ${{ env.AWS_REGION }} + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v2 + with: + registries: "352956043285" + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }} + tags: | + type=sha,prefix=${{ github.event.pull_request.head.ref }}-,enable={{is_not_default_branch}} + type=sha,prefix=,enable={{is_default_branch}} + type=raw,value=latest,enable={{is_default_branch}} + + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + push: true + platforms: linux/amd64,linux/arm64 + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1ea1fea --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM oven/bun AS builder + +WORKDIR /usr/src/app + +COPY package*.json bun.lock* ./ +RUN bun install +COPY . . +RUN bun run build + +FROM oven/bun + +WORKDIR /usr/src/app + +COPY package*.json bun.lock* ./ +RUN bun install --production +COPY --from=builder /usr/src/app/dist ./dist + +ENV NODE_ENV production + +CMD [ "node", "dist/index.js" ] From 8d1be45ae587d1711dda164ae028b9f119801842 Mon Sep 17 00:00:00 2001 From: chris-vest Date: Mon, 29 Dec 2025 12:21:02 +0000 Subject: [PATCH 2/2] chore: format --- bun.lockb | Bin 100755 -> 102867 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index dd8ac5265962a245a185d58eecc6abdea9b4f335..aabf6591ed87771b90f5ea8b294e4f743e50d833 100755 GIT binary patch delta 3628 zcmZ8j-%s0B6z2Iw(KOD1}=Jg*qICl~G!t1I7>Miw{23==8fp=U~gS$C>zO zqUIO zh3B~F4Du)ONt?^ZSvbf)w{bZfHJX5`$e(n16e3Kw`H`P>0ey^4%UvY38KqiqG8<9& zx9+kAv>?0k(yK#tOpQnRR_N-sZ%k)bx@AZ>Z z1AQR+K~u%cY=CYkr$O_9fa}fbfQ))=px7!ih+mCoIU5WlUKmN+czZlG65ZWkJhV+Cm0XwN94YVY--BKTNQb{H$i|LeROd7ctlSbBJ zMfh&SrXg6ZlrqEQC^Fl$5ja)4Z8+$cdXjCKLWrsvDshS=LP-G^8zDr=ZH|z{7I^`e64BNX#nuthfb?Z?3}C#(AAS?! zx8hl8V_aI=!0*hc8&vR&HA=Etu;he`_P|z_2m)6o;d#bPgm|PeH>W@w?1nKm*o|Ex69 zr;B=lPdgkk^GzFd^2}0}-<$5h{CY4g^Q$pU+LdQCEoKz=&Cp$4JhKT&l2MVVAxlF- zL+ojdPeYc5gofB@jZZ_ChJ=RLtj4DyOG83K>=}(uLzaewhS(X6PeYc5gpFD-nrzPV zv^ht29OJTvE#*WgdzMu=vcy4oV%dm#k+6|0BZylnlA zc{^9-&{@FjU2uj$0{X>*-VfMW5)YFWYSldJDQ4LxgJ_D-=vYo(oXO#w%8|f&j^<{4 z6z2D$+5yZ(yKya+v5e}A-h^f69Qm0D$Ug_ws=Q|`z^-}clrA#^GM3OCORhU)2Uv1$ zYk>O&lnTD5@-(HfW8_0P+-~Oc*i0YfXSLxNr4G2PHg$7ZAAQ!c8Zxo0^bl6S23(kS z=b2ehj;(^-#~?TYNgEDnktCj=I25TbN95Rn&m3tb$81r#!P&2P{xnyV2(Bo!&VE(# z#i~NPicM&hyh&QHHH`8aMj5|rYtW>eciL%)L5Z4SxkTFgupq1w`G@+y@Q@s@=jn`I zNv4hLNns-@1#vzko80a7SvLjB>k(?#Gm$K}*1g=o*|JX7)E7aojSh@%egl}{eO8ab z(BJSHx7fgpyuB&=XJ*q)Avvx#m3WCw>4An#(2ULZ@&%c9dlx)U;Op-K+^%FU+alkW z<;!vl-e=B>af>|Fik=ccr9PtAwv)eDjW&X2B6E9N&qA^7MUU-Zq;^V_+dDZ;7qLT+ z7(=EKJSpfA!*)p)JeK5u(U7Gfp&|CH#-|}mLqbFBqQ{5j@!884+iT%^0M%;Bo}l0M zT;;76W9IOFi}8GOyJ`P>Cwv%gGfo)(pTLA4Vf|c59yk6S`~|j8VEqm2A6Os2dLPzZ zSk=m+&v>U>!1fWW$FP2f^((C3nkwJ=jG_1Z#z+1?0DlbYlgg)l6S1T(EM)L6Lf^o}e-?d3o2Z#TiHT+w?m$qLi-MDydo4@(>o&N#D C)~DY9 delta 3197 zcmY*bO-vg{6rKSLUVBT{uz-O;3`zKh3_nQ>7`$L0CJBill%Jf4sz_8yA~&g8a;W5} z7b-=n5hJ@9Kkca@Tz|0}-N)0M*7a@ZXUpFYuopsiVP}S82O}TijE`wDl zZQrf+C#DtNdib<-A$nNjtA`B{_e7oQfP9%2hU@HciP!o0cAecvU%kft^#OUJNNP^k ztBxW#e@vo%Kox*aNn{++_`;C@*d=_}K4N7|^Xay~l-IDfbL8RU@Py zJQW5W@W9_763uuF{?{4;v@Dk}tfrJyZVOZEvD?QJ<7{7hg z?I?%6kd(~8UJW3JM9yQXqXZDps+XxcA@e4|F+XdtT?pF>-v~1mA~0iGjY;zz*KI+L z9*5{3H~3mFOEhWR+hp+dCg3m3*PAf5l)u%;v?@XZrXHajOKrJX(C@wGAT32g%qje@ z=0kk1l5wL2{YURsTU1K<{gxnoEf*ngt3AO>fT&E)daEjZzahQN!a5e0C=Y*|NoM%Z zv>B2?TDzquZ2*be-O@j4w!4;)0We#Xs-)*`yKdgXI;?s&bcNsUaLb^fwV4ioqVu3y zBb`>2WyTf$ai<$pJn0Pa{my`?EZSu$6Gm$vK)<8(m%!+W)DI@0X!N?<9mU=Y4(i59b#+f)(N1UY|;@LTfY5eVm@cploxL%x3dx#c{R z&O`hC!t>V#?4GX<*iUcgA@87&?;Nz`H#!-AJcvBQOl1c#rv8BHaDZDyynB%GJAuLCY?Sj}gkz_4~RZSw>QHey$+%n{;#E9yslcvfrj|gG09Up;?F=FtrVDu*nqCx8snoCqGo3%1Jdg~ZJ+Lr-7T&wF7#iQXgY{+G zJZ;Xi=M28ouQ-PYVG!pcK7Br9Ub1~2B7NR~r;qWaDd+@K0ozAKb_x}<3%Y!Xkd?6u z7LlIH*^3K7M=|6M`^myZbe!_(2BsQ>44ZX{aoM{lnh4`8Vx>$Za3z9=Fu56PFEMRE z{uSq_`MB^a(;*qROoQTv#U4;CI+a}W&3GkgqBHPh&6w;?T(YMjd8<3LS`+`zyu7<>g)DCzYPf4@0}Ch4V`mA^QlVB zVdk=P8h6ecvh&C0EfX^H_ym_qzG(~i@Z&ekLLN%xp}joB7VYO&@=zuZIWOBKBRK@& z`1+&Eu8qocq4=r+CyVjl6}WZtjjm+cP1)v4H=QkT`OTeW*XC#`Ev3p!5dR6rkIBVD z^v}BcF#QC^0~je7Kg0M9#_urxNM6_Ihc%C3`UuA7Fus8C5XL%;&q(rbjn*WYhdxri zgoUqQ{E~d(q2IdJTxigqmi)AgJ}CMRe#x7k;|K_{+ E|KZS9tN;K2