
基于GitHub Action实现项目 CI / CD 模式的自动化部署上线
在项目部署上线的时候 , 我们经常在不同的系统切换(我通常是在window本地开发 , 在服务器Linux部署) , 十分的麻烦 , 为了更方便的项目迭代和项目部署 , 今天介绍一下GitHub Action 这一神器 , 下面将分析三种action任务。
前言
在项目部署上线的时候 , 我们经常在不同的系统切换(我通常是在window本地开发 , 在服务器Linux部署) , 十分的麻烦 , 为了更方便的项目迭代和项目部署 , 今天介绍一下GitHub Action 这一神器 , 下面将分析三种action任务
- 自动部署镜像发布到 dockerhub
- 自动部署镜像发布到 Aliyun 镜像仓库
- 实现镜像发布 + 远程服务器部署测试上线
一. GitHub Action 实现镜像推送到dockerhub
1. 登录 dockerhub
点击 Account settings 的 Personal access tokens
创建 token
在项目的actions配置GitHub Secrets 清单
- DOCKER_REPO_NAME
- DOCKER_USERNAME
- DOCKER_TOKEN
DOCKER_USERNAME 为 dockerhub 的账号名
配置 .github/workflows的dockerhub.yml
name: dockerhub_push
on:
push:
branches: [ "release" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: 'true'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_NAME }}:latest
- name: Docker Hub Description
uses: peter-evans/dockerhub-description@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }} # 建议统一使用TOKEN
repository: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_NAME }}
readme-filepath: ./README.md
提交代码查看dockerhub仓库
即可看到自己推送的镜像
二 GitHub Action推送镜像到阿里云仓库
由于许多服务器都没办法访问dockerhub拉取镜像 , 所以这里提供了推送阿里云仓库的方案
1. 创建阿里云镜像仓库
阿里云容器镜像服务配置
- 创建镜像仓库
登录 阿里云容器镜像控制台
进入 实例列表 → 创建个人版实例(若未创建)
创建命名空间(如 myteam)
创建镜像仓库(如 myapp),选择 本地仓库 类型
** 这里创建仓库和命名空间的原因是阿里云仓库没办法像dockerhub一样直接推送 , 得要提前创建仓库**
创建后记录下
-
Registry地址:registry.cn-shenzhen.aliyuncs.com(根据实际地域)
-
命名空间:myteam
-
仓库名称:myapp
-
用户名:阿里云账号全名(如 aliyun123456)
-
密码:自定义的容器镜像服务密码
2 . 配置 GitHub Secrets 配置清单
3. 配置 ali.yml文件
name: Aliyun Image CI/CD
on:
push:
branches: [ "release" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
with:
submodules: 'true'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Buildx
uses: docker/setup-buildx-action@v2
with:
driver-opts: |
image=moby/buildkit:master-rootless
install: true
- name: Login to Aliyun ACR
uses: docker/login-action@v3
with:
registry: ${{ secrets.ALIYUN_REGISTRY }}
username: ${{ secrets.ALIYUN_USERNAME }}
password: ${{ secrets.ALIYUN_PASSWORD }}
- name: Build and Push
uses: docker/build-push-action@v5
with:
context: .
file: Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm
push: true
tags: |
${{ secrets.ALIYUN_REGISTRY }}/${{ secrets.ALIYUN_NAMESPACE }}/${{ secrets.ALIYUN_REPO_NAME }}:latest
${{ secrets.ALIYUN_REGISTRY }}/${{ secrets.ALIYUN_NAMESPACE }}/${{ secrets.ALIYUN_REPO_NAME }}:${{ github.sha }}
${{ secrets.ALIYUN_REGISTRY }}/${{ secrets.ALIYUN_NAMESPACE }}/${{ secrets.ALIYUN_REPO_NAME }}:${{ github.run_number }}
build-args: |
APP_NAME=${{ secrets.ALIYUN_REPO_NAME }}
cache-from: type=gha
cache-to: type=gha,mode=max
provenance: false
4. 验证
docker login registry.cn-shenzhen.aliyuncs.com \
-u aliyun123456 \
-p your_container_password
docker pull registry.cn-shenzhen.aliyuncs.com/onlooker/test
或者登录阿里云镜像仓库查看镜像版本信息
三. 实现镜像发布 + 远程服务器部署测试上线
1. 配置阿里云仓库信息(参考上面)
2. 配置服务器SSH配置
参考网站 : appleboy/ssh-action 和 appleboy/scp-action
这是两个开源的 dockerhub action 用于操作ssh远程连接的 , 下面的yml
文件会用到
服务器SSH配置步骤
- 生成部署密钥
# 本地生成密钥对(不要上传私钥!)
ssh-keygen -t ed25519 -C "github-ssh-key" -f ~/.ssh/github-deploy -N ""
将生成的私钥保存到GitHub的secret , 公钥保存到如下文件夹里
echo "YOUR_PUBLIC_KEY" -a ~/.ssh/authorized_keys
3. GitHub Secrets 配置清单
4. 配置yml
文件
name: Aliyun Image CI/CD
on:
push:
branches: [ "main" ]
jobs:
ali-build:
runs-on: ubuntu-latest
outputs:
image_tag: ${{ steps.build.outputs.image_tag }}
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
submodules: 'true'
- name: Setup Build Environment # BuildKit 构建
uses: docker/setup-buildx-action@v3
with:
driver-opts: |
image=moby/buildkit:master-rootless
install: true
- name: Login to Aliyun ACR
uses: docker/login-action@v3
with:
registry: ${{ secrets.ALIYUN_REGISTRY }}
username: ${{ secrets.ALIYUN_USERNAME }}
password: ${{ secrets.ALIYUN_PASSWORD }}
- name: Build and Push
uses: docker/build-push-action@v5
with:
context: .
file: Dockerfile
platforms: linux/amd64 # 只支持 x86_64
push: true
tags: |
${{ secrets.ALIYUN_REGISTRY }}/${{ secrets.ALIYUN_NAMESPACE }}/${{ secrets.ALIYUN_REPO_NAME }}:latest
${{ secrets.ALIYUN_REGISTRY }}/${{ secrets.ALIYUN_NAMESPACE }}/${{ secrets.ALIYUN_REPO_NAME }}:${{ github.ref_name }}-${{ github.run_number }}
labels: |
maintainer=ci-system
branch=${{ github.ref_name }}
ci-run=${{ github.run_number }}
cache-from: type=gha,scope=${{ github.ref_name }}
cache-to: type=gha,mode=max,scope=${{ github.ref_name }}
provenance: false
service-run:
needs: ali-build
runs-on: ubuntu-latest
timeout-minutes: 5 # 添加超时限制
steps:
- uses: actions/checkout@v4
# 安全文件传输步骤
- name: Secure File Transfer
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SSH_HOST }}
port: ${{ secrets.SSH_PORT || 22 }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: "docker-compose.yaml"
target: /tmp/
strip_components: 1
- name: SSH Deployment
uses: appleboy/ssh-action@v1.2.1
with:
host: ${{ secrets.SSH_HOST }}
port: ${{ secrets.SSH_PORT || 22 }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
# 创建应用目录(使用临时提权)
sudo mkdir -p /opt/my-app
# 原子化文件替换
mv -f /tmp/docker-compose.yaml /opt/my-app/docker-compose.yaml
cd /opt/my-app
# 安全登录镜像仓库
echo "${{ secrets.ALIYUN_PASSWORD }}" | docker login \
--username "${{ secrets.ALIYUN_USERNAME }}" \
--password-stdin "${{ secrets.ALIYUN_REGISTRY }}"
# 部署命令
docker-compose -f docker-compose.yaml pull
docker-compose -f docker-compose.yaml up \
--force-recreate \
--remove-orphans \
--no-build
# 安全清理(保留最近5个版本)
# 5. 版本清理(保留最近5个)
docker images --format "{{.ID}} {{.Tag}}" \
| grep "${{ secrets.ALIYUN_REPO_NAME }}" \
| sort -Vr \
| awk 'NR>5 {print $1}' \
| xargs -r docker rmi -f || true
校验查看Action控制台即可
哦 , 对了 , 别忘记在根目录下配置对应的 Dockerfile
和 docker-compose.yaml
文件
具体的操作代码看一下的我的 Github仓库
更多推荐
所有评论(0)