?我的博客是如何进行持续部署的:

接上篇

?如何开发个人博客:

准备

  • 服务器
  • docker
  • dockerHub
  • github
  • nginx

目标

使用githubactions-workflows进行deploy

流程图

graph TD 0.添加配置文件 --> 1.推送代码 --> 2.触发`Action` --> 3.触发`workflow` --> 4.打包镜像 --> 5.推送镜像 --> 6.登录服务器 --> 7.删除原有容器 --> 8.拉取新镜像 --> 9.部署容器 --> 10.使用`nginx`重定向

0.添加配置文件

注册dockerHub 账号

dockerhub

在项目根目录创建.github文件夹

.github文件夹下创建wrokflows文件夹

wrokflows文件夹下创建deploy.yml (deploy名称可自行配置,不与其他冲突即可)

yml 复制代码
# 流程名称
name: Docker Image CI

根据下面的步骤慢慢补充部署文件

Dockerfile配置

如果你也是NextJs 14^可以参考我的配置

yml 复制代码
FROM node:18-alpine AS base

# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
# RUN apk add --no-cache libc6-compat
WORKDIR /app

# Install dependencies based on the preferred package manager
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
  if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
  elif [ -f package-lock.json ]; then npm ci; \
  elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
  else echo "Lockfile not found." && exit 1; \
  fi


# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
# ENV NEXT_TELEMETRY_DISABLED 1

RUN yarn build

# If using npm comment out above and use below instead
# RUN npm run build

# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app

ENV NODE_ENV production
# Uncomment the following line in case you want to disable telemetry during runtime.
# ENV NEXT_TELEMETRY_DISABLED 1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

COPY --from=builder /app/public ./public

# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown nextjs:nodejs .next

# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
#COPY --from=builder --chown=nextjs:nodejs /app/.next ./_next
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./public/_next

USER nextjs

EXPOSE 3000

ENV PORT 3000
# set hostname to localhost
ENV HOSTNAME "0.0.0.0"

CMD ["node", "server.js"]

1.推送代码

基本操作,不做赘述

bash 复制代码
git fetch
git add -A
git commit -m "feat: xxx"
git push

2.触发Action

deploy.yml添加如下代码

yml 复制代码
on:
  push: # push 时触发ci
    branches: [master] # 作用于master分支

检测到 push 操作会触发Action作用于master分支

3.触发workflow

添加环境变量

yml 复制代码
env:
  # 环境变量
  # 镜像名称 可自定义
  IMAGE_NAME: my_blog
  # 容器名称 可自定义
  DOCKER_NAME: myBlog

添加任务

yml 复制代码
# 添加任务
jobs:
    #使用ubuntu环境构建
  build:
    runs-on: ubuntu-latest

4.打包镜像

yml 复制代码
  # 步骤
    steps:
      # 拉取main分支代码
      - name: Checkout
        uses: actions/checkout@v3
      # 制作镜像
      - name: Build the Docker image
        run: docker build . --file Dockerfile --tag ${{env.IMAGE_NAME}}

5.推送镜像

yml 复制代码
      # 登录dockerHub
      - name: Log into registry
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
          logout: false
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ env.IMAGE_NAME }}
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,enable=true,priority=600,prefix=,suffix=,event=tag
      # 推送镜像
      - name: Build and push Docker image
        uses: docker/build-push-action@v3
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

6.登录服务器

yml 复制代码
      # 登录远程服务器,拉取镜像,制作并重启容器
      # https://github.com/marketplace/actions/remote-ssh-commands
      - name: ssh remote deploy
        uses: fifsky/ssh-action@master
        with:
          command: |
            cd /
            echo -e "1.docker login start==>"
            echo ${{ secrets.DOCKER_PASSWORD }} | docker login --username ${{ secrets.DOCKER_USERNAME }} --password-stdin
            
          # --下面填充更多步骤---
          
          host: ${{ secrets.HOST }}
          user: ${{ secrets.USER }}
          pass: ${{ secrets.PASSWORD }}

7.删除原有容器

yml 复制代码
            # 停止容器
            echo -e "2.docker stop container==>"
            docker container stop ${{ env.DOCKER_NAME }}
            
            # 删除容器
            echo -e "3.docker conatainer rm==>"
            docker container rm ${{ env.DOCKER_NAME }}
            
            # 删除原镜像
            echo -e "4.docker image rm==>"
            docker image rm ${{ secrets.DOCKER_USERNAME }}/${{ steps.meta.outputs.tags }}

8.拉取新镜像

yml 复制代码
            # 拉取新镜像
            echo -e "5.docker pull==>"
            docker pull ${{ secrets.DOCKER_USERNAME }}/${{ steps.meta.outputs.tags }}

9.部署容器

yml 复制代码
            # 部署容器
            echo -e "6.docker container create and start==>"
            docker container run -d -p 3000:3000 --name ${{ env.DOCKER_NAME }} ${{ secrets.DOCKER_USERNAME }}/${{ steps.meta.outputs.tags }}

登出docker

yml 复制代码
            # 登出docker
            echo -e "7.docker logout==>"
            docker logout

10.使用nginx重定向

yml 复制代码
server
{
    listen 80;
    server_name your.doman.xx;
    # ...
    location / {
        proxy_pass http://127.0.0.1:3000; # 容器地址
        # ...
    }
    # ...
}

完整deploy.yml

yml 复制代码
# 流程名称
name: Docker Image CI

on:
  push: # push 时触发ci
    branches: [master] # 作用于master分支
env:
  # 环境变量
  # 镜像名称
  IMAGE_NAME: my_blog
  # 容器名称
  DOCKER_NAME: myBlog
# 然后添加任务
jobs:
    #使用ubuntu环境构建
  build:
    runs-on: ubuntu-latest
      # 步骤
    steps:
      # 拉取main分支代码
      - name: Checkout
        uses: actions/checkout@v3
      # 制作镜像
      - name: Build the Docker image
        run: docker build . --file Dockerfile --tag ${{env.IMAGE_NAME}}
      # 登录dockerHub
      - name: Log into registry
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
          logout: false
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ env.IMAGE_NAME }}
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,enable=true,priority=600,prefix=,suffix=,event=tag
      # 推送镜像
      - name: Build and push Docker image
        uses: docker/build-push-action@v3
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
      # 登录远程服务器,拉取镜像,制作并重启容器
      # https://github.com/marketplace/actions/remote-ssh-commands
      - name: ssh remote deploy
        uses: fifsky/ssh-action@master
        with:
          command: |
            cd /
            echo -e "1.docker login start==>"
            echo ${{ secrets.DOCKER_PASSWORD }} | docker login --username ${{ secrets.DOCKER_USERNAME }} --password-stdin

            echo -e "2.docker stop container==>"
            docker container stop ${{ env.DOCKER_NAME }}

            echo -e "3.docker conatainer rm==>"
            docker container rm ${{ env.DOCKER_NAME }}

            echo -e "4.docker image rm==>"
            docker image rm ${{ secrets.DOCKER_USERNAME }}/${{ steps.meta.outputs.tags }}

            echo -e "5.docker pull==>"
            docker pull ${{ secrets.DOCKER_USERNAME }}/${{ steps.meta.outputs.tags }}

            echo -e "6.docker container create and start==>"
            docker container run -d -p 3000:3000 --name ${{ env.DOCKER_NAME }} ${{ secrets.DOCKER_USERNAME }}/${{ steps.meta.outputs.tags }}

            echo -e "7.docker logout==>"
            docker logout
          host: ${{ secrets.HOST }}
          user: ${{ secrets.USER }}
          pass: ${{ secrets.PASSWORD }}

注意 ${{ secrets.XXX }} 是需要在github里配置的

配置 Secrets

Secrets 描述
DOCKER_PASSWORD dockerhub密码
DOCKER_USERNAME dockerhub账号
HOST 服务器host
PASSWORD 服务器密码
USER 服务器账号

最后

本教程不保证适合所有人,大家可以参考我的来编写,如有问题十分欢迎在评论区指出和交流!!!

相关推荐
遗憾随她而去.2 分钟前
前端大文件上传(切片并发/断点续传/秒传/WebWorker 计算Hash) 含完整代码
前端
AKA__老方丈40 分钟前
vue-cropper图片裁剪、旋转、缩放、实时预览
前端·vue.js
梦6502 小时前
Vue 单页面应用 (SPA) 与 多页面应用 (MPA) 对比
前端·javascript·vue.js
清铎2 小时前
大模型训练_week3_day15_Llama概念_《穷途末路》
前端·javascript·人工智能·深度学习·自然语言处理·easyui
短剑重铸之日2 小时前
《7天学会Redis》特别篇: Redis分布式锁
java·redis·分布式·后端·缓存·redission·看门狗机制
岛泪2 小时前
把 el-cascader 的 options 平铺为一维数组(只要叶子节点)
前端·javascript·vue.js
小北方城市网2 小时前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存
hanqunfeng3 小时前
(三十三)Redisson 实战
java·spring boot·后端
Kiyra3 小时前
阅读 Netty 源码关于 NioEventLoop 和 Channel 初始化部分的思考
运维·服务器·前端
冰暮流星3 小时前
javascript的switch语句介绍
java·前端·javascript