Macam-macam kondisional pada github workflows
Kondisional pada GitHub Workflow
Kondisional-kondisional yang ada di Github Workflow. Kondisional ini berguna untuk memicu job step dengan kasus-kasus tertentu. source Misalnya:
Menjalankan command apabila repository di push dengan commit yang memiliki substring tertentu (match substring from github commit messages)
jobs:
build:
name: Nama Workflow
runs-on: ubuntu-latest
steps:
- run: echo "git commit contains hello" # run this command if commit contains hello
if: contains(github.event.head_commit.message, 'hello')
- run: echo "git commit any"
selain contains
untuk mencari sebuah substring pada string. Adapun fungsi'' lain seperti:
startsWith
untuk memeriksa apakah string memiliki awalan tertentu (penggunaannya sama seperti contoh kode diatas)endsWith
untuk memeriksa apakah string memiliki akhiran tertentu (penggunaannya sama seperti contoh kode diatas)
Melanjutkan steps meskipun command gagal (continue on error)
jobs:
build:
name: Nama Workflow
runs-on: ubuntu-latest
steps:
- run: this_command_is_not_found xxxxx # ini akan membuat workflow berhenti
continue-on-error: true # namun dengan ini tidak akan membuat workflow berhenti
id: custom-id # membuat id khusus (opsional)
- run: echo "git commit any"
Mengitung jumlah file yang termodifikasi
Menghitung berapa jumlah file yang termodifikasi (uncommited files) pada github. Lalu bagaimana cara mengintegrasikannya kedalam github CI? berikut ulasannya:
perintah dasar menggunakan git diff
sebagai berikut:
git diff --cached --numstat | wc -l
Github CI - Mengitung jumlah file yang termodifikasi langsung di dalam run
Contoh konfigurasi github CI langsung di dalam run
jobs:
build:
name: Mengitung jumlah file yang termodifikasi ke dalam output steps
runs-on: ubuntu-latest
steps:
- shell: bash
run: |
cached=$(git diff --cached --numstat | wc -l)
echo "jumlah file yang termodifikasi adalah ${cached}"
Github CI - Mengitung jumlah file yang termodifikasi ke dalam output steps
Contoh konfigurasi github CI ke dalam output steps
jobs:
build:
name: Mengitung jumlah file yang termodifikasi ke dalam output steps
runs-on: ubuntu-latest
steps:
- shell: bash
run: |
echo "cached=$(git diff --cached --numstat | wc -l)" >> $GITHUB_OUTPUT
name: what changes
id: changes
- shell: bash
run: |
echo "jumlah file yang termodifikasi adalah ${{ steps.changes.outputs.cached }}"
Menghitung jumlah commits yang belum dipush
Untuk mengihitung jumlah commit yang belum dipush, dapat menggunakan perintah dasar git diff
juga. Contohnya sebagai berikut:
git diff origin/master..HEAD --numstat | wc -l
Untuk penggunaan dalam Github Actions (CI) contohnya sebagai berikut:
git diff origin/${GITHUB_REF#refs/heads/}..HEAD --numstat | wc -l
GITHUB_REF#refs/heads/
berguna untuk mendapatkan branch yang saat ini dijalankan.
Snippet lainnya sebagai berikut
Get current SHA short hash
bash
echo $GITHUB_SHA | cut -c 1-6
Github CI Yaml output env
echo "GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c 1-6)" >> $GITHUB_ENV
Github CI Yaml output steps
echo "GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c 1-6)" >> $GITHUB_OUTPUT
Tentang artikel ini
Artikel ini untuk mempermudah visitor untuk memahami github workflow.
Contoh FULL Github CI
name: Build Beta
on:
push:
branches: ['beta']
paths-ignore:
- '**/dist/**'
- '**/release/**'
- 'packages/google-news-sitemap'
- 'packages/hexo-post-parser'
- 'packages/git-command-helper'
- 'packages/safelinkify'
- 'packages/hexo-blogger-xml'
- '**/test/**'
pull_request:
types:
- closed
workflow_dispatch:
# run single job
concurrency:
group: build
cancel-in-progress: true
jobs:
build:
strategy:
fail-fast: true
env:
NODE_OPTIONS: '--max-old-space-size=8192'
YARN_ENABLE_IMMUTABLE_INSTALLS: false
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
repository: dimaslanjaka/static-blog-generator
ref: beta
token: ${{ secrets.ACCESS_TOKEN }}
submodules: 'recursive'
#- run: sh scripts/install-submodules.sh
#name: clone submodules
- name: Set EOL git configs
continue-on-error: true
run: |
git config core.eol lf
git config core.autocrlf input
git checkout-index --force --all
- uses: actions/setup-node@v3
with:
node-version: 18.x
token: ${{ secrets.GITHUB_TOKEN }}
architecture: x64
#cache: 'yarn'
#cache-dependency-path: '**/yarn.lock'
- name: Enable corepack
run: |
corepack enable
corepack prepare yarn@3.2.0 --activate
- name: Set env
id: set-env
shell: bash
run: |
echo "GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c 1-6)" >> $GITHUB_ENV
echo "GITHUB_BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
echo "GITHUB_COMMIT_URL=https://github.com/${{github.repository}}/commit/$(echo $GITHUB_SHA)" >> $GITHUB_ENV
echo "GITHUB_RUNNER_URL=https://github.com/${{github.repository}}/commit/${{github.sha}}/checks/${{github.run_id}}" >> $GITHUB_ENV
echo "CACHE_NPM=$(npm config get cache)" >> $GITHUB_ENV
echo "CACHE_YARN2=$(yarn config get cacheFolder || echo \".yarn\")" >> $GITHUB_ENV
echo "cache-npm=$(npm config get cache)" >> $GITHUB_OUTPUT
echo "cache-yarn2=$(yarn config get cacheFolder || echo \".yarn\")" >> $GITHUB_OUTPUT
#echo "cache-yarn=$(yarn cache dir || echo \".yarn\")" >> $GITHUB_OUTPUT
#echo "CACHE_YARN=$(yarn cache dir || echo \".yarn\")" >> $GITHUB_ENV
- name: Get env
shell: bash
run: |
echo "branch : ${{ env.GITHUB_BRANCH }}"
echo "commit msg : ${{ github.event.head_commit.message }}"
echo "commit hash : ${{ env.GITHUB_SHA_SHORT }}"
echo "commit url : ${{ env.GITHUB_COMMIT_URL }}"
echo "runner url : ${{ env.GITHUB_RUNNER_URL }}"
echo "cache npm : ${{ env.CACHE_NPM }}"
echo "cache yarn2 : ${{ env.CACHE_YARN2 }}"
#echo "cache yarn : ${{ env.CACHE_YARN }}"
- uses: actions/cache@v3 # pat-s/always-upload-cache@v3.0.11
id: cache
name: get caches
with:
path: |
${{ steps.set-env.outputs.cache-npm }}
${{ steps.set-env.outputs.cache-yarn2 }}
#${{ steps.set-env.outputs.cache-yarn }}
#./packages/sbg-server/src/public
#**/tmp/**
#**/node_modules/**
#**/.yarn
key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}
${{ runner.os }}-
- name: Install Global Packages
run: npm i -g typescript ts-node gulp-cli hexo-cli webpack-cli npm-run-all depcheck lerna husky
- run: yarn install
- run: |
arr_variable=("sbg-api" "sbg-server" "sbg-utility" "sbg-cli" "static-blog-generator" "instant-indexing")
for i in "${arr_variable[@]}"
do
yarn workspace $i build && yarn workspace $i run pack
done
shell: bash
name: build
- run: npx sbg clean all
working-directory: test
name: test clean
- run: npx sbg post standalone
working-directory: test
name: test post standalone
- run: npx sbg post copy
working-directory: test
name: test post copy
- run: npx hexo generate
working-directory: test
name: test generate site with hexo
- run: npx sbg generate feed
working-directory: test
name: test generate feed
- run: npx sbg generate sitemap
working-directory: test
name: test generate sitemap
- run: npx sbg deploy copy
working-directory: test
name: test copy generated site to deployment directory
- run: |
git status
echo "cached=$(git diff --cached --numstat | wc -l)" >> $GITHUB_OUTPUT
echo "commits=$(git diff origin/master..HEAD --numstat | wc -l)" >> $GITHUB_OUTPUT
name: what changes
id: changes
- name: commit and push
if: steps.changes.outputs.cached > 0 || steps.changes.outputs.commits > 0
shell: bash
run: |
git config --global user.email "dimaslanjaka@gmail.com"
git config --global user.name "dimaslanjaka"
arr_variable=("sbg-api" "sbg-server" "sbg-utility" "sbg-cli" "static-blog-generator" "instant-indexing")
for i in "${arr_variable[@]}"
do
git add "packages/${i}/dist" &> /dev/null
git add "packages/${i}/release" &> /dev/null
git commit -m "chore: build ${i} from ${{ env.GITHUB_COMMIT_URL }} runner ${{ env.GITHUB_RUNNER_URL }}" &> /dev/null
done
# git submodule foreach "git add dist release"
# git push --recurse-submodules=on-demand
git push &> /dev/null