Github action

Github action
Photo by Yancy Min / Unsplash

Github action: là công cụ giúp chúng ta có thể build code sau đó chạy các câu lệnh mà chúng ta muốn trên github.

Dưới đây là 1 ví dụ về file github action cho việc thực thi Postman API test && unit test .

Tạo pull request vào branch main:
  • github action sẽ dùng code head branch.
  • Khi đã có pull request thì head branch có push commit thì cũng được re-run lại.
  • Pull request đang ở trạng thái conflict thì sẽ ko được trigger
Push code lên branch main  :
  • github action sẽ dùng code main branch.

Example

name: Postman Integration test & Unit test 


on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
env:
  SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}

jobs:
  aws_cdk:
    runs-on: ubuntu-20.04
    steps:
      - name: pull code
        uses: actions/checkout@v2

      - name: container up
        shell: bash
        run: |
          docker-compose up --build -d
          docker-compose logs db
  
      - name: init for integration test
        id: init_for_integration_test
        run: make init_integration

      - name: newman install
        run: sudo npm install -g newman

      - name: Postman test
        id: excute_integration_test
        run: newman run ./integration_test/demo.postman_collection.json -e ./integration_test/demo.postman_environment.json

      - name: run seed for unit test 
        id: prepare_database_for_unit_test
        run: |
          docker-compose exec -T app php artisan migrate:refresh
          docker-compose exec -T app php artisan db:seed --class=DatabaseSeeder

      - name: run UnitTest
        id: excute_unit_test
        run: docker-compose exec --user root -T app php artisan test

      - name: Slack Notification on Success
        if: success()
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_CHANNEL: ${{ secrets.SLACK_CHANNEL }}
          SLACK_TITLE: テスト成功
          SLACK_MESSAGE: おめでとう!
          SLACK_COLOR: good

      - name: Slack Notification on Failure
        uses: rtCamp/action-slack-notify@v2
        if: failure()
        env:
          SLACK_CHANNEL: ${{ secrets.SLACK_CHANNEL }}
          SLACK_TITLE: テスト失敗
          SLACK_MESSAGE: "Postmanテスト初期化 : ${{ steps.init_for_integration_test.conclusion }}\nPostmanテスト実施 : ${{ steps.excute_integration_test.conclusion }}\n単体テストデータ準備 : ${{ steps.prepare_database_for_unit_test.conclusion }}\n単体テスト実行 : ${{ steps.excute_unit_test.conclusion}}"
          SLACK_COLOR: danger

Chú ý khi dùng docker-compose command trong github action

  • Chỉ định  -T  :

Nếu không chỉ định -T sẽ bị lỗi  như bên dưới

docker-compose exec app composer install
the input device is not a TTY
make: *** [Makefile:11: init_integration] Error 1
Error: Process completed with exit code 2.
  • Chỉ định --user root :

user/group  trong docker đều là kiểu dạng số như bên dưới, trong khi user thực excute lại là www-data. Nên nếu câu lệnh tạo file/folder thì cần thêm option --user root

file/folder permission inside docker:

docker-compose exec -T app ls -la
total 1144
drwxr-xr-x 12 1001  121   4096 May 21 09:42 .
drwxr-xr-x  1 root root   4096 May 21 09:45 ..
drwxr-xr-x 12 1001  121   4096 May 21 09:42 app
-rwxr-xr-x  1 1001  121   1686 May 21 09:42 artisan
drwxr-xr-x  3 1001  121   4096 May 21 09:42 bootstrap
-rw-r--r--  1 1001  121   2010 May 21 09:42 composer.json

Dùng  secrets để đưa các biến số môi trường

${{ secrets.SLACK_WEBHOOK_URL }}