I use the GitLab Community Edition (CE) and the first thing I love about it is it's Open Source! I am a believer of Open source software! In my company, we host our own instance of GitLab CE and it's been smooth. We use it for source code hosting and for CI/CD. Source code hosting has been great. CI/CD is nice too. GitLab has all the features required by a code hosting software - groups, groups within groups, repos, role based access control for members. Members can also be grouped with names - helpful to create a group for a team and add members to the group and give access to the team/group. It has forking, SSH/HTTPS git repo access, Notification/Watch repo features. It also has lots of integrations. We use slack a lot and we have integrations with slack which GitLab provides, and we have configured it to get notified for different things, starting from commit pushes to pipeline failures. We also use the GitLab pages for hosting the Wiki site for repos. It's pretty neat! The GitLab CI/CD has the concept of runners which run the CI/CD tasks/jobs. Runners have tags, and you can easily use the appropriate tag in the config to run the task in the appropriate runner. We use different runners for different things like, pushing to a Docker registry (requires special permissions), accessing a prod DB/application, running normal tasks (scripts) etc. All in all, it's quite good
Although GitLab has lots of features. I do have some complaints about it. I hope that newer versions will make my complaints obsolete! Starting with the CI/CD, it's quite good. But it lacks some features and flexibility which we expect in the upcoming versions. Features like one CI/CD pipeline triggering another pipeline (not present in CE, not sure about Enterprise Edition) and things like grouping jobs in a stage. Also, the CI/CD UI is not very good. It has glitches, there's no auto refresh in all the UIs to show the status of a job - if it's successful or if it failed. The job UI also isn't very great, like, if the job names or stage names are big, it becomes tough to read. Also, when the job log is very big, it reloads the page when the job finishes and truncates the output of the job and makes it available for download instead. This can be good or bad, based on the use case. For us, it was mostly not a soothing experience.