The Cookbook with Bash
Tags: news, feature, infrastructure, community
Published: 2020-12-21 02:19:51

---
title: "The Cookbook with Bash"
created_at: Monday 21 Dec 2020 15:00:00 EDT
author: Montana Mendy
layout: post
permalink: 2020-12-21-bash
category: news
excerpt_separator: <!-- more --> 
tags:
  - news
  - feature
  - infrastructure
  - community
---

![Bash](https://dev-to-uploads.s3.amazonaws.com/i/rflfkyq63m1i3iiyvbww.png)

Many projects on GitHub use Travis to automatically execute certain scripts on every build. Among these many scripts, there is one that's definitely the most well known, it's called Bash. Automate your shell commands, add `env vars`, and increase your workflow, plus the endless of other things you can do with Bash given it's flexibility. At the crux -- Bash on more occasions than not are crucial to Travis CI builds. 

<!-- more -->

# Getting started with Bash (gh-pages example)

Some goals you may have if you're wanting to automate processes in Bash are automating `GH_REF` value in gpages_build.sh script with the `TRAVIS_REPO_SLUG`.

In order to make the `GH_REF` variable automatic and not have to use process load everytime, Travis CI gives us the `TRAVIS_REPO_SLUG` which you may have seen in languages like React. The SLUG variable, which is basically the username/repo for whatever GitHub repo you're working on. You write it out like this: `GH_REF="github.com/${TRAVIS_REPO_SLUG}"`

Below is an example script of just what I've explained above, we can assume this Bash script is entitled `pages.sh`: 

```bash
# This script pushes a demo-friendly version of your element and its
# dependencies to gh-pages.

# usage gp Polymer core-item [branch]
# Run in a clean directory passing in a GitHub org and repo name

#!/bin/bash

GH_REF="github.com/${TRAVIS_REPO_SLUG}"

org=`echo ${TRAVIS_REPO_SLUG} | cut -f 1 -d /`
repo=`echo ${TRAVIS_REPO_SLUG} | cut -f 2 -d /`

name="Montana"
email="montana@travis-ci.org"
branch=${3:-"master"} # default to master, when branch isn't specified

mkdir temp && cd temp # make temp dir 

# make folder (same as input, no checking!)
mkdir $repo
git clone "https://${GH_TOKEN}@${GH_REF}" --single-branch # you can theoretically as Montana likes to do, 'git stash pop' here

# switch to gh-pages branch
pushd $repo >/dev/null
git checkout --orphan gh-pages

# remove all content
git rm -rf -q .

# use bower to install runtime deployment
bower cache clean $repo # ensure we're getting the latest from the desired branch.
git show ${branch}:bower.json > bower.json
echo "{
  \"directory\": \"components\"
}
" > .bowerrc
bower install
bower install $org/$repo#$branch
git checkout ${branch} -- demo
rm -rf components/$repo/demo
mv demo components/$repo/

# redirect by default to the component folder
echo "<META http-equiv="refresh" content=\"0;URL=components/$repo/\">" >index.html

git config user.name $name
git config user.email $email

# send it all to github
git add -A .
git commit -am 'Deploy to GitHub Pages'
git push --force --quiet -u "https://${GH_TOKEN}@${GH_REF}" gh-pages > /dev/null 2>&1

popd >/dev/null
```

## Implementing this in your `.travis.yml`

So below is a `travis.yml` file I've created, and let's say you named your script `pages.sh`, your .`travis.yml` file would look something like this: 

```yaml
language: bash

sudo: required

script:
    - chmod u+x bash pages.sh
```

There you have it, you have now successfully used Bash in Travis CI. You can do something a little easier as well - just to test if you have the steps down, maybe make a Bash program just called `test.sh` and have it read: 

```bash
#!/bin/bash

echo "Hello Travis"
```
Then have your `.travis.yml` file read the following: 

```yaml

language: bash

script: chmod u+x test.sh
```
You should then see when running the build, Travis printing out `Hello Travis`. You now know you're using Bash successfully within Travis CI.