Sim, você precisa de um ambiente de teste ou armazenamento temporário em que execute todas as etapas, mas é essencial manter arquivos de configuração separados para ambientes separados.
Environments
|_property_files
|_ dev
|_ com.bla.util
| |_ example.properties
|_ com.bla.beans
| |_ someconfig.xml
|_ test
....
|_ production
....
|_database_updates
|_ dev
|_ insert_new_static_data.sql
|_ ...
...
Basicamente, nos meus scripts de construção e implantação, pego uma propriedade de ambiente que busca os arquivos de metadados específicos do ambiente, como arquivos XML, e os substitui no meu local de construção antes do empacotamento. Além disso, em meus scripts de implantação, procurarei todos os arquivos SQL nas atualizações do banco de dados e os executarei no banco de dados configurado para esse ambiente também.
Eu poderia fazer isso com uma tarefa de compilação personalizada, mas na verdade eu apenas uso alguns testes JUnit para fazer isso por mim. Se ocorrer alguma exceção SQL, o teste falhará e, portanto, a implantação falhará. De um modo geral, os scripts SQL possuem inteligência, se os dados necessários já existirem no ambiente, eles ignoram a inserção ou atualização.
Também tenho um diretório semelhante para scripts em lote ou shell que preciso executar para um ambiente específico.
O que diz tudo na sua pergunta é o seguinte: eles sempre devem ser atualizados, mas não serão.
Essas configurações direcionam suas compilações e implantações automatizadas; portanto, se você não as atualizar, suas compilações falharão e seu gerente será enviado por e-mail sobre isso. É tão importante para a equipe manter as configurações de compilação e implantação de uma versão específica quanto para o check-in do código que é compilado. Qualquer infração quebra a compilação.
Em suma, uma maior adoção dos princípios de integração contínua (IC) ajudará a remover a dor das liberações de produção.