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
yamlname: 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