Learning Notes of GitHub Actions
Tags: notes, github, actions, ci
Published: 2020-05-29 02:43:01

## Brief Intro.
GitHub Actions is the pipelines of CI/CD workflows on GitHub. You can create more than one workflow in a repository. You must store workflows in the .github/workflows directory in the root of your repository.

Workflows must have at least one job, and jobs contain a set of steps that perform individual tasks. Steps can run commands or use an action. You can create your own actions or use actions shared by the GitHub community and customzie them as needed.
*(Workflows > Jobs > Steps)*

## The Basic
1) Creating a workflow file in the root of the repository (~/.github/workflows)
``` bash
mkdir .github
cd .github
mkdir workflows
```

2) In .github/workflows, add a .yml or .yaml file for the workflow. For example, .github/workflows/continuous-integration-workflow.yml
``` bash
touch ~/.github/workflows/continuous-integration-workflow.yml
```

3) Use the "[Workflow syntax for GitHub Actions](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions)" reference documentation to choose events to trigger an action, add actions, and customize your workflow.

4) Commit your changes in the workflow file to the branch where you want your workflow to run.

## Sample 1
``` yaml
name: Greet Everyone
# This workflow is triggered when changes are pushed to any branch in the repository.
on: [push]

# Trigger on schedule
#on:
#  schedule:
#    - cron:  '0 * * * *'

# Trigger on push with filtering for specific branches, tags, and paths
#on:
#  push:
#    branches:
#      - master
#    tags:
#      - v1
#    # file paths to consider in the event. Optional; defaults to all.
#    paths:
#      - 'test/*'

jobs:
  build:
    # Job name is Greeting
    name: Greeting
    # This job runs on Linux
    runs-on: ubuntu-latest
    steps:
      # Clone the repository
      - name: Clone the repository
        uses: actions/checkout@v2
      # This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action
      - name: Hello world
        uses: actions/hello-world-javascript-action@v1
        with:
          who-to-greet: 'Mona the Octocat'
        id: hello
      # This step prints an output (time) from the previous step's action.
      - name: Echo the greeting's time
        run: echo 'The time was ${{ steps.hello.outputs.time }}.'
```

## Sample 2
``` yaml
name: CI Workflow Sample 2
on:
  push:
    branches:
      - master
jobs:
  build:
    name: Build from source
    runs-on: ubuntu-latest
    steps:
      - name: Clone source from repository
        uses: actions/checkout@v2
        with:
          ref: 'master'
      - name: Prepare build environment
        uses: actions/setup-node@v1
        with:
          node-version: '10.x'
      - name: Build for production
        run: cd Sources && npm install && gulp build --env prod
      - name: Show current directory
        run: pwd
      - name: Create archive for production build
        run: 'cd Sources && tar -cvf Release.zip build/prod'
```

## Sample 3
``` yaml
name: ci -> cd
on:
  push:
    branches:
      - master
jobs:
  build:
    name: Build from source
    runs-on: ubuntu-latest
    steps:
      - name: Clone source from repository
        uses: actions/checkout@v2
        with:
          ref: 'master'
      - name: Prepare build environment
        uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - name: Build for production
        run: |
          npm install
          npm run build
      - name: Generate artifacts for release
        run: |
          mkdir Release
          cp -r dist/* Release
          cp -r public/* Release
      - uses: actions/upload-artifact@v1
        with:
          name: Release
          path: Release
  deploy:
    needs: build #this job depends on build job (run after when the build job completed)
    name: Deploy artifacts to ftp
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v1
        with:
          name: Release
      - name: Upload to ftp
        uses: sebastianpopp/ftp-action@releases/v2
        with:
          host: ${{ secrets.FTP_SERVER }}
          user: ${{ secrets.FTP_USERNAME }}
          password: ${{ secrets.FTP_PASSWORD }}
          localDir: "Release"
          remoteDir: "demo.ssmak.xyz"
```