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 Actions 和Dcoker来做个示例:
实现
在服务器上生成 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:

浙公网安备 33010602011771号