Nexus Docker Image Repository

Arif KIZILTEPE
4 min readOct 3, 2022

Aslında bu yazımda Nexus Docker Image Repository oluşturma ve bunun kubernetes ortamında çalıştırmayı anlatacaktım ama 2 farklı yazıya bölmenin daha faydalı olacağını düşündüm. Bu yazıda;

  • Gitlab’da bulunan test dotnet projemizi docker image olarak hazırlayacağız.
  • Hazırladığımız bu image’ı nexus’a göndereceğiz.
  • Ve tüm bu süreçleri Jenkins’e entegre edeceğiz.

1. Nexus Konfigürasyonu

Bu yazımda sadece jenkins sunucusunu ama bir sonraki yazımda tüm kubernetes sunucularım nexus’u docker image repository olarak kullanacağı için öncelikle bir nexus üzerinden docker image repository oluşturmam gerekiyor.

Bu konfigürasyon için Nexus’da 2 repository ve 1 hostgrup oluşturmamız lazım

Private Repo: Bizim kullanacağımız image’ları paylaşacağımız repo olacak. Şu şekilde konfigürasyon yapabilirsiniz.

Proxy Repo: Gerekli durumlarda official repoya erişmek için kullanacağımız proxy repo. Kırmızı ile işaretlediğim alan official docker repository adresidir.

Group Repo: Public ve private repoların tek bir gruptan erişmesini sağlamak için oluşturulmuş repodur.

Artık Nexus tarafında işlemler tamamlandı. Şimdi biz jenkins ile kodları gitlab’dan alıp docker build yaptıktan sonra Nexus’a atacağız. Bu işlem için Agent node olarak ben jenkins sunucusunu kullanıyorum. Jenkins sunucuda bazı ayarlar yapmak gerekiyor;

2. Jenkins Konfigürsayonu

Öncelikle Jenkins’e Docker plugin’i yüklenir.

Daha sonra jenkins’in bağlı olduğu sunucuda bulunan docker uygulamasının yukarıda ayarladığımız nexus docker repoya bağlanmasını sağlamamız gerekiyor. Bu işlem için /etc/docker/daemon.json içerisine aşağıdaki gibi bilgiler yazılır

{
"insecure-registries": [
"nexus.xxx.com:8082",
"nexus.xxx.com:8083"
]
}

Daha sonra docker login komutu ile Nexus’a register olunur.

docker login -u USER -p PASS http://nexus.xxx.com:8083docker login -u USER -p PASS http://nexus.xxx.com:8082

Jenkins tarafında ayarlamalar tamamlandı.

3. Pipeline Oluşturma

Gitlab Üzerinde bulunan projem bu şekilde. Burada dotnet projesi haricinde bizim pipeline için kullanacağımız dosyalar.

Jenkinsfile: Pipeline script from SCM olarak kullanacağımız için jenkins pipeline script buradan okuyacak.

.envvars: Docker image build alırken ve bir sonraki yazımda kubernetes ortamında çalıştırırken kullanacağım ortak variable dosyası.

Dockerfile: Jenkins docker build alırken kullanacağı Dockerfile dosyası.

Bu örnek proje olduğu için Dockerfile dosyamı paylaşıyorum incelemeniz için.

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
COPY nuget.config /
WORKDIR /src
COPY ["src/Presentation.Api/Presentation.Api.csproj", "src/Presentation.Api/"]
RUN dotnet restore "src/Presentation.Api/Presentation.Api.csproj"
COPY . .
WORKDIR "/src/src/Presentation.Api"
RUN dotnet build "Presentation.Api.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Presentation.Api.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Presentation.Api.dll"]

Evet şimdi Jenkins üzerinden bir pipeline oluşturalım ve Definition kısmında Pipeline script from SCM seçerek gitlab projemizin bağlantısını yapalım.

Daha sonra Gitlab üzerinde bulunan Jenkinsfile dosyasına aşağıdaki scriptimizi yazalım.

  • Jenkins pipeline çalışırken, jenkins üzerinde tanımlı ve müsait durumda olan bir node seçer ve işlemleri orada yapar. Ama ben Docker register işlemlerini sadece jenkins sunucusunda yaptım. Bu sebeple Node kısmına bu sunucunun label bilgilerini yazıyorum.
  • Prepare kısmında enviroment bilgilerini alıyorum, gitten projeyi sunucuya çekiyorum.
  • Build image kısmında env.ImageVersion değeri ile docker image build ediyorum
  • Push image kısmında da bu oluşturduğum image’i nexus docker repository’ye gönderiyorum.
node('DefaultJenkinsMachine') {
def app

stage('Prepare ') {

checkout scm
load ".envvars"
echo " Version ${env.ImageVersion}"

}

stage('Build image') {

app = docker.build("nexus.xxxx.com:8083/hellonode:${env.ImageVersion}")
}

stage('Test image') {

echo "NoN-Test"

}

stage('Push image') {
sh "docker push nexus.xxx.com:8083/hellonode:${env.ImageVersion}"

}
}

.envvars dosyasına örnek bir versiyon girerek deneme yapıyorum.

Jenkins pipeline başarılı şekilde çalıştı.

Bakalım gerçekten işlemleri yapabildi mi? :) Önce sunucuda docker image list komutu çalıştırarak bakalım.

Bir de Nexus’dan bakalım işlemi tamamlayalım.

--

--