Browse Source

Use Jenkinsfile to test and build docker image

perillamint 8 months ago
parent
commit
32216fed6a
2 changed files with 104 additions and 0 deletions
  1. 1 0
      .dockerignore
  2. 103 0
      Jenkinsfile

+ 1 - 0
.dockerignore

@@ -3,3 +3,4 @@
 /sled
 .dockerignore
 Dockerfile
+Jenkinsfile

+ 103 - 0
Jenkinsfile

@@ -0,0 +1,103 @@
+pipeline {
+    agent none
+    stages {
+        stage('Test') {
+            agent {
+                docker {
+                    image 'ghcr.io/cleanc-lab/rust:1.72.0-slim-bookworm' 
+                    args '--privileged --net=host -v /var/run/docker.sock:/var/run/docker.sock'
+                }
+            }
+            stages {
+                stage('Build') {
+                    steps {
+                        sh 'cargo build'
+                    }
+                }
+                stage('Nextest') {
+                    steps {
+                        sh '/usr/local/cargo/bin/cargo-nextest nextest run'
+                    }
+                }
+            }
+        }
+        stage('Docker') {
+            agent {
+                docker {
+                    image 'docker:24-cli'
+                    args '--privileged -v /var/run/docker.sock:/var/run/docker.sock'
+                }
+            }
+            when {
+                anyOf {
+                    branch 'interstellar-next';
+                    branch 'interstellar-dev';
+                    buildingTag();
+                }
+            }
+            environment {
+                DOCKER_REGISTRY = 'ghcr.io'
+                GITHUB_ORG = 'interstellar-relay-community'
+                DOCKER_IMAGE = "${env.DOCKER_REGISTRY}/${env.GITHUB_ORG}/aode-relay"
+                GHCR_TOKEN = credentials('perillamint-github-pat-package-rw')
+            }
+            stages {
+                stage('Prepare') {
+                    steps {
+                        script {
+                            if (env.BRANCH_NAME == 'interstellar-next') {
+                                env.DOCKER_TAG = 'latest'
+                            } else if (env.BRANCH_NAME == 'interstellar-dev') {
+                                env.DOCKER_TAG = 'develop'
+                            } else {
+                                env.DOCKER_TAG = env.TAG_NAME
+                            }
+                        }
+                    }
+                }
+                stage('Docker login') {
+                    steps {
+                        sh 'echo $GHCR_TOKEN_PSW | docker login ghcr.io -u $GHCR_TOKEN_USR --password-stdin'
+                    }
+                }
+                stage('Build') {
+                    matrix {
+                        axes {
+                            axis {
+                                name 'TARGET'
+                                values 'amd64', 'arm64'
+                            }
+                        }
+                        stages {
+                            stage('Build platform specific image') {
+                                steps {
+                                    sh "docker build -t $DOCKER_IMAGE:$DOCKER_TAG-${TARGET} --platform linux/${TARGET} ."
+                                }
+                            }
+                            stage('Push platform specific image') {
+                                steps {
+                                    sh "docker push $DOCKER_IMAGE:$DOCKER_TAG-${TARGET}"
+                                }
+                            }
+                        }
+                    }
+                }
+                stage('Docker manifest') {
+                    steps {
+                        sh "docker manifest create $DOCKER_IMAGE:$DOCKER_TAG --amend $DOCKER_IMAGE:$DOCKER_TAG-amd64 --amend $DOCKER_IMAGE:$DOCKER_TAG-arm64"
+                    }
+                }
+                stage('Docker push') {
+                    steps {
+                        sh "docker manifest push $DOCKER_IMAGE:$DOCKER_TAG"
+                    }
+                }
+            }
+            post {
+                always {
+                    sh 'docker logout "$DOCKER_REGISTRY"'
+                }
+            }
+        }
+    }
+}