diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
index 1ee6459d..91c00220 100644
--- a/.github/workflows/go.yml
+++ b/.github/workflows/go.yml
@@ -11,12 +11,12 @@ jobs:
   build:
     runs-on:  ubuntu-latest
     steps:
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v4
 
     - name: Set up Go
-      uses: actions/setup-go@v2
+      uses: actions/setup-go@v5
       with:
-        go-version: 1.19.12
+        go-version: 1.22.3
 
     - name: Clang
       run: |
@@ -30,27 +30,33 @@ jobs:
           # view version
           clang --version
 
+    - name: Download
+      run: |
+          go mod download
+
     - name: Lint
       run: |
           ./scripts/lint.sh
 
+    - name: Build
+      run: |
+          go build -v
+
+    - name: Race test
+      run: |
+          go test -run=TestIntegrationScripts/tests/ctype.c -race -v -timeout=30m
+
     - name: Coverage
       run: |
           go get -u github.com/wadey/gocovmerge
           go get -u github.com/Konstantin8105/cs
           go get -u golang.org/x/sys/unix
-          TRAVIS=true ./scripts/test.sh
-          # TRAVIS=true go test -v -timeout=2h
+          go test -run=TestIntegrationScripts/tests/ctype.c -coverprofile=coverage.txt -covermode=atomic
+          # TRAVIS=true ./scripts/test.sh
 
     - name: Upload coverage to Codecov
-      env:
-        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
-      run: include_cov=coverage.txt bash <(curl -s https://codecov.io/bash)
-
-    - name: Build
-      run: |
-          go mod download
-          go build -v
-
-    - name: Race test
-      run: go test --run=TestIntegrationScripts/tests/ctype.c -race -v -timeout=30m
+      uses: codecov/codecov-action@v4
+      with:
+          token: ${{ secrets.CODECOV_ORG_TOKEN }}
+          verbose: true # optional (default = false)
+          file: coverage.txt
diff --git a/scripts/test.sh b/scripts/test.sh
index b173576f..e3907531 100755
--- a/scripts/test.sh
+++ b/scripts/test.sh
@@ -32,9 +32,13 @@ if [ $COVERAGE_FILES != 0 ]; then
 	fi
 fi
 
-echo "End of coverage"
+# echo "" > coverage.out
+# for d in $(go list ./... | grep -v vendor); do
+#     go test -v -race -coverprofile=profile.out -covermode=atomic $d
+#     if [ -f profile.out ]; then
+#         cat profile.out >> coverage.out
+#         rm profile.out
+#     fi
+# done
 
-# check race
-go test                                       \
-	-run=TestIntegrationScripts/tests/ctype.c \
-	-race -v
+echo "End of coverage"