【问题标题】:Django collectstatic keeps waiting when run through Github ActionDjango collectstatic 在通过 Github Action 运行时一直等待
【发布时间】:2021-02-13 09:47:19
【问题描述】:

我们正面临一个非常奇怪的问题。我们在每次推送时通过 Github Actions 在 docker 容器中发布 django 应用程序。除了collectstatic,一切都运行良好。

我们在 CD github 操作的末尾有以下几行:

docker exec container_name python manage.py migrate --noinput
docker exec container_name python manage.py collectstatic --noinput

migrate 工作得非常好,但collectstatic 只是在通过 github 操作时继续等待。如果我直接在服务器上运行命令,那么它可以正常工作并在几分钟内完成。

有人可以帮我弄清楚可能是什么问题吗?

提前致谢。

【问题讨论】:

    标签: django docker continuous-deployment github-actions


    【解决方案1】:

    现在我远不是最有经验的,但我最近这样做了,我有一些关于去哪里找的建议。不过我绝对不是最权威的。

    我没有使用 docker,所以对此我无话可说。从这些问题中,我有一些建议可以推荐尝试。

    请注意,所有这些都是针对自托管运行器。否则情况会大不相同。

    • 检查以确保在设置文件中正确设置了 STATIC_ROOT 和 MEDIA_ROOT 变量。
    • 如果 STATIC 和 MEDIA 根变量是环境变量,请确保提供正确的环境变量文件,例如我使用的 .env 文件。
      • 我使用 django-environ 为我的环境变量提供服务。从文档中,它说 .env 文件与设置文件位于同一目录中。如果您将项目放在带有 github 操作的生产服务器上,您将无法将 .env 文件放在项目中的任何位置,因为每次推送新代码时它都会被覆盖。
      • 因此,要解决此问题,您需要从服务器上的其他位置指定正确的 .env 文件。通过指定 ENV_PATH 来做到这一点。
      • 另一个有用的资源:
      • 我将 .env 文件放在我在项目的虚拟环境文件夹中创建的 proj 目录中。
        • 我不知道这是否是一个放置它的好地方,但我就是这样做的。我没有在网上找到很多关于这些东西的好信息。我必须自己想办法。
      • 确保运行 github 操作的用户有权读取 .env 文件。
    • 也与 .env 文件类似,如果您将静态文件收集到项目的基目录中,则每次推送新代码时可能会遇到 github 操作覆盖这些文件的问题。如果您有一个用户将文件上传到的媒体目录,那么这确实是一个问题,因为这些文件不会被覆盖。他们就会消失。
      • 现在,如果这是一个问题,它不应该导致 github 操作卡在 collect static 命令上。每次工作流程运行时,它只会导致文件被覆盖,媒体文件将消失。
      • 如果您确实如前所述更改了静态和媒体文件所在的目录,请确保设置文件和 .env 文件中的所有路径变量都正确。
      • 如果您使用 nginx,您还需要更新静态和媒体根目录的 nginx 配置文件。不确定apache是​​如何做到的。
        • 您可以使用以下命令执行此操作:
        • sudo nano /etc/nginx/sites-available/myproject
        • 完成后别忘了重启 nginx 服务器。
    • 如果您在与服务器上的基本项目目录不同的位置写入静态和媒体文件,请检查这些目录的权限。确保运行 github 操作的用户有权写入这些目录。我怀疑这可能会导致它挂起,但很可能只会导致错误。
    • 检查 github 操作 yml 文件中的所有语法。确保一切正确并且它没有挂起,因为它有一个不完整的命令或类似的东西。

    但是,是的,这是我必须看看的一些事情。老实说,这些都可能与您无关。所有这些问题大部分都应该在某处导致错误。

    我无法提供很多外部资源供您深入研究,因为我只是根据个人经验发言。

    希望我能帮上忙。

    这是我所做项目的 github 存储库:https://github.com/pkudlanov/personal-portfolio-django

    我使用 nginx 和 gunicorn 将它托管在 linux 服务器上的 digitalocean 上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多