Sistema de Atualização Automático

De UniWiki
Revisão de 12h33min de 11 de fevereiro de 2020 por Alexandre (Discussão | contribs)
Ir para: navegação, pesquisa

Sistema de Atualização para Aplicações Uniware

Este documento descreve o funcionamento e uso do Sistema de Atualização para Aplicações Uniware

1 Descrição Geral

O sistema de SAAU (Sistema de Atualização para Aplicações Uniware) é composto dos seguintes elementos:

  • Um repositório centralizado de pacotes localizado em http://uniware.com.br/updates no qual ficam disponíveis os pacotes de atualização das aplicações correspondentes.
  • Código client Classe TUpdateVersion no arquivo:
  Delphi 5 - CVS\_sharedunits\UUpdate.pas          
  Delphi 7 - CBS_D7\_SharedUnits\UUpdate.pas
  XE10 Rio - CVS_XE10\_SharedUnits\UUpdate.pas


Para que a aplicações compatíveis com a atualização automática possam ser atualizadas corretamente, os seguintes itens devem ser providenciados:

  1. 1) Um diretório com o nome da aplicação (em letras minusculas) deve ser criado em uniware.com.br/updates para disponibilização do pacote de atualização.
  1. 2) O pacote de atualização deve seguir as regras de publicação descritas abaixo



2 Regras de Publicação de Pacote

Os pacotes de atualização são compostos de dois arquivo, um arquivo de etiqueta do pacote com o nome fixo "versao.txt" contendo a descrição do pacote e um ZIP contendo todos os arquivos necessários para a atualização da aplicação e uma cópia do arquivo de etiqueta (versao.txt).

versao.txt

  Exemplo arquivo versao.txt:
    10.0.2.0
    11/02/2020
    tsprint_v10.0.2.0.zip
    count=4
    file1=TSPrint.exe|.\
    file2=TSImgCap.exe|.\
    file3=TSFingerCap_NIT.exe|.\
    file4=TSFingerCap_GRI.exe|.\

Descrição

 Linha 1: 10.0.2.0
 Linha 2: 11/02/2020
 Linha 3: tsprint_v10.0.2.0.zip
 Linha 4: count=4
 Linha 5: file1=TSPrint.exe|.\
 Linha 6: file2=TSImgCap.exe|.\
 Linha 7: file3=TSFingerCap_NIT.exe|.\
 Linha 8: file4=TSFingerCap_GRI.exe|.\


  • Linha 1 - Versão da aplicação disponível no pacote.
  • Linha 2 - Data de publicação do pacote
  • Linha 3 - Nome do arquivo zip que contem os arquivos para atualização (usar o padrão de nomes como no exemplo)
  • Linha 4 - Contador de arquivos, imdica quantos arquivos constam na lista (files1 a files(n))
  • Linha 5 a 8 - Relação dos arquivos existentes no pacote e respectivos paths.
  Os paths dos arquivos devem ser especificados de maneira relativa ao path do executável da aplicação (o executável que executa a atualização),
  por padrão usa-se .\ para diretório da aplicação.
  O sistema de atualização tambem utiliza esta lista de arquivos para verificar a integridade do pacote ao efetuar o download.



Pacote Zip - app_v0.0.0.0.zip

O arquivo ZIP deverá conter os arquivos de atualização da aplicação e tambem o programa auxiliar "usleep.exe" todos os arquivos devem estar obrigatoriamente na raiz do zip (pastas compactadas dentro do arquivo serão ignoradas).



3 Ajuda ao Programador


Abaixo segue um exemplo de rotina de atualização de aplicação, convêm que a rotina de verificação de atualização seja o primeiro processo executado na carga do programa pois sempre que a aplicação for atualizada ela será reiniciada.


Requisitos:

- Adicionar o arquivo UUpdate.pas ao projeto conforme a versão de delphi utilizada (Ver "Descrição Geral" acima).

- Adicionar UUpdate na uses

 // Exemplo metodo Atualizar - Verifica se existe uma atualização disponível e se for o caso atualiza a aplicação.
 procedure TFMain.Atualizar;
 var
   UPD : TUpdateVersion;
   S : String;
   i : Cardinal;
 begin
   UPD := TUpdateVersion.Create(Nil);
   UPD.UrlPath := APP_UPDATE_URL;
   try
      LogF('Verificando atualizações disponíveis...');
      if (UPD.HasUpdate) Then begin
         // testa para ver se não houve uma tentativa frustrada nas ultimas 2 horas para a nova versão
         if (not UPD.HitVersion) then begin
            LogF('   Preparando atualização de ' + ExtractFileName(ParamStr(0))+' para a versão ' + UPD.Versao);
            LogF('   Baixando arquivos da atualização...');
            if (UPD.Download) then begin
               if (UPD.PreparaAtualizacao) then begin
                  S := UPD.ScriptFileName;
                  FLog.Log('Atualizando arquivos...');
                  UPD.putVersion;

                  I := ShellExecute(0,'open',PChar(S),,,SW_MINIMIZE);
                  if (I <= 32) then begin
                     FLog.Erro('Erro ao executar o script de atualização. Codigo do erro: '+IntToStr(I));
                     S := ;
                     Case I of
                       0 : S := 'The operating system is out of memory or resources.WrapText';
                       ERROR_FILE_NOT_FOUND : S := 'Script não encontrado ('+UPD.ScriptFileName+').';
                       ERROR_PATH_NOT_FOUND: S := 'Caminho não encontrado ' + ExtractFilePath(UPD.ScriptFileName);
                       ERROR_BAD_FORMAT: S := 'Formato do arquivo inválido.';
                       SE_ERR_ACCESSDENIED: S:= 'Acesso negado ao arquivo de script.';
                       SE_ERR_ASSOCINCOMPLETE: S := 'Associação de tipo inválida ou incompleta para extensão .bat';
                       SE_ERR_NOASSOC	: S := 'Erro: SE_ERR_NOASSOC	.';
                       SE_ERR_OOM	: S := 'Não há memória disponível para completar a operação.';
                       SE_ERR_SHARE: S := 'Ocorreu uma violação de compartilhamento ao acessr o arquivo de script.';
                     end;
                     if (S <> ) then begin
                        LogF('   Erro: '+S, True);
                     end;
                  end else begin
                     Close;
                  end;

               end else begin
                  LogF('   Erro ao descompactar o pacote de atualização.',true);
               end;
            end else begin
               LogF('   Erro ao baixar o pacote de atualização.', True);
            end;
         end;
      end else begin
          lbVersão.Caption := 'Versão  ' +  UPD.AppVersao;
          LogF('   '+ExtractFileName(ParamStr(0)) + ' já está na ultima versão disponível.');
      end;
   finally
      UPD.Free;
   end;
 end;


Para exemplo de atualização de Serviços do Windows, consulte o UniSMS (serviço de SMS do Unilab).