CICD实现:Github Actions +Dcoker 部署ASP

CI/CD实现:Github Actions +Dcoker 部署ASP.Net Core至Linux服务器

写在开头

事实上,对于CI/CD这个概念,我很早就有了一定的认识,不过从未真正行动过,而在我的日常工作中,我认为确确实实需要这个东西。

比如:

1.我曾经提到过的单个应用程序被重复部署在了数十个工厂服务器上,如果实行CI/CD,可以及时的处理所有问题。

2.我们的核心业务模块,即追溯系统,每次我们发布系统都需要跟工厂确定发布时间,一般是中午11点或者下午5点才能进行更新,人为发布失误造成工厂产线停线已经有很多次了,而CI/CD自动化的流程可以帮助我们解决这个问题。

下面我将使用Github ActionsDcoker来做个示例:

实现

在服务器上生成 SSH 密钥对
ssh-keygen -t rsa -b 4096 -C "github-actions"

cat ~/.ssh/id_rsa  

将私钥复制到github仓库的 Settings > Secrets

注意:需要包含头和尾:即-----BEGIN RSA PRIVATE KEY-----

接下来我们需要将公钥写入 ~/.ssh/authorized_keys,安装一个自动化工具

安装OpenSSH
# 安装 OpenSSH 服务端
sudo yum install openssh-server

# 启动 SSH 服务
sudo systemctl start sshd
sudo systemctl enable sshd

# 执行命令后输入服务器密码(替换 username 和 server_ip)
ssh-copy-id -i ~/.ssh/id_rsa.pub username@server_ip

#验证
ssh username@server_ip

注意:我的服务器是centos

生成DockerFile文件

这里我们使用VS 或者 Rider生成就好了,不过需要注意的是EXPOSE暴露的端口,我们之后会用到

设置Docker Hub

因为我们需要将镜像包上传到Docker Hub,所以我们需要先做一些配置操作。

注册完账号之后,点击右上角头像-->Account Settings-->Personal access tokens 然后生成一个new token。

注意:Access Permissions需要选择Read,Write,Delete

之后我们需要拷贝token到github进行配置,与上面配置SSH私钥操作相同。

编写Workflow文件

注意:文件路径为根目录下 .github/workflows/test.yml

name: docker部署

#环境变量
env:
    IMAGE_NAME: ssz031117/ssz_api
    TAG: latest
on:
  # 触发条件:手动触发
  #workflow_dispatch:
    push:
    
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 配置 .NET 环境
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 9.0.x
          
      - name: 登录 Docker Hub
        uses: docker/login-action@v2
        with:
            username: ${{ secrets.DOCKER_HUB_USERNAME }}
            password: ${{ secrets.DOCKER_HUB_TOKEN }}
      - name: 构建 Docker 镜像
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./SSZ.Api/Dockerfile
          push: false
          tags: |
            ${{ env.IMAGE_NAME }}:${{ env.TAG }}
    
      - name: 保存镜像为压缩包
        run: |
            # 将镜像保存为 tar 文件
            docker save -o ssz-api.tar ${{ env.IMAGE_NAME }}:${{ env.TAG }}
            # 压缩文件减少传输体积
            gzip ssz-api.tar

      - name: 通过 SCP 传输镜像
        uses: appleboy/scp-action@v0.1.4
        with:
            host: ${{ secrets.SERVER_IP }}
            username: ${{ secrets.SERVER_USER }}
            key: ${{ secrets.SSH_PRIVATE_KEY }}
            source: "ssz-api.tar.gz"
            target: "/home/ssz_api/docker-images/"

      - name: SSH 部署到服务器
        uses: appleboy/ssh-action@v1
        with:
            host: ${{ secrets.SERVER_IP }}
            username: ${{ secrets.SERVER_USER }}
            key: ${{ secrets.SSH_PRIVATE_KEY }}
            script: |
                # 解压并加载镜像
                cd /home/ssz_api/docker-images
                gunzip -f ssz-api.tar.gz
                docker load -i ssz-api.tar
                # 清理旧容器
                docker stop ssz-api || true
                docker rm ssz-api || true

                # 拉取最新镜像
                #echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
                #docker pull ${{ env.IMAGE_NAME }}:${{ env.TAG }}

                # 启动新容器
                docker run -d \
                    --name ssz-api \
                    --restart unless-stopped \
                    -p 5155:8080 \
                    -e ASPNETCORE_ENVIRONMENT=Production \
                    ${{ env.IMAGE_NAME }}:${{ env.TAG }}

        

由于我的服务器是阿里云,无法访问到Docker Hub,所以将生成的镜像文件进行压缩,然后通过SCP传输到我的服务器,正常操作是直接在服务器上执行docker pull就行,如过是私有仓库,则需要先进行验证操作

在上述操作中,一旦代码上传,我们便会将应用程序通过docker部署至服务器上,并使用5155端口(容器内部是8080端口,是我们在EXPOSE那一步配置过的)

其余操作

我们也可以在yml文件中配置定时操作,比如:

on:
  # 触发条件:手动触发
  workflow_dispatch:
  schedule:
    - cron: '0 3,9 * * *'  # 每天 UTC 时间 3:00 和 9:00(即北京时间 11:00/17:00)
    #push:
posted @ 2025-04-05 15:56  ssz0312  阅读(34)  评论(0)    收藏  举报