Автоматизация развертывания на страницах GitHub с помощью Django Collectstatic [GitHub Actions Beginner]

У меня есть два рабочих процесса для GitHub Actions. Один выполняет задачу развертывания статических активов ветки prod, а другой - задачу запуска команды Django collectstatic.

Я хочу объединить оба процесса для автоматического развертывания новых статических элементов, чтобы не запускать collectstatic каждый раз перед отправкой изменений. Проблема в том, что я не представляю, как это сделать.

Рабочий процесс для развертывания статических активов

# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages

on:
  # Runs on pushes targeting the default branch
  push:
    branches: ["prod"]

  pull_request:
    branches: ["prod"]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
  group: "pages"
  cancel-in-progress: false

jobs:
  # Single deploy job since we're just deploying
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: 'prod'
      - name: Setup Pages
        uses: actions/configure-pages@v5
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: './assets'
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

Workflow для django collectstatic

name: Django CI

on:
  push:
    branches: [ "prod" ]
  pull_request:
    branches: [ "prod" ]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.12]

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
    - name: Setup Poetry
      # You may pin to the exact commit or the version.
      # uses: Gr1N/setup-poetry@48b0f77c8c1b1b19cb962f0f00dff7b4be8f81ec
      uses: Gr1N/setup-poetry@v9
      with:
        # Allow to install prerelease versions of Poetry
        poetry-preview: false # optional, default is false
        # Poetry version to use, if version is not provided then latest stable version will be used
        poetry-version: 1.8.3 # optional
    - name: Install Dependencies
      run: poetry install
    - name: Collect static
      env:
        SECRET_KEY: ${{ secrets.SECRET_KEY }}
        # All the secret variables ...
      run: poetry run python manage.py collectstatic --noinput

PS. Я использую поэзию в своем проекте, поэтому я использую действие GitHub Setup Poetry для запуска команд Python.

Я решил эту проблему с помощью ChatGPT. Похоже, что я могу определить обе задачи в одном файле с помощью заданий. Первое задание собирает статические файлы и загружает их как артефакт, а второе задание загружает их и затем деплоит на GitHub Pages.

Вот код:

name: Collect static and deploy to Pages

on:
  push:
    branches: ["prod"]
  pull_request:
    branches: ["prod"]
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write
  
concurrency:
  group: "pages"
  cancel-in-progress: false

jobs:
  collectstatic:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          ref: 'prod'

      - name: Set up Python
        uses: actions/setup-python@v3
        with:
          python-version: 3.12

      - name: Setup Poetry
        uses: Gr1N/setup-poetry@v9
        with:
          poetry-preview: false
          poetry-version: 1.8.3

      - name: Install dependencies
        run: poetry install

      - name: Collect static
        env:
          SECRET_KEY: ${{ secrets.SECRET_KEY }}
          # ...
        run: poetry run python manage.py collectstatic --noinput

      - name: Archive static files
        uses: actions/upload-artifact@v3
        with:
          name: assets
          path: assets/

  deploy:

    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: collectstatic
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: 'prod'

      - name: Download static files
        uses: actions/download-artifact@v3
        with:
          name: assets
          path: ./assets

      - name: Setup Pages
        uses: actions/configure-pages@v5

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: './assets'

      - name: Deploy to GitHub Pages
        id: production
        uses: actions/deploy-pages@v4

Я не уверен, как должны работать действия и артефакты, но, возможно, я мог бы сделать это в одном задании без необходимости загружать файлы как артефакты.

Я буду рад прочитать другие ответы или исправления; пока же это решило мою проблему.

Вернуться на верх