name: 'image / openEuler'
# This is a docker build check and publish job:
# 1. PR Triggered docker image build check
#   - is for image build check
#   - Enable on main/*-dev branch
#   - push: ${{ github.event_name != 'pull_request' }} ==> false
# 2. branches push trigger image publish
#   - is for branch/dev/nightly image
#   - commits are merge into main/*-dev  ==> vllm-ascend:main-openeuler / vllm-ascend:*-dev-openeuler
#   - is for final release image
#   - Publish when tag with v* (pep440 version)  ===>  vllm-ascend:v1.2.3-openeuler / vllm-ascend:v1.2.3rc1-openeuler
on:
  pull_request:
    branches:
      - 'main'
      - '*-dev'
    paths:
      - '.github/workflows/image_openeuler.yml'
      - 'Dockerfile.openEuler'
      - 'vllm_ascend/**'
      - 'setup.py'
      - 'pyproject.toml'
      - 'requirements.txt'
      - 'cmake/**'
      - 'CMakeLists.txt'
      - 'csrc/**'
  push:
    # Publish image when tagging, the Dockerfile in tag will be build as tag image
    branches:
      - 'main'
      - '*-dev'
    tags:
      - 'v*'
    paths:
      - '.github/workflows/image_openeuler.yml'
      - 'Dockerfile.openEuler'
      - 'vllm_ascend/**'
      - 'setup.py'
      - 'pyproject.toml'
      - 'requirements.txt'
      - 'cmake/**'
      - 'CMakeLists.txt'
      - 'csrc/**'

jobs:
  build:
    name: vllm-ascend image build
    runs-on: >-
      ${{
          github.event_name == 'push' && github.repository_owner == 'vllm-project' &&
          'ubuntu-latest' ||
          'ubuntu-24.04-arm'
      }}
    steps:
    - uses: actions/checkout@v4

    - name: Print
      run: |
        lscpu

    - name: Docker meta
      id: meta
      uses: docker/metadata-action@v5
      with:
        # TODO(yikun): add more hub image and a note on release policy for container image
        images: |
          quay.io/ascend/vllm-ascend
        # Note for test case
        # https://github.com/marketplace/actions/docker-metadata-action#typeref
        # 1. branch job pulish per main/*-dev branch commits
        # 2. main and dev pull_request is build only, so the tag pr-N-openeuler is fine
        # 3. only pep440 matched tag will be published:
        #    - v0.7.1 --> v0.7.1-openeuler
        #    - pre/post/dev: v0.7.1rc1-openeuler/v0.7.1rc1-openeuler/v0.7.1rc1.dev1-openeuler/v0.7.1.post1-openeuler, no latest
        #      which follow the rule from vLLM with prefix v
        # TODO(yikun): the post release might be considered as latest release
        tags: |
          type=ref,event=branch,suffix=-openeuler
          type=ref,event=pr,suffix=-openeuler
          type=pep440,pattern={{raw}},suffix=-openeuler
        flavor:
          latest=true

    - name: Free up disk space
      uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1
      with:
        tool-cache: true
        docker-images: false

    - name: Build - Set up QEMU
      uses: docker/setup-qemu-action@v3

    - name: Build - Set up Docker Buildx
      uses: docker/setup-buildx-action@v3

    - name: Publish - Login to Quay Container Registry
      if: ${{ github.event_name == 'push' && github.repository_owner == 'vllm-project' }}
      uses: docker/login-action@v3
      with:
        registry: quay.io
        username: ${{ vars.QUAY_USERNAME }}
        password: ${{ secrets.QUAY_PASSWORD }}

    - name: Build and push 910b
      uses: docker/build-push-action@v6
      with:
        platforms: >-
          ${{
              github.event_name == 'push' && github.repository_owner == 'vllm-project' &&
              'linux/amd64,linux/arm64' ||
              'linux/arm64'
          }}
        # use the current repo path as the build context, ensure .git is contained
        context: .
        # only trigger when tag, branch/main push
        push: ${{ github.event_name == 'push' && github.repository_owner == 'vllm-project' }}
        labels: ${{ steps.meta.outputs.labels }}
        tags: ${{ steps.meta.outputs.tags }}
        file: Dockerfile.openEuler
        build-args: |
          PIP_INDEX_URL=https://pypi.org/simple
        provenance: false
