Flask异步作业/任务提交给Celery或Jenkins

2024-04-20 02:01:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个烧瓶应用程序,在这里我向celery(工人)提交任务来执行它。这样我就可以在提交后取回网页。如果我把任务交给詹金斯,我能达到同样的效果吗?我只是想知道我为什么要用芹菜当我可以让詹金斯通过詹金斯API来安排/执行工作?还是把我的网页拿回来。我的方法可能有误,但任何能说明这一点的人都会非常感激。在

其主要目的是用户提交表单,该表单实际上是一个要执行的任务,点击提交任务从web上分离后,重新加载表单。同时,任务在后台运行,celery可以高效地完成任务,但可以通过jenkins完成。在

谢谢


Tags: 方法用户目的apiweb应用程序网页表单
2条回答

@Macintosh_89-为了子孙后代的缘故,添加我(非常晚)的答案。在

每个人都说HTTP,包括Jenkins,所以您的架构建议是可行的。(除非Celery的某些特定功能使其成为您的成功解决方案,否则您没有理由不能使用Jenkins实现相同的功能,例如Jenkins。)我建议使用Jenkins的“远程触发构建”选项,它为您提供了一个webhook。在

enter image description here

向该webhook发出适当的HTTP请求将触发生成作业运行。(附带说明:请确保将“身份验证令牌”设置为一个冗长的强值。)

作为一个额外的好处,我包含了一个bash脚本,我编写了这个脚本来测试对Jenkins作业的调用,并启用了“远程触发构建”。在

#!/bin/bash

# Doing an HTTP job build request with Jenkins is a two-part deal.
#
# 1. Get a crumb using auth credentials
# 2. Use that crumb (along with auth credentials) to submit the job
#
# Reference:
# www.inanzzz.com/index.php/post/jnrg/running-jenkins-build-via-command-line

set -u
set -o pipefail

#                                       #
#                       VARIABLE DEFINITION
#                                       #

PATH=/usr/bin:/bin

readonly _srv="${JENKINS_SERVER:-x}"
readonly _job_path="${JENKINS_JOB_PATH:-x}"
readonly _token="${JENKINS_JOB_TOKEN:-x}"
readonly _u="${JENKINS_SERVICE_ACCOUNT:-x}"
readonly _p="${JENKINS_SERVICE_PASSWORD:-x}"

readonly _crumb_path='crumbIssuer/api/xml'
readonly _crumb_query='xpath=concat(//crumbRequestField,":",//crumb)'
readonly _uri1="https://${_srv}/${_crumb_path}?${_crumb_query}"

readonly _token_query="token=${_token}"
readonly _uri2="https://${_srv}/${_job_path}?${_token_query}"

readonly _output="$(mktemp)"

#                                       #
#                       FUNCTIONS
#                                       #

errout() {
        local _msg="${0##*/} error: ${1}"
        printf '%s\n' "${_msg}"
        exit 1
}

cleanup() {
        rm -f "${_output}"
}

audit_env() {
        [ "${_srv}" == "x" ] ||                                         \
        [ "${_job_path}" == "x" ] ||                                    \
        [ "${_token}" == "x" ] ||                                       \
        [ "${_u}" == "x" ] ||                                           \
        [ "${_p}" == "x" ]

        if [ ${?} -eq 0 ] ; then
                errout "Missing ENV. Hint: grep -Eo 'JENKINS_[A-Z_]+' ${0}"
        fi
}

req_crumb() {
        curl                                                            \
         silent                                                        \
         show-error                                                    \
         user "${_u}:${_p}"                                            \
         request 'GET'                                                 \
         output "${_output}"                                           \
        "${_uri1}"

        if [ ${?} -ne 0 ] ; then
                errout 'Problem with HTTP crumb request'
        fi
}

get_value_into_crumb_var() {
        local _s

        read -r _s < "${_output}" || [ -n "${_s}" ]

        if [ ${?} -ne 0 ] ; then
                errout "Problem reading crumb from ${_output}"
        fi

        readonly _crumb="${_s}"
}

req_job_launch() {
        curl                                                            \
         silent                                                        \
         show-error                                                    \
         user "${_u}:${_p}"                                            \
         header "${_crumb}"                                            \
         request 'POST'                                                \
        "${_uri2}"

        if [ ${?} -ne 0 ] ; then
                errout 'Problem with HTTP job run request'
        fi
}

#                                       #
#                       CLEANUP AND SIGNAL HANDLING
#                                       #

trap 'cleanup' EXIT
trap 'exit 2' HUP INT QUIT TERM

#                                       #
#                       MAIN LOGIC
#                                       #

audit_env

req_crumb
get_value_into_crumb_var
req_job_launch

exit 0

如果要使用此工具进行测试,请先在您的环境中设置以下各项:

^{pr2}$

当然,您可以在您选择的语言中实现类似的功能。如果您想更深入地了解这里发生了什么(特别是在运行时如何构建uri),那么只需使用bash -x运行它。在

以下几点要考虑比较芹菜和詹金斯。在

  • Celery是专门为在后台运行资源密集型任务而设计和构建的,而jenkins是一个更通用的自动化工具。

  • jenkins是基于java构建的,因此本地集成是存在的,尽管有插件可用;而celeri是用python构建的,所以您可以直接用python编写任务并将其发送给celeri,或者从python调用shell任务。

  • 消息队列-同样,jenkins没有对消息代理的内置支持,所以排队对您来说可能很困难。Celery默认使用rabbitmq对任务进行排队,这样您的任务就不会丢失。

  • Celery还提供了简单的回调,所以当任务完成后,您可以运行一些函数。

  • 现在如果你问cpu消耗,那么芹菜一点也不重

相关问题 更多 >