name: CI on: workflow_dispatch: push: branches: - 'main' tags: - 'v*' pull_request: branches: - 'main' env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: build-and-push-image: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v4 - name: Login to GitHub Package Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GHCR_TOKEN }} - name: Build and push uses: docker/build-push-action@v5 with: context: . push: true tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - name: Deploy to server uses: appleboy/ssh-action@v0.1.3 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USERNAME }} key: ${{ secrets.SERVER_KEY }} script: | docker login ghcr.io --username ${{ secrets.GHCR_USERNAME }} --password ${{ secrets.GHCR_TOKEN }} docker stop pm || true docker rm pm || true docker run -d --restart always -e TZ=Asia/Shanghai --name pm -p 8080:8080 --net=host --mount type=bind,source=$HOME/pm/etc/pm.yaml,target=/app/etc/pm.yaml ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} docker logout ghcr.io
workflow_dispatch
: 允许手动触发此工作流程。push
: 当代码被推送到main
分支或标签以 'v*' 开头时触发。pull_request
: 当有拉取请求到main
分支时触发。
-
环境变量:
REGISTRY
: 定义 Docker 镜像的注册表地址,这里是 GitHub Container Registry (ghcr.io)。IMAGE_NAME
: 定义镜像名称,使用 GitHub 仓库名。
-
作业步骤:
- 检出仓库: 使用
actions/checkout@v4
检出代码。 - 登录到 GitHub Package Registry: 使用
docker/login-action@v3
和 GitHub 密钥登录到 Docker 注册表。 - 构建和推送镜像: 使用
docker/build-push-action@v5
构建并推送 Docker 镜像。标签包括当前提交的 SHA 和 'latest'。 - 部署到服务器: 使用
appleboy/[email protected]
连接到服务器,并执行部署脚本。这个脚本做了以下事情:- 登录到 Docker 注册表。
- 停止并移除旧的 Docker 容器(如果存在)。
- 使用新的镜像启动 Docker 容器,并设置一些参数(如时区、端口映射、配置文件绑定等)。
- 登出 Docker 注册表。
- 检出仓库: 使用