4

私は App Engine を使用しており、次のプロジェクトで LESS CSS 拡張機能を使用することを考えています。Python で書かれた優れた LESS CSS ライブラリは存在しないため、すぐに使用できる優れた機能を備えたオリジナルの Ruby を使用しました。lessc ./templates/css/style.less開発サーバーを実行する前、およびファイルをクラウドにアップロードする前に、App Engine を実行したいと考えています。これを自動化する最良の方法は何ですか? 考えている:

#run.sh:
lessc ./templates/css/style.less
.gae/dev_appserver.py --use_sqlite .

#deploy.sh
lessc ./templates/css/style.less
.gae/appcfg.py update .

私は正しい道を進んでいますか、おそらく appcfg.py レベルで、より洗練された方法がありますか?

ありがとう。

4

1 に答える 1

2

1 つのオプションは、Less の JavaScript バージョンを使用して、ブラウザで less から css への変換を行うことです。フォーマットの少ないファイルをアップロードするだけです (詳細については、 http://lesscss.org/を参照してください)。

代わりに、多くのことを行うデプロイ スクリプトで変換を行います (最初は less で、今は sass を使用します)。

  • ソース コード管理に未処理のファイルがチェックアウトされていないことを確認します (コミットされていない変更)
  • 私の .js コードを 1 つのファイルに結合して縮小します (そしてその上で jslint を実行します)
  • 他のコンテンツを生成する (ソース コード管理バージョンをバージョン番号として特定のキー ファイルにスタンプしたり、キャッシュの問題を回避するために一部のファイルのパラメーターとしてスタンプしたりするなど)、メイン ページは「allmysource.js?v=585」などの URL を含むスクリプトを取得します。 "..ファイルは静的かもしれませんが、追加されたパラメータはキャッシュの無効化を強制します
  • appcfg を呼び出してアップロードを実行し、リターン コードを確認します
  • wget を使用して実際のサイトにいくつかの呼び出しを行い、以前に生成されたファイルが実際に返されることを確認します。期待されるバージョンでスタンプされていることを確認します。
  • 別のソース コード管理タグを適用して、目的のバージョンが正常にデプロイされたことを示します

私のスクリプトは「-preview」フラグも受け入れます。この場合、実際にはアップロードは行われませんが、以前の展開以降に変更された内容についてバージョン管理コメントが報告されます。

me@here $ ./deploy -preview
Deployment preview...
Would deploy v596 to the production site (currently v593, previously v587)
  594       Fix blah blah blah for X Y Z
  595       New feature nah nah nah 
  596       Update help pages

これは、変更ログなどに何を入れる必要があるかを思い出させるのに非常に便利です

また、ソース コード管理の一部として、展開時に 1 回だけ実行する必要があるコード (データベース スキーマの変更など) を追加できるように拡張することも計画しています。バージョン。

人々が尋ねた以下のスクリプトの本質...それは別のスクリプトであるため、私の「コードのチェック、生成、結合、縮小」を示していません...元の質問はもちろんそのステップについて尋ねていたことに気づきました:)ただし、CSS などを生成するための呼び出しを追加する場所を確認できます

#!/bin/sh

function abort () {
    echo
    echo "ERROR: $1"
    echo "$2"
    exit 99
}

function warn () {
    echo
    echo "WARNING: $1"
    echo "$2"
}

# Overrides the Gentoo eselect mechanism to force the python version the GAE scripts expect
export EPYTHON=python2.5

# names of tags used to label bzr versions    
CURR_DTAG=deployed
PREV_DTAG=prevDeployed

# command line options
PREVIEW=0
IGNORE_BZR=0

# These next few vars are set to values to identify my site, insert your own values here...
APPID=your_gae_appid_here
ADMIN_EMAIL=your_admin_email_address_here
SRCDIR=directory_to_deploy
CHECK_URL=url_of_page_to_retrive_that_does_upload_initialisation

for ARG; do
    if [[ "$ARG" == "-preview" ]]; then
        echo "Deployment preview..."
        PREVIEW=1
    fi
    if [[ "$ARG" == "-force" ]]; then
        echo "Ignoring the fact some files may not be committed to bzr..."
        IGNORE_BZR=1
    fi
done
echo

# check bzr for uncommited changed    
BSTATUS=`bzr status`
if [[ "$BSTATUS" != "" ]]; then
    if [[ "$IGNORE_BZR" == "0" ]]; then 
        abort "There are uncommited changes - commit/revert/ignore all files before deploying" "$BSTATUS"
    else
        warn  "There are uncommited changes" "$BSTATUS"
    fi
fi

# get version of numbers of last deployed etc
currver=`bzr log -l1 --line                | sed -e 's/: .*//'`
lastver=`bzr log -rtag:${CURR_DTAG} --line | sed -e 's/: .*//'`
prevver=`bzr log -rtag:${PREV_DTAG} --line | sed -e 's/: .*//'`
lastlog=`bzr log -l 1 --line gae/changelog | sed -e 's/: .*//'`

RELEASE_NOTES=`bzr log --short --forward -r $lastver..$currver \
    | perl -ne '$ver = $1 if /^ {0,4}(\d+) /; print "  $ver $_" if ($ver and /^ {5,}\w/)' \
    | grep -v "^ *$lastver "`

LOG_NOTES=`bzr log --short --forward -r $lastlog..$currver \
    | perl -ne '$ver = $1 if /^ {0,4}(\d+) /; print "  $ver $_" if ($ver and /^ {5,}\w/)' \
    | grep -v "^ *$lastlog "`

# Crude but old habit - BUGBUGBUG is a marker in the code for things to be fixed before deployment
echo "Checking code for outstanding issues before deployment"
BUGSTATUS=`grep BUGBUGBUG js/*js`
if [[ "$BUGSTATUS" != "" ]]; then
    if [[ "$IGNORE_BZR" == "0" ]]; then 
        abort "There are outstanding BUGBUGBUGs - fix them before deploying" "$BUGSTATUS"
    else
        warn  "There are outstanding BUGBUGBUGs" "$BUGSTATUS"
    fi
fi

echo
echo "Deploy v$currver to the production site (currently v$lastver, previously v$prevver)"
echo "$RELEASE_NOTES"
echo

if [[ "$currver" -gt "$lastlog" && "$lastver" -ne "$lastlog" ]]; then
    echo "Changes since the changelog was last updated"
    echo "$LOG_NOTES"
    echo
fi

if [[ "$IGNORE_BZR" == "0" && $lastver -ge $currver ]]; then
    abort "There don't appear to be any changes to deploy..."
fi

if [[ "$PREVIEW" == "1" ]]; then
    exit 0
fi

$EPYTHON -c "import ssl" \
    || abort "$EPYTHON can't find ssl module for $EPYTHON - download it from pypi and install with the inbuilt setup.py"

# REMOVED - call to my script that calls jslint, generates files and compresses JS etc
#   || abort "Generation of code failed"

/opt/google_appengine/appcfg.py --email=$ADMIN_EMAIL -v -A $APPID update $SRCDIR \
    || abort "Appcfg failed - upload presumably incomplete"

# move the tags to show we deployed properly
bzr tag -r $lastver --force ${PREV_DTAG}
bzr tag -r $currver --force ${CURR_DTAG}

echo
echo "Production site updated from v$lastver to v$currver (in turn from v$prevver)"
echo
echo "Now visiting $CHECK_URL to upload the source to the database"

# new version doesn't seem to always be there (may be caching by the webserver etc) to be uploaded into the database.. try again just in case
for cb in $RANDOM $RANDOM $RANDOM $RANDOM ; do
    prodver=`wget $CHECK_URL?_cb=$cb -q -O - | perl -ne 'print $1 if /^\s*Rev #(\d+)\s*$/'`
    if [[ "$currver" == "$prodver" ]]; then
        echo "OK: New version $prodver successfully deployed"
        exit 0
    fi
    echo "Retrying the upload of source to the database"
    sleep 5
done
abort "The new source doesn't seem to be loading into the database" "Try 'wget $CHECK_URL?_cb=$RANDOM -q -O -'"

特に大きくも賢くもありませんが、アップロードジョブを自動化します

于 2011-02-02T22:09:01.817 に答える