# CircleCi

## Orbs

### [Executors](https://circleci.com/docs/2.0/using-orbs/#executors)

Define the environment in which a job will run on, allowing you to **reuse a single executor definition across multiple jobs**.

An executor **definition** has the following **keys** available (some of which are also available when using the job declaration):

* docker, machine, windows, or macos
* environment
* working\_directory
* shell
* resource\_class

Once you declare a definition of executor => you can use them in jobs in scope of declaration.

NOTE. Docker alpine tags: it’s a smaller version with the necessary minimum

```
version: 2.1
executors:
  my-executor:
    docker:
      - image: circleci/ruby:2.4.0

jobs:
  my-job:
    executor: my-executor
    steps:
      - run: echo outside the executor
  second-job:
    executor:
      name: my-executor
    steps:
      - run: echo outside the executor
```

#### [Machine executor](https://circleci.com/docs/2.0/executor-types/#using-multiple-docker-images)

```
version: 2
jobs:
  build:
    machine:
      image: ubuntu-1604:201903-01
      docker_layer_caching: true    # default - false
```

#### [Docker executor](https://circleci.com/docs/2.0/executor-types/#using-multiple-docker-images)

It is possible to specify multiple images for your job. Specify multiple images if, for example, you need to use a database for your tests or for some other required service. **In a multi-image configuration job, all steps are executed in the container created by the first image listed**. All containers run in a common network and every exposed port will be available on `localhost` from a [primary container](https://circleci.com/docs/2.0/glossary/#primary-container).

```
jobs:
  build:
    docker:
    # Primary container image where all steps run.
     - image: buildpack-deps:trusty
    # Secondary container image on common network. 
     - image: mongo:2.6.8-jessie
       command: [mongod, --smallfiles]

    working_directory: ~/

    steps:
      # command will execute in trusty container
      # and can access mongo on localhost
      - run: sleep 5 && nc -vz localhost 27017
```

### Commands

A command defines a sequence of steps to be executed in a job, enabling you to [reuse a single command definition](https://circleci.com/docs/2.0/reusing-config/) across multiple jobs.

```
version: 2.1
commands:
  sayhello:
    description: "A very simple command for demonstration purposes"
    parameters:
      to:
        type: string
        default: "Hello World"
        description: "bla"
    steps:
      - checkout // just a possibility
      - restore_cache:
        - keys: 
          - //...
      - run: echo << parameters.to >>
      - run: // can be second run
      - save_cache:
        - keys: // ...
        - paths: // ...       
```

### Jobs

With [jobs](https://circleci.com/docs/2.0/configuration-reference/#jobs), we can automate common behaviour using our commands described previously and they will be used in the [workflows](https://circleci.com/docs/2.0/workflows/) section of the CircleCI configuration.

```
jobs:
  my-job-name:
    description: >
      Uses circleci/aws-ecr to build and publish the docker images.
      Runs kubectl rollout restart deployment/NAME afterwards to refresh the latest tag on cluster.
    executor: <<parameters.executor>>

    parameters:
      executor:
        description: executor to use for this job
        type: executor
        default: default
      repo:
        description: The ecr repo to push the docker images.
        type: string
      tag:
        description: Some descr
        type: string
        default: "latest,${CIRCLE_SHA1}"
      eks_account_id:
        description: Some descr
        type: env_var_name
        default: EKS_ACCOUNT_ID
```

```
    steps:
      - aws-ecr/ecr-login-for-secondary-account
      - aws-ecr/build-and-push-image:
          attach-workspace: true
          repo: <<parameters.repo>>
          path: <<parameters.path>>
          tag: <<parameters.tag>>
          dockerfile: <<parameters.dockerfile>>
      - run:
          name: "Install tools"
          command: |
            # sudo wget -O kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.14.6/2019-08-22/bin/linux/amd64/kubectl
            sudo wget -O kubectl https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl
            sudo chmod +x ./kubectl
            sudo cp ./kubectl /bin/kubectl
            sudo apt-get install jq
      - run:
          name: Restart deployment
          command: |
            tokenResponse=$(aws sts assume-role \
            --role-arn arn:aws:iam::$<<parameters.eks_account_id>>:role/$<<parameters.role_in_target_account>> \
            --role-session-name AWSCLI-Session)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://amartyushov.gitbook.io/tech/ci/circleci.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
