Domanda

Ho CruiseControl.NET versione 1.4 configurato sul mio server di sviluppo.Ogni volta che uno sviluppatore archivia il codice, esegue una compilazione.

Ora siamo a un punto in cui possiamo iniziare a fornire la nostra applicazione ai tester.Ci piacerebbe utilizzare ClickOnce per distribuire l'applicazione, con l'idea che quando un tester va a testare l'applicazione, ha la build più recente.

Non riesco a trovare un modo per farlo accadere con CruiseControl.NET.Stiamo utilizzando MSBUILD per eseguire le build.

È stato utile?

Soluzione 2

Grazie per tutto l'aiuto.La soluzione finale che abbiamo implementato ha preso spunto da ogni risposta.

Abbiamo trovato più semplice gestire il lavoro con più ambienti utilizzando semplici file batch.Non sto suggerendo che questo sia il modo migliore per farlo, ma per il nostro scenario e i nostri requisiti, ha funzionato bene.Completa "Progetto" con il nome del tuo progetto e "Ambiente" con il nome del tuo ambiente (sviluppo, test, stage, produzione, qualunque cosa).

Ecco l'area delle attività del nostro file "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>

La prima cosa che noterai è che CopySettings.bat viene eseguito.Copia le impostazioni specifiche per l'ambiente, come le connessioni al database.

Successivamente, viene eseguita l'attività MSBUILD standard.Eventuali errori di compilazione vengono rilevati qui e gestiti normalmente.

L'ultima cosa da eseguire è Publish.bat.In realtà esegue nuovamente una "ricostruzione" di MSBUILD dalla riga di comando e i parametri di CruiseControl vengono automaticamente passati e creati.Successivamente, MSBUILD viene chiamato per la destinazione "pubblica".Alla pubblicazione vengono forniti esattamente gli stessi parametri quando è stata emessa la ricostruzione.Ciò mantiene sincronizzati i numeri di build.Inoltre, i nostri eseguibili hanno nomi diversi (ad es.- ProjectDev e ProjectTest).Ci ritroviamo con numeri e nomi di versione diversi e questo consente a ClickOnce di fare il suo dovere.

L'ultima parte di Publish.bat copia i file effettivi nelle loro nuove case.Non utilizziamo Pubbliche.htm poiché tutti i nostri utenti sono in rete, diamo loro semplicemente un collegamento al file manifest sul desktop e possono fare clic ed eseguire sempre l'eseguibile corretto con un numero di versione che si collega Regolazione automatica della velocità.

Ecco 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

E infine, ecco 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

Come ho detto, probabilmente non è stato fatto nel modo in cui gli sviluppatori di CruiseControl e MSBUILD avevano previsto che le cose funzionassero, ma funziona.Se hai bisogno di farlo funzionare ieri, potrebbe essere la soluzione che stai cercando.Buona fortuna!

Altri suggerimenti

Lo abbiamo fatto e possiamo darti alcuni suggerimenti per iniziare.

2 cose di cui dovresti essere consapevole:

  • MSBuild può generare per te i file di distribuzione necessari.
  • MSBuild non distribuirà i file nella condivisione FTP o UNC.Avrai bisogno di un passaggio separato per questo.

Per utilizzare MSBuild per generare i manifest ClickOnce, ecco il comando che dovrai eseguire:

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

Ciò dirà a MSBuild di creare il tuo progetto e generare file di distribuzione ClickOnce all'interno del file bin elease\YourProject.publish directory.

Tutto ciò che resta è copiare quei file sulla condivisione FTP/UNC/ovunque e il gioco è fatto.

Puoi dire a CruiseControl.NET di creare utilizzando questi parametri MSBuild.

Avrai quindi bisogno di un'attività di compilazione CruiseControl.NET per prendere i file di distribuzione generati e copiarli nella condivisione FTP o UNC.Per questo utilizziamo un piccolo programma console C# personalizzato, ma potresti utilizzare altrettanto facilmente uno script PowerShell.

Ricordo di averlo fatto l'anno scorso per un progetto ClickOnce a cui stavo lavorando.Ricordo che ci ho messo un'eternità per capirlo, ma eccolo qui.Quello che volevo che i miei script facessero era generare un programma di installazione diverso che puntasse al nostro dev env e uno diverso per prod.Non solo, ma ne avevo bisogno per inserire le giuste informazioni sulle versioni in modo che i client esistenti "si rendessero conto" che esiste una nuova versione là fuori, che è il punto centrale di clickOnce.In questo script devi sostituire con i tuoi nomi di server ecc.Il trucco sta nel salvare i filepublish.htm e project.publish e inserire il nuovo numero di versione in base alla versione fornita da CC.NET.

Ecco come appariva il mio script di build:

<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>

Spero che questo ti aiuti

Essere in grado di passare ${CCNetLabel} nell'attività msbuild CCNET.config sarebbe un grande miglioramento.

Si desidera utilizzare le attività di generazione del manifesto ClickOnce in msbuild.Il processo è un po' prolisso, quindi ti indicherò solo un paio di link.Ecco il riferimento su msdn e un articolo campione per iniziare, si spera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top