# # s3fs - FUSE-based file system backed by Amazon S3 # # Copyright(C) 2007 Takeshi Nakatani # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # name: s3fs-fuse CI on: push: pull_request: # # CRON event is fired on every sunday (UTC). # schedule: - cron: '0 0 * * 0' # # Jobs # jobs: Linux: runs-on: ubuntu-latest # # build matrix for containers # strategy: # # do not stop jobs automatically if any of the jobs fail # fail-fast: false # # matrix for containers # matrix: container: - ubuntu:24.04 - ubuntu:22.04 - ubuntu:20.04 - debian:bookworm - debian:bullseye - rockylinux:9 - rockylinux:8 - fedora:40 - fedora:39 - opensuse/leap:15 - alpine:3.20 - centos:centos7 container: image: ${{ matrix.container }} options: "--privileged --cap-add SYS_ADMIN --device /dev/fuse" env: # [NOTE] # Installation special environment variables for debian and ubuntu. # DEBIAN_FRONTEND: noninteractive # [NOTE] # actions/checkout uses node20, but can only run up to node16 on centos7. # (glibc 2.27 or later is required to use node20) # This is a temporary solution and will be removed when centos7 support is discontinued. # ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: ${{ matrix.container == 'centos:centos7' && true || false }} steps: # [NOTE] # On openSUSE, tar and gzip must be installed before action/checkout. # - name: Install packages before checkout if: matrix.container == 'opensuse/leap:15' run: | zypper install -y tar gzip # [NOTE] # Use actions/checkout@v4 except for centos7. # On centos7, we need to run actions/checkout@v3 and configure it to use node16. # - name: Checkout source code(other than centos7) if: matrix.container != 'centos:centos7' uses: actions/checkout@v4 - name: Checkout source code(only centos7) if: matrix.container == 'centos:centos7' uses: actions/checkout@v3 # [NOTE] # Matters that depend on OS:VERSION are determined and executed in the following script. # Please note that the option to configure (CONFIGURE_OPTIONS) is set in the environment variable. # - name: Install packages run: | .github/workflows/linux-ci-helper.sh ${{ matrix.container }} - name: Build run: | ./autogen.sh /bin/sh -c "./configure ${CONFIGURE_OPTIONS}" make --jobs=$(nproc) - name: clang-tidy run: | # skip if clang-tidy does not exist, e.g., CentOS 7 if command -v clang-tidy; then make -C src/ clang-tidy make -C test/ clang-tidy fi - name: Cppcheck run: | # specify the version range to run cppcheck (cppcheck version number is x.y or x.y.z) if cppcheck --version | sed -e 's/\./ /g' | awk '{if (($2 * 1000 + $3) <= 2004) { exit(1) } }'; then make cppcheck fi - name: Shellcheck run: | if shellcheck --version | awk -F '[ .]' '/version:/ && ($2 * 1000 + $3 <= 7) { exit(1) }'; then make shellcheck fi - name: Test suite run: | make check -C src make ALL_TESTS=1 check -C test || (test/filter-suite-log.sh test/test-suite.log; exit 1) # [NOTE] # Using macos-fuse-t # This product(package) is a workaround for osxfuse which required an OS reboot(macos 11 and later). # see. https://github.com/macos-fuse-t/fuse-t # About osxfuse # This job doesn't work with GitHub Actions using macOS 11+ because "load_osxfuse" returns # "exit code = 1".(requires OS reboot) # macos12: runs-on: macos-12 steps: - name: Checkout source code uses: actions/checkout@v4 - name: Brew tap run: | TAPS="$(brew --repository)/Library/Taps"; if [ -e "$TAPS/caskroom/homebrew-cask" ]; then rm -rf "$TAPS/caskroom/homebrew-cask"; fi; HOMEBREW_NO_AUTO_UPDATE=1 brew tap homebrew/homebrew-cask HOMEBREW_NO_AUTO_UPDATE=1 brew tap macos-fuse-t/homebrew-cask - name: Install fuse-t run: | HOMEBREW_NO_AUTO_UPDATE=1 brew install fuse-t - name: Install brew other packages run: | S3FS_BREW_PACKAGES='automake cppcheck python3 coreutils gnu-sed shellcheck jq'; for s3fs_brew_pkg in ${S3FS_BREW_PACKAGES}; do if brew list | grep -q ${s3fs_brew_pkg}; then if brew outdated | grep -q ${s3fs_brew_pkg}; then HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade ${s3fs_brew_pkg}; fi; else HOMEBREW_NO_AUTO_UPDATE=1 brew install ${s3fs_brew_pkg}; fi done - name: Install awscli2 run: | cd /tmp curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target / - name: Build run: | ./autogen.sh PKG_CONFIG_PATH=/usr/local/opt/curl/lib/pkgconfig:/usr/local/opt/openssl/lib/pkgconfig ./configure CXXFLAGS='-std=c++11 -DS3FS_PTHREAD_ERRORCHECK=1' make --jobs=$(sysctl -n hw.ncpu) - name: Cppcheck run: | # specify the version range to run cppcheck (cppcheck version number is x.y or x.y.z) if cppcheck --version | sed -e 's/\./ /g' | awk '{if (($2 * 1000 + $3) <= 2004) { exit(1) } }'; then make cppcheck fi - name: Shellcheck run: | if shellcheck --version | awk -F '[ .]' '/version:/ && ($2 * 1000 + $3 <= 7) { exit(1) }'; then make shellcheck fi - name: Test suite run: | make check -C src make ALL_TESTS=1 check -C test || (test/filter-suite-log.sh test/test-suite.log; exit 1) MemoryTest: runs-on: ubuntu-latest # # build matrix for containers # strategy: # # do not stop jobs automatically if any of the jobs fail # fail-fast: false # # matrix for type of checking # # [NOTE] # Currently following test is not supported: # - sanitize_memory : Future support planned # matrix: checktype: - glibc_debug - sanitize_address - sanitize_others - sanitize_thread - valgrind container: image: fedora:40 options: "--privileged --cap-add SYS_ADMIN --device /dev/fuse" steps: - name: Checkout source code uses: actions/checkout@v4 - name: Install packages run: | .github/workflows/linux-ci-helper.sh fedora:40 - name: Install clang run: | dnf install -y clang if [ "${{ matrix.checktype }}" = "valgrind" ]; then dnf install -y valgrind fi # # Set CXX/CXXFLAGS and Variables for test # - name: Set variables run: | COMMON_CXXFLAGS='-g -Wno-cpp -DS3FS_PTHREAD_ERRORCHECK=1' { if [ "${{ matrix.checktype }}" = "glibc_debug" ]; then echo "CXXFLAGS=${COMMON_CXXFLAGS} -O0 -D_GLIBCXX_DEBUG" elif [ "${{ matrix.checktype }}" = "sanitize_address" ]; then echo 'CXX=clang++' echo "CXXFLAGS=${COMMON_CXXFLAGS} -O0 -fsanitize=address -fsanitize-address-use-after-scope" echo 'ASAN_OPTIONS=detect_leaks=1,detect_stack_use_after_return=1' elif [ "${{ matrix.checktype }}" = "sanitize_memory" ]; then echo 'CXX=clang++' echo "CXXFLAGS=${COMMON_CXXFLAGS} -O0 -fsanitize=memory" elif [ "${{ matrix.checktype }}" = "sanitize_thread" ]; then echo 'CXX=clang++' echo "CXXFLAGS=${COMMON_CXXFLAGS} -O0 -fsanitize=thread" echo 'TSAN_OPTIONS=halt_on_error=1' # [NOTE] # Set this to avoid following error when running configure. # "FATAL: ThreadSanitizer: unexpected memory mapping" sysctl vm.mmap_rnd_bits=28 elif [ "${{ matrix.checktype }}" = "sanitize_others" ]; then echo 'CXX=clang++' echo "CXXFLAGS=${COMMON_CXXFLAGS} -O1 -fsanitize=undefined,implicit-conversion,local-bounds,unsigned-integer-overflow" elif [ "${{ matrix.checktype }}" = "valgrind" ]; then echo "CXXFLAGS=${COMMON_CXXFLAGS} -O1" echo 'VALGRIND="--leak-check=full --error-exitcode=1"' echo 'RETRIES=100' echo 'S3_URL=http://127.0.0.1:8081' fi } >> "$GITHUB_ENV" - name: Build run: | ./autogen.sh /bin/sh -c "CXX=${CXX} CXXFLAGS=\"${CXXFLAGS}\" ./configure --prefix=/usr --with-openssl" make - name: Test suite run: | /bin/sh -c "ALL_TESTS=1 ASAN_OPTIONS=${ASAN_OPTIONS} TSAN_OPTIONS=${TSAN_OPTIONS} VALGRIND=${VALGRIND} RETRIES=${RETRIES} make check -C test || (test/filter-suite-log.sh test/test-suite.log; exit 1)" # # Local variables: # tab-width: 4 # c-basic-offset: 4 # End: # vim600: expandtab sw=4 ts=4 fdm=marker # vim<600: expandtab sw=4 ts=4 #