Github Actions 推送代码构建 Docker 镜像并 push 到仓库

Github Actions 推送代码构建 Docker 镜像并 push 到镜像仓库

需要解决的问题

解决 ci/cd 流程,在 推送代码到 github 时,github 的 action 能够自动构建代码并发布到镜像仓库,之后运行 docker-compose 文件,启动项目访问。

问题前置分析

目前比较流行的 ci/cd 解决方案为:

  1. github + jenkins
  2. Github/gitlab + jenkins + docker hub + Docker/K8s
  3. Github + docker hub + Docker/k8s

上述两种方案:

  1. 配置 github 的 webhook 钩子,在 push 代码之后,主动去通知 jenkins,构建镜像完成项目部署;

  2. 配置 github 的 webhook 钩子,在 push 代码之后,主动去通知 jenkins,完成项目的构建和打包,之后上传镜像到 docker hub 仓库,在 github action 中调用服务器中的 docker 完成服务的部署,实现 ci/cd 自动化流程;

    上述两种方案存在的缺点:

    • 没有镜像仓库存储 dokcer images,出现问题没办法回滚,扩容等;
    • Jenkins 拉取 github 会有较大几率超时,拉取失败;
    • Jenkins 配置相对繁琐,上手难度太高;
    • 没有 容器管理工具,无法及时得知 容器运行状态。
  3. 舍弃掉之前的 jenkins,由 github action 完成打包和镜像的推送,作为容器化之后的首选;

    能够有效解决上述方案存在的缺点,唯一的缺点是需要在 github action 配置时多花时间。

前置准备

这里介绍一些必要的组件,使用方法自己百度。

组件介绍

Docker hub
  1. Aliyun AKC 服务 https://cr.console.aliyun.com/
  2. Docker hub 官方 https://hub.docker.com/
  3. 私有的 Harbor 服务 https://goharbor.io/
容器管理平台
  1. Portainer
  2. Rainbond https://www.rainbond.com/usescene/AppManagement/
  3. Ranchar/k8s https://docs.rancher.cn/

包含 Docker 和 k8s 的管理平台

Github action secrets 设置

repo -> settings -> Security -> Actions secrets and variables -> secrets 中设置

deploy-docker.yml

# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Build And Deploy Docker

# github action 的触发时机
on:
  push:
    # 指定分支触发
    branches: 
      - "master"
    # 指定路径或者文件,当此路径下的文件发生变化时,执行此 action
    paths:
      - 'index.html'
    # 发布 tag 时执行此 action
    tags:
      - 'v*'
  # 指定分支发生 pr 操作时触发    
  pull_request:
    branches: [ "master" ]

# env 环境变量,为下面的 action 脚本提供
env:
  # Use docker.io for Docker Hub if empty
  REGISTRY: ${{ secrets.REGISTRY }}
  # github.repository as <account>/<repo>
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build:
    runs-on: ubuntu-latest
    steps:

    # 提供 docker 元数据,构建 docker images tag 时使用
    - name: Extract Docker metadata
      id: meta
      uses: docker/metadata-action@v4
      with:
        images: ${{ env.IMAGE_NAME }}
        tags: |
          # set latest tag for default branch
          type=raw,value=latest,enable={{is_default_branch}}
          # tag event
          type=ref,enable=true,priority=600,prefix=,suffix=,event=tag
  
    # 构建镜像 使用 docker/Build-And-push@v5 插件有问题
    - uses: actions/checkout@v2
    - name: Build Docker Image  
      run: |
        docker build -t ${{ env.REGISTRY }}/${{ steps.meta.outputs.tags }} -f ./docker/nginx/Dockerfile .
    - name: Push Docker Image
      run: |
        docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }} ${{ env.REGISTRY }}
        docker push ${{ env.REGISTRY }}/${{ steps.meta.outputs.tags }}

    # 运行 docker 服务
    # 另外一种选择是通过 scp 将文件传到指定服务器,完成 docker-compose 启动
    - name: Deploy Docker App
      uses: appleboy/ssh-action@master
      env:
        TZ: Asia/Shanghai
      with: 
        host: ${{ secrets.HOST }}
        username: ${{ secrets.HOST_USERNAME }}
        key: ${{ secrets.HOST_SSHKEY }}
        port: ${{ secrets.PORT }}
        script: |
          # 获取 docker-compose 文件
          wget https://raw.githubusercontent.com/${{ env.IMAGE_NAME }}/master/docker/docker-compose.yml
          ls
          cat docker-compose.yml
          docker-compose down -v
          docker-compose up -d

之上的一些 action 插件都可是使用其他的代替

  • https://github.com/aliyun/acr-login
  • https://docs.github.com/zh/actions/publishing-packages/publishing-docker-images#publishing-images-to-github-packages

效果展示

示例仓库:https://github.com/yuluo-yx/uipaas-ci-cd-test

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GitHub Actions 中,你可以使用缓存来加速构建过程,并恢复已缓存的镜像以减少构建时间。以下是一个示例,展示了如何在 GitHub Actions 中缓存并恢复镜像: ```yaml name: Cache and Restore Docker Image on: push: branches: - master jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Cache Docker image layers id: cache uses: actions/cache@v2 with: path: /var/lib/docker key: ${{ runner.os }}-docker-${{ hashFiles('**/Dockerfile') }} restore-keys: | ${{ runner.os }}-docker- - name: Build Docker image run: | if [ -z "${{ steps.cache.outputs.cache-hit }}" ]; then docker build -t your-docker-image-tag . else echo "Using cached Docker image" fi - name: Push Docker image run: | docker push your-docker-image-tag ``` 在上述示例中,我们使用了 `actions/cache` 动作来缓存和恢复 Docker 镜像。 - `path` 参数指定了要缓存的路径,这里是 `/var/lib/docker`,它是默认的 Docker 存储路径。 - `key` 参数用于唯一标识缓存,它使用了操作系统类型和 Dockerfile 的哈希值。 - `restore-keys` 参数用于在缓存无法命中时尝试从先前的缓存中恢复。 在 `Build Docker image` 步骤中,我们使用了条件语句来判断是否使用了缓存。如果 `steps.cache.outputs.cache-hit` 为空,表示缓存未命中,我们将执行构建命令。否则,我们将输出消息表示正在使用缓存的镜像。 最后,我们可以使用 `docker push` 命令将构建好的镜像推送到指定的镜像仓库。 通过使用缓存和恢复镜像的方法,可以减少构建时间并提高 GitHub Actions 的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值