我有一个烧瓶应用程序,我将任务提交给芹菜(工人)执行它。这样我就可以在提交后恢复网页了。如果我将任务提交给Jenkins,我可以实现相同的目标吗?只是想要一个意见,为什么我会使用芹菜当我可以让Jenkins通过Jenkins API安排/执行这项工作?仍然得到我的网页。我的方法可能有问题,但任何能够阐明这一点的人都会非常感激。
主要目的是用户提交实际执行任务的表单,并在从Web上提交任务分离后重新加载表单。同时任务在背景中运行,芹菜有效地完成它,但可以通过jenkins完成。
由于
答案 0 :(得分:1)
@ Macintosh_89-为后代添加我的答案(很晚)。
每个人都说HTTP,包括Jenkins,所以您的架构建议是可行的。 (除非Celery中有一些特定功能使其成为您的制胜法宝,否则您就没有理由无法通过例如Jenkins实现相同的功能。)我建议您使用Jenkins的“远程触发构建”选项,该选项可为您提供webhook。
对该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还提供简单的回调,因此当任务完成后,您可以在其后运行一些功能。