--- image: mcr.microsoft.com/dotnet/core/sdk:3.0-alpine3.11 variables: OBJECTS_DIRECTORY: 'obj' NUGET_PACKAGES_DIRECTORY: '.nuget' SOURCE_CODE_PATH: 'ChaosBot/*/' stages: - version - build - test - release - docker - deploy cache: key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" paths: # Specify three paths that should be cached: # # 1) Main JSON file holding information about package dependency tree, packages versions, # frameworks etc. It also holds information where to the dependencies were restored. - '$SOURCE_CODE_PATH$OBJECTS_DIRECTORY/project.assets.json' # 2) Other NuGet and MSBuild related files. Also needed. - '$SOURCE_CODE_PATH$OBJECTS_DIRECTORY/*.csproj.nuget.*' # 3) Path to the directory where restored dependencies are kept. - '$NUGET_PACKAGES_DIRECTORY' # policy: pull-push version: stage: version only: changes: - ChaosBot/**/* refs: - master tags: - docker - hawkeye script: - 'apk add git grep npm openssh-client' - 'npm install -g semver' - 'mkdir -p ~/.ssh/' - 'echo $GITLAB_DEPLOY_KEY > ~/.ssh/id_rsa' - 'chmod 600 ~/.ssh/id_rsa' - 'ssh-keyscan -p 2302 git.chaoticlogic.us >> ~/.ssh/known_hosts' - 'git tag $(semver -i $( (git log -1 --pretty=%B | grep -oP "(?<=#)(patch|minor|major)" || echo "patch") | head -1) $(git tag --list | sort -rV | head -1))' - 'git remote add deploy ssh://git@git.chaoticlogic.us:2302/discord-bots/chaosbot.git' - 'git push deploy --tags' - 'git describe --tags | tr -d "\n" > version' artifacts: paths: - version build: stage: build only: changes: - ChaosBot/**/* refs: - master dependencies: - version tags: - docker - hawkeye script: - 'dotnet restore --packages $NUGET_PACKAGES_DIRECTORY' - 'dotnet build --no-restore' tests: stage: test only: changes: - ChaosBot/**/* refs: - master dependencies: - build tags: - docker - hawkeye script: - 'dotnet restore --packages $NUGET_PACKAGES_DIRECTORY' - 'dotnet test --no-restore' release: stage: release only: changes: - ChaosBot/**/* refs: - master dependencies: - tests tags: - docker - hawkeye script: - 'dotnet restore --packages $NUGET_PACKAGES_DIRECTORY' - 'dotnet publish -c Release --runtime linux-musl-x64 -o build -p:PublishSingleFile=true ChaosBot' artifacts: paths: - build/* docker: image: docker:stable stage: docker only: changes: - ChaosBot/**/* refs: - master tags: - docker - hawkeye dependencies: - version - release script: # Log in to the registry - 'docker login -u=$REGISTRY_USER -p=$REGISTRY_PASS registry.chaoticlogic.us' # Build the image - 'docker -H unix:///var/run/docker.sock image build -t chaosbot:`cat version` ./' # Tag the image with a registry tag - 'docker -H unix:///var/run/docker.sock image tag chaosbot:`cat version` registry.chaoticlogic.us/chaosbot:`cat version`' - 'docker -H unix:///var/run/docker.sock image tag chaosbot:`cat version` registry.chaoticlogic.us/chaosbot:latest' # Push the registry images - 'docker -H unix:///var/run/docker.sock image push registry.chaoticlogic.us/chaosbot:`cat version`' - 'docker -H unix:///var/run/docker.sock image push registry.chaoticlogic.us/chaosbot:latest' deploy: stage: deploy only: changes: - ChaosBot/**/* refs: - master tags: - docker - hawkeye dependencies: - docker script: - 'apk add curl jq' # Sign in with credentials - 'AUTH_TOKEN="`curl -X POST $API_URI/api/auth -H "Content-Type: application/json" -d "{\\"Username\\": \\"$API_USER\\", \\"Password\\": \\"$API_PASS\\"}" | jq -r ".jwt" | tr -d "\n"`"' # Update chaosbot:latest image - 'curl -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "$API_URI/api/endpoints/$ENDPOINT_URI/docker/images/create?fromImage=registry.chaoticlogic.us%2Fchaosbot:latest" -H "X-Registry-Auth: eyJzZXJ2ZXJhZGRyZXNzIjoicmVnaXN0cnkuY2hhb3RpY2xvZ2ljLnVzIn0=" --data-raw "{\\"fromImage\\":\\"registry.chaoticlogic.us/chaosbot:latest\\"}"' # Stop old container - 'curl -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "$API_URI/api/endpoints/$ENDPOINT_URI/docker/containers/$CONTAINER_ID/stop" --data-raw "{}"' # Rename old container - 'curl -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "$API_URI/api/endpoints/$ENDPOINT_URI/docker/containers/$CONTAINER_ID/rename?name=%2F$CONTAINER_ID-old" --data-raw "{}"' # Create new container - 'CONTAINER_CREATION_RESPONSE=`curl -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "$API_URI/api/endpoints/$ENDPOINT_URI/docker/containers/create?name=$CONTAINER_ID" --data-raw "{\\"Cmd\\":[],\\"Entrypoint\\":[\\"./ChaosBot\\"],\\"Hostname\\":\\"b47984029a4a\\",\\"Image\\":\\"registry.chaoticlogic.us/chaosbot:latest\\",\\"Labels\\":{},\\"OnBuild\\":null,\\"OpenStdin\\":false,\\"StdinOnce\\":false,\\"Tty\\":false,\\"User\\":\\"\\",\\"Volumes\\":{\\"/App/appsettings.json\\":{}},\\"WorkingDir\\":\\"/App\\",\\"HostConfig\\":{\\"AutoRemove\\":false,\\"Binds\\":[\\"/etc/ChaosBot/appsettings.json:/App/appsettings.json:ro\\"],\\"RestartPolicy\\":{\\"MaximumRetryCount\\":0,\\"Name\\":\\"unless-stopped\\"}},\\"name\\":\\"ChaoticLogicBot\\"}"`' - 'NEW_CONTAINER_ID=`echo $CONTAINER_CREATION_RESPONSE | jq -r ".Id"`' - 'NEW_RESOURCE_CONTROL_ID=`echo $CONTAINER_CREATION_RESPONSE | jq -r ".Portainer.ResourceControl.Id"`' # Connect new container to docker bridge - 'curl -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "$API_URI/api/endpoints/$ENDPOINT_URI/docker/networks/bridge/connect" --data-raw "{\"Container\":\"$NEW_CONTAINER_ID\"}"' # Start new container - 'curl -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "$API_URI/api/endpoints/$ENDPOINT_URI/docker/containers/$NEW_CONTAINER_ID/start" --data-raw "{}"' # Lock down new container - 'curl -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "$API_URI/api/resource_controls/$NEW_RESOURCE_CONTROL_ID" --data-raw "{\"AdministratorsOnly\":true,\"Public\":false,\"Users\":[],\"Teams\":[]}"' # Delete old container - 'curl -X DELETE "$API_URI/api/endpoints/$ENDPOINT_URI/docker/containers/$CONTAINER_ID-old?force=true&v=1" -H "Authorization: Bearer $AUTH_TOKEN"'