我正在研究Cake脚本,该脚本应该构建Wyam网站并将其部署到Github网站。这意味着应使用新的Wyam构建替换master分支的全部内容。
到目前为止,我已经在下面创建了Cake脚本,该脚本可以正常工作。但是我想知道是否有一种更简便的方法,用新的Wyam构建替换master分支的所有内容,然后手动执行这些任务。
我要简化的任务是EmptyMasterBranch
和CopyToMasterBranch
。
Task("Build")
.Does(() =>
{
Wyam();
});
Task("Preview")
.Does(() =>
{
Wyam(new WyamSettings
{
Preview = true,
Watch = true
});
});
Task("CloneMasterBranch")
.Does(() => {
Information("Cloning master branch into temp directory");
GitClone(
repositoryUrl,
new DirectoryPath(tempDir),
githubUserName,
githubAccessToken,
new GitCloneSettings {
BranchName = "master"
}
);
});
Task("EmptyMasterBranch")
.IsDependentOn("CloneMasterBranch")
.Does(() => {
Information("Emptying master branch");
string[] filePaths = System.IO.Directory.GetFiles(tempDir);
foreach (string filePath in filePaths)
{
var fileName = new FileInfo(filePath).Name;
fileName = fileName.ToLower();
if(System.IO.File.Exists(filePath))
{
DeleteFile(filePath);
}
}
string[] directoryPaths = System.IO.Directory.GetDirectories(tempDir);
foreach (string directoryPath in directoryPaths)
{
var directoryName = new FileInfo(directoryPath).Name;
directoryName = directoryName.ToLower();
if(directoryName == ".git")
{
// Do not delete the .git directory
continue;
}
if (System.IO.Directory.Exists(directoryPath))
{
DeleteDirectory(
directoryPath,
new DeleteDirectorySettings{
Recursive = true,
Force = true
});
}
}
});
Task("CopyToMasterBranch")
.IsDependentOn("Build")
.IsDependentOn("EmptyMasterBranch")
.Does(() => {
var sourcePath = "./output";
Information("Copying files to master branch");
// Now Create all of the directories
foreach (string dirPath in System.IO.Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories))
{
System.IO.Directory.CreateDirectory(dirPath.Replace(sourcePath, tempDir));
}
//Copy all the files & Replaces any files with the same name
foreach (string newPath in System.IO.Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories))
System.IO.File.Copy(newPath, newPath.Replace(sourcePath, tempDir), true);
});
Task("CommitMasterBranch")
.IsDependentOn("CopyToMasterBranch")
.Does(() => {
Information("Performing Git commit on master branch");
GitAddAll(tempDir);
GitCommit(tempDir, "Johan Vergeer", "johanvergeer@gmail.com", $"Automated release {gitVersion.InformationalVersion}");
});
Task("PushMasterBranch")
.IsDependentOn("CommitMasterBranch")
.Does(() => {
Information("Pushing master branch to origin");
GitPush(tempDir, githubUserName, githubAccessToken, "master");
});
答案 0 :(得分:2)
您可能会对研究我创建的Cake.Wyam.Recipe包感兴趣,该包将为您解决其中的一些问题。
对于您遇到的特定问题,我使用了Kudu Sync工具来解决此问题。相关的代码行在这里:
var sourceCommit = GitLogTip("./");
var publishFolder = BuildParameters.WyamPublishDirectoryPath.Combine(DateTime.Now.ToString("yyyyMMdd_HHmmss"));
Information("Publishing Folder: {0}", publishFolder);
Information("Getting publish branch...");
GitClone(BuildParameters.Wyam.DeployRemote, publishFolder, new GitCloneSettings{ BranchName = BuildParameters.Wyam.DeployBranch });
Information("Sync output files...");
Kudu.Sync(BuildParameters.Paths.Directories.PublishedDocumentation, publishFolder, new KuduSyncSettings {
ArgumentCustomization = args=>args.Append("--ignore").AppendQuoted(".git;CNAME")
});
if (GitHasUncommitedChanges(publishFolder))
{
Information("Stage all changes...");
GitAddAll(publishFolder);
Information("Commit all changes...");
GitCommit(
publishFolder,
sourceCommit.Committer.Name,
sourceCommit.Committer.Email,
string.Format("AppVeyor Publish: {0}\r\n{1}", sourceCommit.Sha, sourceCommit.Message)
);
Information("Pushing all changes...");
GitPush(publishFolder, BuildParameters.Wyam.AccessToken, "x-oauth-basic", BuildParameters.Wyam.DeployBranch);
这里有一个有关使用此食谱的介绍性博客文章: