From 8a80e58e547287eff22739f73684688d4530ecff Mon Sep 17 00:00:00 2001 From: Awiteb Date: Sat, 16 Nov 2024 13:12:59 +0000 Subject: [PATCH] chore: Add CI/CD Signed-off-by: Awiteb --- .forgejo/ISSUE_TEMPLATE/bug.md | 32 +++++++ .forgejo/ISSUE_TEMPLATE/feature_request.md | 11 +++ .forgejo/pull_request_template.md | 19 ++++ .forgejo/workflows/cd.yml | 106 +++++++++++++++++++++ .forgejo/workflows/changelog.yml | 36 +++++++ .forgejo/workflows/ci.yml | 25 +++++ .forgejo/workflows/dco_checker.yml | 29 ++++++ .github/workflows/auto_close_pr.yml | 34 +++++++ 8 files changed, 292 insertions(+) create mode 100644 .forgejo/ISSUE_TEMPLATE/bug.md create mode 100644 .forgejo/ISSUE_TEMPLATE/feature_request.md create mode 100644 .forgejo/pull_request_template.md create mode 100644 .forgejo/workflows/cd.yml create mode 100644 .forgejo/workflows/changelog.yml create mode 100644 .forgejo/workflows/ci.yml create mode 100644 .forgejo/workflows/dco_checker.yml create mode 100644 .github/workflows/auto_close_pr.yml diff --git a/.forgejo/ISSUE_TEMPLATE/bug.md b/.forgejo/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..9a3d378 --- /dev/null +++ b/.forgejo/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,32 @@ +--- +name: Bug +about: Create a bug report to help us improve forgejo-guardian +title: "..." +labels: ["Kind/Bug"] +assignees: "" +--- + +## Checks + +- [ ] I added a descriptive title to this issue +- [ ] I have searched Google for similar issues and couldn't find anything +- [ ] I have read [the README](https://git.4rs.nl/awiteb/forgejo-guardian/src/branch/master/README.md) and still think this is a bug + +## Version + + + +forgejo-guardian version: `...` + +## Description + + + +## Expected behavior + + + +## Actual behavior + + diff --git a/.forgejo/ISSUE_TEMPLATE/feature_request.md b/.forgejo/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..96ee892 --- /dev/null +++ b/.forgejo/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,11 @@ +--- +name: Feature request +about: Suggest an idea for forgejo-guardian +title: "..." +labels: ["Kind/Feature"] +assignees: "" +--- + +## Feature description + + diff --git a/.forgejo/pull_request_template.md b/.forgejo/pull_request_template.md new file mode 100644 index 0000000..3c61370 --- /dev/null +++ b/.forgejo/pull_request_template.md @@ -0,0 +1,19 @@ +## Summary + + + +### Related issue + + + + +## Changes + + + + +## Checklist +- [ ] Added tests if applicable (for new features/regression/etc...) +- [ ] Documentation diff --git a/.forgejo/workflows/cd.yml b/.forgejo/workflows/cd.yml new file mode 100644 index 0000000..da38678 --- /dev/null +++ b/.forgejo/workflows/cd.yml @@ -0,0 +1,106 @@ +name: CD + +on: + push: + tags: + - v[0-9]+.[0-9]+.[0-9]+ + - v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+ + +jobs: + build-assets: + runs-on: debian + strategy: + matrix: + target: + - x86_64-unknown-linux-gnu + - x86_64-unknown-linux-musl + - aarch64-unknown-linux-gnu + - aarch64-unknown-linux-musl + steps: + - uses: actions/checkout@v4 + with: + ref: master + fetch-depth: 1 + - uses: https://codeberg.org/awiteb/rust-action@v1.74 + - name: Install musl-tools + run: | + apt-get update + apt-get install -y musl-tools + if: ${{ contains(matrix.target, 'musl') }} + - name: Install gcc-aarch64-linux-gnu linker + run: | + apt-get update + apt-get install -y gcc-aarch64-linux-gnu + if: ${{ contains(matrix.target, 'aarch64') }} + - name: Preparing the environment + run: | + BIN_NAME="$(echo $GITHUB_REPOSITORY | cut -d '/' -f 2)" + echo "BIN_NAME=$BIN_NAME" >> $GITHUB_ENV + mkdir -p release-dir + mkdir -p .cargo + echo 'target.aarch64-unknown-linux-gnu.linker = "aarch64-linux-gnu-gcc"' > .cargo/config.toml + echo 'target.aarch64-unknown-linux-musl.linker = "aarch64-linux-gnu-gcc"' >> .cargo/config.toml + + - name: Install the target + run: rustup target install ${{ matrix.target }} + + - name: Build the asset + run: | + TARGET=$(echo ${{ matrix.target }} | sed -e 's/-unknown//g' | sed -e 's/-pc//g') + APP_NAME="$BIN_NAME-$GITHUB_REF_NAME-$TARGET" + cargo clean + cargo build --release --target ${{ matrix.target }} + cp target/${{ matrix.target }}/release/$BIN_NAME release-dir/$APP_NAME + cd release-dir + test -f $APP_NAME && sha256sum $APP_NAME > $APP_NAME.sha256 + + # Upload the artifact, so it can be used in the release step + - uses: actions/upload-artifact@v3 + with: + name: ${{ env.GITHUB_SHA }}-${{ env.GITHUB_RUN_NUMBER }} + path: ${{ env.GITHUB_WORKSPACE }}/release-dir + + release: + needs: build-assets + runs-on: debian + steps: + - uses: actions/checkout@v4 + with: + ref: master + fetch-depth: 0 + fetch-tags: true + - uses: actions/download-artifact@v3 + with: + name: ${{ env.GITHUB_SHA }}-${{ env.GITHUB_RUN_NUMBER }} + path: ${{ env.GITHUB_WORKSPACE }}/release-dir + - name: Install git-cliff + run: | + version="2.4.0" + wget "https://github.com/orhun/git-cliff/releases/download/v$version/git-cliff-$version-x86_64-unknown-linux-gnu.tar.gz" + tar -xvzf git-cliff-*.tar.gz + mv "git-cliff-$version/git-cliff" /usr/local/bin + rm -fr git-cliff-* + - name: Write changelog + run: | + git config user.name forgejo-actions + git config user.email forgejo-actions@noreply.localhost + echo 'TAG_CHANGELOG=$(if [[ $(git tag --sort=committerdate | tail -n 1) == *"-rc"* ]]; then git-cliff --strip all $(git tag --sort=committerdate | tail -n 2 | sed ":a; N; $!ba; s/\n/../g") | sed "s/## unreleased.*$//g"; else git-cliff -l --strip all | sed "s/^## \[.*$//g";fi)' | sed "s/\"/'/g" >> $GITHUB_ENV + if [[ $(git tag --sort=creatordate | tail -n 1) != *'-rc'* ]]; then + echo "The latest tag is not a release candidate, updating changelog for $GITHUB_REF_NAME" + git-cliff > CHANGELOG.md + git add CHANGELOG.md + git commit -m "Update changelog for $GITHUB_REF_NAME" + git push + echo "Changelog updated" + else + echo "The latest tag is a release candidate, not updating changelog" + fi + - name: Create Release + uses: actions/forgejo-release@v1 + with: + direction: upload + url: https://git.4rs.nl + token: ${{ env.GITHUB_TOKEN }} + release-dir: release-dir + release-notes: ${{ env.TAG_CHANGELOG }} + prerelease: ${{ contains(env.GITHUB_REF_NAME, '-rc') }} diff --git a/.forgejo/workflows/changelog.yml b/.forgejo/workflows/changelog.yml new file mode 100644 index 0000000..fb67645 --- /dev/null +++ b/.forgejo/workflows/changelog.yml @@ -0,0 +1,36 @@ +name: Write changelog + +on: + push: + branches: + - 'master' + +jobs: + write-changelog: + runs-on: debian + steps: + - uses: actions/checkout@v4 + with: + ref: master + fetch-depth: 0 + fetch-tags: true + - name: Install git-cliff + run: | + version="2.4.0" + wget "https://github.com/orhun/git-cliff/releases/download/v$version/git-cliff-$version-x86_64-unknown-linux-gnu.tar.gz" + tar -xvzf git-cliff-*.tar.gz + mv "git-cliff-$version/git-cliff" /usr/local/bin + rm -fr git-cliff-* + - name: Write changelog + run: | + git config user.name forgejo-actions + git config user.email forgejo-actions@noreply.localhost + git-cliff > CHANGELOG.md + if [[ $(git status | grep --extended-regexp '^\s+modified:\s+CHANGELOG.md$') ]]; then + git add CHANGELOG.md + git commit -m "chore(changelog): Update changelog" + git push + echo "Changelog updated" + else + echo "No changes to changelog" + fi diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml new file mode 100644 index 0000000..aafb5f0 --- /dev/null +++ b/.forgejo/workflows/ci.yml @@ -0,0 +1,25 @@ +name: Rust CI + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + rust_ci: + name: Rust CI + runs-on: debian + steps: + - uses: actions/checkout@v4 + - uses: https://codeberg.org/awiteb/rust-action@v1.81 + - name: Check MSRV + run: cargo +1.81 build + - name: Build the source code + run: cargo build + - name: Check the code format + run: cargo fmt -- --check + - name: Run cargo-check + run: cargo check + - name: Run cargo-clippy + run: cargo clippy -- -D warnings diff --git a/.forgejo/workflows/dco_checker.yml b/.forgejo/workflows/dco_checker.yml new file mode 100644 index 0000000..9196cab --- /dev/null +++ b/.forgejo/workflows/dco_checker.yml @@ -0,0 +1,29 @@ +name: DCO checker + +on: + pull_request: + branches: [master] + types: [opened, synchronize, reopened] + +jobs: + check: + name: DCO checker + runs-on: debian + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: DCO checker + run: | + commits=$(git rev-list origin/master..HEAD) + for commit in $commits; do + commit_subject=$(git show --quiet --format=%s $commit) + commit_sha=$(echo $commit | cut -c1-10) + echo "Checking commit $commit_sha \"$commit_subject\"" + if ! git show --quiet --format=%B $commit | grep -q "Signed-off-by:"; then + author=$(git show --quiet --format=%an $commit) + echo "Commit $commit by $author is missing the 'Signed-off-by:' line" + exit 1 + fi + done + echo "All commits have the 'Signed-off-by:' line." diff --git a/.github/workflows/auto_close_pr.yml b/.github/workflows/auto_close_pr.yml new file mode 100644 index 0000000..ed67ad5 --- /dev/null +++ b/.github/workflows/auto_close_pr.yml @@ -0,0 +1,34 @@ +name: Auto close PR + +on: + pull_request: + types: [opened, reopened] + +jobs: + close_pr: + name: Auto close PR + runs-on: ubuntu-latest + steps: + - name: Send close comment + run: | + curl -L \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer $PAT" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.number }}/comments \ + -d '{"body":"${{ env.BODY }}"}' + env: + PAT: ${{ secrets.PAT }} + BODY: This repository is mirror only and you cannot create a pull request for it. Please open your PR in https://git.4rs.nl/awiteb/forgejo-guardian + - name: Close the PR + run: | + curl -L \ + -X PATCH \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer $PAT" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.number }} \ + -d '{"state":"closed"}' + env: + PAT: ${{ secrets.PAT }}