2011/2/24 Hugo Duncan <duncan.h...@gmail.com>

> On Thu, 24 Feb 2011 06:29:13 -0500, Laurent PETIT <laurent.pe...@gmail.com>
> wrote:
>
>   * deliver to pre-production:
>>   * input = git commit hash, maven version of some "tooling" artifacts
>> which are java artifacts, invoked via an mvn java execute target once the
>> right git revision has been checked out
>>   * output = publish the "app state" (created locally from the derived git
>> content) to a directory in the server, run a shell script on the server
>> which finishes the install, and, if everything went well, tag the commit,
>> and push the tag to the reference repo from which the content had been
>> initially pulled from
>>
>
>  Would trying to use pallet or crane seem overkill ?
>>
>
> Laurent,
>
> Pallet would certainly be capable of automating the workflow you describe.
>  From what you describe a shell script invoked by an ssh command could
> probably do the job too.  In pallet it might look something like this
> (unchecked):
>
>  (def release-dir "/usr/local/myapp")
>
>  (defn push-preproduction*
>     "Crate function to publish a specific commit"
>     [request tag version artifacts]
>     (exec-script/exec-checked-script
>        request
>        (format "Checkout version %s" version) ; message for logging, etc
>        (cd src)
>        (git checkout ~version)
>        (mvn exec:java something ~@artifacts)
>        (cp app-state ~release-dir)
>        (finish-install)
>        (git tag ~tag)
>        (git push --tags)))
>
>  (def push-production
>     "Crate function to extract data from the environment,
>      and publish it"
>     [request]
>     (push-preproduction*
>       request
>       (environment/get-for request [:userdata :tag])
>       (environment/get-for request [:userdata :version])
>       (environment/get-for request [:userdata :artifacts])
>
>  ;; define phases on a "Server" group, linking the
>  ;; publish phase to the push-production crate function
>  (def server (make-node "server" {}
>               :publish push-preproduction))
>
>  ;; Function to publish a specific version.  Uses the node definitions
>  ;; from config.clj
>  (def publish
>     [request tag version & artifacts]
>     (let [service (compute/compute-service-from-config-file :nl)]
>       (core/lift server
>          :phase publish
>          :compute service
>          :environment {:userdata {:tag tag
>                                   :version version
>                                   :artifacts artifacts}})
>
> Set up ~/.pallet/config.clj, specifying details of the existing machine,
> and that it should be in the "server" group
>
>  (defpallet
>    :providers
>     {:nl {:provider "node-list"
>           :node-list [["server" "server" "192.168.2.37"
>                        :ubuntu :os-version "10.04"]]
>           :environment {:user {:username "user" :no-sudo true}}}})
>
> and invoked via
>
>  (publish "tag" "commitish" "artifact1" "artifact2")
>
>
Wow, I looked at the above scripts, and it seems that you've captured the
essence of the problem quite well!
Given the above starter-code, I think I'll probably give it a try, for sure
!


>
> Whether pallet is overkill or not, I think, is dependent on whether you
> think your requirements will grow.  Using this as an exercise to learn
> pallet would be time well spent if you think you will want to automate more
> in the future.
>
> But, I'm biased.
>
> --
> Hugo Duncan
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to