自动化集成与部署(二)

设想一下,我们需要周期性地执行一个计算密集型任务,并且需要利用本地的计算资源。为此,我们可以向仓库添加自托管的运行器,通过将任务以文本形式提交到仓库的指定分支,触发 GitHub Action 来执行工作流。由于科学计算任务通常需要非常复杂的环境配置,我们可以提前构建好镜像(包括可以执行GPU程序的镜像),通过 GitHub Action 拉取这些镜像并在容器中执行命令,从而省略冗长的环境配置步骤,节省时间。

打包容器为镜像并上传

在本地容器中配置好环境,停止容器,将容器打包成镜像,上传到 Docker Hub.

sudo docker stop 530d5a791f5a
sudo docker commit 530d5a791f5a mapengfei/npuheart:latex
docker push mapengfei/npuheart:latex
sudo docker run -it mapengfei/npuheart:latex bash

直接构建镜像并上传

镜像直接从 Dockerfile 文件构建。

docker rmi mapengfei/npuheart:latex
docker tag npuheart:latest mapengfei/npuheart:latex
docker push mapengfei/npuheart:latex
sudo docker rmi mapengfei/npuheart:latex

在 GitHub Action 中拉取镜像并使用

参见文档:在容器中运行作业

在 GitHub Action 中构建镜像并上传

参考文件:docker.yml

每次打标签都会进行一次docker镜像构建,并通过推送到 Docker Hub.

name: Publish Docker image
on:
  push:
    tags:
      - '*'
  workflow_dispatch:
jobs:
  push_to_registry:
    name: Push Docker image to Docker Hub
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4
      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: mapengfei/npuheart
      - name: Build and push Docker image
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          file: images-latex-newest/Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}