Как можно опубликовать приложение ClickOnce через CruiseControl.NET?

Это скорее совет, чем ответ, но если вы используете Spring MVC в своем веб-приложении, хорошей идеей является использование Spring HandlerInterceptor вместо Filter

. Он может выполнять ту же работу, но также - Может работать с ModelAndView. Его методы можно вызвать до и после обработки запроса или после завершения запроса. - Он может быть легко протестирован.

1 Внедрите интерфейс HandlerInterceptor и добавьте аннотацию @Component к вашему классу

@Component
public class SecurityInterceptor implements HandlerInterceptor {

    private static Logger log = LoggerFactory.getLogger(SecurityInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        request.getSession(true);
        if(isLoggedIn(request))
            return true;

        response.getWriter().write("{\"loggedIn\":false}");
        return false;
    }

    private boolean isLoggedIn(HttpServletRequest request) {
        try {
            UserSession userSession = (UserSession) request.getSession(true).getAttribute("userSession");
            return userSession != null && userSession.isLoggedIn();
        } catch(IllegalStateException ex) {
            return false;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

    }
}

2 Настройте свой перехватчик

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private HandlerInterceptor securityInterceptor;

    @Autowired
    public void setSecurityInterceptor(HandlerInterceptor securityInterceptor) {
        this.securityInterceptor = securityInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(securityInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/logout");
    }

}
24
задан huseyint 17 October 2008 в 21:43
поделиться

5 ответов

Спасибо за всю справку. Конечное решение, которое мы реализовали, взяло немного из каждого ответа.

Мы нашли легче обработать работу с несколькими средами с помощью простых пакетных файлов. Я не предполагаю, что это - лучший способ сделать это, но для нашего данного сценария и требований, это работало хорошо. Дополнение "Проект" с Вашим названием проекта и "Среда" с Вашим именем среды (dev, тест, этап, производство, безотносительно).

Вот область задач нашего "ccnet.config" файла.

<!-- override settings  -->
<exec>
    <executable>F:\Source\Project\Environment\CruiseControl\CopySettings.bat</executable>
</exec>

<!-- compile -->
<msbuild>
    <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
    <workingDirectory>F:\Source\Project\Environment\</workingDirectory>
    <projectFile>Project.sln</projectFile>
    <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
    <targets>Rebuild</targets>
    <timeout>0</timeout>
    <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>

<!-- clickonce publish  -->
<exec>
    <executable>F:\Source\Project\Environment\CruiseControl\Publish.bat</executable>
</exec>

первой вещью, которую Вы заметите, является тот CopySettings.bat выполнения. Это копирует определенные настройки для среды, такие как соединения с базой данных.

Затем, стандартные выполнения задачи MSBUILD. Любые ошибки компиляции пойманы здесь и обработаны как нормальные.

последней вещью выполниться является Publish.bat. Это на самом деле работает, MSBUILD "восстанавливают" снова из командной строки, и параметры от CruiseControl автоматически передаются в и создаются. Затем, MSBUILD требуется "опубликовать" цель. Те же самые параметры даны тому, чтобы публиковать, как восстанавливание было выпущено. Это сохраняет номера сборки в синхронизации. Кроме того, наши исполняемые файлы называют по-другому (т.е. - ProjectDev и ProjectTest). Мы заканчиваем с различными номерами версий и именами, и это позволяет ClickOnce делать свою вещь.

последняя часть Publish.bat копирует фактические файлы в их новые дома. Мы не используем publish.htm, как все наши пользователи находятся в сети, мы просто даем им ярлык на файл манифеста на их рабочем столе, и они могут нажать и всегда выполнять корректный исполняемый файл с номером версии, который связывает в CruiseControl.

Здесь CopySettings.bat

XCOPY "F:\Source\Project\Environment\CruiseControl\Project\app.config" "F:\Source\Project\Environment\Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.Designer.vb" "F:\Source\Project\Environment\Project\My Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.settings" "F:\Source\Project\Environment\Project\My Project" /Y /I /R

И наконец, здесь Publish.bat

C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:rebuild "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationRevision=%CCNetLabel% /property:AssemblyName="ProjectEnvironment" /property:PublishUrl="\\Server\bin\Project\Environment\\"
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:publish "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationVersion="1.0.0.%CCNetLabel%" /property:AssemblyVersion="1.0.0.%CCNetLabel%" /property:AssemblyName="ProjectEnvironment" 

XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish" "F:\Binary\Project\Environment" /Y /I
XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish\Application Files" "F:\Binary\Project\Environment\Application Files" /Y /I /S

Как, я сказал, это, вероятно, не сделало способа, которым CruiseControl и разработчики MSBUILD предназначили вещи работать, но это действительно работает. Если необходимо вчера получить эту работу, это могло бы быть решение, которое Вы ищете.Удачи!

12
ответ дан proudgeekdad 28 November 2019 в 23:47
поделиться

Мы сделали это и можем дать Вам некоторые подсказки для запуска.

2 вещи необходимо знать:

  • MSBuild может генерировать необходимые файлы развертывания для Вас.
  • MSBuild не развернет файлы на доле UNC или FTP. Вам будет нужен отдельный шаг для этого.

Для использования MSBuild для генерации деклараций ClickOnce вот команда, которую необходимо будет дать:

msbuild /target:publish /p:Configuration=Release /p:Platform=AnyCPU; "c:\yourProject.csproj"

, Который скажет MSBuild разрабатывать Ваш проект и генерировать файлы развертывания ClickOnce в каталог bin\Release\YourProject.publish .

Все, что это оставляют, должно скопировать те файлы в долю/везде, где FTP/UNC, и Вы все установлены.

можно сказать CruiseControl.NET создавать использование тех параметров MSBuild.

Вам тогда будет нужна задача сборки CruiseControl.NET взять сгенерированные файлы развертывания и скопировать их в долю UNC или FTP. Мы используем пользовательскую небольшую программу консоли C# для этого, но Вы могли столь же легко использовать сценарий Powershell.

22
ответ дан Judah Gabriel Himango 28 November 2019 в 23:47
поделиться

Я не забываю делать это в прошлом году для проекта ClickOnce, я продолжал работать. Я помню его берущий меня навсегда для выяснения, но здесь это. То, что я хотел, чтобы мои сценарии сделали, должно было генерировать различный установщик, который указал на наш dev ENV и различный для напоминания. Не только это, но и мне был нужен он для введения правильной информации об управлении версиями, таким образом, существующие клиенты 'поймут', что существует новая версия там, которая является смыслом clickOnce. В этом сценарии необходимо заменить собственными именами серверов и т.д. Прием должен сохранить publish.htm и project.publish файл и ввести новый номер версии на основе версии, которая предоставляется Вам CC.NET.

Вот то, на что был похож мой сценарий сборки:

<target name="deployProd">
  <exec program="<framework_dir>\msbuild.exe" commandline="<project>/<project>.csproj /property:Configuration=PublishProd /property:ApplicationVersion=${build.label}.*;PublishUrl=\\<prod_location>\binups$\;InstallUrl=\\<prod_location>\binups$\;UpdateUrl=\\<prod_location>\binups$\;BootstrapperComponentsUrl=\\<prod_location>\prereqs$\ /target:publish"/>

  <copy todir="<project>\bin\PublishProd\<project>.publish">

    <fileset basedir=".">
      <include name="publish.htm"/>
    </fileset>

    <filterchain>
      <replacetokens>
        <token key="CURRENT_VERSION" value="${build.label}"/>
      </replacetokens>
     </filterchain>
  </copy>

</target>

Hope это помогает

4
ответ дан fnCzar 28 November 2019 в 23:47
поделиться

Вы хотите использовать задачи поколения декларации ClickOnce в msbuild. Процесс немного долог обветренный, таким образом, я просто собираюсь указать на Вас на несколько ссылок. Вот ссылка на msdn и демонстрационная статья для обнадеживающего запущения Вас.

-1
ответ дан Dale Ragan 28 November 2019 в 23:47
поделиться

Просто смогите передав $ {CCNetLabel} в CCNET.config msbuild, задачей было бы большое улучшение.

0
ответ дан 28 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: