我正在使用Jekyll搭建网站,它可以将ERB、SASS等编译成普通的HTML和CSS。
大多数提交后,我希望编译网站并在另一个仓库或分支中提交已编译的版本,以便将其推送到静态服务器。
最好的方法是什么?
我已经有了解决方案,但我希望有更加优雅的解决方法。
我正在使用Jekyll搭建网站,它可以将ERB、SASS等编译成普通的HTML和CSS。
大多数提交后,我希望编译网站并在另一个仓库或分支中提交已编译的版本,以便将其推送到静态服务器。
最好的方法是什么?
我已经有了解决方案,但我希望有更加优雅的解决方法。
根据您的要求:
我不建议您使用相同的存储库来存储已编译的代码。因为它可以从任何源代码状态获取,并且这将是信息的不必要副本。
所以,在这种情况下,您想要使用git作为CI工具。您应该为编译站点创建另一个存储库,并在每次需要时进行提交。
我建议您选择“生产”状态的分支。当您在该分支中提交时-代码应该被重新构建。让我们称其为“production”。
srcDir='../srcWorkTree'
buildedRepo='../buildedRepo'
if [ `git rev-parse --abbrev-ref HEAD` == "production" ]; then
echo "making builded code commit..."
mkdir -p $srcDir
# https://dev59.com/b2855IYBdhLWcg3wMRVW
git checkout-index -a -f --prefix=$srcDir/
bundle exec jekyll build --source $srcDir --destination $buildedRepo
cd $buildedRepo
git add -A
commitInfo=$( git log -1 --pretty="%h %B" )
git commit -m "autobuild for $commitInfo"
# git push
fi
另一种变体
我猜想,你可以访问你的生产服务器。至少你提到了在那里有git仓库。因此,把代码构建到目标目录中的post-receive hook放在那里将更加清晰简单,而不是像我描述的那样在本地机器上进行。
我猜想这个仓库是“bare”的,因为你不应该在服务器上进行更改。
post-receive hook:
#!/bin/sh
siteDir='/var/www/site'
tmpSrcDir='/var/www/site'
echo "**** [builder's post-receive hook]"
while read oldrev newrev refname
do
if [ $refname = refs/heads/production ]
then
GIT_WORK_TREE=$tmpSrcDir git checkout --detach $newrev
bundle exec jekyll build --source $tmpSrcDir --destination $siteDir
fi
done
exit 0
一些评论
我明白,你试图使用子模块来存储已构建的站点。我不建议这样做。因为你的源代码不依赖于构建的代码,所以这没有意义。
cd /path/to/current/repo
git rm -R _site
git submodule add -- /url/repo/site _site
_site
中)中完成,您可以直接添加、提交甚至推送到想要测试的位置。git init _site/
,所以提交实际上是发送到一个单独的仓库。我认为,如果有任何问题,源码 应该是子模块。 - Zazgit init
不会使其成为子模块,而只是一个嵌套的 git 存储库,这是不好的,正如我在 http://stackoverflow.com/a/41968295/6309 中详细说明的那样。 - VonC.gitignore
中有_site/
,这种设置会不会让我自己搬起石头砸自己的脚? - Zaz在_site/
中初始化Git repo,然后添加一个Git post-commit hook:.git/hooks/post-commit
:
echo -n "Add commit to compiled version? (y/N) "
read answer < /dev/tty
if [ "$answer" != "y" ]; then exit; fi
message=$( git log -1 --pretty=%B )
git stash --all
bundle exec jekyll build
cd _site
git add --all
git commit -m "$message"
cd ..
git stash pop