Home > Forum > General > How to compare process conficuration between production and test environments ?

How to compare process conficuration between production and test environments ?
0

MVP

Hi Michał,
I don't think I have any good news in this topic.

TLDR; There is not a great way to do this, and at te end i'm sharing my gitlab flow :)

Before importing app to environment, there is no good way to see what will be changed. After, you can always check History of Changes, and it's also not super useful: https://docs.webcon.com/docs/2023R3/Studio/Process/module_2_4_6_5, but you are able to see which configs were changed.

The .bpe package which is created on export of application is a file you can unzip, and inside there is file without extension, but it's XML with all the configs.
This is rather big XML, and not really human friendly. Maybe it is possible to parse it, but creating such a thing will be very dependant on any structure changes from WEBCON side.

If i recall correctly, on latest WEBCON DAY there was some insight, that there will be functionality, which will generate documentation of changes - similar to how regular documentation is created, but don't quote me on this, unless someone else will confirm it :)

When it comes to the GitHub part. I'm using GitLab personally, but it's nothing like using git with regular code. I'm not resolving merge conflicts, I'm not even doing any branches. It's just main branch, with commits corresponding to new versions.

My flow looks like this:
* Change request -> Create new issue
* When there are few requests -> Collect issues into new milestone (I'm naming those using https://semver.org/).
* After closing all issues in a milestone -> Close milestone
* Manually create a write up of changes -> Export BPS Package, and put changes in the description field
* Commit package, and push it to main
* Create tag for latest commit
* Create release from selected tag, and also use that changelog created earlier

In case of any hotfixes
* Create issue
* Fix manually on dev, then on prod (without import/export, and also i'm skipping test here)
* Assign issue to the Next milestone, so it will be connected to next bigger release

Import/export is unfortunatelly painfull when you have to do things like 'Add column X on report Y', or 'Display column Y on a picker field'.

I hope that Webcon will someday make us surprise with some CI/CD stuff, at this moment adding small changes frequently is rather not pleasant experience, but looking at high performing developer teams this seems like a good practice.

In reply to: Maksymilian Stachowiak

Hi Michał,
I don't think I have any good news in this topic.

TLDR; There is not a great way to do this, and at te end i'm sharing my gitlab flow :)

Before importing app to environment, there is no good way to see what will be changed. After, you can always check History of Changes, and it's also not super useful: https://docs.webcon.com/docs/2023R3/Studio/Process/module_2_4_6_5, but you are able to see which configs were changed.

The .bpe package which is created on export of application is a file you can unzip, and inside there is file without extension, but it's XML with all the configs.
This is rather big XML, and not really human friendly. Maybe it is possible to parse it, but creating such a thing will be very dependant on any structure changes from WEBCON side.

If i recall correctly, on latest WEBCON DAY there was some insight, that there will be functionality, which will generate documentation of changes - similar to how regular documentation is created, but don't quote me on this, unless someone else will confirm it :)

When it comes to the GitHub part. I'm using GitLab personally, but it's nothing like using git with regular code. I'm not resolving merge conflicts, I'm not even doing any branches. It's just main branch, with commits corresponding to new versions.

My flow looks like this:
* Change request -> Create new issue
* When there are few requests -> Collect issues into new milestone (I'm naming those using https://semver.org/).
* After closing all issues in a milestone -> Close milestone
* Manually create a write up of changes -> Export BPS Package, and put changes in the description field
* Commit package, and push it to main
* Create tag for latest commit
* Create release from selected tag, and also use that changelog created earlier

In case of any hotfixes
* Create issue
* Fix manually on dev, then on prod (without import/export, and also i'm skipping test here)
* Assign issue to the Next milestone, so it will be connected to next bigger release

Import/export is unfortunatelly painfull when you have to do things like 'Add column X on report Y', or 'Display column Y on a picker field'.

I hope that Webcon will someday make us surprise with some CI/CD stuff, at this moment adding small changes frequently is rather not pleasant experience, but looking at high performing developer teams this seems like a good practice.

thank you a lot, it was helpful.

Do you have a way how to control in process, checking some database tables ?
I have someting like this, but I know that is not perfect, and not show everything

CREATE VIEW [dbo].[iv_week_changes]
AS
SELECT
'Aplikacja' AS gdzie,
[app_tsinsert] AS stworzono,
[app_tsupdate] AS zmieniono,
[app_name] AS nazwa,
[app_description] AS opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfapplications]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,app_tsupdate)
UNION
SELECT
'Akcja' AS gdzie,
[act_tsinsert] AS stworzono,
[act_tsupdate] AS zmieniono,
[act_name] AS nazwa,
[act_description] AS opis ,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfactions]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,act_tsupdate)
UNION
SELECT
'Uprawnienia ' AS gdzie,
[agr_tsinsert] AS stworzono,
[agr_tsupdate] AS zmieniono,
[agr_name] AS nazwa,
'brak na tym elemencie' AS opis ,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfapplicationsgroups]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,agr_tsupdate)
UNION
SELECT
'Path ' AS gdzie,
[path_tsinsert] AS stworzono,
[path_tsupdate] AS zmieniono,
[path_name] AS nazwa,
[path_description] AS opis,
[path_documentationdescription] AS dokumentracja
FROM
PROD_BPS_Content.[dbo].[wfavaiblepaths]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,path_tsupdate)
UNION
SELECT
'Business Rule' AS gdzie,
[brd_tsinsert] AS stworzono,
[brd_tsupdate] AS zmieniono,
[brd_name] AS nazwa,
'brak na tym elemencie' AS opis ,
[brd_documentation] AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfbusinessruledefinitions]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,brd_tsupdate)
UNION
SELECT
'Polaczenie' AS gdzie,
[wfc_tsinsert] AS stworzono,
[wfc_tsupdate] AS zmieniono,
[wfc_name] AS nazwa ,
[wfc_description] AS opis ,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfdataconnections]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,wfc_tsupdate)
UNION
SELECT
'Definicje' AS gdzie,
[DEF_TSInsert] AS stworzono,
[DEF_TSUpdate] AS zmieniono ,
[DEF_Name] AS nazwa,
[DEF_Description] AS opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFDefinitions]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,DEF_tsupdate)
UNION
SELECT
'Formularz' AS gdzie,
[DTYPE_TSInsert] AS stworzony,
[DTYPE_TSUpdate] AS zmieniony,
[DTYPE_Name] AS nazwa,
[DTYPE_Description] AS opis,
[DTYPE_DocumentationDescription] AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFDocTypes]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,DTYPE_tsupdate)
UNION
SELECT
'Zmienne środowiskowe' AS gdzie,
[EPV_TSInsert] AS stworzono,
[EPV_TSUpdate] AS zmieniono,
[EPV_Name]as nazwa,
[EPV_Description]as opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFEnvironmentProcessVariables]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,EPV_tsupdate)
UNION
SELECT
'Akcja cykliczne' AS gdzie,
[RAD_TSInsert] AS stworzono,
[RAD_TSUpdate] AS zmieniono,
[RAD_Name] AS nazwa,
[RAD_Description] AS opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFRecurrentActionsDefinitions]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,RAD_tsupdate)
UNION
SELECT
'Krok' AS gdzie,
[STP_TSInsert] AS stworzono,
[STP_TSUpdate] AS zmieniono,
[STP_Name] AS nazwa,
[STP_Description] AS opis ,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFSteps]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,STP_TSUpdate)
UNION
SELECT
'Timeout' AS gdzie,
[TIM_TSInsert] AS stworzono,
[TIM_TSUpdate]as zmieniono,
[TIM_Name] AS nazwa,
[TIM_Description] AS opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFTimeouts]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,TIM_TSUpdate)
UNION
SELECT
'Obieg' AS gdzie,
[WF_TSInsert] as stworzono,
[WF_TSUpdate] as zmieniono,
[WF_Name] as nazwa,
[WF_Description] as opis,
[WF_DocumentationDescription] as dokumentacja
FROM
PROD_BPS_Content.[dbo].[WorkFlows]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,WF_TSUpdate)
GO

MVP
In reply to: Michal Leszczynski (Raben)

thank you a lot, it was helpful.

Do you have a way how to control in process, checking some database tables ?
I have someting like this, but I know that is not perfect, and not show everything

CREATE VIEW [dbo].[iv_week_changes]
AS
SELECT
'Aplikacja' AS gdzie,
[app_tsinsert] AS stworzono,
[app_tsupdate] AS zmieniono,
[app_name] AS nazwa,
[app_description] AS opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfapplications]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,app_tsupdate)
UNION
SELECT
'Akcja' AS gdzie,
[act_tsinsert] AS stworzono,
[act_tsupdate] AS zmieniono,
[act_name] AS nazwa,
[act_description] AS opis ,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfactions]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,act_tsupdate)
UNION
SELECT
'Uprawnienia ' AS gdzie,
[agr_tsinsert] AS stworzono,
[agr_tsupdate] AS zmieniono,
[agr_name] AS nazwa,
'brak na tym elemencie' AS opis ,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfapplicationsgroups]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,agr_tsupdate)
UNION
SELECT
'Path ' AS gdzie,
[path_tsinsert] AS stworzono,
[path_tsupdate] AS zmieniono,
[path_name] AS nazwa,
[path_description] AS opis,
[path_documentationdescription] AS dokumentracja
FROM
PROD_BPS_Content.[dbo].[wfavaiblepaths]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,path_tsupdate)
UNION
SELECT
'Business Rule' AS gdzie,
[brd_tsinsert] AS stworzono,
[brd_tsupdate] AS zmieniono,
[brd_name] AS nazwa,
'brak na tym elemencie' AS opis ,
[brd_documentation] AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfbusinessruledefinitions]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,brd_tsupdate)
UNION
SELECT
'Polaczenie' AS gdzie,
[wfc_tsinsert] AS stworzono,
[wfc_tsupdate] AS zmieniono,
[wfc_name] AS nazwa ,
[wfc_description] AS opis ,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[wfdataconnections]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,wfc_tsupdate)
UNION
SELECT
'Definicje' AS gdzie,
[DEF_TSInsert] AS stworzono,
[DEF_TSUpdate] AS zmieniono ,
[DEF_Name] AS nazwa,
[DEF_Description] AS opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFDefinitions]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,DEF_tsupdate)
UNION
SELECT
'Formularz' AS gdzie,
[DTYPE_TSInsert] AS stworzony,
[DTYPE_TSUpdate] AS zmieniony,
[DTYPE_Name] AS nazwa,
[DTYPE_Description] AS opis,
[DTYPE_DocumentationDescription] AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFDocTypes]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,DTYPE_tsupdate)
UNION
SELECT
'Zmienne środowiskowe' AS gdzie,
[EPV_TSInsert] AS stworzono,
[EPV_TSUpdate] AS zmieniono,
[EPV_Name]as nazwa,
[EPV_Description]as opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFEnvironmentProcessVariables]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,EPV_tsupdate)
UNION
SELECT
'Akcja cykliczne' AS gdzie,
[RAD_TSInsert] AS stworzono,
[RAD_TSUpdate] AS zmieniono,
[RAD_Name] AS nazwa,
[RAD_Description] AS opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFRecurrentActionsDefinitions]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,RAD_tsupdate)
UNION
SELECT
'Krok' AS gdzie,
[STP_TSInsert] AS stworzono,
[STP_TSUpdate] AS zmieniono,
[STP_Name] AS nazwa,
[STP_Description] AS opis ,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFSteps]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,STP_TSUpdate)
UNION
SELECT
'Timeout' AS gdzie,
[TIM_TSInsert] AS stworzono,
[TIM_TSUpdate]as zmieniono,
[TIM_Name] AS nazwa,
[TIM_Description] AS opis,
'brak na tym elemencie' AS dokumentacja
FROM
PROD_BPS_Content.[dbo].[WFTimeouts]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,TIM_TSUpdate)
UNION
SELECT
'Obieg' AS gdzie,
[WF_TSInsert] as stworzono,
[WF_TSUpdate] as zmieniono,
[WF_Name] as nazwa,
[WF_Description] as opis,
[WF_DocumentationDescription] as dokumentacja
FROM
PROD_BPS_Content.[dbo].[WorkFlows]
WHERE
(CONVERT (DATE, current_timestamp- 30) ) <= CONVERT (DATE,WF_TSUpdate)
GO

I'm not checking changes in the database directly - probably I'll start, when something won't work :)
For now i trust that Webcon have this covered, and i don't really want to check it - it should just work out of the box.

Due to creating an issue for each change (functionality, bug fix), I know all the changes that were made in specific release.
It takes time to write them down, but i feel more comfortable when i know what I'm deploying.
Looking at many open source projects on github - there are no changes in the code (functionality, bug fix) without creating an issue first, and that's what I'm taking from regular programming.

I know that view you've created is more technical one, but i recalled that i have some views too, and might share how i'm handling it as well.
If you are creating views for specific applications, my route for now is creating schema per application, for which i can assign privileges.
Those schemas are managed with Flyway (https://flywaydb.org/) so specific application version is connected with specific schema version, both are being kept in the same gitlab repository.