前言
在项目部署上线的时候 , 我们经常在不同的系统切换(我通常是在window本地开发 , 在服务器Linux部署) , 十分的麻烦 , 为了更方便的项目迭代和项目部署 , 今天介绍一下GitHub Action 这一神器 , 下面将分析三种action任务

  1. 自动部署镜像发布到 dockerhub
  2. 自动部署镜像发布到 Aliyun 镜像仓库
  3. 实现镜像发布 + 远程服务器部署测试上线

一. GitHub Action 实现镜像推送到dockerhub

1. 登录 dockerhub

点击 Account settings 的 Personal access tokens

在这里插入图片描述

创建 token

在项目的actions配置GitHub Secrets 清单

在这里插入图片描述

  1. DOCKER_REPO_NAME
  2. DOCKER_USERNAME
  3. 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. 创建阿里云镜像仓库

阿里云容器镜像服务配置

  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-actionappleboy/scp-action
这是两个开源的 dockerhub action 用于操作ssh远程连接的 , 下面的yml 文件会用到

服务器SSH配置步骤

  1. 生成部署密钥
# 本地生成密钥对(不要上传私钥!)
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控制台即可


哦 , 对了 , 别忘记在根目录下配置对应的 Dockerfiledocker-compose.yaml 文件

具体的操作代码看一下的我的 Github仓库

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐