#git #cakebuild
#git #cakebuild
Вопрос:
Я работаю над скриптом Cake, который должен создать сайт Wyam и развернуть его на сайтах Github. Это означает, что все содержимое главной ветки должно быть заменено новой сборкой Wyam.
На данный момент я создал приведенный ниже скрипт Cake, который работает так, как должен. Но мне интересно, есть ли более простой способ заменить все содержимое главной ветки новой сборкой Wyam, а затем выполнить эти задачи вручную.
Задачами, которые я хотел бы упростить, являются 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 amp; 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");
});
Ответ №1:
Возможно, вам будет интересно взглянуть на созданный мной пакет 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}rn{1}", sourceCommit.Sha, sourceCommit.Message)
);
Information("Pushing all changes...");
GitPush(publishFolder, BuildParameters.Wyam.AccessToken, "x-oauth-basic", BuildParameters.Wyam.DeployBranch);
Здесь есть вводный пост в блоге об использовании этого рецепта: