DEV Community

Steve Mak
Steve Mak

Posted on • Edited on

Learning Notes of GitHub Actions

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)

mkdir .github cd .github mkdir workflows 
Enter fullscreen mode Exit fullscreen mode

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

touch ~/.github/workflows/continuous-integration-workflow.yml 
Enter fullscreen mode Exit fullscreen mode

3) Use the "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

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 }}.' 
Enter fullscreen mode Exit fullscreen mode

Sample 2

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' 
Enter fullscreen mode Exit fullscreen mode

Sample 3

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" 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)