Automation of Perl6 development workflow through the Tomtit task runner
Tags: perl6, cli, taskrunner, tomtit
Published: 2018-12-19 20:22:48

---
title: Automation of Perl6 development workflow through the Tomtit task runner
published: true
description: How to automate typical tasks when developing Perl6 applications
tags: perl6, cli,task runner, tomtit
---


_There is one Tomtit to make it!_


---

![tomtit cli](https://thepracticaldev.s3.amazonaws.com/i/hz2t22yyvuqrsbm9wkia.png)


[Tomtit](https://github.com/melezhik/tomtit/) is a brand new Perl6 task runner allow you to automate routine tasks easily.


In this post I am going to show how to use Tomtit to automate typical tasks happening during developing of Perl6 applications.

To get a glimpse of what Tomtit is - please read this [post](https://dev.to/melezhik/one-tomtit-for-it--1j3f). 


# Gettings stared

Let's install Tomtit first.

`zef install Tomtit`

Now let's check an application source code from remote git repository:

`git clone $git-repo`


# 4 cases

Let's limit the post to 4 typical cases often happening when developing and releasing Perl6 application:


* set up git repository 
* test local source code
* install local source code
* release CPAN module

# Tomtit scenarios 

Now we to define tomtit scenarios for every mentioned case. We place scenarios inside `.tom` directory, these are plain Perl6 scripts calling Tomtit API.



Case 1. Set up git repository.

When start on new machine I always have to set my user/email so I can push to remote. I also want git keep password cache for me. It's tedious to it manually every time, so let's automate this:



.tom/set-get.pl6:


```perl
task-run "set git", "git-base", %(
  email                => 'melezhik@gmail.com',
  name                 => 'Alexey Melezhik',
  config_scope         => 'local',
  set_credential_cache => 'on'
);

```

My workflow makes it a bit complicated because I push source code both to GitHub and BitBucket repositories.

It's easy to create scenarios for push operations:


.tom/push-gh.pl6:


```perl
# push to github
bash "git push origin master";
```

.tom/push-bb.pl6:


```perl
# push to bitbucket
bash "git push bb master";
```

.tom/push.pl6:



```perl
# push to both
EVALFILE ".tom/push-bb.pl6"
EVALFILE ".tom/push-gh.pl6"

```


Case 2. Test local source code.

For many Perl6 projects it's just as `zef test` to run unit tests inside `t/` directory , but I also have Outthentic tests. I also like to validate my META6.json file to see if I have any JSON-related  errors in it:


.tom/test.pl6:


```perl
task-run "check json files", "json-lint", %( path =>  "{$*CWD}" );
bash "zef test .";
bash "sh run-test.sh";
```

Case 3. Install source code.

It's just `zef install` command for current working directory.

.tom/install.pl6:


```perl
bash "zef install . --force-install";
```


Case 4. Release CPAN module

I use [App::Mi6](https://modules.perl6.org/dist/App::Mi6:cpan:SKAJI) tool to release my Perl6 modules to CPAN, it requires credentials set through `~/.pause`, it seems handy to define a dedicated scenario for this:


.tom/set-pause.pl6:


```perl
my $password = prompt("enter your CPAN password: ");

template-create "/home/{%*ENV<USER>}/.pause", %(
  mode => '700',
  variables => %(
    user      => 'melezhik',
    password  => $password
  ),
  source => q:to /TEMPL/
  user      [%= user %]
  password  [%= password %]
  TEMPL
);
``` 

The release scenarios is a simple as:

.tom/release.pl6:


```perl
zef "App::Mi6";
bash "mi6 release";

```


# Workflow

As I have my tomtit [scenarios](https://github.com/melezhik/tomtit/tree/master/.tom) get ready, my development workflow is dead simple and clear, when everything is in place:


Checkout an application source code:

`git clone $git-repo`

Install Tomtit:

`zef install Tomtit`


List available tomtits scenarios:

`tom --list`

Modifying source code

`nano foo/bar/app.pl6`


Run tests:

`tom test`


Install:

`tom install`


Setup git repo:

`tom git-setup`


 
Commit changes


`git commit -a`


Push changes:


`tom push`


Setup PAUSE account credentials:


`tom set-pause`

Release to CPAN:


`tom release`



# Conclusion


That's it. In this post we've seen how to automate some typical routine operations happening when developing Perl6 applications.

There is one Tomtit to make it!

---

Thanks for reading