Fastlane — Badge for iOS

Плагин Badge для Fastlane  позволяет добавлять на иконки номера версий, тип релиза и т.д.

На MacOS сборщике установим зависимости:

brew install librsvg
brew install imagemagick
brew install graphicsmagick

Добавим строку в Gemfile проекта:

gem 'fastlane-plugin-badge'

В Fastfile добавим блок относящийся к  badge и будем добавлять номер версию через переменную.

jenkinsVersionNumber = ENV["APP_VERSION"]

...

lane :adhoc do
  add_badge(
    alpha: true,
    dark: true,
    shield: "Version-#{jenkinsVersionNumber}-orange",
    grayscale: true
  )

...
end

 

Kubernetes — Общая папка между двумя контейнерами в поде

Пример создания общей директории для двух контейнеров в одном поде.

apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

  volumes:
  - name: shared-data
    emptyDir: {}

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data

CloudFormation — Передать доступы от S3 в EC2 Instance

Пример CloudFormation для передачи во внутрь EC2 инстанса "ACCESS_KEY" и "SECRET_KEY" прямо из IAM для доступа к S3 Bucket используя AWS-Cli.

AWSTemplateFormatVersion: "2010-09-09"
Description: 'Auto create VPC with instance'

########################################### BLOCK WITH ENVIRONMENTS ###########################################
Parameters:

  ProjectName:
    Type: String
    Default: ArtemPool
    Description: Name of project.

  SSHKeyName:
    Type: String
    Default: artem
    Description: Name of SSH key.

  Image:
    Type: String
    Default: ami-0ff8a91507f77f867
    Description: Image for instance (Default - Amazon Linux, if you changes it, you must install AWS-Cli manualy)
    ConstraintDescription: (ami-0ff8a91507f77f867 - Amazon Linux)

  Region:
    Type: String
    Default: us-east-1b
    Description: Region (Default - U.S. Virginia)

####################################### BLOCK WITH IAM FOR ACCESS TO S3  ######################################

Resources:
  myaccesskey:
    Type: AWS::IAM::AccessKey
    Properties:
      UserName: artem-s3

########################################## BLOCK WITH EC2 INSTANCES  ##########################################

  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref Image
      InstanceType: t2.micro
      KeyName: !Ref SSHKeyName
      BlockDeviceMappings:
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: true
            VolumeSize: 20
      UserData:
        Fn::Base64: !Sub ACCESS_KEY=${myaccesskey}&&SECRET_KEY=${myaccesskey.SecretAccessKey}

Outputs: 
  AccessKeyformyaccesskey:
    Value:
      !Ref myaccesskey
  SecretKeyformyaccesskey:
    Value: !GetAtt myaccesskey.SecretAccessKey

###############################################################################################################

Jenkins — DSL Pipeline создание Seed Job’ом

В репозитории, где будут храниться будущие groovy файлы создадим директорию с именем "utilities" и в нем создадим файл "GithubPipeline.groovy" со следующим содержимым:

package utilities

import javaposse.jobdsl.dsl.DslFactory

class GithubPipeline {

    String name
    String description
    String displayName
    String branchesName
    String urlRepo
    String credentialsId


	void build(DslFactory dslFactory) {
	    def job = dslFactory.pipelineJob(name) {
	        description(description)
	        displayName(displayName)
			definition {
		        cpsScm {
		            scm {
		                git {
		                    branches(branchesName)
		                    remote {
		                        url(urlRepo)
                        		credentials(credentialsId)
		                    }
		                }
		                scriptPath('Jenkinsfile')
		                lightweight(true)
		            }
		        }
		    }
		    parameters {
		        choiceParam ('Environment', ['staging', 'production', 'staging-without-cache'], 'Please choice env to build')
		    }
		    triggers {
		        bitbucketPush()
		    }
		}
	}
}

Теперь для создания Item'а достаточно создать в корне репозитория файл с расширением groovy, для того, чтобы на Seed Job его обработал.

Читать далее "Jenkins — DSL Pipeline создание Seed Job’ом"

Jenkins — Пример DSL Pipeline

Пример Pipeline файла конфигурации для DSL модуля. Это параметризованная сборка.  Jenkinsfile расположен в корне репозитория.

pipelineJob('DSL_Pipeline') {
    displayName('DSL Pipeline')
    definition {
        cpsScm {
            scm {
                git {
                    branches('*/dsl-test')
                    remote {
                        url ('[email protected]:artem/devops.git')
                        credentials ('artem-github')
                    }
                }
                scriptPath ('Jenkinsfile')
                lightweight (true)
            }
        }
    }
    parameters {
        choiceParam('Environment', ['staging', 'production', 'staging-without-cache'], 'Please choice env to build')
    }
    triggers {
        bitbucketPush()
    }
}

Jenkins — DSL Multibranch Pipeline создание Seed Job’ом

В репозитории, где будут храниться будущие groovy файлы создадим директорию с именем "utilities" и в нем создадим файл "BitbucketMultibranch.groovy" со следующим содержимым:

package utilities

import javaposse.jobdsl.dsl.DslFactory

class BitbucketMultibranch {

    String name
    String description
    String displayName
    String serverUrl
    String repoOwner
    String repository
    String credentialsId
    String includeBranches
    String excludeBranches

	void build(DslFactory dslFactory) {
	    def job = dslFactory.multibranchPipelineJob(name) {
	        description(description)
	        displayName(displayName)
	        branchSources {
	            branchSource {
	                source {
	                    bitbucket {
	                        serverUrl(serverUrl)
	                        repoOwner(repoOwner)
	                        repository(repository)
	                        credentialsId(credentialsId)
	                        traits {
	                            headWildcardFilter {
	                                excludes(excludeBranches)
	                                includes(includeBranches)
	                            }
	                        }
	                    }
	                }
	            }
	        }
	        configure {
	          	def traits = it / sources / data / 'jenkins.branch.BranchSource' / source / traits
	          	traits << 'com.cloudbees.jenkins.plugins.bitbucket.BranchDiscoveryTrait' {
	            	strategyId(3) // detect all branches
	          	}
	        }
        	factory {
	            workflowBranchProjectFactory {
	                scriptPath('.jenkins/Jenkinsfile')
	            }
	        }
	        orphanedItemStrategy {
	            discardOldItems {
	                numToKeep(15)
	            }
	        }
	    }
	}
}

Теперь для создания Item'а достаточно создать в корне репозитория файл с расширением groovy, для того, чтобы на Seed Job его обработал.

Читать далее "Jenkins — DSL Multibranch Pipeline создание Seed Job’ом"

Jenkins — Пример DSL Multibranch Pipeline

Пример Multibranch Pipeline файла конфигурации для DSL модуля, с кастомным Bitbucket сервером. Который будет включать в себя ветки: "develop", "staging" и "master". Будет хранить последние 15 сборок. И искать Jenkins файл по пути: ".jenkins/Jenkinsfile"

  • Имя репозитория: artem-dsl
  • Владелец (имя проекта): dev
  • Креды доступа Jenkins’а к Bitbucket: svn-bibucket
multibranchPipelineJob('artem-dsl') {
    displayName('Artem-DSL')
    description('DSL test')
    branchSources {
        branchSource {
            source {
                bitbucket {
                    serverUrl('https://git.artem.services')
                    repoOwner('dev')
                    repository('artem-dsl')
                    credentialsId('svc-bitbucket')
                    traits {
                        headWildcardFilter {
                            excludes('')
                            includes('develop staging master')
                        }
                    }
                }
            }
        }
    }
    configure {
      def traits = it / sources / data / 'jenkins.branch.BranchSource' / source / traits
      traits << 'com.cloudbees.jenkins.plugins.bitbucket.BranchDiscoveryTrait' {
          strategyId(3) // detect all branches
      }
    }
    factory {
        workflowBranchProjectFactory {
            scriptPath('.jenkins/Jenkinsfile')
        }
    }
    orphanedItemStrategy {
        discardOldItems {
            numToKeep(15)
        }
    }
}

Visrh — Основные команды


Список основных команда для начала работы с Virsh

Подключение к libvirtd

virsh --connect qemu:///system

Валидация xml файла

virt-xml-validate vm_01.xml

 

Имя виртуальной машины — vm_01

Запуск виртуальной машины:

virsh start vm_01

Перезагрузка виртуальной машины:

virsh reboot vm_01

Редактирование виртуальной машины:

virsh edit vm_01

Информация о сетевом интерфейсе виртуальной машины:

virsh domiflist vm_01

Jenkins — Принудительно задать номер сборки

Для того, чтобы принудительно задать номер сборки, нужно перейти в домашнюю директорию пользователя "jenkins" -> "jobs" -> "Имя_проекта" -> "Имя_ветки" и открыть файл "nextBuildNumber". И в нем указать номер следующей сборки.

После этого, нужно чтобы Jenkins перечитал данные с диска, для этого переходим в настройки и находим пункт "Перезагрузка конфигурации с диска"

AWS — S3 Bucket только для чтения

Создаем S3 Bucket, делаем его не публичным, в правах доступа ничего не меняем. Сразу найдем ARN созданного бакета.

Создаем пользователя, на вкладке "Permisson" переходим в "Attach existing policies directly" и находим "AmazonS3ReadOnlyAccess". Посмотрим ARN созданного пользователя.

Возвращаемся в настройки S3 Bucket уже созданного и переходим в "Permisson", создаем "Bucket Policy" со следующим содержимым:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXXXX:user/artem-mys3bucket"
            },
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "arn:aws:s3:::artem-mys3bucket/*"
        }
    ]
}

Не забываем заменить ARN на свои.