我用 Vue 和 Python 做了 AI 生成音樂的應用程式,然後用 Jenkins 讓每個 commit 自動從 GitHub pull 下來並佈署到 server,非常方便。
前置作業是要在 server 上安裝 Docker 和 Jenkins。不過有人幫我裝好了,所以這裡不寫細節。(我也不會裝
新增 Jenkinsfile 和 Dockerfile
首先要在 git repo 裡面新增 Jenkinsfile 和 Dockerfile。
Jenkinsfile 用來描述每次有新 commit 要做的三件事: build image、刪掉舊 container、跑新 container。
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
sh 'docker build -t midi-gen .'
}
}
}
stage('Run') {
steps {
script {
sh 'docker ps -qa --filter "name=midi-gen" | grep -q . && docker stop midi-gen && docker rm midi-gen || true'
sh 'docker run --name midi-gen -e CHECKPOINT_PATH=/volume/checkpoint.pt -v /home/eri/midi-gen-volume:/volume -p 8010:8010 --gpus all --rm -d midi-gen'
}
}
}
}
}
Dockerfile 的內容不是本文重點,也不會都長這樣,但放在這裡供參:
FROM node:22-alpine as frontend-builder
WORKDIR /frontend
COPY frontend/package.json frontend/package-lock.json ./
RUN npm install
COPY frontend/ .
RUN npm run build-only
FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime
WORKDIR /app/backend
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y git
COPY backend/pyproject.toml .
RUN pip install -e .
COPY backend/ .
WORKDIR /app
COPY --from=frontend-builder /frontend/dist ./static
CMD ["uvicorn", "backend.app.main:app", "--host", "0.0.0.0", "--port", "8010"]
在 Jenkins 上設定 pipeline
先在 Jenkins 安裝 GitHub plugin。
然後新增 pipeline
進入 pipeline 的 configuration,然後指定 git repo 和 build trigger
最後在 GitHub repo 上面新增 webhook,發送到 <你的 jenkins url>/github-webhook/
。這樣 GitHub 就會在 push 的時候通知 Jenkins 佈署。
然後就完成自動佈署的串接了。你可以試著 commit 看看,應該能觸發 Jenkins pipeline 並讓你的應用程式在 server 上啟動/更新。