name: CI on: push: paths-ignore: - '.devcontainer/**' - 'examples/**' - 'lib/**' - 'man/**' - 'priv/**' - '**.md' pull_request: paths-ignore: - '.devcontainer/**' - 'examples/**' - 'lib/**' - 'man/**' - 'priv/**' - '**.md' jobs: tests: name: Tests strategy: fail-fast: false matrix: otp: ['19.3', '24', '25.0-rc1'] include: - otp: '19.3' rebar: 2 os: ubuntu-18.04 - otp: '24' rebar: 3 os: ubuntu-20.04 - otp: '25.0-rc1' rebar: 3 os: ubuntu-20.04 runs-on: ${{ matrix.os }} services: redis: image: redis ports: - 6379:6379 steps: - uses: actions/checkout@v2 - name: Test shell scripts if: matrix.otp == 24 run: | shellcheck test/ejabberd_SUITE_data/gencerts.sh shellcheck tools/captcha.sh shellcheck ejabberd.init.template shellcheck -x ejabberdctl.template - name: Get specific Erlang/OTP uses: ErlGang/setup-erlang@master if: matrix.otp != 24 with: otp-version: ${{ matrix.otp }} - name: Prepare databases run: | sudo systemctl start mysql.service sudo systemctl start postgresql.service mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost' IDENTIFIED BY 'ejabberd_test';" mysql -u root -proot -e "CREATE DATABASE ejabberd_test;" mysql -u root -proot -e "GRANT ALL ON ejabberd_test.* TO 'ejabberd_test'@'localhost';" mysql -u root -proot ejabberd_test < sql/mysql.sql pg_isready sudo -u postgres psql -c "CREATE USER ejabberd_test WITH PASSWORD 'ejabberd_test';" sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;" sudo -u postgres psql ejabberd_test -f sql/pg.sql sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE ejabberd_test TO ejabberd_test;" sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ejabberd_test;" sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ejabberd_test;" - name: Prepare libraries run: | sudo apt-get -qq update sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ libsqlite3-dev libwebp-dev libyaml-dev - name: Prepare rebar run: | echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2} ]}.' >>rebar.config echo '{xref_checks, [deprecated_function_calls, deprecated_functions, locals_not_used, undefined_function_calls, undefined_functions]}. % Disabled: exports_not_used,' >>rebar.config echo '{dialyzer, [{get_warnings, true}, {plt_extra_apps, [cache_tab, eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml, mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix, sqlite3, stringprep, stun, xmpp, yconf]} ]}.' >>rebar.config echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config - name: Cache rebar uses: actions/cache@v2 with: path: | deps/ dialyzer/ ebin/ ~/.cache/rebar3/ key: ${{matrix.otp}}-${{matrix.rebar}}-${{hashFiles('rebar.config')}} - name: Download test logs if: matrix.otp == 24 && github.repository == 'processone/ejabberd' continue-on-error: true run: | mkdir -p _build/test curl -sSL https://github.com/processone/ecil/tarball/gh-pages | tar -C _build/test --strip-components=1 --wildcards -xzf - rm -rf _build/test/logs/last/ - name: Compile run: | ./autogen.sh [[ ${{ matrix.rebar }} = 2 ]] && REBAR=rebar || REBAR=`which rebar3` ./configure --with-rebar=$REBAR \ --prefix=/tmp/ejabberd \ --enable-all \ --disable-elixir \ --disable-mssql \ --disable-odbc make update make - run: make install -s - run: make hooks - run: make options - run: make xref - run: | make dialyzer [ ${{ matrix.rebar }} = 3 ] && true \ || { cat dialyzer/error.log ; test ! -s dialyzer/error.log ; } - name: Check Production Release if: matrix.rebar == 3 run: | make rel RE=_build/prod/rel/ejabberd $RE/bin/ejabberdctl start $RE/bin/ejabberdctl started $RE/bin/ejabberdctl stop $RE/bin/ejabberdctl stopped cat $RE/var/log/ejabberd/ejabberd.log grep -q "is stopped in" $RE/var/log/ejabberd/ejabberd.log - name: Check Development Release if: matrix.rebar == 3 run: | make dev RE=_build/dev/rel/ejabberd $RE/bin/ejabberdctl start $RE/bin/ejabberdctl started $RE/bin/ejabberdctl stop $RE/bin/ejabberdctl stopped cat $RE/var/log/ejabberd/ejabberd.log grep -q "is stopped in" $RE/var/log/ejabberd/ejabberd.log - name: Run tests (OTP 19.3) if: matrix.otp == '19.3' id: ct2 run: make test - name: Run tests if: matrix.otp != '19.3' id: ct run: | (cd priv && ln -sf ../sql) COMMIT=`echo $GITHUB_SHA | cut -c 1-7` DATE=`date +%s` REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"` NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT LABEL=`git show -s --format=%s | cut -c 1-30` rebar3 ct --name $NODENAME --label "$LABEL" rebar3 cover - name: Check results if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped') id: ctresults run: | [[ -d _build ]] && ln -s _build/test/logs/last/ logs || true ln `find logs/ -name suite.log` logs/suite.log grep 'TEST COMPLETE' logs/suite.log grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log test $(find logs/ -empty -name error.log) - name: View logs failures if: failure() && steps.ctresults.outcome == 'failure' run: | cat logs/suite.log | awk \ 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' find logs/ -name error.log -exec cat '{}' ';' find logs/ -name exunit.log -exec cat '{}' ';' - name: Send to coveralls if: matrix.otp == 24 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | DIAGNOSTIC=1 rebar3 as test coveralls send curl -v -k https://coveralls.io/webhook \ --header "Content-Type: application/json" \ --data '{"repo_name":"$GITHUB_REPOSITORY", "repo_token":"$GITHUB_TOKEN", "payload":{"build_num":$GITHUB_RUN_ID, "status":"done"}}' - name: Upload test logs if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd' uses: peaceiris/actions-gh-pages@v3 with: publish_dir: _build/test exclude_assets: '.github,lib,plugins' external_repository: processone/ecil deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} keep_files: true - name: View ECIL address if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd' run: | CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'` echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/" - name: Prepare new schema run: | [[ -d logs ]] && rm -rf logs [[ -d _build/test/logs ]] && rm -rf _build/test/logs || true mysql -u root -proot -e "DROP DATABASE ejabberd_test;" sudo -u postgres psql -c "DROP DATABASE ejabberd_test;" mysql -u root -proot -e "CREATE DATABASE ejabberd_test;" mysql -u root -proot -e "GRANT ALL ON ejabberd_test.* TO 'ejabberd_test'@'localhost';" mysql -u root -proot ejabberd_test < sql/mysql.new.sql sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;" sudo -u postgres psql ejabberd_test -f sql/pg.new.sql sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE ejabberd_test TO ejabberd_test;" sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ejabberd_test;" sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ejabberd_test;" sudo sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl - run: CT_BACKENDS=mysql,pgsql make test id: ctnewschema - name: Check results if: always() && steps.ctnewschema.outcome != 'skipped' run: | [[ -d _build ]] && ln -s _build/test/logs/last/ logs || true ln `find logs/ -name suite.log` logs/suite.log grep 'TEST COMPLETE' logs/suite.log grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log test $(find logs/ -empty -name error.log) - name: View logs failures if: failure() && steps.ctnewschema.outcome != 'skipped' run: | cat logs/suite.log | awk \ 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' find logs/ -name error.log -exec cat '{}' ';' find logs/ -name exunit.log -exec cat '{}' ';' binaries: name: Binaries needs: [tests] strategy: fail-fast: false matrix: otp: ['21.3'] include: - otp: '21.3' rebar: 3 os: ubuntu-20.04 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 with: fetch-depth: 150 - name: Get last git tag run: | export TAGLAST=`git ls-remote --tags --refs origin 'refs/tags/2*' \ | tail -1 | awk '{print $2}'` git fetch origin "$TAGLAST:$TAGLAST" git describe - name: Get previous Erlang/OTP uses: ErlGang/setup-erlang@master with: otp-version: ${{ matrix.otp }} - name: Get a compatible Rebar3 run: | wget https://github.com/erlang/rebar3/releases/download/3.15.2/rebar3 \ && chmod +x rebar3 - name: Cache Rebar3 uses: actions/cache@v2 with: path: ~/.cache/rebar3/ key: ${{matrix.otp}}-${{matrix.rebar}}-${{hashFiles('rebar.config')}} - name: Prepare libraries run: | sudo apt-get -qq update sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ libsqlite3-dev libwebp-dev libyaml-dev - name: Compile run: | ./autogen.sh ./configure --with-rebar=./rebar3 \ --prefix=/tmp/ejabberd \ --disable-debug \ --enable-all \ --disable-elixir make update make - run: make install -s - name: Strip binaries run: echo 'beam_lib:strip_files(filelib:wildcard( "/tmp/ejabberd/lib/*/ebin/*beam")), init:stop().' \ | erl -boot start_clean - name: Upload binaries uses: actions/upload-artifact@v2 with: name: ejabberd-binaries path: /tmp/ejabberd/lib retention-days: 7