Liquibase tutorial: Automate your database scripts deployment - Pretius (2022)

Many organizations have implemented DevOps in their applications, that’s true. But, at the same time, their database change process hasn’t realized any of these benefits and is still left in the dark ages. But what if you could automate that too? Yeah, you guessed right – it can be done using Liquibase. And here’s a Liquibase tutorial to show you how to do that.

You can jump to various parts of this Liquibase tutorial, according to your needs and previous knowledge:

  • Is Liquibase for you? How to install and configure it?
  • How to try out Liquibase by connecting it with a new database?
  • How to use Liquibase in your existing project?

Or just keep on reading!

Also, here’s a GitHub repository where you can find the files which I’m using in the examples below.

Is this Liquibase tutorial for you?

Are you manually executing scripts to your database? Or maybe you’re wasting time validating database scripts received from your team?

After that, are you merging scripts into one file and executing them in every environment? How about deployment errors? Have you ever spent hours looking at who, why, and what was changed in the database?

But what if you can’t have an entire CI/CD process right now or company policy doesn’t allow you to run scripts on specific environments? That’s not a problem for Liquibase.

By using Liquibase you can:

  • automate your database deployment scripts,
  • consistently deploy the same way in every environment,
  • have rollbacks always prepared for every database change,
  • have all detailed info of deployments in one place.

What’s more, thanks to this you will have:

  • fewer deployment errors,
  • happy and efficient developers coding together on the same databases,
  • every change audited, e.g who, when (and why) changed the column SHOES.SHOE_SIZE from a NUMBER data type to a VARCHAR2,
  • more coffee time.

In a series of articles, I’ll show you how we automated our database change process at Pretius using Liquibase and GIT – examples from limited-access environments included. Let’s start with this basic Liquibase tutorial.

What is Liquibase exactly?

Liquibase (LB) is an open source tool written in Java. It makes defining database changes easy, in a format that’s familiar and comfortable to each user. Then, it automatically generates database-specific SQL for you.

Database changes (every change is called changeset) are managed in files called changelogs.

Liquibase needs two tables at your db schema(created automatically):

  • DATABASECHANGELOG — a table storing information about all changes made to your database,
  • DATABASECHANGELOGLOCK — used to prevent users from doing changes to the database at the same time.

My examples will be based on changesets written in SQL — it’s the easiest way to start automating your Oracle database change process.

Start with installing Liquibase

Go to https://www.liquibase.org/download and download the latest version — choose “Just the files”. In this article, I will use version 4.3.0. built 09.02.2021.

Extract the downloaded zip folder (e.g., to disk C:).After that, you must set a New Path System Variable to the liquibase-version#bin folder on your computer. For Liquibase to work properly, you must also have JAVA installed.

Go to your favourite CLI tool (I use Visual Studio Code) and type:

1

liquibaseversion

If everything’s ok, you will see:

If you use UTF8 encoding in your files remember toedit the liquibase.bat file by adding line:

1

IF NOT DEFINED JAVA_OPTS set JAVA_OPTS=-Dfile.encoding=UTF8

Configure your project and Liquibase

Ok, let’s see how we can organize our files (folder HR is my GIT repository). In these folders, we will put files created during project development. If you had other types of objects (which are “create or replace” type) just create folder with it, e.g “synonyms”.

Now, we need to create Liquibase properties file with connection to our DEV database:

#path to our master changelog filechangeLogFile: liquibase/update.xml#dbhost and credentialsurl:jdbc:oracle:thin:@127.0.0.1:1521/XEPDB1username: HRpassword: XXXXXX#OJDBC driver localizationclasspath: liquibase/ojdbc8.jar#schema, where Liquibase will store it’s DATABASECHANGELOG and DATABASECHANGELOGLOCK table (if other than HR, remember to add grants to HR!)liquibaseSchemaName: HR#defaultSQL file name generated by LiquibaseoutputFile=output_local.sql#debug modeloglevel=SEVERE#extra option from Liquibase, we don’t need it for now.liquibase.hub.mode=off

Now, create an update.xml file (put it into new hr/liquibase folder with ojdbc file):

<?xml version=”1.0″ encoding=”UTF-8″?><databaseChangeLogxmlns=”http://www.liquibase.org/xml/ns/dbchangelog” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd”></databaseChangeLog>

Use Oracle Wallet (optional)

If your Oracle database is hosted on Oracle Autonomous Database, you need to use the wallet to connect to it through Liquibase. Therefore, download your wallet and remember the password for it.

Unpack your WALLET_NAME.ZIP to previously created HR/liquibase folder. Also edit your HR/liquibase/wallet_name/ojdbc.properties file:

Your file should look like on the screen above. In the lines javax.net.ssl.trustStorePassword and javax.net.ssl.keyStorePassword, put your ATP wallet password.

Edit URL at your liquibase_local.properties file and set your connection name (from Wallet/tnsnames.ora and path to wallet):

(Video) Take control over your database: Automation and CI/CD with Liquibase

1

url:jdbc:oracle:thin:@rgatp28_high?TNS_ADMIN=liquibase/Wallet_RGATP28

Check your sqlnet.ora file, make sure there is “ SSL_SERVER_DN_MATCH=yes”. Don’t change anything else.

Connect Liquibase with a database

If everything is set properly, we can make the first connection to our DEV database. Start your favourite CLI from the HR folder (location of liquibase properties file) – for the purpose of this article, I use terminal directly from VS Code and connection to my local development database.

1

liquibasedefaultsFile=liquibase_dev.properties updateSQL

liquibase -> invocation of LB(environment path)

defaultsFile -> name and location of our properties file

(if you’d name properties file to “liquibase.properties” then you may omit this command because it’s liquibase default. I’ll prefer to have different names for every connection)

updateSQL -> Liquibase command, only generation of SQL script (it won’t do anything on your database)

In a few second LB will generate output_file.sql

As you can see, if you’d run this script to your database it would create two tables: DATABASECHANGELOG and DATABASECHANGELOGLOCK.

Ok, now let’s create those tables:

1

liquibasedefaultsFile=liquibase_dev.properties update

Updatecommand will run execute SQL to database.

Tables are created:

Now, we need to create a changelog file that will point to our folders with objects (those we can create / replace).

I created HR/master.xml file:

<?xml version=”1.0″ encoding=”UTF-8″?><databaseChangeLogxmlns=”http://www.liquibase.org/xml/ns/dbchangelog”xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xsi:schemaLocation=”http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd”><includeAll path=”triggers” relativeToChangelogFile=”true”/><includeAll path=”views” relativeToChangelogFile=”true”/><includeAll path=”types” relativeToChangelogFile=”true”/><includeAll path=”package_spec” relativeToChangelogFile=”true”/><includeAll path=”package_bodies” relativeToChangelogFile=”true”/></databaseChangeLog>

It points to my objects folders and all of it’s content.

In main changelog HRliquibaseupdate.xml set path to your master.xml file, just add line:

<include file=”./master.xml”/>

Liquibase always runs from our liquibase_dev.properties file and update.xml file, so It must see all of your files from there.

Track your DML and DDL database changes

Ok, wait… but what about changes like DDL or DML? No problem.

For that type of change we create a separate changelog file and write our changesets inside of it.

Just create changelog.sql file and mark it as Liquibase sql file by typing:

1

liquibase formatted sql

Point to our new changelog in master.xml file by adding:

(Video) DevOps your Oracle DB with Liquibase in less than 1 hour

<include file=”changelog.sql” relativeToChangelogFile=”true” />

Order in which you point to your changelogs or folders is very important. It tells Liquibase in which order torun your sql. It is better to run changelogs first ( inside of which is “create table(…)” ) and after that compile package which uses this table.

Let’s create first project table in our changeset. Just write:

1

2

3

4

changeset AUTHOR:CHANGESET_NAME

comment OPTIONAL COMMENT

YOUR DDL

Let’s ask LB to generate our SQL file (just to preview what changes are going to be made to our database).

1

liquibasedefaultsFile=liquibase_dev.properties updateSQL

As you may noticed, LB is going to lock our DATABASECHANGELOGLOCK table by setting LOCKED = 1 ( while you are running your script to DB, column LOCKED is set to 1. When another user runs LB in the same time, Liquibase will wait until lock is released), then it will create a SHOES table, insert log change into DATABASECHANGELOG and release lock from DATABASECHANGELOGLOCK table.

If everything is fine, execute script to our database:

1

liquibasedefaultsFile=liquibase_dev.properties update

The table SHOES has been created.

We can check who, why and when created this table.

Finally, nothing is anonymous! 🙂

Are you looking for Liquibase experts?

Schedule a call

Track other database changes (packages, views, etc.)

Now, we can do the same with some scripts. I created a package called SHOES_PKG in 2 separate files. Every file is unique changeset and should be marked as liquibase formatted sql file.

Sql file is unique changeset withadditional parameters:

runOnChange:true — it means, everytime we change our package Liquibase will run this changeset against our database (compile this package)

stripComments:false — do not cut our code comments

Now, if we check what SQL would LB run against database (updateSQL) — it would compile both package spec and package body.

Let’s compile these package in our DB (update command).

Everything is logged and packages are compiled.

(Video) Automatyczny deployment aplikacji Oracle APEX i baz danych

Have a look at MD5SUM column value — it’s last checksum of your changeset.

For now, all pending changes are executed, LB will not generate anything in SQL (besides locking LB table) — check it by running updateSQL.

Now, let’s change our SHOES_PKG body and save the file.

Checksum of the file has changed and LB will compile this package again — let’s run an update.

Liquibase compiled package body again and updated row with these changeset in DATABASECHANGELOG table – with actual DATEEXECUTED and new MD5SUM value.

How to install Liquibase in an existing software project?

In this part of the Liquibase tutorial, you will learn how to implement database automation in an existing software project.

Is it possible without hours of additional work? Yes!

There are a few ways to automate your existing database using Liquibase. I will show you two which I found most useful – and you can choose the one that suits your needs best.

In the examples below, I’ll be using the project created in the previous steps of this Liquibase tutorial.

How to install Liquibase when there are lots of objects in your existing project

Configure Liquibase in your project repository and leave all files as they are – just remember to add a path to them in your master.xml file.

So, I have created 2 procedures and 2 triggers before implementing Liquibase:

You DON’T need to add “changeset” or “–liquibase formatted sql” to your file right now.

I also added a path to a PROCEDURES folder to my master.xml.

Now, let’s run Liquibase updateSQL to see what SQL Liquibase would like to execute:

1

2

liquibasedefaultsFile=liquibase_dev.properties updateSQL

OK, bro. But this is not what we wanted! We already have these procedures and triggers in our database. We don’t want to create these objects again.

That’s where ChangelogSync and ChangelogSyncSQL commands come in!

Let’s run ChangelogSyncSQL to see what’s gonna happen:

1

2

liquibasedefaultsFile=liquibase_dev.properties ChangelogSyncSQL

The output SQL file is:

This is exactly what we wanted – just an SQL file with inserts in a DATABASECHANGELOG table. It will “tell” Liquibase that those objects were already created in the past, and there’s no need to run them again.

Now, let’s insert it to our Oracle database:

1

2

liquibasedefaultsFile=liquibase_dev.properties ChangelogSync

And we have 4 new changesets in the DATABASECHANGELOG table:

But what are these strange “raw” IDs? And why is the author called “includeAll”? Because this is the easiest and fastest way to move your existing project to Liquibase! And these changesets were created automatically.

If you’d like to do some changes, e.g. in P_ADD_JOB_HISTORY, just add a changeset – as you’d normally do when creating a new database object:

Thenrun the Liquibase Update command:

Changeset looks better now, right? With a proper author, ID, etc.

In the examples above, I showed you the easy way to add existing objects (which could be created or replaced) without creating changesets manually. In my opinion, it’s the best way to install Liquibase if you have hundreds of objects in your existing database.

When it comes to objects which cannot be replaced, such as tables, we need to use a way described in the second scenario.

How to install Liquibase if you don’t have lots of objects in your existing project

This option requires you to create changesets for objects and changes that were already executed to your database.

Objects which you create or replace

Add objects and remember to have paths to folders in your master.xml file – just like described in the first scenario.

Run ChangelogSync and have Liquibase automatically create changesets raw / includeAll / filename.

Or, better way, create a changeset for every file like this:

That’s more work, sure, but you get better info in your logs:

Objects that cannot be created and/or replaced

What can you do with other types of objects like tables, indexes, etc.?

Once again, there are two ways:

  1. Don’t do anything with these objects but remember to always create changesets for every change in them, and add it to your changelog.sql file (alter table, drop column, etc.) – I described how to do it in a previous part of this tutorial.
  2. Create changesets and mark them as executed in the past.

Let’s have a closer look at the second way.

I have a few tables that were created before implementing Liquibase:

1

2

EMPLOYEES

JOBS

I create two changelog files in a new folder HR/scripts_before_liquibase.

1

2

changelog_ddl.sql

changelog_constraints.sql

Also, I create an additional scripts_before_liquibase.xml file which will point to our changelogs.

The priority of “include file” is very important, as it tells Liquibase in which order to run scripts – first create tables, then, create constraints and indexes.

It’s a good practice to have two files: one for creating tables, second for constraints. It will help you avoid conflicts when tryingto create ref_constraint in a table which is gonna be created a few seconds later.

Remember to add a path to the master.xmlfile to your newly createdXML file (HR/script_before_liquibase/scripts_before_liquibase.xml).

Now, create changesets for tables, constraints, etc.

OK, after we added all of our changesets, we will mark them as executed in the past.

Let’s run ChangelogSyncSQL to preview, and then ChangelogSync to run SQL against database.

And voila! All done!

Now, choose theway you prefer and implement database automation using Liquibase right now.

Liquibase tutorial: Summary

As you can see, by using Liquibase you can track everything during your database change release process.

However, all developers should stick to this workflow:

  • Always add your changesets to a changelog ( don’t change anything without Liquibase!) – changeset should be unique combining AUTHOR:ID(task) and filename (file with your changelog)
  • Verify the SQL you will execute ( always run updateSQL before update command).
  • Run database update command.
  • Verify that the changeset or changesets were executed (check your DB objects and DATABASECHANGELOG table)

Here we end the basic Liquibase tutorial. However, stay tuned for the next articles! Here’s what you can expect:

  • Liquibase and GIT: How can many developers work effectively and conflict-free?
  • Case study: How to use Liquibase without production access?
  • How to create automated rollbacks using Liquibase?
  • How to compare multiple database schemas using Liquibase?

Do you need database experts?

Pretius developers know how to use Liquibase to great effect. We have a great deal of experience with different industries and know a lot about designing system architecture. Do you need software experts? Drop us a line at hello@pretius.com (or use the contact form below). We’ll get back to you in 48 hours and tell you what we can do for your company.

FAQs

How do you use Liquibase for deployment? ›

With deployment automation, Liquibase enables database CI and simplifies the process of reworking database changes. With Liquibase, developers can treat database code just like application code and check an updated version of the database change into source code control.

How do you write a Liquibase script? ›

Liquibase tutorial: Summary

Always add your changesets to a changelog ( don't change anything without Liquibase!) – changeset should be unique combining AUTHOR:ID(task) and filename (file with your changelog) Verify the SQL you will execute ( always run updateSQL before update command). Run database update command.

How do I run a Liquibase script in spring boot? ›

Running Liquibase with Spring Boot and the Maven project
  1. Open the existing Spring Boot application. properties file. To find the file, navigate to src/main/resources/application. properties .
  2. Add the following properties to run Liquibase migrations. Update the values depending on your database requirements:

What is Databasechangelog? ›

Liquibase Concepts

Simply put – a changelog contains an ordered list of changesets, and a changeset contains a change. You and your team can specify database changes in one of four different changelog formats: SQL, XML, JSON, or YAML. And, you can even mix and match different types of changelogs, if desired.

How do you deploy a database? ›

Deploy your database
  1. On the machine where your website database is restored, open your SQL Server Management Studio.
  2. Locate your database, right click on it, and select Tasks » Deploy Database to Microsoft Azure SQL Database.
  3. On the next screen, click Next.

How do I deploy a DB script using Jenkins? ›

Besides, you need dbForge DevOps Automation PowerShell for SQL Server — get it from the PowerShell Gallery and install.
  1. Install the Plugin. ...
  2. Create a new SQL CI job. ...
  3. Configure the CI job. ...
  4. Build the database package. ...
  5. Test the database using tSQLt. ...
  6. Publish the database package. ...
  7. Run the project. ...
  8. Select the method.
12 Feb 2021

What is a Liquibase script? ›

Liquibase scripts are typically written in xml format (may be because xml is more readable), though other formats like json and yaml are also supported. Database changes are defined in change log files as small change sets which are uniquely identified by change set name and author.

Is Liquibase free to use? ›

Liquibase has 3 pricing editions. A free trial of Liquibase is also available. Look at different pricing editions below and see what edition and features meet your budget and needs.

How do I run Liquibase from Maven? ›

Create the Maven POM file for the project.
...
  1. Open the command prompt and navigate to the MavenPostgreSQL directory.
  2. Run the following command: mvn liquibase:update.
  3. From a database UI Tool, for example: “pgAdmin” check your database changes under “MYDATABASE”. You should see a new “department” table added to the database.

Can Liquibase migrate data? ›

Liquibase offers a powerful open source database migration tool for Java apps. It brings structure and confidence to developers and DBAs that need to easily create and track database schema changes.

How do I run a Liquibase changelog file? ›

This command applies any changes in your changelog that have not been run to your database.
...
To run your first update:
  1. Open a command-line or Terminal app.
  2. Navigate to your ... examples/sql directory or ... examples/xml directory .
  3. In your command prompt run liquibase update .

Does Liquibase need Java? ›

If you install Liquibase manually, you must also install Java, which is available from Adoptium. If you use the Liquibase Installer, this version of Java is used during installation.

Why do we use Liquibase? ›

Liquibase allows you to specify the database change you want using SQL or several different database-agnostic formats, including XML, YAML, and JSON. Developers can abstract the database code to make it extremely easy to push out changes to different database types.

Does Liquibase create tables? ›

To create a table for your database, follow these steps: Step 1: Add the createTable Change Type to your changeset with the needed attributes as it is shown in the examples. Step 2: Deploy your changeset by running the update command. Now, you should see a new table.

What is the simplest way to deploy a database? ›

The easiest way to deploy your database - The Future of Qovery - Week #7
  1. Database usage repartition on Qovery.
  2. Create a database with Qovery.
  3. Database settings.
  4. Database metrics.
  5. Install your add-ons.
  6. Database backup.
  7. View the link between your databases and your app.

How do I deploy a SQL database project? ›

You can configure Web Deploy to run the SQL deployment script that the database project generates, but in order to do this, you need to create a custom WPP targets file for your web application project. This adds a substantial amount of complexity to the deployment process.

How do I deploy a database to a remote server? ›

How to deploy your SQL Server database to a remote server
  1. Backup the database on the source.
  2. Copy the backup file to the target machine.
  3. Restore the database on the target.
  4. Create logins and set permissions as needed.
11 Nov 2016

Can Jenkins run SQL scripts? ›

This plugin enables you run Oracle SQL*Plus scripts on your Jenkins jobs (user defined scripts or a script inside a workspace).

Can Jenkins be used for deployment? ›

Jenkins is an all-purpose automation tool that was designed for Continuous Integration. It can run scripts, which means it can do anything you can script, including deployment.

Can we deploy code using Jenkins? ›

Practical Guide to Jenkins

Step 1 − Go to Manage Jenkins → Manage Plugins. Go to the Available section and find the plugin “Deploy to container Plugin” and install the plugin. Restart the Jenkins server. This plugin takes a war/ear file and deploys that to a running remote application server at the end of a build.

Is Liquibase an ORM? ›

Hibernate and Liquibase are primarily classified as "Object Relational Mapper (ORM)" and "Database" tools respectively.

What companies use Liquibase? ›

Companies Currently Using Liquibase
Company NameWebsiteSub Level Industry
National Gridnationalgrid.comElectricity, Oil & Gas
The Walt Disney Companythewaltdisneycompany.comLodging & Resorts
The MathWorks Inc.mathworks.comSoftware Manufacturers
Oracleoracle.comSoftware Development & Technical Consulting
2 more rows

How do I validate a Liquibase script? ›

Use the validate command to ensure:
  1. The XML, YAML, JSON, or formatted SQL is structured correctly.
  2. Referenced files can be found.
  3. Any required or prohibited attributes are correct to your database.
  4. There are no duplicated id , author , and file combinations.
  5. There are no checksum errors.

Does Liquibase require license? ›

How is Liquibase licensed? Liquibase Open Source (Community Edition) is released under the Apache 2.0 license. The main Liquibase jar file also contains a commercially licensed Liquibase Pro code that is only active when a license key is entered. Liquibase Enterprise is commercially licensed.

Does Liquibase have UI? ›

Currently it does not have a graphic interface, and that is exactly what we are working on right now.

Is Liquibase open source? ›

Track, version, and deploy database changes. Liquibase Community is an open source project that helps millions of developers rapidly manage database schema changes.

What databases does Liquibase support? ›

Supported databases
DatabaseType Name
Amazon Auroramysql, postgresql
Amazon RDSmariadb, mysql, mssql, oracle, postgresql
Amazon Redshift
Azure SQLmssql
31 more rows

How do you make a trigger on Liquibase? ›

To create a trigger in your database, follow these steps: Step 1: Add the createTrigger Change Type to your changeset with the needed attributes as it is shown in the examples. Step 2: Deploy your changeset by running the update command. Now, you should see that the trigger you've specified is added.

How do you set a schema in Liquibase? ›

You can specify the schema in the changeset using schemaName attribute. So you don't need to write it programaticaly. Here you can review official documentation for every refactor/changeset you can do. Take a while and see how you can specify what schema is the target for every refactor.

How do you use Liquibase in Jenkins pipeline? ›

How to Integrate Liquibase With Jenkins - YouTube

How does Jenkins integrate with Liquibase? ›

To install the Liquibase Runner plugin in Jenkins, navigate to Manage Jenkins > Manage Plugins. Select the Available tab. After the plugin list has loaded, search for “Liquibase”. Select the checkbox next to “Liquibase Runner” and either choose “Install without restart” or “Download now and install after restart”.

Why do we use Liquibase? ›

Liquibase allows you to specify the database change you want using SQL or several different database-agnostic formats, including XML, YAML, and JSON. Developers can abstract the database code to make it extremely easy to push out changes to different database types.

How does GitLab integrate with Liquibase? ›

You can set up Liquibase without a local installation or remote host by using GitLab CI/CD.
...
Using GitLab CI/CD for Liquibase
  1. Liquibase Command Line Interface (CLI)
  2. Liquibase Maven commands with a Springboot app.
  3. Liquibase Gradle commands.
  4. Liquibase running in Docker.
  5. Liquibase running in a NodeJS wrapper.

What is Liquibase in Devops? ›

Liquibase automates the database change process so your developers can code at full speed, collaborate freely with the whole team, and deliver continuously with confidence. CI/CD for the Database.

Which is better flyway or Liquibase? ›

While both tools are based on Martin Fowler's Evolutionary Database, there are many differences in what these tools offer. Here's where Liquibase and Flyway differ. The bottom line is that Liquibase is more powerful and flexible — covering more database change and deployment use cases than Flyway.

Is Liquibase open source? ›

Track, version, and deploy database changes. Liquibase Community is an open source project that helps millions of developers rapidly manage database schema changes.

What is changeset in Jenkins? ›

This is what the Jenkins docs say about the "changeset" directive: changeset. Execute the stage if the build's SCM changeset contains one or more files matching the given string or glob. Example: when { changeset "**/*.js" }

Is Liquibase an ORM? ›

Hibernate and Liquibase are primarily classified as "Object Relational Mapper (ORM)" and "Database" tools respectively.

What is a Liquibase script? ›

Liquibase scripts are typically written in xml format (may be because xml is more readable), though other formats like json and yaml are also supported. Database changes are defined in change log files as small change sets which are uniquely identified by change set name and author.

Can Liquibase migrate data? ›

Liquibase offers a powerful open source database migration tool for Java apps. It brings structure and confidence to developers and DBAs that need to easily create and track database schema changes.

You might also like

Latest Posts

Article information

Author: Gregorio Kreiger

Last Updated: 10/20/2022

Views: 5299

Rating: 4.7 / 5 (77 voted)

Reviews: 84% of readers found this page helpful

Author information

Name: Gregorio Kreiger

Birthday: 1994-12-18

Address: 89212 Tracey Ramp, Sunside, MT 08453-0951

Phone: +9014805370218

Job: Customer Designer

Hobby: Mountain biking, Orienteering, Hiking, Sewing, Backpacking, Mushroom hunting, Backpacking

Introduction: My name is Gregorio Kreiger, I am a tender, brainy, enthusiastic, combative, agreeable, gentle, gentle person who loves writing and wants to share my knowledge and understanding with you.