From 273df8a79363efdae07547433bb54e1c05c2dbfd Mon Sep 17 00:00:00 2001 From: Neshura Date: Mon, 8 Apr 2024 17:51:04 +0200 Subject: [PATCH] Introduce CI/CD --- .forgejo/workflows/build+release.yml | 146 +++++++++++++++++++++++++++ .forgejo/workflows/pull-requests.yml | 67 ++++++++++++ .forgejo/workflows/test.yml | 34 +++++++ Cargo.lock | 50 +++++++++ Cargo.toml | 21 +++- debian/domainlink.service | 14 +++ 6 files changed, 331 insertions(+), 1 deletion(-) create mode 100644 .forgejo/workflows/build+release.yml create mode 100644 .forgejo/workflows/pull-requests.yml create mode 100644 .forgejo/workflows/test.yml create mode 100644 debian/domainlink.service diff --git a/.forgejo/workflows/build+release.yml b/.forgejo/workflows/build+release.yml new file mode 100644 index 0000000..049840e --- /dev/null +++ b/.forgejo/workflows/build+release.yml @@ -0,0 +1,146 @@ +name: 'Build and release binary file and packages' +author: 'Neshura' + +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + - '[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+' +jobs: + test: + runs-on: docker + container: forgejo.neshweb.net/ci-docker-images/rust-node:latest + steps: + - + name: Add Clippy + run: rustup component add clippy + - + name: Checking Out Repository Code + uses: https://code.forgejo.org/actions/checkout@v3 + - + name: Set Up Cargo Cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - + name: Run Clippy + run: cargo clippy + - + name: Check if Version in Cargo.toml matches Tag + run: | + VERSION=$(cat Cargo.toml | grep -E "(^|\|)version =" | cut -f2- -d= | tr -d \" | tr -d " ") + if test $VERSION != "${{ github.ref_name }}"; then + echo "Expected Version is: '${{ github.ref_name }}' actual Version is: '$VERSION'"; + exit 1 + else + echo "Version is: '$VERSION'"; + fi + + build: + needs: test + if: success() + runs-on: docker + container: forgejo.neshweb.net/ci-docker-images/rust-node:latest + steps: + - + name: Checking Out Repository Code + uses: https://code.forgejo.org/actions/checkout@v3 + - + name: Prepare build environment + run: mkdir dist + - + name: Compiling To Linux Target + run: | + cargo build -r + mv target/release/${{ github.event.repository.name }} dist/${{ github.event.repository.name }}-linux-amd64 + - + name: Bundle .deb package + run: | + cargo deb + DEBIAN_REF=$(echo ${{ github.ref_name }} | tr - \~) + echo "DEBIAN_REF=$DEBIAN_REF" >> dist/build.env + DEBIAN_REV=-$(cat Cargo.toml | grep -E "(^|\|)revision =" | cut -f2- -d= | tr -d \" | tr -d " ") + echo "DEBIAN_REV=$DEBIAN_REV" >> dist/build.env + mv target/debian/${{ github.event.repository.name }}_"$DEBIAN_REF""$DEBIAN_REV"_amd64.deb dist/${{ github.event.repository.name }}_"$DEBIAN_REF""$DEBIAN_REV"_amd64.deb + - + name: Uploading Build Artifact + uses: https://code.forgejo.org/forgejo/upload-artifact@v4 + with: + name: release_blobs + path: dist + if-no-files-found: error + + upload-generic-package: + needs: build + if: success() + runs-on: docker + steps: + - + name: Downloading All Build Artifacts + uses: https://code.forgejo.org/forgejo/download-artifact@v4 + - + name: Upload Binary + run: | + echo 'curl -v --user ${{ secrets.FORGEJO_USERNAME }}:${{ secrets.FORGEJO_TOKEN }} \ + --upload-file release_blobs/${{ github.event.repository.name }}-linux-amd64 \ + https://forgejo.neshweb.net/api/packages/${{ secrets.FORGEJO_USERNAME }}/generic/${{ github.event.repository.name }}/${{ github.ref_name }}/${{ github.event.repository.name }}-linux-amd64' + curl -v --user ${{ secrets.FORGEJO_USERNAME }}:${{ secrets.FORGEJO_TOKEN }} \ + --upload-file release_blobs/${{ github.event.repository.name }}-linux-amd64 \ + https://forgejo.neshweb.net/api/packages/${{ secrets.FORGEJO_USERNAME }}/generic/${{ github.event.repository.name }}/${{ github.ref_name }}/${{ github.event.repository.name }}-linux-amd64 + + upload-debian-package: + needs: build + if: success() + runs-on: docker + steps: + - + name: Downloading All Build Artifacts + uses: https://code.forgejo.org/forgejo/download-artifact@v4 + - + name: Upload Debian Package to staging + run: | + source release_blobs/build.env + echo 'curl -v --user ${{ secrets.FORGEJO_USERNAME }}:${{ secrets.FORGEJO_TOKEN }} \ + --upload-file release_blobs/${{ github.event.repository.name }}_'"$DEBIAN_REF""$DEBIAN_REV"'_amd64.deb \ + https://forgejo.neshweb.net/api/packages/${{ secrets.FORGEJO_USERNAME }}/debian/pool/bookworm/staging/upload' + curl -v --user ${{ secrets.FORGEJO_USERNAME }}:${{ secrets.FORGEJO_TOKEN }} \ + --upload-file release_blobs/${{ github.event.repository.name }}_"$DEBIAN_REF""$DEBIAN_REV"_amd64.deb \ + https://forgejo.neshweb.net/api/packages/${{ secrets.FORGEJO_USERNAME }}/debian/pool/bookworm/staging/upload + - + name: Upload Debian Package to main + if: (! contains(github.ref_name, '-rc')) + run: | + source release_blobs/build.env + echo 'curl -v --user ${{ secrets.FORGEJO_USERNAME }}:${{ secrets.FORGEJO_TOKEN }} \ + --upload-file release_blobs/${{ github.event.repository.name }}_'"$DEBIAN_REF""$DEBIAN_REV"'_amd64.deb \ + https://forgejo.neshweb.net/api/packages/${{ secrets.FORGEJO_USERNAME }}/debian/pool/bookworm/main/upload' + curl -v --user ${{ secrets.FORGEJO_USERNAME }}:${{ secrets.FORGEJO_TOKEN }} \ + --upload-file release_blobs/${{ github.event.repository.name }}_"$DEBIAN_REF""$DEBIAN_REV"_amd64.deb \ + https://forgejo.neshweb.net/api/packages/${{ secrets.FORGEJO_USERNAME }}/debian/pool/bookworm/main/upload + + create-release: + needs: build + if: success() + runs-on: docker + steps: + - + name: Downloading All Build Artifacts + uses: https://code.forgejo.org/forgejo/download-artifact@v4 + - + name: Filter out env files + run: rm release_blobs/build.env + - + name: Release New Version + uses: actions/forgejo-release@v1 + with: + direction: upload + url: https://forgejo.neshweb.net + release-dir: release_blobs + token: ${{ secrets.FORGEJO_TOKEN }} + tag: ${{ github.ref_name }} \ No newline at end of file diff --git a/.forgejo/workflows/pull-requests.yml b/.forgejo/workflows/pull-requests.yml new file mode 100644 index 0000000..5afc365 --- /dev/null +++ b/.forgejo/workflows/pull-requests.yml @@ -0,0 +1,67 @@ +name: 'Build binary file and bundle packages' +author: 'Neshura' + +on: + pull_request: + branches: + - main + +jobs: + test: + runs-on: docker + container: forgejo.neshweb.net/ci-docker-images/rust-node:latest + steps: + - + name: Add Clippy + run: rustup component add clippy + - + name: Checking Out Repository Code + uses: https://code.forgejo.org/actions/checkout@v3 + - + name: Set Up Cargo Cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - + name: Run Clippy + run: cargo clippy + + build: + needs: test + if: success() + runs-on: docker + container: forgejo.neshweb.net/ci-docker-images/rust-node:latest + steps: + - + name: Checking Out Repository Code + uses: https://code.forgejo.org/actions/checkout@v3 + - + name: Prepare build environment + run: mkdir dist + - + name: Compiling To Linux Target + run: | + cargo build -r + mv target/release/${{ github.event.repository.name }} dist/${{ github.event.repository.name }}-linux-amd64 + - + name: Bundle .deb package + run: | + cargo deb + DEBIAN_REF=$(cat Cargo.toml | grep -E "(^|\|)version =" | cut -f2- -d= | tr -d \" | tr -d " " | tr - \~) + echo "DEBIAN_REF=$DEBIAN_REF" >> dist/build.env + DEBIAN_REV=-$(cat Cargo.toml | grep -E "(^|\|)revision =" | cut -f2- -d= | tr -d \" | tr -d " ") + echo "DEBIAN_REV=$DEBIAN_REV" >> dist/build.env + mv target/debian/${{ github.event.repository.name }}_"$DEBIAN_REF""$DEBIAN_REV"_amd64.deb dist/${{ github.event.repository.name }}_"$DEBIAN_REF""$DEBIAN_REV"_amd64.deb + - + name: Uploading Build Artifact + uses: https://code.forgejo.org/forgejo/upload-artifact@v4 + with: + name: release_blobs + path: dist + if-no-files-found: error \ No newline at end of file diff --git a/.forgejo/workflows/test.yml b/.forgejo/workflows/test.yml new file mode 100644 index 0000000..12dc226 --- /dev/null +++ b/.forgejo/workflows/test.yml @@ -0,0 +1,34 @@ +name: 'Run Tests on Code' +author: 'Neshura' + +on: + push: + tags-ignore: + - '**' + branches: + - '**' +jobs: + run-tests: + runs-on: docker + container: forgejo.neshweb.net/ci-docker-images/rust-node:latest + steps: + - + name: Add Clippy + run: rustup component add clippy + - + name: Checking Out Repository Code + uses: https://code.forgejo.org/actions/checkout@v3 + - + name: Set Up Cargo Cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - + name: Run Clippy + run: cargo clippy \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 943fb3e..3694996 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -415,6 +415,8 @@ name = "domainlink" version = "0.1.0" dependencies = [ "actix-web", + "log", + "systemd-journal-logger", ] [[package]] @@ -432,6 +434,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "flate2" version = "1.0.28" @@ -609,6 +621,12 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + [[package]] name = "local-channel" version = "0.1.5" @@ -641,6 +659,9 @@ name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +dependencies = [ + "value-bag", +] [[package]] name = "memchr" @@ -862,6 +883,19 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.38.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "ryu" version = "1.0.17" @@ -990,6 +1024,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "systemd-journal-logger" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5f3848dd723f2a54ac1d96da793b32923b52de8dfcced8722516dac312a5b2a" +dependencies = [ + "log", + "rustix", +] + [[package]] name = "time" version = "0.3.34" @@ -1125,6 +1169,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "value-bag" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74797339c3b98616c009c7c3eb53a0ce41e85c8ec66bd3db96ed132d20cfdee8" + [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index 052b7ab..8c443ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,28 @@ [package] +authors = ["Neshura"] name = "domainlink" version = "0.1.0" edition = "2021" +description = "Lightweight tool for handling (sub-)domain to URL redirects instead of having to deal with copy and pasting proxy rules" +license = "GPL-3.0-or-later" + +[package.metadata.deb] +extended-description = "Lightweight tool for handling (sub-)domain to URL redirects instead of having to deal with copy and pasting proxy rules" +maintainer-scripts = "debian/" +revision = "1" +depends = ["libc6", "libssl3", "systemd"] +assets = [ + [ + "target/release/domainlink", + "/usr/local/bin/domainlink", + "755", + ] +] +systemd-units = { enable = false } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -actix-web = "4" \ No newline at end of file +actix-web = "4" +log = "0.4" +systemd-journal-logger = "2" \ No newline at end of file diff --git a/debian/domainlink.service b/debian/domainlink.service new file mode 100644 index 0000000..36437c1 --- /dev/null +++ b/debian/domainlink.service @@ -0,0 +1,14 @@ +[Unit] +Description="Lightweight tool for handling (sub-)domain to URL redirects instead of having to deal with copy and pasting proxy rules" +After=syslog.target +After=network-online.target + +[Service] +Type=simple +User=%i +ExecStart=/usr/local/bin/domainlink +Restart=always +RestartSec=3 + +[Install] +WantedBy=multi-user.target \ No newline at end of file