diff --git a/.github/workflows/javascript.yml b/.github/workflows/javascript--ci.yml similarity index 91% rename from .github/workflows/javascript.yml rename to .github/workflows/javascript--ci.yml index acdafd40..645f9a74 100644 --- a/.github/workflows/javascript.yml +++ b/.github/workflows/javascript--ci.yml @@ -1,14 +1,14 @@ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs -name: JavaScript +name: JavaScript - CI on: push: branches: - master paths: - - .github/workflows/javascript.yml + - .github/workflows/javascript--ci.yml - .node-version - javascript/package.json - javascript/pnpm-lock.yaml @@ -16,7 +16,7 @@ on: - javascript/**/*.js pull_request: paths: - - .github/workflows/javascript.yml + - .github/workflows/javascript--ci.yml - .node-version - javascript/package.json - javascript/pnpm-lock.yaml @@ -40,7 +40,7 @@ jobs: with: filters: | javascript: - - .github/workflows/javascript.yml + - .github/workflows/javascript--ci.yml - .node-version - javascript/package.json - javascript/pnpm-lock.yaml diff --git a/.github/workflows/javascript--daily-dependencies-update.yml b/.github/workflows/javascript--daily-dependencies-update.yml new file mode 100644 index 00000000..b98e6b02 --- /dev/null +++ b/.github/workflows/javascript--daily-dependencies-update.yml @@ -0,0 +1,109 @@ +# This workflow updates pnpm package dependencies every day in every +# application that contains JavaScript (including Ruby on Rails applications +# with a package.json) and opens a pull request when any dependency changes +# are detected. + +name: JavaScript - Daily Dependencies Update + +on: + schedule: + # 0:00 JST every day + - cron: "0 15 * * *" + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + update: + timeout-minutes: 30 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .node-version + - name: Install pnpm + run: corepack enable && corepack prepare pnpm@latest --activate + - name: Update pnpm Package Dependencies in javascript + working-directory: ./javascript + run: pnpm update + - name: Update pnpm Package Dependencies in typescript + working-directory: ./typescript + run: pnpm update + - name: Update pnpm Package Dependencies in reactjs + working-directory: ./reactjs + run: pnpm update + - name: Update pnpm Package Dependencies in ruby-on-rails/perfect-ruby-on-rails + working-directory: ./ruby-on-rails/perfect-ruby-on-rails + run: pnpm update + - name: Generate Pull Request Description + env: + BODY_PATH: ${{ runner.temp }}/pr_body.md + run: | + package_rows() { + git diff --unified=0 -- "$1/pnpm-lock.yaml" \ + | grep -E "^[+-] '?[^ ]+@[0-9]" \ + | grep -v '(' \ + | sed -E "s/^(.) /\1 /; s/'//g; s/:$//" \ + | awk '{ i = match($2, /@[^@]*$/); print $1, substr($2, 1, i - 1), substr($2, i + 1) }' \ + | awk '{ if ($1 == "-") before[$2] = $3; else after[$2] = $3 } + END { + for (name in after) { + if (name in before) { + if (before[name] != after[name]) print "|" name " |" before[name] " |" after[name] " |Updated |" + delete before[name] + } else { + print "|" name " |- |" after[name] " |Added |" + } + } + for (name in before) print "|" name " |" before[name] " |- |Removed |" + }' \ + | sort + } + { + cat <<'OVERVIEW' + ## 1. Overview + + This pull request was created automatically by the JavaScript - Daily Dependencies Update workflow. + It updates every pnpm package dependency to the latest version allowed by each package.json and regenerates each pnpm-lock.yaml: + + ~~~console + pnpm update + ~~~ + + ## 2. Key Changes & Differences + OVERVIEW + for app in javascript typescript reactjs ruby-on-rails/perfect-ruby-on-rails; do + echo + echo "### $app" + echo + echo "|Packages |Before |After |Changes & Differences |" + echo "|:-|:-|:-|:-|" + ROWS=$(package_rows "$app") + if [ -z "$ROWS" ]; then ROWS='| | | |No dependency changes detected |'; fi + echo "$ROWS" + done + cat < "$BODY_PATH" + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + with: + branch: daily/javascript-dependency-updates + delete-branch: true + commit-message: "[Daily][JavaScript] Update pnpm Package Dependencies" + title: "[Daily][JavaScript] Update pnpm Package Dependencies" + body-path: ${{ runner.temp }}/pr_body.md diff --git a/.github/workflows/python.yml b/.github/workflows/python--ci.yml similarity index 94% rename from .github/workflows/python.yml rename to .github/workflows/python--ci.yml index 968a5563..13f54ce5 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python--ci.yml @@ -1,7 +1,7 @@ # This workflow will install Python dependencies, run tests and lint with a single version of Python # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python -name: Python +name: Python - CI on: push: @@ -9,7 +9,7 @@ on: - master paths: - .github/actions/setup-python/action.yml - - .github/workflows/python.yml + - .github/workflows/python--ci.yml - .python-version - requirements.txt - requirements.lock @@ -18,7 +18,7 @@ on: pull_request: paths: - .github/actions/setup-python/action.yml - - .github/workflows/python.yml + - .github/workflows/python--ci.yml - .python-version - requirements.txt - requirements.lock @@ -43,7 +43,7 @@ jobs: filters: | python: - .github/actions/setup-python/action.yml - - .github/workflows/python.yml + - .github/workflows/python--ci.yml - .python-version - requirements.txt - requirements.lock diff --git a/.github/workflows/python--daily-dependencies-update.yml b/.github/workflows/python--daily-dependencies-update.yml new file mode 100644 index 00000000..eaab0a74 --- /dev/null +++ b/.github/workflows/python--daily-dependencies-update.yml @@ -0,0 +1,88 @@ +# This workflow updates pip library dependencies every day and opens a pull +# request when any dependency changes are detected. + +name: Python - Daily Dependencies Update + +on: + schedule: + # 0:00 JST every day + - cron: "0 15 * * *" + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + update: + timeout-minutes: 30 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version-file: .python-version + - name: Update pip Library Dependencies + working-directory: ./python + run: | + pip install --upgrade pip + pip install -r requirements.txt --upgrade + pip freeze > requirements.lock + - name: Generate Pull Request Description + env: + BODY_PATH: ${{ runner.temp }}/pr_body.md + run: | + ROWS=$(git diff --unified=0 -- python/requirements.lock \ + | grep -E '^[+-][A-Za-z0-9]' \ + | sed -E 's/^(.)/\1 /; s/==/ /' \ + | awk '{ if ($1 == "-") before[$2] = $3; else after[$2] = $3 } + END { + for (name in after) { + if (name in before) { + if (before[name] != after[name]) print "|" name " |" before[name] " |" after[name] " |Updated |" + delete before[name] + } else { + print "|" name " |- |" after[name] " |Added |" + } + } + for (name in before) print "|" name " |" before[name] " |- |Removed |" + }' \ + | sort) + if [ -z "$ROWS" ]; then ROWS='| | | |No dependency changes detected |'; fi + cat > "$BODY_PATH" < requirements.lock + ~~~ + + ## 2. Key Changes & Differences + + |Libraries |Before |After |Changes & Differences | + |:-|:-|:-|:-| + $ROWS + + ## 3. Summary + + All pip library dependencies in python/requirements.lock are now up to date. + Please make sure that all CI workflows pass before merging this pull request. + + ## 4. References + + - [Python - Daily Dependencies Update workflow run](https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID) + - [pip install documentation](https://pip.pypa.io/en/stable/cli/pip_install/) + EOF + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + with: + branch: daily/python-dependency-updates + delete-branch: true + commit-message: "[Daily][Python] Update pip Library Dependencies" + title: "[Daily][Python] Update pip Library Dependencies" + body-path: ${{ runner.temp }}/pr_body.md diff --git a/.github/workflows/ruby-on-rails--daily-dependencies-update.yml b/.github/workflows/ruby-on-rails--daily-dependencies-update.yml new file mode 100644 index 00000000..f1a30366 --- /dev/null +++ b/.github/workflows/ruby-on-rails--daily-dependencies-update.yml @@ -0,0 +1,117 @@ +# This workflow updates gem dependencies and the RBS collection every day in +# every Ruby on Rails application and opens a pull request when any dependency +# changes are detected. + +name: Ruby on Rails - Daily Dependencies Update + +on: + schedule: + # 0:00 JST every day + - cron: "0 15 * * *" + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + update: + timeout-minutes: 30 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + - name: Update Gem Dependencies in ruby-on-rails/e-navigator + working-directory: ./ruby-on-rails/e-navigator + env: + BUNDLE_FROZEN: "false" + run: | + gem update --system + gem install bundler + bundle update --all + bundle exec rbs collection update + - name: Update Gem Dependencies in ruby-on-rails/perfect-ruby-on-rails + working-directory: ./ruby-on-rails/perfect-ruby-on-rails + env: + BUNDLE_FROZEN: "false" + run: | + bundle update --all + bundle exec rbs collection update + - name: Update Gem Dependencies in ruby-on-rails/restful-api + working-directory: ./ruby-on-rails/restful-api + env: + BUNDLE_FROZEN: "false" + run: | + bundle update --all + bundle exec rbs collection update + - name: Generate Pull Request Description + env: + BODY_PATH: ${{ runner.temp }}/pr_body.md + run: | + gem_rows() { + git diff --unified=0 -- "$1/Gemfile.lock" \ + | grep -E '^[+-] {4}[^ ]+ \([0-9]' \ + | sed -E 's/^(.) +/\1 /; s/[()]//g' \ + | awk '{ if ($1 == "-") before[$2] = $3; else after[$2] = $3 } + END { + for (name in after) { + if (name in before) { + if (before[name] != after[name]) print "|" name " |" before[name] " |" after[name] " |Updated |" + delete before[name] + } else { + print "|" name " |- |" after[name] " |Added |" + } + } + for (name in before) print "|" name " |" before[name] " |- |Removed |" + }' \ + | sort + } + { + cat <<'OVERVIEW' + ## 1. Overview + + This pull request was created automatically by the Ruby on Rails - Daily Dependencies Update workflow. + It upgrades RubyGems and Bundler, updates every gem to the latest version allowed by each Gemfile, and updates each RBS collection: + + ~~~console + gem update --system + gem install bundler + bundle update --all + bundle exec rbs collection update + ~~~ + + ## 2. Key Changes & Differences + OVERVIEW + for app in ruby-on-rails/e-navigator ruby-on-rails/perfect-ruby-on-rails ruby-on-rails/restful-api; do + echo + echo "### $app" + echo + echo "|Gems |Before |After |Changes & Differences |" + echo "|:-|:-|:-|:-|" + ROWS=$(gem_rows "$app") + if [ -z "$ROWS" ]; then ROWS='| | | |No dependency changes detected |'; fi + echo "$ROWS" + done + cat < "$BODY_PATH" + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + with: + branch: daily/ruby-on-rails-dependency-updates + delete-branch: true + commit-message: "[Daily][Ruby on Rails] Update Gem dependencies" + title: "[Daily][Ruby on Rails] Update Gem dependencies" + body-path: ${{ runner.temp }}/pr_body.md diff --git a/.github/workflows/ruby-on-rails--e-navigator.yml b/.github/workflows/ruby-on-rails--e-navigator--ci.yml similarity index 94% rename from .github/workflows/ruby-on-rails--e-navigator.yml rename to .github/workflows/ruby-on-rails--e-navigator--ci.yml index aafc88fc..d21f44c1 100644 --- a/.github/workflows/ruby-on-rails--e-navigator.yml +++ b/.github/workflows/ruby-on-rails--e-navigator--ci.yml @@ -5,7 +5,7 @@ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby -name: Ruby on Rails - e-Navigator +name: Ruby on Rails - e-Navigator - CI on: push: @@ -13,7 +13,7 @@ on: - master paths: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/e-navigator.yml + - .github/workflows/ruby-on-rails--e-navigator--ci.yml - .ruby-version - ruby-on-rails/e-navigator/.ruby-version - ruby-on-rails/e-navigator/Gemfile @@ -33,7 +33,7 @@ on: pull_request: paths: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/e-navigator.yml + - .github/workflows/ruby-on-rails--e-navigator--ci.yml - .ruby-version - ruby-on-rails/e-navigator/.ruby-version - ruby-on-rails/e-navigator/Gemfile @@ -71,7 +71,7 @@ jobs: filters: | ruby: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/e-navigator.yml + - .github/workflows/ruby-on-rails--e-navigator--ci.yml - .ruby-version - ruby-on-rails/e-navigator/.ruby-version - ruby-on-rails/e-navigator/Gemfile @@ -86,7 +86,7 @@ jobs: - ruby-on-rails/e-navigator/**/*.html.erb rubocop: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/e-navigator.yml + - .github/workflows/ruby-on-rails--e-navigator--ci.yml - .ruby-version - ruby-on-rails/e-navigator/.ruby-version - ruby-on-rails/e-navigator/Gemfile @@ -98,7 +98,7 @@ jobs: - ruby-on-rails/e-navigator/**/*.rake steep: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/e-navigator.yml + - .github/workflows/ruby-on-rails--e-navigator--ci.yml - .ruby-version - ruby-on-rails/e-navigator/.ruby-version - ruby-on-rails/e-navigator/Gemfile diff --git a/.github/workflows/ruby-on-rails--perfect-ruby-on-rails.yml b/.github/workflows/ruby-on-rails--perfect-ruby-on-rails--ci.yml similarity index 94% rename from .github/workflows/ruby-on-rails--perfect-ruby-on-rails.yml rename to .github/workflows/ruby-on-rails--perfect-ruby-on-rails--ci.yml index 3dd2da2b..8912192c 100644 --- a/.github/workflows/ruby-on-rails--perfect-ruby-on-rails.yml +++ b/.github/workflows/ruby-on-rails--perfect-ruby-on-rails--ci.yml @@ -5,7 +5,7 @@ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby -name: Ruby on Rails - Perfect Ruby on Rails +name: Ruby on Rails - Perfect Ruby on Rails - CI on: push: @@ -13,7 +13,7 @@ on: - master paths: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/perfect-ruby-on-rails.yml + - .github/workflows/ruby-on-rails--perfect-ruby-on-rails--ci.yml - .ruby-version - .node-version - ruby-on-rails/perfect-ruby-on-rails/.ruby-version @@ -36,7 +36,7 @@ on: pull_request: paths: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/perfect-ruby-on-rails.yml + - .github/workflows/ruby-on-rails--perfect-ruby-on-rails--ci.yml - .ruby-version - .node-version - ruby-on-rails/perfect-ruby-on-rails/.ruby-version @@ -76,7 +76,7 @@ jobs: filters: | ruby: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/perfect-ruby-on-rails.yml + - .github/workflows/ruby-on-rails--perfect-ruby-on-rails--ci.yml - .ruby-version - .node-version - ruby-on-rails/perfect-ruby-on-rails/.ruby-version @@ -93,7 +93,7 @@ jobs: - ruby-on-rails/perfect-ruby-on-rails/pnpm-lock.yaml rubocop: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/perfect-ruby-on-rails.yml + - .github/workflows/ruby-on-rails--perfect-ruby-on-rails--ci.yml - .ruby-version - .node-version - ruby-on-rails/perfect-ruby-on-rails/.ruby-version @@ -105,7 +105,7 @@ jobs: - ruby-on-rails/perfect-ruby-on-rails/**/*.rake steep: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/perfect-ruby-on-rails.yml + - .github/workflows/ruby-on-rails--perfect-ruby-on-rails--ci.yml - .ruby-version - .node-version - ruby-on-rails/perfect-ruby-on-rails/.ruby-version diff --git a/.github/workflows/ruby-on-rails--restful-api.yml b/.github/workflows/ruby-on-rails--restful-api--ci.yml similarity index 93% rename from .github/workflows/ruby-on-rails--restful-api.yml rename to .github/workflows/ruby-on-rails--restful-api--ci.yml index b77207ba..edf909d0 100644 --- a/.github/workflows/ruby-on-rails--restful-api.yml +++ b/.github/workflows/ruby-on-rails--restful-api--ci.yml @@ -5,7 +5,7 @@ # This workflow will install a prebuilt Ruby version, install dependencies, and # run tests and linters. -name: Ruby on Rails - RESTful API +name: Ruby on Rails - RESTful API - CI on: push: @@ -13,7 +13,7 @@ on: - master paths: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/restful-api.yml + - .github/workflows/ruby-on-rails--restful-api--ci.yml - .ruby-version - ruby-on-rails/restful-api/.ruby-version - ruby-on-rails/restful-api/Gemfile @@ -29,7 +29,7 @@ on: pull_request: paths: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/restful-api.yml + - .github/workflows/ruby-on-rails--restful-api--ci.yml - .ruby-version - ruby-on-rails/restful-api/.ruby-version - ruby-on-rails/restful-api/Gemfile @@ -63,7 +63,7 @@ jobs: filters: | ruby: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/restful-api.yml + - .github/workflows/ruby-on-rails--restful-api--ci.yml - .ruby-version - ruby-on-rails/restful-api/.ruby-version - ruby-on-rails/restful-api/Gemfile @@ -74,7 +74,7 @@ jobs: - ruby-on-rails/restful-api/**/*.yml rubocop: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/restful-api.yml + - .github/workflows/ruby-on-rails--restful-api--ci.yml - .ruby-version - ruby-on-rails/restful-api/.ruby-version - ruby-on-rails/restful-api/Gemfile @@ -86,7 +86,7 @@ jobs: - ruby-on-rails/restful-api/**/*.rake steep: - .github/actions/setup-ruby-on-rails/action.yml - - .github/workflows/restful-api.yml + - .github/workflows/ruby-on-rails--restful-api--ci.yml - .ruby-version - ruby-on-rails/restful-api/.ruby-version - ruby-on-rails/restful-api/Gemfile diff --git a/.github/workflows/typescript.yml b/.github/workflows/typescript--ci.yml similarity index 90% rename from .github/workflows/typescript.yml rename to .github/workflows/typescript--ci.yml index db1b422a..b7947bef 100644 --- a/.github/workflows/typescript.yml +++ b/.github/workflows/typescript--ci.yml @@ -1,14 +1,14 @@ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs -name: JavaScript +name: TypeScript - CI on: push: branches: - master paths: - - .github/workflows/typescript.yml + - .github/workflows/typescript--ci.yml - .node-version - typescript/package.json - typescript/pnpm-lock.yaml @@ -16,7 +16,7 @@ on: - typescript/**/*.ts pull_request: paths: - - .github/workflows/typescript.yml + - .github/workflows/typescript--ci.yml - .node-version - typescript/package.json - typescript/pnpm-lock.yaml @@ -40,7 +40,7 @@ jobs: with: filters: | typescript: - - .github/workflows/typescript.yml + - .github/workflows/typescript--ci.yml - .node-version - typescript/package.json - typescript/pnpm-lock.yaml diff --git a/README.md b/README.md index b84b611d..9d206242 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,12 @@ -[![Actions Status: JavaScript](https://github.com/hayat01sh1da/tutorials/workflows/JavaScript/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22JavaScript%22) -[![Actions Status: Python](https://github.com/hayat01sh1da/tutorials/workflows/Python/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Python%22) -[![Actions Status: Ruby on Rails - e-Navigator](https://github.com/hayat01sh1da/tutorials/workflows/Ruby%20on%20Rails%20-%20e-Navigator/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Ruby%20on%20Rails%20-%20e-Navigator%22) -[![Actions Status: Ruby on Rails - Perfect Ruby on Rails](https://github.com/hayat01sh1da/tutorials/workflows/Ruby%20on%20Rails%20-%20Perfect%20Ruby%20on%20Rails/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Ruby%20on%20Rails%20-%20Perfect%20Ruby%20on%20Rails%22) -[![Actions Status: Ruby on Rails - RESTful API](https://github.com/hayat01sh1da/tutorials/workflows/Ruby%20on%20Rails%20-%20RESTful%20API/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Ruby%20on%20Rails%20-%20RESTful%20API%22) -[![Actions Status: TypeScript](https://github.com/hayat01sh1da/tutorials/workflows/TypeScript/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22TypeScript%22) +[![Actions Status: JavaScript - CI](https://github.com/hayat01sh1da/tutorials/workflows/JavaScript%20-%20CI/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22JavaScript%20-%20CI%22) +[![Actions Status: JavaScript - Daily Dependencies Update](https://github.com/hayat01sh1da/tutorials/workflows/JavaScript%20-%20Daily%20Dependencies%20Update/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22JavaScript%20-%20Daily%20Dependencies%20Update%22) +[![Actions Status: Python - CI](https://github.com/hayat01sh1da/tutorials/workflows/Python%20-%20CI/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Python%20-%20CI%22) +[![Actions Status: Python - Daily Dependencies Update](https://github.com/hayat01sh1da/tutorials/workflows/Python%20-%20Daily%20Dependencies%20Update/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Python%20-%20Daily%20Dependencies%20Update%22) +[![Actions Status: Ruby on Rails - e-Navigator - CI](https://github.com/hayat01sh1da/tutorials/workflows/Ruby%20on%20Rails%20-%20e-Navigator%20-%20CI/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Ruby%20on%20Rails%20-%20e-Navigator%20-%20CI%22) +[![Actions Status: Ruby on Rails - Perfect Ruby on Rails - CI](https://github.com/hayat01sh1da/tutorials/workflows/Ruby%20on%20Rails%20-%20Perfect%20Ruby%20on%20Rails%20-%20CI/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Ruby%20on%20Rails%20-%20Perfect%20Ruby%20on%20Rails%20-%20CI%22) +[![Actions Status: Ruby on Rails - RESTful API - CI](https://github.com/hayat01sh1da/tutorials/workflows/Ruby%20on%20Rails%20-%20RESTful%20API%20-%20CI/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Ruby%20on%20Rails%20-%20RESTful%20API%20-%20CI%22) +[![Actions Status: Ruby on Rails - Daily Dependencies Update](https://github.com/hayat01sh1da/tutorials/workflows/Ruby%20on%20Rails%20-%20Daily%20Dependencies%20Update/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22Ruby%20on%20Rails%20-%20Daily%20Dependencies%20Update%22) +[![Actions Status: TypeScript - CI](https://github.com/hayat01sh1da/tutorials/workflows/TypeScript%20-%20CI/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22TypeScript%20-%20CI%22) [![Actions Status: CodeQL](https://github.com/hayat01sh1da/tutorials/workflows/CodeQL/badge.svg)](https://github.com/hayat01sh1da/tutorials/actions?query=workflow%3A%22CodeQL%22) ## 1. Common Environment