diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a59d3cf..23e19225 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,14 @@ name: signal-cli CI -on: [ push, pull_request, workflow_call ] +on: + push: + branches: + - '**' + pull_request: + workflow_call: + +permissions: + contents: write # to fetch code (actions/checkout) and submit dependency graph (gradle/gradle-build-action) jobs: build: @@ -8,20 +16,81 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [ '17', '18' ] + java: [ '21', '24' ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Set up JDK - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: 'zulu' java-version: ${{ matrix.java }} + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + dependency-graph: generate-and-submit + - name: Install asciidoc + run: sudo apt update && sudo apt --no-install-recommends install -y asciidoc-base - name: Build with Gradle - run: ./gradlew build + run: ./gradlew --no-daemon build + - name: Build man page + run: | + cd man + make install + - name: Add man page to archive + run: | + version=$(tar tf build/distributions/signal-cli-*.tar | head -n1 | sed 's|signal-cli-\([^/]*\)/.*|\1|') + echo $version + tar --transform="flags=r;s|man|signal-cli-${version}/man|" -rf build/distributions/signal-cli-${version}.tar man/man{1,5} - name: Compress archive run: gzip -n -9 build/distributions/signal-cli-*.tar - name: Archive production artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: signal-cli-archive-${{ matrix.java }} path: build/distributions/signal-cli-*.tar.gz + + build-graalvm: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: graalvm/setup-graalvm@v1 + with: + version: 'latest' + java-version: '21' + cache: 'gradle' + github-token: ${{ secrets.GITHUB_TOKEN }} + - name: Build with Gradle + run: ./gradlew --no-daemon nativeCompile + - name: Archive production artifacts + uses: actions/upload-artifact@v4 + with: + name: signal-cli-native + path: build/native/nativeCompile/signal-cli + + build-client: + strategy: + matrix: + os: + - ubuntu + - macos + - windows + runs-on: ${{ matrix.os }}-latest + defaults: + run: + working-directory: ./client + steps: + - uses: actions/checkout@v4 + - name: Install rust + run: rustup default stable + - name: Build client + run: cargo build --release --verbose + - name: Archive production artifacts + uses: actions/upload-artifact@v4 + with: + name: signal-cli-client-${{ matrix.os }} + path: | + client/target/release/signal-cli-client + client/target/release/signal-cli-client.exe diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 0ef62f7e..f778268a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,6 +9,10 @@ on: schedule: - cron: '0 7 * * 4' +permissions: + contents: read # to fetch code (actions/checkout) + security-events: write + jobs: analyse: name: Analyse @@ -17,12 +21,13 @@ jobs: steps: - name: Setup Java JDK - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: - java-version: 17 + distribution: 'zulu' + java-version: 21 - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. @@ -30,7 +35,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v3 # Override language selection by uncommenting this and choosing your languages # with: # languages: go, javascript, csharp, python, cpp, java @@ -38,7 +43,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -52,4 +57,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..b7ce03f1 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,257 @@ +name: release + +on: + push: + tags: + - v* + +permissions: + contents: write # to fetch code (actions/checkout) and create release + +env: + IMAGE_NAME: signal-cli + IMAGE_REGISTRY: ghcr.io/asamk + REGISTRY_USER: ${{ github.actor }} + REGISTRY_PASSWORD: ${{ github.token }} + +jobs: + + ci_wf: + permissions: + contents: write + uses: AsamK/signal-cli/.github/workflows/ci.yml@master + # ${{ github.repository }} not accepted here + + lib_to_jar: + needs: ci_wf + runs-on: ubuntu-latest + permissions: + contents: write + + outputs: + signal_cli_version: ${{ steps.cli_ver.outputs.version }} + release_id: ${{ steps.create_release.outputs.id }} + + steps: + + - name: Download signal-cli build from CI workflow + uses: actions/download-artifact@v4 + + - name: Get signal-cli version + id: cli_ver + run: | + ver="${GITHUB_REF_NAME#v}" + echo "version=${ver}" >> $GITHUB_OUTPUT + + - name: Extract archive + run: | + tree . + ARCHIVE_DIR=$(ls signal-cli-archive-*/ -d | tail -n1) + tar -xzf ./"${ARCHIVE_DIR}"/*.tar.gz + mv ./"${ARCHIVE_DIR}"/*.tar.gz signal-cli-${{ steps.cli_ver.outputs.version }}.tar.gz + rm -rf signal-cli-archive-*/ + +# - name: Get signal-client jar version +# id: lib_ver +# run: | +# JAR_PREFIX=libsignal-client- +# jar_file=$(find ./signal-cli-*/lib/ -name "$JAR_PREFIX*.jar") +# jar_version=$(echo "$jar_file" | xargs basename | sed "s/$JAR_PREFIX//; s/.jar//") +# echo "$jar_version" +# echo "signal_client_version=${jar_version}" >> $GITHUB_OUTPUT +# +# - name: Download signal-client builds +# env: +# RELEASES_URL: https://github.com/signalapp/libsignal/releases/download/ +# FILE_NAMES: signal_jni.dll libsignal_jni.dylib +# SIGNAL_CLIENT_VER: ${{ steps.lib_ver.outputs.signal_client_version }} +# run: | +# for file_name in $FILE_NAMES; do +# curl -sOL "${RELEASES_URL}/v${SIGNAL_CLIENT_VER}/${file_name}" # note: added v +# done +# tree . + + - name: Compress native app + env: + SIGNAL_CLI_VER: ${{ steps.cli_ver.outputs.version }} + run: | + chmod +x signal-cli-native/signal-cli + tar -czf signal-cli-${SIGNAL_CLI_VER}-Linux-native.tar.gz -C signal-cli-native signal-cli + rm -rf signal-cli-native/ + +# - name: Replace Windows lib +# env: +# SIGNAL_CLI_VER: ${{ steps.cli_ver.outputs.version }} +# SIGNAL_CLIENT_VER: ${{ steps.lib_ver.outputs.signal_client_version }} +# run: | +# mv signal_jni.dll libsignal_jni.so +# zip -u ./signal-cli-*/lib/libsignal-client-${SIGNAL_CLIENT_VER}.jar ./libsignal_jni.so +# tar -czf signal-cli-${SIGNAL_CLI_VER}-Windows.tar.gz signal-cli-*/ +# +# - name: Replace macOS lib +# env: +# SIGNAL_CLI_VER: ${{ steps.cli_ver.outputs.version }} +# SIGNAL_CLIENT_VER: ${{ steps.lib_ver.outputs.signal_client_version }} +# run: | +# jar_file=./signal-cli-*/lib/libsignal-client-${SIGNAL_CLIENT_VER}.jar +# zip -d $jar_file libsignal_jni.so +# zip $jar_file libsignal_jni.dylib +# tar -czf signal-cli-${SIGNAL_CLI_VER}-macOS.tar.gz signal-cli-*/ + + - name: Create release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ steps.cli_ver.outputs.version }} # note: added `v` + release_name: v${{ steps.cli_ver.outputs.version }} # note: added `v` + draft: true + + - name: Upload archive + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: signal-cli-${{ steps.cli_ver.outputs.version }}.tar.gz + asset_name: signal-cli-${{ steps.cli_ver.outputs.version }}.tar.gz + asset_content_type: application/x-compressed-tar # .tar.gz + +# - name: Upload Linux archive +# uses: actions/upload-release-asset@v1 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# upload_url: ${{ steps.create_release.outputs.upload_url }} +# asset_path: signal-cli-${{ steps.cli_ver.outputs.version }}-Linux.tar.gz +# asset_name: signal-cli-${{ steps.cli_ver.outputs.version }}-Linux.tar.gz +# asset_content_type: application/x-compressed-tar # .tar.gz + + - name: Upload Linux native archive + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: signal-cli-${{ steps.cli_ver.outputs.version }}-Linux-native.tar.gz + asset_name: signal-cli-${{ steps.cli_ver.outputs.version }}-Linux-native.tar.gz + asset_content_type: application/x-compressed-tar # .tar.gz + +# - name: Upload windows archive +# uses: actions/upload-release-asset@v1 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# upload_url: ${{ steps.create_release.outputs.upload_url }} +# asset_path: signal-cli-${{ steps.cli_ver.outputs.version }}-Windows.tar.gz +# asset_name: signal-cli-${{ steps.cli_ver.outputs.version }}-Windows.tar.gz +# asset_content_type: application/x-compressed-tar # .tar.gz +# +# - name: Upload macos archive +# uses: actions/upload-release-asset@v1 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# upload_url: ${{ steps.create_release.outputs.upload_url }} +# asset_path: signal-cli-${{ steps.cli_ver.outputs.version }}-macOS.tar.gz +# asset_name: signal-cli-${{ steps.cli_ver.outputs.version }}-macOS.tar.gz +# asset_content_type: application/x-compressed-tar # .tar.gz + + build-container: + needs: ci_wf + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v4 + - name: Download signal-cli build from CI workflow + uses: actions/download-artifact@v4 + + - name: Get signal-cli version + id: cli_ver + run: | + ver="${GITHUB_REF_NAME#v}" + echo "version=${ver}" >> $GITHUB_OUTPUT + + - name: Move archive file + run: | + ARCHIVE_DIR=$(ls signal-cli-archive-*/ -d | tail -n1) + tar xf ./"${ARCHIVE_DIR}"/*.tar.gz + rm -r signal-cli-archive-* signal-cli-native + mkdir -p build/install/ + mv ./signal-cli-"${GITHUB_REF_NAME#v}"/ build/install/signal-cli + + - name: Build Image + id: build_image + uses: redhat-actions/buildah-build@v2 + with: + image: ${{ env.IMAGE_NAME }} + tags: latest ${{ github.sha }} ${{ steps.cli_ver.outputs.version }} + containerfiles: + ./Containerfile + oci: true + + - name: Push To GHCR + uses: redhat-actions/push-to-registry@v2 + id: push + with: + image: ${{ steps.build_image.outputs.image }} + tags: ${{ steps.build_image.outputs.tags }} + registry: ${{ env.IMAGE_REGISTRY }} + username: ${{ env.REGISTRY_USER }} + password: ${{ env.REGISTRY_PASSWORD }} + + - name: Echo outputs + run: | + echo "${{ toJSON(steps.push.outputs) }}" + + build-container-native: + needs: ci_wf + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v4 + - name: Download signal-cli build from CI workflow + uses: actions/download-artifact@v4 + + - name: Get signal-cli version + id: cli_ver + run: | + ver="${GITHUB_REF_NAME#v}" + echo "version=${ver}" >> $GITHUB_OUTPUT + + - name: Move archive file + run: | + mkdir -p build/native/nativeCompile/ + chmod +x ./signal-cli-native/signal-cli + mv ./signal-cli-native/signal-cli build/native/nativeCompile/ + + - name: Build Image + id: build_image + uses: redhat-actions/buildah-build@v2 + with: + image: ${{ env.IMAGE_NAME }} + tags: latest-native ${{ github.sha }}-native ${{ steps.cli_ver.outputs.version }}-native + containerfiles: + ./native.Containerfile + oci: true + + - name: Push To GHCR + uses: redhat-actions/push-to-registry@v2 + id: push + with: + image: ${{ steps.build_image.outputs.image }} + tags: ${{ steps.build_image.outputs.tags }} + registry: ${{ env.IMAGE_REGISTRY }} + username: ${{ env.REGISTRY_USER }} + password: ${{ env.REGISTRY_PASSWORD }} + + - name: Echo outputs + run: | + echo "${{ toJSON(steps.push.outputs) }}" diff --git a/.github/workflows/repackage-native-libs.yml b/.github/workflows/repackage-native-libs.yml deleted file mode 100644 index fc5fa780..00000000 --- a/.github/workflows/repackage-native-libs.yml +++ /dev/null @@ -1,172 +0,0 @@ -name: repackage-native-libs - -on: - push: - tags: - - v* - - -jobs: - - ci_wf: - uses: AsamK/signal-cli/.github/workflows/ci.yml@master - # ${{ github.repository }} not accpeted here - - - lib_to_jar: - needs: ci_wf - runs-on: ubuntu-latest - - outputs: - signal_cli_version: ${{ steps.cli_ver.outputs.signal_cli_version }} - release_id: ${{ steps.create_release.outputs.id }} - - steps: - - - name: Download signal-cli build from CI workflow - uses: actions/download-artifact@v2 - - - name: Get signal-cli version - id: cli_ver - run: | - #echo ${GITHUB_REF#refs/tag/} - tree . - mv ./$(ls */ -d | tail -n1)/*.tar.gz . - ver=$(ls ./*.tar.gz | xargs basename | sed -E 's/signal-cli-(.*).tar.gz/\1/') - echo $ver - echo "::set-output name=signal_cli_version::${ver}" - tar -xzf ./*.tar.gz - - - name: Get signal-client jar version - id: lib_ver - run: | - JAR_PREFIX=libsignal-client- - jar_file=$(find ./signal-cli-*/lib/ -name "$JAR_PREFIX*.jar") - jar_version=$(echo "$jar_file" | xargs basename | sed "s/$JAR_PREFIX//; s/.jar//") - echo "$jar_version" - echo "::set-output name=signal_client_version::$jar_version" - - - name: Download signal-client builds - env: - RELEASES_URL: https://github.com/signalapp/libsignal/releases/download/ - FILE_NAMES: signal_jni.dll libsignal_jni.dylib - SIGNAL_CLIENT_VER: ${{ steps.lib_ver.outputs.signal_client_version }} - run: | - for file_name in $FILE_NAMES; do - curl -sOL "${RELEASES_URL}/v${SIGNAL_CLIENT_VER}/${file_name}" # note: added v - done - tree . - - - name: Replace Windows lib - env: - SIGNAL_CLI_VER: ${{ steps.cli_ver.outputs.signal_cli_version }} - SIGNAL_CLIENT_VER: ${{ steps.lib_ver.outputs.signal_client_version }} - run: | - mv signal_jni.dll libsignal_jni.so - zip -u ./signal-cli-${SIGNAL_CLI_VER}/lib/libsignal-client-${SIGNAL_CLIENT_VER}.jar ./libsignal_jni.so - tar -czf signal-cli-${SIGNAL_CLI_VER}-Windows.tar.gz signal-cli-${SIGNAL_CLI_VER}/ - - - name: Replace macOS lib - env: - SIGNAL_CLI_VER: ${{ steps.cli_ver.outputs.signal_cli_version }} - SIGNAL_CLIENT_VER: ${{ steps.lib_ver.outputs.signal_client_version }} - run: | - jar_file=./signal-cli-${SIGNAL_CLI_VER}/lib/libsignal-client-${SIGNAL_CLIENT_VER}.jar - zip -d "$jar_file" libsignal_jni.so - zip "$jar_file" libsignal_jni.dylib - tar -czf signal-cli-${SIGNAL_CLI_VER}-macOS.tar.gz signal-cli-${SIGNAL_CLI_VER}/ - - - name: Create release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: v${{ steps.cli_ver.outputs.signal_cli_version }} # note: added `v` - release_name: v${{ steps.cli_ver.outputs.signal_cli_version }} # note: added `v` - draft: true - - - name: Upload Linux archive - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: signal-cli-${{ steps.cli_ver.outputs.signal_cli_version }}.tar.gz - asset_name: signal-cli-${{ steps.cli_ver.outputs.signal_cli_version }}-Linux.tar.gz - asset_content_type: application/x-compressed-tar # .tar.gz - - - name: Upload windows archive - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: signal-cli-${{ steps.cli_ver.outputs.signal_cli_version }}-Windows.tar.gz - asset_name: signal-cli-${{ steps.cli_ver.outputs.signal_cli_version }}-Windows.tar.gz - asset_content_type: application/x-compressed-tar # .tar.gz - - - name: Upload macos archive - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: signal-cli-${{ steps.cli_ver.outputs.signal_cli_version }}-macOS.tar.gz - asset_name: signal-cli-${{ steps.cli_ver.outputs.signal_cli_version }}-macOS.tar.gz - asset_content_type: application/x-compressed-tar # .tar.gz - - - run_repackaged: - - needs: - - lib_to_jar - - strategy: - matrix: - runner: - - windows-latest - - macos-latest - - runs-on: ${{ matrix.runner }} - - defaults: - run: - shell: bash # Explicit for windows - - env: - JAVA_VERSION: 18 - - steps: - - - name: Download the release file - env: - SIGNAL_CLI_VER: ${{ needs.lib_to_jar.outputs.signal_cli_version }} - RELEASE_ID: ${{ needs.lib_to_jar.outputs.release_id }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - file_name=signal-cli-${SIGNAL_CLI_VER}-${RUNNER_OS}.tar.gz - echo "$file_name" - assets_json=$(curl -s \ - -H "Authorization: Bearer $GITHUB_TOKEN" \ - "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets") - asset_dl_url=$(echo "$assets_json" | jq -r ".[] | select (.name == \"$file_name\") | .url") - echo "$asset_dl_url" - curl -sLOJ \ - -H 'Accept: application/octet-stream' \ - -H "Authorization: Bearer $GITHUB_TOKEN" \ - "$asset_dl_url" - tar -xzf "$file_name" - - - name: Set up JDK for running signal-cli executable - uses: actions/setup-java@v1 - with: - java-version: ${{ env.JAVA_VERSION }} - - - name: Run signal-cli - run: | - cd signal-cli-*/bin - if [[ "$RUNNER_OS" == 'Windows' ]]; then - EXECUTABLE_SUFFIX=".bat" - fi - ./signal-cli${EXECUTABLE_SUFFIX} listAccounts diff --git a/.gitignore b/.gitignore index e41d1e40..2b6774c1 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ local.properties out/ .DS_Store /bin/ +/test-config/ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index bb65b3e9..aa627792 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -5,8 +5,8 @@