Code and history - add new remote, git pull and push. Done.
pull requests - were not an issue for me. I generally merge them or reject them same day, so I just migrated at the end of a day when none were open.
Issues - I just left the GitHub issue queue behind. It is a public archive now. I know where to find it to read it. Anything that matters will get a new issue at CodeBerg, someday.
CI/CD - I can’t comment. Mine are 95% bash anyway, so they should be easy to move, but I haven’t yet. My spicy take: most GitHub Actions are a hot mess, because they were written by folks not experienced enough to just use bash. Apologies to anyone who likes GitHub Actions. I’ve had mostly bad experiences with them.
Here’s how I handled my migration to CodeBerg: