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

时间:2017-06-30 10:05:45

标签: python jenkins flask celery

我有一个烧瓶应用程序,我将任务提交给芹菜(工人)执行它。这样我就可以在提交后恢复网页了。如果我将任务提交给Jenkins,我可以实现相同的目标吗?只是想要一个意见,为什么我会使用芹菜当我可以让Jenkins通过Jenkins API安排/执行这项工作?仍然得到我的网页。我的方法可能有问题,但任何能够阐明这一点的人都会非常感激。

主要目的是用户提交实际执行任务的表单,并在从Web上提交任务分离后重新加载表单。同时任务在背景中运行,芹菜有效地完成它,但可以通过jenkins完成。

由于

2 个答案:

答案 0 :(得分:1)

@ Macintosh_89-为后代添加我的答案(很晚)。

每个人都说HTTP,包括Jenkins,所以您的架构建议是可行的。 (除非Celery中有一些特定功能使其成为您的制胜法宝,否则您就没有理由无法通过例如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

如果要使用此功能进行测试,只需先在您的环境中设置以下各项:

# automatically generated in build config under "Use the
# following to trigger build job remotely"
export JENKINS_JOB_PATH='job/Folder/job/aa/buildWithParameters'
# the "Authentication Token" set by you in build config
export JENKINS_JOB_TOKEN='xxxyyyzzzaaabbbccc'
# hostname of your build server
export JENKINS_SERVER='my-ci-system.some.org'
# account and password that are authorized to call webhook;
# if you're using "Project-based Matrix Authorization Strategy",
# this account will need READ for Overall, Job, and Run authz
export JENKINS_SERVICE_ACCOUNT='user'
export JENKINS_SERVICE_PASSWORD='secret'

当然,您可以使用自己选择的语言来实现类似的功能。如果您想更仔细地了解此处发生的情况(尤其是WRT,如何在运行时构建URI),则只需使用bash -x来运行它即可。

答案 1 :(得分:0)

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

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

  • jenkins是基于java构建的,所以虽然插件是可用的,但是芹菜是用python构建的,所以你可以直接在python中编写任务并将它发送到芹菜或者只是从python调用你的shell任务。 / p>

  • 消息队列 - 再次jenkins没有对消息代理的内置支持,因此排队可能对您来说很困难。 Celery默认使用rabbitmq对任务进行排队,因此您的任务永远不会丢失。

  • Celery还提供简单的回调,因此当任务完成后,您可以在其后运行一些功能。

  • 现在,如果你问一下cpu comsumption,那么芹菜一点也不重要