From 29c891b9667741669d3ad15dc9ae6a82dce1046e Mon Sep 17 00:00:00 2001 From: Nic McPhee Date: Fri, 9 Sep 2022 09:35:59 -0500 Subject: [PATCH 1/6] Add GitHub Actions for this pre-lab This is essentially a copy of the `disemvowel` actions from the next lab, with the relevant name changes, etc. --- .github/workflows/gtest.yml | 27 +++++++++++++++++++++++++++ .github/workflows/main_valgrind.yml | 29 +++++++++++++++++++++++++++++ .github/workflows/test_valgrind.yml | 29 +++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 .github/workflows/gtest.yml create mode 100644 .github/workflows/main_valgrind.yml create mode 100644 .github/workflows/test_valgrind.yml diff --git a/.github/workflows/gtest.yml b/.github/workflows/gtest.yml new file mode 100644 index 0000000..62d5613 --- /dev/null +++ b/.github/workflows/gtest.yml @@ -0,0 +1,27 @@ +name: gtest + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Cache gtest library + uses: actions/cache@v2 + env: + cache-name: cache-gtest-lib + with: + key: $${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('/usr/local/lib/libgtest.a') }} + path: /usr/local/lib/libgtest.a + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - name: Install gtest manually + run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a + - name: Check out the code + uses: actions/checkout@v2 + - name: Compile test code + run: g++ -Wall -g -o check_whitespace_test check_whitespace.c check_whitespace_test.cpp -lgtest + - name: Run test + run: ./check_whitespace_test diff --git a/.github/workflows/main_valgrind.yml b/.github/workflows/main_valgrind.yml new file mode 100644 index 0000000..0ad886f --- /dev/null +++ b/.github/workflows/main_valgrind.yml @@ -0,0 +1,29 @@ +name: main-valgrind + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Cache gtest library + uses: actions/cache@v2 + env: + cache-name: cache-gtest-lib + with: + key: $${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('/usr/local/lib/libgtest.a') }} + path: /usr/local/lib/libgtest.a + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - name: Install gtest manually + run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a + - name: Install valgrind + run: sudo apt-get install -y valgrind + - name: Check out the code + uses: actions/checkout@v2 + - name: Compile code + run: gcc -Wall -g -o check_whitespace check_whitespace.c main.c + - name: Run test + run: valgrind -v --leak-check=full --show-leak-kinds=all --error-exitcode=1 ./check_whitespace < main.c diff --git a/.github/workflows/test_valgrind.yml b/.github/workflows/test_valgrind.yml new file mode 100644 index 0000000..19c8ebc --- /dev/null +++ b/.github/workflows/test_valgrind.yml @@ -0,0 +1,29 @@ +name: test-valgrind + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Cache gtest library + uses: actions/cache@v2 + env: + cache-name: cache-gtest-lib + with: + key: $${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('/usr/local/lib/libgtest.a') }} + path: /usr/local/lib/libgtest.a + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - name: Install gtest manually + run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a + - name: Install valgrind + run: sudo apt-get install -y valgrind + - name: Check out the code + uses: actions/checkout@v2 + - name: Compile code + run: g++ -Wall -g -o check_whitespace_test check_whitespace.c check_whitespace_test.cpp -lgtest + - name: Run test + run: valgrind -v --leak-check=full --show-leak-kinds=all --error-exitcode=1 ./check_whitespace_test From 412d31a00649680ed2b9a13b10d565a968d70d65 Mon Sep 17 00:00:00 2001 From: Nic McPhee Date: Fri, 9 Sep 2022 09:40:55 -0500 Subject: [PATCH 2/6] Add `-pthread` flag to C++ builds I'm not 100% sure when/why we do/don't need the `-pthread` flag, but the code didn't compile on the VM used for the testing, and I'm guessing that removing that flag is the problem. You don't seem to need it in our lab, though. Maybe the issue is different C++ compilers, i.e., GNU vs CLang? --- .github/workflows/gtest.yml | 2 +- .github/workflows/test_valgrind.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gtest.yml b/.github/workflows/gtest.yml index 62d5613..6e721f3 100644 --- a/.github/workflows/gtest.yml +++ b/.github/workflows/gtest.yml @@ -22,6 +22,6 @@ jobs: - name: Check out the code uses: actions/checkout@v2 - name: Compile test code - run: g++ -Wall -g -o check_whitespace_test check_whitespace.c check_whitespace_test.cpp -lgtest + run: g++ -Wall -g -o check_whitespace_test check_whitespace.c check_whitespace_test.cpp -lgtest -pthread - name: Run test run: ./check_whitespace_test diff --git a/.github/workflows/test_valgrind.yml b/.github/workflows/test_valgrind.yml index 19c8ebc..b4e0543 100644 --- a/.github/workflows/test_valgrind.yml +++ b/.github/workflows/test_valgrind.yml @@ -24,6 +24,6 @@ jobs: - name: Check out the code uses: actions/checkout@v2 - name: Compile code - run: g++ -Wall -g -o check_whitespace_test check_whitespace.c check_whitespace_test.cpp -lgtest + run: g++ -Wall -g -o check_whitespace_test check_whitespace.c check_whitespace_test.cpp -lgtest -pthread - name: Run test run: valgrind -v --leak-check=full --show-leak-kinds=all --error-exitcode=1 ./check_whitespace_test From 7bba8d3f4e031adfa54da66fb190fb97bdccaded Mon Sep 17 00:00:00 2001 From: Nic McPhee Date: Fri, 9 Sep 2022 09:43:47 -0500 Subject: [PATCH 3/6] Remove `on pull-request` from all the actions All three GitHub Actions had both `push` and `pull-request` as triggers, which meant that we run all the tests twice whenever we pushed to a PR. That just seems wasteful, so I removed the `on pull-request` trigger. --- .github/workflows/gtest.yml | 2 +- .github/workflows/main_valgrind.yml | 2 +- .github/workflows/test_valgrind.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gtest.yml b/.github/workflows/gtest.yml index 6e721f3..409531a 100644 --- a/.github/workflows/gtest.yml +++ b/.github/workflows/gtest.yml @@ -1,6 +1,6 @@ name: gtest -on: [push, pull_request] +on: [push] jobs: build: diff --git a/.github/workflows/main_valgrind.yml b/.github/workflows/main_valgrind.yml index 0ad886f..83499e4 100644 --- a/.github/workflows/main_valgrind.yml +++ b/.github/workflows/main_valgrind.yml @@ -1,6 +1,6 @@ name: main-valgrind -on: [push, pull_request] +on: [push] jobs: build: diff --git a/.github/workflows/test_valgrind.yml b/.github/workflows/test_valgrind.yml index b4e0543..807bf65 100644 --- a/.github/workflows/test_valgrind.yml +++ b/.github/workflows/test_valgrind.yml @@ -1,6 +1,6 @@ name: test-valgrind -on: [push, pull_request] +on: [push] jobs: build: From 88e848ac75ab5739bc6b1a51112841d2fd032a58 Mon Sep 17 00:00:00 2001 From: Nic McPhee Date: Fri, 9 Sep 2022 09:59:01 -0500 Subject: [PATCH 4/6] Start new README section on GitHub Actions and badges This documents the existence of GitHub Actions and the status indicators. I still need to sort out the badge material. --- README.md | 26 ++++++++++++++++++++++++++ images/GitHub_action_status.png | Bin 0 -> 39918 bytes 2 files changed, 26 insertions(+) create mode 100644 images/GitHub_action_status.png diff --git a/README.md b/README.md index 784c34f..27cd1ea 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ and using `valgrind` to identify memory leaks. - [Compiling and running a C program](#compiling-and-running-a-c-program) - [Compiling and running the tests](#compiling-and-running-the-tests) - [Using valgrind to find memory leaks](#using-valgrind-to-find-memory-leaks) +- [GitHub Actions and badges](#github-actions-and-badges) - [What to do](#what-to-do) ## Background @@ -313,6 +314,31 @@ Once you have everything happy, you will hopefully get a line like: at the end indicating that you now have 0 errors and all is well. +## GitHub Actions and badges + +We've set up GitHub Actions to automatically run three checks on your +code every time you push changes to GitHub: + +- The code compiles and the tests pass. +- Valgrind returns no errors when running the `main` function. +- Valgrind returns no errors when running the test code. + +You should be able to see the status of these in a commit or pull request +in GitHub. Here, for example, is a status from a pull request: + +![Screen grab of GitHub Action status showing success, failure, and pending](images/GitHub_action_status.png) + +We have all three possible status indicators here: + +- The red x indicates a failing check +- The orange dot indicates a check that's still in progress +- The green checkmark indicates a check that passed + +When you initially check out the code for the pre-lab, the `gtest` +check should pass (the tests pass), but the other two should fail +because there are memory issues with both the `check_whitespace` +`main()` and the tests. + ## What to do - [ ] Compile the program `check_whitespace` diff --git a/images/GitHub_action_status.png b/images/GitHub_action_status.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a3ea1c23d094a64e6fb2cf87ac33e8f6fa4b24 GIT binary patch literal 39918 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 Date: Fri, 9 Sep 2022 11:50:01 -0500 Subject: [PATCH 5/6] Add badges I also added a note about the badges in the README. --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 27cd1ea..2823f41 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # C-programming-pre-lab +[![Tests](../../workflows/disemvowel-gtest/badge.svg)](../../actions?query=workflow%3A"gtest") +[![Main Valgrind](../../workflows/main-valgrind/badge.svg)](../../actions?query=workflow%3A"main-valgrind") +[![Test Valgrind](../../workflows/test-valgrind/badge.svg)](../../actions?query=workflow%3A"test-valgrind") + + This is a pre-lab to get you started started on compiling and running C programs and using `valgrind` to identify memory leaks. @@ -339,6 +344,17 @@ check should pass (the tests pass), but the other two should fail because there are memory issues with both the `check_whitespace` `main()` and the tests. +We have also added three badges to the top of this README that indicate +the status of each of these three status checks. The tests badge should +be green from the beginning (and stay green throughout the process). +The two `valgrind` badges will both start off red (because the `valgrind` +checks fail initially) but turn green after you've fixed the memory +management issue. + +> :warning: The badges won't update instantly, so don't fret if +> your status checks are green but the badge is still red. That +> should update in a few minutes. + ## What to do - [ ] Compile the program `check_whitespace` From 2f803f4a959de61c88fc69b72feba50bca76f167 Mon Sep 17 00:00:00 2001 From: Nic McPhee Date: Fri, 9 Sep 2022 11:53:02 -0500 Subject: [PATCH 6/6] Remove dangling `disemvowel` reference One of the badge URLs still had `disemvowel` in it (copy-paste error). Hopefully this will fix that. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2823f41..9f5ffb9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # C-programming-pre-lab -[![Tests](../../workflows/disemvowel-gtest/badge.svg)](../../actions?query=workflow%3A"gtest") +[![Tests](../../workflows/gtest/badge.svg)](../../actions?query=workflow%3A"gtest") [![Main Valgrind](../../workflows/main-valgrind/badge.svg)](../../actions?query=workflow%3A"main-valgrind") [![Test Valgrind](../../workflows/test-valgrind/badge.svg)](../../actions?query=workflow%3A"test-valgrind")